@willbooster/wb 16.0.0 → 16.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +34 -34
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -11,27 +11,27 @@ import e from"node:fs";import t from"node:path";import n from"fast-glob";import
|
|
|
11
11
|
const R=[...`0123456789abcdef`],je=[6,1536,393216,100663296],z=[0,8,16,24],Me=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];function Ne(e){return new Fe(512,je,512).update(e).hex()}const Pe=e=>{let t=[];for(let[n,r]of e.entries())t[n]=r;return t};var Fe=class{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw Error(`finalize already called`);let t=this.blocks,n=this.byteCount,r=e.length,i=this.blockCount,a=this.s,o,s,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,o=1;o<i+1;++o)t[o]=0;for(o=this.start;c<r&&o<n;++c)s=e.codePointAt(c)||0,s<128?t[o>>2]|=s<<z[3&o++]:s<2048?(t[o>>2]|=(192|s>>6)<<z[3&o++],t[o>>2]|=(128|63&s)<<z[3&o++]):s<55296||s>=57344?(t[o>>2]|=(224|s>>12)<<z[3&o++],t[o>>2]|=(128|s>>6&63)<<z[3&o++],t[o>>2]|=(128|63&s)<<z[3&o++]):(s=65536+((1023&s)<<10|1023&(e.codePointAt(++c)||0)),t[o>>2]|=(240|s>>18)<<z[3&o++],t[o>>2]|=(128|s>>12&63)<<z[3&o++],t[o>>2]|=(128|s>>6&63)<<z[3&o++],t[o>>2]|=(128|63&s)<<z[3&o++]);if(this.lastByteIndex=o,o>=n){for(this.start=o-n,this.block=t[i],o=0;o<i;++o)a[o]^=t[o];Ie(a),this.reset=!0}else this.start=o}return this}finalize(){if(this.finalized)return;this.finalized=!0;let e=this.blocks,t=this.lastByteIndex,n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];Ie(r)}hex(){this.finalize();let e=this.blockCount,t=this.s,n=this.outputBlocks,r=this.extraBytes,i,a=0,o=0,s=``;for(;o<n;){for(a=0;a<e&&o<n;++a,++o)i=t[a],s+=R[i>>4&15]+R[15&i]+R[i>>12&15]+R[i>>8&15]+R[i>>20&15]+R[i>>16&15]+R[i>>28&15]+R[i>>24&15];o%e===0&&(t=Pe(t),Ie(t),a=0)}return r&&(i=t[a],s+=R[i>>4&15]+R[15&i],r>1&&(s+=R[i>>12&15]+R[i>>8&15]),r>2&&(s+=R[i>>20&15]+R[i>>16&15])),s}};const Ie=function(e){let t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M,N,P,ee,te,ne,re,ie,ae,oe,se,ce,le,ue,de,F,fe,pe,me,he,ge,_e,I,ve,ye,be,xe,Se,Ce,we,Te,Ee;for(r=0;r<48;r+=2)i=e[0]^e[10]^e[20]^e[30]^e[40],a=e[1]^e[11]^e[21]^e[31]^e[41],o=e[2]^e[12]^e[22]^e[32]^e[42],s=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],l=e[5]^e[15]^e[25]^e[35]^e[45],u=e[6]^e[16]^e[26]^e[36]^e[46],d=e[7]^e[17]^e[27]^e[37]^e[47],f=e[8]^e[18]^e[28]^e[38]^e[48],p=e[9]^e[19]^e[29]^e[39]^e[49],t=f^(o<<1|s>>>31),n=p^(s<<1|o>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=i^(c<<1|l>>>31),n=a^(l<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=o^(u<<1|d>>>31),n=s^(d<<1|u>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(f<<1|p>>>31),n=l^(p<<1|f>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=u^(i<<1|a>>>31),n=d^(a<<1|i>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,m=e[0],h=e[1],de=e[11]<<4|e[10]>>>28,F=e[10]<<4|e[11]>>>28,O=e[20]<<3|e[21]>>>29,k=e[21]<<3|e[20]>>>29,Ce=e[31]<<9|e[30]>>>23,we=e[30]<<9|e[31]>>>23,se=e[40]<<18|e[41]>>>14,ce=e[41]<<18|e[40]>>>14,P=e[2]<<1|e[3]>>>31,ee=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,_=e[12]<<12|e[13]>>>20,fe=e[22]<<10|e[23]>>>22,pe=e[23]<<10|e[22]>>>22,A=e[33]<<13|e[32]>>>19,j=e[32]<<13|e[33]>>>19,Te=e[42]<<2|e[43]>>>30,Ee=e[43]<<2|e[42]>>>30,I=e[5]<<30|e[4]>>>2,ve=e[4]<<30|e[5]>>>2,te=e[14]<<6|e[15]>>>26,ne=e[15]<<6|e[14]>>>26,v=e[25]<<11|e[24]>>>21,y=e[24]<<11|e[25]>>>21,me=e[34]<<15|e[35]>>>17,he=e[35]<<15|e[34]>>>17,M=e[45]<<29|e[44]>>>3,N=e[44]<<29|e[45]>>>3,w=e[6]<<28|e[7]>>>4,T=e[7]<<28|e[6]>>>4,ye=e[17]<<23|e[16]>>>9,be=e[16]<<23|e[17]>>>9,re=e[26]<<25|e[27]>>>7,ie=e[27]<<25|e[26]>>>7,b=e[36]<<21|e[37]>>>11,x=e[37]<<21|e[36]>>>11,ge=e[47]<<24|e[46]>>>8,_e=e[46]<<24|e[47]>>>8,le=e[8]<<27|e[9]>>>5,ue=e[9]<<27|e[8]>>>5,E=e[18]<<20|e[19]>>>12,D=e[19]<<20|e[18]>>>12,xe=e[29]<<7|e[28]>>>25,Se=e[28]<<7|e[29]>>>25,ae=e[38]<<8|e[39]>>>24,oe=e[39]<<8|e[38]>>>24,S=e[48]<<14|e[49]>>>18,C=e[49]<<14|e[48]>>>18,e[0]=m^~g&v,e[1]=h^~_&y,e[10]=w^~E&O,e[11]=T^~D&k,e[20]=P^~te&re,e[21]=ee^~ne&ie,e[30]=le^~de&fe,e[31]=ue^~F&pe,e[40]=I^~ye&xe,e[41]=ve^~be&Se,e[2]=g^~v&b,e[3]=_^~y&x,e[12]=E^~O&A,e[13]=D^~k&j,e[22]=te^~re&ae,e[23]=ne^~ie&oe,e[32]=de^~fe&me,e[33]=F^~pe&he,e[42]=ye^~xe&Ce,e[43]=be^~Se&we,e[4]=v^~b&S,e[5]=y^~x&C,e[14]=O^~A&M,e[15]=k^~j&N,e[24]=re^~ae&se,e[25]=ie^~oe&ce,e[34]=fe^~me&ge,e[35]=pe^~he&_e,e[44]=xe^~Ce&Te,e[45]=Se^~we&Ee,e[6]=b^~S&m,e[7]=x^~C&h,e[16]=A^~M&w,e[17]=j^~N&T,e[26]=ae^~se&P,e[27]=oe^~ce&ee,e[36]=me^~ge&le,e[37]=he^~_e&ue,e[46]=Ce^~Te&I,e[47]=we^~Ee&ve,e[8]=S^~m&g,e[9]=C^~h&_,e[18]=M^~w&E,e[19]=N^~T&D,e[28]=se^~P&te,e[29]=ce^~ee&ne,e[38]=ge^~le&de,e[39]=_e^~ue&F,e[48]=Te^~I&ye,e[49]=Ee^~ve&be,e[0]^=Me[r],e[1]^=Me[r+1]},Le=function(){return new Map([{instance:Error,from:e=>{let t=[e.name,e.message];return e.stack!==void 0&&t.push(e.stack),e.cause!==void 0&&(e.stack===void 0&&t.push(void 0),t.push(e.cause)),t},stub:()=>Error(),hydrate:(e,[t,n,r,i])=>{e.name=t,e.message=n,r===void 0?delete e.stack:e.stack=r,i!==void 0&&(e.cause=i)}},{instance:Uint8Array,from:e=>[btoa(ze.decode(e))],create:([e])=>Re.encode(atob(e))},{instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(let[n,r]of t)e.set(n,r)}},{instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(let n of t)e.add(n)}},{instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},{instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},{instance:URL,from:e=>[e.href],create:([e])=>new URL(e)}].map(e=>[e.instance.name,e]))}(),Re=new TextEncoder,ze=new TextDecoder(`utf-8`);function Be(e,t=Le){return JSON.stringify(Ue(e,t))}function Ve(e){if(e===void 0)return-1;if(typeof e==`number`){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const He=[];function Ue(e,t=Le){let n=Ve(e);if(n!==null)return n;let r=[],i=new Map;return function e(n){let a=Ve(n);if(a!==null)return a;let o=i.get(n);if(o!==void 0)return o;switch(o=r.length,typeof n){case`number`:case`string`:case`boolean`:r[o]=n,i.set(n,o);break;case`bigint`:r[o]=[-6,n.toString(16)],i.set(n,o);break;case`object`:if(n===null)r[o]=n,i.set(n,o);else if(Array.isArray(n)){let t=function(e){if(He.length<e){let t=He.length;He.length=e,He.fill(-2,t,e)}return He.slice(0,e)}(n.length);r[o]=t,i.set(n,o);for(let[r,i]of n.entries())t[r]=e(i)}else{let[a,s]=function(e,t){let n=e.constructor;if(typeof n==`function`){let r=n.name,i=t.get(r);if(i!==void 0)return[r,i.from(e)]}let r=Object.entries(e),i=r.length,a=Array.from({length:i+i});for(let e=0;e<i;e++){let t=r[e],n=e+e;a[n]=t[0],a[n+1]=t[1]}return[``,a]}(n,t),c=s.length,l=Array.from({length:c+1});l[0]=a,r[o]=l,i.set(n,o);for(let t=0;t<c;t++)l[t+1]=e(s[t])}}return o}(e),r}function We(e,t){return Ne(Be([e,t]))}function Ge(){return``}const B=Ke({getCacheKey:We});Ke({getCacheKey:Ge});function Ke({cacheDuration:e=1/0,getCacheKey:t=We}={}){return function(n,r){let i,a,o;return r?.kind===`getter`?function(){let r=t(this,[]),s=Date.now();return(o!==r||s-a>e)&&(o=r,i=n.call(this),a=s),i}:function(...s){let c=t(this,s),l=Date.now();return(o!==c||l-a>e)&&(o=c,i=r?n.call(this,...s):n(...s),a=l),i}}}function qe(n,r){let i=[],a=t.resolve(n);for(;;){let n=t.join(a,`node_modules`,`.bin`);if(e.existsSync(n)&&i.push(n),e.existsSync(t.join(a,`.git`)))break;let r=t.dirname(a);if(a===r)break;a=r}return i.length===0?!1:(r.PATH=r.PATH?`${i.join(`:`)}:${r.PATH}`:i.join(`:`),!0)}function Je(e){return!!e&&e!==`0`&&e!==`false`}const Ye={...ee,"working-dir":{description:`A working directory`,type:`string`,alias:`w`},"dry-run":{description:`Whether to skip actual command execution`,type:`boolean`,alias:[`dry`,`d`]}};function Xe(e){let t=[];for(let n of Object.keys(ee)){let r=Ze(e,n);if(r!==void 0){if(typeof r==`boolean`){t.push(r?`--${n}`:`--${n}=false`);continue}if(typeof r==`string`||typeof r==`number`){t.push(`--${n}=${r}`);continue}if(Array.isArray(r))for(let e of r)t.push(`--${n}=${e}`)}}return e.silent===!0&&Ze(e,`quiet-env`)===void 0&&t.push(`--quiet-env`),t}function Ze(e,t){let n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}function V(e){return e.map(e=>H(e)).join(` `)}function Qe(e,t){return`${e}=${H(t)}`}function H(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll(`'`,`'"'"'`)}'`}const $e=[`wrangler.jsonc`,`wrangler.json`,`wrangler.toml`];function et(e,t){return V([`YARN`,`wb`,`gen-dev-vars`,...Xe(e),t])}function tt(e){return`env -u CLOUDFLARE_ENV YARN wrangler ${e}`.trim()}function nt(e){let t=it(e);if(!(!t||!at(e)))return`CI=true YARN wrangler d1 migrations apply ${t} --local --persist-to "${st(e)}"`}function rt(e,n){let r=it(e);if(!r)return n;let i=`export DATABASE_URL="file:$(ls "${t.resolve(e.dirPath,st(e))}"/v3/d1/miniflare-D1DatabaseObject/*.sqlite | grep -v metadata | head -1)"`;return`${ot(e,r)} && ${i} && ${n}`}function it(t){let n=U(t);if(n)for(let t of e.readFileSync(n,`utf8`).split(`
|
|
12
12
|
`)){if(/^\s*(?:#|\/\/)/u.test(t))continue;let e=/(?:^|[,{])\s*["']?database_name["']?\s*[:=]\s*["']([^"']+)["']/u.exec(t);if(e)return e[1]}}function U(n){if(n.dirPath)for(let r of $e){let i=t.join(n.dirPath,r);if(e.existsSync(i))return i}}function at(n){let r=U(n);if(!r)return;let i=`migrations`;for(let t of e.readFileSync(r,`utf8`).split(`
|
|
13
13
|
`)){if(/^\s*(?:#|\/\/)/u.test(t))continue;let e=/(?:^|[,{])\s*["']?migrations_dir["']?\s*[:=]\s*["']([^"']+)["']/u.exec(t);if(e){i=e[1];break}}let a=t.join(n.dirPath,i);return e.existsSync(a)?a:void 0}function ot(e,t){return`YARN wrangler d1 execute ${t} --local --persist-to "${st(e)}" --command "SELECT 1" > /dev/null`}function st(e){let t=[e.env.WB_ENV,e.env.MISE_ENV].includes(`test`)?`test`:e.env.WB_ENV||e.env.MISE_ENV;return!t||t===`development`?`.wrangler/state`:`.wrangler/state-${t}`}let ct;function lt(e,t,n,r,i,a){var o,s,c,l,u,d,f,p=Symbol.metadata||Symbol.for(`Symbol.metadata`),m=Object.defineProperty,h=Object.create,g=[h(null),h(null)],_=t.length;function v(t,n,r){return function(i,a){n&&(a=i,i=e);for(var o=0;o<t.length;o++)a=t[o].apply(i,r?[a]:[]);return r?a:i}}function y(e,t,n,r){if(typeof e!=`function`&&(r||e!==void 0))throw TypeError(t+` must `+(n||`be`)+` a function`+(r?``:` or undefined`));return e}function b(e,t,n,r,i,a,c,l,u,d,f){function p(e){if(!f(e))throw TypeError(`Attempted to access private element on non-instance`)}var h=[].concat(t[0]),_=t[3],b=!c,x=i===1,S=i===3,C=i===4,w=i===2;function T(t,n,r){return function(i,a){return n&&(a=i,i=e),r&&r(i),E[t].call(i,a)}}if(!b){var E={},D=[],O=S?`get`:C||x?`set`:`value`;if(u?(d||x?E={get:ft(function(){return _(this)},r,`get`),set:function(e){t[4](this,e)}}:E[O]=_,d||ft(E[O],r,w?``:O)):d||(E=Object.getOwnPropertyDescriptor(e,r)),!d&&!u){if((s=g[+l][r])&&(s^i)!==7)throw Error(`Decorating two elements with the same name (`+E[O].name+`) is not supported yet`);g[+l][r]=i<3?1:i}}for(var k=e,A=h.length-1;A>=0;A-=n?2:1){var j=y(h[A],`A decorator`,`be`,!0),M=n?h[A-1]:void 0,N={},P={kind:[`field`,`accessor`,`method`,`getter`,`setter`,`class`][i],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw TypeError(`attempted to call addInitializer after decoration was finished`);y(t,`An initializer`,`be`,!0),a.push(t)}.bind(null,N)};if(b)s=j.call(M,k,P),N.v=1,y(s,`class decorators`,`return`)&&(k=s);else if(P.static=l,P.private=u,s=P.access={has:u?f.bind():function(e){return r in e}},C||(s.get=u?w?function(e){return p(e),E.value}:T(`get`,0,p):function(e){return e[r]}),w||S||(s.set=u?T(`set`,0,p):function(e,t){e[r]=t}),k=j.call(M,x?{get:E.get,set:E.set}:E[O],P),N.v=1,x){if(typeof k==`object`&&k)(s=y(k.get,`accessor.get`))&&(E.get=s),(s=y(k.set,`accessor.set`))&&(E.set=s),(s=y(k.init,`accessor.init`))&&D.unshift(s);else if(k!==void 0)throw TypeError(`accessor decorators must return an object with get, set, or init properties or undefined`)}else y(k,(d?`field`:`method`)+` decorators`,`return`)&&(d?D.unshift(k):E[O]=k)}return i<2&&c.push(v(D,l,1),v(a,l,0)),d||b||(u?x?c.splice(-1,0,T(`get`,l),T(`set`,l)):c.push(w?E[O]:y.call.bind(E[O])):m(e,r,E)),k}function x(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return a!==void 0&&(o=a[p]),o=h(o??null),u=[],d=function(e){e&&u.push(v(e))},f=function(t,r){for(var a=0;a<n.length;a++){var o=n[a],s=o[1],d=7&s;if((8&s)==t&&!d==r){var f=o[2],p=!!o[3],m=16&s;b(t?e:e.prototype,o,m,p?`#`+f:ut(f),d,d<2?[]:t?l||=[]:c||=[],u,!!t,p,r,t&&p?function(t){return pt(t)===e}:i)}}},f(8,0),f(0,0),f(8,1),f(0,1),d(c),d(l),s=u,_||x(e),{e:s,get c(){var n=[];return _&&[x(e=b(e,[t],r,e.name,5,n)),v(n,1)]}}}function ut(e){var t=dt(e,`string`);return typeof t==`symbol`?t:t+``}function dt(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function ft(e,t,n){typeof t==`symbol`&&(t=(t=t.description)?`[`+t+`]`:``);try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+` `+t:t})}catch{}return e}function pt(e){if(Object(e)!==e)throw TypeError(`right-hand side of 'in' should be an object, got `+(e===null?`null`:typeof e));return e}const mt=`file:`;var ht=class n{static{[ct]=lt(this,[],[[B,3,`isBunAvailable`],[B,3,`usesBunPackageManager`],[B,3,`buildCommand`],[B,3,`rootDirPath`],[B,3,`dockerfile`],[B,3,`hasDockerfile`],[B,3,`hasSourceCode`],[B,3,`name`],[B,3,`dockerImageName`],[B,3,`requiresNextPublicWbEnv`],[B,3,`packageJson`],[B,3,`packageJsonPath`],[B,3,`generatesWorkerTypes`],[B,3,`hasPrisma`],[B,3,`hasDrizzle`],[B,3,`databaseOrm`],[B,3,`hasVitest`],[B,3,`hasOxlint`],[B,3,`hasTypeAwareOxlint`],[B,3,`hasOxfmt`],[B,3,`hasPrettier`],[B,3,`hasPoetryLock`],[B,3,`hasPubspecYaml`],[B,3,`hasCargoToml`],[B,3,`preferredLinter`],[B,3,`hasPlaywrightConfig`],[B,3,`hasPlaywrightWebServerConfig`],[B,3,`skipLaunchingServerForPlaywright`],[B,3,`dockerPackageJson`],[B,3,`binExists`],[B,3,`rootPackageJson`]]).e}argv=void ct(this);loadEnv;pathByName=new Map;_dirPath;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return this.usesBunPackageManager}get packageManagerCommand(){return this.isBunAvailable?`bun`:`yarn`}get packageManagerRunCommand(){return this.isBunAvailable?`bun run`:`yarn`}get usesBunPackageManager(){return this.hasBunToolVersion()||this.hasBunLockfile()?!0:this.hasBunPackageManager()}hasBunToolVersion(){return bt(t.join(this.rootDirPath,`.tool-versions`),/(^|\n)bun\s/)?!0:[`mise.toml`,`.mise.toml`].some(e=>bt(t.join(this.rootDirPath,e),/^\s*(?:"bun"|bun)\s*=/m))}hasBunLockfile(){return[`bun.lock`,`bun.lockb`].some(n=>e.existsSync(t.join(this.rootDirPath,n)))}hasBunPackageManager(){let e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return typeof e==`string`&&e.startsWith(`bun@`)}get buildCommand(){return this.packageJson.scripts?.build?.includes(`buildIfNeeded`)?`YARN run build`:this.packageJson.scripts?.build?`YARN wb buildIfNeeded ${this.argv.verbose?`--verbose`:``}`:`echo 'No build script'`}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,`..`,`..`,`package.json`))?t.resolve(this.dirPath,`..`,`..`):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile(`Dockerfile`),`utf8`)}get hasDockerfile(){try{return!!this.findFile(`Dockerfile`)}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,`src`))}get name(){return this.packageJson.name||`unknown`}get dockerImageName(){return(this.packageJson.name||`unknown`).replaceAll(`@`,``).replaceAll(`/`,`-`)}envCache;get env(){if(this.envCache)return this.envCache;if(!this.loadEnv)return this.envCache=process.env,this.envCache;let[e,t]=re(this.argv,this.dirPath,{expandFallbackWbEnv:!0});if(!F(this.argv))for(let[e,n]of t)console.info(`Loaded ${n.length} environment variables from ${e}`);return this.envCache={...process.env,...e},this.completeAndValidateWbEnv(t.some(([e])=>!e.startsWith(`mise env`))),this.envCache}static standardWbEnvModes=new Set([`development`,`test`,`staging`,`production`]);completeAndValidateWbEnv(e){let t=this.envCache;if(!t||t.WB_SKIP_ENV_CHECK===`1`||t.WB_SKIP_ENV_CHECK===`true`)return;if(Je(t.CI)&&!process.env.WB_ENV&&e&&(console.error(p.red(`WB_ENV is not exported on CI. Export WB_ENV explicitly (the reusable workflows pass it via the "environment" input), or set WB_SKIP_ENV_CHECK=1 to skip this check.`)),process.exit(1)),!t.WB_ENV){let n=ne(this.argv);t.WB_ENV=n,e&&!F(this.argv)&&console.info(`WB_ENV is not defined; defaulting to "${n}".`)}n.standardWbEnvModes.has(t.WB_ENV)||(console.error(p.red(`WB_ENV must be one of development, test, staging, or production, but is "${t.WB_ENV}". Fix the value in the env source or the exported variable, or set WB_SKIP_ENV_CHECK=1 to skip this check.`)),process.exit(1));let r=this.argv.cascadeEnv??(this.argv.cascadeNodeEnv?`production`:process.env.WB_ENV||void 0)??(this.argv.autoCascadeEnv===!1?void 0:ne(this.argv));r&&n.standardWbEnvModes.has(r)&&t.WB_ENV!==r&&t.WB_ENV!==this.argv.commandDefaultWbEnv&&(console.error(p.red(`WB_ENV resolves to "${t.WB_ENV}" although the "${r}" environment was selected. Fix the WB_ENV defined in the mode's env source (e.g. .env.${r} or the fnox "${r}" profile), or set WB_SKIP_ENV_CHECK=1 to skip this check.`)),process.exit(1)),this.requiresNextPublicWbEnv&&t.NEXT_PUBLIC_WB_ENV!==t.WB_ENV&&(t.NEXT_PUBLIC_WB_ENV&&!F(this.argv)&&console.info(`Overriding NEXT_PUBLIC_WB_ENV ("${t.NEXT_PUBLIC_WB_ENV}") with WB_ENV ("${t.WB_ENV}").`),t.NEXT_PUBLIC_WB_ENV=t.WB_ENV)}get requiresNextPublicWbEnv(){return!!this.getOwnDependencyVersion(`next`)||!!this.getOwnDependencyVersion(`vinext`)}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,`utf8`))}get packageJsonPath(){return t.join(this.dirPath,`package.json`)}get generatesWorkerTypes(){return!U(this)||!this.hasOwnDependency(`wrangler`)||wt(this.packageJson.scripts??{},this.dirPath)?!1:Ct(this.dirPath,`worker-configuration.d.ts`)}get hasPrisma(){return!!this.getOwnDependencyVersion(`prisma`)}get hasDrizzle(){return!!this.getOwnDependencyVersion(`drizzle-orm`)}get databaseOrm(){if(this.hasPrisma)return`prisma`;if(this.hasDrizzle)return`drizzle`}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency(`oxlint`)}get hasTypeAwareOxlint(){return this.hasOxlint&&this.hasDependency(`oxlint-tsgolint`)}get hasOxfmt(){return this.hasDependency(`oxfmt`)}get hasPrettier(){return this.hasDependency(`prettier`)}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,`poetry.lock`))||e.existsSync(t.join(this.rootDirPath,`poetry.lock`))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,`pubspec.yaml`))||e.existsSync(t.join(this.rootDirPath,`pubspec.yaml`))}get hasCargoToml(){return e.existsSync(t.join(this.dirPath,`Cargo.toml`))}get preferredLinter(){if(this.hasOxlint)return`oxlint`}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile(`playwright.config.ts`)}catch{return!1}}get hasPlaywrightWebServerConfig(){try{let t=this.findFile(`playwright.config.ts`);return/\bwebServer\b/.test(e.readFileSync(t,`utf8`))}catch{return!1}}get skipLaunchingServerForPlaywright(){return!Je(this.env.CI)&&this.hasPlaywrightWebServerConfig}get dockerPackageJson(){return t.dirname(this.findFile(`Dockerfile`))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile(`Dockerfile`)),`package.json`),`utf8`))}get binExists(){return qe(this.dirPath,this.env)}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join(`..`,`..`,n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,`package.json`),`utf8`))}catch(e){console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,`package.json`)}`,e);return}}};function gt(e){let t=e.env.DATABASE_URL;if(!t?.startsWith(`file:`))return;let n=t.slice(5).replace(/[?#].*$/,``);return(n.startsWith(`//`)?n.slice(2):n)||void 0}function _t(e){let n=gt(e);if(!n)return;if(t.isAbsolute(n))return n;let r=e.rootDirPath??e.dirPath;return r?t.resolve(r,n):void 0}function W(n,r=!0,i){if(i??=process.cwd(),e.existsSync(t.join(i,`package.json`)))return new ht(i,n,r)}function vt(e,t){return e.env.WB_ENV===t||e.env.MISE_ENV===t}async function G(e,t=!0,n){let r=yt(e,t,n);if(r)return{...r,descendants:r.root===r.self?await xt(e,r.root,t):[r.self]}}function yt(n,r=!0,i){if(i??=process.cwd(),!e.existsSync(t.join(i,`package.json`)))return;let a=new ht(i,n,r),o=a;if(!a.packageJson.workspaces&&t.dirname(i).endsWith(`/packages`)){let a=t.resolve(i,`..`,`..`);e.existsSync(t.join(a,`package.json`))&&(o=new ht(a,n,r))}return{root:o,self:a}}function bt(t,n){try{return n.test(e.readFileSync(t,`utf8`))}catch{return!1}}async function xt(e,t,n){return[t,...(await St(t)).map(t=>new ht(t,e,n))]}async function St(n){if(n.usesBunPackageManager)return O(n.packageJson.workspaces,n.dirPath).map(e=>t.join(n.dirPath,t.posix.dirname(e)));let r=N(n.packageJson.workspaces).filter(e=>!e.startsWith(`!`)&&P(e));if(r.length===0)return[];let i={cwd:n.dirPath,expandDirectories:!1,followSymbolicLinks:!1,ignore:[`**/node_modules/**`]},a=await m(r.map(e=>t.posix.join(e,`package.json`)),i),o=new Set(a),s=r.filter(e=>e.includes(`?`));if(s.length>0)for(let r of await m(s,{...i,onlyDirectories:!0})){let i=t.posix.join(r,`package.json`);e.existsSync(t.join(n.dirPath,i))&&o.add(i)}let c=[...o],l=e.realpathSync(n.dirPath),u=c.filter(r=>{if(r===`package.json`)return!1;try{let i=t.relative(l,e.realpathSync(t.join(n.dirPath,r)));return i!==`..`&&!i.startsWith(`../`)&&!t.isAbsolute(i)}catch{return!1}}).map(e=>t.join(n.dirPath,t.posix.dirname(e)));return[...new Set(u)].toSorted()}function Ct(n,r){try{return e.readFileSync(t.join(n,`.gitignore`),`utf8`).split(`
|
|
14
|
-
`).some(e=>e.trim()===`/${r}`)}catch{return!1}}function wt(n,r){let i=/(?:^|\s)wrangler\s+types(?:\s|$)/u,a=/^(?:(?:bunx|npx)\s+|(?:yarn|pnpm)\s+dlx\s+)?wrangler\s+types(?:\s+--env-file\s+\S+)*$/u;return Object.values(n).some(n=>!n||!i.test(n)?!1:/[;|<>`$'"()]|\bcd\s/u.test(n)?!0:n.split(`&&`).map(e=>e.trim().replaceAll(/\s+/gu,` `)).some(n=>{if(!i.test(n)||/(?:^|\s)(?:--help|-h)(?:\s|=|$)/u.test(n))return!1;let o=n.replace(/(?:^|\s)--check(?:\s|=|$)/u,` `).replaceAll(/\s+/gu,` `).trim(),s=o===n?n:o;return!a.test(s)||[...s.matchAll(/--env-file\s+(\S+)/gu)].some(n=>!!n[1]&&e.existsSync(t.resolve(r,n[1])))}))}const Tt={command:`buildIfNeeded`,describe:`Build code if changes are detected`,builder:{command:{description:`A build command (default: yarn|bun build)`,type:`string`,alias:`c`},output:{description:`Build output paths (relative to the project directory) that must exist for the cache to be valid (default: auto-detected common output directories)`,type:`array`,alias:`o`}},async handler(e){await Et(e)}};async function Et(n,r){let i=W(n,!0,r);if(!i)return console.error(p.red(`No project found.`)),!0;let a=n.command??(i.packageJson.scripts?.build?`${i.packageManagerRunCommand} build`:void 0);if(!a)return console.info(p.green(`Skip to build because no build command is defined.`)),!1;if(n={...n,command:a},!e.existsSync(t.join(i.rootDirPath,`.git`))||!jt(i))return Mt(i,n),!0;let[o,s,c]=await Pt(i,n);if(o)return console.info(p.green(`Skip to run '${n.command}' 💫`)),!1;if(Mt(i,n)){if(!n.dryRun){let t=Ot(n)??kt(i);t.length===0&&console.info(p.yellow(`No build output directory detected; pass --output to enable missing-output cache invalidation.`)),await e.promises.writeFile(s,JSON.stringify({hash:c,outputPaths:t}),`utf8`)}return!0}}const Dt=[`dist`,`build`,`.next`,`out`];function Ot(e){return e.output?.length?e.output.map(String):void 0}function kt(n){return Dt.filter(r=>e.existsSync(t.join(n.dirPath,r)))}function At(e,t){return e.some(e=>t===e||t.startsWith(`${e}/`))}function jt(e){return r.spawnSync(`git`,[`rev-parse`,`--verify`,`HEAD`],{cwd:e.dirPath,stdio:`ignore`}).status===0}function Mt(e,t){if(console.info(p.green(`Run '${t.command}'`)),!t.dryRun){let n=r.spawnSync(t.command??``,{cwd:e.dirPath,env:e.env,shell:!0,stdio:`inherit`});if(n.status!==0)return process.exitCode=n.status??1,!1}return!0}const Nt=new Set([`CI`,`PWDEBUG`,`TMPDIR`]);async function Pt(n,i){let a=t.resolve(n.dirPath,`node_modules`,`.cache`,`build`),o=t.resolve(a,`last-build`);await e.promises.mkdir(a,{recursive:!0});let s=u(`sha256`),c=r.execSync(`git rev-parse HEAD`,{cwd:n.dirPath}).toString().trim();s.update(c),s.update(i.command??``);let l=JSON.stringify(Object.entries(n.env).filter(([e])=>!Nt.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));s.update(l),await zt(n,i,s);let d=s.digest(`hex`),f=Ft(await Ae(()=>e.promises.readFile(o,`utf8`)));if(f?.hash!==d)return[!1,o,d];let m=(Ot(i)??f.outputPaths).filter(r=>!e.existsSync(t.resolve(n.dirPath,r)));return m.length>0?(console.info(p.yellow(`Rebuilding because build outputs are missing: ${m.join(`, `)}`)),[!1,o,d]):[!0,o,d]}function Ft(e){if(e)try{let t=JSON.parse(e);if(typeof t?.hash!=`string`)return;let n=Array.isArray(t.outputPaths)?t.outputPaths.filter(e=>typeof e==`string`):[];return{hash:t.hash,outputPaths:n}}catch{return}}const It=new Set([`src`,`public`]),Lt=[`.js`,`.cjs`,`.mjs`,`.jsx`,`.ts`,`.cts`,`.mts`,`.tsx`,`.json`,`.browserslistrc`,`package.json`,`yarn.lock`,`bun.lock`,`bun.lockb`],Rt=new Set([`test`,`tests`,`__tests__`,`test-fixtures`]);async function zt(n,i,a){return new Promise(o=>{let s=r.spawnSync(`git`,[`status`,`--porcelain`,`-uall`,`-z`],{cwd:n.dirPath,env:n.env,stdio:`pipe`,encoding:`utf8`}).stdout.split(`\0`).filter(e=>e.length>0),c=[];for(let e=0;e<s.length;e++){let t=s[e],n=t.slice(0,2);if(c.push({untracked:n===`??`,filePath:t.slice(3)}),n.includes(`R`)||n.includes(`C`)){let t=s[++e];t&&c.push({untracked:!1,filePath:t})}}let l=c.map(e=>({...e,hashPath:n.env.WB_ENV===`test`?e.filePath.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,``):e.filePath})),u=t.relative(n.rootDirPath,n.dirPath),d=(Ot(i)??[]).map(e=>t.join(u,e)),f=l.filter(({filePath:e,hashPath:t})=>{let n=t.split(`/`).slice(0,-1);return(n.some(e=>It.has(e))||Lt.some(e=>t.endsWith(e)))&&!n.some(e=>Rt.has(e))&&!At(d,e)});i.verbose&&console.info(`Changed files: ${f.map(e=>e.hashPath).join(`, `)}`);for(let r of f.filter(e=>e.untracked))try{a.update(r.hashPath),a.update(e.readFileSync(t.join(n.rootDirPath,r.filePath)))}catch{}let p=f.filter(e=>!e.untracked).map(e=>e.hashPath);if(p.length===0){o();return}let m=r.spawn(`git`,[`diff`,`HEAD`,`--`,...p],{cwd:n.rootDirPath});m.stdout.on(`data`,e=>{a.update(e),i.verbose&&(console.info(`Data:`,e),console.info(`Hash:`,a.copy().digest(`hex`)))}),m.on(`close`,()=>{o()})})}const Bt=new _,Vt={exitIfFailed:!0};async function K(e,t,n,r=Vt){let i=
|
|
14
|
+
`).some(e=>e.trim()===`/${r}`)}catch{return!1}}function wt(n,r){let i=/(?:^|\s)wrangler\s+types(?:\s|$)/u,a=/^(?:(?:bunx|npx)\s+|(?:yarn|pnpm)\s+dlx\s+)?wrangler\s+types(?:\s+--env-file\s+\S+)*$/u;return Object.values(n).some(n=>!n||!i.test(n)?!1:/[;|<>`$'"()]|\bcd\s/u.test(n)?!0:n.split(`&&`).map(e=>e.trim().replaceAll(/\s+/gu,` `)).some(n=>{if(!i.test(n)||/(?:^|\s)(?:--help|-h)(?:\s|=|$)/u.test(n))return!1;let o=n.replace(/(?:^|\s)--check(?:\s|=|$)/u,` `).replaceAll(/\s+/gu,` `).trim(),s=o===n?n:o;return!a.test(s)||[...s.matchAll(/--env-file\s+(\S+)/gu)].some(n=>!!n[1]&&e.existsSync(t.resolve(r,n[1])))}))}const Tt={command:`buildIfNeeded`,describe:`Build code if changes are detected`,builder:{command:{description:`A build command (default: yarn|bun build)`,type:`string`,alias:`c`},output:{description:`Build output paths (relative to the project directory) that must exist for the cache to be valid (default: auto-detected common output directories)`,type:`array`,alias:`o`}},async handler(e){await Et(e)}};async function Et(n,r){let i=W(n,!0,r);if(!i)return console.error(p.red(`No project found.`)),!0;let a=n.command??(i.packageJson.scripts?.build?`${i.packageManagerRunCommand} build`:void 0);if(!a)return console.info(p.green(`Skip to build because no build command is defined.`)),!1;if(n={...n,command:a},!e.existsSync(t.join(i.rootDirPath,`.git`))||!jt(i))return Mt(i,n),!0;let[o,s,c]=await Pt(i,n);if(o)return console.info(p.green(`Skip to run '${n.command}' 💫`)),!1;if(Mt(i,n)){if(!n.dryRun){let t=Ot(n)??kt(i);t.length===0&&console.info(p.yellow(`No build output directory detected; pass --output to enable missing-output cache invalidation.`)),await e.promises.writeFile(s,JSON.stringify({hash:c,outputPaths:t}),`utf8`)}return!0}}const Dt=[`dist`,`build`,`.next`,`out`];function Ot(e){return e.output?.length?e.output.map(String):void 0}function kt(n){return Dt.filter(r=>e.existsSync(t.join(n.dirPath,r)))}function At(e,t){return e.some(e=>t===e||t.startsWith(`${e}/`))}function jt(e){return r.spawnSync(`git`,[`rev-parse`,`--verify`,`HEAD`],{cwd:e.dirPath,stdio:`ignore`}).status===0}function Mt(e,t){if(console.info(p.green(`Run '${t.command}'`)),!t.dryRun){let n=r.spawnSync(t.command??``,{cwd:e.dirPath,env:e.env,shell:!0,stdio:`inherit`});if(n.status!==0)return process.exitCode=n.status??1,!1}return!0}const Nt=new Set([`CI`,`PWDEBUG`,`TMPDIR`]);async function Pt(n,i){let a=t.resolve(n.dirPath,`node_modules`,`.cache`,`build`),o=t.resolve(a,`last-build`);await e.promises.mkdir(a,{recursive:!0});let s=u(`sha256`),c=r.execSync(`git rev-parse HEAD`,{cwd:n.dirPath}).toString().trim();s.update(c),s.update(i.command??``);let l=JSON.stringify(Object.entries(n.env).filter(([e])=>!Nt.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));s.update(l),await zt(n,i,s);let d=s.digest(`hex`),f=Ft(await Ae(()=>e.promises.readFile(o,`utf8`)));if(f?.hash!==d)return[!1,o,d];let m=(Ot(i)??f.outputPaths).filter(r=>!e.existsSync(t.resolve(n.dirPath,r)));return m.length>0?(console.info(p.yellow(`Rebuilding because build outputs are missing: ${m.join(`, `)}`)),[!1,o,d]):[!0,o,d]}function Ft(e){if(e)try{let t=JSON.parse(e);if(typeof t?.hash!=`string`)return;let n=Array.isArray(t.outputPaths)?t.outputPaths.filter(e=>typeof e==`string`):[];return{hash:t.hash,outputPaths:n}}catch{return}}const It=new Set([`src`,`public`]),Lt=[`.js`,`.cjs`,`.mjs`,`.jsx`,`.ts`,`.cts`,`.mts`,`.tsx`,`.json`,`.browserslistrc`,`package.json`,`yarn.lock`,`bun.lock`,`bun.lockb`],Rt=new Set([`test`,`tests`,`__tests__`,`test-fixtures`]);async function zt(n,i,a){return new Promise(o=>{let s=r.spawnSync(`git`,[`status`,`--porcelain`,`-uall`,`-z`],{cwd:n.dirPath,env:n.env,stdio:`pipe`,encoding:`utf8`}).stdout.split(`\0`).filter(e=>e.length>0),c=[];for(let e=0;e<s.length;e++){let t=s[e],n=t.slice(0,2);if(c.push({untracked:n===`??`,filePath:t.slice(3)}),n.includes(`R`)||n.includes(`C`)){let t=s[++e];t&&c.push({untracked:!1,filePath:t})}}let l=c.map(e=>({...e,hashPath:n.env.WB_ENV===`test`?e.filePath.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,``):e.filePath})),u=t.relative(n.rootDirPath,n.dirPath),d=(Ot(i)??[]).map(e=>t.join(u,e)),f=l.filter(({filePath:e,hashPath:t})=>{let n=t.split(`/`).slice(0,-1);return(n.some(e=>It.has(e))||Lt.some(e=>t.endsWith(e)))&&!n.some(e=>Rt.has(e))&&!At(d,e)});i.verbose&&console.info(`Changed files: ${f.map(e=>e.hashPath).join(`, `)}`);for(let r of f.filter(e=>e.untracked))try{a.update(r.hashPath),a.update(e.readFileSync(t.join(n.rootDirPath,r.filePath)))}catch{}let p=f.filter(e=>!e.untracked).map(e=>e.hashPath);if(p.length===0){o();return}let m=r.spawn(`git`,[`diff`,`HEAD`,`--`,...p],{cwd:n.rootDirPath});m.stdout.on(`data`,e=>{a.update(e),i.verbose&&(console.info(`Data:`,e),console.info(`Hash:`,a.copy().digest(`hex`)))}),m.on(`close`,()=>{o()})})}const Bt=new _,Vt={exitIfFailed:!0};async function K(e,t,n,r=Vt){let i=Ut(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||Wt(i.printable,t,n.silent?`Command`:`Start`),n.verbose&&Wt(i.runnable,t,`Start (raw)`,!0),n.dryRun)return Gt(i.printable,0,r,{silentSuccess:n.silent}),0;let a=!!(n.silent&&(r.processSilentOutput??r.printSilentOutputOnFailureOnly)),o=!1,s=n.silent&&r.silentProgressIntervalMs?setInterval(()=>{process.stdout.write(`.`),o=!0},r.silentProgressIntervalMs):void 0,c=await L(i.runnable,void 0,{cwd:t.dirPath,env:Kt(t.env,{...r,preserveColor:r.preserveColor??(n.silent?!0:void 0)}),shell:!0,stdio:n.silent?`pipe`:`inherit`,timeout:r.timeout,mergeOutAndError:a,killOnExit:!0,printingStdout:n.silent&&!a,printingStderr:n.silent&&!a,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose}).finally(()=>{s&&clearInterval(s)}),l=c.status??1;if(o&&process.stdout.write(`
|
|
15
15
|
`),a&&(!r.printSilentOutputOnFailureOnly||l!==0)){let e=(r.processSilentOutput?r.processSilentOutput(c.stdout):c.stdout).trim();e&&(process.stdout.write(e),process.stdout.write(`
|
|
16
|
-
`))}return n.silent&&l===0&&r.silentSuccessMessage&&console.info(p.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),
|
|
17
|
-
`)),
|
|
18
|
-
`,``).replaceAll(/\s\s+/g,` `).replaceAll(/PRISMA generate(?!\s+--no-hints)(?=\s|$)/gu,`PRISMA generate --no-hints`).replaceAll(`PRISMA `,`YARN prisma `).replaceAll(`BUN run `,t.usesBunPackageManager?`${n} `:`YARN run `).replaceAll(`BUN `,t.usesBunPackageManager?`${n} `:`YARN `).replaceAll(`YARN run `,t.usesBunPackageManager?`${n} `:`yarn run `);t.usesBunPackageManager&&(r=r.replaceAll(`YARN build-ts run`,`bun run`).replaceAll(`bun run bun run`,`bun run`).replaceAll(`dist/index.js`,`src/index.ts`)),r=r.trim();let i=r.replaceAll(`YARN `,`${n} `),a=r.replaceAll(`YARN playwright `,`${n} playwright `).replaceAll(`YARN `,!t.usesBunPackageManager&&t.binExists?``:`${n} `);return{printable:`${n} dotenv -- ${i}`,runnable:a}}function
|
|
19
|
-
`+(r?p.gray:p.cyan)(p.bold(`${n}:`),e)+p.gray(` at ${t.dirPath}`))}function
|
|
20
|
-
&& litestream restore ${r} -o "${t}" "${t}" && ls -ahl "${t}" && ${i}`}listBackups(e,t){let n=
|
|
16
|
+
`))}return n.silent&&l===0&&r.silentSuccessMessage&&console.info(p.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),Gt(i.printable,l,r,{silentSuccess:n.silent}),l}function q(e,t,n,r=Vt){return Bt.runAndWaitForReturnValue(async()=>{let i=Ut(e,t);if(Wt(i.printable,t,`Start (parallel)`,!0),n.dryRun)return Wt(i.printable,t,`Started (log)`),n.verbose&&Wt(i.runnable,t,`Started (raw)`,!0),Gt(i.printable,0,r),0;let a=await L(i.runnable,void 0,{cwd:t.dirPath,env:Kt(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:`pipe`,timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(a.signal),Wt(i.printable,t,`Started (log)`),n.verbose&&Wt(i.runnable,t,`Started (raw)`,!0);let o=a.stdout.trim();return o&&!r.printRawOutput&&(process.stdout.write(o),process.stdout.write(`
|
|
17
|
+
`)),Gt(i.printable,a.status,r),a.status??1})}function Ht(e,t,n,r=Vt){return Bt.runAndWaitForReturnValue(async()=>{let i=Ut(e,t);if(n.dryRun)return{exitCode:0,output:``};let a=await L(i.runnable,void 0,{cwd:t.dirPath,env:Kt(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:`pipe`,timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(a.signal),{exitCode:a.status??1,output:a.stdout}})}function Ut(e,t){let n=t.usesBunPackageManager?`bun run`:`yarn`,r=e.replaceAll(`
|
|
18
|
+
`,``).replaceAll(/\s\s+/g,` `).replaceAll(/PRISMA generate(?!\s+--no-hints)(?=\s|$)/gu,`PRISMA generate --no-hints`).replaceAll(`PRISMA `,`YARN prisma `).replaceAll(`BUN run `,t.usesBunPackageManager?`${n} `:`YARN run `).replaceAll(`BUN `,t.usesBunPackageManager?`${n} `:`YARN `).replaceAll(`YARN run `,t.usesBunPackageManager?`${n} `:`yarn run `);t.usesBunPackageManager&&(r=r.replaceAll(`YARN build-ts run`,`bun run`).replaceAll(`bun run bun run`,`bun run`).replaceAll(`dist/index.js`,`src/index.ts`)),r=r.trim();let i=r.replaceAll(`YARN `,`${n} `),a=r.replaceAll(`YARN playwright `,`${n} playwright `).replaceAll(`YARN `,!t.usesBunPackageManager&&t.binExists?``:`${n} `);return{printable:`${n} dotenv -- ${i}`,runnable:a}}function Wt(e,t,n=`Start`,r=!1){console.info(`
|
|
19
|
+
`+(r?p.gray:p.cyan)(p.bold(`${n}:`),e)+p.gray(` at ${t.dirPath}`))}function Gt(e,t,n,r={}){if(t===0){if(r.silentSuccess)return;console.info(p.green(p.bold(`Finished:`),e))}else console.info(p.red(p.bold(`Failed (exit code ${t}): `),e)),n.exitIfFailed!==!1&&process.exit(t??1)}function Kt(e,t){let n={...e};return t.ci&&(n.CI=`1`),qt(n,t.preserveColor),n}function qt(e,t){e.NO_COLOR!==void 0||t===!1?delete e.FORCE_COLOR:t&&process.stdout.isTTY&&(e.FORCE_COLOR||=`3`)}const Jt={"kill-others":{description:`Kill other commands when one command exits`,type:`boolean`},"kill-others-on-fail":{description:`Kill other commands when one command fails`,type:`boolean`},success:{description:`Define successful completion criteria`,type:`string`,choices:[`all`,`first`],default:`all`}},Yt={commands:{description:`Commands to run concurrently`,type:`array`}},Xt={command:`concurrently <commands...>`,describe:`Run commands concurrently`,builder:{...Ye,...Jt,...Yt},async handler(e){process.platform===`win32`&&(console.error(p.red(`This command is not supported on Windows.`)),process.exit(1));let t=W(e);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=(e.commands??[]).map(String).filter(Boolean);n.length===0&&(console.error(p.red(`No commands provided.`)),process.exit(1));try{let r=await Zt({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:typeof e.ci==`boolean`?e.ci:void 0});process.exit(r)}catch(e){console.error(p.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};async function Zt(e){let t=e.commands.map(t=>r.spawn(Ut(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:Kt(e.project.env,{ci:e.ci}),shell:!0,stdio:`inherit`})),n=!1,i,a,o,s=[],c=Array.from({length:t.length}),l=t.map((r,i)=>new Promise(l=>{let u=!1,d=r=>{u||(u=!0,c[i]=r,a??=r,!n&&$t(r,e)&&(o=r,n=!0,s.push(en(t,`SIGTERM`))),l())};r.once(`error`,e=>{console.error(`Failed to start child process:`,e),d(1)}),r.once(`exit`,(e,t)=>{d(Qt(e??void 0,t??void 0))})})),u=e=>{i??=e,!n&&(n=!0,s.push(en(t,e)))},d=()=>{u(`SIGINT`)},f=()=>{u(`SIGTERM`)},p=()=>{u(`SIGQUIT`)};process.on(`SIGINT`,d),process.on(`SIGTERM`,f),process.on(`SIGQUIT`,p);try{await Promise.all(l),await Promise.all(s)}finally{process.removeListener(`SIGINT`,d),process.removeListener(`SIGTERM`,f),process.removeListener(`SIGQUIT`,p)}if(i)return Qt(void 0,i);if(e.success===`first`)return a??1;if(o!==void 0)return o;for(let e of c)if(e!==void 0&&e!==0)return e;return 0}function Qt(e,t){return e===void 0?t&&t in g.signals?128+g.signals[t]:1:e}function $t(e,t){return t.success===`first`||t.killOthers||t.killOthersOnFail&&e!==0}async function en(e,t){let n=nn(tn(e),t);n.length!==0&&await rn(n)&&nn(n,`SIGKILL`)}function tn(e){return e.flatMap(e=>e.pid===void 0?[]:[e.pid])}function nn(e,t){let n=[];for(let r of e)try{if(!sn(r,t))continue;n.push(r),I(r,t)}catch(e){console.warn(`Failed to kill child process:`,e)}return n}async function rn(e){let t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(an))return!1;await on(Math.min(100,t-Date.now()))}return!0}function an(e){try{return process.kill(-e,0),!1}catch(e){return!!cn(e)}}async function on(e){await new Promise(t=>setTimeout(t,e))}function sn(e,t){try{return process.kill(-e,t),!0}catch(e){if(cn(e))return!1;throw e}}function cn(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ESRCH`}const ln=`litestream.yml`,un=`/etc/litestream.yml`;var dn=class{cleanUpLitestream(e){let n=Dn(e,`cleanup-litestream`);return`${`if [ -f "${n}" ] && command -v sqlite3 >/dev/null; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | sqlite3 "${n}"; fi`}; rm -f "${n}".* "${n}"-*; rm -Rf "${t.dirname(n)}/.${t.basename(n)}"* || true`}reset(e,t=``){let n=it(e);if(n)return`rm -Rf "${st(e)}/v3/d1" && ${ot(e,n)} && ${this.migrate(e,t)}`;let r=Cn(e);return r?`${r} && ${this.migrate(e,t)}`:`echo 'wb db reset supports Drizzle only when file: DATABASE_URL is set.' && exit 1`}migrate(e,t=``){let n=this.seed(e),r=this.deploy(e,t);return n===`true`?r:`${r} && ${n}`}migrateForStart(e,t=``){return vt(e,`test`)&&(Cn(e)||it(e))?this.reset(e,t):this.migrate(e,t)}deploy(e,t=``){return fn(e,`migrate ${t}`.trim())}deployForce(e){let t=Dn(e,`deploy-force`),n=Tn(t),r=kn(e),i=fn(e,`migrate`,`ALLOW_TO_SKIP_SEED=0`);return`${n}; ${this.deploy(e)} && ${n}
|
|
20
|
+
&& litestream restore ${r} -o "${t}" "${t}" && ls -ahl "${t}" && ${i}`}listBackups(e,t){let n=Dn(e,`list-backups`);return`litestream ltx ${kn(e,t)} "${n}"`}restore(e,t,n){let r=Dn(e,`restore`);return`${wn(t)}; litestream restore ${kn(e,n)} -o "${t}" "${r}"`}generate(e,t=``){return fn(e,`generate ${t}`.trim())}migrateDev(e,t=``){return this.generate(e,t)}seed(n,r){if(r)return`BUN build-ts run ${r}`;if(n.packageJson.scripts?.seed)return`YARN run seed`;let i=t.join(`db`,`seed.ts`);return e.existsSync(t.join(n.dirPath,i))?n.usesBunPackageManager?`BUN ${i}`:`BUN build-ts run ${i}`:`true`}studio(e,t,n=``){return t?`echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1`:fn(e,`studio ${n}`.trim())}};function fn(e,t,n=``){let r=`${n&&`${n} `}YARN drizzle-kit ${t}`;return t.includes(`--config`)?r:pn(e,r)}function pn(e,t){let n=Sn(e);return n&&n.dirPath!==e.dirPath?`(${V([`cd`,n.dirPath])} && ${t})`:t}function mn(n){if(!n.hasDrizzle)return!1;let r=Sn(n);if(!r)return!1;try{let n=xn(e.readFileSync(t.join(r.dirPath,r.fileName),`utf8`)),i=_n(n),a=[`export default`,`module.exports`].map(e=>i.indexOf(e)).filter(e=>e!==-1),o=hn(n,i,a.length>0?Math.min(...a):0);return o!==void 0&&vn(o)}catch{return!1}}function hn(e,t,n){let r=t.slice(n).replace(/^(?:export\s+default|module\.exports\s*=)\s*/,``),i=/^([A-Za-z_$][\w$]*)\s*(?:satisfies\b|as\b|;|\n|$)/.exec(r);if(!i){let r=t.slice(n).indexOf(`{`);return r===-1?void 0:bn(e.slice(n+r))}let a=gn(t,i[1].replaceAll(`$`,String.raw`\$`));if(a===void 0)return;let o=/^\s*(?::[^=;\n]*)?=/.exec(t.slice(a));if(o)return bn(e.slice(a+o[0].length))}function gn(e,t){let n=new RegExp(String.raw`(?<![\w$])(?:export\s+)?(?:const|let|var)\s+${t}(?![\w$])`,`g`),r=0,i=0;for(let t=n.exec(e);t;t=n.exec(e)){for(;i<t.index;i++){let t=e[i];t===`{`?r++:t===`}`&&r--}if(r===0)return t.index+t[0].length}}function _n(e){let t=``,n;for(let r=0;r<e.length;r++){let i=e[r];if(n){if(i===`\\`){t+=` `,r++;continue}if(i===n||n!=="`"&&i===`
|
|
21
21
|
`){n=void 0,t+=i;continue}t+=i===`
|
|
22
22
|
`?`
|
|
23
|
-
`:` `;continue}(i===`'`||i===`"`||i==="`")&&(n=i),t+=i}return t}function
|
|
24
|
-
`)&&(r=void 0);continue}if(a===`'`||a===`"`||a==="`")r=a;else if(a===`{`)n++;else if(a===`}`&&--n===0)return e.slice(t,i+1)}}function
|
|
23
|
+
`:` `;continue}(i===`'`||i===`"`||i==="`")&&(n=i),t+=i}return t}function vn(e){let t=yn(e);for(let e=0;e<t.length;e++){let n=t[e],r,i;if(n.type===`code`){let t=/(?:^|[\s{,(])(dialect|driver)\s*:\s*$/.exec(n.value);t&&(r=t[1],i=e+1)}else if(n.value===`dialect`||n.value===`driver`){let a=t[e-1],o=t[e+1];a?.type===`code`&&/[{,(]\s*$/.test(a.value)&&o?.type===`code`&&/^\s*:\s*$/.test(o.value)&&(r=n.value,i=e+2)}if(r===void 0||i===void 0)continue;let a=t[i];if(a?.type===`string`&&(r===`dialect`&&a.value===`sqlite`||r===`driver`&&(a.value===`d1-http`||a.value===`durable-sqlite`)))return!0}return!1}function yn(e){let t=[],n=``;for(let r=0;r<e.length;r++){let i=e[r];if(i===`'`||i===`"`||i==="`"){t.push({type:`code`,value:n}),n=``;let a=``;for(r++;r<e.length&&e[r]!==i;)e[r]===`\\`&&r++,a+=e[r]??``,r++;t.push({type:`string`,value:a});continue}n+=i}return t.push({type:`code`,value:n}),t}function bn(e){let t=e.indexOf(`{`);if(t===-1)return;let n=0,r;for(let i=t;i<e.length;i++){let a=e[i];if(r){a===`\\`?i++:(a===r||r!=="`"&&a===`
|
|
24
|
+
`)&&(r=void 0);continue}if(a===`'`||a===`"`||a==="`")r=a;else if(a===`{`)n++;else if(a===`}`&&--n===0)return e.slice(t,i+1)}}function xn(e){let t=``,n;for(let r=0;r<e.length;r++){let i=e[r],a=e[r+1];if(n){if(i===`\\`){t+=i+(a??``),r++;continue}(i===n||n!=="`"&&i===`
|
|
25
25
|
`)&&(n=void 0),t+=i;continue}if(i===`'`||i===`"`||i==="`"){n=i,t+=i;continue}if(i===`/`&&a===`/`){for(;r<e.length&&e[r]!==`
|
|
26
26
|
`;)r++;t+=`
|
|
27
|
-
`;continue}if(i===`/`&&a===`*`){for(r+=2;r<e.length&&!(e[r]===`*`&&e[r+1]===`/`);)r++;r++;continue}t+=i}return t}function
|
|
27
|
+
`;continue}if(i===`/`&&a===`*`){for(r+=2;r<e.length&&!(e[r]===`*`&&e[r+1]===`/`);)r++;r++;continue}t+=i}return t}function Sn(n){let r=[`drizzle.config.ts`,`drizzle.config.mts`,`drizzle.config.js`,`drizzle.config.mjs`];for(let i of[n.dirPath,n.rootDirPath]){let n=r.find(n=>e.existsSync(t.join(i,n)));if(n)return{dirPath:i,fileName:n}}}function Cn(e){let n=On(e);if(n)return wn(t.isAbsolute(n)?n:t.resolve(e.dirPath,n))}function wn(e){return`rm -f "${e}" "${e}-wal" "${e}-shm"`}function Tn(e){return`rm -Rf "${e}"*`}function En(e,t){let n=On(e);if(!n)throw Error(`wb db ${t} supports Drizzle only when file: DATABASE_URL is set.`);return n}function Dn(e,n){let r=En(e,n);return t.isAbsolute(r)?r:t.resolve(e.dirPath,r)}function On(e){return _t(e)}function kn(n,r){if(r)return`-config "${r}"`;let i=t.join(n.dirPath,ln);return e.existsSync(i)?`-config ./${ln}`:e.existsSync(un)?`-config ${un}`:`-config ./${ln}`}const An=new dn;function jn(n,r){if(r.migrations_pattern)return!0;let i=t.resolve(n.dirPath,r.migrations_dir??`migrations`);return e.existsSync(i)?e.readdirSync(i).some(e=>e.endsWith(`.sql`)):!1}const Mn=new Set([`bindings`,`send_email`,`ratelimits`]),Nn=new Set([`wasm_modules`,`text_blobs`,`data_blobs`]);function Pn(e,t=new Set,n=``){if(Array.isArray(e)){for(let r of e)Pn(r,t,n);return t}if(!e||typeof e!=`object`)return t;for(let[r,i]of Object.entries(e))if(r===`binding`&&typeof i==`string`)t.add(i);else if(r===`name`&&typeof i==`string`&&Mn.has(n))t.add(i);else if(Nn.has(r)&&i&&typeof i==`object`&&!Array.isArray(i))for(let e of Object.keys(i))t.add(e);else r!==`env`&&r!==`vars`&&r!==`metadata`&&r!==`options`&&Pn(i,t,r);return t}function Fn(e,t){return t?.site??e.site?[`__STATIC_CONTENT`]:[]}function In(n,r){let i=U(n);if(!i)return;if(t.extname(i)===`.toml`)throw Error(`wb deploy supports wrangler.jsonc/wrangler.json configs only; migrate wrangler.toml first.`);let a=[],o=v(e.readFileSync(i,`utf8`),a,{allowTrailingComma:!0});if(a.length>0)throw Error(`Failed to parse ${i}: ${a.length} JSONC syntax error(s).`);if(!o)return;let s=o.env?.[r];if(!s&&r!==`production`)throw Error(`The wrangler config has no "env": { "${r}": ... } section.`);return s?{workerName:s.name??(o.name?`${o.name}-${r}`:void 0),accountId:s.account_id??o.account_id,varKeys:Object.keys(s.vars??{}),vars:s.vars??{},bindingNames:[...Pn({assets:s.assets??o.assets,logfwdr:s.logfwdr??o.logfwdr,wasm_modules:s.wasm_modules??o.wasm_modules,text_blobs:s.text_blobs??o.text_blobs,data_blobs:s.data_blobs??o.data_blobs},Pn(s)),...Fn(o,s)],d1Databases:s.d1_databases??[],requiredSecretNames:s.secrets?.required??[],usesEnvSection:!0}:{workerName:o.name,accountId:o.account_id,varKeys:Object.keys(o.vars??{}),vars:o.vars??{},bindingNames:[...Pn(o),...Fn(o)],d1Databases:o.d1_databases??[],requiredSecretNames:o.secrets?.required??[],usesEnvSection:!1}}const Ln={command:`gen-dev-vars [path]`,describe:"Generate a .dev.vars file for `wrangler dev` from the environment variables loaded from .env files (plus WB_ENV and NEXT_PUBLIC_WB_ENV).",builder:e=>e.positional(`path`,{description:`Output path of the generated .dev.vars file.`,type:`string`,default:`.dev.vars`}),async handler(n){let r=W(n);r||(console.error(p.red(`No project found.`)),process.exit(1));let[i]=re(n,r.dirPath,{ignoreProcessEnv:!0}),a=new Set;for(let e of Object.keys(i)){let t=r.env[e];t!==void 0&&(t===``&&i[e]!==``&&a.add(e),i[e]=t)}for(let e of[...Rn(r),`WB_ENV`,`NEXT_PUBLIC_WB_ENV`]){let t=r.env[e];i[e]||t===void 0||(i[e]===void 0&&t===``&&a.add(e),i[e]=t)}let o=Object.entries(i).filter(([e,t])=>t!==``||a.has(e)).toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}=${zn(e,t)}`),s=t.resolve(r.dirPath,n.path??`.dev.vars`);if(n.dryRun){console.info(p.cyan(`Would generate ${s} with ${o.length} environment variables.`));return}e.mkdirSync(t.dirname(s),{recursive:!0}),e.writeFileSync(s,o.join(`
|
|
28
28
|
`)+`
|
|
29
|
-
`),console.info(p.green(`Generated ${s} with ${o.length} environment variables.`))}};function
|
|
30
|
-
`,String.raw`\n`).replaceAll(`\r`,String.raw`\r`),r=[`'${t}'`,`\`${t}\``,`"${n}"`];for(let n of r)if(c(`${e}=${n}`)[e]===t)return n;throw Error(`The value of ${e} cannot be losslessly serialized into .dev.vars; simplify its quoting.`)}const Vn=new Set(`CI.CF_ACCOUNT_ID.CF_API_BASE_URL.CF_API_EMAIL.CF_API_KEY.CF_API_TOKEN.CF_EMAIL.CLOUDFLARE_ACCESS_CLIENT_ID.CLOUDFLARE_ACCESS_CLIENT_SECRET.CLOUDFLARE_ACCOUNT_ID.CLOUDFLARE_API_BASE_URL.CLOUDFLARE_API_KEY.CLOUDFLARE_API_TOKEN.CLOUDFLARE_AUTH_USE_KEYRING.CLOUDFLARE_D1_DATABASE_ID.CLOUDFLARE_EMAIL.CLOUDFLARE_ENV.CLOUDFLARE_INCLUDE_PROCESS_ENV.CLOUDFLARE_LOAD_DEV_VARS_FROM_DOT_ENV.DOCKER_HOST.HTTP_PROXY.HTTPS_PROXY.http_proxy.https_proxy.FORCE_COLOR.MINIFLARE_CACHE_DIR.MISE_ENV.NO_COLOR.NEXT_PUBLIC_WB_ENV.NEXT_PUBLIC_WB_VERSION.NODE_ENV.PORT.WB_ENV.WB_VERSION`.split(`.`)),Hn=[`WRANGLER_`,`CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_`,`CLOUDFLARE_CF_FETCH_`];function Un(e){return Vn.has(e)||Hn.some(t=>e.startsWith(t))}const Wn={command:`deploy`,describe:`Deploy a Cloudflare Workers app (vinext or plain Worker) to the WB_ENV environment: validate secrets, build, apply remote D1 migrations, then deploy code and secrets atomically.`,builder:e=>e,async handler(n){delete process.env.CLOUDFLARE_ENV;let r=W(n);r||(console.error(p.red(`No project found.`)),process.exit(1));let i=U(r);i||(console.error(p.red(`wb deploy currently supports only Cloudflare Workers apps (no wrangler config found).`)),process.exit(1));let o=r.env.WB_ENV;(!o||o===`development`||o===`test`)&&(console.error(p.red(`WB_ENV must name a deploy environment (e.g. staging or production), but is ${o}.`)),process.exit(1));let s=Gn(r.dirPath,n.includeRootEnv?r.rootDirPath:void 0);for(let[e,t]of Object.entries(s))process.env[e]??=t,r.env[e]??=t;let c;try{c=Ln(r,o)}catch(e){console.error(p.red(String(e instanceof Error?e.message:e))),process.exit(1)}c||(console.error(p.red(`Failed to parse ${i}.`)),process.exit(1));let l=c.accountId??r.env.CLOUDFLARE_ACCOUNT_ID,u=c.d1Databases.filter(e=>Mn(r,e)),d=hn(r);d&&u.length>0&&u.length<c.d1Databases.length&&(console.error(p.red(`wb deploy does not support mixing wrangler-native and non-native D1 migration layouts.`)),process.exit(1));let f=u.length===0&&d?c.d1Databases[0]:void 0;u.length===0&&d&&c.d1Databases.length>1&&(console.error(p.red(`wb deploy supports drizzle-kit migrations only for a single D1 binding; found multiple.`)),process.exit(1));let m=new Set(u);f&&m.add(f);let g=c.d1Databases.filter(e=>!m.has(e));if(g.length>0&&console.warn(p.yellow(`No D1 migration mechanism detected for ${g.map(e=>e.binding??e.database_name??`unnamed binding`).join(`, `)} (no wrangler migrations directory and no drizzle config targeting sqlite/d1-http/durable-sqlite); wb deploy will not run D1 migrations for them.`)),!n.dryRun){f&&!r.env.CLOUDFLARE_API_TOKEN&&(console.error(p.red(`CLOUDFLARE_API_TOKEN is required for remote drizzle-kit migrations.`)),process.exit(1));let e=!!r.env.CLOUDFLARE_API_TOKEN||!!r.env.CF_API_TOKEN||!!(r.env.CLOUDFLARE_API_KEY&&r.env.CLOUDFLARE_EMAIL)||!!(r.env.CF_API_KEY&&r.env.CF_EMAIL);Je(r.env.CI)&&!e&&(console.error(p.red(`Wrangler authentication (e.g. CLOUDFLARE_API_TOKEN) is required to deploy on CI.`)),process.exit(1))}!Je(r.env.CI)&&r.packageJson.scripts?.[`deploy/ci-setup`]&&await K(`YARN run deploy/ci-setup`,r,n);let[_,v]=re(n,r.dirPath,{ignoreProcessEnv:!0}),y=new Set(v.filter(([e])=>!e.startsWith(`mise env`)).flatMap(([,e])=>e));for(let e of Object.keys(_))y.has(e)||delete _[e];let b=zn(r);for(let e of b)_[e]??=r.env[e]??``;for(let e of c.requiredSecretNames){let t=r.env[e];_[e]===void 0&&t!==void 0&&(_[e]=t)}for(let e of Object.keys(_)){let t=r.env[e];t!==void 0&&(_[e]=t)}let{missingKeys:x,secrets:S}=Kn(_,[...c.varKeys,...c.bindingNames],b);r.env.WB_VERSION&&c.bindingNames.includes(`WB_VERSION`)&&(console.error(p.red(`WB_VERSION collides with a Worker binding name; rename the binding.`)),process.exit(1));let C=Object.keys(_).filter(e=>c.bindingNames.includes(e));C.length>0&&console.warn(p.yellow(`Skipping env keys that collide with Worker binding names: ${C.join(`, `)}`)),x.length>0&&(console.error(p.red(`Missing required environment variables (from .env.example or wrangler secrets.required): ${x.join(`, `)}`)),process.exit(1));let w=c.requiredSecretNames.filter(e=>!Object.hasOwn(S,e)&&!c.varKeys.includes(e)&&!c.bindingNames.includes(e));w.length>0&&(console.error(p.red(`Secrets required by the wrangler config are not provided: ${w.join(`, `)}`)),process.exit(1));let T=Object.keys(S).toSorted();T.length>100&&(console.error(p.red(`Cloudflare accepts at most 100 secrets per deploy, but ${T.length} were selected.`)),process.exit(1));let E=new Map(Object.entries(c.vars));r.env.WB_VERSION&&E.set(`WB_VERSION`,r.env.WB_VERSION);let D=[...E],O=[...T.filter(e=>Buffer.byteLength(S[e]??``,`utf8`)>5*1024),...D.filter(([,e])=>Buffer.byteLength(typeof e==`string`?e:JSON.stringify(e),`utf8`)>5*1024).map(([e])=>e)];O.length>0&&(console.error(p.red(`Variable or secret values exceed Cloudflare's 5 KB limit: ${O.join(`, `)}`)),process.exit(1));let k=Jn((n.dryRun?[]:await qn(r,n,i,c,o))??[],S,D.map(([e])=>e),c.bindingNames),A=new Set([...T,...D.map(([e])=>e)]).size+k.length,j=k.length>0?` (including ${k.length} remote secrets kept from the previous version: ${k.join(`, `)})`:``;A>128&&(console.error(p.red(`Cloudflare allows at most 128 variables and secrets combined, but ${A} were selected${j}.`)),process.exit(1)),A>64&&console.warn(p.yellow(`${A} variables and secrets${j} exceed the Free plan's limit of 64.`)),console.info(p.cyan(`Deploying ${c.workerName??r.name} (${o}) with ${T.length} secrets: ${T.join(`, `)}`));let M=!!(r.packageJson.dependencies?.vinext??r.packageJson.devDependencies?.vinext),N=M?t.join(`dist`,`server`,`wrangler.json`):i,P=c.usesEnvSection?`${Qe(`CLOUDFLARE_ENV`,o)} `:``;M?(r.env.WB_VERSION&&(r.env.NEXT_PUBLIC_WB_VERSION||=r.env.WB_VERSION),r.packageJson.scripts?.[`gen-code`]&&await K(`YARN run gen-code`,r,n),await K(`${P}YARN vinext build`,r,n),!n.dryRun&&!e.existsSync(t.resolve(r.dirPath,N))&&(console.error(p.red(`${N} not found; the vinext build did not produce a deploy config.`)),process.exit(1)),await K(`YARN wrangler deploy --dry-run --config ${H(N)}`,r,n)):await K(`YARN wrangler deploy --dry-run --config ${H(i)}${c.usesEnvSection?` --env ${H(o)}`:``}`,r,n);let ee=c.usesEnvSection?` --env ${H(o)}`:``;for(let e of u){let t=e.database_name??e.binding;t&&await K(`CI=true YARN wrangler d1 migrations apply ${H(t)} --remote --config ${H(i)}${ee}`,r,n)}f&&(f.database_id||(console.error(p.red(`The ${o} D1 binding has no database_id in the wrangler config.`)),process.exit(1)),l||(console.error(p.red(`CLOUDFLARE_ACCOUNT_ID (or account_id in the wrangler config) is required for remote drizzle-kit migrations.`)),process.exit(1)),await K(pn(r,`migrate`,`CLOUDFLARE_D1_DATABASE_ID=${f.database_id} CLOUDFLARE_ACCOUNT_ID=${l}`),r,n));let te=[`deploy`,`--config`,N,...!M&&c.usesEnvSection?[`--env`,o]:[],...r.env.WB_VERSION?[`--var`,`WB_VERSION:${r.env.WB_VERSION}`]:[],`--secrets-file`];if(console.info(p.cyan(`Running: wrangler ${te.join(` `)} <temporary secrets file>`)),!n.dryRun){Yn(r);let n={...r.env};delete n.CLOUDFLARE_ENV;let i=e.mkdtempSync(t.join(h.tmpdir(),`wb-deploy-`)),o=[`SIGHUP`,`SIGINT`,`SIGTERM`,`SIGQUIT`],s=new Map,c,l;for(let t of o){let n=()=>{if(l??=t,c)c.kill(t===`SIGINT`||t===`SIGTERM`?t:`SIGTERM`);else{for(let[e,t]of s)process.off(e,t);e.rmSync(i,{force:!0,recursive:!0}),process.kill(process.pid,t)}};s.set(t,n),process.on(t,n)}let u;try{let o=t.join(i,`secrets.json`);e.writeFileSync(o,JSON.stringify(S),{mode:384}),u=await new Promise(e=>{c=a(`wrangler`,[...te,o],{cwd:r.dirPath,env:n,stdio:[`ignore`,`inherit`,`inherit`]}),c.on(`error`,t=>{console.error(t),e(1)}),c.on(`exit`,(t,n)=>{e(n?1:t??void 0)})})}finally{for(let[e,t]of s)process.off(e,t);e.rmSync(i,{force:!0,recursive:!0})}if(l){process.kill(process.pid,l);return}u!==0&&(console.error(p.red(`wrangler deploy failed with exit code ${u??`unknown`}.`)),process.exit(u??1))}if(r.packageJson.scripts?.[`deploy/post`]){let e=c.d1Databases.length===1?c.d1Databases[0]:void 0;delete r.env.CLOUDFLARE_D1_DATABASE_ID,c.d1Databases.length>1&&console.warn(p.yellow(`Multiple D1 bindings exist; CLOUDFLARE_D1_DATABASE_ID is not set for deploy/post.`)),e?.database_id&&(r.env.CLOUDFLARE_D1_DATABASE_ID=e.database_id),l&&(r.env.CLOUDFLARE_ACCOUNT_ID=l),await K(`YARN run deploy/post`,r,n)}}};function Gn(n,r){let i={};for(let a of new Set(r?[n,r]:[n])){let n=t.join(a,`.env.cloudflare`);if(!e.existsSync(n))continue;let r=s({path:n,processEnv:{},quiet:!0}).parsed??{};for(let[e,t]of Object.entries(r))e!==`CLOUDFLARE_ENV`&&(i[e]??=t)}return i}function Kn(e,t,n){let r=new Set(t),i={};for(let[t,n]of Object.entries(e))r.has(t)||Un(t)||t===`DATABASE_URL`&&n.startsWith(`file:`)||(i[t]=n);return{missingKeys:n.filter(t=>!r.has(t)&&!Un(t)&&!e[t]),secrets:i}}async function qn(e,t,n,r,i){Yn(e);let a=[`secret`,`list`,`--format`,`json`,`--config`,n,...r.usesEnvSection?[`--env`,i]:[]];console.info(p.cyan(`Running: wrangler ${a.join(` `)}`));let o;try{o=await L(`wrangler`,a,{cwd:e.dirPath,env:e.env,stdio:`pipe`,killOnExit:!0,verbose:t.verbose})}catch(e){console.warn(p.yellow(`Failed to run wrangler to list remote secrets; checking only the local payload against Cloudflare's limits.\n${e instanceof Error?e.message:String(e)}`));return}if(o.status===0){let e=o.stdout.indexOf(`[`),t=o.stdout.lastIndexOf(`]`);if(e!==-1&&t!==-1&&e<t)try{return JSON.parse(o.stdout.slice(e,t+1)).map(({name:e})=>e).filter(e=>typeof e==`string`)}catch{}}else if(/\[code: 100(07|90)\]|If this is a new Worker/.test(o.stdout+o.stderr))return[];console.warn(p.yellow(`Failed to list the remote Worker secrets; checking only the local payload against Cloudflare's limits.\n${(o.stderr||o.stdout).trim()}`))}function Jn(e,t,n,r){let i=new Set([...n,...r]);return e.filter(e=>!Object.hasOwn(t,e)&&!i.has(e))}function Yn(e){e.binExists||console.warn(p.yellow(`node_modules/.bin not found; relying on PATH to resolve wrangler.`))}const Xn=new Set([`SIGINT`,`SIGTERM`,`SIGQUIT`]),Zn={command:`dotenv [args..]`,describe:`Load .env files and run a command.`,builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await Qn($n(e))}};async function Qn({command:e}){e.length===0&&(console.error(`Usage: wb dotenv -- <command> [args...]`),process.exit(1));let n=t.resolve(process.cwd());tr(n);let r=process.env.BERRY_BIN_FOLDER;me(process.env),!qe(n,process.env)&&r&&(process.env.PATH=process.env.PATH?`${r}:${process.env.PATH}`:r);let i=a(e[0],e.slice(1),{cwd:n,env:process.env,stdio:`inherit`}),o=new Map;i.on(`error`,e=>{console.error(e),process.exit(1)});for(let e of Xn){let t=()=>{i.kill(e)};o.set(e,t),process.once(e,t)}i.on(`exit`,(e,t)=>{for(let[e,t]of o)process.off(e,t);if(t){process.kill(process.pid,t);return}process.exit(e??1)})}function $n(e){return{command:[...(e.args??[]).map(String),...(e[`--`]??[]).map(String)]}}function er(e,t){!e||[`development`,`test`,`staging`,`production`].includes(e)||process.env.WB_SKIP_ENV_CHECK===`1`||process.env.WB_SKIP_ENV_CHECK===`true`||(console.error(`WB_ENV must be one of development, test, staging, or production, but is "${e}". Fix ${t}, or set WB_SKIP_ENV_CHECK=1 to skip this check.`),process.exit(1))}function tr(e){let n=process.env.WB_ENV,r=process.env,i=n||r.NODE_ENV||`development`,a=n||r.FNOX_PROFILE||r.NODE_ENV||`development`,o=n=>s({path:t.join(e,n),processEnv:{},quiet:!0}).parsed??{},c=n?{...o(`.env.${n}`),...o(`.env.${n}.local`)}:{},u={...o(`.env`),...o(`.env.${i}`),...o(`.env.local`),...o(`.env.${i}.local`)},d=!!n&&!Je(process.env.CI),[f]=ie(e,a,u,{modeFileOverridesProcessEnv:d}),p={...f,...u},m=e=>!(e in process.env)||d&&(e in c||e in f),h={};for(let[e,t]of Object.entries(process.env))t!==void 0&&!(e in p&&m(e))&&(h[e]=t.replaceAll(`$`,String.raw`\$`));let g=l({parsed:p,processEnv:h}).parsed??p;for(let[e,t]of Object.entries(g)){if(!(e in process.env)){process.env[e]=t;continue}!(e in c||e in f)||process.env[e]===t||d&&(console.warn(`Warning: ${e} in the "${n}" mode's env sources overrides the value inherited from the parent environment because WB_ENV is explicitly set.`),process.env[e]=t)}er(n,`the exported variable`),er(process.env.WB_ENV,`the env source or the exported variable`);let _=oe(e)?a:i;process.env.WB_ENV&&[`development`,`test`,`staging`,`production`].includes(_)&&process.env.WB_ENV!==_&&process.env.WB_SKIP_ENV_CHECK!==`1`&&process.env.WB_SKIP_ENV_CHECK!==`true`&&(console.error(`WB_ENV resolves to "${process.env.WB_ENV}" although the "${_}" environment was selected. Fix the WB_ENV defined in the env sources, or set WB_SKIP_ENV_CHECK=1 to skip this check.`),process.exit(1))}const nr=`prisma/mount`,rr=`litestream.yml`,ir=`/etc/litestream.yml`,ar=[{schemaPath:t.join(`prisma`,`schema.prisma`),dbPath:`prisma`},{schemaPath:t.join(`prisma`,`schema`),dbPath:t.join(`prisma`,`schema`)},{schemaPath:t.join(`db`,`schema.prisma`),dbPath:`db`}];var or=class{cleanUpLitestream(e){let t=nr;return`${ur(`${t}/prod.sqlite3`)}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=``){return`PRISMA migrate deploy ${t}`}generate(e,t=``){return[`PRISMA generate`,t].filter(Boolean).join(` `)}deployForce(e){let t=nr,n=lr(`${t}/prod.sqlite3`);return`${n}; PRISMA migrate reset --force --skip-seed && ${n}
|
|
31
|
-
&& litestream restore ${
|
|
32
|
-
`))}function
|
|
33
|
-
`))}function
|
|
34
|
-
`+p.cyan(p.bold(`Command:`),e)+p.gray(` at ${t}`))}function
|
|
29
|
+
`),console.info(p.green(`Generated ${s} with ${o.length} environment variables.`))}};function Rn(t){let n;try{n=t.findFile(`.env.example`)}catch{return[]}return Object.keys(c(e.readFileSync(n,`utf8`)))}function zn(e,t){let n=t.replaceAll(`
|
|
30
|
+
`,String.raw`\n`).replaceAll(`\r`,String.raw`\r`),r=[`'${t}'`,`\`${t}\``,`"${n}"`];for(let n of r)if(c(`${e}=${n}`)[e]===t)return n;throw Error(`The value of ${e} cannot be losslessly serialized into .dev.vars; simplify its quoting.`)}const Bn=new Set(`CI.CF_ACCOUNT_ID.CF_API_BASE_URL.CF_API_EMAIL.CF_API_KEY.CF_API_TOKEN.CF_EMAIL.CLOUDFLARE_ACCESS_CLIENT_ID.CLOUDFLARE_ACCESS_CLIENT_SECRET.CLOUDFLARE_ACCOUNT_ID.CLOUDFLARE_API_BASE_URL.CLOUDFLARE_API_KEY.CLOUDFLARE_API_TOKEN.CLOUDFLARE_AUTH_USE_KEYRING.CLOUDFLARE_D1_DATABASE_ID.CLOUDFLARE_EMAIL.CLOUDFLARE_ENV.CLOUDFLARE_INCLUDE_PROCESS_ENV.CLOUDFLARE_LOAD_DEV_VARS_FROM_DOT_ENV.DOCKER_HOST.HTTP_PROXY.HTTPS_PROXY.http_proxy.https_proxy.FORCE_COLOR.MINIFLARE_CACHE_DIR.MISE_ENV.NO_COLOR.NEXT_PUBLIC_WB_ENV.NEXT_PUBLIC_WB_VERSION.NODE_ENV.PORT.WB_ENV.WB_VERSION`.split(`.`)),Vn=[`WRANGLER_`,`CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_`,`CLOUDFLARE_CF_FETCH_`];function Hn(e){return Bn.has(e)||Vn.some(t=>e.startsWith(t))}const Un={command:`deploy`,describe:`Deploy a Cloudflare Workers app (vinext or plain Worker) to the WB_ENV environment: validate secrets, build, apply remote D1 migrations, then deploy code and secrets atomically.`,builder:e=>e,async handler(n){delete process.env.CLOUDFLARE_ENV;let r=W(n);r||(console.error(p.red(`No project found.`)),process.exit(1));let i=U(r);i||(console.error(p.red(`wb deploy currently supports only Cloudflare Workers apps (no wrangler config found).`)),process.exit(1));let o=r.env.WB_ENV;(!o||o===`development`||o===`test`)&&(console.error(p.red(`WB_ENV must name a deploy environment (e.g. staging or production), but is ${o}.`)),process.exit(1));let s=Wn(r.dirPath,n.includeRootEnv?r.rootDirPath:void 0);for(let[e,t]of Object.entries(s))process.env[e]??=t,r.env[e]??=t;let c;try{c=In(r,o)}catch(e){console.error(p.red(String(e instanceof Error?e.message:e))),process.exit(1)}c||(console.error(p.red(`Failed to parse ${i}.`)),process.exit(1));let l=c.accountId??r.env.CLOUDFLARE_ACCOUNT_ID,u=c.d1Databases.filter(e=>jn(r,e)),d=mn(r);d&&u.length>0&&u.length<c.d1Databases.length&&(console.error(p.red(`wb deploy does not support mixing wrangler-native and non-native D1 migration layouts.`)),process.exit(1));let f=u.length===0&&d?c.d1Databases[0]:void 0;u.length===0&&d&&c.d1Databases.length>1&&(console.error(p.red(`wb deploy supports drizzle-kit migrations only for a single D1 binding; found multiple.`)),process.exit(1));let m=new Set(u);f&&m.add(f);let g=c.d1Databases.filter(e=>!m.has(e));if(g.length>0&&console.warn(p.yellow(`No D1 migration mechanism detected for ${g.map(e=>e.binding??e.database_name??`unnamed binding`).join(`, `)} (no wrangler migrations directory and no drizzle config targeting sqlite/d1-http/durable-sqlite); wb deploy will not run D1 migrations for them.`)),!n.dryRun){f&&!r.env.CLOUDFLARE_API_TOKEN&&(console.error(p.red(`CLOUDFLARE_API_TOKEN is required for remote drizzle-kit migrations.`)),process.exit(1));let e=!!r.env.CLOUDFLARE_API_TOKEN||!!r.env.CF_API_TOKEN||!!(r.env.CLOUDFLARE_API_KEY&&r.env.CLOUDFLARE_EMAIL)||!!(r.env.CF_API_KEY&&r.env.CF_EMAIL);Je(r.env.CI)&&!e&&(console.error(p.red(`Wrangler authentication (e.g. CLOUDFLARE_API_TOKEN) is required to deploy on CI.`)),process.exit(1))}!Je(r.env.CI)&&r.packageJson.scripts?.[`deploy/ci-setup`]&&await K(`YARN run deploy/ci-setup`,r,n);let[_,v]=re(n,r.dirPath,{ignoreProcessEnv:!0}),y=new Set(v.filter(([e])=>!e.startsWith(`mise env`)).flatMap(([,e])=>e));for(let e of Object.keys(_))y.has(e)||delete _[e];let b=Rn(r);for(let e of b)_[e]??=r.env[e]??``;for(let e of c.requiredSecretNames){let t=r.env[e];_[e]===void 0&&t!==void 0&&(_[e]=t)}for(let e of Object.keys(_)){let t=r.env[e];t!==void 0&&(_[e]=t)}let{missingKeys:x,secrets:S}=Gn(_,[...c.varKeys,...c.bindingNames],b);r.env.WB_VERSION&&c.bindingNames.includes(`WB_VERSION`)&&(console.error(p.red(`WB_VERSION collides with a Worker binding name; rename the binding.`)),process.exit(1));let C=Object.keys(_).filter(e=>c.bindingNames.includes(e));C.length>0&&console.warn(p.yellow(`Skipping env keys that collide with Worker binding names: ${C.join(`, `)}`)),x.length>0&&(console.error(p.red(`Missing required environment variables (from .env.example or wrangler secrets.required): ${x.join(`, `)}`)),process.exit(1));let w=c.requiredSecretNames.filter(e=>!Object.hasOwn(S,e)&&!c.varKeys.includes(e)&&!c.bindingNames.includes(e));w.length>0&&(console.error(p.red(`Secrets required by the wrangler config are not provided: ${w.join(`, `)}`)),process.exit(1));let T=Object.keys(S).toSorted();T.length>100&&(console.error(p.red(`Cloudflare accepts at most 100 secrets per deploy, but ${T.length} were selected.`)),process.exit(1));let E=new Map(Object.entries(c.vars));r.env.WB_VERSION&&E.set(`WB_VERSION`,r.env.WB_VERSION);let D=[...E],O=[...T.filter(e=>Buffer.byteLength(S[e]??``,`utf8`)>5*1024),...D.filter(([,e])=>Buffer.byteLength(typeof e==`string`?e:JSON.stringify(e),`utf8`)>5*1024).map(([e])=>e)];O.length>0&&(console.error(p.red(`Variable or secret values exceed Cloudflare's 5 KB limit: ${O.join(`, `)}`)),process.exit(1));let k=qn((n.dryRun?[]:await Kn(r,n,i,c,o))??[],S,D.map(([e])=>e),c.bindingNames),A=new Set([...T,...D.map(([e])=>e)]).size+k.length,j=k.length>0?` (including ${k.length} remote secrets kept from the previous version: ${k.join(`, `)})`:``;A>128&&(console.error(p.red(`Cloudflare allows at most 128 variables and secrets combined, but ${A} were selected${j}.`)),process.exit(1)),A>64&&console.warn(p.yellow(`${A} variables and secrets${j} exceed the Free plan's limit of 64.`)),console.info(p.cyan(`Deploying ${c.workerName??r.name} (${o}) with ${T.length} secrets: ${T.join(`, `)}`));let M=!!(r.packageJson.dependencies?.vinext??r.packageJson.devDependencies?.vinext),N=M?t.join(`dist`,`server`,`wrangler.json`):i,P=c.usesEnvSection?`${Qe(`CLOUDFLARE_ENV`,o)} `:``;M?(r.env.WB_VERSION&&(r.env.NEXT_PUBLIC_WB_VERSION||=r.env.WB_VERSION),r.packageJson.scripts?.[`gen-code`]&&await K(`YARN run gen-code`,r,n),await K(`${P}YARN vinext build`,r,n),!n.dryRun&&!e.existsSync(t.resolve(r.dirPath,N))&&(console.error(p.red(`${N} not found; the vinext build did not produce a deploy config.`)),process.exit(1)),await K(`YARN wrangler deploy --dry-run --config ${H(N)}`,r,n)):await K(`YARN wrangler deploy --dry-run --config ${H(i)}${c.usesEnvSection?` --env ${H(o)}`:``}`,r,n);let ee=c.usesEnvSection?` --env ${H(o)}`:``;for(let e of u){let t=e.database_name??e.binding;t&&await K(`CI=true YARN wrangler d1 migrations apply ${H(t)} --remote --config ${H(i)}${ee}`,r,n)}f&&(f.database_id||(console.error(p.red(`The ${o} D1 binding has no database_id in the wrangler config.`)),process.exit(1)),l||(console.error(p.red(`CLOUDFLARE_ACCOUNT_ID (or account_id in the wrangler config) is required for remote drizzle-kit migrations.`)),process.exit(1)),await K(fn(r,`migrate`,`CLOUDFLARE_D1_DATABASE_ID=${f.database_id} CLOUDFLARE_ACCOUNT_ID=${l}`),r,n));let te=[`deploy`,`--config`,N,...!M&&c.usesEnvSection?[`--env`,o]:[],...r.env.WB_VERSION?[`--var`,`WB_VERSION:${r.env.WB_VERSION}`]:[],`--secrets-file`];if(console.info(p.cyan(`Running: wrangler ${te.join(` `)} <temporary secrets file>`)),!n.dryRun){Jn(r);let n={...r.env};delete n.CLOUDFLARE_ENV;let i=e.mkdtempSync(t.join(h.tmpdir(),`wb-deploy-`)),o=[`SIGHUP`,`SIGINT`,`SIGTERM`,`SIGQUIT`],s=new Map,c,l;for(let t of o){let n=()=>{if(l??=t,c)c.kill(t===`SIGINT`||t===`SIGTERM`?t:`SIGTERM`);else{for(let[e,t]of s)process.off(e,t);e.rmSync(i,{force:!0,recursive:!0}),process.kill(process.pid,t)}};s.set(t,n),process.on(t,n)}let u;try{let o=t.join(i,`secrets.json`);e.writeFileSync(o,JSON.stringify(S),{mode:384}),u=await new Promise(e=>{c=a(`wrangler`,[...te,o],{cwd:r.dirPath,env:n,stdio:[`ignore`,`inherit`,`inherit`]}),c.on(`error`,t=>{console.error(t),e(1)}),c.on(`exit`,(t,n)=>{e(n?1:t??void 0)})})}finally{for(let[e,t]of s)process.off(e,t);e.rmSync(i,{force:!0,recursive:!0})}if(l){process.kill(process.pid,l);return}u!==0&&(console.error(p.red(`wrangler deploy failed with exit code ${u??`unknown`}.`)),process.exit(u??1))}if(r.packageJson.scripts?.[`deploy/post`]){let e=c.d1Databases.length===1?c.d1Databases[0]:void 0;delete r.env.CLOUDFLARE_D1_DATABASE_ID,c.d1Databases.length>1&&console.warn(p.yellow(`Multiple D1 bindings exist; CLOUDFLARE_D1_DATABASE_ID is not set for deploy/post.`)),e?.database_id&&(r.env.CLOUDFLARE_D1_DATABASE_ID=e.database_id),l&&(r.env.CLOUDFLARE_ACCOUNT_ID=l),await K(`YARN run deploy/post`,r,n)}}};function Wn(n,r){let i={};for(let a of new Set(r?[n,r]:[n])){let n=t.join(a,`.env.cloudflare`);if(!e.existsSync(n))continue;let r=s({path:n,processEnv:{},quiet:!0}).parsed??{};for(let[e,t]of Object.entries(r))e!==`CLOUDFLARE_ENV`&&(i[e]??=t)}return i}function Gn(e,t,n){let r=new Set(t),i={};for(let[t,n]of Object.entries(e))r.has(t)||Hn(t)||t===`DATABASE_URL`&&n.startsWith(`file:`)||(i[t]=n);return{missingKeys:n.filter(t=>!r.has(t)&&!Hn(t)&&!e[t]),secrets:i}}async function Kn(e,t,n,r,i){Jn(e);let a=[`secret`,`list`,`--format`,`json`,`--config`,n,...r.usesEnvSection?[`--env`,i]:[]];console.info(p.cyan(`Running: wrangler ${a.join(` `)}`));let o;try{o=await L(`wrangler`,a,{cwd:e.dirPath,env:e.env,stdio:`pipe`,killOnExit:!0,verbose:t.verbose})}catch(e){console.warn(p.yellow(`Failed to run wrangler to list remote secrets; checking only the local payload against Cloudflare's limits.\n${e instanceof Error?e.message:String(e)}`));return}if(o.status===0){let e=o.stdout.indexOf(`[`),t=o.stdout.lastIndexOf(`]`);if(e!==-1&&t!==-1&&e<t)try{return JSON.parse(o.stdout.slice(e,t+1)).map(({name:e})=>e).filter(e=>typeof e==`string`)}catch{}}else if(/\[code: 100(07|90)\]|If this is a new Worker/.test(o.stdout+o.stderr))return[];console.warn(p.yellow(`Failed to list the remote Worker secrets; checking only the local payload against Cloudflare's limits.\n${(o.stderr||o.stdout).trim()}`))}function qn(e,t,n,r){let i=new Set([...n,...r]);return e.filter(e=>!Object.hasOwn(t,e)&&!i.has(e))}function Jn(e){e.binExists||console.warn(p.yellow(`node_modules/.bin not found; relying on PATH to resolve wrangler.`))}const Yn=new Set([`SIGINT`,`SIGTERM`,`SIGQUIT`]),Xn={command:`dotenv [args..]`,describe:`Load .env files and run a command.`,builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await Zn(Qn(e))}};async function Zn({command:e}){e.length===0&&(console.error(`Usage: wb dotenv -- <command> [args...]`),process.exit(1));let n=t.resolve(process.cwd());er(n);let r=process.env.BERRY_BIN_FOLDER;me(process.env),!qe(n,process.env)&&r&&(process.env.PATH=process.env.PATH?`${r}:${process.env.PATH}`:r);let i=a(e[0],e.slice(1),{cwd:n,env:process.env,stdio:`inherit`}),o=new Map;i.on(`error`,e=>{console.error(e),process.exit(1)});for(let e of Yn){let t=()=>{i.kill(e)};o.set(e,t),process.once(e,t)}i.on(`exit`,(e,t)=>{for(let[e,t]of o)process.off(e,t);if(t){process.kill(process.pid,t);return}process.exit(e??1)})}function Qn(e){return{command:[...(e.args??[]).map(String),...(e[`--`]??[]).map(String)]}}function $n(e,t){!e||[`development`,`test`,`staging`,`production`].includes(e)||process.env.WB_SKIP_ENV_CHECK===`1`||process.env.WB_SKIP_ENV_CHECK===`true`||(console.error(`WB_ENV must be one of development, test, staging, or production, but is "${e}". Fix ${t}, or set WB_SKIP_ENV_CHECK=1 to skip this check.`),process.exit(1))}function er(e){let n=process.env.WB_ENV,r=process.env,i=n||r.NODE_ENV||`development`,a=n||r.FNOX_PROFILE||r.NODE_ENV||`development`,o=n=>s({path:t.join(e,n),processEnv:{},quiet:!0}).parsed??{},c=n?{...o(`.env.${n}`),...o(`.env.${n}.local`)}:{},u={...o(`.env`),...o(`.env.${i}`),...o(`.env.local`),...o(`.env.${i}.local`)},d=!!n&&!Je(process.env.CI),[f]=ie(e,a,u,{modeFileOverridesProcessEnv:d}),p={...f,...u},m=e=>!(e in process.env)||d&&(e in c||e in f),h={};for(let[e,t]of Object.entries(process.env))t!==void 0&&!(e in p&&m(e))&&(h[e]=t.replaceAll(`$`,String.raw`\$`));let g=l({parsed:p,processEnv:h}).parsed??p;for(let[e,t]of Object.entries(g)){if(!(e in process.env)){process.env[e]=t;continue}!(e in c||e in f)||process.env[e]===t||d&&(console.warn(`Warning: ${e} in the "${n}" mode's env sources overrides the value inherited from the parent environment because WB_ENV is explicitly set.`),process.env[e]=t)}$n(n,`the exported variable`),$n(process.env.WB_ENV,`the env source or the exported variable`);let _=oe(e)?a:i;process.env.WB_ENV&&[`development`,`test`,`staging`,`production`].includes(_)&&process.env.WB_ENV!==_&&process.env.WB_SKIP_ENV_CHECK!==`1`&&process.env.WB_SKIP_ENV_CHECK!==`true`&&(console.error(`WB_ENV resolves to "${process.env.WB_ENV}" although the "${_}" environment was selected. Fix the WB_ENV defined in the env sources, or set WB_SKIP_ENV_CHECK=1 to skip this check.`),process.exit(1))}const tr=`prisma/mount`,nr=`litestream.yml`,rr=`/etc/litestream.yml`,ir=[{schemaPath:t.join(`prisma`,`schema.prisma`),dbPath:`prisma`},{schemaPath:t.join(`prisma`,`schema`),dbPath:t.join(`prisma`,`schema`)},{schemaPath:t.join(`db`,`schema.prisma`),dbPath:`db`}];var ar=class{cleanUpLitestream(e){let t=tr;return`${lr(`${t}/prod.sqlite3`)}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=``){return`PRISMA migrate deploy ${t}`}generate(e,t=``){return[`PRISMA generate`,t].filter(Boolean).join(` `)}deployForce(e){let t=tr,n=cr(`${t}/prod.sqlite3`);return`${n}; PRISMA migrate reset --force --skip-seed && ${n}
|
|
31
|
+
&& litestream restore ${sr(e)} -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e,t){return`litestream ltx ${sr(e,t)} prisma/mount/prod.sqlite3`}migrate(e,t=``){return`PRISMA migrate deploy ${t} && ${this.generate(e)} && ${this.seed(e)}`}migrateDev(e,t=``){return`PRISMA migrate dev ${t}`}reset(e,t=``){let n=[],r=ur(e);r&&n.push(r);let i=[`PRISMA migrate reset --force`,t].filter(Boolean).join(` `);return n.push(i),n.filter(Boolean).join(` && `)}restore(e,t,n){return`rm -Rf ${t}*; litestream restore ${sr(e,n)} -o ${t} prisma/mount/prod.sqlite3`}seed(e,t){return t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?`YARN prisma db seed`:`if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi`}studio(e,n,r=``){let i=``;if(n)try{new URL(n),i=`DATABASE_URL=${n} `}catch{i=`DATABASE_URL=${mt}${t.resolve(n)} `}else if(e.env.DATABASE_URL?.startsWith(`file:`)){let n=or(e);n&&(i=`DATABASE_URL=${mt}${t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5))} `)}return`${i}PRISMA studio ${r}`}};function or(n){return ir.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}function sr(n,r){if(r)return`-config "${r}"`;let i=t.join(n.dirPath,nr);return e.existsSync(i)?`-config ./${nr}`:e.existsSync(rr)?`-config ${rr}`:`-config ./${nr}`}function cr(e){return`rm -Rf "${e}"*`}function lr(e){return`if [ -f "${e}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${mt}${e}"; fi && rm -f "${e}".* "${e}"-*`}function ur(e){let n=gt(e);if(!n)return;let r=or(e),i=t.isAbsolute(n)?n:t.resolve(e.dirPath,r??`.`,n);return`rm -f "${i}" "${i}-wal" "${i}-shm"`}const dr=new ar,fr={command:`gen-code`,describe:`Generate code for the current project`,builder:{},async handler(e){let t=await G(e);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=t.descendants.map(e=>({project:e,scripts:pr(e)})).filter(({scripts:e})=>e.length>0);if(n.length===0){console.info(p.green(`No code generation needed.`));return}for(let{project:t,scripts:r}of n){console.info(`Running "gen-code" for ${t.name} ...`);for(let n of r)await K(n,t,e)}}};function pr(e){let t=[],n=mr(e);n&&t.push(n);let r=gr(e);r&&t.push(r);let i=_r(e);i&&t.push(i);let a=vr(e);a&&t.push(a);let o=hr(e);return o&&t.push(o),t}function mr(e){if(e.generatesWorkerTypes)return`YARN wrangler types`}function hr(n){if(n.packageJson.scripts?.[`gen-i18n-ts`])return n.hasSourceCode?`YARN run gen-i18n-ts`:void 0;if(n.hasOwnDependency(`gen-i18n-ts`)&&n.hasSourceCode&&e.existsSync(t.join(n.dirPath,`i18n`)))return`YARN gen-i18n-ts -i i18n -o src/__generated__/i18n.ts -d ja-JP`}function gr(e){if(e.hasPrisma&&br(e))return dr.generate(e)}function _r(e){if(e.hasOwnDependency(`@chakra-ui/cli`)&&yr(e,`src/theme.ts`))return`YARN chakra typegen src/theme.ts --strict`}function vr(e){if(!e.hasDrizzle)return;let t=Sn(e);if(t)return`${pn(e,`YARN drizzle-kit check --config ${t.fileName}`)} || true`}function yr(n,r){return e.existsSync(t.join(n.dirPath,r))}function br(e){return[`prisma/schema.prisma`,`prisma/schema`,`db/schema.prisma`].some(t=>yr(e,t))}const xr={command:`kill-port-if-non-ci`,describe:`Kill the port specified by PORT environment variable if non-CI.`,builder:{},async handler(e){await Sr(e)}};async function Sr(e){let t=W(e);if(t||(console.error(p.red(`No project found.`)),process.exit(1)),Je(t.env.CI)){console.info(`Skip killing port due to CI: ${t.env.CI}`);return}let n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(p.red(`PORT environment variable is invalid: ${n}`)),process.exit(1)),console.info(`Killing the port: ${r}`);try{await y(r)}catch{}}function Cr(e,t){if(!wr(e,t))return;let n=Tr(t);n&&(process.stdout.write(n),process.stdout.write(`
|
|
32
|
+
`))}function wr(e,t){return e!==0||Er(t)}function Tr(e){return e.trim()}function Er(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,``))}const Dr={fix:{description:`Fix the linting errors`,type:`boolean`},format:{description:`Format the code`,type:`boolean`},quiet:{description:`Report errors only`,type:`boolean`},silent:{description:`Print only failed or warning command output`,type:`boolean`}},Or=new Set([`astro`,`cjs`,`cts`,`js`,`jsx`,`mjs`,`mts`,`svelte`,`ts`,`tsx`,`vue`]),kr=new Set([`py`]),Ar=new Set([`dart`]),jr=new Set([`rs`]),Mr=new Set([...Or,`css`,`gql`,`graphql`,`hbs`,`htm`,`html`,`json`,`json5`,`jsonc`,`less`,`md`,`mdx`,`scss`,`toml`,`yaml`,`yml`]),Nr=new Set([`cjs`,`css`,`cts`,`htm`,`html`,`java`,`js`,`json`,`json5`,`jsonc`,`jsx`,`md`,`mjs`,`mts`,`scss`,`ts`,`tsx`,`vue`,`yaml`,`yml`]),Pr=new Set([...Nr].filter(e=>!Mr.has(e))),Fr=`!**/test{-,/}fixtures/**`,Ir={command:`lint [files...]`,describe:`Lint code`,builder:Dr,async handler(e){let t=await Lr(e);t&&process.exit(t)}};async function Lr(e){if(process.platform===`win32`)return console.error(p.red(`This command is not supported on Windows.`)),1;let n=await G(e,!1);if(!n)return console.error(p.red(`No project found.`)),1;let r=$r(e),i=new Map,a=new Map,o=new Map,s=new Map,c=new Set,l=[],u=[],d=!1,f,m;if(r.length>0){let h=await Promise.all(r.map(async e=>{let n=t.resolve(e);return{fileKind:await ei(n),filePath:n}}));for(let{fileKind:r,filePath:f}of h){if(f.endsWith(`/test/fixtures`)||f.includes(`/test/fixtures/`)||f.endsWith(`/test-fixtures`)||f.includes(`/test-fixtures/`))continue;let m=t.extname(f).slice(1);if(f.endsWith(`/package.json`)){u.push(f);continue}u.push(...ii(n.descendants,f,r));for(let{lintPath:t,project:u}of ai(n.descendants,f,r)){if(u.hasPoetryLock&&(r===`directory`||kr.has(m))){let e=o.get(u)??[];if(e.push(t),o.set(u,e),r!==`directory`)continue}if(u.hasPubspecYaml&&(r===`directory`||Ar.has(m))){let e=s.get(u)??[];if(e.push(t),s.set(u,e),r!==`directory`)continue}if(!(u.hasCargoToml&&(r===`directory`||jr.has(m))&&(c.add(u),r!==`directory`)))if(r===`directory`||si(u,m)){let n=i.get(u)??[];if(n.push(t),i.set(u,n),e.format)if(r===`directory`&&u.hasOxfmt){let e=a.get(u)??[];e.push(t),a.set(u,e),l.push(ri(t),Fr)}else for(let e of ni(u,t,r,m))if(u.hasOxfmt){let t=a.get(u)??[];t.push(e),a.set(u,t)}else l.push(e)}else if(e.format&&(Nr.has(m)||Mr.has(m)))if(u.hasOxfmt&&Mr.has(m)){let e=a.get(u)??[];e.push(t),a.set(u,e)}else Nr.has(m)&&l.push(t);else oi(m)&&!u.preferredLinter&&(console.error(p.red(`No linter found for ${u.name}. Install Oxlint.`)),d=!0)}}f=[...new Set(l)],m=[...new Set(u)]}else f=Zr(n.self.dirPath,n.descendants),m=n.descendants.map(e=>e.packageJsonPath);let h=[],g=[],_={exitIfFailed:!1,preserveColor:!e.printAllOutput},v=!!e.format,y=!e.format||e.fix;if(r.length>0){if(y)for(let[t,n]of i){let r=Wr(t,e,n);r&&g.push({command:r,project:t})}for(let[t,n]of o)y&&g.push({command:qr(e,n),project:t}),v&&h.push({command:Kr(n),project:t});for(let[e,t]of s)y&&g.push({command:Xr(t),project:e}),v&&h.push({command:Yr(t),project:e});if(v){for(let e of c)h.push({command:Jr(),project:e});for(let[e,t]of a)h.push({command:Gr(t),project:e})}}else for(let t of n.descendants){if(y){if(!t.packageJson.workspaces||t.hasSourceCode){let n=Wr(t,e);n&&g.push({command:n,project:t})}t.hasPoetryLock&&g.push({command:qr(e),project:t}),t.hasPubspecYaml&&g.push({command:Xr(),project:t})}v&&(t.hasOxfmt&&h.push({command:Gr(),project:t}),t.hasPoetryLock&&h.push({command:Kr(),project:t}),t.hasPubspecYaml&&h.push({command:Yr(),project:t}),t.hasCargoToml&&h.push({command:Jr(),project:t}))}let b=[];if(v){let t=await Rr(h,e,_);if(Br(t,e),b.push(...t.map(e=>e.exitCode)),b.some(e=>e!==0))return 1}if(d)return 1;if(v){if(f.length>0&&n.self.hasPrettier){let t=await zr(V([`YARN`,`prettier`,`--cache`,`--no-error-on-unmatched-pattern`,`--write`,`--`,...f]),n.self,e,_);Br([t],e),b.push(t.exitCode)}if(m.length>0){let t=await zr(V([`YARN`,`sort-package-json`,`--`,...m]),n.self,e,_);Br([t],e),b.push(t.exitCode)}if(b.some(e=>e!==0))return 1}if(y){let t=await Rr(g,e,_);Br(t,e),b.push(...t.map(e=>e.exitCode))}return+!!b.some(e=>e!==0)}function Rr(e,t,n){return Promise.all(e.map(({command:e,project:r})=>zr(e,r,t,n)))}function zr(e,t,n,r){if(n.silent){let i=Ut(e,t);return Ht(e,t,n,r).then(e=>({...e,command:i.printable,cwd:t.dirPath}))}return q(e,t,n,r).then(e=>({exitCode:e}))}function Br(e,t){let n=t.silent&&!t.printAllOutput?e.filter(e=>`output`in e&&wr(e.exitCode,e.output)):e;if(n.length!==0)for(let e of n)`output`in e&&(t.printAllOutput?Vr(e):(t.silent&&Hr(e.command,e.cwd),Cr(e.exitCode,e.output)))}function Vr(e){if(Hr(e.command,e.cwd),e.exitCode===0&&Ur(e.command)){console.info(p.green(`Succeeded.`));return}let t=e.output.trim();t&&(process.stdout.write(t),process.stdout.write(`
|
|
33
|
+
`))}function Hr(e,t){console.info(`
|
|
34
|
+
`+p.cyan(p.bold(`Command:`),e)+p.gray(` at ${t}`))}function Ur(e){return e.includes(` oxfmt `)||e.includes(` sort-package-json `)}function Wr(e,t,n){if(e.preferredLinter===`oxlint`)return V([`YARN`,`oxlint`,`--no-error-on-unmatched-pattern`,...e.hasTypeAwareOxlint?[`--type-aware`,`--type-check`]:[],...t.quiet?[`--quiet`]:[],...t.fix?[`--fix`]:[],...n??[`.`]])}function Gr(e){return V([`YARN`,`oxfmt`,`--write`,`--no-error-on-unmatched-pattern`,...e??[`.`],`!**/package.json`])}function Kr(e){let t=e&&e.length>0?e:[`.`];return[V([`poetry`,`run`,`isort`,`--profile`,`black`,`--filter-files`,...t]),V([`poetry`,`run`,`black`,...t])].join(` && `)}function qr(e,t){let n=t&&t.length>0?t:[`.`];return V([`poetry`,`run`,`flake8`,...e.quiet?[`-q`]:[],...n])}function Jr(){return V([`cargo`,`fmt`,`--all`])}function Yr(e){return V([`dart`,`format`,...e&&e.length>0?e:[`.`]])}function Xr(e){return V([`dart`,`analyze`,...e&&e.length>0?e:[`.`]])}function Zr(e,n){let r=new Set([`**/{.*/,}*.{${[...Pr].join(`,`)}}`,Fr]);for(let i of n){if(!ci(i))continue;let n=t.join(i.dirPath,`**/{.*/,}*.{`+[...Nr].join(`,`)+`}`);r.add(t.relative(e,n)||n)}return[...r]}function Qr(e,t){let n;for(let r of e)(t===r.dirPath||t.startsWith(`${r.dirPath}/`))&&(!n||r.dirPath.length>n.dirPath.length)&&(n=r);return n}function $r(e){let t=new Set;for(let n of[...e.files??[],...e._.slice(1),...e[`--`]??[]])t.add(String(n));return[...t]}async function ei(e){try{if((await b.stat(e)).isDirectory())return`directory`}catch{}return`other`}function ti(e,t){return e.hasOxfmt?Mr.has(t):ci(e)?!0:Pr.has(t)}function ni(e,t,n,r){return n===`directory`&&e.hasOxfmt?[t]:n===`directory`&&ci(e)?[t,Fr]:ti(e,r)?[t]:[]}function ri(e){return t.join(e,`**/{.*/,}*.{${[...Pr].join(`,`)}}`)}function ii(e,n,r){return r===`directory`?e.filter(e=>e.packageJsonPath===t.join(n,`package.json`)||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath):[]}function ai(e,t,n){if(n===`directory`){let n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}let r=Qr(e,t);return r?[{lintPath:t,project:r}]:[]}function oi(e){return Or.has(e)||kr.has(e)||Ar.has(e)}function si(e,t){return e.preferredLinter===`oxlint`&&Or.has(t)}function ci(e){return!e.hasOxfmt&&e.preferredLinter===`oxlint`}async function li(e,t){let n=Number(e);if(!n)throw Error(`The given port (${n}) is invalid.`);return await pi(n,t),n}async function ui(e){for(let t of[`127.0.0.1`,`::`])if(!await di(t,e))return!1;return!0}async function di(e,t){return new Promise(n=>{let r=w();r.once(`error`,e=>{if(e.code===`EADDRINUSE`){n(!1);return}if(e.code===`EAFNOSUPPORT`){n(!0);return}n(!1)}),r.once(`listening`,()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const fi=new Set;async function pi(e,t){await ui(e)||await mi(e,t);let n=async()=>{fi.has(e)||(fi.add(e),await mi(e,t))};for(let e of[`beforeExit`,`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,n)}async function mi(e,t){await vi(e,t),hi(e)}function hi(e){for(let t of gi(e))try{process.kill(t,`SIGKILL`)}catch{}}function gi(e){try{return i(`lsof`,[`-ti`,`tcp:${e}`,`-sTCP:LISTEN`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],timeout:2e3}).split(/\s+/).map(e=>Number(e.trim())).filter(e=>Number.isInteger(e)&&e>0&&e!==process.pid)}catch{return[]}}async function _i(e){for(let t=0;t<10;t++){await C(100);try{process.kill(e,0)}catch(e){if(e.code===`ESRCH`)return}}try{process.kill(e,`SIGKILL`)}catch{}}async function vi(e,t){await yi([`--filter`,`publish=${e}`],t)}async function yi(e,t){try{let n=await bi(e,t);if(n.length===0)return;await L(`docker`,[`rm`,`-f`,...n],{cwd:t.dirPath,env:t.env})}catch{}}async function bi(e,t){let{stdout:n}=await L(`docker`,[`ps`,`-q`,...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}function xi(e,t){let n=()=>{if(fi.has(e))return;fi.add(e),Wt(e,t);let{status:n}=o(e,{cwd:t.dirPath,shell:!0,stdio:`inherit`});Gt(e,n,{})};for(let e of[`beforeExit`,`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,n)}const Si={"delay-ms":{default:5e3,describe:`Delay before starting the maintenance page server.`,type:`number`}},Ci=2147483647,wi={command:`maintenance <action>`,describe:`Start or stop a lightweight maintenance page server. Example: wb maintenance start`,builder:e=>e.positional(`action`,{choices:[`start`,`stop`],describe:`Maintenance server action`,type:`string`}).options(Si),async handler(e){let t=W(e);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=e.action;if(t.env.WB_ENV===`test`){console.info(`Skip maintenance ${n} because WB_ENV is test.`);return}let r=Ti(t.env.PORT);if(n===`start`){await Ei(t,r,e.delayMs);return}if(n===`stop`){await Ai(t,r);return}throw Error(`Unknown maintenance action: ${n}`)}};function Ti(e){let t=Number(e);return x.ok(Number.isInteger(t)&&t>0,`PORT environment variable is invalid: ${e}`),t}async function Ei(e,t,n){x.ok(Number.isFinite(n)&&n>=0&&n<=Ci,`delay-ms must be between 0 and ${Ci}: ${n}`);let r=await Fi(e,t),i=new AbortController,a=async()=>{await Li(r,process.pid)},o=()=>{i.abort()},s=()=>{process.off(`SIGINT`,o),process.off(`SIGTERM`,o),process.off(`SIGQUIT`,o)};process.once(`SIGINT`,o),process.once(`SIGTERM`,o),process.once(`SIGQUIT`,o);try{await C(n,void 0,{signal:i.signal}),s();let e=await Di(t);if(!e)return;console.info(`Started maintenance server on port ${t}.`),await Ni(e)}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;throw e}finally{s(),await a()}}async function Di(e){for(let t=1;t<=5;t++){let n=ji();try{return await Mi(n,e,ki),n}catch(r){await Pi(n);let i=r;if(i.code===`EADDRINUSE`&&t<5){await C(100);continue}if(i.code===`EADDRINUSE`){console.info(`Skip maintenance server because port ${e} is already in use.`);return}Oi(e,i)}}throw Error(`Unreachable maintenance server startup state.`)}function Oi(e,t){t.code===`EADDRINUSE`?console.error(p.red(`Port ${e} is already in use.`)):console.error(p.red(`Maintenance server error: ${t.message}`)),process.exit(1)}function ki(e){console.error(p.red(`Maintenance server error: ${e.message}`)),process.exit(1)}async function Ai(e,t){await Ii(e,t),await mi(t,e),console.info(`Stopped maintenance server on port ${t}.`)}function ji(){return S.createServer((e,t)=>{t.writeHead(503,{"cache-control":`no-store`,"content-type":`text/html; charset=utf-8`}),t.end(`<!doctype html>
|
|
35
35
|
<html lang="ja">
|
|
36
36
|
<head>
|
|
37
37
|
<meta charset="utf-8">
|
|
@@ -73,8 +73,8 @@ const R=[...`0123456789abcdef`],je=[6,1536,393216,100663296],z=[0,8,16,24],Me=[1
|
|
|
73
73
|
<p>皆様にはご不便をおかけしますが、メンテナンス終了までしばらくお待ちください。</p>
|
|
74
74
|
</main>
|
|
75
75
|
</body>
|
|
76
|
-
</html>`)})}async function
|
|
77
|
-
`)){let e=n.trim();if(!e||e.startsWith(`#`)||e.startsWith(`;`))continue;let r=e.indexOf(`=`);if(r<=0)continue;let i=e.slice(0,r).trim();t[i]=e.slice(r+1).trim().replaceAll(/\$\{([^}]+)\}/g,(e,t)=>process.env[t]??``)}return t}async function Ji(n,i,a,o){let s=await Yi(n,i,a),c=(await Zi(n,`${n.registryUrl}/${ea(i)}/${s}`)).dist?.tarball;if(!c)throw Error(`No tarball URL for ${i}@${s} in ${n.registryUrl}.`);let l=await Qi(n,c),u=t.join(await e.promises.mkdtemp(t.join(h.tmpdir(),`wb-private-package-`)),`package.tgz`);try{if(await e.promises.writeFile(u,Buffer.from(await l.arrayBuffer())),await e.promises.rm(o,{force:!0,recursive:!0}),await e.promises.mkdir(o,{recursive:!0}),r.spawnSync(`tar`,[`-xzf`,u,`-C`,o,`--strip-components=1`],{stdio:`inherit`}).status!==0)throw Error(`Failed to extract ${i}@${s} (${c}).`)}finally{await e.promises.rm(t.dirname(u),{force:!0,recursive:!0})}}async function Yi(e,t,n){if(na(n))return n;let r=Xi(n,await Zi(e,`${e.registryUrl}/${ea(t)}`));if(!r)throw Error(`Cannot resolve ${t}@${n} against ${e.registryUrl}; use an exact version, a semver range, or a dist-tag.`);return r}function Xi(e,t){return e!==`*`&&E.validRange(e)?E.maxSatisfying(Object.keys(t.versions??{}),e)??void 0:t[`dist-tags`]?.[e===`*`?`latest`:e]}async function Zi(e,t){return await(await Qi(e,t)).json()}async function Qi(e,t){let n=!!e.authToken&&$i(t,e.registryUrl),r=await fetch(t,{headers:n?{authorization:`Bearer ${e.authToken}`}:{}});if(!r.ok)throw Error(`Failed to fetch ${t}: ${r.status} ${r.statusText}`);return r}function $i(e,t){try{return new URL(e).origin===new URL(t).origin}catch{return!1}}function ea(e){return e.replace(`/`,`%2F`)}const ta=/^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/;function na(e){return!!e&&ta.test(e)}function ra(e,t){return e===void 0||t===void 0||e===`*`||t===`*`?!1:na(e)&&na(t)?e===t:!E.validRange(e)||!E.validRange(t)?!1:E.subset(e,t)}function ia(e,t){return na(e)?e===t:!E.validRange(e)||E.satisfies(t,e)}function aa(e,t){return e===`*`?!1:na(e)?e===t:!!E.validRange(e)&&E.satisfies(t,e)}function*oa(e,t){for(let n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const sa=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],ca={command:`setup-private-packages`,describe:"Materialize private dependencies for Docker builds: copy git dependencies, reuse installed @willbooster-private/* registry packages whose exact-version or semver-range specifier the installed copy satisfies, and download the rest (auth via .npmrc / ~/.npmrc locally, or VERDACCIO_TOKEN on CI; dist-tag specifiers such as `latest` always download). The Dockerfile must COPY the generated directories (e.g. `COPY @willbooster/ @willbooster/` and `COPY @willbooster-private/ @willbooster-private/`) so the in-image install resolves the rewritten file: paths.",builder:{"out-dir":{description:`Directory to copy private packages into`,type:`string`,default:`@willbooster`}},async handler(e){let t=yt(e,!1);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=await G(e,!1,t.root.dirPath);n||(console.error(p.red(`No project found.`)),process.exit(1));try{await ua(n.root.dirPath,la(n),{outDir:e.outDir,dryRun:!!e.dryRun})}catch(e){console.error(p.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function la(e){let t=new Map;for(let n of[e.root,...e.descendants])t.has(n.dirPath)||t.set(n.dirPath,n.packageJson);return[...t.values()]}async function ua(n,r,i={}){let{outDir:a=`@willbooster`,dryRun:o=!1}=i,s=ga(n),c=(e,n)=>{let r=t.resolve(s,e),i=ga(r);if(i!==r)throw Error(`${n} must not contain symlinks (${r} resolves to ${i}).`);return r},l=c(a,`--out-dir`);ya(s,l);let u=c(q,`The ${q} output directory`);if(_a(l,u))throw Error(`--out-dir must not overlap the ${q} registry output directory.`);let d=c(t.join(`.tmp`,`wb-private-registry-staging`),`The registry staging directory`),f=c(t.join(`.tmp`,`wb-private-git-staging`),`The git staging directory`);if(_a(l,ga(t.join(s,`node_modules`))))throw Error(`--out-dir must not overlap node_modules.`);for(let[e,t]of[[`registry`,d],[`git`,f]])if(_a(l,t))throw Error(`--out-dir must not overlap the ${e} staging directory (${t}).`);t.relative(s,l)!==`@willbooster`&&console.warn(p.yellow(`Note: wb optimizeForDockerBuild rewrites git dependencies to <root>/@willbooster; a custom --out-dir requires a matching Dockerfile layout.`));let m=await da(s,r,l,u);if(o){Ma(l,m);return}let h=[...m.values()].filter(e=>e.kind===`registry`&&!e.sourceDirPath),g=h.length>0?Ki(s):void 0;if(h.length>0&&!g)throw Error(`Cannot download ${h.map(e=>e.name).join(`, `)}: no registry configured for the ${q} scope; add "${q}:registry=..." to .npmrc or ~/.npmrc. Only installed copies satisfying an exact version or semver range are reused without registry access; dist-tag specifiers (e.g. \`latest\`) always require it.`);let _=[...m.values()].filter(e=>e.kind===`git`),v=[...m.values()].filter(e=>e.kind===`registry`);await e.promises.rm(f,{recursive:!0,force:!0}),await e.promises.mkdir(f,{recursive:!0});try{for(let e of _)await pa(s,e,t.join(f,t.relative(l,e.targetDirPath)));await e.promises.rm(l,{recursive:!0,force:!0}),await e.promises.rename(f,l)}catch(t){throw await e.promises.rm(f,{recursive:!0,force:!0}),t}if(v.length>0){let n=e=>t.join(d,t.relative(u,e));await e.promises.rm(d,{recursive:!0,force:!0}),await e.promises.mkdir(d,{recursive:!0});try{for(let e of v)e.sourceDirPath?await pa(s,e,n(e.targetDirPath)):(await Ji(g,e.name,e.versionSpecifier??`latest`,n(e.targetDirPath)),e.resolvedVersion=Ca(n(e.targetDirPath),e.name),console.info(`Downloaded ${e.name} to ${t.relative(s,e.targetDirPath)}`)),e.sourceDirPath||await fa(s,g,e,m,l,u,n);await e.promises.rm(u,{recursive:!0,force:!0}),await e.promises.rename(d,u)}catch(t){throw await e.promises.rm(d,{recursive:!0,force:!0}),t}}else await e.promises.rm(u,{recursive:!0,force:!0}),await e.promises.mkdir(u,{recursive:!0});await Da(s,m),console.info(`Ensure the Dockerfile COPYs ${t.relative(s,l)}/ and ${q}/ into the image before installing dependencies.`)}async function da(e,t,n,r){let i=new Map,a=[],o=new Map;for(let e of t)for(let t of wa(e,n,r)){let n=o.get(t.name);if(!n){o.set(t.name,t),a.push(t);continue}let r=Ea(n,t);r===void 0?ha(n,t,e.name??`a workspace manifest`):n.versionSpecifier=r.versionSpecifier}for(let t=0;t<a.length;t++){let s=a[t];if(s&&!i.has(s.name)){if(s.kind===`git`)s.sourceDirPath=ba(e,s.name);else{let t=xa(e,s);s.sourceDirPath=t?.dirPath,s.resolvedVersion=t?.version}if(i.set(s.name,s),s.sourceDirPath)for(let e of await ka(s.sourceDirPath)){let t=await Aa(e);for(let e of wa(t,n,r)){let t=o.get(e.name);if(!t){o.set(e.name,e),a.push(e);continue}if(i.has(e.name))ha(t,e,s.name);else{let n=Ea(t,e);n===void 0?ha(t,e,s.name):t.versionSpecifier=n.versionSpecifier}}}}}return i}async function fa(e,t,n,r,i,a,o){let s=n.kind===`registry`?o(n.targetDirPath):n.targetDirPath;for(let c of await ka(s))for(let s of wa(await Aa(c),i,a)){let c=r.get(s.name);if(c){if(c.kind===`registry`&&!c.sourceDirPath&&c.resolvedVersion===void 0){let e=Ea(c,s);e===void 0?ha(c,s,n.name):c.versionSpecifier=e.versionSpecifier}else ha(c,s,n.name);continue}if(s.kind===`git`)s.sourceDirPath=ba(e,s.name),await pa(e,s,s.targetDirPath);else{let n=xa(e,s);s.sourceDirPath=n?.dirPath,s.resolvedVersion=n?.version,s.sourceDirPath?await pa(e,s,o(s.targetDirPath)):(await Ji(t,s.name,s.versionSpecifier??`latest`,o(s.targetDirPath)),s.resolvedVersion=Ca(o(s.targetDirPath),s.name),console.info(`Downloaded ${s.name} (nested dependency) to ${s.targetDirPath}`))}r.set(s.name,s),await fa(e,t,s,r,i,a,o)}}async function pa(n,r,i){let a=r.kind===`registry`?ma(r.sourceDirPath):[];await e.promises.cp(r.sourceDirPath,i,{recursive:!0,force:!0,dereference:!0,filter:e=>{let n=t.relative(r.sourceDirPath,e).split(t.sep);if(n.includes(`.git`))return!1;let i=n.indexOf(`node_modules`);if(i===-1||a===!0)return!0;if(a.length===0)return!1;let[o,s]=n.slice(i+1);if(o===void 0)return!0;if(o.startsWith(`@`)&&s===void 0)return a.some(e=>e.startsWith(`${o}/`));let c=o.startsWith(`@`)?`${o}/${s}`:o;return a.includes(c)}}),console.info(`Copied ${r.name} to ${t.relative(n,r.targetDirPath)}`)}function ma(n){try{let r=JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`)),i=r.bundleDependencies??r.bundledDependencies;return i===!0?!0:Array.isArray(i)?i.filter(e=>typeof e==`string`):[]}catch{return[]}}function ha(e,t,n){if(!(e.kind===t.kind&&(e.versionSpecifier===t.versionSpecifier||ra(e.versionSpecifier,t.versionSpecifier)||e.resolvedVersion!==void 0&&t.versionSpecifier!==void 0&&aa(t.versionSpecifier,e.resolvedVersion))))throw Error(`Conflicting requirements for ${e.name}: ${e.versionSpecifier??e.kind} is already selected, but ${n} requires ${t.versionSpecifier??t.kind}. Only a single version per private package is supported.`)}function ga(n){let r=t.resolve(n),i=[];for(;!e.existsSync(r);){let e=t.dirname(r);if(e===r)break;i.unshift(t.basename(r)),r=e}try{return t.join(e.realpathSync(r),...i)}catch{return t.resolve(n)}}function _a(e,t){return va(e,t)||va(t,e)}function va(e,n){let r=t.relative(e,n);return r===``||!r.startsWith(`..`)&&!t.isAbsolute(r)}function ya(e,n){let r=t.relative(e,n);if(!(r&&!r.startsWith(`..`)&&!t.isAbsolute(r)))throw Error(`Output directory must be a subdirectory of the project root: ${n}`)}function ba(n,r){let i=ja(r),a=t.join(n,`node_modules`,`@willbooster`,i);if(e.existsSync(t.join(a,`package.json`)))return e.realpathSync(a);let o=t.join(n,`node_modules`,`.bun`),s=new Set;try{for(let n of e.readdirSync(o,{withFileTypes:!0})){let r=t.join(o,n.name,`node_modules`,`@willbooster`,i);e.existsSync(t.join(r,`package.json`))&&s.add(e.realpathSync(r))}}catch{}if(s.size===1)return[...s][0];throw s.size>1?Error(`Multiple installed resolutions found for ${r}: ${[...s].join(`, `)}. Deduplicate the dependency so a single resolution remains.`):Error(`Private package is not installed: ${r} (${a})`)}function xa(n,r){let i=r.versionSpecifier??`latest`,a=t.join(`node_modules`,...r.name.split(`/`)),o=(t,n)=>{let a=Ca(n,r.name);a&&aa(i,a)&&t.set(e.realpathSync(n),a)},s=new Map;if(o(s,t.join(n,a)),s.size===1)return Sa(s);let c=new Map;try{for(let r of e.readdirSync(t.join(n,`node_modules`,`.bun`),{withFileTypes:!0}))o(c,t.join(n,`node_modules`,`.bun`,r.name,a))}catch{}return Sa(c)}function Sa(e){let[t]=e;return e.size===1&&t?{dirPath:t[0],version:t[1]}:void 0}function Ca(n,r){try{let i=JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`));return i.name===r&&typeof i.version==`string`?i.version:void 0}catch{return}}function wa(e,n,r){let i=new Map;for(let a of sa){let o=e[a];if(o)for(let[e,a]of Object.entries(o)){let o=Wi(a);if(!o&&!Gi(e,a))continue;if(o&&!e.startsWith(`@willbooster/`))throw Error(`Private git dependency must be an @willbooster package: ${e}`);let s=ja(e);if(!/^[\w.-]+$/.test(s)||s.startsWith(`.`))throw Error(`Invalid private package name: ${e}`);let c={name:e,kind:o?`git`:`registry`,sourceDirPath:void 0,resolvedVersion:void 0,targetDirPath:t.join(o?n:r,s),versionSpecifier:a},l=i.get(e);i.set(e,l?Ta(l,c):c)}}return[...i.values()]}function Ta(e,t){let n=Ea(e,t);if(n)return n;throw Error(`Conflicting requirements for ${e.name} within one manifest: ${e.versionSpecifier??e.kind} vs ${t.versionSpecifier??t.kind}.`)}function Ea(e,t){if(e.kind===t.kind){if(e.versionSpecifier===t.versionSpecifier||ra(e.versionSpecifier,t.versionSpecifier))return e;if(ra(t.versionSpecifier,e.versionSpecifier))return t}}async function Da(n,r){for(let i of r.values())for(let a of await ka(i.targetDirPath)){let i=await Aa(a);Oa(a,i,r)&&(await e.promises.writeFile(a,`${JSON.stringify(i,void 0,2)}\n`,`utf8`),console.info(`Rewrote private dependencies in ${t.relative(n,a)}`))}}function Oa(e,n,r){let i=!1;for(let a of sa){let o=n[a];if(o)for(let[n,a]of Object.entries(o)){if(!Wi(a)&&!Gi(n,a))continue;let s=r.get(n);s&&(o[n]=`file:${t.relative(t.dirname(e),s.targetDirPath)}`,i=!0)}}return i}async function ka(n){if(!e.existsSync(n))return[];let r=[];for(let i of await e.promises.readdir(n,{withFileTypes:!0})){if(i.name===`node_modules`||i.name===`.git`)continue;let e=t.join(n,i.name);if(i.isDirectory()){r.push(...await ka(e));continue}i.isFile()&&i.name===`package.json`&&r.push(e)}return r}async function Aa(t){return JSON.parse(await e.promises.readFile(t,`utf8`))}function ja(e){return e.replace(/^@willbooster(?:-private)?\//,``)}function Ma(e,t){console.info(`[dry-run] Would recreate ${e}`);for(let e of t.values())console.info(e.sourceDirPath?`[dry-run] Would copy ${e.name}: ${e.sourceDirPath}`:e.kind===`git`?`[dry-run] Would copy ${e.name}: (installed under node_modules)`:`[dry-run] Would download ${e.name}@${e.versionSpecifier} to ${e.targetDirPath}`);console.info(`[dry-run] Would rewrite copied private dependencies to file:../<name>`)}const Na=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Pa=/\.(?:sqlite3?|db)(?:[-.](?:journal|shm|wal))?$/i,Fa=[`.cache`,`.mypy_cache`,`.next/cache`,`.parcel-cache`,`.pytest_cache`,`.ruff_cache`,`.tox`,`.turbo`,`.venv`,`.yarn/cache`,`.yarn/install-state.gz`,`__pycache__`,`coverage`,`node_modules/.cache`,`playwright-report`,`storybook-static`,`target`,`test-results`],Ia=[`**/*.pyc`,`**/*.tsbuildinfo`,`**/__pycache__`],La=[`prisma`,`db`,`drizzle`],Ra=[`/data`],za={command:`optimizeForDockerBuild`,describe:`Optimize configuration when building a Docker image`,builder:{outside:{description:`Whether the optimization is executed outside a docker container or not`,type:`boolean`,alias:`o`}},async handler(n){let i=await G(n);if(i||(console.error(p.red(`No project found.`)),process.exit(1)),n.outside){let e=la(await G(n,!1,i.root.dirPath)??i);if(e.some(Ba))try{await ua(i.root.dirPath,e,{dryRun:!!n.dryRun})}catch(e){console.warn(p.yellow(`Could not auto-materialize private packages (${e instanceof Error?e.message:String(e)}); run \`wb setup-private-packages\` if the Docker build needs them. Continuing.`))}}let a=[];for(let r of oa(`optimizeForDockerBuild`,i.descendants)){let i=r.packageJson;Va(r,i);let o=Ja(n,i);if(Xa(i,{removeWbPostinstall:!n.outside&&o.includes(`@willbooster/wb`)}),Za(i),n.dryRun)continue;let s=n.outside?t.join(r.dirPath,`dist`):r.dirPath;await e.promises.mkdir(s,{recursive:!0}),await e.promises.writeFile(t.join(s,`package.json`),JSON.stringify(i),`utf8`),n.outside&&await Ka(t.join(s,`bash`)),a.push(r)}!n.dryRun&&!n.outside&&(r.spawnSync(i.root.packageManagerCommand,[`install`],{stdio:`inherit`}),console.info(`Installed dependencies.`),await Qa(a))}};function Ba(e){return Na.some(t=>{let n=e[t];return n!==void 0&&Object.entries(n).some(([e,t])=>Wi(t)||Gi(e,t))})}function Va(e,t){return Ha(e.rootDirPath,e.dirPath,t)}function Ha(e,t,n){let r=[];for(let i of Na){let a=n[i]??{};for(let[n,o]of Object.entries(a))if(Wi(o))a[n]=Ua(e,t,`@willbooster`,n),r.push(`${i}.${n}`);else if(Gi(n,o)){let s=Ga(e,n);if(s===void 0){console.warn(p.yellow(`${n} is not materialized under ${q}/; run \`wb setup-private-packages\` so the Docker build does not need registry credentials.`));continue}ia(o,s)||(console.error(p.red(`Materialized ${n} is ${s} but package.json requires ${o}; rerun \`wb setup-private-packages\`.`)),process.exit(1)),a[n]=Ua(e,t,q,n),r.push(`${i}.${n}`)}}return console.info(`Rewrote private dependencies:`,r.join(`, `)||`none`),r}function Ua(e,n,r,i){let a=t.join(e,r,Wa(i)),o=t.relative(n,a);return o.startsWith(`.`)?o:`./${o}`}function Wa(e){return e.replace(/^@willbooster(?:-private)?\//,``)}function Ga(n,r){let i=t.join(n,q,Wa(r),`package.json`);try{return JSON.parse(e.readFileSync(i,`utf8`)).version}catch{return}}async function Ka(n){let r=qa();await e.promises.mkdir(n,{recursive:!0});for(let i of await e.promises.readdir(r,{withFileTypes:!0})){if(!i.isFile()||!i.name.endsWith(`.sh`))continue;let a=t.join(n,i.name);await e.promises.copyFile(t.join(r,i.name),a),await e.promises.chmod(a,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function qa(){let n=t.dirname(T(import.meta.url));for(;;){let r=t.join(n,`docker`,`bash`);if(e.existsSync(r))return r;let i=t.dirname(n);if(i===n)throw Error(`Docker shell scripts directory not found.`);n=i}}function Ja(e,t){if(e.outside)return Ya(t);let n=Object.keys(t.devDependencies??{});return delete t.devDependencies,console.info(`Removed all devDependencies.`),n}function Ya(e){let t=e.devDependencies??{},n=[`artillery`,`biome`,`concurrently`,`conventional-changelog-conventionalcommits`,`eslint`,`husky`,`imagemin`,`jest`,`kill-port`,`lint-staged`,`open-cli`,`oxfmt`,`oxlint`,`playwright`,`prettier`,`pinst`,`railway`,`semantic-release`,`sort-package-json`,`wait-on`,`vitest`],r=[];for(let e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes(`willbooster`)&&e.includes(`config`))&&(delete t[e],r.push(e));return console.info(`Removed devDependencies:`,r.join(`, `)||`none`),r}function Xa(e,t){let n=[`check`,`deploy`,`format`,`lint`,`start`,`test`],r=[`pinst `,`husky `],i=e.scripts??{},a=[];for(let[e,o]of Object.entries(i))(t.removeWbPostinstall&&e===`postinstall`&&o.trim()===`wb gen-code`||n.some(t=>e.startsWith(t))||r.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete i[e],a.push(e));console.info(`Removed scripts:`,a.join(`, `)||`none`)}function Za(e){delete e.private,delete e.publishConfig,delete e.prettier}async function Qa(e){for(let t of e)await $a(t),await no(t),yo(t)}async function $a(e){let t=[...await eo(e),...await to(e)];console.info(`Removed Docker build caches:`,t.join(`, `)||`none`)}async function eo(n){let r=[];for(let i of Fa){let a=t.join(n.dirPath,i);e.existsSync(a)&&(await e.promises.rm(a,{force:!0,recursive:!0}),r.push(i))}return r}async function to(n){let r=await m(Ia,{cwd:n.dirPath,dot:!0,followSymbolicLinks:!1,ignore:[`**/node_modules`,`**/node_modules/**`,`**/.yarn`,`**/.yarn/**`,`**/.git`,`**/.git/**`],onlyFiles:!1});return await Promise.all(r.map(r=>e.promises.rm(t.join(n.dirPath,r),{force:!0,recursive:!0}))),r}async function no(e){let t=(await Promise.all([ro(e),ao(e)])).flat();console.info(`Removed generated local data:`,t.join(`, `)||`none`)}async function ro(n){let r=io(n),i=[];for(let a of r){let r=t.join(n.dirPath,a);e.existsSync(r)&&(await e.promises.rm(r,{force:!0,recursive:!0}),i.push(a))}return i}function io(e){let n=La.map(e=>t.join(e,`mount`)),r=_t(e);if(!r)return n;let i=t.dirname(r);if(t.basename(i)!==`mount`||!mo(e,i))return n;let a=t.relative(e.dirPath,i);return a?[...new Set([...n,a])]:n}async function ao(e){return(await Promise.all([oo(e),co(e)])).flat()}async function oo(e){let t=await so(e);return(await Promise.all(t.map(t=>vo(e,t)))).flat()}async function so(e){let n=La.map(n=>t.join(e.dirPath,n)),r=await Promise.all(n.map(e=>_o(e)));return n.filter((e,t)=>r[t])}async function co(n){let r=lo(n),i=[];for(let a of r)for(let r of po(a))await go(r)&&(await e.promises.rm(r,{force:!0}),i.push(t.relative(n.dirPath,r)));return i}function lo(e){let n=gt(e),r=_t(e);if(!n||!r)return[];let i=t.isAbsolute(n)?[n]:[r,...La.map(r=>t.resolve(e.dirPath,r,n))];return[...new Set(i)].filter(t=>uo(e,t))}function uo(e,t){return mo(e,t)||fo(e,t)}function fo(e,n){return ho(e)?Ra.some(e=>{let r=t.relative(e,n);return r!==``&&r!==`..`&&!r.startsWith(`../`)}):!1}function po(e){return[e,`${e}-journal`,`${e}-shm`,`${e}-wal`,`${e}.journal`,`${e}.shm`,`${e}.wal`]}function mo(e,n){let r=t.relative(e.dirPath,n);return r===``||r!==`..`&&!r.startsWith(`..${t.sep}`)}function ho(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}async function go(t){try{return(await e.promises.stat(t)).isFile()}catch{return!1}}async function _o(t){try{return(await e.promises.stat(t)).isDirectory()}catch{return!1}}async function vo(n,r){let i=(await e.promises.readdir(r,{withFileTypes:!0})).filter(e=>e.isFile()&&Pa.test(e.name)).map(e=>e.name);await Promise.all(i.map(n=>e.promises.rm(t.join(r,n),{force:!0})));let a=t.relative(n.dirPath,r);return i.map(e=>t.join(a,e))}function yo(n){if(!ho(n))return;let i=t.join(n.dirPath,`bash`,`cleanup.sh`);if(e.existsSync(i)&&r.spawnSync(`bash`,[i,`--keep-scripts`],{cwd:n.dirPath,stdio:`inherit`}).status!==0)throw Error(`Failed to run ${t.relative(n.dirPath,i)}`)}const J={},bo={command:`prisma`,aliases:[`db`],describe:`Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init`,builder:e=>e.parserConfiguration({"populate--":!0}).command(xo).command(So).command(Co).command(wo).command(To).command(Do).command(Oo).command(Mo).command(No).command(Po).command(Fo).command(Io).command(Lo).demandCommand().strict(!1),handler(){}},xo={command:`cleanup-litestream`,describe:`Clean up temporal Litestream files`,builder:J,async handler(e){let t=await Y(e);for(let{orm:n,project:r}of Z(`db cleanup-litestream`,t))await K(X(n).cleanUpLitestream(r),r,e)}},So={command:`create-litestream-config`,describe:`Create Litestream configuration file`,builder:{...J,output:{description:`Output path of the Litestream configuration file.`,type:`string`,default:`/etc/litestream.yml`}},async handler(e){let t=await Y(e);if(t.length>1)throw Error(`Creating Litestream configuration for multiple projects at once is not supported because they would overwrite each other.`);for(let{orm:n,project:r}of Z(`db create-litestream-config`,t))zo(r,n,e.output)}},Co={command:`deploy`,describe:`Apply migration to DB without initializing it`,builder:J,async handler(e){let t=await Y(e),n=Ho(e);for(let{orm:r,project:i}of Z(`db deploy`,t))await K(Ro(r,i,X(r).deploy(i,n)),i,e)}},wo={command:`deploy-force`,describe:`Force to apply migration to DB utilizing Litestream's backup without initializing it`,builder:J,async handler(e){let t=await Y(e);for(let{orm:n,project:r}of Z(`db deploy-force`,t))await K(X(n).deployForce(r),r,e)}},To={command:`generate`,describe:`Generate ORM client code`,builder:J,async handler(e){let t=await Y(e),n=Ho(e);for(let{orm:r,project:i}of Z(`db generate`,t))await K(X(r).generate(i,n),i,e)}},Eo={...J,config:{description:`Path of the Litestream configuration file.`,type:`string`}},Do={command:`list-backups`,describe:`List Litestream backups`,builder:Eo,async handler(e){let t=await Y(e);for(let{orm:n,project:r}of Z(`db list-backups`,t))await K(X(n).listBackups(r,e.config),r,e)}},Oo={command:`migrate`,describe:`Apply migration to DB with initializing it`,builder:{...J,"check-idempotency":{description:`Run the migration command twice to confirm it is idempotent.`,type:`boolean`}},async handler(e){let t=await Y(e),n=Ho(e,[`check-idempotency`]);for(let{orm:r,project:i}of Z(`db migrate`,t)){let t=X(r);await K(Ro(r,i,t.migrate(i,n)),i,e),ko(i,e.checkIdempotency)&&(jo(i)?console.info(p.yellow(`Skipping idempotency check for ${i.name} in production environment.`)):await K(Ro(r,i,t.deploy(i,n)),i,e))}}};function ko(e,t){return t??Ao(e)}function Ao(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}function jo(e){return vt(e,`production`)}const Mo={command:`migrate-dev`,describe:`Create a migration file`,builder:J,async handler(e){let t=await Y(e),n=Ho(e);for(let{orm:r,project:i}of Z(`db migrate-dev`,t))await K(X(r).migrateDev(i,n),i,e)}},No={command:`reset`,describe:`Reset DB`,builder:J,async handler(e){let t=await Y(e),n=Ho(e);for(let{orm:r,project:i}of Z(`db reset`,t))await K(Ro(r,i,X(r).reset(i,n)),i,e);if(process.env.WB_ENV!==`test`){process.env.WB_ENV=`test`;for(let{orm:t,project:r}of Z(`WB_ENV=test db reset`,await Y(e)))await K(Ro(t,r,X(t).reset(r,n)),r,e)}}},Po={command:`restore`,describe:`Restore DB from Litestream's backup`,builder:{...Eo,output:{description:`Output path of the restored database. Defaults to "<db|drizzle|prisma>/restored.sqlite3".`,type:`string`}},async handler(e){let t=await Y(e);for(let{orm:n,project:r}of Z(`db restore`,t)){let t=e.output??Bo(r,n);await K(X(n).restore(r,t,e.config),r,e)}}},Fo={command:`seed`,describe:`Populate DB with seed data`,builder:{...J,file:{alias:`f`,description:`Path of the seed script.`,type:`string`}},async handler(e){let t=await Y(e);for(let{orm:n,project:r}of Z(`db seed`,t))await K(Ro(n,r,X(n).seed(r,e.file)),r,e)}},Io={command:`studio [db-url-or-path]`,describe:`Open database studio`,builder:{...J,"db-url-or-path":{description:`URL or path to the database`,type:`string`},restored:{description:`Whether to open the default restored database (<db|prisma>/restored.sqlite3).`,type:`boolean`}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw Error(`You cannot specify both --restored and --db-url-or-path.`);let t=await Y(e),n=Ho(e,[`db-url-or-path`,`restored`]);for(let{orm:r,project:i}of Z(`db studio`,t)){let t=e.restored?`prisma/restored.sqlite3`:e.dbUrlOrPath?.toString();await K(Ro(r,i,X(r).studio(i,t,n)),i,e)}}},Lo={command:`$0 <args..>`,describe:`Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.`,builder:{args:{type:`array`}},async handler(e){let t=await Y(e),n=[(e.args?.join(` `)??``).trimEnd(),Ho(e,[`args`])].filter(Boolean).join(` `);for(let{orm:r,project:i}of Z(`db ${n}`,t))await K(Ro(r,i,r===`prisma`?`PRISMA ${n}`:pn(i,n)),i,e)}};function Ro(e,t,n){return e===`drizzle`?rt(t,n):n}function zo(t,n,r){let i=Vo(t,n),a={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(a).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw Error(`Missing environment variables for Litestream: ${o.join(`, `)}`);let s=`snapshot:
|
|
76
|
+
</html>`)})}async function Mi(e,t,n){await new Promise((r,i)=>{let a=t=>{e.off(`listening`,o),i(t)},o=()=>{e.off(`error`,a),e.on(`error`,n),r()};e.once(`error`,a),e.once(`listening`,o),e.listen(t,`0.0.0.0`)})}async function Ni(e){await new Promise(t=>{let n=()=>{process.off(`SIGINT`,n),process.off(`SIGTERM`,n),process.off(`SIGQUIT`,n),(async()=>{try{await Pi(e)}catch(e){console.error(p.red(`Failed to close maintenance server: ${e.message}`))}finally{t()}})()};process.once(`SIGINT`,n),process.once(`SIGTERM`,n),process.once(`SIGQUIT`,n)})}async function Pi(e){await new Promise((t,n)=>{e.close(e=>{if(e){if(e.code===`ERR_SERVER_NOT_RUNNING`){t();return}n(e);return}t()}),e.closeAllConnections()})}async function Fi(e,n){let r=zi(e,n);return await b.mkdir(t.dirname(r),{recursive:!0}),await b.writeFile(r,`${process.pid}\n`,`utf8`),r}async function Ii(e,t){let n=zi(e,t),r=await Ri(n);if(r!==void 0&&r!==process.pid){try{I(r,`SIGTERM`)}catch{}await _i(r)}await Li(n,r)}async function Li(e,t){t!==void 0&&await Ri(e)!==t||await b.rm(e,{force:!0})}async function Ri(e){try{let t=await b.readFile(e,`utf8`),n=Number(t.trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function zi(e,t){return Bi(e.rootDirPath,t)}function Bi(e,n){return t.join(e,`.wb`,`maintenance-${n}.pid`)}const J=`@willbooster-private`,Vi=[`git:`,`git+`,`git@`,`file:`,`link:`,`workspace:`,`http:`,`https:`,`portal:`,`patch:`],Hi=/^git@github\.com:(?:WillBooster|WillBoosterLab)\/[^/#]+(?:\.git)?(?:#.*)?$/;function Ui(e){return typeof e==`string`&&Hi.test(e)}function Wi(e,t){return e.startsWith(`@willbooster-private/`)&&typeof t==`string`&&!Vi.some(e=>t.startsWith(e))}function Gi(n){let r={};for(let i of[t.join(h.homedir(),`.npmrc`),t.join(n,`.npmrc`)])try{Object.assign(r,Ki(e.readFileSync(i,`utf8`)))}catch{}let i=r[`${J}:registry`]?.replace(/\/+$/,``);if(!i)return;let a=`${i.replace(/^https?:/,``).replace(/\/+$/,``)}/`,o,s=-1;for(let[e,t]of Object.entries(r)){if(!e.endsWith(`:_authToken`)||!t)continue;let n=`${e.slice(0,-11).replace(/\/+$/,``)}/`;a.startsWith(n)&&n.length>s&&(s=n.length,o=t)}return{registryUrl:i,authToken:o??process.env.VERDACCIO_TOKEN}}function Ki(e){let t={};for(let n of e.split(`
|
|
77
|
+
`)){let e=n.trim();if(!e||e.startsWith(`#`)||e.startsWith(`;`))continue;let r=e.indexOf(`=`);if(r<=0)continue;let i=e.slice(0,r).trim();t[i]=e.slice(r+1).trim().replaceAll(/\$\{([^}]+)\}/g,(e,t)=>process.env[t]??``)}return t}async function qi(n,i,a,o){let s=await Ji(n,i,a),c=(await Xi(n,`${n.registryUrl}/${$i(i)}/${s}`)).dist?.tarball;if(!c)throw Error(`No tarball URL for ${i}@${s} in ${n.registryUrl}.`);let l=await Zi(n,c),u=t.join(await e.promises.mkdtemp(t.join(h.tmpdir(),`wb-private-package-`)),`package.tgz`);try{if(await e.promises.writeFile(u,Buffer.from(await l.arrayBuffer())),await e.promises.rm(o,{force:!0,recursive:!0}),await e.promises.mkdir(o,{recursive:!0}),r.spawnSync(`tar`,[`-xzf`,u,`-C`,o,`--strip-components=1`],{stdio:`inherit`}).status!==0)throw Error(`Failed to extract ${i}@${s} (${c}).`)}finally{await e.promises.rm(t.dirname(u),{force:!0,recursive:!0})}}async function Ji(e,t,n){if(ta(n))return n;let r=Yi(n,await Xi(e,`${e.registryUrl}/${$i(t)}`));if(!r)throw Error(`Cannot resolve ${t}@${n} against ${e.registryUrl}; use an exact version, a semver range, or a dist-tag.`);return r}function Yi(e,t){return e!==`*`&&E.validRange(e)?E.maxSatisfying(Object.keys(t.versions??{}),e)??void 0:t[`dist-tags`]?.[e===`*`?`latest`:e]}async function Xi(e,t){return await(await Zi(e,t)).json()}async function Zi(e,t){let n=!!e.authToken&&Qi(t,e.registryUrl),r=await fetch(t,{headers:n?{authorization:`Bearer ${e.authToken}`}:{}});if(!r.ok)throw Error(`Failed to fetch ${t}: ${r.status} ${r.statusText}`);return r}function Qi(e,t){try{return new URL(e).origin===new URL(t).origin}catch{return!1}}function $i(e){return e.replace(`/`,`%2F`)}const ea=/^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/;function ta(e){return!!e&&ea.test(e)}function na(e,t){return e===void 0||t===void 0||e===`*`||t===`*`?!1:ta(e)&&ta(t)?e===t:!E.validRange(e)||!E.validRange(t)?!1:E.subset(e,t)}function ra(e,t){return ta(e)?e===t:!E.validRange(e)||E.satisfies(t,e)}function ia(e,t){return e===`*`?!1:ta(e)?e===t:!!E.validRange(e)&&E.satisfies(t,e)}function*aa(e,t){for(let n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const oa=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],sa={command:`setup-private-packages`,describe:"Materialize private dependencies for Docker builds: copy git dependencies, reuse installed @willbooster-private/* registry packages whose exact-version or semver-range specifier the installed copy satisfies, and download the rest (auth via .npmrc / ~/.npmrc locally, or VERDACCIO_TOKEN on CI; dist-tag specifiers such as `latest` always download). The Dockerfile must COPY the generated directories (e.g. `COPY @willbooster/ @willbooster/` and `COPY @willbooster-private/ @willbooster-private/`) so the in-image install resolves the rewritten file: paths.",builder:{"out-dir":{description:`Directory to copy private packages into`,type:`string`,default:`@willbooster`}},async handler(e){let t=yt(e,!1);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=await G(e,!1,t.root.dirPath);n||(console.error(p.red(`No project found.`)),process.exit(1));try{await la(n.root.dirPath,ca(n),{outDir:e.outDir,dryRun:!!e.dryRun})}catch(e){console.error(p.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function ca(e){let t=new Map;for(let n of[e.root,...e.descendants])t.has(n.dirPath)||t.set(n.dirPath,n.packageJson);return[...t.values()]}async function la(n,r,i={}){let{outDir:a=`@willbooster`,dryRun:o=!1}=i,s=ha(n),c=(e,n)=>{let r=t.resolve(s,e),i=ha(r);if(i!==r)throw Error(`${n} must not contain symlinks (${r} resolves to ${i}).`);return r},l=c(a,`--out-dir`);va(s,l);let u=c(J,`The ${J} output directory`);if(ga(l,u))throw Error(`--out-dir must not overlap the ${J} registry output directory.`);let d=c(t.join(`.tmp`,`wb-private-staging`),`The staging directory`),f=c(t.join(`.tmp`,`wb-private-backup`),`The backup directory`);if(ga(l,ha(t.join(s,`node_modules`))))throw Error(`--out-dir must not overlap node_modules.`);for(let[e,t]of[[`staging`,d],[`backup`,f]])if(ga(l,t)||ga(u,t))throw Error(`Output directories must not overlap the ${e} directory (${t}).`);let m=e=>t.join(d,t.relative(s,e));t.relative(s,l)!==`@willbooster`&&console.warn(p.yellow(`Note: wb optimizeForDockerBuild rewrites git dependencies to <root>/@willbooster; a custom --out-dir requires a matching Dockerfile layout.`));let h=await ua(s,r,l,u);if(o){Ma(l,h);return}let g=[...h.values()].filter(e=>e.kind===`registry`&&!e.sourceDirPath),_=g.length>0?Gi(s):void 0;if(g.length>0&&!_)throw Error(`Cannot download ${g.map(e=>e.name).join(`, `)}: no registry configured for the ${J} scope; add "${J}:registry=..." to .npmrc or ~/.npmrc. Only installed copies satisfying an exact version or semver range are reused without registry access; dist-tag specifiers (e.g. \`latest\`) always require it.`);let v=[...h.values()].filter(e=>e.kind===`git`),y=[...h.values()].filter(e=>e.kind===`registry`);await e.promises.rm(d,{recursive:!0,force:!0});try{await e.promises.mkdir(m(l),{recursive:!0}),await e.promises.mkdir(m(u),{recursive:!0});for(let e of v)await fa(s,e,m(e.targetDirPath));for(let e of y){if(e.sourceDirPath){await fa(s,e,m(e.targetDirPath));continue}await qi(_,e.name,e.versionSpecifier??`latest`,m(e.targetDirPath)),e.resolvedVersion=Sa(m(e.targetDirPath),e.name),console.info(`Downloaded ${e.name} to ${t.relative(s,e.targetDirPath)}`),await da(s,_,e,h,l,u,m)}await Ea(d,h,m),await Oa([l,u],m,f)}finally{await e.promises.rm(d,{recursive:!0,force:!0})}console.info(`Ensure the Dockerfile COPYs ${t.relative(s,l)}/ and ${J}/ into the image before installing dependencies.`)}async function ua(e,t,n,r){let i=new Map,a=[],o=new Map;for(let e of t)for(let t of Ca(e,n,r)){let n=o.get(t.name);if(!n){o.set(t.name,t),a.push(t);continue}let r=Ta(n,t);r===void 0?ma(n,t,e.name??`a workspace manifest`):n.versionSpecifier=r.versionSpecifier}for(let t=0;t<a.length;t++){let s=a[t];if(s&&!i.has(s.name)){if(s.kind===`git`)s.sourceDirPath=ya(e,s.name);else{let t=ba(e,s);s.sourceDirPath=t?.dirPath,s.resolvedVersion=t?.version}if(i.set(s.name,s),s.sourceDirPath)for(let e of await ka(s.sourceDirPath)){let t=await Aa(e);for(let e of Ca(t,n,r)){let t=o.get(e.name);if(!t){o.set(e.name,e),a.push(e);continue}if(i.has(e.name))ma(t,e,s.name);else{let n=Ta(t,e);n===void 0?ma(t,e,s.name):t.versionSpecifier=n.versionSpecifier}}}}}return i}async function da(e,t,n,r,i,a,o){let s=o(n.targetDirPath);for(let c of await ka(s))for(let s of Ca(await Aa(c),i,a)){let c=r.get(s.name);if(c){if(c.kind===`registry`&&!c.sourceDirPath&&c.resolvedVersion===void 0){let e=Ta(c,s);e===void 0?ma(c,s,n.name):c.versionSpecifier=e.versionSpecifier}else ma(c,s,n.name);continue}if(s.kind===`git`)s.sourceDirPath=ya(e,s.name),await fa(e,s,o(s.targetDirPath));else{let n=ba(e,s);s.sourceDirPath=n?.dirPath,s.resolvedVersion=n?.version,s.sourceDirPath?await fa(e,s,o(s.targetDirPath)):(await qi(t,s.name,s.versionSpecifier??`latest`,o(s.targetDirPath)),s.resolvedVersion=Sa(o(s.targetDirPath),s.name),console.info(`Downloaded ${s.name} (nested dependency) to ${s.targetDirPath}`))}r.set(s.name,s),await da(e,t,s,r,i,a,o)}}async function fa(n,r,i){let a=r.kind===`registry`?pa(r.sourceDirPath):[];await e.promises.cp(r.sourceDirPath,i,{recursive:!0,force:!0,dereference:!0,filter:e=>{let n=t.relative(r.sourceDirPath,e).split(t.sep);if(n.includes(`.git`))return!1;let i=n.indexOf(`node_modules`);if(i===-1||a===!0)return!0;if(a.length===0)return!1;let[o,s]=n.slice(i+1);if(o===void 0)return!0;if(o.startsWith(`@`)&&s===void 0)return a.some(e=>e.startsWith(`${o}/`));let c=o.startsWith(`@`)?`${o}/${s}`:o;return a.includes(c)}}),console.info(`Copied ${r.name} to ${t.relative(n,r.targetDirPath)}`)}function pa(n){try{let r=JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`)),i=r.bundleDependencies??r.bundledDependencies;return i===!0?!0:Array.isArray(i)?i.filter(e=>typeof e==`string`):[]}catch{return[]}}function ma(e,t,n){if(!(e.kind===t.kind&&(e.versionSpecifier===t.versionSpecifier||na(e.versionSpecifier,t.versionSpecifier)||e.resolvedVersion!==void 0&&t.versionSpecifier!==void 0&&ia(t.versionSpecifier,e.resolvedVersion))))throw Error(`Conflicting requirements for ${e.name}: ${e.versionSpecifier??e.kind} is already selected, but ${n} requires ${t.versionSpecifier??t.kind}. Only a single version per private package is supported.`)}function ha(n){let r=t.resolve(n),i=[];for(;!e.existsSync(r);){let e=t.dirname(r);if(e===r)break;i.unshift(t.basename(r)),r=e}try{return t.join(e.realpathSync(r),...i)}catch{return t.resolve(n)}}function ga(e,t){return _a(e,t)||_a(t,e)}function _a(e,n){let r=t.relative(e,n);return r===``||!r.startsWith(`..`)&&!t.isAbsolute(r)}function va(e,n){let r=t.relative(e,n);if(!(r&&!r.startsWith(`..`)&&!t.isAbsolute(r)))throw Error(`Output directory must be a subdirectory of the project root: ${n}`)}function ya(n,r){let i=ja(r),a=t.join(n,`node_modules`,`@willbooster`,i);if(e.existsSync(t.join(a,`package.json`)))return e.realpathSync(a);let o=t.join(n,`node_modules`,`.bun`),s=new Set;try{for(let n of e.readdirSync(o,{withFileTypes:!0})){let r=t.join(o,n.name,`node_modules`,`@willbooster`,i);e.existsSync(t.join(r,`package.json`))&&s.add(e.realpathSync(r))}}catch{}if(s.size===1)return[...s][0];throw s.size>1?Error(`Multiple installed resolutions found for ${r}: ${[...s].join(`, `)}. Deduplicate the dependency so a single resolution remains.`):Error(`Private package is not installed: ${r} (${a})`)}function ba(n,r){let i=r.versionSpecifier??`latest`,a=t.join(`node_modules`,...r.name.split(`/`)),o=(t,n)=>{let a=Sa(n,r.name);a&&ia(i,a)&&t.set(e.realpathSync(n),a)},s=new Map;if(o(s,t.join(n,a)),s.size===1)return xa(s);let c=new Map;try{for(let r of e.readdirSync(t.join(n,`node_modules`,`.bun`),{withFileTypes:!0}))o(c,t.join(n,`node_modules`,`.bun`,r.name,a))}catch{}return xa(c)}function xa(e){let[t]=e;return e.size===1&&t?{dirPath:t[0],version:t[1]}:void 0}function Sa(n,r){try{let i=JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`));return i.name===r&&typeof i.version==`string`?i.version:void 0}catch{return}}function Ca(e,n,r){let i=new Map;for(let a of oa){let o=e[a];if(o)for(let[e,a]of Object.entries(o)){let o=Ui(a);if(!o&&!Wi(e,a))continue;if(o&&!e.startsWith(`@willbooster/`))throw Error(`Private git dependency must be an @willbooster package: ${e}`);let s=ja(e);if(!/^[\w.-]+$/.test(s)||s.startsWith(`.`))throw Error(`Invalid private package name: ${e}`);let c={name:e,kind:o?`git`:`registry`,sourceDirPath:void 0,resolvedVersion:void 0,targetDirPath:t.join(o?n:r,s),versionSpecifier:a},l=i.get(e);i.set(e,l?wa(l,c):c)}}return[...i.values()]}function wa(e,t){let n=Ta(e,t);if(n)return n;throw Error(`Conflicting requirements for ${e.name} within one manifest: ${e.versionSpecifier??e.kind} vs ${t.versionSpecifier??t.kind}.`)}function Ta(e,t){if(e.kind===t.kind){if(e.versionSpecifier===t.versionSpecifier||na(e.versionSpecifier,t.versionSpecifier))return e;if(na(t.versionSpecifier,e.versionSpecifier))return t}}async function Ea(n,r,i){for(let a of r.values())for(let o of await ka(i(a.targetDirPath))){let a=await Aa(o);Da(o,a,r,i)&&(await e.promises.writeFile(o,`${JSON.stringify(a,void 0,2)}\n`,`utf8`),console.info(`Rewrote private dependencies in ${t.relative(n,o)}`))}}function Da(e,n,r,i){let a=!1;for(let o of oa){let s=n[o];if(s)for(let[n,o]of Object.entries(s)){if(!Ui(o)&&!Wi(n,o))continue;let c=r.get(n);c&&(s[n]=`file:${t.relative(t.dirname(e),i(c.targetDirPath))}`,a=!0)}}return a}async function Oa(n,r,i){await e.promises.mkdir(t.dirname(i),{recursive:!0});let a=await e.promises.mkdtemp(`${i}-`),o=[],s=!1;try{for(let[i,s]of n.entries()){let n=t.join(a,String(i)),c=e.existsSync(s);c&&await e.promises.rename(s,n),o.push({outDirPath:s,backupDirPath:n,hadPreviousTree:c}),await e.promises.mkdir(t.dirname(s),{recursive:!0}),await e.promises.rename(r(s),s)}}catch(t){for(let t of o.toReversed())try{await e.promises.rm(t.outDirPath,{recursive:!0,force:!0}),t.hadPreviousTree&&await e.promises.rename(t.backupDirPath,t.outDirPath)}catch(e){s=!0,console.error(p.red(`Failed to restore ${t.outDirPath}: ${String(e)}\nThe previous materialization is kept at ${t.backupDirPath}; move it back by hand.`))}throw t}finally{if(!s)try{await e.promises.rm(a,{recursive:!0,force:!0})}catch(e){console.warn(p.yellow(`Failed to remove ${a}: ${String(e)}`))}}}async function ka(n){if(!e.existsSync(n))return[];let r=[];for(let i of await e.promises.readdir(n,{withFileTypes:!0})){if(i.name===`node_modules`||i.name===`.git`)continue;let e=t.join(n,i.name);if(i.isDirectory()){r.push(...await ka(e));continue}i.isFile()&&i.name===`package.json`&&r.push(e)}return r}async function Aa(t){return JSON.parse(await e.promises.readFile(t,`utf8`))}function ja(e){return e.replace(/^@willbooster(?:-private)?\//,``)}function Ma(e,t){console.info(`[dry-run] Would recreate ${e}`);for(let e of t.values())console.info(e.sourceDirPath?`[dry-run] Would copy ${e.name}: ${e.sourceDirPath}`:e.kind===`git`?`[dry-run] Would copy ${e.name}: (installed under node_modules)`:`[dry-run] Would download ${e.name}@${e.versionSpecifier} to ${e.targetDirPath}`);console.info(`[dry-run] Would rewrite copied private dependencies to file:../<name>`)}const Na=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Pa=/\.(?:sqlite3?|db)(?:[-.](?:journal|shm|wal))?$/i,Fa=[`.cache`,`.mypy_cache`,`.next/cache`,`.parcel-cache`,`.pytest_cache`,`.ruff_cache`,`.tox`,`.turbo`,`.venv`,`.yarn/cache`,`.yarn/install-state.gz`,`__pycache__`,`coverage`,`node_modules/.cache`,`playwright-report`,`storybook-static`,`target`,`test-results`],Ia=[`**/*.pyc`,`**/*.tsbuildinfo`,`**/__pycache__`],La=[`prisma`,`db`,`drizzle`],Ra=[`/data`],za={command:`optimizeForDockerBuild`,describe:`Optimize configuration when building a Docker image`,builder:{outside:{description:`Whether the optimization is executed outside a docker container or not`,type:`boolean`,alias:`o`}},async handler(n){let i=await G(n);if(i||(console.error(p.red(`No project found.`)),process.exit(1)),n.outside){let e=ca(await G(n,!1,i.root.dirPath)??i);if(e.some(Ba))try{await la(i.root.dirPath,e,{dryRun:!!n.dryRun})}catch(e){console.warn(p.yellow(`Could not auto-materialize private packages (${e instanceof Error?e.message:String(e)}); run \`wb setup-private-packages\` if the Docker build needs them. Continuing.`))}}let a=[];for(let r of aa(`optimizeForDockerBuild`,i.descendants)){let i=r.packageJson;Va(r,i);let o=Ja(n,i);if(Xa(i,{removeWbPostinstall:!n.outside&&o.includes(`@willbooster/wb`)}),Za(i),n.dryRun)continue;let s=n.outside?t.join(r.dirPath,`dist`):r.dirPath;await e.promises.mkdir(s,{recursive:!0}),await e.promises.writeFile(t.join(s,`package.json`),JSON.stringify(i),`utf8`),n.outside&&await Ka(t.join(s,`bash`)),a.push(r)}!n.dryRun&&!n.outside&&(r.spawnSync(i.root.packageManagerCommand,[`install`],{stdio:`inherit`}),console.info(`Installed dependencies.`),await Qa(a))}};function Ba(e){return Na.some(t=>{let n=e[t];return n!==void 0&&Object.entries(n).some(([e,t])=>Ui(t)||Wi(e,t))})}function Va(e,t){return Ha(e.rootDirPath,e.dirPath,t)}function Ha(e,t,n){let r=[];for(let i of Na){let a=n[i]??{};for(let[n,o]of Object.entries(a))if(Ui(o))a[n]=Ua(e,t,`@willbooster`,n),r.push(`${i}.${n}`);else if(Wi(n,o)){let s=Ga(e,n);if(s===void 0){console.warn(p.yellow(`${n} is not materialized under ${J}/; run \`wb setup-private-packages\` so the Docker build does not need registry credentials.`));continue}ra(o,s)||(console.error(p.red(`Materialized ${n} is ${s} but package.json requires ${o}; rerun \`wb setup-private-packages\`.`)),process.exit(1)),a[n]=Ua(e,t,J,n),r.push(`${i}.${n}`)}}return console.info(`Rewrote private dependencies:`,r.join(`, `)||`none`),r}function Ua(e,n,r,i){let a=t.join(e,r,Wa(i)),o=t.relative(n,a);return o.startsWith(`.`)?o:`./${o}`}function Wa(e){return e.replace(/^@willbooster(?:-private)?\//,``)}function Ga(n,r){let i=t.join(n,J,Wa(r),`package.json`);try{return JSON.parse(e.readFileSync(i,`utf8`)).version}catch{return}}async function Ka(n){let r=qa();await e.promises.mkdir(n,{recursive:!0});for(let i of await e.promises.readdir(r,{withFileTypes:!0})){if(!i.isFile()||!i.name.endsWith(`.sh`))continue;let a=t.join(n,i.name);await e.promises.copyFile(t.join(r,i.name),a),await e.promises.chmod(a,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function qa(){let n=t.dirname(T(import.meta.url));for(;;){let r=t.join(n,`docker`,`bash`);if(e.existsSync(r))return r;let i=t.dirname(n);if(i===n)throw Error(`Docker shell scripts directory not found.`);n=i}}function Ja(e,t){if(e.outside)return Ya(t);let n=Object.keys(t.devDependencies??{});return delete t.devDependencies,console.info(`Removed all devDependencies.`),n}function Ya(e){let t=e.devDependencies??{},n=[`artillery`,`biome`,`concurrently`,`conventional-changelog-conventionalcommits`,`eslint`,`husky`,`imagemin`,`jest`,`kill-port`,`lint-staged`,`open-cli`,`oxfmt`,`oxlint`,`playwright`,`prettier`,`pinst`,`railway`,`semantic-release`,`sort-package-json`,`wait-on`,`vitest`],r=[];for(let e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes(`willbooster`)&&e.includes(`config`))&&(delete t[e],r.push(e));return console.info(`Removed devDependencies:`,r.join(`, `)||`none`),r}function Xa(e,t){let n=[`check`,`deploy`,`format`,`lint`,`start`,`test`],r=[`pinst `,`husky `],i=e.scripts??{},a=[];for(let[e,o]of Object.entries(i))(t.removeWbPostinstall&&e===`postinstall`&&o.trim()===`wb gen-code`||n.some(t=>e.startsWith(t))||r.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete i[e],a.push(e));console.info(`Removed scripts:`,a.join(`, `)||`none`)}function Za(e){delete e.private,delete e.publishConfig,delete e.prettier}async function Qa(e){for(let t of e)await $a(t),await no(t),yo(t)}async function $a(e){let t=[...await eo(e),...await to(e)];console.info(`Removed Docker build caches:`,t.join(`, `)||`none`)}async function eo(n){let r=[];for(let i of Fa){let a=t.join(n.dirPath,i);e.existsSync(a)&&(await e.promises.rm(a,{force:!0,recursive:!0}),r.push(i))}return r}async function to(n){let r=await m(Ia,{cwd:n.dirPath,dot:!0,followSymbolicLinks:!1,ignore:[`**/node_modules`,`**/node_modules/**`,`**/.yarn`,`**/.yarn/**`,`**/.git`,`**/.git/**`],onlyFiles:!1});return await Promise.all(r.map(r=>e.promises.rm(t.join(n.dirPath,r),{force:!0,recursive:!0}))),r}async function no(e){let t=(await Promise.all([ro(e),ao(e)])).flat();console.info(`Removed generated local data:`,t.join(`, `)||`none`)}async function ro(n){let r=io(n),i=[];for(let a of r){let r=t.join(n.dirPath,a);e.existsSync(r)&&(await e.promises.rm(r,{force:!0,recursive:!0}),i.push(a))}return i}function io(e){let n=La.map(e=>t.join(e,`mount`)),r=_t(e);if(!r)return n;let i=t.dirname(r);if(t.basename(i)!==`mount`||!mo(e,i))return n;let a=t.relative(e.dirPath,i);return a?[...new Set([...n,a])]:n}async function ao(e){return(await Promise.all([oo(e),co(e)])).flat()}async function oo(e){let t=await so(e);return(await Promise.all(t.map(t=>vo(e,t)))).flat()}async function so(e){let n=La.map(n=>t.join(e.dirPath,n)),r=await Promise.all(n.map(e=>_o(e)));return n.filter((e,t)=>r[t])}async function co(n){let r=lo(n),i=[];for(let a of r)for(let r of po(a))await go(r)&&(await e.promises.rm(r,{force:!0}),i.push(t.relative(n.dirPath,r)));return i}function lo(e){let n=gt(e),r=_t(e);if(!n||!r)return[];let i=t.isAbsolute(n)?[n]:[r,...La.map(r=>t.resolve(e.dirPath,r,n))];return[...new Set(i)].filter(t=>uo(e,t))}function uo(e,t){return mo(e,t)||fo(e,t)}function fo(e,n){return ho(e)?Ra.some(e=>{let r=t.relative(e,n);return r!==``&&r!==`..`&&!r.startsWith(`../`)}):!1}function po(e){return[e,`${e}-journal`,`${e}-shm`,`${e}-wal`,`${e}.journal`,`${e}.shm`,`${e}.wal`]}function mo(e,n){let r=t.relative(e.dirPath,n);return r===``||r!==`..`&&!r.startsWith(`..${t.sep}`)}function ho(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}async function go(t){try{return(await e.promises.stat(t)).isFile()}catch{return!1}}async function _o(t){try{return(await e.promises.stat(t)).isDirectory()}catch{return!1}}async function vo(n,r){let i=(await e.promises.readdir(r,{withFileTypes:!0})).filter(e=>e.isFile()&&Pa.test(e.name)).map(e=>e.name);await Promise.all(i.map(n=>e.promises.rm(t.join(r,n),{force:!0})));let a=t.relative(n.dirPath,r);return i.map(e=>t.join(a,e))}function yo(n){if(!ho(n))return;let i=t.join(n.dirPath,`bash`,`cleanup.sh`);if(e.existsSync(i)&&r.spawnSync(`bash`,[i,`--keep-scripts`],{cwd:n.dirPath,stdio:`inherit`}).status!==0)throw Error(`Failed to run ${t.relative(n.dirPath,i)}`)}const Y={},bo={command:`prisma`,aliases:[`db`],describe:`Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init`,builder:e=>e.parserConfiguration({"populate--":!0}).command(xo).command(So).command(Co).command(wo).command(To).command(Do).command(Oo).command(Mo).command(No).command(Po).command(Fo).command(Io).command(Lo).demandCommand().strict(!1),handler(){}},xo={command:`cleanup-litestream`,describe:`Clean up temporal Litestream files`,builder:Y,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db cleanup-litestream`,t))await K(Z(n).cleanUpLitestream(r),r,e)}},So={command:`create-litestream-config`,describe:`Create Litestream configuration file`,builder:{...Y,output:{description:`Output path of the Litestream configuration file.`,type:`string`,default:`/etc/litestream.yml`}},async handler(e){let t=await X(e);if(t.length>1)throw Error(`Creating Litestream configuration for multiple projects at once is not supported because they would overwrite each other.`);for(let{orm:n,project:r}of Q(`db create-litestream-config`,t))zo(r,n,e.output)}},Co={command:`deploy`,describe:`Apply migration to DB without initializing it`,builder:Y,async handler(e){let t=await X(e),n=Ho(e);for(let{orm:r,project:i}of Q(`db deploy`,t))await K(Ro(r,i,Z(r).deploy(i,n)),i,e)}},wo={command:`deploy-force`,describe:`Force to apply migration to DB utilizing Litestream's backup without initializing it`,builder:Y,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db deploy-force`,t))await K(Z(n).deployForce(r),r,e)}},To={command:`generate`,describe:`Generate ORM client code`,builder:Y,async handler(e){let t=await X(e),n=Ho(e);for(let{orm:r,project:i}of Q(`db generate`,t))await K(Z(r).generate(i,n),i,e)}},Eo={...Y,config:{description:`Path of the Litestream configuration file.`,type:`string`}},Do={command:`list-backups`,describe:`List Litestream backups`,builder:Eo,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db list-backups`,t))await K(Z(n).listBackups(r,e.config),r,e)}},Oo={command:`migrate`,describe:`Apply migration to DB with initializing it`,builder:{...Y,"check-idempotency":{description:`Run the migration command twice to confirm it is idempotent.`,type:`boolean`}},async handler(e){let t=await X(e),n=Ho(e,[`check-idempotency`]);for(let{orm:r,project:i}of Q(`db migrate`,t)){let t=Z(r);await K(Ro(r,i,t.migrate(i,n)),i,e),ko(i,e.checkIdempotency)&&(jo(i)?console.info(p.yellow(`Skipping idempotency check for ${i.name} in production environment.`)):await K(Ro(r,i,t.deploy(i,n)),i,e))}}};function ko(e,t){return t??Ao(e)}function Ao(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}function jo(e){return vt(e,`production`)}const Mo={command:`migrate-dev`,describe:`Create a migration file`,builder:Y,async handler(e){let t=await X(e),n=Ho(e);for(let{orm:r,project:i}of Q(`db migrate-dev`,t))await K(Z(r).migrateDev(i,n),i,e)}},No={command:`reset`,describe:`Reset DB`,builder:Y,async handler(e){let t=await X(e),n=Ho(e);for(let{orm:r,project:i}of Q(`db reset`,t))await K(Ro(r,i,Z(r).reset(i,n)),i,e);if(process.env.WB_ENV!==`test`){process.env.WB_ENV=`test`;for(let{orm:t,project:r}of Q(`WB_ENV=test db reset`,await X(e)))await K(Ro(t,r,Z(t).reset(r,n)),r,e)}}},Po={command:`restore`,describe:`Restore DB from Litestream's backup`,builder:{...Eo,output:{description:`Output path of the restored database. Defaults to "<db|drizzle|prisma>/restored.sqlite3".`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db restore`,t)){let t=e.output??Bo(r,n);await K(Z(n).restore(r,t,e.config),r,e)}}},Fo={command:`seed`,describe:`Populate DB with seed data`,builder:{...Y,file:{alias:`f`,description:`Path of the seed script.`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db seed`,t))await K(Ro(n,r,Z(n).seed(r,e.file)),r,e)}},Io={command:`studio [db-url-or-path]`,describe:`Open database studio`,builder:{...Y,"db-url-or-path":{description:`URL or path to the database`,type:`string`},restored:{description:`Whether to open the default restored database (<db|prisma>/restored.sqlite3).`,type:`boolean`}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw Error(`You cannot specify both --restored and --db-url-or-path.`);let t=await X(e),n=Ho(e,[`db-url-or-path`,`restored`]);for(let{orm:r,project:i}of Q(`db studio`,t)){let t=e.restored?`prisma/restored.sqlite3`:e.dbUrlOrPath?.toString();await K(Ro(r,i,Z(r).studio(i,t,n)),i,e)}}},Lo={command:`$0 <args..>`,describe:`Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.`,builder:{args:{type:`array`}},async handler(e){let t=await X(e),n=[(e.args?.join(` `)??``).trimEnd(),Ho(e,[`args`])].filter(Boolean).join(` `);for(let{orm:r,project:i}of Q(`db ${n}`,t))await K(Ro(r,i,r===`prisma`?`PRISMA ${n}`:fn(i,n)),i,e)}};function Ro(e,t,n){return e===`drizzle`?rt(t,n):n}function zo(t,n,r){let i=Vo(t,n),a={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(a).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw Error(`Missing environment variables for Litestream: ${o.join(`, `)}`);let s=`snapshot:
|
|
78
78
|
interval: 24h # Create a backup per day
|
|
79
79
|
retention: 72h # Keep backups for 3 days
|
|
80
80
|
dbs:
|
|
@@ -88,26 +88,26 @@ dbs:
|
|
|
88
88
|
access-key-id: ${a.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}
|
|
89
89
|
secret-access-key: ${a.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}
|
|
90
90
|
sync-interval: 1m
|
|
91
|
-
`;try{e.writeFileSync(r,s),console.info(`Generated ${r}`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to write ${r}: ${t}`,{cause:e})}}function Bo(e,t){return t===`prisma`?`prisma/restored.sqlite3`:`drizzle/restored.sqlite3`}function Vo(e,t){if(t===`prisma`)return`prisma/mount/prod.sqlite3`;let n=_t(e);if(!n)throw Error(`wb db create-litestream-config for Drizzle requires file: DATABASE_URL.`);return n}async function Y(e,t){let n=await G(e);n||(console.error(p.red(`No project found.`)),process.exit(1));let r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!!e&&(!t||e.orm===t));return r.length===0&&(console.error(p.red(t?`No ${t} project found.`:`No supported database ORM project found.`)),process.exit(1)),r}function X(e){return e===`prisma`?fr:jn}function*Z(e,t){let n=new Map(t.map(e=>[e.project,e]));for(let r of oa(e,t.map(({project:e})=>e))){let e=n.get(r);if(!e)throw Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function Ho(e,t=[]){let n=[],r=Object.keys(Ye),i=Object.values(Ye).flatMap(e=>`alias`in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),a=new Set([...t,...r,...i,`--`,`_`,`$0`]);for(let[t,r]of Object.entries(e))if(!a.has(t)){let i=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(i!==t&&e[i]!==void 0)continue;if(typeof r==`boolean`&&r)n.push(`--${t}`);else if(typeof r==`string`||typeof r==`number`)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(let e of r)n.push(`--${t}`,String(e))}let o=Array.isArray(e[`--`])?e[`--`].map(String):[];return V([...n,...o])}const Uo=new Set([`CI`]),Wo=[`RAILWAY_`,`NIXPACKS_`];function Go(e){return Uo.has(e)||Wo.some(t=>e.startsWith(t))}function Ko(e){return new Set(e.filter(([e])=>!e.startsWith(`mise env`)).flatMap(([,e])=>e))}function qo(e){return Object.entries(e).filter(e=>{let[t,n]=e;return typeof n==`string`&&n!==``&&!Go(t)}).toSorted(([e],[t])=>e.localeCompare(t))}const Jo={command:`railway-env`,describe:`Sync the environment variables declared for the current WB_ENV (resolved from fnox/.env) to the Railway service, keeping fnox the single source of truth. Railway-managed keys (RAILWAY_*, NIXPACKS_*, CI) are never pushed.`,builder:e=>e,async handler(e){let t=W(e);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=t.env.WB_ENV;(!n||n===`development`||n===`test`)&&(console.error(p.red(`WB_ENV must name a deploy environment (e.g. staging or production), but is ${n}.`)),process.exit(1));let[r,i]=re(e,t.dirPath,{ignoreProcessEnv:!0}),a=Ko(i);for(let e of Object.keys(r))a.has(e)||delete r[e];for(let e of[...zn(t),`WB_ENV`,`NEXT_PUBLIC_WB_ENV`]){let n=t.env[e];r[e]===void 0&&n!==void 0&&(r[e]=n)}for(let e of Object.keys(r)){let n=t.env[e];n!==void 0&&(r[e]=n)}let o=qo(r);if(o.length===0){console.info(p.yellow(`No environment variables to sync to Railway.`));return}let s=o.map(([e])=>e);if(e.dryRun){console.info(p.cyan(`Would sync ${o.length} variable(s) to Railway (${n}): ${s.join(`, `)}`));return}let c=[`--skip-deploys`];process.env.RAILWAY_PROJECT_ID&&c.push(`--project=${process.env.RAILWAY_PROJECT_ID}`),process.env.RAILWAY_SERVICE_ID&&c.push(`--service=${process.env.RAILWAY_SERVICE_ID}`),c.push(`--environment=${n}`);let l=o.flatMap(([e,t])=>[`--set`,`${e}=${t}`]),u=await L(`bunx`,[`@railway/cli`,`variables`,...c,...l],{cwd:t.dirPath,env:process.env,stdio:`pipe`,killOnExit:!0});u.status!==0&&(console.error(p.red(`Failed to sync environment variables to Railway (exit ${u.status}). Keys: ${s.join(`, `)}`)),process.exit(u.status??1)),console.info(p.green(`Synced ${o.length} variable(s) to Railway (${n}): ${s.join(`, `)}`))}},Yo={command:`release [args..]`,describe:"Run semantic-release (or multi-semantic-release) so that repositories using Bun isolated installs can publish to npm: reinstall with the hoisted linker (npm cannot walk Bun's isolated node_modules layout), rewrite `workspace:` ranges npm cannot parse, run the release, then restore the modified files. Extra arguments (e.g. `--debug`, after `--`) are forwarded to the release command.",builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await Xo(e)}};async function Xo(e,n){let r=yt(e,!1,n);r||(console.error(p.red(`No project found.`)),process.exit(1));let i=r.root,a=new Map,o,s={current:void 0},c=e=>{o=e;try{s.current?.pid&&I(s.current.pid,e)}catch(t){console.error(p.red(`Failed to terminate the release child process tree: ${String(t)}`)),s.current?.kill(e)}},l=[`SIGINT`,`SIGTERM`];for(let e of l)process.on(e,c);let u=0,d=!1;try{if(await Qo(i)?await ns(i,e,a,s):console.info(p.cyan(`Skipping the hoisted reinstall because the semantic-release configuration does not include @semantic-release/npm.`)),o)throw Error(`Aborted by ${o} before running the release.`);u=await fs(i,e,s),d=u===0}catch(e){console.error(p.red(String(e instanceof Error?e.message:e))),u=1}finally{let e=[];for(let[t,n]of a)as(t,n,d)&&e.push(t);e.length>0&&console.info(p.cyan(`Restored ${e.map(e=>t.relative(i.dirPath,e)).join(`, `)}.`)),[...a.keys()].some(e=>t.basename(e)===`bunfig.toml`)&&!Je(i.env.CI)&&console.info(p.yellow("node_modules now uses the hoisted layout; run a clean reinstall (`rm -rf node_modules packages/*/node_modules && bun install`) to restore the isolated layout."));for(let e of l)process.off(e,c)}if(o){process.kill(process.pid,o);return}u!==0&&process.exit(u)}async function Zo(e,t,n,i){return await new Promise(a=>{let o=r.spawn(t,n,i);e.current=o,o.on(`error`,t=>{e.current=void 0,console.error(p.red(String(t))),a(1)}),o.on(`exit`,t=>{e.current=void 0,a(t??1)})})}async function Qo(e){let t=ts(e.dirPath,e.packageJson);if(!Array.isArray(t)||$o(t))return!0;for(let t of await St(e)){let e=ts(t,void 0);if(e===`unknown`||Array.isArray(e)&&$o(e))return!0}return!1}function $o(e){return e.some(e=>(Array.isArray(e)?e[0]:e)===`@semantic-release/npm`)}const es=[{fileName:`.releaserc`,jsonParseable:!0},{fileName:`.releaserc.json`,jsonParseable:!0},{fileName:`.releaserc.yaml`,jsonParseable:!1},{fileName:`.releaserc.yml`,jsonParseable:!1},{fileName:`.releaserc.js`,jsonParseable:!1},{fileName:`.releaserc.ts`,jsonParseable:!1},{fileName:`.releaserc.mjs`,jsonParseable:!1},{fileName:`.releaserc.cjs`,jsonParseable:!1},{fileName:`.config/releaserc`,jsonParseable:!0},{fileName:`.config/releaserc.json`,jsonParseable:!0},{fileName:`.config/releaserc.yaml`,jsonParseable:!1},{fileName:`.config/releaserc.yml`,jsonParseable:!1},{fileName:`.config/releaserc.js`,jsonParseable:!1},{fileName:`.config/releaserc.ts`,jsonParseable:!1},{fileName:`.config/releaserc.mjs`,jsonParseable:!1},{fileName:`.config/releaserc.cjs`,jsonParseable:!1},{fileName:`release.config.js`,jsonParseable:!1},{fileName:`release.config.ts`,jsonParseable:!1},{fileName:`release.config.mjs`,jsonParseable:!1},{fileName:`release.config.cjs`,jsonParseable:!1}];function ts(n,r){if(r===void 0)try{r=JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`))}catch{r=void 0}let i=r?.release;if(i===void 0)for(let{fileName:r,jsonParseable:a}of es){let o=t.join(n,r);if(e.existsSync(o)){if(!a)return`unknown`;try{i=JSON.parse(e.readFileSync(o,`utf8`))}catch{return`unknown`}break}}if(!(!i||typeof i!=`object`))return Array.isArray(i.plugins)?i.plugins:i.extends===void 0?void 0:`unknown`}async function ns(n,r,i,a){let o=t.join(n.dirPath,`bunfig.toml`),s=e.existsSync(o)?e.readFileSync(o,`utf8`):void 0,c=s===void 0?void 0:os(s);if(s!==void 0&&c!==s&&(console.info(p.cyan(`Clean-reinstalling with the hoisted linker so npm can walk node_modules...`)),!r.dryRun)){i.set(o,Buffer.from(s,`utf8`));for(let r of[`bun.lock`,`bun.lockb`]){let a=t.join(n.dirPath,r);i.set(a,e.existsSync(a)?e.readFileSync(a):void 0)}e.writeFileSync(o,c??``,`utf8`);let r=[n.dirPath,...await St(n)].map(e=>t.join(e,`node_modules`));for(let t of r)e.rmSync(t,{force:!0,recursive:!0});if(await Zo(a,`bun`,[`install`,`--ignore-scripts`],{cwd:n.dirPath,env:n.env,stdio:`inherit`})!==0)throw Error(`bun install failed while preparing the release.`);for(let t of r)e.rmSync(t,{force:!0,recursive:!0});if(await Zo(a,`bun`,[`install`],{cwd:n.dirPath,env:is(n.env),stdio:`inherit`})!==0)throw Error(`bun install failed while replaying lifecycle scripts for the release.`)}let l=await St(n);for(let a of[n.packageJsonPath,...l.map(e=>t.join(e,`package.json`))]){if(!e.existsSync(a))continue;let o=e.readFileSync(a,`utf8`);r.dryRun||i.set(a,Buffer.from(o,`utf8`));let s=ss(o);s!==o&&(console.info(p.cyan(`Rewriting workspace: ranges in ${t.relative(n.dirPath,a)}...`)),r.dryRun||e.writeFileSync(a,s,`utf8`))}}const rs=[`VERDACCIO_TOKEN`,`NPM_TOKEN`,`NODE_AUTH_TOKEN`,`GITHUB_TOKEN`,`GH_TOKEN`,`GH_PACKAGES_TOKEN`,`GH_PKG_READ_TOKEN`,`FNOX_AGE_KEY`];function is(e){let t={...e};for(let e of rs)e in t&&(t[e]=``);return t}function as(n,r,i){if(r===void 0){let t=e.existsSync(n);return e.rmSync(n,{force:!0}),t}if(i&&t.basename(n)===`package.json`&&e.existsSync(n)){let t=e.readFileSync(n,`utf8`),i=r.toString(`utf8`);if(t!==ss(i)){let r=cs(t,i);return r===t?!1:(e.writeFileSync(n,r,`utf8`),!0)}}return(e.existsSync(n)?e.readFileSync(n):void 0)?.equals(r)?!1:(e.writeFileSync(n,r),!0)}function os(e){return e.replace(/^(\s*linker\s*=\s*)["']isolated["']/mu,`$1"hoisted"`).replace(/^\s*globalStore\s*=\s*true[^\n]*\n?/mu,``)}function ss(e){return ls(e,e=>e.replaceAll(/("[^"\n]+"\s*:\s*)"workspace:[^"]*"/gu,`$1"*"`))}function cs(e,t){let n=us(t);return ls(e,(e,t)=>{let r=e;for(let{section:e,name:i,specifier:a}of n)e===t&&(r=r.replaceAll(RegExp(`("${ds(i)}"\\s*:\\s*)"[^"]*"`,`gu`),(e,t)=>`${t}${JSON.stringify(a)}`));return r})}function ls(e,t){return e.replaceAll(/("(dependencies|devDependencies|optionalDependencies|peerDependencies)"\s*:\s*\{)([^{}]*)(\})/gu,(e,n,r,i,a)=>`${n}${t(i,r)}${a}`)}function us(e){let t;try{t=JSON.parse(e)}catch{return[]}let n=[];for(let e of[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`])for(let[r,i]of Object.entries(t[e]??{}))typeof i==`string`&&i.startsWith(`workspace:`)&&n.push({section:e,name:r,specifier:i});return n}function ds(e){return e.replaceAll(/[$()*+.?[\\\]^{|}]/g,String.raw`\$&`)}async function fs(n,r,i){let a=[...r.args??[],...r[`--`]??[]].map(String),o=[`@anolilab/multi-semantic-release`,`multi-semantic-release`,`@qiwi/multi-semantic-release`].find(e=>n.packageJson.devDependencies?.[e]),s=o?`multi-semantic-release`:`semantic-release`,c={...n.env};qe(n.dirPath,c);let l=e.existsSync(t.join(n.dirPath,`node_modules`,`.bin`,s)),u=o??`semantic-release`,d=l?[s,...a]:n.packageManagerCommand===`bun`?[`bunx`,u,...a]:[`yarn`,`dlx`,u,...a];return console.info(p.cyan(`Running: ${d.join(` `)}`)),r.dryRun?0:await Zo(i,d[0],d.slice(1),{cwd:n.dirPath,env:c,stdio:`inherit`})}const ps={command:`retry [command] [args...]`,describe:`Retry the given command until it succeeds`,builder:{retry:{description:`A maximum retry count`,type:`number`,alias:`r`,default:3}},async handler(e){let t=W(e);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean),r=0;for(let i=0;i<e.retry;i++)if(i>0&&console.info(`\n${p.yellow(`#${i} Retrying: ${n.join(` `)}`)}`),r=await K(n.join(` `),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),r===0)return;process.exit(r)}},ms={command:`setup`,describe:`Setup development environment. .env files are ignored.`,builder:{},async handler(e){await hs(e)}};async function hs(e,t){let n=await G(e,!1,t);n||(console.error(p.red(`No project found.`)),process.exit(1));for(let t of oa(`setup`,n.descendants)){let i=await b.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root&&(h.platform()===`darwin`&&await Ht(`brew install ${[`pstree`].join(` `)}`,t,e),i.some(e=>e.isFile()&&(e.name===`mise.toml`||e.name.includes(`-version`)))&&await K(`mise install`,t,e,{exitIfFailed:!1})),i.some(e=>e.isFile()&&e.name===`pyproject.toml`)){await Ht(`poetry config virtualenvs.in-project true`,t,e);let n=``;try{n=r.execSync(`mise which python`,{cwd:t.dirPath,stdio:[`ignore`,`pipe`,`ignore`]}).toString().trim()}catch{}n&&await Ht(`poetry env use ${`'${n.replaceAll(`'`,String.raw`'\''`)}'`}`,t,e),await Bt.promiseAll(),await K(`poetry run pip install --upgrade pip`,t,e),await K(`poetry install --ansi`,t,e)}(t===n.root||!n.root.packageJson.scripts?.[`gen-code`])&&t.packageJson.scripts?.[`gen-code`]&&await K(`${t.packageManagerRunCommand} gen-code`,t,e)}let i=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);i&&await K(`${i.packageManagerRunCommand} playwright install --with-deps`,i,e)}const gs={watch:{description:`Whether to watch files`,type:`boolean`},args:{description:`Arguments for core command`,type:`array`,alias:`a`,default:[]},"docker-options":{description:`Arguments for "docker run"`,type:`array`,default:[]}};function _s(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e[`--`]??[]].map(e=>H(String(e))).join(` `),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>H(String(e))).join(` `)}function vs(e){return e.silent?` > /dev/null`:``}const ys=new class{buildImage(e,n){let r=e.dockerPackageJson.scripts?.[`docker/build/prepare`]?`YARN run docker/build/prepare && `:``,i=e.env.MISE_AGE_KEY?`
|
|
91
|
+
`;try{e.writeFileSync(r,s),console.info(`Generated ${r}`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to write ${r}: ${t}`,{cause:e})}}function Bo(e,t){return t===`prisma`?`prisma/restored.sqlite3`:`drizzle/restored.sqlite3`}function Vo(e,t){if(t===`prisma`)return`prisma/mount/prod.sqlite3`;let n=_t(e);if(!n)throw Error(`wb db create-litestream-config for Drizzle requires file: DATABASE_URL.`);return n}async function X(e,t){let n=await G(e);n||(console.error(p.red(`No project found.`)),process.exit(1));let r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!!e&&(!t||e.orm===t));return r.length===0&&(console.error(p.red(t?`No ${t} project found.`:`No supported database ORM project found.`)),process.exit(1)),r}function Z(e){return e===`prisma`?dr:An}function*Q(e,t){let n=new Map(t.map(e=>[e.project,e]));for(let r of aa(e,t.map(({project:e})=>e))){let e=n.get(r);if(!e)throw Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function Ho(e,t=[]){let n=[],r=Object.keys(Ye),i=Object.values(Ye).flatMap(e=>`alias`in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),a=new Set([...t,...r,...i,`--`,`_`,`$0`]);for(let[t,r]of Object.entries(e))if(!a.has(t)){let i=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(i!==t&&e[i]!==void 0)continue;if(typeof r==`boolean`&&r)n.push(`--${t}`);else if(typeof r==`string`||typeof r==`number`)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(let e of r)n.push(`--${t}`,String(e))}let o=Array.isArray(e[`--`])?e[`--`].map(String):[];return V([...n,...o])}const Uo=new Set([`CI`]),Wo=[`RAILWAY_`,`NIXPACKS_`];function Go(e){return Uo.has(e)||Wo.some(t=>e.startsWith(t))}function Ko(e){return new Set(e.filter(([e])=>!e.startsWith(`mise env`)).flatMap(([,e])=>e))}function qo(e){return Object.entries(e).filter(e=>{let[t,n]=e;return typeof n==`string`&&n!==``&&!Go(t)}).toSorted(([e],[t])=>e.localeCompare(t))}const Jo={command:`railway-env`,describe:`Sync the environment variables declared for the current WB_ENV (resolved from fnox/.env) to the Railway service, keeping fnox the single source of truth. Railway-managed keys (RAILWAY_*, NIXPACKS_*, CI) are never pushed.`,builder:e=>e,async handler(e){let t=W(e);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=t.env.WB_ENV;(!n||n===`development`||n===`test`)&&(console.error(p.red(`WB_ENV must name a deploy environment (e.g. staging or production), but is ${n}.`)),process.exit(1));let[r,i]=re(e,t.dirPath,{ignoreProcessEnv:!0}),a=Ko(i);for(let e of Object.keys(r))a.has(e)||delete r[e];for(let e of[...Rn(t),`WB_ENV`,`NEXT_PUBLIC_WB_ENV`]){let n=t.env[e];r[e]===void 0&&n!==void 0&&(r[e]=n)}for(let e of Object.keys(r)){let n=t.env[e];n!==void 0&&(r[e]=n)}let o=qo(r);if(o.length===0){console.info(p.yellow(`No environment variables to sync to Railway.`));return}let s=o.map(([e])=>e);if(e.dryRun){console.info(p.cyan(`Would sync ${o.length} variable(s) to Railway (${n}): ${s.join(`, `)}`));return}let c=[`--skip-deploys`];process.env.RAILWAY_PROJECT_ID&&c.push(`--project=${process.env.RAILWAY_PROJECT_ID}`),process.env.RAILWAY_SERVICE_ID&&c.push(`--service=${process.env.RAILWAY_SERVICE_ID}`),c.push(`--environment=${n}`);let l=o.flatMap(([e,t])=>[`--set`,`${e}=${t}`]),u=await L(`bunx`,[`@railway/cli`,`variables`,...c,...l],{cwd:t.dirPath,env:process.env,stdio:`pipe`,killOnExit:!0});u.status!==0&&(console.error(p.red(`Failed to sync environment variables to Railway (exit ${u.status}). Keys: ${s.join(`, `)}`)),process.exit(u.status??1)),console.info(p.green(`Synced ${o.length} variable(s) to Railway (${n}): ${s.join(`, `)}`))}},Yo={command:`release [args..]`,describe:"Run semantic-release (or multi-semantic-release) so that repositories using Bun isolated installs can publish to npm: reinstall with the hoisted linker (npm cannot walk Bun's isolated node_modules layout), rewrite `workspace:` ranges npm cannot parse, run the release, then restore the modified files. Extra arguments (e.g. `--debug`, after `--`) are forwarded to the release command.",builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await Xo(e)}};async function Xo(e,n){let r=yt(e,!1,n);r||(console.error(p.red(`No project found.`)),process.exit(1));let i=r.root,a=new Map,o,s={current:void 0},c=e=>{o=e;try{s.current?.pid&&I(s.current.pid,e)}catch(t){console.error(p.red(`Failed to terminate the release child process tree: ${String(t)}`)),s.current?.kill(e)}},l=[`SIGINT`,`SIGTERM`];for(let e of l)process.on(e,c);let u=0,d=!1;try{if(await Qo(i)?await ns(i,e,a,s):console.info(p.cyan(`Skipping the hoisted reinstall because the semantic-release configuration does not include @semantic-release/npm.`)),o)throw Error(`Aborted by ${o} before running the release.`);u=await fs(i,e,s),d=u===0}catch(e){console.error(p.red(String(e instanceof Error?e.message:e))),u=1}finally{let e=[];for(let[t,n]of a)as(t,n,d)&&e.push(t);e.length>0&&console.info(p.cyan(`Restored ${e.map(e=>t.relative(i.dirPath,e)).join(`, `)}.`)),[...a.keys()].some(e=>t.basename(e)===`bunfig.toml`)&&!Je(i.env.CI)&&console.info(p.yellow("node_modules now uses the hoisted layout; run a clean reinstall (`rm -rf node_modules packages/*/node_modules && bun install`) to restore the isolated layout."));for(let e of l)process.off(e,c)}if(o){process.kill(process.pid,o);return}u!==0&&process.exit(u)}async function Zo(e,t,n,i){return await new Promise(a=>{let o=r.spawn(t,n,i);e.current=o,o.on(`error`,t=>{e.current=void 0,console.error(p.red(String(t))),a(1)}),o.on(`exit`,t=>{e.current=void 0,a(t??1)})})}async function Qo(e){let t=ts(e.dirPath,e.packageJson);if(!Array.isArray(t)||$o(t))return!0;for(let t of await St(e)){let e=ts(t,void 0);if(e===`unknown`||Array.isArray(e)&&$o(e))return!0}return!1}function $o(e){return e.some(e=>(Array.isArray(e)?e[0]:e)===`@semantic-release/npm`)}const es=[{fileName:`.releaserc`,jsonParseable:!0},{fileName:`.releaserc.json`,jsonParseable:!0},{fileName:`.releaserc.yaml`,jsonParseable:!1},{fileName:`.releaserc.yml`,jsonParseable:!1},{fileName:`.releaserc.js`,jsonParseable:!1},{fileName:`.releaserc.ts`,jsonParseable:!1},{fileName:`.releaserc.mjs`,jsonParseable:!1},{fileName:`.releaserc.cjs`,jsonParseable:!1},{fileName:`.config/releaserc`,jsonParseable:!0},{fileName:`.config/releaserc.json`,jsonParseable:!0},{fileName:`.config/releaserc.yaml`,jsonParseable:!1},{fileName:`.config/releaserc.yml`,jsonParseable:!1},{fileName:`.config/releaserc.js`,jsonParseable:!1},{fileName:`.config/releaserc.ts`,jsonParseable:!1},{fileName:`.config/releaserc.mjs`,jsonParseable:!1},{fileName:`.config/releaserc.cjs`,jsonParseable:!1},{fileName:`release.config.js`,jsonParseable:!1},{fileName:`release.config.ts`,jsonParseable:!1},{fileName:`release.config.mjs`,jsonParseable:!1},{fileName:`release.config.cjs`,jsonParseable:!1}];function ts(n,r){if(r===void 0)try{r=JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`))}catch{r=void 0}let i=r?.release;if(i===void 0)for(let{fileName:r,jsonParseable:a}of es){let o=t.join(n,r);if(e.existsSync(o)){if(!a)return`unknown`;try{i=JSON.parse(e.readFileSync(o,`utf8`))}catch{return`unknown`}break}}if(!(!i||typeof i!=`object`))return Array.isArray(i.plugins)?i.plugins:i.extends===void 0?void 0:`unknown`}async function ns(n,r,i,a){let o=t.join(n.dirPath,`bunfig.toml`),s=e.existsSync(o)?e.readFileSync(o,`utf8`):void 0,c=s===void 0?void 0:os(s);if(s!==void 0&&c!==s&&(console.info(p.cyan(`Clean-reinstalling with the hoisted linker so npm can walk node_modules...`)),!r.dryRun)){i.set(o,Buffer.from(s,`utf8`));for(let r of[`bun.lock`,`bun.lockb`]){let a=t.join(n.dirPath,r);i.set(a,e.existsSync(a)?e.readFileSync(a):void 0)}e.writeFileSync(o,c??``,`utf8`);let r=[n.dirPath,...await St(n)].map(e=>t.join(e,`node_modules`));for(let t of r)e.rmSync(t,{force:!0,recursive:!0});if(await Zo(a,`bun`,[`install`,`--ignore-scripts`],{cwd:n.dirPath,env:n.env,stdio:`inherit`})!==0)throw Error(`bun install failed while preparing the release.`);for(let t of r)e.rmSync(t,{force:!0,recursive:!0});if(await Zo(a,`bun`,[`install`],{cwd:n.dirPath,env:is(n.env),stdio:`inherit`})!==0)throw Error(`bun install failed while replaying lifecycle scripts for the release.`)}let l=await St(n);for(let a of[n.packageJsonPath,...l.map(e=>t.join(e,`package.json`))]){if(!e.existsSync(a))continue;let o=e.readFileSync(a,`utf8`);r.dryRun||i.set(a,Buffer.from(o,`utf8`));let s=ss(o);s!==o&&(console.info(p.cyan(`Rewriting workspace: ranges in ${t.relative(n.dirPath,a)}...`)),r.dryRun||e.writeFileSync(a,s,`utf8`))}}const rs=[`VERDACCIO_TOKEN`,`NPM_TOKEN`,`NODE_AUTH_TOKEN`,`GITHUB_TOKEN`,`GH_TOKEN`,`GH_PACKAGES_TOKEN`,`GH_PKG_READ_TOKEN`,`FNOX_AGE_KEY`];function is(e){let t={...e};for(let e of rs)e in t&&(t[e]=``);return t}function as(n,r,i){if(r===void 0){let t=e.existsSync(n);return e.rmSync(n,{force:!0}),t}if(i&&t.basename(n)===`package.json`&&e.existsSync(n)){let t=e.readFileSync(n,`utf8`),i=r.toString(`utf8`);if(t!==ss(i)){let r=cs(t,i);return r===t?!1:(e.writeFileSync(n,r,`utf8`),!0)}}return(e.existsSync(n)?e.readFileSync(n):void 0)?.equals(r)?!1:(e.writeFileSync(n,r),!0)}function os(e){return e.replace(/^(\s*linker\s*=\s*)["']isolated["']/mu,`$1"hoisted"`).replace(/^\s*globalStore\s*=\s*true[^\n]*\n?/mu,``)}function ss(e){return ls(e,e=>e.replaceAll(/("[^"\n]+"\s*:\s*)"workspace:[^"]*"/gu,`$1"*"`))}function cs(e,t){let n=us(t);return ls(e,(e,t)=>{let r=e;for(let{section:e,name:i,specifier:a}of n)e===t&&(r=r.replaceAll(RegExp(`("${ds(i)}"\\s*:\\s*)"[^"]*"`,`gu`),(e,t)=>`${t}${JSON.stringify(a)}`));return r})}function ls(e,t){return e.replaceAll(/("(dependencies|devDependencies|optionalDependencies|peerDependencies)"\s*:\s*\{)([^{}]*)(\})/gu,(e,n,r,i,a)=>`${n}${t(i,r)}${a}`)}function us(e){let t;try{t=JSON.parse(e)}catch{return[]}let n=[];for(let e of[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`])for(let[r,i]of Object.entries(t[e]??{}))typeof i==`string`&&i.startsWith(`workspace:`)&&n.push({section:e,name:r,specifier:i});return n}function ds(e){return e.replaceAll(/[$()*+.?[\\\]^{|}]/g,String.raw`\$&`)}async function fs(n,r,i){let a=[...r.args??[],...r[`--`]??[]].map(String),o=[`@anolilab/multi-semantic-release`,`multi-semantic-release`,`@qiwi/multi-semantic-release`].find(e=>n.packageJson.devDependencies?.[e]),s=o?`multi-semantic-release`:`semantic-release`,c={...n.env};qe(n.dirPath,c);let l=e.existsSync(t.join(n.dirPath,`node_modules`,`.bin`,s)),u=o??`semantic-release`,d=l?[s,...a]:n.packageManagerCommand===`bun`?[`bunx`,u,...a]:[`yarn`,`dlx`,u,...a];return console.info(p.cyan(`Running: ${d.join(` `)}`)),r.dryRun?0:await Zo(i,d[0],d.slice(1),{cwd:n.dirPath,env:c,stdio:`inherit`})}const ps={command:`retry [command] [args...]`,describe:`Retry the given command until it succeeds`,builder:{retry:{description:`A maximum retry count`,type:`number`,alias:`r`,default:3}},async handler(e){let t=W(e);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean),r=0;for(let i=0;i<e.retry;i++)if(i>0&&console.info(`\n${p.yellow(`#${i} Retrying: ${n.join(` `)}`)}`),r=await K(n.join(` `),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),r===0)return;process.exit(r)}},ms={command:`setup`,describe:`Setup development environment. .env files are ignored.`,builder:{},async handler(e){await hs(e)}};async function hs(e,t){let n=await G(e,!1,t);n||(console.error(p.red(`No project found.`)),process.exit(1));for(let t of aa(`setup`,n.descendants)){let i=await b.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root&&(h.platform()===`darwin`&&await q(`brew install ${[`pstree`].join(` `)}`,t,e),i.some(e=>e.isFile()&&(e.name===`mise.toml`||e.name.includes(`-version`)))&&await K(`mise install`,t,e,{exitIfFailed:!1})),i.some(e=>e.isFile()&&e.name===`pyproject.toml`)){await q(`poetry config virtualenvs.in-project true`,t,e);let n=``;try{n=r.execSync(`mise which python`,{cwd:t.dirPath,stdio:[`ignore`,`pipe`,`ignore`]}).toString().trim()}catch{}n&&await q(`poetry env use ${`'${n.replaceAll(`'`,String.raw`'\''`)}'`}`,t,e),await Bt.promiseAll(),await K(`poetry run pip install --upgrade pip`,t,e),await K(`poetry install --ansi`,t,e)}(t===n.root||!n.root.packageJson.scripts?.[`gen-code`])&&t.packageJson.scripts?.[`gen-code`]&&await K(`${t.packageManagerRunCommand} gen-code`,t,e)}let i=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);i&&await K(`${i.packageManagerRunCommand} playwright install --with-deps`,i,e)}const gs={watch:{description:`Whether to watch files`,type:`boolean`},args:{description:`Arguments for core command`,type:`array`,alias:`a`,default:[]},"docker-options":{description:`Arguments for "docker run"`,type:`array`,default:[]}};function _s(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e[`--`]??[]].map(e=>H(String(e))).join(` `),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>H(String(e))).join(` `)}function vs(e){return e.silent?` > /dev/null`:``}const ys=new class{buildImage(e,n){let r=e.dockerPackageJson.scripts?.[`docker/build/prepare`]?`YARN run docker/build/prepare && `:``,i=e.env.MISE_AGE_KEY?`
|
|
92
92
|
--secret id=mise_age_key,env=MISE_AGE_KEY`:``;return`cd ${t.dirname(e.findFile(`Dockerfile`))}
|
|
93
93
|
&& ${r}YARN wb optimizeForDockerBuild --outside
|
|
94
94
|
&& YARN wb retry -- docker build -t ${e.dockerImageName}
|
|
95
95
|
--build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)
|
|
96
96
|
--build-arg WB_ENV=${e.env.WB_ENV}
|
|
97
|
-
--build-arg WB_VERSION=${n}${i} .`}stopAndStart(e,t=``,n=``){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t=``,n=``){
|
|
97
|
+
--build-arg WB_VERSION=${n}${i} .`}stopAndStart(e,t=``,n=``){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t=``,n=``){xi(this.stop(e),e);let r=n.includes(`/bin/bash`),i=e.env.MISE_AGE_KEY?`--env MISE_AGE_KEY `:``;return`docker run --rm ${r?`-it `:``}${i}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`docker rm -f ${e.dockerImageName} > /dev/null 2>&1 || true`}stopAll(){return`true $(docker rm -f $(docker ps -q) 2> /dev/null)`}};var bs=class{shouldWaitAndOpenApp;constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return ys.buildImage(e,t)}async startDev(e,t){return await li(e.env.PORT,e),this.shouldWaitAndOpenApp?V([`YARN`,`wb`,`concurrently`,...Xe(t),`--kill-others-on-fail`,this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await li(e.env.PORT,e),this.shouldWaitAndOpenApp?V([`YARN`,`wb`,`concurrently`,...Xe(t),`--kill-others-on-fail`,this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await li(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await li(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,`development`)}
|
|
98
98
|
&& ${V([`YARN`,`wb`,`concurrently`,...Xe(t),`--kill-others-on-fail`,ys.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,`development`)}
|
|
99
|
-
&& ${ys.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`}startProductionProtected(e,n){let r=xs(e);if(r){let i=`${V([`bash`,r])} ${n.normalizedArgsText??``}`.trim(),a=t.dirname(t.dirname(r));return this.buildProductionCommand(e,n,[e.buildCommand,a===e.dirPath?i:`(${V([`cd`,a])} && ${i})`])}let i=Ss(e),a=i?[e.buildCommand,`pm2-runtime start --no-autorestart ${i}`]:this.buildDefaultProductionStartCommands(e,n);return this.buildProductionCommand(e,n,a)}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`${e.isBunAvailable?`bun`:`node`} dist/index.js ${t.normalizedArgsText??``}`.trim()]}buildProductionCommand(e,t,n){let r=vt(e,`test`)&&U(e)?[`rm -Rf "${st(e)}"`]:[],i=!!at(e);return[...[...r,...e.hasPrisma?[
|
|
100
|
-
&& ${a}`])}buildPlaywrightOnlyCommand(e,t,{forwardedPlaywrightArgs:n=[],playwrightArgs:r=[`test`,`test/e2e/`]}){let i=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``;return`${Cs(r,t.targets,t.bail,n)}${i}`}testUnit(e,t){let n=t.targets?.map(String);return e.hasVitest?V([`YARN`,`vitest`,`run`,...n?.length?n:[`test/unit/`],`--passWithNoTests`,`--allowOnly`,`--watch=false`,...t.bail?[`--bail=1`]:[]]):e.isBunAvailable?V([`bun`,`test`,...n?.length?n:[`test/unit/`],...t.bail?[`--bail`]:[]]):`echo "No tests."`}waitApp(e){let t=e.env.PORT;return`${
|
|
101
|
-
|| ${
|
|
102
|
-
|| ${
|
|
103
|
-
|| ${
|
|
104
|
-
|| ${
|
|
105
|
-
|| ${
|
|
106
|
-
|| ${Q(t,`-t 90000 -i 10000`)}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || ${Q(t)} && open-cli http://\${HOST:-localhost}:${t}`}};function Q(e,t){return`NO_PROXY=localhost no_proxy=localhost wait-on ${t?`${t} `:``}http-get://localhost:${e}`}function xs(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function Ss(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function Cs(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return ws([...i,...e,...r],n);let o=e.slice(1),s=Ts(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return ws([...i,`test`,...a,...c,...r],n)}function ws(e,t){let n=e.indexOf(`playwright`),r=n!==-1&&e[n+1]===`test`;return!t||!r||e.some(e=>e===`--max-failures`||e.startsWith(`--max-failures=`))?V(e):V([...e,`--max-failures=1`])}function Ts(e){let t,n=[];for(let[r,i]of e.entries()){if(t){if(t===`required`||!i.startsWith(`-`)){t=void 0;continue}t=void 0}if(i===`--`)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(i.startsWith(`--`)){if(i.includes(`=`))continue;Es.has(i)?t=`required`:Ds.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&Os.has(e)&&(t=`required`);continue}n.push(r)}return n}const Es=new Set([`--browser`,`--config`,`--grep`,`--grep-invert`,`--global-timeout`,`--max-failures`,`--output`,`--project`,`--repeat-each`,`--reporter`,`--retries`,`--shard`,`--test-list`,`--test-list-invert`,`--timeout`,`--trace`,`--tsconfig`,`--ui-host`,`--ui-port`,`--ui-title`,`--workers`]),Ds=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),Os=new Set([`-c`,`-g`,`-j`]);var ks=class extends bs{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);e.env.PORT||=`3000`;let i=await ui(e.env.PORT,e),a=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,o=t.targets?.map(String),s=o?.length?o:[`test/e2e/`],c=this.testUnit(e,{...t,targets:s});return V([`YARN`,`wb`,`concurrently`,...Xe(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`${Q(i,`-t 600000 -i 2000`)} && ${c}${a}`])}};const As=new ks,js=new class extends bs{constructor(){super(!0)}startDevProtected(e,t){return`YARN next dev --turbopack ${t.normalizedArgsText??``}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??``}`.trim()]}},Ms=new class extends bs{constructor(){super(!1)}startDevProtected(e,t){throw Error(`This method should not be called.`)}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${e.isBunAvailable?`bun run`:`node`} dist/index.js ${t.normalizedArgsText??``} | tee server.log`)}startTest(){return Promise.resolve(`echo 'do nothing.'`)}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,`development`)} && ${ys.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(e,t,n){return this.testE2EWithPlaywrightManagedServer(e,t,n)}testE2EProduction(e,t,n){return this.testE2EWithPlaywrightManagedServer(e,t,n)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testE2EWithPlaywrightManagedServer(e,t,n){return Promise.resolve(e.hasPlaywrightWebServerConfig?this.buildPlaywrightOnlyCommand(e,t,n):`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},Ns=new class extends bs{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[et(t,`.dev.vars`)],i=vt(e,`test`)?nt(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=nt(e);return[e.buildCommand,et(t,`dist/server/.dev.vars`),...r?[r]:[],tt(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${st(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},Ps=new class extends bs{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??``}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??``}`.trim()}},Fs=new class extends ks{startDevProtected(e,t){return this.buildWranglerDevCommands(e,t).join(` && `)}buildDefaultProductionStartCommands(e,t){return this.buildWranglerDevCommands(e,t)}buildWranglerDevCommands(e,t){e.env.PORT||=`8787`;let n=st(e),r=[et(t,`.dev.vars`)],i=nt(e);return i&&r.push(i),r.push(tt(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}},Is=[`express`,`fastify`,`elysia`,`hono`],Ls={...gs,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},Rs={command:`start [args..]`,describe:`Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0`,builder:e=>e.parserConfiguration({"populate--":!0}).options(Ls),async handler(e){_s(e);let t=await G(e);t||(console.error(p.red(`No project found.`)),process.exit(1));for(let n of t.descendants){let t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{},i;if(t.vinext||r.vinext)i=Ns;else if(t.next)i=js;else if(r.vite)i=Ps;else if(U(n))i=Fs;else if(Is.some(e=>t[e])&&!t[`firebase-functions`]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=As;else if(t[`build-ts`]||r[`build-ts`])i=Ms;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await K(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await K(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await K(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await K(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await K(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},zs=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),Bs=.05,Vs={e2e:{description:`How to run E2E tests`,type:`string`,choices:[`headless`,`headless-dev`,`headed`,`headed-dev`,`docker`,`docker-debug`,`debug`,`generate`,`trace`],default:`headless`},silent:{description:`Reduce redundant outputs`,type:`boolean`},bail:{description:`Stop tests after the first failure`,type:`boolean`},"unit-timeout":{description:`Timeout for unit tests`,type:`number`}},Hs={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},Us={command:`test [targets...]`,describe:`Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'`,builder:e=>e.parserConfiguration({"populate--":!0}).options(Vs).positional(`targets`,Hs.targets),async handler(e){process.exit(await Ws(e))}};async function Ws(n,r={}){let i=Ks(n),a=await G(i);if(!a)return console.error(p.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=nc(o,s);for(let n of a.descendants){n.env;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d;d=a.vinext||u.vinext?Ns:a.next?js:u.vite?Ps:U(n)?Fs:Is.some(e=>a[e])&&!a[`firebase-functions`]?As:Ms,console.info(`Running "test" for ${n.name} ...`);let f=qs(n);if(l&&f!==!1){let e=o.filter(e=>e.includes(`/unit`)),t=e.length>0?e:f.length>0?f:void 0,a={...i,targets:t},s=await Ys(d.testUnit(n,a),n,i,{exitIfFailed:r.exitIfFailed,timeout:i.unitTimeout});if(s!==0)return s}if(!c||!e.existsSync(t.join(n.dirPath,`test`,`e2e`))){c&&Gs(n);continue}let p=o.filter(e=>e.includes(`/e2e`)),m={...i,targets:p.length>0?p:void 0};switch(i.e2e){case`headless`:{let e=await $(await d.testE2EProduction(n,m,{playwrightArgs:tc(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await $(await d.testE2EDev(n,m,{playwrightArgs:tc(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await Js(n,m,d,tc(p,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await Js(n,m,d,tc(p,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.next||u.vite)switch(i.e2e){case`headed`:{let e=await $(await d.testE2EProduction(n,m,{playwrightArgs:tc(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await $(await d.testE2EDev(n,m,{playwrightArgs:tc(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await $(await d.testE2EProduction(n,m,{playwrightArgs:tc(p,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await $(await d.testE2EProduction(n,m,{playwrightArgs:[`codegen`,`http://localhost:${n.env.PORT}`]}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`trace`:{let e=await $(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function Gs(n){n.packageJson.workspaces||e.existsSync(t.join(n.dirPath,`playwright.config.ts`))&&console.warn(p.yellow(`Skipping e2e tests for ${n.name}: a Playwright config exists but the test/e2e directory is missing. wb only discovers Playwright specs under test/e2e/, so move them there to run e2e tests.`))}function Ks(e){return e.env?.length||e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?{...e,commandDefaultWbEnv:`test`}:{...e,cascadeEnv:`test`}}function qs(n){return e.existsSync(t.join(n.dirPath,`test`,`unit`))?[]:n.hasVitest&&e.existsSync(t.join(n.dirPath,`test`))?e.existsSync(t.join(n.dirPath,`test`,`e2e`))?[`test`,`--exclude`,`test/e2e/**`]:[`test`]:!1}async function Js(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await K(`${n.buildDocker(e,`test`)}${vs(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await $(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await K(ys.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function $(e,t,n,r={}){return K(e,t,n,{...r,processSilentOutput:Xs})}function Ys(e,t,n,r={}){return K(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function Xs(e){let t=[],n=new Set,r=[];for(let i of Zs(e)){let e=$s(i);n.has(e)||t.some(t=>ec(t,e))||(Qs(t,n,e),r.push(i))}return r.join(`
|
|
107
|
-
`)}function*
|
|
108
|
-
`,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function
|
|
109
|
-
No type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.`:`No type errors found.`)),s}function
|
|
110
|
-
`+p.cyan(p.bold(`Start:`),e));let r=await t()??0;return r===0||n.allowFailure?n.silent||console.info(p.green(p.bold(`Finished:`),e)):(console.info(p.red(p.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function
|
|
111
|
-
`))}function
|
|
112
|
-
`+p.cyan(p.bold(`Command:`),e)+p.gray(` at ${t}`))}function
|
|
113
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsInQiLCJpIiwibyIsIm4iLCJyIiwiYSIsIm4iLCJyIiwibiIsInQiLCJlIiwiYnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYXJndW1lbnRzQnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUiLCJERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgiLCJidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZCIsImdldExpdGVzdHJlYW1Db25maWdPcHRpb24iLCJwYXJzZSIsInBhcnNlRG90ZW52IiwiZGVwbG95Q29tbWFuZCIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZnMiLCJzZXRUaW1lb3V0IiwiYnVpbGRlciIsInNldFRpbWVvdXQiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwidG9VbnNjb3BlZFBhY2thZ2VOYW1lIiwiYnVpbGRlciIsImlzRG9ja2VyRW5hYmxlZCIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZnMiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiYnVpbGRlciIsImRlcGxveUNvbW1hbmQiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9iaW5QYXRoLnRzIiwiLi4vc3JjL3V0aWxzL2NpLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL3V0aWxzL3dyYW5nbGVyLnRzIiwiLi4vc3JjL3Byb2plY3QudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy9zY3JpcHRzL3J1bi50cyIsIi4uL3NyYy9jb21tYW5kcy9jb25jdXJyZW50bHkudHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5EZXZWYXJzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2RlcGxveS50cyIsIi4uL3NyYy9jb21tYW5kcy9kb3RlbnYudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkNvZGUudHMiLCIuLi9zcmMvY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLnRzIiwiLi4vc3JjL3V0aWxzL291dHB1dC50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy9jb21tYW5kcy9tYWludGVuYW5jZS50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUmVnaXN0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JhaWx3YXlFbnYudHMiLCIuLi9zcmMvY29tbWFuZHMvcmVsZWFzZS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2J1aWxkZXIudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3V0aWxzL2xvZy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9odHRwU2VydmVyUGFja2FnZXMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0T25DaS50cyIsIi4uL3NyYy9jb21tYW5kcy90cmVlS2lsbC50cyIsIi4uL3NyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyaWZ5Q29kZS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIG5hcmdzOiAxLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICAncXVpZXQtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3VwcHJlc3MgLmVudiBmaWxlIGxvYWRpbmcgaW5mb3JtYXRpb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+ICYge1xuICAvKipcbiAgICogQ29tbWFuZC1sZXZlbCBmYWxsYmFjayBmb3IgYW4gdW5zZXQgV0JfRU5WIChlLmcuIGB3YiB0ZXN0YCBzdXBwbGllcyAndGVzdCcgd2hlbiBleHBsaWNpdCBlbnZcbiAgICogZmxhZ3Mgc3VwcHJlc3MgaXRzIGRlZmF1bHQgdGVzdCBjYXNjYWRlKS4gTm90IGEgQ0xJIGZsYWcuXG4gICAqL1xuICBjb21tYW5kRGVmYXVsdFdiRW52Pzogc3RyaW5nO1xufTtcblxuY29uc3Qgc3RhbmRhcmRXYkVudk1vZGVzID0gbmV3IFNldChbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBXQl9FTlYgdmFsdWUgd2IgZmFsbHMgYmFjayB0byB3aGVuIG5vIGVudiBzb3VyY2UgYW5kIG5vIGV4cG9ydGVkIHZhcmlhYmxlIGRlZmluZXNcbiAqIGl0OiB0aGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGZpcnN0IChgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgIGxvYWRzIHRoZSBzdGFnaW5nIGZpbGVzXG4gKiBidXQgaXRzIHRlc3RzIG11c3Qgc3RpbGwgcnVuIGFzIGB0ZXN0YCwgbWlycm9yaW5nIHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKSwgdGhlbiB0aGVcbiAqIGZvcmNlZCBjYXNjYWRlLCB0aGVuIHRoZSBhbWJpZW50LU5PREVfRU5WLWRyaXZlbiBhdXRvIGNhc2NhZGUgY2xhbXBlZCB0byBhIHN0YW5kYXJkIG1vZGUgKGFcbiAqIG5vbi1zdGFuZGFyZCBOT0RFX0VOViBzdWNoIGFzIGBxYWAgc3RpbGwgc2VsZWN0cyB0aGUgY2FzY2FkZSBzdWZmaXgsIGJ1dCBtdXN0IG5vdCBwcm9kdWNlIGFcbiAqIG5vbi1zdGFuZGFyZCBXQl9FTlYpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZyB7XG4gIGlmIChhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnYpIHJldHVybiBhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnY7XG4gIGlmIChhcmd2LmNhc2NhZGVFbnYpIHJldHVybiBhcmd2LmNhc2NhZGVFbnY7XG4gIC8vIFJlYWQgTk9ERV9FTlYgdGhyb3VnaCB0aGUgYWxpYXMgZm9yIHRoZSBzYW1lIGJ1bmRsZXItaW5saW5pbmcgcmVhc29uIGFzIGluXG4gIC8vIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgYW5kIGZyb20gdGhlIEFNQklFTlQgZW52aXJvbm1lbnQgKG5vdCBsb2FkZWQgZmlsZXMpIGJlY2F1c2UgdGhlXG4gIC8vIGNhc2NhZGUgc2VsZWN0aW9uIGJlbG93IHVzZXMgdGhlIGFtYmllbnQgdmFsdWUgYXMgd2VsbC5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBkZXJpdmVkID1cbiAgICBhcmd2LmNhc2NhZGVOb2RlRW52IHx8IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogJ2RldmVsb3BtZW50JztcbiAgcmV0dXJuIHN0YW5kYXJkV2JFbnZNb2Rlcy5oYXMoZGVyaXZlZCkgPyBkZXJpdmVkIDogJ2RldmVsb3BtZW50Jztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyTmFtZXNdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgLyoqXG4gICAgICogTG9hZCB2YXJpYWJsZXMgZXZlbiBpZiB0aGV5IGFscmVhZHkgZXhpc3QgaW4gcHJvY2Vzcy5lbnYuXG4gICAgICogVXNlZnVsIHdoZW4gYSBwYXJlbnQgcHJvY2VzcyBoYXMgYWxyZWFkeSBpbmplY3RlZCB0aGUgLmVudiB2YWx1ZXMgaW50byB0aGUgZW52aXJvbm1lbnRcbiAgICAgKiBhbmQgdGhlIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXMgdGhlbXNlbHZlcyBhcmUgbmVlZGVkIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKS5cbiAgICAgKi9cbiAgICBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBFeHBhbmQgYCR7V0JfRU5WfWAgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBmYWxsYmFjayBtb2RlIHdoZW4gbm90aGluZyBkZWZpbmVzIFdCX0VOVi5cbiAgICAgKiBPbmx5IGZvciBjYWxsZXJzIHRoYXQgc3Vic2VxdWVudGx5IENPTVBMRVRFIFdCX0VOViB3aXRoIHRoYXQgZmFsbGJhY2sgKHdiJ3MgUHJvamVjdC5lbnYpLlxuICAgICAqL1xuICAgIGV4cGFuZEZhbGxiYWNrV2JFbnY/OiBib29sZWFuO1xuICB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICAvLyBSZWFkIE5PREVfRU5WIHRocm91Z2ggYW4gYWxpYXMsIG5ldmVyIGFzIHRoZSBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIG1lbWJlciBleHByZXNzaW9uOlxuICAvLyBidW5kbGVycyByZXBsYWNlIHRoYXQgZXhhY3QgZXhwcmVzc2lvbiBhdCBidWlsZCB0aW1lIChyb2xsZG93bi9idWlsZC10cyBpbmxpbmUgaXQgYXNcbiAgLy8gJ3Byb2R1Y3Rpb24nKSwgd2hpY2ggY29uc3RhbnQtZm9sZHMgdGhlIGZhbGxiYWNrIGJlbG93IGFuZCBtYWRlIHRoZSBwdWJsaXNoZWQgd2Igc2VsZWN0XG4gIC8vIHRoZSBwcm9kdWN0aW9uIHByb2ZpbGUgd2hlbmV2ZXIgV0JfRU5WIHdhcyB1bnNldC5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHJ1bnRpbWVFbnYuV0JfRU5WIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGNvbnN0IHNob3VsZFN1cHByZXNzT3V0cHV0ID0gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtydW50aW1lRW52LldCX0VOVn0sIE5PREVfRU5WOiAke3J1bnRpbWVFbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIGNhbGxlciBleHBsaWNpdGx5IGZvcmNlcyBhIG1vZGUgKC0tY2FzY2FkZS1lbnYgLyAtLWNhc2NhZGUtbm9kZS1lbnYgLyBhbiBleHBvcnRlZFxuICAvLyBXQl9FTlYpLCB2YWx1ZXMgdGhhdCB0aGUgbW9kZSdzIG93biBlbnYgZmlsZXMgZGVmaW5lIG11c3Qgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZCBmcm9tXG4gIC8vIHRoZSBwYXJlbnQgc2hlbGw6IGEgc3RhbGUgYGV4cG9ydCBEQVRBQkFTRV9VUkw9Li4uYCBmcm9tIGEgZGV2ZWxvcG1lbnQgc2hlbGwgbXVzdCBub3QgbGVha1xuICAvLyBpbnRvIGB3YiB0ZXN0YCdzIHRlc3QgbW9kZSAoY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuIE9uIENJIHRoZVxuICAvLyBpbmhlcml0ZWQgdmFyaWFibGVzIGtlZXAgd2lubmluZyDigJQgd29ya2Zsb3dzIGRlbGliZXJhdGVseSBpbmplY3QgZW52IHZhcnMgdGhhdCBvdmVycmlkZSB0aGVcbiAgLy8gY29tbWl0dGVkIGZpbGVzIOKAlCBhbmQgdGhhdCBzaGFkb3dpbmcgaXMgdGhlIGRlc2lnbmVkIGJlaGF2aW9yLCBzbyBubyB3YXJuaW5nIGlzIGVtaXR0ZWQuXG4gIGNvbnN0IG1vZGVJc0ZvcmNlZCA9IEJvb2xlYW4oXG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnYgPyBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCcgOiBhcmd2LmF1dG9DYXNjYWRlRW52ID8gcnVudGltZUVudi5XQl9FTlYgOiB1bmRlZmluZWQpXG4gICk7XG4gIGNvbnN0IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiA9IG1vZGVJc0ZvcmNlZCAmJiAhaXNDSUVudmlyb25tZW50KHJ1bnRpbWVFbnYuQ0kpO1xuICAvLyBPdmVycmlkZSBlbGlnaWJpbGl0eSBpcyBkZWNpZGVkIHBlciBLRVksIG5vdCBwZXIgZmlsZTogYC5lbnYubG9jYWxgIG91dHJhbmtzIGAuZW52Ljxtb2RlPmBcbiAgLy8gaW4gdGhlIGNhc2NhZGUsIHNvIG9uY2UgdGhlIG1vZGUgZGVmaW5lcyBhIGtleSwgdGhlIHZhbHVlIHdpbm5pbmcgdGhlIG5vcm1hbCBmaWxlIHByZWNlZGVuY2VcbiAgLy8gKHdoaWNoIG1heSBjb21lIGZyb20gYC5lbnYubG9jYWxgKSBtdXN0IGJlIHRoZSBvbmUgb3ZlcnJpZGluZyB0aGUgc2hlbGwuXG4gIGNvbnN0IG1vZGVTcGVjaWZpY0VudktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgaWYgKG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiB0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycgJiYgY2FzY2FkZS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgICBpZiAoZW52UGF0aC5lbmRzV2l0aChgLiR7Y2FzY2FkZX1gKSB8fCBlbnZQYXRoLmVuZHNXaXRoKGAuJHtjYXNjYWRlfS5sb2NhbGApKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIG1vZGVTcGVjaWZpY0VudktleXMuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKGtleSBpbiBlbnZWYXJzKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgaW5oZXJpdGVkVmFsdWUgPSBwcm9jZXNzLmVudltrZXldO1xuICAgICAgY29uc3Qgc2hhZG93ZWRCeVByb2Nlc3NFbnYgPSAhb3B0aW9ucz8uaWdub3JlUHJvY2Vzc0VudiAmJiBrZXkgaW4gcHJvY2Vzcy5lbnY7XG4gICAgICBpZiAoc2hhZG93ZWRCeVByb2Nlc3NFbnYgJiYgIShtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgJiYgbW9kZVNwZWNpZmljRW52S2V5cy5oYXMoa2V5KSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2hhZG93ZWRCeVByb2Nlc3NFbnYgJiYgaW5oZXJpdGVkVmFsdWUgIT09IHZhbHVlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFdhcm5pbmc6ICR7a2V5fSBpbiAke2VudlBhdGh9IG92ZXJyaWRlcyB0aGUgdmFsdWUgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBlbnZpcm9ubWVudCBiZWNhdXNlIHRoZSAke2Nhc2NhZGV9IGVudmlyb25tZW50IGlzIGV4cGxpY2l0bHkgZm9yY2VkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtlbnZQYXRoLCBrZXlzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQgJiYga2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtrZXlzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBbZm5veEVudlZhcnMsIGZub3hFbnZWYXJOYW1lc10gPSByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgY2FzY2FkZSwgZW52VmFycywge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52LFxuICB9KTtcbiAgT2JqZWN0LmFzc2lnbihlbnZWYXJzLCBmbm94RW52VmFycyk7XG4gIC8vIFJlcG9ydCB0aGUgZm5veCBzb3VyY2Ugd2hlbmV2ZXIgZm5veC50b21sIGV4aXN0cyDigJQgZXZlbiB3aGVuIGl0IHlpZWxkcyBubyBrZXlzIChhbGwgc2hhZG93ZWQsXG4gIC8vIGVtcHR5IHByb2ZpbGUsIG9yIGEgZmFpbGluZyBleHBvcnQpOiBjb25zdW1lcnMgc3VjaCBhcyB3YidzIHJlcXVpcmVkLWVudmlyb25tZW50IHZhbGlkYXRpb25cbiAgLy8gbXVzdCBzZWUgdGhhdCBhIGRlY2xhcmVkIGVudiBzb3VyY2UgZXhpc3RzIHJhdGhlciB0aGFuIHNpbGVudGx5IGZhaWxpbmcgb3Blbi5cbiAgaWYgKGZub3hFbnZWYXJOYW1lcy5sZW5ndGggPiAwIHx8IGhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZCkpIHtcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZm5veEVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKSwgZm5veEVudlZhck5hbWVzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2Zub3hFbnZWYXJOYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7Zm5veEVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKX1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW21pc2VFbnZWYXJzLCBtaXNlRW52VmFyTmFtZXNdID0gcmVhZE1pc2VFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIGVudlZhcnMsIG9wdGlvbnMpO1xuICBPYmplY3QuYXNzaWduKGVudlZhcnMsIG1pc2VFbnZWYXJzKTtcbiAgaWYgKG1pc2VFbnZWYXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW21pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSksIG1pc2VFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHttaXNlRW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke21pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmICghYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGBSZWFkIGVudiBmaWxlczogJHtlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMubWFwKChbZW52UGF0aCwga2V5c10pID0+IChrZXlzLmxlbmd0aCA+IDAgPyBgJHtlbnZQYXRofSAoJHtrZXlzLmpvaW4oJywgJyl9KWAgOiBlbnZQYXRoKSkuam9pbignLCAnKSB8fCAnbm90aGluZyd9YFxuICAgICk7XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpKTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSAmJiAhKGtleSBpbiBwcm9jZXNzLmVudikpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIC8vIEV4cGFuZCByZWZlcmVuY2VzIGFnYWluc3QgdGhlIGxpdmUgZW52aXJvbm1lbnQgZm9yIGtleXMgTk9UIGxvYWRlZCBmcm9tIGZpbGVzLCBzbyB0aGF0IGFcbiAgLy8gcmVmZXJlbmNlIHRvIGFuIGV4cG9ydGVkIGtleSAoZXhjbHVkZWQgZnJvbSBlbnZWYXJzIGJ5IHByb2Nlc3MtZW52IHByZWNlZGVuY2UpIHJlc29sdmVzIHRvXG4gIC8vIHRoZSBlZmZlY3RpdmUgdmFsdWUgaW5zdGVhZCBvZiBhbiBlbXB0eSBzdHJpbmcuIExvYWRlZCBrZXlzIGFyZSBkZWxpYmVyYXRlbHkgYWJzZW50IGZyb21cbiAgLy8gdGhlIHJlZmVyZW5jZSBzZXQ6IGRvdGVudi1leHBhbmQgd291bGQgb3RoZXJ3aXNlIHJlcGxhY2UgdGhlaXIgcGFyc2VkIHZhbHVlcyB3aXRoIHRoZVxuICAvLyBwcm9jZXNzIHZhbHVlcywgYnJlYWtpbmcgY2FsbGVycyB0aGF0IG5lZWQgdGhlIGZpbGUtZGVmaW5lZCB2YWx1ZXMgdGhlbXNlbHZlcy5cbiAgY29uc3QgcmVmZXJlbmNlRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KSkge1xuICAgIC8vIEVzY2FwZSBkb2xsYXIgc2lnbnMgc28gZG90ZW52LWV4cGFuZCBzdWJzdGl0dXRlcyBleHBvcnRlZCB2YWx1ZXMgbGl0ZXJhbGx5IGluc3RlYWQgb2ZcbiAgICAvLyByZWN1cnNpdmVseSByZS1leHBhbmRpbmcgdGhlbSAoYW4gZXhwb3J0ZWQgYHBhJHdvcmRgIG11c3Qgc3RheSBgcGEkd29yZGApLlxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICEoa2V5IGluIGVudlZhcnMpKSByZWZlcmVuY2VFbnZba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoJyQnLCBTdHJpbmcucmF3YFxcJGApO1xuICB9XG4gIC8vIGRvdGVudi1leHBhbmQgcmVzb2x2ZXMgcmVmZXJlbmNlcyBpbiBrZXktaW5zZXJ0aW9uIG9yZGVyLCBzbyBhIC5lbnYgdmFsdWUgcmVmZXJlbmNpbmcgYVxuICAvLyBmbm94L21pc2UtcHJvdmlkZWQga2V5IHdvdWxkIHNlZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGZub3gvbWlzZSBlbnRyaWVzIHN0YXllZCBhcHBlbmRlZFxuICAvLyBhZnRlciB0aGUgLmVudiBlbnRyaWVzLiBSZWJ1aWxkIHRoZSBleHBhbnNpb24gaW5wdXQgd2l0aCB0aGUgbG93ZXItcHJpb3JpdHkgc291cmNlcyBmaXJzdDtcbiAgLy8gdGhlIHZhbHVlcyB0aGVtc2VsdmVzIGFscmVhZHkgcmVmbGVjdCB0aGUgaW50ZW5kZWQgLmVudi1vdmVyLWZub3gtb3Zlci1taXNlIHByZWNlZGVuY2UuXG4gIGNvbnN0IG9yZGVyZWRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFsuLi5taXNlRW52VmFyTmFtZXMsIC4uLmZub3hFbnZWYXJOYW1lc10pIG9yZGVyZWRFbnZWYXJzW2tleV0gPSBlbnZWYXJzW2tleV0hO1xuICBPYmplY3QuYXNzaWduKG9yZGVyZWRFbnZWYXJzLCBlbnZWYXJzKTtcbiAgLy8gZXhwYW5kKCkgbXV0YXRlcyBCT1RIIGl0cyBwYXJzZWQgaW5wdXQgQU5EIHByb2Nlc3NFbnYgKGRvdGVudi1leHBhbmQgd3JpdGVzIGV2ZXJ5IHBhcnNlZFxuICAvLyByZXN1bHQgaW50byBwcm9jZXNzRW52KSwgc28gc25hcHNob3QgYm90aCBmb3IgdGhlIHJlLWV4cGFuc2lvbiBiZWxvdyDigJQgdGhlIHJldHJ5IG11c3Qgbm90XG4gIC8vIHNlZSB0aGUgZmlyc3QgcGFzcydzIHN0YWxlIGRlcGVuZGVudCB2YWx1ZXMuXG4gIGNvbnN0IHByZUV4cGFuc2lvbkVudlZhcnMgPSB7IC4uLm9yZGVyZWRFbnZWYXJzIH07XG4gIGNvbnN0IHByaXN0aW5lUmVmZXJlbmNlRW52ID0geyAuLi5yZWZlcmVuY2VFbnYgfTtcbiAgbGV0IGV4cGFuZGVkRW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZDogb3JkZXJlZEVudlZhcnMsIHByb2Nlc3NFbnY6IHJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gb3JkZXJlZEVudlZhcnM7XG4gIC8vIEEgdmFsdWUgcmVmZXJlbmNpbmcgJHtXQl9FTlZ9IG11c3QgZXhwYW5kIHRvIHdoYXQgdGhlIGNoaWxkIHdpbGwgYWN0dWFsbHkgc2VlOiB3aGVuIHRoZVxuICAvLyBFRkZFQ1RJVkUgV0JfRU5WIGVuZHMgdXAgZW1wdHkg4oCUIHdoZXRoZXIgaXQgd2FzIG5ldmVyIGRlZmluZWQsIGRlZmluZWQgZW1wdHksIG9yIGVtcHRpZWQgYnlcbiAgLy8gdGhlIGV4cGFuc2lvbiBpdHNlbGYgKGUuZy4gYFdCX0VOVj0ke01JU1NJTkdfTU9ERX1gKSDigJQgd2IncyBQcm9qZWN0LmVudiBsYXRlciBmaWxscyBpdCB3aXRoXG4gIC8vIHRoZSBmYWxsYmFjayBtb2RlLCBzbyByZS1leHBhbmQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVzIHdpdGggdGhhdCBmYWxsYmFjayBhdmFpbGFibGUuXG4gIC8vIE9wdC1pbiB2aWEgdGhlIG9wdGlvbjogYSBkaXJlY3QgcmVhZEVudmlyb25tZW50VmFyaWFibGVzL3JlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzXG4gIC8vIGNhbGxlciBuZXZlciByZWNlaXZlcyB0aGUgY29tcGxldGVkIFdCX0VOViwgYW5kIGV4cGFuZGluZyByZWZlcmVuY2VzIGFnYWluc3QgYSB2YWx1ZSB0aGF0IGlzXG4gIC8vIG5vdCBhY3R1YWxseSBhcHBsaWVkIHdvdWxkIG1ha2UgdGhlIHBhaXIgaW5jb25zaXN0ZW50LlxuICAvLyBUaGUgbG9hZGVkIGtleSBtYXNrcyB0aGUgYW1iaWVudCB2YWx1ZSwgc28gYSBsb2FkZWQtYnV0LWVtcHRpZWQgV0JfRU5WIG5lZWRzIHRoZSByZXRyeSBldmVuXG4gIC8vIHdoZW4gYW4gZXhwb3J0ZWQgV0JfRU5WIGV4aXN0cyAoYSBmb3JjZWQgbW9kZSBmaWxlIG92ZXJyaWRlcyB0aGUgZXhwb3J0IGxvY2FsbHkpOiByZXRyeSB3aXRoXG4gIC8vIHRoZSB2YWx1ZSB0aGUgbWVyZ2VkIGVudmlyb25tZW50IHdpbGwgdWx0aW1hdGVseSByZXRhaW4uXG4gIGNvbnN0IGVmZmVjdGl2ZVdiRW52ID0gZXhwYW5kZWRFbnZWYXJzLldCX0VOViA/PyBydW50aW1lRW52LldCX0VOVjtcbiAgaWYgKG9wdGlvbnM/LmV4cGFuZEZhbGxiYWNrV2JFbnYgJiYgIWVmZmVjdGl2ZVdiRW52KSB7XG4gICAgY29uc3QgcmVFeHBhbnNpb25JbnB1dCA9IHsgLi4ucHJlRXhwYW5zaW9uRW52VmFycyB9O1xuICAgIGRlbGV0ZSByZUV4cGFuc2lvbklucHV0LldCX0VOVjtcbiAgICBjb25zdCByZXRyeVJlZmVyZW5jZUVudiA9IHsgLi4ucHJpc3RpbmVSZWZlcmVuY2VFbnYsIFdCX0VOVjogcnVudGltZUVudi5XQl9FTlYgfHwgcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndikgfTtcbiAgICBleHBhbmRlZEVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQ6IHJlRXhwYW5zaW9uSW5wdXQsIHByb2Nlc3NFbnY6IHJldHJ5UmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyByZUV4cGFuc2lvbklucHV0O1xuICB9XG4gIHJldHVybiBbZXhwYW5kZWRFbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIHJlcG9zaXRvcnkncyBmbm94IGNvbmZpZ3VyYXRpb24gKGBmbm94LnRvbWxgKS5cbiAqIFRoZSBiYXNlIGBbc2VjcmV0c11gIHRhYmxlIGNvcnJlc3BvbmRzIHRvIGAuZW52YCwgYW5kIGBbcHJvZmlsZXMuPGNhc2NhZGU+LnNlY3JldHNdYCBjb3JyZXNwb25kcyB0b1xuICogYC5lbnYuPGNhc2NhZGU+YDsgYW4gdW5rbm93biBwcm9maWxlIGZhbGxzIGJhY2sgdG8gdGhlIGJhc2Ugc2VjcmV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvcHRpb25zPzogeyBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbjsgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52PzogYm9vbGVhbiB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCFoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2QpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3Qgc2VjcmV0cyA9IHJ1bkZub3hFeHBvcnQoY3dkLCBjYXNjYWRlLCB7IHF1aWV0OiBmYWxzZSB9KTtcbiAgaWYgKCFzZWNyZXRzKSByZXR1cm4gW3t9LCBbXV07XG4gIC8vIGBbcHJvZmlsZXMuPGNhc2NhZGU+LnNlY3JldHNdYCBpcyB0aGUgZm5veCBhbmFsb2d1ZSBvZiBgLmVudi48Y2FzY2FkZT5gOiB3aGVuIHRoZSBjYWxsZXJcbiAgLy8gZm9yY2VzIGEgbW9kZSBvZmYgQ0ksIHByb2ZpbGUtc3BlY2lmaWMgdmFsdWVzIG11c3Qgb3ZlcnJpZGUgaW5oZXJpdGVkIHNoZWxsIHZhcmlhYmxlcyBqdXN0XG4gIC8vIGxpa2UgYC5lbnYuPG1vZGU+YCB2YWx1ZXMgZG8sIHdoaWxlIGJhc2UgYFtzZWNyZXRzXWAgdmFsdWVzIGtlZXAgbG9zaW5nIHRvIHByb2Nlc3MuZW52LiBBIGtleVxuICAvLyBpcyBwcm9maWxlLXNwZWNpZmljIHdoZW4gdGhlIHByb2ZpbGUgZXhwb3J0J3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBiYXNlIGV4cG9ydCdzOyB3aGVuIHRoZVxuICAvLyBiYXNlIGV4cG9ydCBmYWlscywgbm8gb3ZlcnJpZGUgaXMgYXBwbGllZCAoY29uc2VydmF0aXZlKS4gVGhlIGJhc2UgZXhwb3J0IHJ1bnMgTEFaSUxZLCBvbmx5XG4gIC8vIHdoZW4gYSBwcm9jZXNzLmVudiBjb2xsaXNpb24gYWN0dWFsbHkgbmVlZHMgYWRqdWRpY2F0aW5nIOKAlCBpdCB3b3VsZCBvdGhlcndpc2UgYWRkIGFcbiAgLy8gc3VicHJvY2VzcyAoaW5jbHVkaW5nIGFnZSBkZWNyeXB0aW9uKSB0byBldmVyeSBmb3JjZWQtbW9kZSBpbnZvY2F0aW9uIGZvciBub3RoaW5nLlxuICBsZXQgY2FjaGVkQmFzZVNlY3JldHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHwgZmFsc2UgPSBmYWxzZTtcbiAgY29uc3QgZ2V0QmFzZVNlY3JldHMgPSAoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChjYWNoZWRCYXNlU2VjcmV0cyA9PT0gZmFsc2UpIHtcbiAgICAgIGNhY2hlZEJhc2VTZWNyZXRzID0gcnVuRm5veEV4cG9ydChjd2QsIHVuZGVmaW5lZCwgeyBxdWlldDogdHJ1ZSwgaWdub3JlUHJvZmlsZUVudlZhcjogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZEJhc2VTZWNyZXRzO1xuICB9O1xuXG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VjcmV0cykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCBrZXkgaW4gY3VycmVudEVudlZhcnMpIGNvbnRpbnVlO1xuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbiBvdmVyIGZub3ggYmFzZSB2YWx1ZXMsIG1pcnJvcmluZyB0aGUgLmVudiBydWxlLlxuICAgIC8vIChUaGUgbWlzZSByZWFkZXIgYmVsb3cgaW50ZW50aW9uYWxseSB1c2VzIGEgdmFsdWUtZXF1YWxpdHkgY2hlY2sgaW5zdGVhZDogYG1pc2UgZW52YCBlY2hvZXNcbiAgICAvLyBiYWNrIHZhcmlhYmxlcyB0aGUgYW1iaWVudCBtaXNlIGFjdGl2YXRpb24gYWxyZWFkeSBleHBvcnRlZCwgYW5kIGEgZGlmZmVyaW5nIHZhbHVlIG1lYW5zIHRoZVxuICAgIC8vIHJlcXVlc3RlZCBjYXNjYWRlIHByb2ZpbGUgc2hvdWxkIHdpbiBvdmVyIHRoZSBzdGFsZSBhY3RpdmF0aW9uLilcbiAgICBpZiAoIW9wdGlvbnM/Lmlnbm9yZVByb2Nlc3NFbnYgJiYga2V5IGluIHByb2Nlc3MuZW52KSB7XG4gICAgICBjb25zdCBiYXNlU2VjcmV0cyA9IG9wdGlvbnM/Lm1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiBjYXNjYWRlID8gZ2V0QmFzZVNlY3JldHMoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBiYXNlU2VjcmV0cyAhPT0gdW5kZWZpbmVkICYmIGJhc2VTZWNyZXRzW2tleV0gIT09IHZhbHVlO1xuICAgICAgaWYgKCFvdmVycmlkZXNQcm9jZXNzRW52KSBjb250aW51ZTtcbiAgICB9XG4gICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcnVuRm5veEV4cG9ydChcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogeyBxdWlldDogYm9vbGVhbjsgaWdub3JlUHJvZmlsZUVudlZhcj86IGJvb2xlYW4gfVxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAvLyBgLS1pZi1taXNzaW5nIGVycm9yYDogZm5veCBvdGhlcndpc2UgZXhpdHMgMCBhbmQgc2lsZW50bHkgb21pdHMgc2VjcmV0cyBpdCBmYWlscyB0byByZXNvbHZlXG4gIC8vIChlLmcuIGEgbWlzc2luZyBhZ2Uga2V5KSwgd2hpY2ggd291bGQgYmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIHNlY3JldHMuXG4gIC8vIGAtLW5vbi1pbnRlcmFjdGl2ZWA6IHByb21wdHMgb3IgYnJvd3NlciBhdXRoIGZsb3dzIHdvdWxkIGhhbmcgZm9yZXZlciBiZWNhdXNlIHN0ZGluIGlzIGlnbm9yZWQuXG4gIGNvbnN0IGFyZ3MgPSBbJ2V4cG9ydCcsICctLWZvcm1hdCcsICdqc29uJywgJy0tbm8tY29sb3InLCAnLS1pZi1taXNzaW5nJywgJ2Vycm9yJywgJy0tbm9uLWludGVyYWN0aXZlJ107XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tcHJvZmlsZScsIGNhc2NhZGUpO1xuICB9XG4gIGlmIChvcHRpb25zLmlnbm9yZVByb2ZpbGVFbnZWYXIpIHtcbiAgICAvLyBXaXRob3V0IGAtLXByb2ZpbGVgLCBmbm94IGZhbGxzIGJhY2sgdG8gRk5PWF9QUk9GSUxFOyB0aGUgYmFzZS1hZGp1ZGljYXRpb24gZXhwb3J0IG11c3RcbiAgICAvLyByZWFkIHRoZSBCQVNFIHNlY3JldHMsIHNvIHRoZSBpbmhlcml0ZWQgcHJvZmlsZSBzZWxlY3Rpb24gaXMgY2xlYXJlZCBmb3IgaXQg4oCUIGFuZCBvbmx5IGZvclxuICAgIC8vIGl0LiBBIFBSSU1BUlkgZXhwb3J0IHN0aWxsIGhvbm9ycyBGTk9YX1BST0ZJTEU6IGl0IGVpdGhlciBzdGF5cyBwcm9maWxlLWxlc3MgKGZub3ggcmVhZHMgdGhlXG4gICAgLy8gdmFyaWFibGUpIG9yIGZvbGRzIGl0IGludG8gdGhlIGAtLXByb2ZpbGVgIGl0IHBhc3NlcyAoc2VlIHdiIGRvdGVudidzIGNhc2NhZGUpLlxuICAgIGRlbGV0ZSBlbnYuRk5PWF9QUk9GSUxFO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoJ2Zub3gnLCBhcmdzLCB7XG4gICAgY3dkLFxuICAgIGVudixcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSB7XG4gICAgLy8gVGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMgZm5veC1tYW5hZ2VkIHNlY3JldHMgKGZub3gudG9tbCBleGlzdHMpLCBzbyBhIGZhaWxpbmcgZXhwb3J0IG11c3QgYmVcbiAgICAvLyBzdXJmYWNlZDogc3dhbGxvd2luZyBpdCB3b3VsZCBtYWtlIGRlY2xhcmVkIHNlY3JldHMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIG9uZXMuXG4gICAgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBmbm94IHNlY3JldHM6ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlIHx8IHJlc3VsdC5zdGRlcnI/LnRyaW0oKSB8fCBgZm5veCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtyZXN1bHQuc3RhdHVzfWB9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc2VjcmV0cyA9IChwYXJzZWQgYXMgeyBzZWNyZXRzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uc2VjcmV0cztcbiAgaWYgKCFzZWNyZXRzIHx8IHR5cGVvZiBzZWNyZXRzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNlY3JldHMpKSByZXR1cm47XG4gIHJldHVybiBzZWNyZXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvamVjdEZub3hDb25maWcoY3dkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoY3dkKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmbm94RW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYGZub3ggZXhwb3J0IC0tcHJvZmlsZSAke2Nhc2NhZGV9YCA6ICdmbm94IGV4cG9ydCc7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvcHRpb25zPzogeyBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbiB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCFoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2QpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgYXJncyA9IFsnZW52JywgJy0tanNvbicsICctLWNkJywgY3dkXTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tZW52JywgY2FzY2FkZSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnbWlzZScsIGFyZ3MsIHtcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW3t9LCBbXV07XG4gIH1cbiAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwga2V5IGluIGN1cnJlbnRFbnZWYXJzKSBjb250aW51ZTtcbiAgICBpZiAob3B0aW9ucz8uaWdub3JlUHJvY2Vzc0Vudikge1xuICAgICAgLy8gYG1pc2UgZW52YCBhbHdheXMgZW1pdHMgUEFUSCBkdWUgdG8gdG9vbCBzaGltczsgY29uc3VtZXJzIG9mIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXNcbiAgICAgIC8vIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKSBtdXN0IG5vdCBwcm9wYWdhdGUgaXQuXG4gICAgICBpZiAoa2V5ID09PSAnUEFUSCcpIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QpOyA7IGN1cnJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJ21pc2UudG9tbCcpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5taXNlLnRvbWwnKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYG1pc2UgZW52IC0tZW52ICR7Y2FzY2FkZX1gIDogJ21pc2UgZW52Jztcbn1cblxuZnVuY3Rpb24gaXNDSUVudmlyb25tZW50KGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCBvdXRwdXRPcHRpb25zID0gYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBxdWlldEVudj86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfTtcbiAgcmV0dXJuIG91dHB1dE9wdGlvbnMucXVpZXRFbnYgPT09IHRydWUgfHwgKG91dHB1dE9wdGlvbnMucXVpZXRFbnYgIT09IGZhbHNlICYmIG91dHB1dE9wdGlvbnMuc2lsZW50ID09PSB0cnVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICAvLyBFeGlzdGluZyBwcm9jZXNzLmVudiBrZXlzIGFyZSBrZXB0OiBlbnZWYXJzIG1heSBkZWxpYmVyYXRlbHkgY29udGFpbiBkaWZmZXJpbmcgdmFsdWVzIHRoYXRcbiAgICAvLyBtdXN0IHdpbiBvbmx5IGluIHRoZSByZXR1cm5lZCByZWNvcmQgKG1pc2UgY2FzY2FkZS1wcm9maWxlIHZhbHVlcywgZm9yY2VkLW1vZGUgb3ZlcnJpZGVzXG4gICAgLy8gY29uc3VtZWQgdmlhIGBwcm9qZWN0LmVudmApLCBuZXZlciBjbG9iYmVyIHRoZSBjYWxsZXIncyBvd24gcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgYmxhbmstb25seSBsaW5lcyBhcmUgc2tpcHBlZCB3aGlsZSBwcmludGluZyBzdGRvdXQvc3RkZXJyIGluIHJlYWx0aW1lICovXG4gIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBjb25zdCBzdGRvdXRQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3Rkb3V0LCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgY29uc3Qgc3RkZXJyUHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZGVyciwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHN0ZG91dFByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHN0ZGVyclByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgc3Rkb3V0UHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBzdGRlcnJQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcblxuZnVuY3Rpb24gY3JlYXRlUmVhbHRpbWVQcmludGVyKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0ZVN0cmVhbSxcbiAgb21pdEJsYW5rTGluZXMgPSBmYWxzZVxuKTogeyB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDsgZmx1c2g6ICgpID0+IHZvaWQgfSB7XG4gIGlmICghb21pdEJsYW5rTGluZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IChkYXRhKSA9PiBzdHJlYW0ud3JpdGUoZGF0YSksXG4gICAgICBmbHVzaDogKCkgPT4ge30sXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwZW5kaW5nID0gJyc7XG4gIHJldHVybiB7XG4gICAgd3JpdGU6IChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nICs9IGRhdGE7XG4gICAgICBjb25zdCBsaW5lcyA9IHBlbmRpbmcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKSA/PyAnJztcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWlzQmxhbmtMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgc3RyZWFtLndyaXRlKGAke2xpbmV9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoIWlzQmxhbmtMaW5lKHBlbmRpbmcpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShwZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSAnJztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JsYW5rTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobixlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogUHJlcGVuZCBldmVyeSBleGlzdGluZyBgbm9kZV9tb2R1bGVzLy5iaW5gIGRpcmVjdG9yeSBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkgdXAgdG8gdGhlXG4gKiByZXBvc2l0b3J5IHJvb3QgKG9yIGZpbGVzeXN0ZW0gcm9vdCkgdG8gdGhlIGVudmlyb25tZW50J3MgUEFUSCwgbmVhcmVzdCBkaXJlY3RvcnkgZmlyc3Qgc29cbiAqIGEgd29ya3NwYWNlLWxvY2FsIGRlcGVuZGVuY3kgd2lucyBvdmVyIGEgcmVwb3NpdG9yeS1yb290IG9uZS4gTmVlZGVkIHdoZXJldmVyIHdiIHN0cmlwc1xuICogeWFybidzIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGZyb20gUEFUSCAoeWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMgb25seVxuICogdGhyb3VnaCB0aGF0IGZvbGRlciwgbmV2ZXIgdGhyb3VnaCBgbm9kZV9tb2R1bGVzLy5iaW5gIG9uIFBBVEgpLCBzbyB0aGF0IGJhcmUgYmluYXJ5IG5hbWVzXG4gKiBpbiB3cmFwcGVkIGNvbW1hbmRzIGtlZXAgcmVzb2x2aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKGRpclBhdGg6IHN0cmluZywgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpblBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgYmluUGF0aHMucHVzaChiaW5QYXRoKTtcbiAgICB9XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICB9XG4gIGlmIChiaW5QYXRocy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgZW52LlBBVEggPSBlbnYuUEFUSCA/IGAke2JpblBhdGhzLmpvaW4oJzonKX06JHtlbnYuUEFUSH1gIDogYmluUGF0aHMuam9pbignOicpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHNpbGVudD86IGJvb2xlYW4gfSkuc2lsZW50ID09PSB0cnVlICYmXG4gICAgZ2V0T3B0aW9uVmFsdWUoYXJndiwgJ3F1aWV0LWVudicpID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgYXJncy5wdXNoKCctLXF1aWV0LWVudicpO1xuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4vc2hlbGwuanMnO1xuXG5jb25zdCB3cmFuZ2xlckNvbmZpZ0ZpbGVOYW1lcyA9IFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ107XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGdlbmVyYXRpbmcgYSAuZGV2LnZhcnMgZmlsZSAodmlhIGB3YiBnZW4tZGV2LXZhcnNgKSBzbyB0aGF0XG4gKiBgd3JhbmdsZXIgZGV2YCBjYW4gc2VlIHRoZSB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndjogU2NyaXB0QXJndiwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICd3YicsICdnZW4tZGV2LXZhcnMnLCAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksIG91dHB1dFBhdGhdKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGB3cmFuZ2xlciBkZXZgLXN0eWxlIGNvbW1hbmQuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlZgIG1ha2VzIHdyYW5nbGVyIHNlcnZlIHRoZSB0b3AtbGV2ZWxcbiAqIChub24tZGVwbG95KSBjb25maWcuIHdyYW5nbGVyIChsaWtlIHZpbmV4dCkgcmVxdWlyZXMgcmVhbCBOb2RlLmpzIOKAlCBgYnVuIHJ1bmAgcmVzcGVjdHMgdGhlIGJpbidzXG4gKiBub2RlIHNoZWJhbmcsIGFuZCB3YiBuZXZlciBjb21wb3NlcyBgLS1idW5gICh3aG9zZSBub2RlLT5idW4gUEFUSCBzaGltIGJyZWFrcyBib3RoIHRvb2xzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKGFyZ3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZW52IC11IENMT1VERkxBUkVfRU5WIFlBUk4gd3JhbmdsZXIgJHthcmdzfWAudHJpbSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBhcHBseWluZyB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyB0byB0aGUgbG9jYWwgZGF0YWJhc2UsIG9yIHVuZGVmaW5lZFxuICogaWYgdGhlIHByb2plY3QgaGFzIG5vIEQxIGRhdGFiYXNlIG9yIG5vIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGRpcmVjdG9yeS5cbiAqIENJPXRydWUgc3VwcHJlc3NlcyB3cmFuZ2xlcidzIGludGVyYWN0aXZlIGNvbmZpcm1hdGlvbiBwcm9tcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSB8fCAhZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdCkpIHJldHVybjtcblxuICByZXR1cm4gYENJPXRydWUgWUFSTiB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5ICR7ZGF0YWJhc2VOYW1lfSAtLWxvY2FsIC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiYDtcbn1cblxuLyoqXG4gKiBQcmVmaXggdGhlIGdpdmVuIHNjcmlwdCB3aXRoIGNvbW1hbmRzIGV4cG9ydGluZyBEQVRBQkFTRV9VUkwgcG9pbnRpbmcgdG8gdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZSxcbiAqIHNvIHRoYXQgZHJpenpsZS1raXQgYW5kIHNlZWQgc2NyaXB0cyBjYW4gb3BlcmF0ZSBvbiB0aGUgc2FtZSBkYXRhYmFzZSBhcyB0aGUgYXBwLlxuICogRG8gbm90aGluZyBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2UgaW4gaXRzIHdyYW5nbGVyIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSkgcmV0dXJuIHNjcmlwdDtcblxuICAvLyBFeGNsdWRpbmcgbWluaWZsYXJlJ3MgbWV0YWRhdGEuc3FsaXRlLCB3aGljaCBsaXZlcyBuZXh0IHRvIHRoZSBoYXNoLW5hbWVkIGRhdGFiYXNlIGZpbGUuXG4gIC8vIEFuIHVubWF0Y2hlZCBnbG9iIGNhbm5vdCBoYXBwZW4gaGVyZTogdGhlIHNjcmlwdCBydW5zIHVuZGVyIC9iaW4vc2ggKHZpYSBOb2RlJ3MgYHNoZWxsOiB0cnVlYCksXG4gIC8vIGFuZCB0aGUgcHJlY2VkaW5nIG1hdGVyaWFsaXphdGlvbiBjb21tYW5kIGd1YXJhbnRlZXMgdGhlIFNRTGl0ZSBmaWxlIGV4aXN0cy5cbiAgLy8gUHJvamVjdHMgd2l0aCBtdWx0aXBsZSBEMSBkYXRhYmFzZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IHRoZSBoYXNoLW5hbWVkIGZpbGVzIGNhbm5vdCBiZVxuICAvLyBkaXN0aW5ndWlzaGVkIGNoZWFwbHkgKG1hdGVyaWFsaXphdGlvbiBkb2VzIG5vdCBldmVuIHVwZGF0ZSB0aGUgdGFyZ2V0IGZpbGUncyBtdGltZSkuXG4gIC8vIFRoZSBzdGF0ZSBkaXJlY3RvcnkgbXVzdCBiZSBhYnNvbHV0ZSBiZWNhdXNlIHRoZSB3cmFwcGVkIHNjcmlwdCBtYXkgYGNkYCB0byB0aGUgbW9ub3JlcG8gcm9vdC5cbiAgY29uc3Qgc3RhdGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpKTtcbiAgY29uc3QgZXhwb3J0Q29tbWFuZCA9IGBleHBvcnQgREFUQUJBU0VfVVJMPVwiZmlsZTokKGxzIFwiJHtzdGF0ZURpclBhdGh9XCIvdjMvZDEvbWluaWZsYXJlLUQxRGF0YWJhc2VPYmplY3QvKi5zcWxpdGUgfCBncmVwIC12IG1ldGFkYXRhIHwgaGVhZCAtMSlcImA7XG4gIHJldHVybiBgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZGF0YWJhc2VOYW1lKX0gJiYgJHtleHBvcnRDb21tYW5kfSAmJiAke3NjcmlwdH1gO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgRDEgZGF0YWJhc2UgZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIC8vIENvdmVyIEpTT04oQykgKGBcImRhdGFiYXNlX25hbWVcIjogXCIuLi5cImApIGFuZCBUT01MLCBpbmNsdWRpbmcgaXRzIGlubGluZS10YWJsZSBmb3JtXG4gIC8vIChgZDFfZGF0YWJhc2VzID0gW3sgLi4uLCBkYXRhYmFzZV9uYW1lID0gXCIuLi5cIiB9XWApLCB3aXRob3V0IGZ1bGwgcGFyc2Vycy5cbiAgLy8gQ29tbWVudGVkLW91dCBsaW5lcyBhcmUgc2tpcHBlZCBzbyB0aGF0IHRoZXkgY2Fubm90IHNoYWRvdyB0aGUgYWN0aXZlIGRhdGFiYXNlIG5hbWUsXG4gIC8vIGFuZCB0aGUga2V5IG11c3QgZm9sbG93IGEgbGluZSBzdGFydCwgYHtgIG9yIGAsYCBzbyB0aGF0IHByb3NlIG1lbnRpb25pbmcgaXQgY2Fubm90IG1hdGNoLlxuICBmb3IgKGNvbnN0IGxpbmUgb2YgZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jykuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKC9eXFxzKig/OiN8XFwvXFwvKS91LnRlc3QobGluZSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbWF0Y2ggPSAvKD86XnxbLHtdKVxccypbXCInXT9kYXRhYmFzZV9uYW1lW1wiJ10/XFxzKls6PV1cXHMqW1wiJ10oW15cIiddKylbXCInXS91LmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBUZXN0cyBtYXkgcGFzcyBwYXJ0aWFsIFByb2plY3Qgb2JqZWN0cyB3aXRob3V0IGRpclBhdGguXG4gIGlmICghcHJvamVjdC5kaXJQYXRoKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiB3cmFuZ2xlckNvbmZpZ0ZpbGVOYW1lcykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggb2YgdGhlIHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIGRpcmVjdG9yeSAoYG1pZ3JhdGlvbnNfZGlyYCBpbiB0aGUgd3JhbmdsZXJcbiAqIGNvbmZpZywgZGVmYXVsdGluZyB0byBgbWlncmF0aW9uc2ApIGlmIGl0IGV4aXN0cyBvbiBkaXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIGxldCBtaWdyYXRpb25zRGlyID0gJ21pZ3JhdGlvbnMnO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jykuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKC9eXFxzKig/OiN8XFwvXFwvKS91LnRlc3QobGluZSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbWF0Y2ggPSAvKD86XnxbLHtdKVxccypbXCInXT9taWdyYXRpb25zX2RpcltcIiddP1xccypbOj1dXFxzKltcIiddKFteXCInXSspW1wiJ10vdS5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgbWlncmF0aW9uc0RpciA9IG1hdGNoWzFdIGFzIHN0cmluZztcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBjb25zdCBtaWdyYXRpb25zRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIG1pZ3JhdGlvbnNEaXIpO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhtaWdyYXRpb25zRGlyUGF0aCkgPyBtaWdyYXRpb25zRGlyUGF0aCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGNvbW1hbmQgbWF0ZXJpYWxpemluZyB0aGUgbG9jYWwgbWluaWZsYXJlIEQxIFNRTGl0ZSBmaWxlLlxuICogQSBuby1vcCBxdWVyeSBmb3JjZXMgbWluaWZsYXJlIHRvIGNyZWF0ZSB0aGUgU1FMaXRlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuXG4gKiBPbmx5IHN0ZG91dCBpcyBzdXBwcmVzc2VkOyB3cmFuZ2xlciByZXBvcnRzIGVycm9ycyBvbiBzdGRlcnIsIHdoaWNoIG11c3Qgc3RheSB2aXNpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+LCBkYXRhYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWUFSTiB3cmFuZ2xlciBkMSBleGVjdXRlICR7ZGF0YWJhc2VOYW1lfSAtLWxvY2FsIC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiIC0tY29tbWFuZCBcIlNFTEVDVCAxXCIgPiAvZGV2L251bGxgO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbG9jYWwgd3JhbmdsZXIvbWluaWZsYXJlIHN0YXRlIGRpcmVjdG9yeS5cbiAqIERldmVsb3BtZW50IGZvbGxvd3Mgd3JhbmdsZXIncyBkZWZhdWx0IGRpcmVjdG9yeSBzbyB0aGF0IHBsYWluIGB3cmFuZ2xlciBkZXZgIC8gYHZpbmV4dCBkZXZgXG4gKiAod2l0aG91dCBhIHBlcnNpc3QtcGF0aCBvdmVycmlkZSkgc2hhcmVzIHRoZSBzYW1lIGRhdGFiYXNlIGFzIHdiLW1hbmFnZWQgZGIgY29tbWFuZHMuXG4gKiBPdGhlciBlbnZpcm9ubWVudHMgKGUuZy4gdGVzdCkgZ2V0IHRoZWlyIG93biBkaXJlY3Rvcnkgc28gdGhhdCB0aGV5IGNhbiBiZSByZXNldFxuICogd2l0aG91dCBkZXN0cm95aW5nIGRldmVsb3BtZW50IHN0YXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogc3RyaW5nIHtcbiAgLy8gRGVzdHJ1Y3RpdmUgdGVzdCByZXNldHMgYXJlIGdhdGVkIG9uIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JyksIHdoaWNoIGFjY2VwdHNcbiAgLy8gZWl0aGVyIFdCX0VOViBvciBNSVNFX0VOVjsgcmVzb2x2ZSB0byB0aGUgdGVzdCBkaXJlY3Rvcnkgd2hlbmV2ZXIgZWl0aGVyIHNheXMgJ3Rlc3QnIHNvXG4gIC8vIHRoYXQgc3VjaCByZXNldHMgY2FuIG5ldmVyIHRhcmdldCB0aGUgZGV2ZWxvcG1lbnQgc3RhdGUuXG4gIGNvbnN0IHdiRW52ID0gW3Byb2plY3QuZW52LldCX0VOViwgcHJvamVjdC5lbnYuTUlTRV9FTlZdLmluY2x1ZGVzKCd0ZXN0JylcbiAgICA/ICd0ZXN0J1xuICAgIDogcHJvamVjdC5lbnYuV0JfRU5WIHx8IHByb2plY3QuZW52Lk1JU0VfRU5WO1xuICByZXR1cm4gIXdiRW52IHx8IHdiRW52ID09PSAnZGV2ZWxvcG1lbnQnID8gJy53cmFuZ2xlci9zdGF0ZScgOiBgLndyYW5nbGVyL3N0YXRlLSR7d2JFbnZ9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybixcbiAgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLFxuICByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbiAgcmVzb2x2ZUZhbGxiYWNrV2JFbnYsXG4gIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbi8qKiBUaGUgZmlsZSBgd3JhbmdsZXIgdHlwZXNgIHdyaXRlcyBieSBkZWZhdWx0LiAqL1xuY29uc3QgV09SS0VSX1RZUEVTX0ZJTEVfTkFNRSA9ICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgLy8gVGhlIHBhY2thZ2UgbWFuYWdlciBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiOlxuICAvLyBgbm9kZSB3YiAuLi5gIGFnYWluc3QgYSBCdW4gcmVwbyBtdXN0IHN0aWxsIHJ1biBgYnVuIGluc3RhbGxgLCBhbmQgdmljZSB2ZXJzYS5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCgpOiAnYnVuJyB8ICd5YXJuJyB7XG4gICAgcmV0dXJuIHRoaXMuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIGdldCBwYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoKTogJ2J1biBydW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIC8vIEEgc2luZ2xlIHNpZ25hbCBkZWNpZGVzIGV2ZXJ5IGJ1bi12cy15YXJuIGJyYW5jaCBpbiB3YiAoc2NyaXB0IG5vcm1hbGl6YXRpb24gaW5jbHVkZWQpOlxuICAvLyBzcGxpdHRpbmcgdGhlIHRvb2wtbWFuaWZlc3Qgc2lnbmFsIGZyb20gdGhlIGxvY2tmaWxlIHNpZ25hbCBvbmNlIHByb2R1Y2VkIGNvbW1hbmRzIG1peGluZ1xuICAvLyBgYnVuIGluc3RhbGxgIHdpdGggYHlhcm4gcHJpc21hIC4uLmAgaW4gbWlzZS1waW5uZWQgcmVwb3Mgd2hvc2UgYnVuLmxvY2sgaXMgZ2l0aWdub3JlZC5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNCdW5Ub29sVmVyc2lvbigpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5oYXNCdW5Mb2NrZmlsZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNCdW5QYWNrYWdlTWFuYWdlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Ub29sVmVyc2lvbigpOiBib29sZWFuIHtcbiAgICAvLyB3YmZ5IG1pZ3JhdGVzIC50b29sLXZlcnNpb25zIGludG8gbWlzZS50b21sLCBzbyBhIG1pc2UtcGlubmVkIGJ1biBtdXN0IGNvdW50IGFzIHdlbGw6XG4gICAgLy8gcmVwb3MgdGhhdCBnaXRpZ25vcmUgYnVuLmxvY2sgYW5kIGhhdmUgbm8gcGFja2FnZU1hbmFnZXIgZmllbGQgcmVseSBvbiB0aGUgdG9vbCBtYW5pZmVzdC5cbiAgICBpZiAodGVzdEZpbGVDb250ZW50KHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgLyhefFxcbilidW5cXHMvKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIHRlc3RGaWxlQ29udGVudChwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgZmlsZU5hbWUpLCAvXlxccyooPzpcImJ1blwifGJ1bilcXHMqPS9tKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1bkxvY2tmaWxlKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHJlbHkgb24gdGhlIGxvY2tmaWxlIG9yIHBhY2thZ2VNYW5hZ2VyIGZpZWxkIGluc3RlYWQgb2YgbWlzZS5cbiAgICAvLyBEb2NrZXIgb3B0aW1pemF0aW9uIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2IuXG4gICAgcmV0dXJuIFsnYnVuLmxvY2snLCAnYnVuLmxvY2tiJ10uc29tZSgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsIGZpbGVOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHRoaXMucm9vdFBhY2thZ2VKc29uPy5wYWNrYWdlTWFuYWdlciA/PyB0aGlzLnBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyO1xuICAgIHJldHVybiB0eXBlb2YgcGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnICYmIHBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ2J1bkAnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICAvLyBDYWNoZWQgaW4gYSBwbGFpbiBmaWVsZCByYXRoZXIgdGhhbiB3aXRoIEBtZW1vaXplT25lOiB0aGF0IGRlY29yYXRvciBrZXlzIGl0cyBjYWNoZSBvbiBhIGhhc2hcbiAgLy8gb2YgdGhlIGluc3RhbmNlLCB3aGljaCBjaGFuZ2VzIGFzIG90aGVyIG1lbW9pemVkIGdldHRlcnMgcG9wdWxhdGUgdGhlIGluc3RhbmNlLCBzbyBgZW52YCBjb3VsZFxuICAvLyBzaWxlbnRseSBiZSByZWNvbXB1dGVkIOKAlCBkcm9wcGluZyBpbi1wbGFjZSBtdXRhdGlvbnMgKGUuZy4gYHByb2plY3QuZW52LlBPUlQgfHw9IOKApmAsIG9yIHRoZVxuICAvLyBzZWNyZXRzIGB3YiBkZXBsb3lgIG1lcmdlcyBmcm9tIC5lbnYuY2xvdWRmbGFyZSkgdGhhdCBjYWxsZXJzIHJlbHkgb24gZm9yIHNwYXduZWQgY29tbWFuZHMuXG4gIHByaXZhdGUgZW52Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5lbnZDYWNoZSkgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZW52Q2FjaGUgPSBwcm9jZXNzLmVudjtcbiAgICAgIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICAgIH1cblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCwge1xuICAgICAgLy8gY29tcGxldGVBbmRWYWxpZGF0ZVdiRW52IGJlbG93IGZpbGxzIGFuIHVuc2V0IFdCX0VOViB3aXRoIHRoZSBzYW1lIGZhbGxiYWNrLCBzbyBleHBhbmRpbmdcbiAgICAgIC8vICR7V0JfRU5WfSByZWZlcmVuY2VzIGFnYWluc3QgaXQga2VlcHMgdGhlIHBhaXIgY29uc2lzdGVudC5cbiAgICAgIGV4cGFuZEZhbGxiYWNrV2JFbnY6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKCFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgIGZvciAoY29uc3QgW2VudlBhdGgsIG5hbWVzXSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7bmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNwcmVhZGluZyBlbnZWYXJzIGxhc3QgaXMgc2FmZSBmb3IgZXhwb3J0ZWQtdmFyaWFibGUgcHJlY2VkZW5jZTogcmVhZEVudmlyb25tZW50VmFyaWFibGVzXG4gICAgLy8gYWxyZWFkeSBleGNsdWRlcyBrZXlzIHByZXNlbnQgaW4gcHJvY2Vzcy5lbnYgZnJvbSAuZW52L2Zub3ggc291cmNlcyAocmV0dXJuaW5nIGEga2V5IHRoYXRcbiAgICAvLyBleGlzdHMgaW4gcHJvY2Vzcy5lbnYgb25seSBmb3IgZGVsaWJlcmF0ZSBmb3JjZWQtbW9kZSBvdmVycmlkZXMpLiBNaXNlIHZhbHVlcyB0aGF0XG4gICAgLy8gZGlmZmVyIGZyb20gdGhlIGFtYmllbnQgYWN0aXZhdGlvbiBhcmUgZGVsaWJlcmF0ZWx5IGtlcHQgc28gdGhlIHJlcXVlc3RlZCBjYXNjYWRlIHByb2ZpbGVcbiAgICAvLyAoZS5nLiBgLS1jYXNjYWRlLWVudj10ZXN0YCkgd2lucyBvdmVyIGEgc3RhbGUgYG1pc2UgYWN0aXZhdGVgIGVudmlyb25tZW50LlxuICAgIHRoaXMuZW52Q2FjaGUgPSB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnZWYXJzIH07XG4gICAgLy8gYG1pc2UgZW52YCBpcyBleGNsdWRlZDogaXQgcmVwb3J0cyB0b29sLWFjdGl2YXRpb24gb3V0cHV0IChlLmcuIFBBVEgpIGV2ZW4gaW4gcmVwb3MgdGhhdFxuICAgIC8vIGRlY2xhcmUgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGF0IGFsbCwgd2hpY2ggbXVzdCBub3QgdHJpZ2dlciB0aGUgQ0kgc3RyaWN0bmVzcyBiZWxvdy5cbiAgICB0aGlzLmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzLnNvbWUoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpKTtcbiAgICByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuICAvKipcbiAgICogQ29tcGxldGVzIGFuZCB2YWxpZGF0ZXMgdGhlIHJlc29sdmVkIGBXQl9FTlZgIHBlciB0aGUgb3JnIHN0YW5kYXJkIChzZWUgdGhlXG4gICAqIGd1aWRlbGluZXMtZm9yLW1pc2UtZm5veCBza2lsbCk6XG4gICAqIC0gTG9jYWxseSwgYW4gdW5zZXQgYFdCX0VOVmAgZmFsbHMgYmFjayB0byB0aGUgc2VsZWN0ZWQgY2FzY2FkZSBtb2RlIChkZXZlbG9wbWVudCB1bmxlc3MgYVxuICAgKiAgIGNvbW1hbmQgZm9yY2VzIGFub3RoZXIsIGUuZy4gYHdiIHRlc3RgIGZvcmNlcyB0ZXN0KSwgc28gY2FzdWFsIGBidW4gd2IgLi4uYCBpbnZvY2F0aW9uc1xuICAgKiAgIHdvcmsgaW4gcmVwb3NpdG9yaWVzIHRoYXQgZGVmaW5lIG5vIFdCX0VOViBhdCBhbGwuXG4gICAqIC0gT24gQ0ksIGFuIHVuc2V0IGBXQl9FTlZgIGlzIGEgaGFyZCBlcnJvciB3aGVuIGVudiBzb3VyY2VzIGV4aXN0OiB3b3JrZmxvd3MgbXVzdCBleHBvcnQgdGhlXG4gICAqICAgZW52aXJvbm1lbnQgZXhwbGljaXRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHJ1bm5pbmcgaW4gYW4gYW1iaWd1b3VzIG1vZGUuXG4gICAqIC0gVGhlIHZhbHVlIG11c3QgbmFtZSBhIHN0YW5kYXJkIG1vZGU7IGFuIHVua25vd24gdmFsdWUgKGUuZy4gYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gKSB3b3VsZFxuICAgKiAgIG90aGVyd2lzZSBzaWxlbnRseSBzZWxlY3QgdGhlIGRldmVsb3BtZW50IGNhc2NhZGUsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIHRoaXMgZ3VhcmRzIGFnYWluc3QuXG4gICAqIC0gYE5FWFRfUFVCTElDX1dCX0VOVmAgaXMgZGVyaXZlZCBmcm9tIGBXQl9FTlZgIGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzIHdoZW4gbWlzc2luZywgc28gYVxuICAgKiAgIHByb2R1Y3Rpb24gYnVpbGQgY2FuIG5vIGxvbmdlciBiYWtlIGEgc3RhbGUgZGV2ZWxvcG1lbnQgdmFsdWUgaW50byB0aGUgY2xpZW50IGJ1bmRsZS5cbiAgICogU2tpcHBlZCB3aGVuIGBXQl9TS0lQX0VOVl9DSEVDSz0xYCBpcyBzZXQuXG4gICAqL1xuICBwcml2YXRlIGNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihoYXNFbnZpcm9ubWVudFNvdXJjZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBlbnYgPSB0aGlzLmVudkNhY2hlO1xuICAgIGlmICghZW52KSByZXR1cm47XG4gICAgaWYgKGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8IGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnKSByZXR1cm47XG5cbiAgICAvLyBPbiBDSSwgV0JfRU5WIG11c3QgYmUgRVhQT1JURUQgYnkgdGhlIHdvcmtmbG93IOKAlCBjaGVja2VkIGFnYWluc3QgcHJvY2Vzcy5lbnYsIG5vdCB0aGVcbiAgICAvLyBtZXJnZWQgZW52aXJvbm1lbnQ6IGEgY29tbWl0dGVkIGJhc2UgZGVmYXVsdCAoZS5nLiBmbm94J3MgZGV2ZWxvcG1lbnQgZW50cnkpIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNhdGlzZnkgdGhlIGNoZWNrIGFuZCBzaWxlbnRseSBydW4gQ0kgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cbiAgICBpZiAoaXNDSShlbnYuQ0kpICYmICFwcm9jZXNzLmVudi5XQl9FTlYgJiYgaGFzRW52aXJvbm1lbnRTb3VyY2VzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgJ1dCX0VOViBpcyBub3QgZXhwb3J0ZWQgb24gQ0kuIEV4cG9ydCBXQl9FTlYgZXhwbGljaXRseSAodGhlIHJldXNhYmxlIHdvcmtmbG93cyBwYXNzIGl0IHZpYSB0aGUgXCJlbnZpcm9ubWVudFwiIGlucHV0KSwgJyArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFlbnYuV0JfRU5WKSB7XG4gICAgICAvLyBUaGUgc2hhcmVkIHJlc29sdmVyIGtlZXBzIHRoaXMgZmFsbGJhY2sgY29uc2lzdGVudCB3aXRoIHRoZSBjYXNjYWRlIHNlbGVjdGlvbiBBTkQgd2l0aFxuICAgICAgLy8gdGhlICR7V0JfRU5WfSBleHBhbnNpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzIGFscmVhZHkgcGVyZm9ybWVkOiB0aGUgZm9yY2VkIGNhc2NhZGVcbiAgICAgIC8vIChlLmcuIGB3YiB0ZXN0YCksIHRoZW4gdGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCwgdGhlbiB0aGUgQU1CSUVOVC1OT0RFX0VOVi1kcml2ZW4gYXV0b1xuICAgICAgLy8gY2FzY2FkZSBjbGFtcGVkIHRvIGEgc3RhbmRhcmQgbW9kZSAoYW4gZXhwbGljaXQgLS1jYXNjYWRlLWVudiBrZWVwcyBpdHMgdmFsdWUgYW5kIGlzXG4gICAgICAvLyB2YWxpZGF0ZWQgYmVsb3cgbGlrZSBhbnkgb3RoZXIgV0JfRU5WKS5cbiAgICAgIGNvbnN0IG1vZGUgPSByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpO1xuICAgICAgZW52LldCX0VOViA9IG1vZGU7XG4gICAgICBpZiAoaGFzRW52aXJvbm1lbnRTb3VyY2VzICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBXQl9FTlYgaXMgbm90IGRlZmluZWQ7IGRlZmF1bHRpbmcgdG8gXCIke21vZGV9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViBtdXN0IGJlIG9uZSBvZiBkZXZlbG9wbWVudCwgdGVzdCwgc3RhZ2luZywgb3IgcHJvZHVjdGlvbiwgYnV0IGlzIFwiJHtlbnYuV0JfRU5WfVwiLiBgICtcbiAgICAgICAgICAgICdGaXggdGhlIHZhbHVlIGluIHRoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZSwgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gQSBmb3JjZWQgbW9kZSAoYW4gZXhwbGljaXQvY29tbWFuZC1kZWZhdWx0IC0tY2FzY2FkZS1lbnYsIG9yIGFuIGV4cG9ydGVkIFdCX0VOViB3aG9zZVxuICAgIC8vIG1vZGUtc3BlY2lmaWMgZmlsZXMgbWF5IG92ZXJyaWRlIGl0IGxvY2FsbHkgcGVyIGlzc3VlICM5MzApIG11c3Qgbm90IGJlIHNpbGVudGx5IHJlcGxhY2VkXG4gICAgLy8gYnkgYW5vdGhlciBtb2RlIGEgbW9kZSBmaWxlIGRlZmluZXM6IGB3YiB0ZXN0YCByZXNvbHZpbmcgV0JfRU5WPWRldmVsb3BtZW50IGZyb20gYVxuICAgIC8vIGNvbW1pdHRlZCBgLmVudmAgd291bGQgcnVuIHRoZSB0ZXN0cyBhZ2FpbnN0IGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGFuIGV4cG9ydGVkXG4gICAgLy8gV0JfRU5WPXByb2R1Y3Rpb24gb3ZlcnJpZGRlbiB0byBkZXZlbG9wbWVudCBieSBgLmVudi5wcm9kdWN0aW9uYCB3b3VsZCBidWlsZC9kZXBsb3kgdGhlXG4gICAgLy8gd3JvbmcgZW52aXJvbm1lbnQgd2hpbGUgbG9va2luZyBzdWNjZXNzZnVsLlxuICAgIC8vIC0tY2FzY2FkZS1ub2RlLWVudiBmb3JjZXMgPE5PREVfRU5WIHx8IGRldmVsb3BtZW50PiAocGVyIGl0cyBvd24gZG9jdW1lbnRhdGlvbiksIHJlYWQgZnJvbVxuICAgIC8vIHRoZSBBTUJJRU5UIGVudmlyb25tZW50IGxpa2UgdGhlIGNhc2NhZGUgc2VsZWN0aW9uLiBPbmx5IGEgU1RBTkRBUkQgZm9yY2VkIG1vZGUgaXMgZW5mb3JjZWQ6XG4gICAgLy8gYSBub24tc3RhbmRhcmQgb25lIChlLmcuIE5PREVfRU5WPXFhKSBhbHJlYWR5IGhhZCBpdHMgZmFsbGJhY2sgY2xhbXBlZCB0byBkZXZlbG9wbWVudCBhYm92ZSxcbiAgICAvLyBhbmQgZXJyb3Jpbmcgb24gdGhhdCBjbGFtcCB3b3VsZCBjb250cmFkaWN0IGl0LlxuICAgIGNvbnN0IGZvcmNlZE1vZGUgPVxuICAgICAgdGhpcy5hcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAgICh0aGlzLmFyZ3YuY2FzY2FkZU5vZGVFbnYgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHVuZGVmaW5lZCk7XG4gICAgLy8gVGhlIEFVVE8tc2VsZWN0ZWQgbW9kZSBjb3VudHMgYXMgdGhlIGV4cGVjdGF0aW9uIHRvbzogd2l0aCBub3RoaW5nIHNldCBhbnl3aGVyZSwgdGhlXG4gICAgLy8gZGV2ZWxvcG1lbnQgY2FzY2FkZSdzIGZpbGVzIGFyZSBsb2FkZWQsIHNvIGEgYC5lbnYubG9jYWxgIGRlY2xhcmluZyBXQl9FTlY9cHJvZHVjdGlvbiB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBydW4gZGV2ZWxvcG1lbnQgc291cmNlcyBsYWJlbGVkIGFzIHByb2R1Y3Rpb24uXG4gICAgY29uc3QgZXhwZWN0ZWRNb2RlID1cbiAgICAgIGZvcmNlZE1vZGUgPz8gKHRoaXMuYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2UgPyByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpIDogdW5kZWZpbmVkKTtcbiAgICAvLyBUaGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGlzIGEgbGVnaXRpbWF0ZSBzZWNvbmQgZXhwZWN0YXRpb246IGB3YiB0ZXN0IC0tY2FzY2FkZS1lbnY9c3RhZ2luZ2BcbiAgICAvLyBsb2FkcyB0aGUgc3RhZ2luZyBmaWxlcyB3aGlsZSB0aGUgZmFsbGJhY2sgY29ycmVjdGx5IGZpbGxzIFdCX0VOVj10ZXN0LlxuICAgIGlmIChcbiAgICAgIGV4cGVjdGVkTW9kZSAmJlxuICAgICAgUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGV4cGVjdGVkTW9kZSkgJiZcbiAgICAgIGVudi5XQl9FTlYgIT09IGV4cGVjdGVkTW9kZSAmJlxuICAgICAgZW52LldCX0VOViAhPT0gdGhpcy5hcmd2LmNvbW1hbmREZWZhdWx0V2JFbnZcbiAgICApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgV0JfRU5WIHJlc29sdmVzIHRvIFwiJHtlbnYuV0JfRU5WfVwiIGFsdGhvdWdoIHRoZSBcIiR7ZXhwZWN0ZWRNb2RlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgICAgICBgRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgbW9kZSdzIGVudiBzb3VyY2UgKGUuZy4gLmVudi4ke2V4cGVjdGVkTW9kZX0gb3IgdGhlIGZub3ggXCIke2V4cGVjdGVkTW9kZX1cIiBwcm9maWxlKSwgYCArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVxdWlyZXNOZXh0UHVibGljV2JFbnYgJiYgZW52Lk5FWFRfUFVCTElDX1dCX0VOViAhPT0gZW52LldCX0VOVikge1xuICAgICAgLy8gQXNzaWduIHVuY29uZGl0aW9uYWxseSwgbm90IGB8fD1gOiB0aGUgcGFpciBtdXN0IGFncmVlIGJ5IGNvbnZlbnRpb24sIGFuZCBhIHN0YWxlIHZhbHVlXG4gICAgICAvLyAoZS5nLiBhIGJhc2UgYC5lbnZgJ3MgZGV2ZWxvcG1lbnQgZGVmYXVsdCB3aGlsZSBDSSBleHBvcnRzIFdCX0VOVj10ZXN0KSB3b3VsZCBvdGhlcndpc2VcbiAgICAgIC8vIGJlIGJha2VkIGludG8gdGhlIGNsaWVudCBidW5kbGUgZXZlbiB0aG91Z2ggdGhlIHNlcnZlciBzaWRlIHJ1bnMgd2l0aCB0aGUgY29ycmVjdCBXQl9FTlYuXG4gICAgICBpZiAoZW52Lk5FWFRfUFVCTElDX1dCX0VOViAmJiAhc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCh0aGlzLmFyZ3YpKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgT3ZlcnJpZGluZyBORVhUX1BVQkxJQ19XQl9FTlYgKFwiJHtlbnYuTkVYVF9QVUJMSUNfV0JfRU5WfVwiKSB3aXRoIFdCX0VOViAoXCIke2Vudi5XQl9FTlZ9XCIpLmApO1xuICAgICAgfVxuICAgICAgZW52Lk5FWFRfUFVCTElDX1dCX0VOViA9IGVudi5XQl9FTlY7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcmVxdWlyZXNOZXh0UHVibGljV2JFbnYoKTogYm9vbGVhbiB7XG4gICAgLy8gT1dOIGRlcGVuZGVuY2llcyBvbmx5OiBhIHJvb3QtbGV2ZWwgbmV4dC92aW5leHQgZGV2RGVwZW5kZW5jeSBpbiBhIG1peGVkIG1vbm9yZXBvIG11c3Qgbm90XG4gICAgLy8gZm9yY2UgTkVYVF9QVUJMSUNfV0JfRU5WIG9udG8gZXZlcnkgbm9uLU5leHQgd29ya3NwYWNlIHBhY2thZ2UuXG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignbmV4dCcpIHx8ICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigndmluZXh0Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGB3cmFuZ2xlciB0eXBlc2Agc2hvdWxkIGdlbmVyYXRlIGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCBoZXJlLiBBIHdyYW5nbGVyIGNvbmZpZ1xuICAgKiBhbmQgYW4gb3duIHdyYW5nbGVyIGRlcGVuZGVuY3kgYXJlIGJvdGggcmVxdWlyZWQg4oCUIHdyYW5nbGVyIGV4aXRzIG5vbi16ZXJvIHdpdGhvdXQgYSBjb25maWcsXG4gICAqIGFuZCBpbiBhIG1peGVkIG1vbm9yZXBvIGEgcm9vdC1sZXZlbCB3cmFuZ2xlciBkZXZEZXBlbmRlbmN5IG11c3Qgbm90IG1ha2UgZXZlcnkgd29ya3NwYWNlXG4gICAqIHBhY2thZ2UgZW1pdCB0eXBlcyBpdCBuZXZlciBjb25zdW1lcy5cbiAgICpcbiAgICogVGhlIHBhY2thZ2UncyBvd24gY29tbWl0dGVkIGdpdGlnbm9yZSBydWxlIGlzIHRoZSB0aGlyZCBzaWduYWwsIGFuZCB0aGUgb25lIHRoYXQgc2F5cyB0aGVcbiAgICogcGFja2FnZSBhY3R1YWxseSBDT05TVU1FUyB0aGUgZmlsZTogd2JmeSB3cml0ZXMgdGhhdCBydWxlIG9ubHkgZm9yIHBhY2thZ2VzIHdob3NlIG93biB0c2NvbmZpZ1xuICAgKiBjYW4gcmVmZXJlbmNlIGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCwgYW5kIGRlbGliZXJhdGVseSBsZWF2ZXMgYWxvbmUgcGFja2FnZXMgdGhhdFxuICAgKiBoYW5kLW1haW50YWluIHRoZWlyIGBFbnZgIGluc3RlYWQuIFdpdGhvdXQgdGhpcyBjaGVjaywgc3VjaCBhIHBhY2thZ2Ugd291bGQgZ2FpbiBhbiB1bnRyYWNrZWRcbiAgICogfjUwMEtCIGdlbmVyYXRlZCBmaWxlIG9uIGV2ZXJ5IGluc3RhbGwuXG4gICAqL1xuICBAbWVtb2l6ZU9uZVxuICBnZXQgZ2VuZXJhdGVzV29ya2VyVHlwZXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaW5kV3JhbmdsZXJDb25maWdQYXRoKHRoaXMpIHx8ICF0aGlzLmhhc093bkRlcGVuZGVuY3koJ3dyYW5nbGVyJykpIHJldHVybiBmYWxzZTtcbiAgICAvLyBEZWZlbnNlIGluIGRlcHRoIGFnYWluc3Qgd2JmeSdzIGdpdGlnbm9yZSBydWxlIGFuZCB0aGlzIHByZWRpY2F0ZSBkcmlmdGluZyBhcGFydDogaWYgdGhlIHBhY2thZ2Ugc3RpbGxcbiAgICAvLyBydW5zIGl0cyBvd24gb3V0cHV0LWNoYW5naW5nIGB3cmFuZ2xlciB0eXBlc2AgKGUuZy4gYC0tc3RyaWN0LXZhcnM9ZmFsc2VgKSwgdGhlIGJhcmUgaW52b2NhdGlvbiBoZXJlIHdvdWxkXG4gICAgLy8gb3ZlcndyaXRlIHRoYXQgZmlsZSB3aXRoIGEgZGlmZmVyZW50IGBFbnZgLlxuICAgIGlmIChoYXNPdXRwdXRDaGFuZ2luZ1dyYW5nbGVyVHlwZXModGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9LCB0aGlzLmRpclBhdGgpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGhhc01hbmFnZWRHaXRpZ25vcmVSdWxlKHRoaXMuZGlyUGF0aCwgV09SS0VSX1RZUEVTX0ZJTEVfTkFNRSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ByaXNtYScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBQbGF5d3JpZ2h0IGNvbmZpZyBkZWNsYXJlcyBhIGB3ZWJTZXJ2ZXJgIGJsb2NrLCBpLmUuIFBsYXl3cmlnaHQgaXRzZWxmIGJ1aWxkcyBhbmRcbiAgICogc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC4gVW5saWtlIHtAbGluayBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodH0gdGhpcyBpZ25vcmVzIENJLCBzb1xuICAgKiBpdCBhbHNvIGhvbGRzIGZvciBsaWJyYXJ5IGZpeHR1cmVzIHdob3NlIG9ubHkgc2VydmVyIGlzIHRoZSBvbmUgUGxheXdyaWdodCBtYW5hZ2VzLlxuICAgKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICAvLyBPbiBDSSB3YiBsYXVuY2hlcyB0aGUgYXBwIGl0c2VsZiBzbyB0aGUgcnVuIGRvZXMgbm90IGRlcGVuZCBvbiBQbGF5d3JpZ2h0J3MgYHJldXNlRXhpc3RpbmdTZXJ2ZXJgXG4gICAgLy8gKHdoaWNoIGlzIGRpc2FibGVkIG9uIENJKTsgbG9jYWxseSwgYSBgd2ViU2VydmVyYCBibG9jayBtZWFucyBQbGF5d3JpZ2h0IGFscmVhZHkgb3ducyB0aGUgc2VydmVyLlxuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWc7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKHRoaXMuZGlyUGF0aCwgdGhpcy5lbnYpO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGhhc0RlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpID8/IHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5yb290UGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm47XG5cbiAgICByZXR1cm4gKFxuICAgICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJvb3RQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucm9vdERpclBhdGggPT09IHRoaXMuZGlyUGF0aCkgcmV0dXJuIHRoaXMucGFja2FnZUpzb247XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbd2JdIEZhaWxlZCB0byByZWFkIG9yIHBhcnNlICR7cGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKX1gLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3UGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByYXdQYXRoLnN0YXJ0c1dpdGgoJy8vJykgPyByYXdQYXRoLnNsaWNlKDIpIDogcmF3UGF0aDtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoIHx8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4gJiBQYXJ0aWFsPFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3Jvb3REaXJQYXRoJz4+XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSkgcmV0dXJuIGRiUGF0aDtcblxuICBjb25zdCBiYXNlRGlyUGF0aCA9IHByb2plY3Qucm9vdERpclBhdGggPz8gcHJvamVjdC5kaXJQYXRoO1xuICByZXR1cm4gYmFzZURpclBhdGggPyBwYXRoLnJlc29sdmUoYmFzZURpclBhdGgsIGRiUGF0aCkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdDogUHJvamVjdCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9qZWN0LmVudi5XQl9FTlYgPT09IG5hbWUgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlYgPT09IG5hbWU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmZ1bmN0aW9uIHRlc3RGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByb290IHByb2plY3QgZm9sbG93ZWQgYnkgb25lIFByb2plY3QgcGVyIHdvcmtzcGFjZSBkaXJlY3RvcnkgdGhlIHRhcmdldCByZXBvc2l0b3J5J3NcbiAqIHBhY2thZ2UgbWFuYWdlciB3b3VsZCBsaW5rIChpc3N1ZSAjMTAwOCk6IEJ1biByZXBvcyB1c2UgdGhlIHNoYXJlZCBCdW4tZXhhY3QgcmVzb2x2ZXJcbiAqIChuZWdhdGlvbnMsIHBpbm5lZCBwb3NpdGl2ZXMsIGFuZCBiYXNlbGluZS1zZWVkaW5nIG5lZ2F0aW9ucyBpbmNsdWRlZCksIHdoaWxlIFlhcm4gcmVwb3Mga2VlcFxuICogZ2xvYiBzZW1hbnRpY3Mg4oCUIEJ1bi1vbmx5IHJ1bGVzIHN1Y2ggYXMgdGhlIGltcGxpY2l0IGJhc2VsaW5lIHdvdWxkIGludmVudCB3b3Jrc3BhY2VzIFlhcm5cbiAqIG5ldmVyIGxpbmtzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290UHJvamVjdCk7XG4gIHJldHVybiBbcm9vdFByb2plY3QsIC4uLndvcmtzcGFjZURpclBhdGhzLm1hcCgod29ya3NwYWNlRGlyUGF0aCkgPT4gbmV3IFByb2plY3Qod29ya3NwYWNlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpXTtcbn1cblxuLyoqXG4gKiBUaGUgYWJzb2x1dGUgZGlyZWN0b3J5IG9mIGV2ZXJ5IHdvcmtzcGFjZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBwYWNrYWdlIG1hbmFnZXIgd291bGQgbGluayxcbiAqIG1hdGNoaW5nIHRoZSBtYW5hZ2VyIHRoZSB3YXkgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIGRlc2NyaWJlcy4gRXhwb3J0ZWQgZm9yIHdiIHJlbGVhc2UsIHdob3NlXG4gKiBwbHVnaW4gaW5zcGVjdGlvbiwgbm9kZV9tb2R1bGVzIGNsZWFudXAsIGFuZCBtYW5pZmVzdCByZXdyaXRpbmcgbXVzdCBzZWUgdGhlIHNhbWUgd29ya3NwYWNlIHNldC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb24nIHwgJ3VzZXNCdW5QYWNrYWdlTWFuYWdlcic+XG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmIChwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlcikge1xuICAgIHJldHVybiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMsIHByb2plY3QuZGlyUGF0aCkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICApO1xuICB9XG4gIC8vIFlhcm4gMS4yMi4yMiByZXNvbHZlcyBlYWNoIGRlY2xhcmVkIHBhdHRlcm4gKGFycmF5IG9yIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBmb3JtKSBpbmRlcGVuZGVudGx5XG4gIC8vIGFuZCB1bmlvbnMgdGhlIHJlc3VsdHMsIHNvIGEgbGVhZGluZy1gIWAgcGF0dGVybiBpcyBub3QgYW4gZXhjbHVzaW9uIOKAlCBgW1wicGFja2FnZXMvKlwiLFxuICAvLyBcIiFwYWNrYWdlcy9hXCJdYCBzdGlsbCBsaW5rcyBwYWNrYWdlcy9hLiBZYXJuIGFkZGl0aW9uYWxseSBpZ25vcmVzIG1hbmlmZXN0cyBtaXNzaW5nIGEgbmFtZSBvclxuICAvLyB2ZXJzaW9uIChcIk1pc3NpbmcgdmVyc2lvbiBpbiB3b3Jrc3BhY2Ug4oCmLCBpZ25vcmluZy5cIiksIGJ1dCB0aGF0IGlzIGRlbGliZXJhdGVseSBOT1QgbWlycm9yZWQ6XG4gIC8vIHdiJ3MgZGVzY2VuZGFudCBkaXNjb3ZlcnkgZXhpc3RzIHRvIHJ1biBjb21tYW5kcyAobGludCwgdGVzdCwgdHlwZWNoZWNrLCDigKYpIGluIHN1Yi1wYWNrYWdlcyxcbiAgLy8gYW5kIHZlcnNpb24tbGVzcyBwcml2YXRlIHBhY2thZ2VzIG11c3Qgc3RheSBkaXNjb3ZlcmVkIOKAlCB0aGUgbG9uZy1zdGFuZGluZyBiZWhhdmlvciB3YidzXG4gIC8vIG1vbm9yZXBvIGZpeHR1cmVzIGVuY29kZS4gR2xvYiBmb3IgdGhlIG1hbmlmZXN0cyB0aGVtc2VsdmVzOiBnbG9iYnkncyBgb25seURpcmVjdG9yaWVzYFxuICAvLyB3b3VsZCByZXR1cm4gYSBsaXRlcmFsIGRpcmVjdG9yeSBwYXR0ZXJuJ3MgQ0hJTERSRU4gaW5zdGVhZCBvZiB0aGUgZGlyZWN0b3J5LiBUaGUgcmVhbHBhdGhcbiAgLy8gY29udGFpbm1lbnQgbWlycm9ycyByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRoczogYSB3b3Jrc3BhY2Ugc3ltbGluayBlc2NhcGluZyB0aGVcbiAgLy8gcmVwb3NpdG9yeSBtdXN0IG5vdCBsZXQgY29uc3VtZXJzIHRvdWNoIGFub3RoZXIgY2hlY2tvdXQuXG4gIGNvbnN0IHBvc2l0aXZlUGF0dGVybnMgPSBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykuZmlsdGVyKFxuICAgIChwYXR0ZXJuKSA9PiAhcGF0dGVybi5zdGFydHNXaXRoKCchJykgJiYgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHBhdHRlcm4pXG4gICk7XG4gIGlmIChwb3NpdGl2ZVBhdHRlcm5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAvLyBleHBhbmREaXJlY3RvcmllczogZmFsc2Ug4oCUIGdsb2JieSB3b3VsZCBvdGhlcndpc2UgZXhwYW5kIGEgbGl0ZXJhbCBkaXJlY3RvcnkgcGF0dGVybiB0byBpdHNcbiAgLy8gQ0hJTERSRU4sIHR1cm5pbmcgZS5nLiBgcGFja2FnZXNgIGludG8gbWF0Y2hlcyBmb3IgZXZlcnkgcGFja2FnZXMvKiBzdWJkaXJlY3RvcnkuXG4gIGNvbnN0IGdsb2JieU9wdGlvbnMgPSB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZXhwYW5kRGlyZWN0b3JpZXM6IGZhbHNlLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgfTtcbiAgLy8gZmFzdC1nbG9iIChnbG9iYnkncyBlbmdpbmUpIHJldHVybnMgbm8gbWF0Y2hlcyBmb3IgZmlsZSBnbG9icyB3aXRoIGEgbG9uZS1gP2Agc2VnbWVudCAoZS5nLlxuICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSBhbHRob3VnaCBZYXJuIGxpbmtzIHN1Y2ggd29ya3NwYWNlczsgZm9yIGA/YC1jYXJyeWluZyBwYXR0ZXJuc1xuICAvLyBvbmx5IChhIGRpcmVjdG9yeSBnbG9iIGZvciBlLmcuIGAqKmAgd291bGQgc2NhbiBldmVyeSBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZ1xuICAvLyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYi5cbiAgY29uc3QgZ2xvYmJlZE1hbmlmZXN0UGF0aHMgPSBhd2FpdCBnbG9iYnkoXG4gICAgcG9zaXRpdmVQYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IHBhdGgucG9zaXguam9pbihwYXR0ZXJuLCAncGFja2FnZS5qc29uJykpLFxuICAgIGdsb2JieU9wdGlvbnNcbiAgKTtcbiAgY29uc3QgbWFuaWZlc3RQYXRoU2V0ID0gbmV3IFNldChnbG9iYmVkTWFuaWZlc3RQYXRocyk7XG4gIGNvbnN0IHF1ZXN0aW9uTWFya1BhdHRlcm5zID0gcG9zaXRpdmVQYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4uaW5jbHVkZXMoJz8nKSk7XG4gIGlmIChxdWVzdGlvbk1hcmtQYXR0ZXJucy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGF3YWl0IGdsb2JieShxdWVzdGlvbk1hcmtQYXR0ZXJucywgeyAuLi5nbG9iYnlPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBtYW5pZmVzdFBhdGgpKSkgbWFuaWZlc3RQYXRoU2V0LmFkZChtYW5pZmVzdFBhdGgpO1xuICAgIH1cbiAgfVxuICBjb25zdCBtYW5pZmVzdFBhdGhzID0gWy4uLm1hbmlmZXN0UGF0aFNldF07XG4gIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhwcm9qZWN0LmRpclBhdGgpO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IG1hbmlmZXN0UGF0aHNcbiAgICAvLyBBIGAqKmAgcGF0dGVybiByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0IGFuZCBpbnN0YWxsZWQgcGFja2FnZXMsIGJ1dCBuZWl0aGVyIGlzIGFcbiAgICAvLyB3b3Jrc3BhY2UgdG8gWWFybiAod2hpY2ggbmV2ZXIgZGVzY2VuZHMgaW50byBub2RlX21vZHVsZXMpLlxuICAgIC5maWx0ZXIoKG1hbmlmZXN0UGF0aCkgPT4ge1xuICAgICAgaWYgKG1hbmlmZXN0UGF0aCA9PT0gJ3BhY2thZ2UuanNvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWFuaWZlc3RQYXRoKSkpO1xuICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBtYW5pZmVzdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbDogbm90IGEgd29ya3NwYWNlLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSlcbiAgICAubWFwKChtYW5pZmVzdFBhdGgpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHBhdGgucG9zaXguZGlybmFtZShtYW5pZmVzdFBhdGgpKSk7XG4gIHJldHVybiBbLi4ubmV3IFNldCh3b3Jrc3BhY2VEaXJQYXRocyldLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcGFja2FnZSdzIG93biBjb21taXR0ZWQgLmdpdGlnbm9yZSBjYXJyaWVzIHdiZnkncyBtYW5hZ2VkIHJ1bGUgZm9yIHRoZSBmaWxlLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgYGdpdCBjaGVjay1pZ25vcmVgOiB0aGF0IGFsc28gaG9ub3JzIGAuZ2l0L2luZm8vZXhjbHVkZWAgYW5kIHRoZSB1c2VyJ3MgZ2xvYmFsXG4gKiBleGNsdWRlcywgd2hpY2ggYSBmcmVzaCBjbG9uZSBhbmQgQ0kgZG8gbm90IGhhdmUuIEEgZGV2ZWxvcGVyIHdpdGggYSBwZXJzb25hbFxuICogYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGV4Y2x1ZGUgd291bGQgb3RoZXJ3aXNlIHR1cm4gZ2VuZXJhdGlvbiBvbiBmb3IgYSBwYWNrYWdlIHdiZnlcbiAqIGRlbGliZXJhdGVseSBsZWZ0IHVubWFuYWdlZCwgYW5kIHRoZSByZXN1bHRpbmcgZmlsZSB3b3VsZCBiZSBpbnZpc2libGUgaW4gYGdpdCBzdGF0dXNgLlxuICogYHBhY2thZ2VzL3diZnkvc3JjL2ZpeGVycy93b3JrZXJUeXBlcy50c2AgZ2F0ZXMgb24gdGhlIHNhbWUgY29tbWl0dGVkIHJ1bGUuXG4gKi9cbmZ1bmN0aW9uIGhhc01hbmFnZWRHaXRpZ25vcmVSdWxlKGRpclBhdGg6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXRpZ25vcmUnKSwgJ3V0ZjgnKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLnNvbWUoKGxpbmUpID0+IGxpbmUudHJpbSgpID09PSBgLyR7ZmlsZU5hbWV9YCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBwYWNrYWdlIHNjcmlwdCBydW5zIGEgYHdyYW5nbGVyIHR5cGVzYCB0aGF0IHdvdWxkIHdyaXRlIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXQgdGhlIGJhcmVcbiAqIGludm9jYXRpb24gd3JpdGVzLiBgLS1jaGVja2AvYC0taGVscGAgdmFsaWRhdGUgb3IgcHJpbnQgYW5kIHdyaXRlIG5vdGhpbmcsIHNvIHRoZXkgZG8gbm90IGNvdW50LiBgLS1lbnYtZmlsZWBcbiAqIGNvdW50cyB3aGVuZXZlciBhIGZpbGUgaXQgbmFtZXMgRVhJU1RTOiB0aGUgZmxhZyBzZWxlY3RzIHdoYXQgd3JhbmdsZXIgcmVhZHMgdG8gaW5mZXIgbG9jYWwgdmFycyBhbmQgc2VjcmV0cyxcbiAqIHNvIHRoZSBiYXJlIGludm9jYXRpb24gaGVyZSB3b3VsZCByZWdlbmVyYXRlIGEgc21hbGxlciBgRW52YC4gTWlycm9ycyB3YmZ5J3MgYGhhc0N1c3RvbVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uYFxuICogKGluY2x1ZGluZyBpdHMgYG5hbWVzT25seU1pc3NpbmdFbnZGaWxlc2AgcnVsZSk7IHRoZSB0d28gbXVzdCBhZ3JlZSwgc2luY2Ugd2JmeSdzIGFuc3dlciBkZWNpZGVzIHRoZVxuICogZ2l0aWdub3JlIHJ1bGUgdGhpcyBwcmVkaWNhdGUga2V5cyBvbi5cbiAqL1xuZnVuY3Rpb24gaGFzT3V0cHV0Q2hhbmdpbmdXcmFuZ2xlclR5cGVzKHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB3cmFuZ2xlclR5cGVzUGF0dGVybiA9IC8oPzpefFxccyl3cmFuZ2xlclxccyt0eXBlcyg/Olxcc3wkKS91O1xuICBjb25zdCBlbnZGaWxlT25seVBhdHRlcm4gPSAvXig/Oig/OmJ1bnh8bnB4KVxccyt8KD86eWFybnxwbnBtKVxccytkbHhcXHMrKT93cmFuZ2xlclxccyt0eXBlcyg/OlxccystLWVudi1maWxlXFxzK1xcUyspKiQvdTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB7XG4gICAgaWYgKCFzY3JpcHQgfHwgIXdyYW5nbGVyVHlwZXNQYXR0ZXJuLnRlc3Qoc2NyaXB0KSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIENoZWNrZWQgb24gdGhlIFdIT0xFIHNjcmlwdCwgYmVmb3JlIHNwbGl0dGluZzogYGNkIHN1YiAmJiB3cmFuZ2xlciB0eXBlc2AgcnVucyB0aGUgZ2VuZXJhdG9yIGluIGFub3RoZXJcbiAgICAvLyBkaXJlY3RvcnkgYWdhaW5zdCBhbm90aGVyIGNvbmZpZywgYnV0IGl0cyBzZWNvbmQgc2VnbWVudCBhbG9uZSBsb29rcyBsaWtlIGEgcGxhaW4gaW52b2NhdGlvbi4gd2JmeVxuICAgIC8vIGNsYXNzaWZpZXMgYW55IHNjcmlwdCBjYXJyeWluZyB0aGlzIHN5bnRheCBhcyBjdXN0b20sIGFuZCB0aGUgdHdvIHByZWRpY2F0ZXMgbXVzdCBhZ3JlZS5cbiAgICBpZiAoL1s7fDw+YCQnXCIoKV18XFxiY2RcXHMvdS50ZXN0KHNjcmlwdCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBzY3JpcHRcbiAgICAgIC5zcGxpdCgnJiYnKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKSlcbiAgICAgIC5zb21lKChzZWdtZW50KSA9PiB7XG4gICAgICAgIGlmICghd3JhbmdsZXJUeXBlc1BhdHRlcm4udGVzdChzZWdtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoLyg/Ol58XFxzKSg/Oi0taGVscHwtaCkoPzpcXHN8PXwkKS91LnRlc3Qoc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gYC0tY2hlY2tgIGNvbXBhcmVzIHRoZSByZXN1bHQgRk9SIFRIRSBTVVBQTElFRCBPUFRJT05TLCBzbyBpdCBpcyBvbmx5IGhhcm1sZXNzIHdoZW4gdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgIC8vIGludm9jYXRpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgYmFyZSBvbmUuXG4gICAgICAgIGNvbnN0IHdpdGhvdXRDaGVjayA9IHNlZ21lbnRcbiAgICAgICAgICAucmVwbGFjZSgvKD86XnxcXHMpLS1jaGVjayg/Olxcc3w9fCQpL3UsICcgJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHdpdGhvdXRDaGVjayA9PT0gc2VnbWVudCA/IHNlZ21lbnQgOiB3aXRob3V0Q2hlY2s7XG4gICAgICAgIC8vIE5vdCBlcXVpdmFsZW50IHRvIHRoZSBiYXJlIGludm9jYXRpb24sIHdpdGggb3Igd2l0aG91dCBgLS1jaGVja2A6IGAtLWNoZWNrYCBjb21wYXJlcyB0aGUgcmVzdWx0IEZPUlxuICAgICAgICAvLyBUSEUgU1VQUExJRUQgT1BUSU9OUywgc28gYC0tY2hlY2sgLS1zdHJpY3QtdmFycz1mYWxzZWAgc3RpbGwgZGVzY3JpYmVzIGEgZGlmZmVyZW50IGZpbGUuXG4gICAgICAgIGlmICghZW52RmlsZU9ubHlQYXR0ZXJuLnRlc3QoY2FuZGlkYXRlKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBbLi4uY2FuZGlkYXRlLm1hdGNoQWxsKC8tLWVudi1maWxlXFxzKyhcXFMrKS9ndSldLnNvbWUoXG4gICAgICAgICAgKG1hdGNoKSA9PiAhIW1hdGNoWzFdICYmIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIG1hdGNoWzFdKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeUxpa2UsIEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0J1aWxkIG91dHB1dCBwYXRocyAocmVsYXRpdmUgdG8gdGhlIHByb2plY3QgZGlyZWN0b3J5KSB0aGF0IG11c3QgZXhpc3QgZm9yIHRoZSBjYWNoZSB0byBiZSB2YWxpZCAoZGVmYXVsdDogYXV0by1kZXRlY3RlZCBjb21tb24gb3V0cHV0IGRpcmVjdG9yaWVzKScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBidWlsZENvbW1hbmQgPVxuICAgIGFyZ3YuY29tbWFuZCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZCA/IGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBidWlsZGAgOiB1bmRlZmluZWQpO1xuICBpZiAoIWJ1aWxkQ29tbWFuZCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU2tpcCB0byBidWlsZCBiZWNhdXNlIG5vIGJ1aWxkIGNvbW1hbmQgaXMgZGVmaW5lZC4nKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGJ1aWxkQ29tbWFuZCB9O1xuXG4gIC8vIFRoZSBjYWNoZSByZXF1aXJlcyB0aGUgZ2l0IHJlcG9zaXRvcnkgcm9vdCB0byBCRSByb290RGlyUGF0aDogcG9yY2VsYWluIHBhdGhzIGFuZCBkaWZmXG4gIC8vIHBhdGhzcGVjcyBiZWxvdyBhcmUgam9pbmVkL2V4ZWN1dGVkIGFnYWluc3Qgcm9vdERpclBhdGguIFdoZW4gdGhlIHJlcG8gcm9vdCBpcyBlbHNld2hlcmVcbiAgLy8gKGUuZy4gYSBzdWJwcm9qZWN0IG9mIGEgbGFyZ2VyIHJlcG9zaXRvcnkpLCBhbHdheXMgYnVpbGQgaW5zdGVhZCBvZiBtaXMtcmVzb2x2aW5nIHBhdGhzLlxuICAvLyBBIGZyZXNobHkgaW5pdGlhbGl6ZWQgcmVwbyB3aXRob3V0IGNvbW1pdHMgKHVuYm9ybiBIRUFEKSBsaWtld2lzZSBidWlsZHMgd2l0aG91dCBjYWNoaW5nOlxuICAvLyBgZ2l0IHJldi1wYXJzZSBIRUFEYCB3b3VsZCB0aHJvdy5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSB8fCAhaGFzR2l0Q29tbWl0KHByb2plY3QpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBkZXRlY3RFeGlzdGluZ0RlZmF1bHRPdXRwdXRQYXRocyhwcm9qZWN0KTtcbiAgICBpZiAob3V0cHV0UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBXaXRoIG5vIHJlY29yZGVkIG91dHB1dHMsIGEgZGVsZXRlZCBidWlsZCBkaXJlY3RvcnkgY2FuIG5ldmVyIGludmFsaWRhdGUgdGhlIGNhY2hlOyBtYWtlXG4gICAgICAvLyB0aGUgaW5hY3RpdmUgcHJvdGVjdGlvbiB2aXNpYmxlIGluc3RlYWQgb2YgZmFpbGluZyBzaWxlbnRseSAoY2YuIGlzc3VlICM5ODEpLlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay55ZWxsb3coJ05vIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgZGV0ZWN0ZWQ7IHBhc3MgLS1vdXRwdXQgdG8gZW5hYmxlIG1pc3Npbmctb3V0cHV0IGNhY2hlIGludmFsaWRhdGlvbi4nKVxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHsgaGFzaDogY29udGVudEhhc2gsIG91dHB1dFBhdGhzIH0pLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBDb21tb24gYnVpbGQgb3V0cHV0IGRpcmVjdG9yaWVzIHVzZWQgYWNyb3NzIG9yZyBwcm9qZWN0cyAodmluZXh0L2J1aWxkLXRzIGVtaXQgZGlzdCxcbi8vIE5leHQuanMgZW1pdHMgLm5leHQsIENSQS1zdHlsZSBhcHBzIGVtaXQgYnVpbGQsIGBuZXh0IGV4cG9ydGAgZW1pdHMgb3V0KS5cbmNvbnN0IGRlZmF1bHRPdXRwdXRDYW5kaWRhdGVzID0gWydkaXN0JywgJ2J1aWxkJywgJy5uZXh0JywgJ291dCddO1xuXG5mdW5jdGlvbiBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhcmd2Lm91dHB1dD8ubGVuZ3RoID8gYXJndi5vdXRwdXQubWFwKFN0cmluZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRldGVjdEV4aXN0aW5nRGVmYXVsdE91dHB1dFBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FuZGlkYXRlcy5maWx0ZXIoKG91dHB1dFBhdGgpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpKTtcbn1cblxuLyoqIEFuIGAtLW91dHB1dGAgdmFsdWUgbWF5IG5hbWUgYSBmaWxlLCBzbyBtYXRjaCB0aGUgZXhhY3QgcGF0aCBhcyB3ZWxsIGFzIGRlc2NlbmRhbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc091dHB1dFBhdGgob3V0cHV0UGF0aHM6IHN0cmluZ1tdLCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRwdXRQYXRocy5zb21lKChvdXRwdXRQYXRoKSA9PiBmaWxlUGF0aCA9PT0gb3V0cHV0UGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke291dHB1dFBhdGh9L2ApKTtcbn1cblxuZnVuY3Rpb24gaGFzR2l0Q29tbWl0KHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydyZXYtcGFyc2UnLCAnLS12ZXJpZnknLCAnSEVBRCddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICB9KS5zdGF0dXMgPT09IDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgLy8gVGhlIGludm9rZWQgYnVpbGQgY29tbWFuZCBpcyBwYXJ0IG9mIHRoZSBjYWNoZSBpZGVudGl0eTogYC1jIGNvbW1hbmRCYCBtdXN0IG5vdCByZXVzZSBhXG4gIC8vIGNhY2hlIHJlY29yZGVkIGZvciBjb21tYW5kQSB3aXRoIG90aGVyd2lzZSB1bmNoYW5nZWQgaW5wdXRzLlxuICBoYXNoLnVwZGF0ZShhcmd2LmNvbW1hbmQgPz8gJycpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICBjb25zdCBjYWNoZSA9IHBhcnNlQnVpbGRDYWNoZShjYWNoZWRDb250ZW50KTtcbiAgaWYgKGNhY2hlPy5oYXNoICE9PSBjb250ZW50SGFzaCkgcmV0dXJuIFtmYWxzZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xuXG4gIC8vIFRoZSBjYWNoZSBpcyB2YWxpZCBvbmx5IHdoaWxlIHRoZSByZWNvcmRlZCAob3IgZXhwbGljaXRseSByZXF1ZXN0ZWQpIGJ1aWxkIG91dHB1dHMgc3RpbGxcbiAgLy8gZXhpc3Q6IGEgZGVsZXRlZCBvdXRwdXQgZGlyZWN0b3J5IChlLmcuIGBybSAtcmYgZGlzdGApIG11c3QgdHJpZ2dlciBhIHJlYnVpbGQgZXZlbiB3aGVuIHRoZVxuICAvLyBpbnB1dHMgYXJlIHVuY2hhbmdlZCAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTgxKS5cbiAgY29uc3QgcmVxdWlyZWRPdXRwdXRQYXRocyA9IGdldEV4cGxpY2l0T3V0cHV0UGF0aHMoYXJndikgPz8gY2FjaGUub3V0cHV0UGF0aHM7XG4gIGNvbnN0IG1pc3NpbmdPdXRwdXRQYXRocyA9IHJlcXVpcmVkT3V0cHV0UGF0aHMuZmlsdGVyKFxuICAgIChvdXRwdXRQYXRoKSA9PiAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBvdXRwdXRQYXRoKSlcbiAgKTtcbiAgaWYgKG1pc3NpbmdPdXRwdXRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdyhgUmVidWlsZGluZyBiZWNhdXNlIGJ1aWxkIG91dHB1dHMgYXJlIG1pc3Npbmc6ICR7bWlzc2luZ091dHB1dFBhdGhzLmpvaW4oJywgJyl9YCkpO1xuICAgIHJldHVybiBbZmFsc2UsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbiAgfVxuICByZXR1cm4gW3RydWUsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VCdWlsZENhY2hlKGNhY2hlZENvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgaGFzaDogc3RyaW5nOyBvdXRwdXRQYXRoczogc3RyaW5nW10gfSB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2FjaGVkQ29udGVudCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2FjaGVkQ29udGVudCkgYXMgeyBoYXNoPzogdW5rbm93bjsgb3V0cHV0UGF0aHM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQ/Lmhhc2ggIT09ICdzdHJpbmcnKSByZXR1cm47XG4gICAgY29uc3Qgb3V0cHV0UGF0aHMgPSBBcnJheS5pc0FycmF5KHBhcnNlZC5vdXRwdXRQYXRocylcbiAgICAgID8gcGFyc2VkLm91dHB1dFBhdGhzLmZpbHRlcigocCkgPT4gdHlwZW9mIHAgPT09ICdzdHJpbmcnKVxuICAgICAgOiBbXTtcbiAgICByZXR1cm4geyBoYXNoOiBwYXJzZWQuaGFzaCwgb3V0cHV0UGF0aHMgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBsZWdhY3kgY2FjaGUgZmlsZSBjb250YWlucyBhIHJhdyBjb250ZW50IGhhc2ggd2l0aG91dCBvdXRwdXQgcmVjb3Jkcy4gVHJlYXQgaXQgYXMgYSBtaXNzOlxuICAgIC8vIGhvbm9yaW5nIGl0IHdvdWxkIGxldCBhIG1hdGNoaW5nIGhhc2ggc2tpcCBhIGJ1aWxkIHdob3NlIG91dHB1dHMgd2VyZSBkZWxldGVkLCBhbmQgb25lXG4gICAgLy8gcmVidWlsZCB1cGdyYWRlcyB0aGUgcmVjb3JkIHRvIHRoZSBKU09OIGZvcm1hdC5cbiAgICByZXR1cm47XG4gIH1cbn1cblxuLy8gTWF0Y2hlZCBhcyBjb21wbGV0ZSBwYXRoIFNFR01FTlRTIChub3Qgc3Vic3RyaW5ncyk6IGBzcmMvY29udGVzdC9gIG11c3Qgbm90IGJlIGV4Y2x1ZGVkIGJ5XG4vLyBgdGVzdGAsIGFuZCBgbXlzcmMvYCBtdXN0IG5vdCBiZSBpbmNsdWRlZCBieSBgc3JjYC5cbmNvbnN0IGluY2x1ZGVEaXJOYW1lcyA9IG5ldyBTZXQoWydzcmMnLCAncHVibGljJ10pO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuICAnYnVuLmxvY2snLFxuICAnYnVuLmxvY2tiJyxcbl07XG5jb25zdCBleGNsdWRlRGlyTmFtZXMgPSBuZXcgU2V0KFsndGVzdCcsICd0ZXN0cycsICdfX3Rlc3RzX18nLCAndGVzdC1maXh0dXJlcyddKTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgLy8gYC11YWxsYCBsaXN0cyB1bnRyYWNrZWQgZmlsZXMgaW5kaXZpZHVhbGx5IChub3QganVzdCB0aGVpciBkaXJlY3RvcnkpLCBzbyBuZXcgZmlsZXMgaW4gYVxuICAgIC8vIGJyYW5kLW5ldyBzb3VyY2UgZGlyZWN0b3J5IHBhcnRpY2lwYXRlIGluIHRoZSBoYXNoIGJlbG93LiBgLXpgIHlpZWxkcyBOVUwtZGVsaW1pdGVkLFxuICAgIC8vIFVOUVVPVEVEIHJlY29yZHM6IHdpdGhvdXQgaXQgZ2l0IEMtcXVvdGVzIG5vbi1BU0NJSSBwYXRocywgd2hpY2ggd291bGQgc2lsZW50bHkgZHJvcCB0aG9zZVxuICAgIC8vIGZpbGVzIGZyb20gYm90aCB0aGUgdW50cmFja2VkIGhhc2hpbmcgYW5kIHRoZSBgZ2l0IGRpZmZgIHBhdGhzcGVjcy5cbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nLCAnLXVhbGwnLCAnLXonXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgdG9rZW5zID0gcmV0LnN0ZG91dC5zcGxpdCgnXFwwJykuZmlsdGVyKCh0b2tlbikgPT4gdG9rZW4ubGVuZ3RoID4gMCk7XG4gICAgY29uc3Qgc3RhdHVzRW50cmllczogeyB1bnRyYWNrZWQ6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfVtdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2Vucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XSE7XG4gICAgICBjb25zdCBzdGF0dXMgPSB0b2tlbi5zbGljZSgwLCAyKTtcbiAgICAgIHN0YXR1c0VudHJpZXMucHVzaCh7IHVudHJhY2tlZDogc3RhdHVzID09PSAnPz8nLCBmaWxlUGF0aDogdG9rZW4uc2xpY2UoMykgfSk7XG4gICAgICAvLyBSZW5hbWUvY29weSByZWNvcmRzIGNhcnJ5IHRoZSBPUklHSU5BTCBwYXRoIGFzIGFuIGV4dHJhIE5VTC1kZWxpbWl0ZWQgZmllbGQ7IGluY2x1ZGUgaXRcbiAgICAgIC8vIHNvIGEgZmlsZSByZW5hbWVkIG91dCBvZiB0aGUgYnVpbGQgaW5wdXRzIHN0aWxsIGludmFsaWRhdGVzIHRoZSBjYWNoZS5cbiAgICAgIGlmIChzdGF0dXMuaW5jbHVkZXMoJ1InKSB8fCBzdGF0dXMuaW5jbHVkZXMoJ0MnKSkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbFBhdGggPSB0b2tlbnNbKytpbmRleF07XG4gICAgICAgIGlmIChvcmlnaW5hbFBhdGgpIHN0YXR1c0VudHJpZXMucHVzaCh7IHVudHJhY2tlZDogZmFsc2UsIGZpbGVQYXRoOiBvcmlnaW5hbFBhdGggfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRFbnRyaWVzID0gc3RhdHVzRW50cmllcy5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgLi4uZW50cnksXG4gICAgICBoYXNoUGF0aDpcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCdcbiAgICAgICAgICA/IGVudHJ5LmZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKVxuICAgICAgICAgIDogZW50cnkuZmlsZVBhdGgsXG4gICAgfSkpO1xuICAgIC8vIEJ1aWxkIE9VVFBVVFMgbXVzdCBuZXZlciBjb3VudCBhcyBidWlsZCBpbnB1dHM6IGhhc2hpbmcgZS5nLiBhbiB1bnRyYWNrZWQgZGlzdC8gZmlsZSB3b3VsZFxuICAgIC8vIGNoYW5nZSB0aGUgaGFzaCBvbiBldmVyeSBidWlsZCBhbmQgZGlzYWJsZSB0aGUgY2FjaGUgcGVybWFuZW50bHkuXG4gICAgY29uc3QgcHJvamVjdFJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5yb290RGlyUGF0aCwgcHJvamVjdC5kaXJQYXRoKTtcbiAgICBjb25zdCBleHBsaWNpdE91dHB1dFBhdGhzID0gKGdldEV4cGxpY2l0T3V0cHV0UGF0aHMoYXJndikgPz8gW10pLm1hcCgob3V0cHV0UGF0aCkgPT5cbiAgICAgIHBhdGguam9pbihwcm9qZWN0UmVsYXRpdmVEaXJQYXRoLCBvdXRwdXRQYXRoKVxuICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRFbnRyaWVzID0gbm9ybWFsaXplZEVudHJpZXMuZmlsdGVyKCh7IGZpbGVQYXRoLCBoYXNoUGF0aCB9KSA9PiB7XG4gICAgICBjb25zdCBkaXJlY3RvcnlTZWdtZW50cyA9IGhhc2hQYXRoLnNwbGl0KCcvJykuc2xpY2UoMCwgLTEpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGRpcmVjdG9yeVNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+IGluY2x1ZGVEaXJOYW1lcy5oYXMoc2VnbWVudCkpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGhhc2hQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZGlyZWN0b3J5U2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gZXhjbHVkZURpck5hbWVzLmhhcyhzZWdtZW50KSkgJiZcbiAgICAgICAgLy8gT25seSBFWFBMSUNJVExZIGRlY2xhcmVkIG91dHB1dHMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGlucHV0IGhhc2guIERlZmF1bHQgY2FuZGlkYXRlc1xuICAgICAgICAvLyAoZGlzdC9idWlsZC8ubmV4dC9vdXQpIGFyZSBOT1Q6IGdpdGlnbm9yZWQgYXJ0aWZhY3RzIG5ldmVyIGFwcGVhciBpbiBgZ2l0IHN0YXR1c2BcbiAgICAgICAgLy8gYW55d2F5LCBhbmQgYSBub24taWdub3JlZCBmaWxlIHRoZXJlIG1heSBiZSBnZW51aW5lIHNvdXJjZSAoZS5nLiBidWlsZC8gc2NyaXB0cyksIHdob3NlXG4gICAgICAgIC8vIGNoYW5nZXMgbXVzdCBpbnZhbGlkYXRlIHRoZSBjYWNoZSDigJQgY29ycmVjdG5lc3Mgb3ZlciBjYWNoZSBoaXRzLiBQcm9qZWN0cyBrZWVwaW5nXG4gICAgICAgIC8vIG5vbi1pZ25vcmVkIGFydGlmYWN0cyBpbiB0aG9zZSBkaXJlY3RvcmllcyBzaG91bGQgZ2l0aWdub3JlIHRoZW0gb3IgcGFzcyAtLW91dHB1dC5cbiAgICAgICAgIW1hdGNoZXNPdXRwdXRQYXRoKGV4cGxpY2l0T3V0cHV0UGF0aHMsIGZpbGVQYXRoKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRFbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5Lmhhc2hQYXRoKS5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIFVudHJhY2tlZCBmaWxlcyBuZXZlciBhcHBlYXIgaW4gYGdpdCBkaWZmYCwgc28gaGFzaCB0aGVpciBjb250ZW50cyBkaXJlY3RseS5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZpbHRlcmVkRW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS51bnRyYWNrZWQpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBoYXNoLnVwZGF0ZShlbnRyeS5oYXNoUGF0aCk7XG4gICAgICAgIGhhc2gudXBkYXRlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgZW50cnkuZmlsZVBhdGgpKSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIGZpbGUgbWF5IHZhbmlzaCBjb25jdXJyZW50bHk7IHRoZSB0cmFja2VkLXN0YXRlIGRpZmYgYmVsb3cgaXMgdW5hZmZlY3RlZC5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0cmFja2VkUGF0aHMgPSBmaWx0ZXJlZEVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gIWVudHJ5LnVudHJhY2tlZCkubWFwKChlbnRyeSkgPT4gZW50cnkuaGFzaFBhdGgpO1xuICAgIGlmICh0cmFja2VkUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBgZ2l0IGRpZmYgSEVBRCAtLWAgd2l0aCBubyBwYXRoc3BlYyB3b3VsZCBkaWZmIEVWRVJZIGZpbGUsIGxldHRpbmcgZXhjbHVkZWQgY2hhbmdlc1xuICAgICAgLy8gKGRvY3MsIHRlc3RzKSBpbnZhbGlkYXRlIHRoZSBjYWNoZS5cbiAgICAgIHJlc29sdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYGdpdCBkaWZmIEhFQURgIChub3QgcGxhaW4gYGdpdCBkaWZmYCkgc28gc3RhZ2VkLW9ubHkgY2hhbmdlcyBpbnZhbGlkYXRlIHRoZSBjYWNoZSB0b287XG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoLlxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnSEVBRCcsICctLScsIC4uLnRyYWNrZWRQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBvbWl0U2lsZW50U3RhcnQ/OiBib29sZWFuO1xuICBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbjtcbiAgcHJvY2Vzc1NpbGVudE91dHB1dD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcmludFJhd091dHB1dD86IGJvb2xlYW47XG4gIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seT86IGJvb2xlYW47XG4gIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc2lsZW50U3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZmZlcmVkUnVuUmVzdWx0IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgb3V0cHV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHsgc2lsZW50PzogYm9vbGVhbiB9LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKCEoYXJndi5zaWxlbnQgJiYgb3B0cy5vbWl0U2lsZW50U3RhcnQgJiYgIWFyZ3YuZHJ5UnVuKSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsIGFyZ3Yuc2lsZW50ID8gJ0NvbW1hbmQnIDogJ1N0YXJ0Jyk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgPSBCb29sZWFuKFxuICAgIGFyZ3Yuc2lsZW50ICYmIChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPz8gb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkpXG4gICk7XG4gIGxldCB3cm90ZVNpbGVudFByb2dyZXNzID0gZmFsc2U7XG4gIGNvbnN0IHByb2dyZXNzVGltZXIgPVxuICAgIGFyZ3Yuc2lsZW50ICYmIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zXG4gICAgICA/IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLicpO1xuICAgICAgICAgIHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB9LCBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyAoYXJndi5zaWxlbnQgPyB0cnVlIDogdW5kZWZpbmVkKSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogYXJndi5zaWxlbnQgPyAncGlwZScgOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZzogYXJndi5zaWxlbnQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBpZiAocHJvZ3Jlc3NUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKHdyb3RlU2lsZW50UHJvZ3Jlc3MpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbiAgaWYgKHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgJiYgKCFvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSB8fCBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICBjb25zdCBvdXRwdXQgPSAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8gb3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0KHJldC5zdGRvdXQpIDogcmV0LnN0ZG91dCkudHJpbSgpO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICB9XG4gIGlmIChhcmd2LnNpbGVudCAmJiBleGl0Q29kZSA9PT0gMCAmJiBvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpKTtcbiAgfVxuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIGV4aXRDb2RlLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCAmJiAhb3B0cy5wcmludFJhd091dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPEJ1ZmZlcmVkUnVuUmVzdWx0PiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICBvdXRwdXQ6ICcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gdHJ1ZSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4aXRDb2RlOiByZXQuc3RhdHVzID8/IDEsXG4gICAgICBvdXRwdXQ6IHJldC5zdGRvdXQsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICAvLyBObyBgLS1idW5gOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrcyB0b29scyByZXF1aXJpbmdcbiAgLy8gcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgY29uc3QgcHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbCgvUFJJU01BIGdlbmVyYXRlKD8hXFxzKy0tbm8taGludHMpKD89XFxzfCQpL2d1LCAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gcnVuICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4pIHJ1bmAuXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIHJ1biBidW4gcnVuJywgJ2J1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAvLyBLZWVwIFBsYXl3cmlnaHQgYXMgYSBwYWNrYWdlLW1hbmFnZXIgY29tbWFuZCBpbnN0ZWFkIG9mIHJlc29sdmluZyBpdCB0aHJvdWdoIG5vZGVfbW9kdWxlcy8uYmluLlxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgIC5yZXBsYWNlQWxsKCdZQVJOICcsICFwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCk7XG4gIHJldHVybiB7XG4gICAgcHJpbnRhYmxlOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBkb3RlbnYgLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz4sXG4gIHByaW50T3B0aW9uczogeyBzaWxlbnRTdWNjZXNzPzogYm9vbGVhbiB9ID0ge31cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBpZiAocHJpbnRPcHRpb25zLnNpbGVudFN1Y2Nlc3MpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBjb25maWd1cmVDb2xvckVudihuZXdFbnYsIG9wdHMucHJlc2VydmVDb2xvcik7XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBjaGlsZC1wcm9jZXNzIGNvbG9yIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igd2ItbWFuYWdlZCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIGVudiBUaGUgY2hpbGQtcHJvY2VzcyBlbnZpcm9ubWVudCB0byBtdXRhdGUuXG4gKiBAcGFyYW0gcHJlc2VydmVDb2xvciBXaGV0aGVyIHdiIHNob3VsZCBwcmVzZXJ2ZSBjb2xvcnMgZm9yIG91dHB1dCB0aGF0IGl0IGNhcHR1cmVzIGFuZCByZXByaW50cyB0byBhbiBpbnRlcmFjdGl2ZSBUVFkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVDb2xvckVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIHByZXNlcnZlQ29sb3I/OiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChlbnYuTk9fQ09MT1IgIT09IHVuZGVmaW5lZCB8fCBwcmVzZXJ2ZUNvbG9yID09PSBmYWxzZSkge1xuICAgIC8vIE5PX0NPTE9SIGFuZCBwcmVzZXJ2ZUNvbG9yPWZhbHNlIGFyZSBleHBsaWNpdCBuby1jb2xvciBjaG9pY2VzLCBzbyBpbmhlcml0ZWQgRk9SQ0VfQ09MT1IgbXVzdCBub3QgbGVhayB0aHJvdWdoLlxuICAgIGRlbGV0ZSBlbnYuRk9SQ0VfQ09MT1I7XG4gIH0gZWxzZSBpZiAocHJlc2VydmVDb2xvciAmJiBwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAgIGVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IEZPUkNFX0tJTExfREVMQVlfTVMgPSA1MDAwO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAna2lsbC1vdGhlcnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZXhpdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2tpbGwtb3RoZXJzLW9uLWZhaWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZmFpbHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc3VjY2Vzczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGVmaW5lIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBjcml0ZXJpYScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogWydhbGwnLCAnZmlyc3QnXSxcbiAgICBkZWZhdWx0OiAnYWxsJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdDb21tYW5kcyB0byBydW4gY29uY3VycmVudGx5JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuaW50ZXJmYWNlIFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMge1xuICBjb21tYW5kczogc3RyaW5nW107XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIGtpbGxPdGhlcnM6IGJvb2xlYW47XG4gIGtpbGxPdGhlcnNPbkZhaWw6IGJvb2xlYW47XG4gIHN1Y2Nlc3M6ICdhbGwnIHwgJ2ZpcnN0JztcbiAgY2k/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbmN1cnJlbnRseShvcHRpb25zOiBSdW5Db25jdXJyZW50bHlPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zLmNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT5cbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduKG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBvcHRpb25zLnByb2plY3QpLnJ1bm5hYmxlLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMucHJvamVjdC5kaXJQYXRoLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihvcHRpb25zLnByb2plY3QuZW52LCB7IGNpOiBvcHRpb25zLmNpIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gICk7XG5cbiAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gIGxldCBpbnRlcnJ1cHRlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RvcFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JjZUtpbGxQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5mcm9tPG51bWJlciB8IHVuZGVmaW5lZD4oeyBsZW5ndGg6IGNoaWxkcmVuLmxlbmd0aCB9KTtcbiAgY29uc3Qgd2FpdEZvckV4aXRQcm9taXNlcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dGxlID0gKGV4aXRDb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBleGl0Q29kZTtcbiAgICAgICAgZmlyc3RSZXN1bHQgPz89IGV4aXRDb2RlO1xuXG4gICAgICAgIGlmICghc3RvcHBpbmcgJiYgc2hvdWxkU3RvcE90aGVycyhleGl0Q29kZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICBzdG9wUmVzdWx0ID0gZXhpdENvZGU7XG4gICAgICAgICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sICdTSUdURVJNJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSA/PyB1bmRlZmluZWQsIHNpZ25hbCA/PyB1bmRlZmluZWQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBzdG9wQWxsID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICBpbnRlcnJ1cHRlZFNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgIGlmIChzdG9wcGluZykgcmV0dXJuO1xuXG4gICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIHNpZ25hbCkpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdpbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHSU5UJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3Rlcm0gPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHVEVSTScpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdxdWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1FVSVQnKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICBwcm9jZXNzLm9uKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvckV4aXRQcm9taXNlcyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZm9yY2VLaWxsUHJvbWlzZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgfVxuXG4gIGlmIChpbnRlcnJ1cHRlZFNpZ25hbCkge1xuICAgIHJldHVybiBnZXRFeGl0Q29kZSh1bmRlZmluZWQsIGludGVycnVwdGVkU2lnbmFsKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcpIHtcbiAgICByZXR1cm4gZmlyc3RSZXN1bHQgPz8gMTtcbiAgfVxuICBpZiAoc3RvcFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0b3BSZXN1bHQ7XG4gIH1cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGl0Q29kZShjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgaWYgKHNpZ25hbCAmJiBzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpIHtcbiAgICByZXR1cm4gMTI4ICsgY29uc3RhbnRzLnNpZ25hbHNbc2lnbmFsXTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3RvcE90aGVycyhcbiAgZXhpdENvZGU6IG51bWJlcixcbiAgb3B0aW9uczogUGljazxSdW5Db25jdXJyZW50bHlPcHRpb25zLCAna2lsbE90aGVycycgfCAna2lsbE90aGVyc09uRmFpbCcgfCAnc3VjY2Vzcyc+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0JyB8fCBvcHRpb25zLmtpbGxPdGhlcnMgfHwgKG9wdGlvbnMua2lsbE90aGVyc09uRmFpbCAmJiBleGl0Q29kZSAhPT0gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZvcmNlS2lsbFBpZHMgPSBzaWduYWxQaWRzKHRvQ2hpbGRQaWRzKGNoaWxkcmVuKSwgc2lnbmFsKTtcbiAgaWYgKGZvcmNlS2lsbFBpZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgaWYgKGF3YWl0IHdhaXRGb3JGb3JjZUtpbGwoZm9yY2VLaWxsUGlkcykpIHtcbiAgICBzaWduYWxQaWRzKGZvcmNlS2lsbFBpZHMsICdTSUdLSUxMJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9DaGlsZFBpZHMoY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBjaGlsZHJlbi5mbGF0TWFwKChjaGlsZCkgPT4gKGNoaWxkLnBpZCA9PT0gdW5kZWZpbmVkID8gW10gOiBbY2hpbGQucGlkXSkpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxQaWRzKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogbnVtYmVyW10ge1xuICBjb25zdCBzaWduYWxlZFBpZHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgcGlkIG9mIHBpZHMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFraWxsUHJvY2Vzc0dyb3VwKHBpZCwgc2lnbmFsKSkgY29udGludWU7XG5cbiAgICAgIHNpZ25hbGVkUGlkcy5wdXNoKHBpZCk7XG4gICAgICB0cmVlS2lsbChwaWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGtpbGwgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaWduYWxlZFBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JGb3JjZUtpbGwocGlkczogcmVhZG9ubHkgbnVtYmVyW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRk9SQ0VfS0lMTF9ERUxBWV9NUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChwaWRzLmV2ZXJ5KGlzUHJvY2Vzc0dyb3VwR29uZSkpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IHNsZWVwKE1hdGgubWluKDEwMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0dyb3VwR29uZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCAwKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzR3JvdXAocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgc2lnbmFsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IGJ1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZCwgZ2V0RDFEYXRhYmFzZU5hbWUsIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpciB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuY29uc3QgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FID0gJ2xpdGVzdHJlYW0ueW1sJztcbmNvbnN0IERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcblxuY2xhc3MgRHJpenpsZVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnY2xlYW51cC1saXRlc3RyZWFtJyk7XG4gICAgY29uc3Qgd2FsQ2hlY2twb2ludENvbW1hbmQgPSBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF0gJiYgY29tbWFuZCAtdiBzcWxpdGUzID4vZGV2L251bGw7IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBzcWxpdGUzIFwiJHtkYlBhdGh9XCI7IGZpYDtcbiAgICByZXR1cm4gYCR7d2FsQ2hlY2twb2ludENvbW1hbmR9OyBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qOyBybSAtUmYgXCIke3BhdGguZGlybmFtZShkYlBhdGgpfS8uJHtwYXRoLmJhc2VuYW1lKGRiUGF0aCl9XCIqIHx8IHRydWVgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgZDFEYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgICBpZiAoZDFEYXRhYmFzZU5hbWUpIHtcbiAgICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBEMSBzdWJ0cmVlIHNvIHRoYXQgb3RoZXIgbG9jYWxseS1wZXJzaXN0ZWQgYmluZGluZ3MgKEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKSBzdXJ2aXZlLFxuICAgICAgLy8gdGhlbiByZS1tYXRlcmlhbGl6ZSB0aGUgRDEgU1FMaXRlIGZpbGUuIEl0cyBwYXRoIGlzIGRldGVybWluaXN0aWMsIHNvIGEgREFUQUJBU0VfVVJMIGV4cG9ydGVkXG4gICAgICAvLyBiZWZvcmUgdGhlIHJlbW92YWwgc3RheXMgdmFsaWQuXG4gICAgICByZXR1cm4gYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfS92My9kMVwiICYmICR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGQxRGF0YWJhc2VOYW1lKX0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpO1xuICAgIGlmICghcmVtb3ZlQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgcmVzZXQgc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VlZENvbW1hbmQgPSB0aGlzLnNlZWQocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0ZUNvbW1hbmQgPSB0aGlzLmRlcGxveShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlZWRDb21tYW5kID09PSAndHJ1ZScgPyBtaWdyYXRlQ29tbWFuZCA6IGAke21pZ3JhdGVDb21tYW5kfSAmJiAke3NlZWRDb21tYW5kfWA7XG4gIH1cblxuICBtaWdyYXRlRm9yU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgKGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpIHx8IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgbWlncmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdkZXBsb3ktZm9yY2UnKTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGgpO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIFRoZSBlbnZpcm9ubWVudCBhc3NpZ25tZW50IG11c3QgZ28gdGhyb3VnaCBidWlsZERyaXp6bGVLaXRDb21tYW5kOiBwcmVmaXhpbmcgaXRzXG4gICAgLy8gcG9zc2libHktcGFyZW50aGVzaXplZCByZXN1bHQgd2l0aCBgQUxMT1dfVE9fU0tJUF9TRUVEPTBgIHdvdWxkIGJlIGEgc2hlbGwgc3ludGF4IGVycm9yLlxuICAgIGNvbnN0IG1pZ3JhdGVXaXRoU2VlZENvbW1hbmQgPSBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsICdtaWdyYXRlJywgJ0FMTE9XX1RPX1NLSVBfU0VFRD0wJyk7XG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07ICR7dGhpcy5kZXBsb3kocHJvamVjdCl9ICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofVwiICYmIGxzIC1haGwgXCIke2RiUGF0aH1cIiAmJiAke21pZ3JhdGVXaXRoU2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdsaXN0LWJhY2t1cHMnKTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ3Jlc3RvcmUnKTtcbiAgICByZXR1cm4gYCR7YnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKG91dHB1dFBhdGgpfTsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gXCIke291dHB1dFBhdGh9XCIgXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICBnZW5lcmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgZ2VuZXJhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cblxuICBtaWdyYXRlRGV2KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5zZWVkKSByZXR1cm4gJ1lBUk4gcnVuIHNlZWQnO1xuICAgIGNvbnN0IGRlZmF1bHRTZWVkUGF0aCA9IHBhdGguam9pbignZGInLCAnc2VlZC50cycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRlZmF1bHRTZWVkUGF0aCkpKSB7XG4gICAgICByZXR1cm4gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgQlVOICR7ZGVmYXVsdFNlZWRQYXRofWAgOiBgQlVOIGJ1aWxkLXRzIHJ1biAke2RlZmF1bHRTZWVkUGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHN0dWRpbyBmb3IgRHJpenpsZSBkb2VzIG5vdCBzdXBwb3J0IGRiLXVybC1vci1wYXRoLicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmdzOiBzdHJpbmcsIGVudmlyb25tZW50QXNzaWdubWVudCA9ICcnKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZCA9IGAke2Vudmlyb25tZW50QXNzaWdubWVudCAmJiBgJHtlbnZpcm9ubWVudEFzc2lnbm1lbnR9IGB9WUFSTiBkcml6emxlLWtpdCAke2FyZ3N9YDtcbiAgLy8gQSBjYWxsZXItc3VwcGxpZWQgLS1jb25maWcgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHNvIHRoZSBjd2QgbXVzdCBzdGF5IHRoZXJlLlxuICByZXR1cm4gYXJncy5pbmNsdWRlcygnLS1jb25maWcnKSA/IGNvbW1hbmQgOiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgY29tbWFuZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdDogUHJvamVjdCwgY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIC8vIGRyaXp6bGUta2l0IHJlc29sdmVzIHJlbGF0aXZlIHBhdGhzIGluIGl0cyBjb25maWcgYWdhaW5zdCB0aGUgY3dkLCBzbyB0aGUgY29tbWFuZCBtdXN0IHJ1blxuICAvLyBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZHJpenpsZS5jb25maWcuKiBldmVuIHdoZW4gbW9ub3JlcG8gcGFja2FnZXMgc2hhcmUgaXQgYXQgdGhlIHJvb3QuXG4gIHJldHVybiBjb25maWcgJiYgY29uZmlnLmRpclBhdGggIT09IHByb2plY3QuZGlyUGF0aFxuICAgID8gYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBjb25maWcuZGlyUGF0aF0pfSAmJiAke2NvbW1hbmR9KWBcbiAgICA6IGNvbW1hbmQ7XG59XG5cbi8qKlxuICogV2hldGhlciBkcml6emxlLWtpdCBpcyB0aGUgcHJvamVjdCdzIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20uIEEgZHJpenpsZS1vcm0gZGVwZW5kZW5jeSBhbG9uZSBpc1xuICogbm90IGEgcmVsaWFibGUgbWFya2VyOiBhIFdvcmtlciBtYXkgdXNlIEQxIG9ubHkgZm9yIGNhY2hpbmcgd2hpbGUgaXRzIGRyaXp6bGUgY29uZmlnIHRhcmdldHMgYW5cbiAqIHVucmVsYXRlZCBkYXRhYmFzZSAoZS5nLiBQb3N0Z3JlU1FMIHZpYSBIeXBlcmRyaXZlKSwgYW5kIHJ1bm5pbmcgYGRyaXp6bGUta2l0IG1pZ3JhdGVgIGFnYWluc3RcbiAqIHRoYXQgZGF0YWJhc2UgZHVyaW5nIGEgRDEgZGVwbG95IHdvdWxkIGJlIHdyb25nIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NDIpLlxuICogU28gcmVxdWlyZSBhbiBleHBsaWNpdCBtYXJrZXI6IGEgZHJpenpsZSBjb25maWcgd2hvc2UgZGlhbGVjdC9kcml2ZXIgdGFyZ2V0cyBzcWxpdGUsIGQxLWh0dHAsIG9yXG4gKiBkdXJhYmxlLXNxbGl0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXNEcml6emxlS2l0Rm9yRDEocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGZpbmREcml6emxlQ29uZmlnKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHN0cmlwSnNDb21tZW50cyhmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBjb25maWcuZmlsZU5hbWUpLCAndXRmOCcpKTtcbiAgICAvLyBTY2FuIG9ubHkgdGhlIGV4cG9ydGVkIGNvbmZpZydzIG9iamVjdCBsaXRlcmFsOiBkcml6emxlLWtpdCBjb25zdW1lcyB0aGUgZGVmYXVsdCBleHBvcnQsXG4gICAgLy8gYW5kIG1hdGNoaW5nIG90aGVyIHRleHQgKGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50IGFib3ZlIHRoZSBleHBvcnQsIG9yIG1hcmtlci1saWtlXG4gICAgLy8gc3RyaW5nIGNvbnRlbnQgaW4gc3RhdGVtZW50cyBhZnRlciBpdCkgd291bGQgc2VsZWN0IHRoZSB3cm9uZyBtaWdyYXRpb24gbWVjaGFuaXNtLlxuICAgIC8vIFBPU0lUSU9OUyAoZXhwb3J0IG1hcmtlcnMsIGRlY2xhcmF0aW9ucykgYXJlIGxvY2F0ZWQgb24gYSBzdHJpbmctbWFza2VkIHZpZXcgb2YgdGhlIHNhbWVcbiAgICAvLyBsZW5ndGgsIHNvIGBleHBvcnQgZGVmYXVsdGAgaW5zaWRlIGEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IG1pc2xlYWQgdGhlIHNlYXJjaC5cbiAgICBjb25zdCBtYXNrZWRDb250ZW50ID0gbWFza1N0cmluZ0NvbnRlbnRzKGNvbnRlbnQpO1xuICAgIGNvbnN0IGV4cG9ydEluZGljZXMgPSBbJ2V4cG9ydCBkZWZhdWx0JywgJ21vZHVsZS5leHBvcnRzJ11cbiAgICAgIC5tYXAoKG1hcmtlcikgPT4gbWFza2VkQ29udGVudC5pbmRleE9mKG1hcmtlcikpXG4gICAgICAuZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKTtcbiAgICBjb25zdCBleHBvcnRTdGFydEluZGV4ID0gZXhwb3J0SW5kaWNlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4uZXhwb3J0SW5kaWNlcykgOiAwO1xuICAgIGNvbnN0IG9iamVjdFNwYW4gPSBleHRyYWN0RXhwb3J0ZWRDb25maWdPYmplY3QoY29udGVudCwgbWFza2VkQ29udGVudCwgZXhwb3J0U3RhcnRJbmRleCk7XG4gICAgcmV0dXJuIG9iamVjdFNwYW4gIT09IHVuZGVmaW5lZCAmJiBkZWNsYXJlc1NxbGl0ZVRhcmdldChvYmplY3RTcGFuKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG9iamVjdCBsaXRlcmFsIHRoZSBleHBvcnQgYWN0dWFsbHkgZXZhbHVhdGVzIHRvOiBmb3IgYGV4cG9ydCBkZWZhdWx0IHsuLi59YCBvclxuICogYGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7Li4ufSlgIHRoZSBmaXJzdCBiYWxhbmNlZCBvYmplY3QgYWZ0ZXIgdGhlIG1hcmtlciwgYW5kIGZvclxuICogYGV4cG9ydCBkZWZhdWx0IGNvbmZpZztgIHRoZSBpbml0aWFsaXplciBvZiB0aGF0IGlkZW50aWZpZXIncyBkZWNsYXJhdGlvbiDigJQgbmV2ZXIgdGhlIHdob2xlXG4gKiBmaWxlLCBzaW5jZSBhbiB1bnJlbGF0ZWQgb2JqZWN0IChlLmcuIGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50KSBtdXN0IG5vdCBiZSBzZWxlY3RlZC5cbiAqIFVuZGVmaW5lZCB3aGVuIHRoZSBleHByZXNzaW9uIGNhbm5vdCBiZSByZXNvbHZlZDsgd2IgZGVwbG95J3MgdW5tYW5hZ2VkLUQxIHdhcm5pbmcgY292ZXJzIHRoYXQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRlZENvbmZpZ09iamVjdChcbiAgY29udGVudDogc3RyaW5nLFxuICBtYXNrZWRDb250ZW50OiBzdHJpbmcsXG4gIGV4cG9ydFN0YXJ0SW5kZXg6IG51bWJlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhwb3J0ZWRFeHByZXNzaW9uID0gbWFza2VkQ29udGVudFxuICAgIC5zbGljZShleHBvcnRTdGFydEluZGV4KVxuICAgIC5yZXBsYWNlKC9eKD86ZXhwb3J0XFxzK2RlZmF1bHR8bW9kdWxlXFwuZXhwb3J0c1xccyo9KVxccyovLCAnJyk7XG4gIC8vIEFuIGlkZW50aWZpZXIgZXhwb3J0IG1heSBjYXJyeSBhIFR5cGVTY3JpcHQgdHlwZSBwb3N0Zml4IChgY29uZmlnIHNhdGlzZmllcyBDb25maWc7YCAvXG4gIC8vIGBjb25maWcgYXMgQ29uZmlnO2ApOyB0aGUgaWRlbnRpZmllciBpcyByZWNvZ25pemVkIEZJUlNUIHNvIGEgcG9zdGZpeCBjb250YWluaW5nIGEgVFlQRVxuICAvLyBsaXRlcmFsIChgc2F0aXNmaWVzIHsgZGlhbGVjdDogJ3NxbGl0ZScgfCAuLi4gfWApIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcnVudGltZSBjb25maWcuXG4gIGNvbnN0IGlkZW50aWZpZXJNYXRjaCA9IC9eKFtBLVphLXpfJF1bXFx3JF0qKVxccyooPzpzYXRpc2ZpZXNcXGJ8YXNcXGJ8O3xcXG58JCkvLmV4ZWMoZXhwb3J0ZWRFeHByZXNzaW9uKTtcbiAgaWYgKCFpZGVudGlmaWVyTWF0Y2gpIHtcbiAgICBjb25zdCBicmFjZU9mZnNldCA9IG1hc2tlZENvbnRlbnQuc2xpY2UoZXhwb3J0U3RhcnRJbmRleCkuaW5kZXhPZigneycpO1xuICAgIGlmIChicmFjZU9mZnNldCA9PT0gLTEpIHJldHVybjtcbiAgICByZXR1cm4gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudC5zbGljZShleHBvcnRTdGFydEluZGV4ICsgYnJhY2VPZmZzZXQpKTtcbiAgfVxuXG4gIC8vIGAkYCBpcyBsZWdhbCBpbiBpZGVudGlmaWVycyBidXQgYSByZWdleCBhbmNob3IsIHNvIGl0IG11c3QgYmUgZXNjYXBlZCBiZWZvcmUgaW50ZXJwb2xhdGlvbjtcbiAgLy8gYCg/IVtcXHckXSlgIChub3QgYFxcYmApIGVuZHMgdGhlIG1hdGNoIGJlY2F1c2UgYFxcYmAgbmV2ZXIgZmlyZXMgYWZ0ZXIgYSB0cmFpbGluZyBgJGAuXG4gIGNvbnN0IGVzY2FwZWRJZGVudGlmaWVyID0gaWRlbnRpZmllck1hdGNoWzFdIS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgY29uc3QgZGVjbGFyYXRpb25FbmRJbmRleCA9IGZpbmRNb2R1bGVTY29wZURlY2xhcmF0aW9uRW5kKG1hc2tlZENvbnRlbnQsIGVzY2FwZWRJZGVudGlmaWVyKTtcbiAgaWYgKGRlY2xhcmF0aW9uRW5kSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAvLyBUaGUgaW5pdGlhbGl6ZXIgbXVzdCBiZWxvbmcgdG8gVEhJUyBkZWNsYXJhdGlvbiAoYSB0eXBlIGFubm90YXRpb24gbWF5IHByZWNlZGUgdGhlIGA9YCk7IGFuXG4gIC8vIHVuaW5pdGlhbGl6ZWQgYGxldCBjb25maWc7YCBzdGF5cyB1bnJlc29sdmVkIGluc3RlYWQgb2YgZ3JhYmJpbmcgYSBsYXRlciBzdGF0ZW1lbnQncyBgPWAuXG4gIGNvbnN0IGFzc2lnbm1lbnRNYXRjaCA9IC9eXFxzKig/OjpbXj07XFxuXSopPz0vLmV4ZWMobWFza2VkQ29udGVudC5zbGljZShkZWNsYXJhdGlvbkVuZEluZGV4KSk7XG4gIGlmICghYXNzaWdubWVudE1hdGNoKSByZXR1cm47XG4gIHJldHVybiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50LnNsaWNlKGRlY2xhcmF0aW9uRW5kSW5kZXggKyBhc3NpZ25tZW50TWF0Y2hbMF0ubGVuZ3RoKSk7XG59XG5cbi8qKlxuICogVGhlIGVuZCBpbmRleCBvZiB0aGUgaWRlbnRpZmllcidzIGRlY2xhcmF0aW9uIGF0IGJyYWNlIGRlcHRoIFpFUk8gKG1vZHVsZSBzY29wZSk6IGEgc2FtZS1uYW1lZFxuICogZGVjbGFyYXRpb24gaW5zaWRlIGEgZnVuY3Rpb24gYm9keSBtdXN0IG5vdCBzaGFkb3cgdGhlIGJpbmRpbmcgdGhlIGV4cG9ydCByZWZlcmVuY2VzLCBhbmRcbiAqIGluZGVudGF0aW9uIGlzIG5vIHNjb3BlIHNpZ25hbCDigJQgZGVwdGggb3ZlciB0aGUgc3RyaW5nLW1hc2tlZCBjb250ZW50IGlzLlxuICovXG5mdW5jdGlvbiBmaW5kTW9kdWxlU2NvcGVEZWNsYXJhdGlvbkVuZChtYXNrZWRDb250ZW50OiBzdHJpbmcsIGVzY2FwZWRJZGVudGlmaWVyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNsYXJhdGlvblJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YCg/PCFbXFx3JF0pKD86ZXhwb3J0XFxzKyk/KD86Y29uc3R8bGV0fHZhcilcXHMrJHtlc2NhcGVkSWRlbnRpZmllcn0oPyFbXFx3JF0pYCxcbiAgICAnZydcbiAgKTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHNjYW5JbmRleCA9IDA7XG4gIGZvciAobGV0IG1hdGNoID0gZGVjbGFyYXRpb25SZWdleC5leGVjKG1hc2tlZENvbnRlbnQpOyBtYXRjaDsgbWF0Y2ggPSBkZWNsYXJhdGlvblJlZ2V4LmV4ZWMobWFza2VkQ29udGVudCkpIHtcbiAgICBmb3IgKDsgc2NhbkluZGV4IDwgbWF0Y2guaW5kZXg7IHNjYW5JbmRleCsrKSB7XG4gICAgICBjb25zdCBjaGFyID0gbWFza2VkQ29udGVudFtzY2FuSW5kZXhdO1xuICAgICAgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09ICd9JykgZGVwdGgtLTtcbiAgICB9XG4gICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdGhlIENPTlRFTlRTIG9mIHN0cmluZyBsaXRlcmFscyB3aXRoIHNwYWNlcyAoc2FtZSBsZW5ndGgsIG5ld2xpbmVzIGtlcHQpLCBzbyBwb3NpdGlvblxuICogc2VhcmNoZXMgb3ZlciB0aGUgcmVzdWx0IGNhbm5vdCBtYXRjaCB0ZXh0IGluc2lkZSBzdHJpbmdzIHdoaWxlIGFsbCBpbmRleGVzIHN0aWxsIG1hcCAxOjEgdG9cbiAqIHRoZSBvcmlnaW5hbCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBtYXNrU3RyaW5nQ29udGVudHMoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICByZXN1bHQgKz0gJyAgJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHtcbiAgICAgICAgc3RyaW5nRGVsaW1pdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhciA9PT0gJ1xcbicgPyAnXFxuJyA6ICcgJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmctYXdhcmUgc2NhbiBmb3IgdGhlIG1hcmtlcnMgaW5kaWNhdGluZyB0aGUgY29uZmlnIG1hbmFnZXMgYSAoQ2xvdWRmbGFyZSBEMSBjb21wYXRpYmxlKVxuICogU1FMaXRlIGRhdGFiYXNlIOKAlCBhIGBkaWFsZWN0OiAnc3FsaXRlJ2AsIGBkcml2ZXI6ICdkMS1odHRwJ2AsIG9yIGBkcml2ZXI6ICdkdXJhYmxlLXNxbGl0ZSdgXG4gKiBQUk9QRVJUWSAocGxhaW4gb3IgcXVvdGVkIGtleSkuIEtleXMgYXJlIG9ubHkgcmVjb2duaXplZCBpbiBjb2RlIHBvc2l0aW9uLCBzbyBtYXJrZXItbGlrZSB0ZXh0XG4gKiBlbWJlZGRlZCBpbiB1bnJlbGF0ZWQgc3RyaW5nIHZhbHVlcyAoZS5nLiBhIHNjaGVtYSBwYXRoKSBjYW5ub3QgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzU3FsaXRlVGFyZ2V0KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZ3MoY29udGVudCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHZhbHVlVG9rZW5JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnY29kZScpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58W1xcc3ssKF0pKGRpYWxlY3R8ZHJpdmVyKVxccyo6XFxzKiQvLmV4ZWModG9rZW4udmFsdWUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGtleSA9IG1hdGNoWzFdO1xuICAgICAgICB2YWx1ZVRva2VuSW5kZXggPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ2RpYWxlY3QnIHx8IHRva2VuLnZhbHVlID09PSAnZHJpdmVyJykge1xuICAgICAgLy8gQSBxdW90ZWQga2V5OiB0aGUgc3Vycm91bmRpbmcgY29kZSB0b2tlbnMgbXVzdCBmb3JtIGEgcHJvcGVydHkgcG9zaXRpb24gKGB7YC9gLGAgYmVmb3JlLFxuICAgICAgLy8gYDpgIGFmdGVyKS5cbiAgICAgIGNvbnN0IHByZXZpb3VzVG9rZW4gPSB0b2tlbnNbaW5kZXggLSAxXTtcbiAgICAgIGNvbnN0IG5leHRUb2tlbiA9IHRva2Vuc1tpbmRleCArIDFdO1xuICAgICAgaWYgKFxuICAgICAgICBwcmV2aW91c1Rva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL1t7LChdXFxzKiQvLnRlc3QocHJldmlvdXNUb2tlbi52YWx1ZSkgJiZcbiAgICAgICAgbmV4dFRva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL15cXHMqOlxccyokLy50ZXN0KG5leHRUb2tlbi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBrZXkgPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgdmFsdWVUb2tlbkluZGV4ID0gaW5kZXggKyAyO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwgdmFsdWVUb2tlbkluZGV4ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdmFsdWVUb2tlbiA9IHRva2Vuc1t2YWx1ZVRva2VuSW5kZXhdO1xuICAgIGlmICh2YWx1ZVRva2VuPy50eXBlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgaWYgKGtleSA9PT0gJ2RpYWxlY3QnICYmIHZhbHVlVG9rZW4udmFsdWUgPT09ICdzcWxpdGUnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoa2V5ID09PSAnZHJpdmVyJyAmJiAodmFsdWVUb2tlbi52YWx1ZSA9PT0gJ2QxLWh0dHAnIHx8IHZhbHVlVG9rZW4udmFsdWUgPT09ICdkdXJhYmxlLXNxbGl0ZScpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXQgaW50byBhbHRlcm5hdGluZyBjb2RlIGFuZCBzdHJpbmctbGl0ZXJhbC1jb250ZW50IHRva2VucyAocXVvdGVzIGV4Y2x1ZGVkKS4gVGhlIGlucHV0IGlzXG4gKiBhbHJlYWR5IGNvbW1lbnQtZnJlZSDigJQgdXNlc0RyaXp6bGVLaXRGb3JEMSBydW5zIHN0cmlwSnNDb21tZW50cyBiZWZvcmUgYW55IHNjYW5uaW5nIOKAlCBzb1xuICogY29tbWVudCBkZWxpbWl0ZXJzIG5lZWQgbm8gaGFuZGxpbmcgaGVyZSAoYSBjb21tZW50ZWQtb3V0IGAvLyBkaWFsZWN0OiAnc3FsaXRlJ2AgY2FuIG5ldmVyXG4gKiByZWFjaCB0aGlzIHRva2VuaXplcikuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplU3RyaW5ncyhjb250ZW50OiBzdHJpbmcpOiB7IHR5cGU6ICdjb2RlJyB8ICdzdHJpbmcnOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IHRva2VuczogeyB0eXBlOiAnY29kZScgfCAnc3RyaW5nJzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgbGV0IGNvZGUgPSAnJztcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ2NvZGUnLCB2YWx1ZTogY29kZSB9KTtcbiAgICAgIGNvZGUgPSAnJztcbiAgICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSBjaGFyKSB7XG4gICAgICAgIGlmIChjb250ZW50W2luZGV4XSA9PT0gJ1xcXFwnKSBpbmRleCsrO1xuICAgICAgICB2YWx1ZSArPSBjb250ZW50W2luZGV4XSA/PyAnJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ3N0cmluZycsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvZGUgKz0gY2hhcjtcbiAgfVxuICB0b2tlbnMucHVzaCh7IHR5cGU6ICdjb2RlJywgdmFsdWU6IGNvZGUgfSk7XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBUaGUgZmlyc3QgYHsgLi4uIH1gIHNwYW4gKHN0cmluZy1hd2FyZSBicmFjZSBtYXRjaGluZyksIG9yIHVuZGVmaW5lZCB3aGVuIG5vbmUgZXhpc3RzLiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhcnRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZigneycpO1xuICBpZiAoc3RhcnRJbmRleCA9PT0gLTEpIHJldHVybjtcblxuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykgaW5kZXgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSBzdHJpbmdEZWxpbWl0ZXIgPSBjaGFyO1xuICAgIGVsc2UgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICBlbHNlIGlmIChjaGFyID09PSAnfScgJiYgLS1kZXB0aCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQuc2xpY2Uoc3RhcnRJbmRleCwgaW5kZXggKyAxKTtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogUmVtb3ZlIGJsb2NrIGFuZCBsaW5lIGNvbW1lbnRzIHNvIGNvbW1lbnRlZC1vdXQgbWFya2VycyAoZS5nLiBgLy8gZGlhbGVjdDogJ3NxbGl0ZSdgIGluIGFcbiAqIFBvc3RncmVTUUwgY29uZmlnKSBjYW5ub3QgbWlzY2xhc3NpZnkgdGhlIGNvbmZpZy4gVGhlIHNjYW5uZXIgdHJhY2tzIHN0cmluZyBzdGF0ZSwgc28gYC8vYFxuICogaW5zaWRlIHN0cmluZyBsaXRlcmFscyAoVVJMcyBzdWNoIGFzIGBodHRwczovLy4uLmAgaW4gY29ubmVjdGlvbiBzdHJpbmdzKSBzdXJ2aXZlcyB3aGlsZVxuICogY29tbWVudHMgZGlyZWN0bHkgYWZ0ZXIgYSBzdHJpbmcgbGl0ZXJhbCBhcmUgc3RpbGwgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBKc0NvbW1lbnRzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IHN0cmluZ0RlbGltaXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGNvbnN0IG5leHRDaGFyID0gY29udGVudFtpbmRleCArIDFdO1xuICAgIGlmIChzdHJpbmdEZWxpbWl0ZXIpIHtcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXIgKyAobmV4dENoYXIgPz8gJycpO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkge1xuICAgICAgICBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnLycpIHtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIHJlc3VsdCArPSAnXFxuJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnKicpIHtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb250ZW50Lmxlbmd0aCAmJiAhKGNvbnRlbnRbaW5kZXhdID09PSAnKicgJiYgY29udGVudFtpbmRleCArIDFdID09PSAnLycpKSBpbmRleCsrO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZERyaXp6bGVDb25maWcocHJvamVjdDogUHJvamVjdCk6IHsgZGlyUGF0aDogc3RyaW5nOyBmaWxlTmFtZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gWydkcml6emxlLmNvbmZpZy50cycsICdkcml6emxlLmNvbmZpZy5tdHMnLCAnZHJpenpsZS5jb25maWcuanMnLCAnZHJpenpsZS5jb25maWcubWpzJ107XG4gIGZvciAoY29uc3QgZGlyUGF0aCBvZiBbcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnJvb3REaXJQYXRoXSkge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gY2FuZGlkYXRlcy5maW5kKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gICAgaWYgKGZpbGVOYW1lKSByZXR1cm4geyBkaXJQYXRoLCBmaWxlTmFtZSB9O1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG4gIHJldHVybiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoYWJzb2x1dGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtZiBcIiR7ZGJQYXRofVwiIFwiJHtkYlBhdGh9LXdhbFwiIFwiJHtkYlBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkZhbWlseUNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdiIGRiICR7Y29tbWFuZE5hbWV9IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuYCk7XG4gIH1cbiAgcmV0dXJuIGRiUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdCwgY29tbWFuZE5hbWUpO1xuICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKGRiUGF0aCkgPyBkYlBhdGggOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYlBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWdQYXRoKSByZXR1cm4gYC1jb25maWcgXCIke2NvbmZpZ1BhdGh9XCJgO1xuXG4gIGNvbnN0IGxvY2FsQ29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsQ29uZmlnUGF0aCkpIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG4gIGlmIChmcy5leGlzdHNTeW5jKERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCkpIHJldHVybiBgLWNvbmZpZyAke0RFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSH1gO1xuICByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xufVxuXG5leHBvcnQgY29uc3QgZHJpenpsZVNjcmlwdHMgPSBuZXcgRHJpenpsZVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi93cmFuZ2xlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JhbmdsZXJEMURhdGFiYXNlIHtcbiAgYmluZGluZz86IHN0cmluZztcbiAgZGF0YWJhc2VfbmFtZT86IHN0cmluZztcbiAgZGF0YWJhc2VfaWQ/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfZGlyPzogc3RyaW5nO1xuICBtaWdyYXRpb25zX3BhdHRlcm4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgRDEgYmluZGluZyB1c2VzIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIHRoYXQgYHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHlgXG4gKiB3b3VsZCBhY3R1YWxseSBkaXNjb3ZlcjogYW4gZXhwbGljaXQgYG1pZ3JhdGlvbnNfcGF0dGVybmAgb3B0cyBpbiwgb3RoZXJ3aXNlIHRoZSBtaWdyYXRpb25zXG4gKiBkaXJlY3RvcnkgbXVzdCBjb250YWluIGZsYXQgYCouc3FsYCBmaWxlcyAod3JhbmdsZXIncyBkZWZhdWx0IHBhdHRlcm4pLiBBIGRyaXp6bGUta2l0IGBvdXRgXG4gKiBkaXJlY3Rvcnkgd2l0aCBuZXN0ZWQgYDxuYW1lPi9taWdyYXRpb24uc3FsYCBmaWxlcyBhbmQgbm8gcGF0dGVybiB3b3VsZCBtYXRjaCBub3RoaW5nIGFuZFxuICogc2lsZW50bHkgYXBwbHkgemVybyBtaWdyYXRpb25zLCBzbyBpdCBtdXN0IGZhbGwgdGhyb3VnaCB0byB0aGUgZHJpenpsZS1raXQgbWVjaGFuaXNtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlc1dyYW5nbGVyTmF0aXZlTWlncmF0aW9ucyhwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sIGRhdGFiYXNlOiBXcmFuZ2xlckQxRGF0YWJhc2UpOiBib29sZWFuIHtcbiAgLy8gQW4gZXhwbGljaXQgcGF0dGVybiBvcHRzIGludG8gdGhlIHdyYW5nbGVyLW5hdGl2ZSBtZWNoYW5pc20gZXZlbiBiZWZvcmUgdGhlIGRpcmVjdG9yeVxuICAvLyBleGlzdHM7IHdyYW5nbGVyIHRoZW4gZmFpbHMgc2FmZWx5IHdpdGggXCJObyBtaWdyYXRpb25zIGZvbGRlciBmb3VuZFwiIGluc3RlYWQgb2Ygd2JcbiAgLy8gc2lsZW50bHkgc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IG1pZ3JhdGlvbiBlbmdpbmUuXG4gIGlmIChkYXRhYmFzZS5taWdyYXRpb25zX3BhdHRlcm4pIHJldHVybiB0cnVlO1xuICBjb25zdCBtaWdyYXRpb25zRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRhdGFiYXNlLm1pZ3JhdGlvbnNfZGlyID8/ICdtaWdyYXRpb25zJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhtaWdyYXRpb25zRGlyUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGZzLnJlYWRkaXJTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKS5zb21lKChmaWxlTmFtZSkgPT4gZmlsZU5hbWUuZW5kc1dpdGgoJy5zcWwnKSk7XG59XG5cbmNvbnN0IE5BTUVfS0VZRURfQklORElOR19QQVJFTlRTID0gbmV3IFNldChbJ2JpbmRpbmdzJywgJ3NlbmRfZW1haWwnLCAncmF0ZWxpbWl0cyddKTtcbmNvbnN0IFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMgPSBuZXcgU2V0KFsnd2FzbV9tb2R1bGVzJywgJ3RleHRfYmxvYnMnLCAnZGF0YV9ibG9icyddKTtcblxuLyoqXG4gKiBDb2xsZWN0IGV2ZXJ5IGJpbmRpbmcgbmFtZSBkZWNsYXJlZCBpbiB0aGUgKGVudmlyb25tZW50LXJlc29sdmVkKSBjb25maWcgc3VidHJlZTogYGJpbmRpbmdgXG4gKiBwcm9wZXJ0aWVzIGFueXdoZXJlIChEMSwgS1YsIFIyLCBzZXJ2aWNlcywgYXNzZXRzLCBxdWV1ZXMsIGV0Yy4pLCB0aGUgYG5hbWVgLWtleWVkIGJpbmRpbmdzXG4gKiAoYGR1cmFibGVfb2JqZWN0cy5iaW5kaW5nc2AsIGBsb2dmd2RyLmJpbmRpbmdzYCwgYHNlbmRfZW1haWxgLCBgcmF0ZWxpbWl0c2ApLCBhbmQgdGhlXG4gKiByZWNvcmQta2V5ZWQgbGVnYWN5IG1vZHVsZSBiaW5kaW5ncyAoYHdhc21fbW9kdWxlc2AsIGB0ZXh0X2Jsb2JzYCwgYGRhdGFfYmxvYnNgKS4gQSBzZWNyZXRcbiAqIHNoYXJpbmcgYSBiaW5kaW5nJ3MgbmFtZSB3b3VsZCBzaWxlbnRseSByZXBsYWNlIHRoYXQgYmluZGluZyB3aXRoIGEgcGxhaW4gc3RyaW5nIG9uIGRlcGxveS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RCaW5kaW5nTmFtZXModmFsdWU6IHVua25vd24sIG5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCksIHBhcmVudEtleSA9ICcnKTogU2V0PHN0cmluZz4ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIGNvbGxlY3RCaW5kaW5nTmFtZXMoaXRlbSwgbmFtZXMsIHBhcmVudEtleSk7XG4gICAgcmV0dXJuIG5hbWVzO1xuICB9XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIG5hbWVzO1xuICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICBpZiAoa2V5ID09PSAnYmluZGluZycgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25hbWUnICYmIHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgJiYgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMuaGFzKHBhcmVudEtleSkpIHtcbiAgICAgIG5hbWVzLmFkZChjaGlsZCk7XG4gICAgfSBlbHNlIGlmIChSRUNPUkRfS0VZRURfQklORElOR19LRVlTLmhhcyhrZXkpICYmIGNoaWxkICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmdOYW1lIG9mIE9iamVjdC5rZXlzKGNoaWxkKSkgbmFtZXMuYWRkKGJpbmRpbmdOYW1lKTtcbiAgICB9IGVsc2UgaWYgKGtleSAhPT0gJ2VudicgJiYga2V5ICE9PSAndmFycycgJiYga2V5ICE9PSAnbWV0YWRhdGEnICYmIGtleSAhPT0gJ29wdGlvbnMnKSB7XG4gICAgICAvLyBOZXN0ZWQgYGVudmAgc3VidHJlZXMgYmVsb25nIHRvIG90aGVyIGVudmlyb25tZW50czsgYHZhcnNgIHZhbHVlcywgYHVuc2FmZS5tZXRhZGF0YWAsXG4gICAgICAvLyBhbmQgYHVuc2FmZS5iaW5kaW5nc1tdLmRldi5vcHRpb25zYCBhcmUgYXJiaXRyYXJ5IEpTT04gd2hvc2UgcHJvcGVydGllcyAoZS5nLiBhXG4gICAgICAvLyBcImJpbmRpbmdcIiBmaWVsZCkgYXJlIGRhdGEsIG5vdCBXb3JrZXIgYmluZGluZ3MuXG4gICAgICBjb2xsZWN0QmluZGluZ05hbWVzKGNoaWxkLCBuYW1lcywga2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkV3JhbmdsZXJDb25maWcge1xuICAvKiogVGhlIFdvcmtlciBuYW1lIGZvciB0aGUgZGVwbG95IGVudmlyb25tZW50ICh3cmFuZ2xlciBhcHBlbmRzIGAtPGVudj5gIHdoZW4gdGhlIGVudiBzZWN0aW9uIGhhcyBubyBvd24gbmFtZSkuICovXG4gIHdvcmtlck5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRJZD86IHN0cmluZztcbiAgdmFyS2V5czogc3RyaW5nW107XG4gIC8qKiBUaGUgZW52aXJvbm1lbnQncyBgdmFyc2AgdmFsdWVzIChuZWVkZWQgZm9yIENsb3VkZmxhcmUncyBjb21iaW5lZCBjb3VudC9zaXplIGxpbWl0cykuICovXG4gIHZhcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU2VjcmV0cyBkZWNsYXJlZCBhcyByZXF1aXJlZCB2aWEgd3JhbmdsZXIncyBgc2VjcmV0cy5yZXF1aXJlZGAgKHZhbGlkYXRlZCBhdCBkZXBsb3kgdGltZSkuICovXG4gIHJlcXVpcmVkU2VjcmV0TmFtZXM6IHN0cmluZ1tdO1xuICAvKiogTmFtZXMgb2YgYWxsIG5vbi12YXIgYmluZGluZ3MgKEQxLCBLViwgUjIsIER1cmFibGUgT2JqZWN0cywgc2VuZF9lbWFpbCwgc2VydmljZXMsIC4uLikuICovXG4gIGJpbmRpbmdOYW1lczogc3RyaW5nW107XG4gIGQxRGF0YWJhc2VzOiBXcmFuZ2xlckQxRGF0YWJhc2VbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudmlyb25tZW50IGNvbWVzIGZyb20gYW4gYGVudi48bmFtZT5gIHNlY3Rpb24gKHRoZW4gd3JhbmdsZXIgY29tbWFuZHMgbmVlZFxuICAgKiBgLS1lbnYgPG5hbWU+YCAvIGBDTE9VREZMQVJFX0VOVj08bmFtZT5gKS4gYHByb2R1Y3Rpb25gIG1heSBiZSBlaXRoZXIgdGhlIHRvcCBsZXZlbCBvciBhXG4gICAqIG5hbWVkIGBlbnYucHJvZHVjdGlvbmAgc2VjdGlvbjsgdGhlIHNlY3Rpb24gd2lucyB3aGVuIGl0IGV4aXN0cy5cbiAgICovXG4gIHVzZXNFbnZTZWN0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUmF3V3JhbmdsZXJDb25maWcge1xuICBuYW1lPzogc3RyaW5nO1xuICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICB2YXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGQxX2RhdGFiYXNlcz86IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICBhc3NldHM/OiB1bmtub3duO1xuICBsb2dmd2RyPzogdW5rbm93bjtcbiAgd2FzbV9tb2R1bGVzPzogdW5rbm93bjtcbiAgdGV4dF9ibG9icz86IHVua25vd247XG4gIGRhdGFfYmxvYnM/OiB1bmtub3duO1xuICBzaXRlPzogdW5rbm93bjtcbiAgc2VjcmV0cz86IHsgcmVxdWlyZWQ/OiBzdHJpbmdbXSB9O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBSYXdXcmFuZ2xlckNvbmZpZz47XG59XG5cbi8vIFdvcmtlcnMgU2l0ZXMgaW1wbGljaXRseSBiaW5kcyBpdHMgS1YgbmFtZXNwYWNlIGFzIF9fU1RBVElDX0NPTlRFTlQuXG5mdW5jdGlvbiBzaXRlQmluZGluZ05hbWVzKGNvbmZpZzogUmF3V3JhbmdsZXJDb25maWcsIGVudkNvbmZpZz86IFJhd1dyYW5nbGVyQ29uZmlnKTogc3RyaW5nW10ge1xuICByZXR1cm4gKGVudkNvbmZpZz8uc2l0ZSA/PyBjb25maWcuc2l0ZSkgPyBbJ19fU1RBVElDX0NPTlRFTlQnXSA6IFtdO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHdyYW5nbGVyIGNvbmZpZyB2YWx1ZXMgbmVlZGVkIGZvciBkZXBsb3lpbmcgdG8gdGhlIGdpdmVuIGVudmlyb25tZW50LlxuICogRm9sbG93cyB3cmFuZ2xlcidzIGluaGVyaXRhbmNlIHJ1bGVzOiBgYWNjb3VudF9pZGAgaXMgaW5oZXJpdGVkIGJ5IG5hbWVkIGVudmlyb25tZW50cyxcbiAqIHdoaWxlIGB2YXJzYCBhbmQgYGQxX2RhdGFiYXNlc2AgYXJlIG5vdCBhbmQgbXVzdCBiZSByZWRlY2xhcmVkIHBlciBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXcmFuZ2xlckNvbmZpZ0ZvckVudihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+LFxuICBlbnZOYW1lOiBzdHJpbmdcbik6IFJlc29sdmVkV3JhbmdsZXJDb25maWcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFjb25maWdQYXRoKSByZXR1cm47XG4gIGlmIChwYXRoLmV4dG5hbWUoY29uZmlnUGF0aCkgPT09ICcudG9tbCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3diIGRlcGxveSBzdXBwb3J0cyB3cmFuZ2xlci5qc29uYy93cmFuZ2xlci5qc29uIGNvbmZpZ3Mgb25seTsgbWlncmF0ZSB3cmFuZ2xlci50b21sIGZpcnN0LicpO1xuICB9XG5cbiAgLy8ganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCB3b3VsZCByZXR1cm4gYSBwYXJ0aWFsIG9iamVjdCBmb3IgbWFsZm9ybWVkIGlucHV0LFxuICAvLyB3aGljaCBjb3VsZCBtaWdyYXRlIGEgcmVtb3RlIGRhdGFiYXNlIGZyb20gYSBoYWxmLXJlYWQgY29uZmlnOyByZWplY3QgYW55IHBhcnNlIGVycm9yLlxuICBjb25zdCBwYXJzZUVycm9yczogUGFyc2VFcnJvcltdID0gW107XG4gIGNvbnN0IGNvbmZpZyA9IHBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLCBwYXJzZUVycm9ycywge1xuICAgIGFsbG93VHJhaWxpbmdDb21tYTogdHJ1ZSxcbiAgfSkgYXMgUmF3V3JhbmdsZXJDb25maWcgfCB1bmRlZmluZWQ7XG4gIGlmIChwYXJzZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgJHtjb25maWdQYXRofTogJHtwYXJzZUVycm9ycy5sZW5ndGh9IEpTT05DIHN5bnRheCBlcnJvcihzKS5gKTtcbiAgfVxuICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuXG4gIGNvbnN0IGVudkNvbmZpZyA9IGNvbmZpZy5lbnY/LltlbnZOYW1lXTtcbiAgaWYgKCFlbnZDb25maWcgJiYgZW52TmFtZSAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgd3JhbmdsZXIgY29uZmlnIGhhcyBubyBcImVudlwiOiB7IFwiJHtlbnZOYW1lfVwiOiAuLi4gfSBzZWN0aW9uLmApO1xuICB9XG4gIHJldHVybiBlbnZDb25maWdcbiAgICA/IHtcbiAgICAgICAgd29ya2VyTmFtZTogZW52Q29uZmlnLm5hbWUgPz8gKGNvbmZpZy5uYW1lID8gYCR7Y29uZmlnLm5hbWV9LSR7ZW52TmFtZX1gIDogdW5kZWZpbmVkKSxcbiAgICAgICAgYWNjb3VudElkOiBlbnZDb25maWcuYWNjb3VudF9pZCA/PyBjb25maWcuYWNjb3VudF9pZCxcbiAgICAgICAgdmFyS2V5czogT2JqZWN0LmtleXMoZW52Q29uZmlnLnZhcnMgPz8ge30pLFxuICAgICAgICB2YXJzOiBlbnZDb25maWcudmFycyA/PyB7fSxcbiAgICAgICAgLy8gTW9zdCBiaW5kaW5ncyBhcmUgbm9uLWluaGVyaXRhYmxlIGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LCBzbyBvbmx5IHRoZVxuICAgICAgICAvLyBlbnZpcm9ubWVudCdzIG93biBuYW1lcyBjb3VudCDigJQgcGx1cyB0aGUgZ2VudWluZWx5IGluaGVyaXRlZCBzaGFwZXMgKGFzc2V0cywgbG9nZndkciksXG4gICAgICAgIC8vIHdoaWNoIHdyYW5nbGVyIHJlc29sdmVzIGFzIHdob2xlIGZpZWxkczogdGhlIGVudmlyb25tZW50J3Mgb3duIGZpZWxkIG92ZXJyaWRlcyB0aGVcbiAgICAgICAgLy8gdG9wIGxldmVsIGVudGlyZWx5LCBzbyBvbmx5IHRoZSBlZmZlY3RpdmUgdmFsdWUncyBuYW1lcyBjb3VudC5cbiAgICAgICAgYmluZGluZ05hbWVzOiBbXG4gICAgICAgICAgLi4uY29sbGVjdEJpbmRpbmdOYW1lcyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXNzZXRzOiBlbnZDb25maWcuYXNzZXRzID8/IGNvbmZpZy5hc3NldHMsXG4gICAgICAgICAgICAgIGxvZ2Z3ZHI6IGVudkNvbmZpZy5sb2dmd2RyID8/IGNvbmZpZy5sb2dmd2RyLFxuICAgICAgICAgICAgICB3YXNtX21vZHVsZXM6IGVudkNvbmZpZy53YXNtX21vZHVsZXMgPz8gY29uZmlnLndhc21fbW9kdWxlcyxcbiAgICAgICAgICAgICAgdGV4dF9ibG9iczogZW52Q29uZmlnLnRleHRfYmxvYnMgPz8gY29uZmlnLnRleHRfYmxvYnMsXG4gICAgICAgICAgICAgIGRhdGFfYmxvYnM6IGVudkNvbmZpZy5kYXRhX2Jsb2JzID8/IGNvbmZpZy5kYXRhX2Jsb2JzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoZW52Q29uZmlnKVxuICAgICAgICAgICksXG4gICAgICAgICAgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcsIGVudkNvbmZpZyksXG4gICAgICAgIF0sXG4gICAgICAgIGQxRGF0YWJhc2VzOiBlbnZDb25maWcuZDFfZGF0YWJhc2VzID8/IFtdLFxuICAgICAgICAvLyBgc2VjcmV0c2AgaXMgbm9uLWluaGVyaXRhYmxlOiBhIHRvcC1sZXZlbCByZXF1aXJlbWVudCBtdXN0IG5vdCBmb3JjZSAob3IgdXBsb2FkKVxuICAgICAgICAvLyBhIHNlY3JldCBpbnRvIGEgbmFtZWQgZW52aXJvbm1lbnQuXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGVudkNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IHRydWUsXG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIHdvcmtlck5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICBhY2NvdW50SWQ6IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhjb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICBiaW5kaW5nTmFtZXM6IFsuLi5jb2xsZWN0QmluZGluZ05hbWVzKGNvbmZpZyksIC4uLnNpdGVCaW5kaW5nTmFtZXMoY29uZmlnKV0sXG4gICAgICAgIGQxRGF0YWJhc2VzOiBjb25maWcuZDFfZGF0YWJhc2VzID8/IFtdLFxuICAgICAgICByZXF1aXJlZFNlY3JldE5hbWVzOiBjb25maWcuc2VjcmV0cz8ucmVxdWlyZWQgPz8gW10sXG4gICAgICAgIHVzZXNFbnZTZWN0aW9uOiBmYWxzZSxcbiAgICAgIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VEb3RlbnYgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBDbG91ZGZsYXJlIFdvcmtlcnMgZG9uJ3Qgc2VlIHRoZSBwcm9jZXNzIGVudmlyb25tZW50OyB3cmFuZ2xlciBkZXYgcmVhZHMgdmFycyBmcm9tIGEgLmRldi52YXJzXG4vLyBmaWxlIG5leHQgdG8gaXRzIGNvbmZpZyBmaWxlIGluc3RlYWQuIFRoaXMgY29tbWFuZCBicmlkZ2VzIHdiLW1hbmFnZWQgLmVudiBmaWxlcyB0byB0aGF0IGZpbGUuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIEdlbkRldlZhcnNDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgJiB7IHBhdGg/OiBzdHJpbmcgfT47XG5cbmV4cG9ydCBjb25zdCBnZW5EZXZWYXJzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnZ2VuLWRldi12YXJzIFtwYXRoXScsXG4gIGRlc2NyaWJlOlxuICAgICdHZW5lcmF0ZSBhIC5kZXYudmFycyBmaWxlIGZvciBgd3JhbmdsZXIgZGV2YCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbG9hZGVkIGZyb20gLmVudiBmaWxlcyAocGx1cyBXQl9FTlYgYW5kIE5FWFRfUFVCTElDX1dCX0VOVikuJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PlxuICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGgnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSBnZW5lcmF0ZWQgLmRldi52YXJzIGZpbGUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJy5kZXYudmFycycsXG4gICAgfSkgYXMgdW5rbm93biBhcyBBcmd2PEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogR2VuRGV2VmFyc0NvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0cmljdCB0byB0aGUgdmFyaWFibGVzIGxvYWRlZCBmcm9tIC5lbnYgZmlsZXMgKHdiJ3MgZW52aXJvbm1lbnQgY29udHJhY3QpIHNvIHRoYXRcbiAgICAvLyB1bnJlbGF0ZWQgcHJvY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbmV2ZXIgbGVhayBpbnRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4gSWdub3JlXG4gICAgLy8gcHJvY2Vzcy5lbnYgYmVjYXVzZSB0aGUgcGFyZW50IHdiIHByb2Nlc3MgaW5qZWN0cyB0aGUgLmVudiB2YWx1ZXMgaW50byBpdCwgd2hpY2ggd291bGRcbiAgICAvLyBvdGhlcndpc2Ugc3VwcHJlc3MgbG9hZGluZyB0aGVtIGhlcmUuXG4gICAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIHByb2plY3QuZGlyUGF0aCwgeyBpZ25vcmVQcm9jZXNzRW52OiB0cnVlIH0pO1xuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgd2luIG92ZXIgZG90ZW52IHZhbHVlcyBmb3IgZmlsZS1kZWZpbmVkXG4gICAgLy8ga2V5cyAocHJvamVjdC5lbnYgYXBwbGllcyB0aGF0IHByZWNlZGVuY2UpLCBvciBgQVVUSF9TRUNSRVQ9Li4uIHdiIHN0YXJ0YCB3b3VsZCBzZXJ2ZVxuICAgIC8vIHRoZSBzdGFsZSBmaWxlIHZhbHVlLiBBbiBleHBvcnQgdGhhdCBlbXB0aWVzIGEgbm9uLWVtcHR5IGZpbGUgdmFsdWUgaXMgZGVsaWJlcmF0ZSBhbmRcbiAgICAvLyBtdXN0IHN1cnZpdmUgdGhlIGVtcHR5LXZhbHVlIGZpbHRlciBiZWxvdyAodW5saWtlIGBLRVk9YCBwbGFjZWhvbGRlcnMgaW4gLmVudiBmaWxlcyxcbiAgICAvLyB3aGljaCBzdGF5IG9taXR0ZWQgc28gdGhleSBjYW5ub3Qgb3ZlcnJpZGUgd3JhbmdsZXIgYHZhcnNgIHdpdGggZW1wdHkgc3RyaW5ncykuXG4gICAgY29uc3QgZXhwbGljaXRseUVtcHRpZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSA9PT0gJycgJiYgZW52VmFyc1trZXldICE9PSAnJykgZXhwbGljaXRseUVtcHRpZWRLZXlzLmFkZChrZXkpO1xuICAgICAgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuICAgIC8vIFN1cHBsZW1lbnQgd2l0aCBwcm9jZXNzIGVudmlyb25tZW50IHZhbHVlcyBmb3IgdGhlIGtleXMgbmFtZWQgaW4gLmVudi5leGFtcGxlOiBDSSBvZnRlblxuICAgIC8vIHByb3ZpZGVzIHRoZW0gYXMgd29ya2Zsb3cgZW52IGluc3RlYWQgb2YgLmVudiBmaWxlcyAoc3RpbGwgYW4gYWxsb3dsaXN0LCBzbyB1bnJlbGF0ZWRcbiAgICAvLyBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBjYW5ub3QgbGVhaykuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgWy4uLnJlYWRFbnZFeGFtcGxlS2V5cyhwcm9qZWN0KSwgJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVudlZhcnNba2V5XSB8fCBlZmZlY3RpdmVWYWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gPT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVWYWx1ZSA9PT0gJycpIGV4cGxpY2l0bHlFbXB0aWVkS2V5cy5hZGQoa2V5KTtcbiAgICAgIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXMoZW52VmFycylcbiAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUgIT09ICcnIHx8IGV4cGxpY2l0bHlFbXB0aWVkS2V5cy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3F1b3RlRG90ZW52VmFsdWUoa2V5LCB2YWx1ZSl9YCk7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGFyZ3YucGF0aCA/PyAnLmRldi52YXJzJyk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgV291bGQgZ2VuZXJhdGUgJHtvdXRwdXRQYXRofSB3aXRoICR7bGluZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuYCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZzLm1rZGlyU3luYyhwYXRoLmRpcm5hbWUob3V0cHV0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgbGluZXMuam9pbignXFxuJykgKyAnXFxuJyk7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBHZW5lcmF0ZWQgJHtvdXRwdXRQYXRofSB3aXRoICR7bGluZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuYCkpO1xuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZFeGFtcGxlS2V5cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBsZXQgZW52RXhhbXBsZVBhdGg6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBlbnZFeGFtcGxlUGF0aCA9IHByb2plY3QuZmluZEZpbGUoJy5lbnYuZXhhbXBsZScpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gZG90ZW52J3Mgb3duIHBhcnNlciBjb3ZlcnMgYGV4cG9ydCBLRVk9YCBwcmVmaXhlcyBhbmQgd2hpdGVzcGFjZSBhcm91bmQgYD1gLFxuICAvLyB3aGljaCBhIGxpbmUgcmVnZXggd291bGQgc2lsZW50bHkgbWlzcy5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcnNlRG90ZW52KGZzLnJlYWRGaWxlU3luYyhlbnZFeGFtcGxlUGF0aCwgJ3V0ZjgnKSkpO1xufVxuXG4vKipcbiAqIFF1b3RlIGEgdmFsdWUgZm9yIGRvdGVudiAod2hpY2ggd3JhbmdsZXIgdXNlcyBmb3IgLmRldi52YXJzKS4gRXZlcnkgY2FuZGlkYXRlIHJlcHJlc2VudGF0aW9uXG4gKiBpcyB2ZXJpZmllZCBieSBhY3R1YWxseSBwYXJzaW5nIGl0IGJhY2sgKG91ciBkb3RlbnYgcGFyc2VyIG1hdGNoZXMgd3JhbmdsZXIncyBidW5kbGVkIGRvdGVudlxuICogMTYgZm9yIHRoZXNlIGNvbnN0cnVjdHMpLCBzbyBhIHZhbHVlIGlzIGVpdGhlciBzZXJpYWxpemVkIGxvc3NsZXNzbHkgb3IgcmVqZWN0ZWQg4oCUIG5ldmVyXG4gKiBzaWxlbnRseSBjb3JydXB0ZWQuIENhbmRpZGF0ZXM6IHNpbmdsZSBxdW90ZXMgKGxpdGVyYWwgc3BhbjsgY2xvc2VkIGVhcmx5IGJ5IGFuIGFwb3N0cm9waGUpLFxuICogYmFja3RpY2tzIChlcXVhbGx5IGxpdGVyYWwpLCB0aGVuIGRvdWJsZSBxdW90ZXMgd2l0aCBlc2NhcGVkIG5ld2xpbmVzL0NScyAoZG90ZW52IGRvZXMgbm90XG4gKiB1bmVzY2FwZSBpbm5lciBcXFwiIOKAlCBhIGAjYCBhZnRlciBhbiBlbWJlZGRlZCBxdW90ZSBzdGFydHMgYSBjb21tZW50LCB3aGljaCB0aGUgcm91bmQtdHJpcFxuICogY2hlY2sgY2F0Y2hlcyBhbmQgcmVqZWN0cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZURvdGVudlZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZG91YmxlUXVvdGVkQm9keSA9IHZhbHVlLnJlcGxhY2VBbGwoJ1xcbicsIFN0cmluZy5yYXdgXFxuYCkucmVwbGFjZUFsbCgnXFxyJywgU3RyaW5nLnJhd2BcXHJgKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtgJyR7dmFsdWV9J2AsIGBcXGAke3ZhbHVlfVxcYGAsIGBcIiR7ZG91YmxlUXVvdGVkQm9keX1cImBdO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHBhcnNlRG90ZW52KGAke2tleX09JHtjYW5kaWRhdGV9YClba2V5XSA9PT0gdmFsdWUpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdmFsdWUgb2YgJHtrZXl9IGNhbm5vdCBiZSBsb3NzbGVzc2x5IHNlcmlhbGl6ZWQgaW50byAuZGV2LnZhcnM7IHNpbXBsaWZ5IGl0cyBxdW90aW5nLmApO1xufVxuIiwiaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQsIHVzZXNEcml6emxlS2l0Rm9yRDEgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCwgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkV3JhbmdsZXJDb25maWcsIFdyYW5nbGVyRDFEYXRhYmFzZSB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlc29sdmVXcmFuZ2xlckNvbmZpZ0ZvckVudiwgdXNlc1dyYW5nbGVyTmF0aXZlTWlncmF0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyQ29uZmlnLmpzJztcblxuaW1wb3J0IHsgcmVhZEVudkV4YW1wbGVLZXlzIH0gZnJvbSAnLi9nZW5EZXZWYXJzLmpzJztcblxuLyoqXG4gKiBLZXlzIHRoYXQgZHJpdmUgdGhlIGRlcGxveSBpdHNlbGYgKG9yIGFyZSBtZWFuaW5nZnVsIG9ubHkgbG9jYWxseSkgYW5kIHRodXMgbXVzdCBuZXZlciBiZVxuICogcHVzaGVkIHRvIHRoZSBXb3JrZXIgYXMgc2VjcmV0cy4gYFdCX0VOVmAgLyBgTkVYVF9QVUJMSUNfV0JfRU5WYCBiZWxvbmcgaW4gd3JhbmdsZXIgYHZhcnNgLlxuICovXG5jb25zdCBOT05fU0VDUkVUX0tFWVMgPSBuZXcgU2V0KFtcbiAgJ0NJJyxcbiAgLy8gV3JhbmdsZXIgc3lzdGVtL2F1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcyAoaHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3dvcmtlcnMvd3JhbmdsZXIvc3lzdGVtLWVudmlyb25tZW50LXZhcmlhYmxlcy8pLFxuICAvLyBpbmNsdWRpbmcgbGVnYWN5IGFsaWFzZXM7IGFwcC1zcGVjaWZpYyBuYW1lcyBzdWNoIGFzIENMT1VERkxBUkVfUjJfQUNDRVNTX0tFWV9JRCBzdGF5IGVsaWdpYmxlLlxuICAnQ0ZfQUNDT1VOVF9JRCcsXG4gICdDRl9BUElfQkFTRV9VUkwnLFxuICAnQ0ZfQVBJX0VNQUlMJyxcbiAgJ0NGX0FQSV9LRVknLFxuICAnQ0ZfQVBJX1RPS0VOJyxcbiAgJ0NGX0VNQUlMJyxcbiAgJ0NMT1VERkxBUkVfQUNDRVNTX0NMSUVOVF9JRCcsXG4gICdDTE9VREZMQVJFX0FDQ0VTU19DTElFTlRfU0VDUkVUJyxcbiAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCcsXG4gICdDTE9VREZMQVJFX0FQSV9CQVNFX1VSTCcsXG4gICdDTE9VREZMQVJFX0FQSV9LRVknLFxuICAnQ0xPVURGTEFSRV9BUElfVE9LRU4nLFxuICAnQ0xPVURGTEFSRV9BVVRIX1VTRV9LRVlSSU5HJyxcbiAgJ0NMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQnLFxuICAnQ0xPVURGTEFSRV9FTUFJTCcsXG4gICdDTE9VREZMQVJFX0VOVicsXG4gICdDTE9VREZMQVJFX0lOQ0xVREVfUFJPQ0VTU19FTlYnLFxuICAnQ0xPVURGTEFSRV9MT0FEX0RFVl9WQVJTX0ZST01fRE9UX0VOVicsXG4gICdET0NLRVJfSE9TVCcsXG4gICdIVFRQX1BST1hZJyxcbiAgJ0hUVFBTX1BST1hZJyxcbiAgJ2h0dHBfcHJveHknLFxuICAnaHR0cHNfcHJveHknLFxuICAnRk9SQ0VfQ09MT1InLFxuICAnTUlOSUZMQVJFX0NBQ0hFX0RJUicsXG4gICdNSVNFX0VOVicsXG4gICdOT19DT0xPUicsXG4gICdORVhUX1BVQkxJQ19XQl9FTlYnLFxuICAnTkVYVF9QVUJMSUNfV0JfVkVSU0lPTicsXG4gICdOT0RFX0VOVicsXG4gICdQT1JUJyxcbiAgJ1dCX0VOVicsXG4gICdXQl9WRVJTSU9OJyxcbl0pO1xuXG5jb25zdCBOT05fU0VDUkVUX0tFWV9QUkVGSVhFUyA9IFsnV1JBTkdMRVJfJywgJ0NMT1VERkxBUkVfSFlQRVJEUklWRV9MT0NBTF9DT05ORUNUSU9OX1NUUklOR18nLCAnQ0xPVURGTEFSRV9DRl9GRVRDSF8nXTtcblxuZnVuY3Rpb24gaXNOb25TZWNyZXRLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE5PTl9TRUNSRVRfS0VZUy5oYXMoa2V5KSB8fCBOT05fU0VDUkVUX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgRGVwbG95Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgRGVwbG95Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8RGVwbG95Q29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBEZXBsb3lDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTpcbiAgICAnRGVwbG95IGEgQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcCAodmluZXh0IG9yIHBsYWluIFdvcmtlcikgdG8gdGhlIFdCX0VOViBlbnZpcm9ubWVudDogdmFsaWRhdGUgc2VjcmV0cywgYnVpbGQsIGFwcGx5IHJlbW90ZSBEMSBtaWdyYXRpb25zLCB0aGVuIGRlcGxveSBjb2RlIGFuZCBzZWNyZXRzIGF0b21pY2FsbHkuJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB5YXJncyBhcyB1bmtub3duIGFzIEFyZ3Y8RGVwbG95Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3Y6IERlcGxveUNvbW1hbmRBcmd2KSB7XG4gICAgLy8gQSBzdHJheSBleHBvcnRlZCBDTE9VREZMQVJFX0VOViB3b3VsZCBiYWtlIHRoZSB3cm9uZyBlbnZpcm9ubWVudCBpbnRvIHRoZSBidWlsZCBhbmRcbiAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlIG9uIGRlcGxveTsgaXQgaXMgcmUtc2V0IGV4cGxpY2l0bHkgd2hlcmUgbmVlZGVkLlxuICAgIC8vIEEgZG90ZW52IGZpbGUgZGVmaW5pbmcgaXQgc3RpbGwgc3VyZmFjZXMgdGhyb3VnaCBwcm9qZWN0LmVudiwgd2hpY2ggdGhlIGV4cGxpY2l0IGAtLWVudmBcbiAgICAvLyBmbGFncyBiZWxvdyBvdmVycmlkZS5cbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuQ0xPVURGTEFSRV9FTlY7XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCB3cmFuZ2xlckNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICAgIGlmICghd3JhbmdsZXJDb25maWdQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnd2IgZGVwbG95IGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IENsb3VkZmxhcmUgV29ya2VycyBhcHBzIChubyB3cmFuZ2xlciBjb25maWcgZm91bmQpLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgdmFsdWVzIGdvIGludG8gYm90aCBwcm9jZXNzLmVudiAoaW5oZXJpdGVkIGJ5IGV2ZXJ5dGhpbmcgd2Igc3Bhd25zKSBhbmQgcHJvamVjdC5lbnZcbiAgICAvLyAodGhlIGVudmlyb25tZW50IHdiIGl0c2VsZiByZWFkcyBhbmQgcGFzc2VzIGV4cGxpY2l0bHkpOyB0aGUgbGF0dGVyIGlzIGEgY2FjaGVkIHNuYXBzaG90XG4gICAgLy8gdGFrZW4gYmVmb3JlIHRoaXMgcG9pbnQsIHNvIHdyaXRpbmcgb25seSB0byBwcm9jZXNzLmVudiB3b3VsZCBsZWF2ZSB3YidzIG93biBwcmVmbGlnaHQg4oCUXG4gICAgLy8gYW5kIGFueSBjb21tYW5kIHNwYXduZWQgd2l0aCBwcm9qZWN0LmVudiDigJQgd2l0aG91dCB0aGUgdG9rZW4uXG4gICAgLy8gT25seSAtLWluY2x1ZGUtcm9vdC1lbnYgZ2F0ZXMgdGhlIHJvb3QgbG9va3VwLCBub3QgYW4gZXhwbGljaXQgLS1lbnY6IC0tZW52IHJlcGxhY2VzIHRoZVxuICAgIC8vIGRvdGVudiBWQVJJQUJMRSBzb3VyY2VzLCB3aGlsZSAuZW52LmNsb3VkZmxhcmUgaXMgYSBjcmVkZW50aWFsIHNpZGVjYXIgcmVhZCBvdXRzaWRlIHRoYXRcbiAgICAvLyBjYXNjYWRlICh0aGUgcHJvamVjdCdzIG93biBjb3B5IGlzIHJlYWQgcmVnYXJkbGVzcyBvZiAtLWVudiwgYXMgaXQgYWx3YXlzIGhhcyBiZWVuKS5cbiAgICAvLyBHYXRpbmcgb24gLS1lbnYgd291bGQgbWFrZSBgd2IgZGVwbG95IC0tZW52IDxmaWxlPmAgc2lsZW50bHkgc3RvcCBmaW5kaW5nIHRoZSByZXBvJ3MgdG9rZW4uXG4gICAgY29uc3QgY2xvdWRmbGFyZUVudlZhcnMgPSByZWFkQ2xvdWRmbGFyZUVudkZpbGVzKFxuICAgICAgcHJvamVjdC5kaXJQYXRoLFxuICAgICAgYXJndi5pbmNsdWRlUm9vdEVudiA/IHByb2plY3Qucm9vdERpclBhdGggOiB1bmRlZmluZWRcbiAgICApO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNsb3VkZmxhcmVFbnZWYXJzKSkge1xuICAgICAgLy8gPz89IHNvIHRoYXQgYW4gZXhwbGljaXRseSBleHBvcnRlZCBlbXB0eSB2YWx1ZSBzdGlsbCB3aW5zIG92ZXIgdGhlIGZpbGUuXG4gICAgICBwcm9jZXNzLmVudltrZXldID8/PSB2YWx1ZTtcbiAgICAgIHByb2plY3QuZW52W2tleV0gPz89IHZhbHVlO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWRDb25maWcgPSByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYocHJvamVjdCwgZW52TmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoIXJlc29sdmVkQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHBhcnNlICR7d3JhbmdsZXJDb25maWdQYXRofS5gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGFjY291bnRJZCA9IHJlc29sdmVkQ29uZmlnLmFjY291bnRJZCA/PyBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQ7XG4gICAgLy8gUHJlZmVyIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIHdoZW5ldmVyIHRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCdzIEQxIGJpbmRpbmdzIGhhdmUgYW5cbiAgICAvLyBleGlzdGluZyBtaWdyYXRpb25zIGRpcmVjdG9yeS4gQSBkcml6emxlLW9ybSBkZXBlbmRlbmN5IGFsb25lIGRvZXMgbm90IGltcGx5IHRoZSBwcm9qZWN0XG4gICAgLy8gbWlncmF0ZXMgRDEgd2l0aCBkcml6emxlLWtpdCdzIGQxLWh0dHAgZHJpdmVyOiB0aGUgZXhwbGljaXQgbWFya2VyIGlzIGEgZHJpenpsZSBjb25maWdcbiAgICAvLyB3aG9zZSBkaWFsZWN0L2RyaXZlciB0YXJnZXRzIHNxbGl0ZSAvIGQxLWh0dHAgLyBkdXJhYmxlLXNxbGl0ZSAoc2VlIHVzZXNEcml6emxlS2l0Rm9yRDE7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTQyKS4gQSBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgYW5vdGhlclxuICAgIC8vIGRhdGFiYXNlIChlLmcuIFBvc3RncmVTUUwgdmlhIEh5cGVyZHJpdmUpIGxlYXZlcyB0aGUgRDEgYmluZGluZ3MgdW5tYW5hZ2VkIGJ5IHdiIGRlcGxveS5cbiAgICBjb25zdCB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT5cbiAgICAgIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMocHJvamVjdCwgZGF0YWJhc2UpXG4gICAgKTtcbiAgICBjb25zdCBkcml6emxlS2l0TWFuYWdlc0QxID0gdXNlc0RyaXp6bGVLaXRGb3JEMShwcm9qZWN0KTtcbiAgICBpZiAoXG4gICAgICBkcml6emxlS2l0TWFuYWdlc0QxICYmXG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoIDwgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAvLyBNaWdyYXRpbmcgb25seSB0aGUgd3JhbmdsZXItbmF0aXZlIHN1YnNldCB3b3VsZCBzaWxlbnRseSBkZXBsb3kgY29kZSBhZ2FpbnN0IHRoZVxuICAgICAgLy8gb3RoZXIsIHVubWlncmF0ZWQgZGF0YWJhc2VzLlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgZG9lcyBub3Qgc3VwcG9ydCBtaXhpbmcgd3JhbmdsZXItbmF0aXZlIGFuZCBub24tbmF0aXZlIEQxIG1pZ3JhdGlvbiBsYXlvdXRzLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBkcml6emxlRDFEYXRhYmFzZSA9XG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBkcml6emxlS2l0TWFuYWdlc0QxID8gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID09PSAwICYmIGRyaXp6bGVLaXRNYW5hZ2VzRDEgJiYgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgc3VwcG9ydHMgZHJpenpsZS1raXQgbWlncmF0aW9ucyBvbmx5IGZvciBhIHNpbmdsZSBEMSBiaW5kaW5nOyBmb3VuZCBtdWx0aXBsZS4nKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlZEQxRGF0YWJhc2VzID0gbmV3IFNldCh3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKTtcbiAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UpIG1hbmFnZWREMURhdGFiYXNlcy5hZGQoZHJpenpsZUQxRGF0YWJhc2UpO1xuICAgIGNvbnN0IHVubWFuYWdlZEQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT4gIW1hbmFnZWREMURhdGFiYXNlcy5oYXMoZGF0YWJhc2UpKTtcbiAgICBpZiAodW5tYW5hZ2VkRDFEYXRhYmFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU2F5IHNvIG91dCBsb3VkIGluc3RlYWQgb2Ygc2lsZW50bHkgZGVwbG95aW5nIGNvZGUgYWdhaW5zdCB1bm1pZ3JhdGVkIGRhdGFiYXNlczogdGhlXG4gICAgICAvLyBkcml6emxlIG1hcmtlciBkZXRlY3Rpb24gaXMgaGV1cmlzdGljICh0ZXh0IHNjYW4gb2YgZHJpenpsZS5jb25maWcuKiksIHNvIGEgcHJvamVjdCB0aGF0XG4gICAgICAvLyBnZW51aW5lbHkgbWlncmF0ZXMgRDEgbXVzdCBiZSBhYmxlIHRvIG5vdGljZSB3aGVuIG5vIG1lY2hhbmlzbSB3YXMgc2VsZWN0ZWQuIFRoaXMgYWxzb1xuICAgICAgLy8gY292ZXJzIHBhcnRpYWwgbGF5b3V0cyAoc29tZSBiaW5kaW5ncyB3cmFuZ2xlci1uYXRpdmUsIG90aGVycyB1bm1hbmFnZWQpLlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYE5vIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20gZGV0ZWN0ZWQgZm9yICR7dW5tYW5hZ2VkRDFEYXRhYmFzZXNcbiAgICAgICAgICAgIC5tYXAoKGRhdGFiYXNlKSA9PiBkYXRhYmFzZS5iaW5kaW5nID8/IGRhdGFiYXNlLmRhdGFiYXNlX25hbWUgPz8gJ3VubmFtZWQgYmluZGluZycpXG4gICAgICAgICAgICAuam9pbignLCAnKX0gYCArXG4gICAgICAgICAgICAnKG5vIHdyYW5nbGVyIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGFuZCBubyBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgc3FsaXRlL2QxLWh0dHAvZHVyYWJsZS1zcWxpdGUpOyB3YiBkZXBsb3kgd2lsbCBub3QgcnVuIEQxIG1pZ3JhdGlvbnMgZm9yIHRoZW0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBEcnkgcnVucyBleGVjdXRlIG5vdGhpbmcgYXV0aGVudGljYXRlZCwgc28gdGhleSBza2lwIHRoZSBjcmVkZW50aWFsIHByZWZsaWdodCBlbnRpcmVseS5cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICAvLyBBIGRyaXp6bGUtc2VsZWN0ZWQgRDEgZGF0YWJhc2Ugcm91dGVzIGJvdGggdGhlIG1pZ3JhdGlvbiBpbiBzdGVwIDMgYW5kIGFueSBkZXBsb3kvcG9zdFxuICAgICAgLy8gaG9vayB0aHJvdWdoIGRyaXp6bGUta2l0J3MgZDEtaHR0cCBkcml2ZXIsIHdoaWNoIG5lZWRzIENMT1VERkxBUkVfQVBJX1RPS0VOIGV2ZW4gZm9yXG4gICAgICAvLyBsb2NhbCwgd3JhbmdsZXItT0F1dGggZGVwbG95cy4gRmFpbGluZyBoZXJlIGtlZXBzIHRoZSBmYWlsLWZhc3Qgb3JkZXJpbmc6IGEgbWlzc2luZyB0b2tlblxuICAgICAgLy8gbXVzdCBhYm9ydCBiZWZvcmUgdGhlIGRlcGxveSBnb2VzIGxpdmUsIG5vdCBkdXJpbmcgbWlncmF0aW9uIG9yIGRlcGxveS9wb3N0XG4gICAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTU2KS4gV3JhbmdsZXItbmF0aXZlIHByb2plY3RzICh3aXRoIG9yXG4gICAgICAvLyB3aXRob3V0IGhvb2tzKSBtdXN0IG5vdCByZXF1aXJlIHRoZSB0b2tlbjogYSBsb2NhbCB3cmFuZ2xlciBPQXV0aCBsb2dpbiBzdWZmaWNlcyB0aGVyZSxcbiAgICAgIC8vIGV2ZW4gdGhvdWdoIHN0ZXAgNSBzdGlsbCBleHBvcnRzIENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgdG8gdGhlaXIgaG9va3MuXG4gICAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UgJiYgIXByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX1RPS0VOKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdDTE9VREZMQVJFX0FQSV9UT0tFTiBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uID1cbiAgICAgICAgISFwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIXByb2plY3QuZW52LkNGX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIShwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9FTUFJTCkgfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0ZfQVBJX0tFWSAmJiBwcm9qZWN0LmVudi5DRl9FTUFJTCk7XG4gICAgICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgIWhhc1dyYW5nbGVyQXV0aGVudGljYXRpb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dyYW5nbGVyIGF1dGhlbnRpY2F0aW9uIChlLmcuIENMT1VERkxBUkVfQVBJX1RPS0VOKSBpcyByZXF1aXJlZCB0byBkZXBsb3kgb24gQ0kuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwLXNwZWNpZmljIHZhbGlkYXRpb24gaG9vayAoZS5nLiBzZWNyZXQgcGFpcnMgdGhhdCBtdXN0IGJlIGJvdGgtc2V0LW9yLWJvdGgtZW1wdHkpLlxuICAgIC8vIFRoZSByZXVzYWJsZSBkZXBsb3kueW1sIGFscmVhZHkgcnVucyBpdCBvbiBDSTsgcnVuIGl0IGhlcmUgZm9yIGxvY2FsIGRlcGxveXMuXG4gICAgaWYgKCFpc0NJKHByb2plY3QuZW52LkNJKSAmJiBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGVwbG95L2NpLXNldHVwJ10pIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZGVwbG95L2NpLXNldHVwJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgLy8gMS4gUmVzb2x2ZSBhbmQgdmFsaWRhdGUgYWxsIHNlY3JldHMgYmVmb3JlIGFueSBidWlsZCBvciByZW1vdGUgbXV0YXRpb24sIHNvIGEgbWlzc2luZ1xuICAgIC8vICAgIHNlY3JldCBhYm9ydHMgdGhlIGRlcGxveSBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBtaWdyYXRlZCBkYXRhYmFzZSBiZWhpbmQgYW4gb2xkIFdvcmtlci5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gUmVzdHJpY3QgdGhlIHNlY3JldHMgZG9tYWluIHRvIGtleXMgZGVmaW5lZCBpbiB0aGUgcHJvamVjdCdzIC5lbnYgZmlsZXM6IGBtaXNlIGVudmBcbiAgICAvLyBvdXRwdXQgKHJlcG9ydGVkIGFzIGEgcHNldWRvLXNvdXJjZSkgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyBzdWNoIGFzIENBUkdPX0hPTUUsXG4gICAgLy8gd2hpY2ggbXVzdCBuZXZlciBiZSB1cGxvYWRlZCBhcyBXb3JrZXIgc2VjcmV0cy5cbiAgICBjb25zdCBkb3RlbnZLZXlzID0gbmV3IFNldChcbiAgICAgIGVudlNvdXJjZXMuZmlsdGVyKChbc291cmNlXSkgPT4gIXNvdXJjZS5zdGFydHNXaXRoKCdtaXNlIGVudicpKS5mbGF0TWFwKChbLCBrZXlzXSkgPT4ga2V5cylcbiAgICApO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBpZiAoIWRvdGVudktleXMuaGFzKGtleSkpIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVpcmVkS2V5cyA9IHJlYWRFbnZFeGFtcGxlS2V5cyhwcm9qZWN0KTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZXF1aXJlZEtleXMpIHtcbiAgICAgIGVudlZhcnNba2V5XSA/Pz0gcHJvamVjdC5lbnZba2V5XSA/PyAnJztcbiAgICB9XG4gICAgLy8gTmFtZXMgZGVjbGFyZWQgdmlhIHdyYW5nbGVyIGBzZWNyZXRzLnJlcXVpcmVkYCBtYXkgbGlrZXdpc2UgYmUgc3VwcGxpZWQgcHVyZWx5IGFzXG4gICAgLy8gZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuIENJIHdvcmtmbG93IGVudikgaW5zdGVhZCBvZiBkb3RlbnYgdmFsdWVzLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMpIHtcbiAgICAgIGNvbnN0IGV4cG9ydGVkVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVudlZhcnNba2V5XSA9PT0gdW5kZWZpbmVkICYmIGV4cG9ydGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZXhwb3J0ZWRWYWx1ZTtcbiAgICB9XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBkb3RlbnYgdmFsdWVzIChwcm9qZWN0LmVudiBhbHJlYWR5XG4gICAgLy8gYXBwbGllcyB0aGF0IHByZWNlZGVuY2UpLCBvciBgQVVUSF9TRUNSRVQ9Li4uIHdiIGRlcGxveWAgd291bGQgcHVzaCB0aGUgc3RhbGUgZmlsZSB2YWx1ZS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cbiAgICBjb25zdCB7IG1pc3NpbmdLZXlzLCBzZWNyZXRzIH0gPSBzZWxlY3RXb3JrZXJTZWNyZXRzKFxuICAgICAgZW52VmFycyxcbiAgICAgIFsuLi5yZXNvbHZlZENvbmZpZy52YXJLZXlzLCAuLi5yZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXNdLFxuICAgICAgcmVxdWlyZWRLZXlzXG4gICAgKTtcbiAgICAvLyBgLS12YXIgV0JfVkVSU0lPTjouLi5gIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBjb25maWd1cmF0aW9uIHZhbHVlcyBvbiBkZXBsb3ksIHNvIGFcbiAgICAvLyByZXNvdXJjZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSB3b3VsZCBzaWxlbnRseSBiZWNvbWUgYSBzdHJpbmcgdmFyaWFibGUuXG4gICAgaWYgKHByb2plY3QuZW52LldCX1ZFUlNJT04gJiYgcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKCdXQl9WRVJTSU9OJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdXQl9WRVJTSU9OIGNvbGxpZGVzIHdpdGggYSBXb3JrZXIgYmluZGluZyBuYW1lOyByZW5hbWUgdGhlIGJpbmRpbmcuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBiaW5kaW5nQ29sbGlzaW9ucyA9IE9iamVjdC5rZXlzKGVudlZhcnMpLmZpbHRlcigoa2V5KSA9PiByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgaWYgKGJpbmRpbmdDb2xsaXNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFVwbG9hZGluZyBhIHNlY3JldCBuYW1lZCBsaWtlIGEgYmluZGluZyB3b3VsZCByZXBsYWNlIHRoZSBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgZW52IGtleXMgdGhhdCBjb2xsaWRlIHdpdGggV29ya2VyIGJpbmRpbmcgbmFtZXM6ICR7YmluZGluZ0NvbGxpc2lvbnMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgTWlzc2luZyByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGZyb20gLmVudi5leGFtcGxlIG9yIHdyYW5nbGVyIHNlY3JldHMucmVxdWlyZWQpOiAke21pc3NpbmdLZXlzLmpvaW4oJywgJyl9YFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBXcmFuZ2xlciB2YWxpZGF0ZXMgYHNlY3JldHMucmVxdWlyZWRgIG9ubHkgZHVyaW5nIHRoZSByZWFsIHVwbG9hZCDigJQgYWZ0ZXIgbWlncmF0aW9ucyDigJRcbiAgICAvLyBzbyB3YiBjaGVja3MgdXBmcm9udDogZWFjaCByZXF1aXJlZCBuYW1lIG11c3QgYmUgYSBrZXkgaW4gdGhlIG91dGdvaW5nIHBheWxvYWQgKHByZXNlbmNlLFxuICAgIC8vIG5vdCB0cnV0aGluZXNzIOKAlCBhbiBleHBsaWNpdCBlbXB0eSBjbGVhcnMgYSBzdGFsZSB2YWx1ZSkgb3IgYW4gZWZmZWN0aXZlIHZhci9iaW5kaW5nLlxuICAgIGNvbnN0IHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcyA9IHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMuZmlsdGVyKFxuICAgICAgKG5hbWUpID0+XG4gICAgICAgICFPYmplY3QuaGFzT3duKHNlY3JldHMsIG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy52YXJLZXlzLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMobmFtZSlcbiAgICApO1xuICAgIGlmICh1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBTZWNyZXRzIHJlcXVpcmVkIGJ5IHRoZSB3cmFuZ2xlciBjb25maWcgYXJlIG5vdCBwcm92aWRlZDogJHt1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMuam9pbignLCAnKX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHNlY3JldEtleXMgPSBPYmplY3Qua2V5cyhzZWNyZXRzKS50b1NvcnRlZCgpO1xuICAgIC8vIENsb3VkZmxhcmUgbGltaXRzIGEgYnVsayB1cGxvYWQgdG8gMTAwIHNlY3JldHMsIGVhY2ggdmFyaWFibGUvc2VjcmV0IHZhbHVlIHRvIDUgS0IsIGFuZFxuICAgIC8vIHRoZSBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgY291bnQgdG8gMTI4ICg2NCBvbiB0aGUgRnJlZSBwbGFuLCB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWRcbiAgICAvLyBoZXJlIOKAlCBoZW5jZSBhIHdhcm5pbmcpLiBGYWlsaW5nIGJlZm9yZSBhbnkgYnVpbGQgb3IgbWlncmF0aW9uIGtlZXBzIGFuIG92ZXJzaXplZCBwYXlsb2FkXG4gICAgLy8gZnJvbSBhYm9ydGluZyB0aGUgZGVwbG95IGFmdGVyIHJlbW90ZSBtaWdyYXRpb25zIGFscmVhZHkgcmFuLlxuICAgIGlmIChzZWNyZXRLZXlzLmxlbmd0aCA+IDEwMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBDbG91ZGZsYXJlIGFjY2VwdHMgYXQgbW9zdCAxMDAgc2VjcmV0cyBwZXIgZGVwbG95LCBidXQgJHtzZWNyZXRLZXlzLmxlbmd0aH0gd2VyZSBzZWxlY3RlZC5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gVGhlIENMSS1wcm92aWRlZCBXQl9WRVJTSU9OIG92ZXJsYXlzIGEgY29uZmlndXJlZCB2YXIgb2YgdGhlIHNhbWUgbmFtZSBvbiBkZXBsb3ksXG4gICAgLy8gc28gb25seSB0aGUgZWZmZWN0aXZlIHZhbHVlIHBhcnRpY2lwYXRlcyBpbiB0aGUgbGltaXQgY2hlY2tzLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVZhcnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzPHVua25vd24+KHJlc29sdmVkQ29uZmlnLnZhcnMpKTtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikgZWZmZWN0aXZlVmFycy5zZXQoJ1dCX1ZFUlNJT04nLCBwcm9qZWN0LmVudi5XQl9WRVJTSU9OKTtcbiAgICBjb25zdCB2YXJFbnRyaWVzID0gWy4uLmVmZmVjdGl2ZVZhcnNdO1xuICAgIGNvbnN0IG92ZXJzaXplZEtleXMgPSBbXG4gICAgICAuLi5zZWNyZXRLZXlzLmZpbHRlcigoa2V5KSA9PiBCdWZmZXIuYnl0ZUxlbmd0aChzZWNyZXRzW2tleV0gPz8gJycsICd1dGY4JykgPiA1ICogMTAyNCksXG4gICAgICAuLi52YXJFbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFssIHZhbHVlXSkgPT4gQnVmZmVyLmJ5dGVMZW5ndGgodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpLCAndXRmOCcpID4gNSAqIDEwMjRcbiAgICAgICAgKVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICBdO1xuICAgIGlmIChvdmVyc2l6ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBWYXJpYWJsZSBvciBzZWNyZXQgdmFsdWVzIGV4Y2VlZCBDbG91ZGZsYXJlJ3MgNSBLQiBsaW1pdDogJHtvdmVyc2l6ZWRLZXlzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlOiByZW1vdGUgc2VjcmV0cyBhYnNlbnQgZnJvbSB0aGUgcGF5bG9hZCBzdGF5IGF0dGFjaGVkIHRvIHRoZVxuICAgIC8vIG5ldyB2ZXJzaW9uLCBzbyB0aGV5IGNvdW50IGFnYWluc3QgdGhlIGNvbWJpbmVkIGxpbWl0IHRvby4gTGlzdGluZyB0aGVtIG5lZWRzIGFuXG4gICAgLy8gYXV0aGVudGljYXRlZCByZW1vdGUgcm91bmQtdHJpcCwgd2hpY2ggZHJ5IHJ1bnMgc2tpcDsgd2hlbiB0aGUgbGlzdGluZyBmYWlscyBmb3IgYW55XG4gICAgLy8gcmVhc29uIG90aGVyIHRoYW4gYSBub3QteWV0LWNyZWF0ZWQgV29ya2VyLCBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGNvdW50IGluc3RlYWQgb2ZcbiAgICAvLyBibG9ja2luZyBhIGRlcGxveSB0aGF0IHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuXG4gICAgY29uc3QgcmVtb3RlU2VjcmV0TmFtZXMgPSBhcmd2LmRyeVJ1blxuICAgICAgPyBbXVxuICAgICAgOiBhd2FpdCBsaXN0UmVtb3RlV29ya2VyU2VjcmV0TmFtZXMocHJvamVjdCwgYXJndiwgd3JhbmdsZXJDb25maWdQYXRoLCByZXNvbHZlZENvbmZpZywgZW52TmFtZSk7XG4gICAgY29uc3QgaW5oZXJpdGVkU2VjcmV0TmFtZXMgPSBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgICAgIHJlbW90ZVNlY3JldE5hbWVzID8/IFtdLFxuICAgICAgc2VjcmV0cyxcbiAgICAgIHZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICAgIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc1xuICAgICk7XG4gICAgY29uc3QgY29tYmluZWRDb3VudCA9XG4gICAgICBuZXcgU2V0KFsuLi5zZWNyZXRLZXlzLCAuLi52YXJFbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSldKS5zaXplICsgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoO1xuICAgIGNvbnN0IGluaGVyaXRlZE5vdGUgPVxuICAgICAgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgKGluY2x1ZGluZyAke2luaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aH0gcmVtb3RlIHNlY3JldHMga2VwdCBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uOiAke2luaGVyaXRlZFNlY3JldE5hbWVzLmpvaW4oJywgJyl9KWBcbiAgICAgICAgOiAnJztcbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDEyOCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBDbG91ZGZsYXJlIGFsbG93cyBhdCBtb3N0IDEyOCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgY29tYmluZWQsIGJ1dCAke2NvbWJpbmVkQ291bnR9IHdlcmUgc2VsZWN0ZWQke2luaGVyaXRlZE5vdGV9LmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiA2NCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYCR7Y29tYmluZWRDb3VudH0gdmFyaWFibGVzIGFuZCBzZWNyZXRzJHtpbmhlcml0ZWROb3RlfSBleGNlZWQgdGhlIEZyZWUgcGxhbidzIGxpbWl0IG9mIDY0LmApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5jeWFuKFxuICAgICAgICBgRGVwbG95aW5nICR7cmVzb2x2ZWRDb25maWcud29ya2VyTmFtZSA/PyBwcm9qZWN0Lm5hbWV9ICgke2Vudk5hbWV9KSB3aXRoICR7c2VjcmV0S2V5cy5sZW5ndGh9IHNlY3JldHM6ICR7c2VjcmV0S2V5cy5qb2luKCcsICcpfWBcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gMi4gQnVpbGQgKHZpbmV4dCBlbWJlZHMgdGhlIGVudmlyb25tZW50LWFwcGxpZWQgd3JhbmdsZXIgY29uZmlnIGludG8gZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbikuXG4gICAgLy8gICAgQnVpbGRpbmcgYmVmb3JlIG1pZ3JhdGluZyBrZWVwcyBhIGJ1aWxkIGZhaWx1cmUgZnJvbSBsZWF2aW5nIGEgbWlncmF0ZWQgc2NoZW1hIGJlaGluZFxuICAgIC8vICAgIHRoZSBvbGQgV29ya2VyLiBQbGFpbiBXb3JrZXJzIGhhdmUgbm8gYnVpbGQgc3RlcDsgd3JhbmdsZXIgYnVuZGxlcyB0aGUgZW50cnkgaXRzZWxmLlxuICAgIGNvbnN0IGlzVmluZXh0ID0gISEocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpbmV4dCA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udmluZXh0KTtcbiAgICBjb25zdCBkZXBsb3lDb25maWdQYXRoID0gaXNWaW5leHQgPyBwYXRoLmpvaW4oJ2Rpc3QnLCAnc2VydmVyJywgJ3dyYW5nbGVyLmpzb24nKSA6IHdyYW5nbGVyQ29uZmlnUGF0aDtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52QXNzaWdubWVudCA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uXG4gICAgICA/IGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ0NMT1VERkxBUkVfRU5WJywgZW52TmFtZSl9IGBcbiAgICAgIDogJyc7XG4gICAgaWYgKGlzVmluZXh0KSB7XG4gICAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikge1xuICAgICAgICBwcm9qZWN0LmVudi5ORVhUX1BVQkxJQ19XQl9WRVJTSU9OIHx8PSBwcm9qZWN0LmVudi5XQl9WRVJTSU9OO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZ2VuLWNvZGUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtjbG91ZGZsYXJlRW52QXNzaWdubWVudH1ZQVJOIHZpbmV4dCBidWlsZGAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgLy8gT24gZHJ5IHJ1bnMgdGhlIHZpbmV4dCBidWlsZCBhYm92ZSBpcyBhIHByaW50ZWQgbm8tb3AsIHNvIHRoZSBidWlsdCBjb25maWcgaXNcbiAgICAgIC8vIGxlZ2l0aW1hdGVseSBhYnNlbnQgYW5kIG11c3Qgbm90IGFib3J0IHRoZSBydW4uXG4gICAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRlcGxveUNvbmZpZ1BhdGgpKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgJHtkZXBsb3lDb25maWdQYXRofSBub3QgZm91bmQ7IHRoZSB2aW5leHQgYnVpbGQgZGlkIG5vdCBwcm9kdWNlIGEgZGVwbG95IGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIFdyYW5nbGVyIHZhbGlkYXRlcyBpdHMgY29uZmlnIHNjaGVtYSBvbmx5IHdoZW4gaXQgcnVucywgc28gYSBkcnkgcnVuIG9mIHRoZSBidWlsdFxuICAgICAgLy8gY29uZmlnIHN1cmZhY2VzIGNvbmZpZyBhbmQgYnVuZGxlIGVycm9ycyBCRUZPUkUgdGhlIHJlbW90ZSBtaWdyYXRpb25zIGJlbG93IG11dGF0ZVxuICAgICAgLy8gdGhlIGRhdGFiYXNlLCBtaXJyb3JpbmcgdGhlIHBsYWluLVdvcmtlciBkcnkgcnVuLiBObyAtLWVudjogdGhlIGJ1aWx0IGNvbmZpZyBhbHJlYWR5XG4gICAgICAvLyBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRlcGxveUNvbmZpZ1BhdGgpfWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBsYWluIFdvcmtlcnMgYXJlIGZpcnN0IGNvbXBpbGVkIGJ5IHdyYW5nbGVyIGR1cmluZyB0aGUgZGVwbG95IGl0c2VsZjsgYSBkcnkgcnVuXG4gICAgICAvLyBzdXJmYWNlcyBjb21waWxlIGVycm9ycyAoZS5nLiBhIG1pc3NpbmcgZW50cnkgcG9pbnQpIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnNcbiAgICAgIC8vIGJlbG93IG11dGF0ZSB0aGUgZGF0YWJhc2UuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IGAgLS1lbnYgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGVudk5hbWUpfWAgOiAnJ31gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIEFwcGx5IEQxIG1pZ3JhdGlvbnMgdG8gdGhlIHJlbW90ZSBkYXRhYmFzZSB3aXRoIHRoZSBwcm9qZWN0J3Mgc2luZ2xlIG1pZ3JhdGlvblxuICAgIC8vICAgIG1lY2hhbmlzbSAod3JhbmdsZXItbmF0aXZlIHdoZW4gYSBtaWdyYXRpb25zIGRpcmVjdG9yeSBleGlzdHMsIGVsc2UgZHJpenpsZS1raXQgd2hlblxuICAgIC8vICAgIHRoZSBkcml6emxlIGNvbmZpZyB0YXJnZXRzIHNxbGl0ZS9kMS1odHRwL2R1cmFibGUtc3FsaXRlKS4gTWlncmF0aW9ucyBtdXN0IGJlIGJhY2t3YXJkXG4gICAgLy8gICAgY29tcGF0aWJsZTogdGhlIG9sZCBXb3JrZXIgc2VydmVzXG4gICAgLy8gICAgdHJhZmZpYyB1bnRpbCB0aGUgZGVwbG95IGJlbG93LlxuICAgIGNvbnN0IGVudk9wdGlvbiA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gYCAtLWVudiAke3NoZWxsRXNjYXBlQXJndW1lbnQoZW52TmFtZSl9YCA6ICcnO1xuICAgIGZvciAoY29uc3QgZGF0YWJhc2Ugb2Ygd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcykge1xuICAgICAgY29uc3QgZGF0YWJhc2VOYW1lID0gZGF0YWJhc2UuZGF0YWJhc2VfbmFtZSA/PyBkYXRhYmFzZS5iaW5kaW5nO1xuICAgICAgaWYgKCFkYXRhYmFzZU5hbWUpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRhdGFiYXNlTmFtZSl9IC0tcmVtb3RlIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudCh3cmFuZ2xlckNvbmZpZ1BhdGgpfSR7ZW52T3B0aW9ufWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSkge1xuICAgICAgaWYgKCFkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVGhlICR7ZW52TmFtZX0gRDEgYmluZGluZyBoYXMgbm8gZGF0YWJhc2VfaWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGlmICghYWNjb3VudElkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCAob3IgYWNjb3VudF9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnKSBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBidWlsZERyaXp6bGVLaXRDb21tYW5kKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgJ21pZ3JhdGUnLFxuICAgICAgICAgIGBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEPSR7ZHJpenpsZUQxRGF0YWJhc2UuZGF0YWJhc2VfaWR9IENMT1VERkxBUkVfQUNDT1VOVF9JRD0ke2FjY291bnRJZH1gXG4gICAgICAgICksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gNC4gRGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseSAobm8gcG9zdC1kZXBsb3kgc2VjcmV0IHB1c2ggdGhhdCBjb3VsZCBsZWF2ZSB0aGVcbiAgICAvLyAgICBuZXcgdmVyc2lvbiBydW5uaW5nIHdpdGhvdXQg4oCUIG9yIHdpdGggc3RhbGUg4oCUIHNlY3JldHMpLiBUaGUgc2VjcmV0cyBKU09OIGdvZXMgdGhyb3VnaFxuICAgIC8vICAgIGEgbW9kZS0wNjAwIGZpbGUgaW4gYSBwcml2YXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZGVsZXRlZCByaWdodCBhZnRlciB0aGUgZGVwbG95OlxuICAgIC8vICAgIC9kZXYvc3RkaW4gaXMgTk9UIHJlbGlhYmxlIGhlcmUgYmVjYXVzZSB3cmFuZ2xlciByZWFkcyB0aGUgc2VjcmV0cyBmaWxlIG9ubHkgYWZ0ZXJcbiAgICAvLyAgICB1cGxvYWRpbmcgYXNzZXRzLCBieSB3aGljaCBwb2ludCB0aGUgcGlwZWQgc3RkaW4gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNvbnN1bWVkIOKAlFxuICAgIC8vICAgIG9ic2VydmVkIGFzIGEgZmxha3kgYENvdWxkIG5vdCByZWFkIGZpbGU6IC9kZXYvc3RkaW5gIG9uIENJLiBFeHBsaWNpdGx5IGVtcHR5IHZhbHVlc1xuICAgIC8vICAgIHN0YXkgaW4gdGhlIHBheWxvYWQ6IC0tc2VjcmV0cy1maWxlIGlzIGFkZGl0aXZlLCBzbyBwdXNoaW5nICcnIGlzIHRoZSBvbmx5IHdheSB0b1xuICAgIC8vICAgIGNsZWFyIGEgc3RhbGUgc2VjcmV0LlxuICAgIGNvbnN0IGRlcGxveUFyZ3MgPSBbXG4gICAgICAnZGVwbG95JyxcbiAgICAgICctLWNvbmZpZycsXG4gICAgICBkZXBsb3lDb25maWdQYXRoLFxuICAgICAgLy8gdmluZXh0J3MgYnVpbHQgY29uZmlnIGFscmVhZHkgaGFzIHRoZSBlbnZpcm9ubWVudCBhcHBsaWVkOyBwYXNzaW5nIC0tZW52IHRoZXJlIHdvdWxkXG4gICAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlLlxuICAgICAgLi4uKCFpc1ZpbmV4dCAmJiByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IFsnLS1lbnYnLCBlbnZOYW1lXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0LmVudi5XQl9WRVJTSU9OID8gWyctLXZhcicsIGBXQl9WRVJTSU9OOiR7cHJvamVjdC5lbnYuV0JfVkVSU0lPTn1gXSA6IFtdKSxcbiAgICAgICctLXNlY3JldHMtZmlsZScsXG4gICAgXTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogd3JhbmdsZXIgJHtkZXBsb3lBcmdzLmpvaW4oJyAnKX0gPHRlbXBvcmFyeSBzZWNyZXRzIGZpbGU+YCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gICAgICBjb25zdCBkZXBsb3lFbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gICAgICBkZWxldGUgZGVwbG95RW52LkNMT1VERkxBUkVfRU5WO1xuICAgICAgLy8gMG83MDAgZGlyZWN0b3J5ICsgMG82MDAgZmlsZTogcmVhZGFibGUgb25seSBieSB0aGUgZGVwbG95aW5nIHVzZXIsIGxpa2UgdGhlIGRvdGVudlxuICAgICAgLy8gZmlsZXMgdGhlIENJIHdvcmtmbG93IGFscmVhZHkgd3JpdGVzIG5leHQgdG8gaXQuIHdyYW5nbGVyIHJ1bnMgdGhyb3VnaCBhbiBhc3luYyBzcGF3blxuICAgICAgLy8gKHNwYXduU3luYyB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCwgc28gYSBzaHV0ZG93biBzaWduYWwgd291bGQga2lsbCB0aGUgcHJvY2Vzc1xuICAgICAgLy8gYmVmb3JlIGFueSBjbGVhbnVwKSBhbmQgdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIGluIGEgZmluYWxseSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgICAgIC8vIGRlcGxveSBjYW5ub3QgbGVhdmUgdGhlIHBsYWludGV4dCBzZWNyZXRzIGJlaGluZC4gU2h1dGRvd24gaGFuZGxpbmcgZGV0YWlsczpcbiAgICAgIC8vIC0gSGFuZGxlcnMgKGluY2x1ZGluZyBTSUdIVVAsIG9uIHdoaWNoIE5vZGUgYWxzbyB0ZXJtaW5hdGVzIGJ5IGRlZmF1bHQpIGFyZSBpbnN0YWxsZWRcbiAgICAgIC8vICAgQkVGT1JFIHRoZSBmaWxlIGlzIHdyaXR0ZW4gYW5kIHVzZSBwcm9jZXNzLm9uLCBub3Qgb25jZSwgc28gYSByZXBlYXRlZCBzaWduYWwgY2Fubm90XG4gICAgICAvLyAgIGZhbGwgYmFjayB0byBkZWZhdWx0IHRlcm1pbmF0aW9uIGFuZCBieXBhc3MgdGhlIGZpbmFsbHkgY2xlYW51cC5cbiAgICAgIC8vIC0gU0lHSFVQL1NJR1FVSVQgYXJlIGZvcndhcmRlZCB0byB3cmFuZ2xlciBhcyBTSUdURVJNOiB3cmFuZ2xlcidzIGxhdW5jaGVyIHJlbGF5cyBvbmx5XG4gICAgICAvLyAgIFNJR0lOVC9TSUdURVJNIHRvIGl0cyBpbm5lciBOb2RlIHByb2Nlc3MsIGFuZCBhbnl0aGluZyBlbHNlIHdvdWxkIG9ycGhhbiBhIGRlcGxveW1lbnRcbiAgICAgIC8vICAgdGhhdCBrZWVwcyBtdXRhdGluZyB0aGUgcmVtb3RlIFdvcmtlciBhZnRlciB3YiBleGl0cy5cbiAgICAgIC8vIC0gVGhlIHJlLXJhaXNlIGJlbG93IHVzZXMgdGhlIHNpZ25hbCB3YiBpdHNlbGYgcmVjZWl2ZWQ6IHdyYW5nbGVyIGNhdGNoZXMgU0lHSU5UIGFuZFxuICAgICAgLy8gICBleGl0cyBudW1lcmljYWxseSAoZS5nLiAxNDMpLCB3aGljaCBtdXN0IG5vdCBtYXNxdWVyYWRlIGFzIGFuIG9yZGluYXJ5IGZhaWx1cmUuXG4gICAgICBjb25zdCBzZWNyZXRzRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLWRlcGxveS0nKSk7XG4gICAgICBjb25zdCBzaHV0ZG93blNpZ25hbHMgPSBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBsZXQgd3JhbmdsZXJQcm9jZXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWNlaXZlZFNodXRkb3duU2lnbmFsID8/PSBzaWduYWw7XG4gICAgICAgICAgaWYgKHdyYW5nbGVyUHJvY2Vzcykge1xuICAgICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLmtpbGwoc2lnbmFsID09PSAnU0lHSU5UJyB8fCBzaWduYWwgPT09ICdTSUdURVJNJyA/IHNpZ25hbCA6ICdTSUdURVJNJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIFdpdGggdGhlIGhhbmRsZXJzIHJlbW92ZWQsIHJlLXJhaXNpbmcgdHJpZ2dlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbGV0IGRlcGxveVN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VjcmV0c0ZpbGVQYXRoID0gcGF0aC5qb2luKHNlY3JldHNEaXJQYXRoLCAnc2VjcmV0cy5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2VjcmV0c0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZWNyZXRzKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICAgICAgZGVwbG95U3RhdHVzID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2VzcyA9IHNwYXduKCd3cmFuZ2xlcicsIFsuLi5kZXBsb3lBcmdzLCBzZWNyZXRzRmlsZVBhdGhdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGVudjogZGVwbG95RW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHNpZ25hbCA/IDEgOiAoY29kZSA/PyB1bmRlZmluZWQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBwcm9jZXNzLmV4aXQgc2tpcHMgZmluYWxseSBibG9ja3MsIHNvIHRoZSBleGl0LW9uLWZhaWx1cmUgYmVsb3cgc3RheXMgb3V0c2lkZS5cbiAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2VpdmVkU2h1dGRvd25TaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2Ugc28gdGhlIGNhbGxlciBvYnNlcnZlcyB0aGUgc2FtZSBzaWduYWwtZGVyaXZlZCBleGl0IHN0YXR1cy5cbiAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNodXRkb3duU2lnbmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRlcGxveVN0YXR1cyAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgd3JhbmdsZXIgZGVwbG95IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2RlcGxveVN0YXR1cyA/PyAndW5rbm93bid9LmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGRlcGxveVN0YXR1cyA/PyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LiBPcHRpb25hbCBwb3N0LWRlcGxveSBob29rIChlLmcuIHNlZWRpbmcgdGhlIHJlbW90ZSBEMSB2aWEgZHJpenpsZSdzIGQxLWh0dHAgZHJpdmVyKS5cbiAgICAvLyAgICBBc3NpZ24gdGhlIHJlc29sdmVkIGlkcyB1bmNvbmRpdGlvbmFsbHk6IGEgc3RhbGUgZXhwb3J0ZWQgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRFxuICAgIC8vICAgIG11c3Qgbm90IHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvcG9zdCddKSB7XG4gICAgICAvLyBUaGUgaWQgaXMgdW5hbWJpZ3VvdXMgb25seSB3aXRoIGEgc2luZ2xlIEQxIGJpbmRpbmc7IHdpdGggbXVsdGlwbGUsIHRoZSBob29rIG11c3RcbiAgICAgIC8vIHJlc29sdmUgaXRzIHRhcmdldCBpdHNlbGYuIENsZWFyIGZpcnN0IGVpdGhlciB3YXk6IGEgc3RhbGUgaW5oZXJpdGVkIGlkIG11c3Qgbm90XG4gICAgICAvLyByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgICAgY29uc3QgaG9va0QxRGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ7XG4gICAgICBpZiAocmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdNdWx0aXBsZSBEMSBiaW5kaW5ncyBleGlzdDsgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCBpcyBub3Qgc2V0IGZvciBkZXBsb3kvcG9zdC4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoaG9va0QxRGF0YWJhc2U/LmRhdGFiYXNlX2lkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEID0gaG9va0QxRGF0YWJhc2UuZGF0YWJhc2VfaWQ7XG4gICAgICBpZiAoYWNjb3VudElkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQgPSBhY2NvdW50SWQ7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9wb3N0JywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBSZWFkIHRoZSBDbG91ZGZsYXJlIEFQSSB0b2tlbiB0aGF0IENJIGRyb3BzIGluIGEgYC5lbnYuY2xvdWRmbGFyZWAgZmlsZSAoZS5nLiB0aGUgcmV1c2FibGVcbiAqIGRlcGxveSB3b3JrZmxvdydzIGBmaWxlX3BhdGhfMWApLCBsb29raW5nIGJlc2lkZSB0aGUgV29ya2VyJ3Mgd3JhbmdsZXIgY29uZmlnIGFuZCBhdCB0aGVcbiAqIG1vbm9yZXBvIHJvb3Qg4oCUIGBmaWxlX3BhdGhfMWAgaXMgcmVwby1yZWxhdGl2ZSwgc28gYm90aCBzcGVsbGluZ3Mgb2NjdXIgaW4gcHJhY3RpY2UuXG4gKiBOZWFyZXIgZmlsZXMgd2luLCBtaXJyb3JpbmcgdGhlIGAuZW52YCBjYXNjYWRlOiBhIHdvcmtzcGFjZSBtYXkgb3ZlcnJpZGUgdGhlIHJvb3QgdG9rZW4sXG4gKiBuZXZlciB0aGUgcmV2ZXJzZS4gUGFzcyBgcm9vdERpclBhdGhgIGFzIHVuZGVmaW5lZCB0byByZWFkIHRoZSB3b3Jrc3BhY2UgYWxvbmUsIHNvIHRoYXRcbiAqIGAtLWluY2x1ZGUtcm9vdC1lbnY9ZmFsc2VgIGlzb2xhdGVzIHRoaXMgZmlsZSBmcm9tIHRoZSByb290IGp1c3QgYXMgaXQgZG9lcyB0aGUgY2FzY2FkZS5cbiAqIGBDTE9VREZMQVJFX0VOVmAgaXMgZHJvcHBlZDsgaXQgd291bGQgZG91YmxlLWFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ2xvdWRmbGFyZUVudkZpbGVzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgY3VycmVudERpclBhdGggb2YgbmV3IFNldChyb290RGlyUGF0aCA/IFtkaXJQYXRoLCByb290RGlyUGF0aF0gOiBbZGlyUGF0aF0pKSB7XG4gICAgY29uc3QgY2xvdWRmbGFyZUVudlBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICcuZW52LmNsb3VkZmxhcmUnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xvdWRmbGFyZUVudlBhdGgpKSBjb250aW51ZTtcbiAgICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBjbG91ZGZsYXJlRW52UGF0aCwgcHJvY2Vzc0Vudjoge30sIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICBpZiAoa2V5ID09PSAnQ0xPVURGTEFSRV9FTlYnKSBjb250aW51ZTtcbiAgICAgIGVudlZhcnNba2V5XSA/Pz0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFNlbGVjdCB0aGUgc2VjcmV0cyB0byBwdXNoIHRvIHRoZSBXb3JrZXIgZnJvbSB0aGUgZG90ZW52LWxvYWRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiBldmVyeSBleHBsaWNpdGx5IHNldCB2YWx1ZSDigJQgaW5jbHVkaW5nIGVtcHR5IHN0cmluZ3MsIHdoaWNoIGNsZWFyIHN0YWxlIHJlbW90ZSBzZWNyZXRzXG4gKiBzaW5jZSBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpcyBhZGRpdGl2ZSDigJQgZXhjZXB0IHdyYW5nbGVyIGB2YXJzYCAoYSBzZWNyZXQgbWF5XG4gKiBub3Qgc2hhcmUgYSBuYW1lIHdpdGggYSB2YXIpLCBkZXBsb3ktY29udHJvbCBrZXlzLCBhbmQgbG9jYWwgYGZpbGU6YCBEQVRBQkFTRV9VUkxzLlxuICogUmV0dXJucyB0aGUgcmVxdWlyZWQga2V5cyAoZnJvbSAuZW52LmV4YW1wbGUpIHRoYXQgYXJlIHN0aWxsIGVtcHR5IHNvIHRoZSBkZXBsb3kgY2FuXG4gKiBhYm9ydCBiZWZvcmUgYW55IHJlbW90ZSBtdXRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFdvcmtlclNlY3JldHMoXG4gIGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGNvbmZpZ1ZhcktleXM6IHN0cmluZ1tdLFxuICByZXF1aXJlZEtleXM6IHN0cmluZ1tdXG4pOiB7IG1pc3NpbmdLZXlzOiBzdHJpbmdbXTsgc2VjcmV0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHtcbiAgY29uc3QgY29uZmlnS2V5cyA9IG5ldyBTZXQoY29uZmlnVmFyS2V5cyk7XG4gIGNvbnN0IHNlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgLy8gTm8gcnVudGltZSB1bmRlZmluZWQgY2hlY2sgb24gYHZhbHVlYDogZW52VmFycyBpcyBidWlsdCBleGNsdXNpdmVseSBmcm9tIGRvdGVudi1wYXJzZWRcbiAgLy8gc3RyaW5ncywgYW5kIGV2ZXJ5IGNhbGxlci1zaWRlIG1lcmdlIGVpdGhlciBjb2FsZXNjZXMgd2l0aCBgPz8gJydgIG9yIGd1YXJkcyBhZ2FpbnN0XG4gIC8vIHVuZGVmaW5lZCBiZWZvcmUgYXNzaWduaW5nLCBzbyB0aGUgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB0eXBlIGhvbGRzIGF0IHJ1bnRpbWUgdG9vLlxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmIChjb25maWdLZXlzLmhhcyhrZXkpIHx8IGlzTm9uU2VjcmV0S2V5KGtleSkpIGNvbnRpbnVlO1xuICAgIGlmIChrZXkgPT09ICdEQVRBQkFTRV9VUkwnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ2ZpbGU6JykpIGNvbnRpbnVlO1xuICAgIHNlY3JldHNba2V5XSA9IHZhbHVlO1xuICB9XG4gIGNvbnN0IG1pc3NpbmdLZXlzID0gcmVxdWlyZWRLZXlzLmZpbHRlcigoa2V5KSA9PiAhY29uZmlnS2V5cy5oYXMoa2V5KSAmJiAhaXNOb25TZWNyZXRLZXkoa2V5KSAmJiAhZW52VmFyc1trZXldKTtcbiAgcmV0dXJuIHsgbWlzc2luZ0tleXMsIHNlY3JldHMgfTtcbn1cblxuLyoqXG4gKiBMaXN0IHRoZSBzZWNyZXQgbmFtZXMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSBkZXBsb3kgdGFyZ2V0IFdvcmtlci4gUmV0dXJucyB1bmRlZmluZWQgd2hlblxuICogdGhlIGxpc3RpbmcgZmFpbHMgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiB0aGUgV29ya2VyIG5vdCBleGlzdGluZyB5ZXQgKGZpcnN0IGRlcGxveSksIHNvXG4gKiB0aGUgY2FsbGVyIGNhbiBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGxpbWl0IGNoZWNrcyBpbnN0ZWFkIG9mIGJsb2NraW5nIGEgZGVwbG95IHRoYXRcbiAqIHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuIEZhaWxpbmcgY2xvc2VkIGluc3RlYWQgd291bGQgdHVybiBldmVyeSB0cmFuc2llbnQgbGlzdGluZ1xuICogZmFpbHVyZSAobmV0d29yaywgYSB0b2tlbiB3aXRob3V0IHNlY3JldC1yZWFkIHBlcm1pc3Npb24pIGludG8gYSBkZXBsb3kgYmxvY2tlciwgYW5kIOKAlCBzaW5jZVxuICogd3JhbmdsZXIgNC54IHJlcG9ydHMgYSBtaXNzaW5nIFdvcmtlciBvbmx5IHZpYSBhbiBlcnJvci1tZXNzYWdlIGhpbnQg4oCUIGFueSB1bnJlY29nbml6ZWRcbiAqIG5vdC1mb3VuZCBzaGFwZSB3b3VsZCB0aGVuIGJsb2NrIGZpcnN0IGRlcGxveXMgZW50aXJlbHk7IHRoaXMgcHJlZmxpZ2h0IG11c3Qgb25seSBldmVyIGFkZFxuICogZmFpbHVyZXMgdGhhdCB3cmFuZ2xlciBpdHNlbGYgd291bGQgcmFpc2UgYWZ0ZXIgdGhlIG1pZ3JhdGlvbnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RSZW1vdGVXb3JrZXJTZWNyZXROYW1lcyhcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogRGVwbG95Q29tbWFuZEFyZ3YsXG4gIHdyYW5nbGVyQ29uZmlnUGF0aDogc3RyaW5nLFxuICByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyxcbiAgZW52TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gIGNvbnN0IGxpc3RBcmdzID0gW1xuICAgICdzZWNyZXQnLFxuICAgICdsaXN0JyxcbiAgICAnLS1mb3JtYXQnLFxuICAgICdqc29uJyxcbiAgICAnLS1jb25maWcnLFxuICAgIHdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgICAuLi4ocmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBbJy0tZW52JywgZW52TmFtZV0gOiBbXSksXG4gIF07XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2xpc3RBcmdzLmpvaW4oJyAnKX1gKSk7XG4gIGxldCByZXQ7XG4gIHRyeSB7XG4gICAgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYygnd3JhbmdsZXInLCBsaXN0QXJncywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBgRmFpbGVkIHRvIHJ1biB3cmFuZ2xlciB0byBsaXN0IHJlbW90ZSBzZWNyZXRzOyBjaGVja2luZyBvbmx5IHRoZSBsb2NhbCBwYXlsb2FkIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGxpbWl0cy5cXG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChyZXQuc3RhdHVzID09PSAwKSB7XG4gICAgLy8gQ3V0IHRoZSBKU09OIGFycmF5IG91dCBvZiB0aGUgc3Vycm91bmRpbmcgb3V0cHV0OiB3cmFuZ2xlciBtYXkgcHJpbnQgaXRzIGJhbm5lciBhbmRcbiAgICAvLyBcIk11bHRpcGxlIGVudmlyb25tZW50c1wiIHdhcm5pbmdzIGFyb3VuZCB0aGUgcGF5bG9hZC5cbiAgICBjb25zdCBqc29uU3RhcnQgPSByZXQuc3Rkb3V0LmluZGV4T2YoJ1snKTtcbiAgICBjb25zdCBqc29uRW5kID0gcmV0LnN0ZG91dC5sYXN0SW5kZXhPZignXScpO1xuICAgIGlmIChqc29uU3RhcnQgIT09IC0xICYmIGpzb25FbmQgIT09IC0xICYmIGpzb25TdGFydCA8IGpzb25FbmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmV0LnN0ZG91dC5zbGljZShqc29uU3RhcnQsIGpzb25FbmQgKyAxKSkgYXMgeyBuYW1lPzogdW5rbm93biB9W107XG4gICAgICAgIHJldHVybiBwYXJzZWQubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkuZmlsdGVyKChuYW1lKTogbmFtZSBpcyBzdHJpbmcgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHdhcm5pbmcgYmVsb3cuXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKC9cXFtjb2RlOiAxMDAoMDd8OTApXFxdfElmIHRoaXMgaXMgYSBuZXcgV29ya2VyLy50ZXN0KHJldC5zdGRvdXQgKyByZXQuc3RkZXJyKSkge1xuICAgIC8vIFRoZSBXb3JrZXIgZG9lcyBub3QgZXhpc3QgeWV0LCBzbyBhIGZpcnN0IGRlcGxveSBpbmhlcml0cyBub3RoaW5nLiBXcmFuZ2xlciA0LnggY2F0Y2hlc1xuICAgIC8vIHRoZSBDbG91ZGZsYXJlIEFQSSBlcnJvcnMgMTAwMDcgKHdvcmtlcnMuYXBpLmVycm9yLnNlcnZpY2Vfbm90X2ZvdW5kKSBhbmQgMTAwOTBcbiAgICAvLyAod29ya2Vycy5hcGkuZXJyb3Iuc2NyaXB0X25vdF9mb3VuZCkgYW5kIHJldGhyb3dzIHRoZW0gYXMgYSBVc2VyRXJyb3IgY29udGFpbmluZyB0aGVcbiAgICAvLyAnSWYgdGhpcyBpcyBhIG5ldyBXb3JrZXIsIHJ1biBgd3JhbmdsZXIgZGVwbG95YCBmaXJzdCcgaGludCB3aXRob3V0IHRoZSBudW1lcmljIGNvZGUsXG4gICAgLy8gc28gbWF0Y2ggYm90aCBzaGFwZXMuXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnNvbGUud2FybihcbiAgICBjaGFsay55ZWxsb3coXG4gICAgICBgRmFpbGVkIHRvIGxpc3QgdGhlIHJlbW90ZSBXb3JrZXIgc2VjcmV0czsgY2hlY2tpbmcgb25seSB0aGUgbG9jYWwgcGF5bG9hZCBhZ2FpbnN0IENsb3VkZmxhcmUncyBsaW1pdHMuXFxuJHsocmV0LnN0ZGVyciB8fCByZXQuc3Rkb3V0KS50cmltKCl9YFxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdGUgc2VjcmV0cyB0aGF0IHN0YXkgYXR0YWNoZWQgdG8gdGhlIG5ldyB2ZXJzaW9uOiBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpc1xuICogYWRkaXRpdmUsIHNvIGV2ZXJ5IHJlbW90ZSBzZWNyZXQgdGhlIG91dGdvaW5nIHBheWxvYWQgZG9lcyBub3Qgb3ZlcndyaXRlIGtlZXBzIGNvdW50aW5nXG4gKiBhZ2FpbnN0IENsb3VkZmxhcmUncyBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgbGltaXQg4oCUIGV4Y2VwdCBuYW1lcyB0aGF0IGFuIGVmZmVjdGl2ZSB2YXIgb3JcbiAqIGJpbmRpbmcgcmVwbGFjZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgcmVtb3RlU2VjcmV0TmFtZXM6IHN0cmluZ1tdLFxuICBvdXRnb2luZ1NlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGVmZmVjdGl2ZVZhcktleXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBiaW5kaW5nTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlcGxhY2VkTmFtZXMgPSBuZXcgU2V0KFsuLi5lZmZlY3RpdmVWYXJLZXlzLCAuLi5iaW5kaW5nTmFtZXNdKTtcbiAgcmV0dXJuIHJlbW90ZVNlY3JldE5hbWVzLmZpbHRlcigobmFtZSkgPT4gIU9iamVjdC5oYXNPd24ob3V0Z29pbmdTZWNyZXRzLCBuYW1lKSAmJiAhcmVwbGFjZWROYW1lcy5oYXMobmFtZSkpO1xufVxuXG4vKipcbiAqIFJlYWRpbmcgYmluRXhpc3RzIHByZXBlbmRzIG5vZGVfbW9kdWxlcy8uYmluIGRpcmVjdG9yaWVzIHRvIHByb2plY3QuZW52LlBBVEgsXG4gKiBzbyB0aGUgZGlyZWN0IChub24tc2hlbGwpIHdyYW5nbGVyIHNwYXducyByZXNvbHZlIHRoZSBsb2NhbCBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBpZiAoIXByb2plY3QuYmluRXhpc3RzKSB7XG4gICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnbm9kZV9tb2R1bGVzLy5iaW4gbm90IGZvdW5kOyByZWx5aW5nIG9uIFBBVEggdG8gcmVzb2x2ZSB3cmFuZ2xlci4nKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7XG4gIGhhc1Byb2plY3RGbm94Q29uZmlnLFxuICByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzLFxuICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmludGVyZmFjZSBQYXJzZWREb3RlbnZBcmdzIHtcbiAgY29tbWFuZDogc3RyaW5nW107XG59XG5cbmNvbnN0IHNodXRkb3duU2lnbmFscyA9IG5ldyBTZXQ8Tm9kZUpTLlNpZ25hbHM+KFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKTtcblxuZXhwb3J0IGNvbnN0IGRvdGVudkNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdkb3RlbnYgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ0xvYWQgLmVudiBmaWxlcyBhbmQgcnVuIGEgY29tbWFuZC4nLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+IHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHJ1blBhcnNlZERvdGVudkNvbW1hbmQoZ2V0UGFyc2VkRG90ZW52QXJnc0Zyb21ZYXJncyhhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5QYXJzZWREb3RlbnZDb21tYW5kKHsgY29tbWFuZCB9OiBQYXJzZWREb3RlbnZBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb21tYW5kLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1VzYWdlOiB3YiBkb3RlbnYgLS0gPGNvbW1hbmQ+IFthcmdzLi4uXScpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGN3ZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKTtcbiAgcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkKTtcbiAgY29uc3QgYmVycnlCaW5Gb2xkZXJQYXRoID0gcHJvY2Vzcy5lbnYuQkVSUllfQklOX0ZPTERFUjtcbiAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgLy8gU3RyaXBwaW5nIHlhcm4ncyBlbnZpcm9ubWVudCBhbHNvIHJlbW92ZXMgaXRzIHRlbXBvcmFyeSBiaW4gZm9sZGVyIOKAlCB0aGUgT05MWSBwbGFjZVxuICAvLyB5YXJuIEJlcnJ5IGV4cG9zZXMgZGVwZW5kZW5jeSBleGVjdXRhYmxlcyDigJQgc28gcmVzdG9yZSB0aGUgcHJvamVjdCdzIG93blxuICAvLyBub2RlX21vZHVsZXMvLmJpbiBkaXJlY3RvcmllcyB0byBrZWVwIGJhcmUgYmluYXJ5IG5hbWVzIHJlc29sdmFibGUuIFBsdWcnbidQbGF5IGluc3RhbGxzXG4gIC8vIGNyZWF0ZSBubyBub2RlX21vZHVsZXMgYXQgYWxsOyB0aGUgdGVtcG9yYXJ5IGJpbiBmb2xkZXIgaXMgdGhlbiB0aGUgc29sZSBzb3VyY2Ugb2ZcbiAgLy8gZGVwZW5kZW5jeSBleGVjdXRhYmxlcywgc28gcmVzdG9yZSBpdCBpbnN0ZWFkLlxuICAvLyBUaGUgdGVtcG9yYXJ5IGZvbGRlciBpcyBkZWxpYmVyYXRlbHkgTk9UIHJlc3RvcmVkIHdoZW4gLmJpbiBkaXJlY3RvcmllcyBleGlzdDogaXQgYWxzb1xuICAvLyBjb250YWlucyBub2RlL3lhcm4gc2hpbXMsIGFuZCBhIGxlYWtlZCBub2RlIHNoaW0gd291bGQgdmlvbGF0ZSB3YidzIHJlYWwtTm9kZSBndWFyYW50ZWVcbiAgLy8gZm9yIHRvb2xzIGxpa2Ugd3JhbmdsZXIvdmluZXh0LiBDaGlsZCBgeWFybmAgaW52b2NhdGlvbnMgc3RheSByZXNvbHZhYmxlIHRocm91Z2ggdGhlXG4gIC8vIGxhdW5jaGVyIG9uIHRoZSBiYXNlIFBBVEggKG1pc2UvY29yZXBhY2spLCB3aGljaCBldmVyeSBzdXBwb3J0ZWQgZW52aXJvbm1lbnQgaGFzIOKAlFxuICAvLyBub3RoaW5nIGNvdWxkIGhhdmUgc3RhcnRlZCBgeWFybiBydW5gL2B3YiBkb3RlbnZgIHdpdGhvdXQgaXQuXG4gIGlmICghcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKGN3ZCwgcHJvY2Vzcy5lbnYpICYmIGJlcnJ5QmluRm9sZGVyUGF0aCkge1xuICAgIHByb2Nlc3MuZW52LlBBVEggPSBwcm9jZXNzLmVudi5QQVRIID8gYCR7YmVycnlCaW5Gb2xkZXJQYXRofToke3Byb2Nlc3MuZW52LlBBVEh9YCA6IGJlcnJ5QmluRm9sZGVyUGF0aDtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oY29tbWFuZFswXSEsIGNvbW1hbmQuc2xpY2UoMSksIHtcbiAgICBjd2QsXG4gICAgZW52OiBwcm9jZXNzLmVudixcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbiAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH0pO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICBjb25zdCBzaWduYWxIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY2hpbGQua2lsbChzaWduYWwpO1xuICAgIH07XG4gICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gIH1cbiAgY2hpbGQub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIC8vIFJlLXJhaXNlIGV2ZW4gZm9yIGZvcndhcmRlZCBzaHV0ZG93biBzaWduYWxzIHNvIGNhbGxlcnMgb2JzZXJ2ZSB0aGUgY29udmVudGlvbmFsXG4gICAgICAvLyBzaWduYWwgZXhpdCBzdGF0dXMgKGUuZy4gMTMwIGZvciBTSUdJTlQpIGluc3RlYWQgb2YgYSBtaXNsZWFkaW5nIHN1Y2Nlc3MuXG4gICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDEpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VkRG90ZW52QXJnc0Zyb21ZYXJncyhhcmd2OiBBcmd1bWVudHNDYW1lbENhc2UpOiBQYXJzZWREb3RlbnZBcmdzIHtcbiAgcmV0dXJuIHtcbiAgICBjb21tYW5kOiBbXG4gICAgICAuLi4oKGFyZ3YuYXJncyBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAgIC4uLigoYXJndlsnLS0nXSBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICBdLFxuICB9O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZml4VGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFxuICAgICF2YWx1ZSB8fFxuICAgIFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXS5pbmNsdWRlcyh2YWx1ZSkgfHxcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8XG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgPT09ICd0cnVlJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5lcnJvcihcbiAgICBgV0JfRU5WIG11c3QgYmUgb25lIG9mIGRldmVsb3BtZW50LCB0ZXN0LCBzdGFnaW5nLCBvciBwcm9kdWN0aW9uLCBidXQgaXMgXCIke3ZhbHVlfVwiLiBgICtcbiAgICAgIGBGaXggJHtmaXhUYXJnZXR9LCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suYFxuICApO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbi8vIE5PVEU6IGB3YiBkb3RlbnZgIGRlbGliZXJhdGVseSBza2lwcyBQcm9qZWN0LmVudidzIGZ1bGwgdmFsaWRhdGlvbjogaXQgaXMgYSBnZW5lcmljIHJ1bm5lciBhbHNvXG4vLyB1c2VkIGJlZm9yZSBlbnYgc291cmNlcyBleGlzdCAoYm9vdHN0cmFwKSBhbmQgbXVzdCBub3QgZmFpbCBmYXN0IGZvciByZXBvc2l0b3JpZXMgdGhhdCBoYXZlIG5vdFxuLy8gYWRvcHRlZCB0aGUgb3JnIGVudiBzdGFuZGFyZC4gQSBOT04tRU1QVFkgV0JfRU5WIGlzIHN0aWxsIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzdGFuZGFyZCBtb2Rlcyxcbi8vIHRob3VnaCDigJQgYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gIHdvdWxkIG90aGVyd2lzZSBzaWxlbnRseSBzZWxlY3QgdGhlIGJhc2UgKGRldmVsb3BtZW50KSB2YWx1ZXMuXG5mdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2Q6IHN0cmluZyk6IHZvaWQge1xuICAvLyBUaGUgbW9kZSBpcyBGT1JDRUQgb25seSB3aGVuIFdCX0VOViBpcyBleHBsaWNpdGx5IGV4cG9ydGVkOyBpdCBkcml2ZXMgdGhlIGZvcmNlZC1tb2RlIG92ZXJyaWRlXG4gIC8vIGJlbG93IGFuZCB0aGUgdmFsaWRhdGlvbiBhdCB0aGUgZW5kLlxuICBjb25zdCBtb2RlID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAvLyBUd28gc2VsZWN0b3JzLCBib3RoIGRlZmF1bHRpbmcgdG8gZGV2ZWxvcG1lbnQgbGlrZSB3YidzIG1haW4gbG9hZGVyIChgV0JfRU5WIHx8IE5PREVfRU5WIHx8XG4gIC8vICdkZXZlbG9wbWVudCdgLCBzZWUgcmVhZEVudmlyb25tZW50VmFyaWFibGVzKSBzbyBhIHJlcG8ga2VlcGluZyBkZXYtb25seSBzZWNyZXRzIGluXG4gIC8vIGBbcHJvZmlsZXMuZGV2ZWxvcG1lbnQuc2VjcmV0c11gIGxvYWRzIHRoZW0gd2hlbiBXQl9FTlYgaXMgdW5zZXQgaW5zdGVhZCBvZiBvbmx5IHRoZSBiYXNlIHRhYmxlOlxuICAvLyAgIC0gZW52Q2FzY2FkZSBwaWNrcyB0aGUgYC5lbnYuPGVudkNhc2NhZGU+YCBmaWxlcy4gSXQgbXVzdCBOT1QgY29uc3VsdCBGTk9YX1BST0ZJTEUg4oCUIHRoYXQgaXMgYVxuICAvLyAgICAgZm5veC1vbmx5IHNlbGVjdG9yLCBhbmQgbGV0dGluZyBpdCByZWRpcmVjdCBhIGxlZ2FjeSBgLmVudmAtb25seSBwcm9qZWN0J3MgY2FzY2FkZSB3b3VsZCBsb2FkXG4gIC8vICAgICB0aGUgd3JvbmcgZmlsZXMuXG4gIC8vICAgLSBmbm94Q2FzY2FkZSBwaWNrcyB0aGUgZm5veCBgLS1wcm9maWxlYCBhbmQgZ2F0ZXMgdGhlIFdCX0VOViBjaGVjayBiZWxvdy4gSXQgYWRkaXRpb25hbGx5IGhvbm9yc1xuICAvLyAgICAgYW4gZXhwbGljaXQgRk5PWF9QUk9GSUxFLCBiZWNhdXNlIGZub3ggaG9ub3JzIGl0IGFuZCBgd2IgZG90ZW52YCB3aXRob3V0IFdCX0VOViBpcyBkb2N1bWVudGVkXG4gIC8vICAgICB0byBhcyB3ZWxsIChzZWUgcnVuRm5veEV4cG9ydCdzIGlnbm9yZVByb2ZpbGVFbnZWYXIgbm90ZSkuXG4gIC8vIE5PREVfRU5WIGlzIHJlYWQgdGhyb3VnaCB0aGUgYHJ1bnRpbWVFbnZgIGFsaWFzLCBuZXZlciBhcyB0aGUgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCBtZW1iZXJcbiAgLy8gZXhwcmVzc2lvbiB0aGF0IHRoZSBidW5kbGVyIGlubGluZXMgdG8gJ3Byb2R1Y3Rpb24nICh3aGljaCB3b3VsZCB3cm9uZ2x5IHNlbGVjdCBwcm9kdWN0aW9uKS5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBlbnZDYXNjYWRlID0gbW9kZSB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG4gIGNvbnN0IGZub3hDYXNjYWRlID0gbW9kZSB8fCBydW50aW1lRW52LkZOT1hfUFJPRklMRSB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG4gIGNvbnN0IHJlYWRFbnZGaWxlID0gKGZpbGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+XG4gICAgY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKGN3ZCwgZmlsZU5hbWUpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAvLyBNb2RlLXNwZWNpZmljIHNvdXJjZXMgZHJpdmUgdGhlIGZvcmNlZC1tb2RlIG92ZXJyaWRlIGJlbG93IChvbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgbW9kZSBpcyBmb3JjZWQpLlxuICBjb25zdCBtb2RlVmFycyA9IG1vZGUgPyB7IC4uLnJlYWRFbnZGaWxlKGAuZW52LiR7bW9kZX1gKSwgLi4ucmVhZEVudkZpbGUoYC5lbnYuJHttb2RlfS5sb2NhbGApIH0gOiB7fTtcbiAgLy8gTWlycm9yIHRoZSBzaGFyZWQgY2FzY2FkZSdzIHByZWNlZGVuY2U6IC5lbnYuPGM+LmxvY2FsID4gLmVudi5sb2NhbCA+IC5lbnYuPGM+ID4gLmVudiAoYyA9IGVudkNhc2NhZGUpLlxuICBjb25zdCBkb3RlbnZWYXJzID0ge1xuICAgIC4uLnJlYWRFbnZGaWxlKCcuZW52JyksXG4gICAgLi4ucmVhZEVudkZpbGUoYC5lbnYuJHtlbnZDYXNjYWRlfWApLFxuICAgIC4uLnJlYWRFbnZGaWxlKCcuZW52LmxvY2FsJyksXG4gICAgLi4ucmVhZEVudkZpbGUoYC5lbnYuJHtlbnZDYXNjYWRlfS5sb2NhbGApLFxuICB9O1xuICAvLyBXQl9FTlYgaW4gcHJvY2Vzcy5lbnYgbWVhbnMgdGhlIG1vZGUgaXMgZXhwbGljaXRseSBmb3JjZWQsIHNvIHZhbHVlcyBmcm9tIHRoZSBtb2RlJ3Mgb3duXG4gIC8vIHNvdXJjZXMgKC5lbnYuPG1vZGU+Wy5sb2NhbF0gYW5kIHRoZSBmbm94IHByb2ZpbGUpIHdpbiBvdmVyIHZhcmlhYmxlcyBpbmhlcml0ZWQgZnJvbSB0aGVcbiAgLy8gcGFyZW50IHNoZWxsIOKAlCBleGNlcHQgb24gQ0ksIHdoZXJlIGluamVjdGVkIGVudiB2YXJzIG11c3Qga2VlcCBvdmVycmlkaW5nIGNvbW1pdHRlZCBmaWxlc1xuICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuXG4gIGNvbnN0IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiA9ICEhbW9kZSAmJiAhaXNDSShwcm9jZXNzLmVudi5DSSk7XG4gIC8vIGZub3gudG9tbCBpcyB0aGUgY29tbWl0dGVkLCBlbmNyeXB0ZWQgZXF1aXZhbGVudCBvZiAuZW52IGZpbGVzOyBsb2NhbCAuZW52IGZpbGVzIHN0aWxsIHdpbiBvdmVyIGl0LlxuICBjb25zdCBbZm5veFZhcnNdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGZub3hDYXNjYWRlLCBkb3RlbnZWYXJzLCB7IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiB9KTtcbiAgY29uc3QgcGFyc2VkID0geyAuLi5mbm94VmFycywgLi4uZG90ZW52VmFycyB9O1xuICAvLyBFeHBhbmQgJHsuLi59IHJlZmVyZW5jZXMgYWdhaW5zdCBleHBvcnRlZCB2YXJpYWJsZXMgd2hvc2UgRklMRSB2YWx1ZSBsb3NlcyB0byB0aGUgc2hlbGxcbiAgLy8gKG1pcnJvcmluZyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMnIGVmZmVjdGl2ZS12YWx1ZSBzZW1hbnRpY3MpOiBhIHJlZmVyZW5jZSBtdXN0IHJlc29sdmUgdG9cbiAgLy8gdGhlIHZhbHVlIHRoZSBjaGlsZCB3aWxsIGFjdHVhbGx5IHNlZSwgc28gYSBzaGVsbC1zaGFkb3dlZCBrZXkgZXhwYW5kcyB0byB0aGUgc2hlbGwgdmFsdWVcbiAgLy8gd2hpbGUgYSB3aW5uaW5nIGZpbGUvb3ZlcnJpZGUgdmFsdWUgZXhwYW5kcyB0byB0aGUgZmlsZSB2YWx1ZS5cbiAgY29uc3QgZmlsZVZhbHVlV2lucyA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICAhKGtleSBpbiBwcm9jZXNzLmVudikgfHwgKG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiAoa2V5IGluIG1vZGVWYXJzIHx8IGtleSBpbiBmbm94VmFycykpO1xuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBleHBvcnRlZCB2YWx1ZXMgc3Vic3RpdHV0ZSBsaXRlcmFsbHkgKHBhJHdvcmQgc3RheXMgcGEkd29yZCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gcGFyc2VkICYmIGZpbGVWYWx1ZVdpbnMoa2V5KSkpIHtcbiAgICAgIHJlZmVyZW5jZUVudltrZXldID0gdmFsdWUucmVwbGFjZUFsbCgnJCcsIFN0cmluZy5yYXdgXFwkYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQsIHByb2Nlc3NFbnY6IHJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gcGFyc2VkO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzIHJldHVybnMgYSBwcm9jZXNzLmVudi1zaGFkb3dlZCBrZXkgb25seSB3aGVuIHRoZSBmb3JjZWRcbiAgICAvLyBwcm9maWxlIG92ZXJyaWRlcyBpdCwgc28gZm5veC1wcm92aWRlZCBrZXlzIGNvdW50IGFzIG1vZGUtc3BlY2lmaWMgaGVyZS5cbiAgICBpZiAoIShrZXkgaW4gbW9kZVZhcnMgfHwga2V5IGluIGZub3hWYXJzKSB8fCBwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkgY29udGludWU7XG5cbiAgICBpZiAobW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nOiAke2tleX0gaW4gdGhlIFwiJHttb2RlfVwiIG1vZGUncyBlbnYgc291cmNlcyBvdmVycmlkZXMgdGhlIHZhbHVlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgYmVjYXVzZSBXQl9FTlYgaXMgZXhwbGljaXRseSBzZXQuYFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gT24gQ0ksIGluaGVyaXRlZCB2YXJpYWJsZXMgaW50ZW50aW9uYWxseSB3aW4gKHdvcmtmbG93cyBkZWxpYmVyYXRlbHkgaW5qZWN0IGVudiB2YXJzIHRoYXRcbiAgICAvLyBvdmVycmlkZSB0aGUgY29tbWl0dGVkIGZpbGVzKTsgdGhpcyBpcyB0aGUgZGVzaWduZWQgYmVoYXZpb3IsIHNvIG5vIHdhcm5pbmcgaXMgZW1pdHRlZC5cbiAgfVxuICAvLyBWYWxpZGF0ZSBvbmx5IEFGVEVSIGFwcGx5aW5nIHRoZSBzb3VyY2VzLCBzbyBhIFdCX1NLSVBfRU5WX0NIRUNLIGRlZmluZWQgaW4gYW4gZW52IEZJTEUgaXNcbiAgLy8gaG9ub3JlZDogYm90aCB0aGUgY2FwdHVyZWQgZXhwb3J0ZWQgbW9kZSAoaXQgc2VsZWN0ZWQgdGhlIGNhc2NhZGUpIGFuZCB0aGUgRklOQUwgdmFsdWUgdGhlXG4gIC8vIGNoaWxkIHdpbGwgc2VlIOKAlCB0aGUgZW52IHNvdXJjZXMgbWF5IGRlZmluZSBhIGJyb2tlbiBXQl9FTlYgKGUuZy4gYC5lbnZgIHdpdGhcbiAgLy8gYFdCX0VOVj1wcm9kY3V0aW9uYCksIGFuZCBhIGZvcmNlZCBtb2RlJ3MgZmlsZXMgbWF5IGV2ZW4gb3ZlcnJpZGUgYSBWQUxJRCBleHBvcnRlZCB2YWx1ZS5cbiAgdmFsaWRhdGVTdGFuZGFyZFdiRW52KG1vZGUsICd0aGUgZXhwb3J0ZWQgdmFyaWFibGUnKTtcbiAgdmFsaWRhdGVTdGFuZGFyZFdiRW52KHByb2Nlc3MuZW52LldCX0VOViwgJ3RoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZScpO1xuICAvLyBUaGUgc2VsZWN0ZWQgZW52aXJvbm1lbnQgaXMgd2hhdCBhbiBlbnYgc291cmNlIHNpbGVudGx5IHJlc29sdmluZyBXQl9FTlYgdG8gYSBESUZGRVJFTlQgdmFsdWUgbXVzdFxuICAvLyBhZ3JlZSB3aXRoLCBlbHNlIHRoZSBjaGlsZCBydW5zIGxhYmVsZWQgb25lIGVudmlyb25tZW50IHdoaWxlIGNhcnJ5aW5nIGFub3RoZXIncyBzZWNyZXRzLiBUaGVcbiAgLy8gZXhwZWN0YXRpb24gaXMgYGZub3hDYXNjYWRlYCBvbmx5IHdoZW4gYSBmbm94IGNvbmZpZyBwYXJ0aWNpcGF0ZXMgKGl0cyBwcm9maWxlIHByb3ZpZGVzIFdCX0VOViBpbiBhXG4gIC8vIGNvbXBsaWFudCByZXBvKTsgaW4gYSBsZWdhY3kgYC5lbnZgLW9ubHkgcHJvamVjdCBGTk9YX1BST0ZJTEUgaXMgaXJyZWxldmFudCwgc28gdGhlIGV4cGVjdGF0aW9uIGlzXG4gIC8vIGBlbnZDYXNjYWRlYC4gVGhpcyBjb3ZlcnMgYm90aCBhIGZvcmNlZCBgLmVudi5wcm9kdWN0aW9uYCBjb250YWluaW5nIGBXQl9FTlY9ZGV2ZWxvcG1lbnRgIGFuZCB0aGVcbiAgLy8gZGVmYXVsdC1kZXZlbG9wbWVudCBwYXRoIChgLmVudi5kZXZlbG9wbWVudGAsIHJlYWQgZXZlbiB3aGVuIFdCX0VOViBpcyB1bnNldCwgY29udGFpbmluZ1xuICAvLyBgV0JfRU5WPXByb2R1Y3Rpb25gKSwgY29tcGFyaW5nIGFnYWluc3QgdGhlIHNlbGVjdGVkIGNhc2NhZGUgcmF0aGVyIHRoYW4ganVzdCB0aGUgZm9yY2VkIGBtb2RlYC5cbiAgLy8gT25seSBhIFNUQU5EQVJEIGNhc2NhZGUgaXMgZW5mb3JjZWQgKG1pcnJvcmluZyBQcm9qZWN0LmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudik6IGEgY3VzdG9tIHN1ZmZpeFxuICAvLyBzdWNoIGFzIGBOT0RFX0VOVj1xYWAgbGVnaXRpbWF0ZWx5IHNlbGVjdHMgYC5lbnYucWFgIHdoaWxlIFdCX0VOViBzdGF5cyBhIHN0YW5kYXJkIG1vZGUuXG4gIGNvbnN0IGV4cGVjdGVkQ2FzY2FkZSA9IGhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZCkgPyBmbm94Q2FzY2FkZSA6IGVudkNhc2NhZGU7XG4gIGlmIChcbiAgICBwcm9jZXNzLmVudi5XQl9FTlYgJiZcbiAgICBbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10uaW5jbHVkZXMoZXhwZWN0ZWRDYXNjYWRlKSAmJlxuICAgIHByb2Nlc3MuZW52LldCX0VOViAhPT0gZXhwZWN0ZWRDYXNjYWRlICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgIT09ICcxJyAmJlxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLICE9PSAndHJ1ZSdcbiAgKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBXQl9FTlYgcmVzb2x2ZXMgdG8gXCIke3Byb2Nlc3MuZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke2V4cGVjdGVkQ2FzY2FkZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICBgRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgZW52IHNvdXJjZXMsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgRklMRV9TQ0hFTUEsIGdldEZpbGVEYXRhYmFzZVVybFBhdGggfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuLyoqIFdoZXJlIHRoZSBQcmlzbWEgU1FMaXRlIGRhdGFiYXNlIGlzIG1vdW50ZWQsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS4gKi9cbmNvbnN0IGRhdGFiYXNlRGlyUGF0aCA9ICdwcmlzbWEvbW91bnQnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5jb25zdCBQT1NTSUJMRV9QUklTTUFfUEFUSFMgPSBbXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG5dO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0oXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGRhdGFiYXNlRGlyUGF0aDtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBnZW5lcmF0ZShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gWydQUklTTUEgZ2VuZXJhdGUnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBkYXRhYmFzZURpclBhdGg7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgbHMgLWFobCAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGRhdGFiYXNlRGlyUGF0aDtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfSAmJiAke3RoaXMuZ2VuZXJhdGUocHJvamVjdCl9ICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGRhdGFiYXNlRGlyUGF0aDtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uc2VlZCkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgICAgIGlmIChiYXNlRGlyKSB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIsIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8gJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnUGF0aCkgcmV0dXJuIGAtY29uZmlnIFwiJHtjb25maWdQYXRofVwiYDtcblxuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgUFJJU01BIGRiIGV4ZWN1dGUgLS1zdGRpbiAtLXVybCBcIiR7RklMRV9TQ0hFTUF9JHtkYlBhdGh9XCI7IGZpICYmIHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSpgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhd0RiUGF0aCA9IGdldEZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghcmF3RGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShyYXdEYlBhdGgpXG4gICAgPyByYXdEYlBhdGhcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIgPz8gJy4nLCByYXdEYlBhdGgpO1xuXG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERyaXp6bGVDb25maWcsIHdyYXBXaXRoRHJpenpsZUNvbmZpZ0RpciB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGdlbkNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZ2VuLWNvZGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIGNvZGUgZm9yIHRoZSBjdXJyZW50IHByb2plY3QnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbkNvZGVUYXJnZXRzID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAgIC5tYXAoKHByb2plY3QpID0+ICh7IHByb2plY3QsIHNjcmlwdHM6IGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3QpIH0pKVxuICAgICAgLmZpbHRlcigoeyBzY3JpcHRzIH0pID0+IHNjcmlwdHMubGVuZ3RoID4gMCk7XG4gICAgaWYgKGdlbkNvZGVUYXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdObyBjb2RlIGdlbmVyYXRpb24gbmVlZGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QsIHNjcmlwdHMgfSBvZiBnZW5Db2RlVGFyZ2V0cykge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiZ2VuLWNvZGVcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgLy8gRmlyc3Q6IGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCBpcyBnaXRpZ25vcmVkLCBzbyBvbiBhIGZyZXNoIGNoZWNrb3V0IGl0IGRvZXMgbm90IGV4aXN0IHlldCxcbiAgLy8gYW5kIHRoZSBnZW5lcmF0b3JzIGJlbG93IHR5cGUtY2hlY2sgYWdhaW5zdCB0aGUgQ2xvdWRmbGFyZSBgRW52YCBpdCBkZWNsYXJlcy5cbiAgY29uc3Qgd3JhbmdsZXJUeXBlc1NjcmlwdCA9IGdldFdyYW5nbGVyVHlwZXNTY3JpcHQocHJvamVjdCk7XG4gIGlmICh3cmFuZ2xlclR5cGVzU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKHdyYW5nbGVyVHlwZXNTY3JpcHQpO1xuICB9XG4gIGNvbnN0IHByaXNtYUdlbmVyYXRlU2NyaXB0ID0gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdCk7XG4gIGlmIChwcmlzbWFHZW5lcmF0ZVNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChwcmlzbWFHZW5lcmF0ZVNjcmlwdCk7XG4gIH1cbiAgY29uc3QgY2hha3JhVHlwZWdlblNjcmlwdCA9IGdldENoYWtyYVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKGNoYWtyYVR5cGVnZW5TY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goY2hha3JhVHlwZWdlblNjcmlwdCk7XG4gIH1cbiAgY29uc3QgZHJpenpsZUNoZWNrU2NyaXB0ID0gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3QpO1xuICBpZiAoZHJpenpsZUNoZWNrU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGRyaXp6bGVDaGVja1NjcmlwdCk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzU2NyaXB0ID0gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3QpO1xuICBpZiAoZ2VuSTE4blRzU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGdlbkkxOG5Uc1NjcmlwdCk7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbi8qKlxuICogYFlBUk4gd3JhbmdsZXJgIHJhdGhlciB0aGFuIGBidW54IHdyYW5nbGVyYDogd3JhbmdsZXIgbmVlZHMgcmVhbCBOb2RlLmpzLCBhbmQgYGJ1bnhgIG1heSByZXNvbHZlXG4gKiBhIHZlcnNpb24gb3RoZXIgdGhhbiB0aGUgbG9ja2ZpbGUncy4gRmxhZ3MgYXJlIGRlbGliZXJhdGVseSBvbWl0dGVkIOKAlCBgLS1lbnYtZmlsZWAgaXMgYSBsZWdhY3lcbiAqIGAuZW52YCBpZGlvbSB0aGF0IGZub3ggcmVwb3NpdG9yaWVzIGhhdmUgbm8gZmlsZSBmb3IsIGFuZCBgLS1zdHJpY3QtdmFyc2AgaXMgYSBwZXItcmVwb3NpdG9yeVxuICogdHlwZS1zdHJpY3RuZXNzIGNob2ljZSB0aGF0IGJlbG9uZ3MgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZywgbm90IGluIGV2ZXJ5IGNhbGxlci5cbiAqL1xuZnVuY3Rpb24gZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0LmdlbmVyYXRlc1dvcmtlclR5cGVzKSByZXR1cm47XG4gIHJldHVybiAnWUFSTiB3cmFuZ2xlciB0eXBlcyc7XG59XG5cbmZ1bmN0aW9uIGdldEdlbkkxOG5Uc1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSB7XG4gICAgaWYgKCFwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHJldHVybjtcbiAgICByZXR1cm4gJ1lBUk4gcnVuIGdlbi1pMThuLXRzJztcbiAgfVxuICBpZiAoXG4gICAgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdnZW4taTE4bi10cycpICYmXG4gICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnaTE4bicpKVxuICApIHtcbiAgICByZXR1cm4gJ1lBUk4gZ2VuLWkxOG4tdHMgLWkgaTE4biAtbyBzcmMvX19nZW5lcmF0ZWRfXy9pMThuLnRzIC1kIGphLUpQJztcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUdlbmVyYXRlU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzUHJpc21hKSByZXR1cm47XG4gIGlmICghaGFzUHJpc21hU2NoZW1hKHByb2plY3QpKSByZXR1cm47XG4gIHJldHVybiBwcmlzbWFTY3JpcHRzLmdlbmVyYXRlKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBnZXRDaGFrcmFTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdAY2hha3JhLXVpL2NsaScpKSByZXR1cm47XG4gIGlmICghZmlsZUV4aXN0cyhwcm9qZWN0LCAnc3JjL3RoZW1lLnRzJykpIHJldHVybjtcbiAgcmV0dXJuICdZQVJOIGNoYWtyYSB0eXBlZ2VuIHNyYy90aGVtZS50cyAtLXN0cmljdCc7XG59XG5cbmZ1bmN0aW9uIGdldERyaXp6bGVDaGVja1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc0RyaXp6bGUpIHJldHVybjtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIGlmICghY29uZmlnKSByZXR1cm47XG4gIC8vIEtlZXAgdGhlIGV4cGxpY2l0IC0tY29uZmlnIGJlY2F1c2UgZHJpenpsZS1raXQncyBkZWZhdWx0IGxvb2t1cCBtaXNzZXMgc29tZSBleHRlbnNpb25zIChlLmcuIC5tdHMpLlxuICByZXR1cm4gYCR7d3JhcFdpdGhEcml6emxlQ29uZmlnRGlyKHByb2plY3QsIGBZQVJOIGRyaXp6bGUta2l0IGNoZWNrIC0tY29uZmlnICR7Y29uZmlnLmZpbGVOYW1lfWApfSB8fCB0cnVlYDtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGhhc1ByaXNtYVNjaGVtYShwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ3ByaXNtYS9zY2hlbWEucHJpc21hJywgJ3ByaXNtYS9zY2hlbWEnLCAnZGIvc2NoZW1hLnByaXNtYSddLnNvbWUoKGZpbGVQYXRoKSA9PlxuICAgIGZpbGVFeGlzdHMocHJvamVjdCwgZmlsZVBhdGgpXG4gICk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAna2lsbC1wb3J0LWlmLW5vbi1jaScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBub24tQ0kuJyxcbiAgYnVpbGRlcjoga2lsbFBvcnRJZk5vbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQga2lsbFBvcnRJZk5vbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0SWZOb25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXAga2lsbGluZyBwb3J0IGR1ZSB0byBDSTogJHtwcm9qZWN0LmVudi5DSX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3J0RW52ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPD0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBLaWxsaW5nIHRoZSBwb3J0OiAke3BvcnR9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBwcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZSwgb3V0cHV0KSkgcmV0dXJuO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPdXRwdXQgPSBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQpO1xuICBpZiAobm9ybWFsaXplZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG5vcm1hbGl6ZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZXhpdENvZGUgIT09IDAgfHwgaGFzV2FybmluZ091dHB1dChvdXRwdXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3V0cHV0LnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzV2FybmluZ091dHB1dChvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndhcm4oPzppbmcpP3M/XFxiL2kudGVzdChvdXRwdXQucmVwbGFjZUFsbCgvXFxiKD86MHxubykgd2FybmluZ3M/XFxiL2dpLCAnJykpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgQnVmZmVyZWRSdW5SZXN1bHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTY3JpcHQsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmludEJ1ZmZlcmVkT3V0cHV0LCBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0IH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgcXVpZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcG9ydCBlcnJvcnMgb25seScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ByaW50IG9ubHkgZmFpbGVkIG9yIHdhcm5pbmcgY29tbWFuZCBvdXRwdXQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPFxuICB0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlclxuPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYge1xuICAnLS0nPzogdW5rbm93bltdO1xuICBfOiB1bmtub3duW107XG4gIHByaW50QWxsT3V0cHV0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG94bGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddKTtcbmNvbnN0IHB5dGhvbkV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncHknXSk7XG5jb25zdCBkYXJ0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydkYXJ0J10pO1xuY29uc3QgcnVzdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncnMnXSk7XG5jb25zdCBveGZtdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgLi4ub3hsaW50RXh0ZW5zaW9ucyxcbiAgJ2NzcycsXG4gICdncWwnLFxuICAnZ3JhcGhxbCcsXG4gICdoYnMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdsZXNzJyxcbiAgJ21kJyxcbiAgJ21keCcsXG4gICdzY3NzJyxcbiAgJ3RvbWwnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjc3MnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2phdmEnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIW94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuY29uc3QgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiA9ICchKiovdGVzdHstLC99Zml4dHVyZXMvKionO1xuXG50eXBlIEJ1ZmZlcmVkTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkUnVuUmVzdWx0ICYgeyBjb21tYW5kOiBzdHJpbmc7IGN3ZDogc3RyaW5nIH07XG50eXBlIExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgfCB7IGV4aXRDb2RlOiBudW1iZXIgfTtcbmludGVyZmFjZSBMaW50UnVuQ29tbWFuZCB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgcHJvamVjdDogUHJvamVjdDtcbn1cblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIExpbnRDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgbGludChhcmd2IGFzIExpbnRDb21tYW5kQXJndik7XG4gICAgaWYgKGV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbnQoYXJndjogTGludENvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndik7XG4gIGNvbnN0IGxpbnRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IGRhcnRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICAvLyBgY2FyZ28gZm10IC0tYWxsYCBhbHdheXMgZm9ybWF0cyB0aGUgd2hvbGUgd29ya3NwYWNlLCBzbyB3ZSB0cmFjayB0YXJnZXRcbiAgLy8gcHJvamVjdHMgcmF0aGVyIHRoYW4gaW5kaXZpZHVhbCBmaWxlIHBhdGhzLiBFdmVyeSBwcm9qZWN0IHdpdGggaXRzIG93blxuICAvLyBgQ2FyZ28udG9tbGAgcnVucyBpdHMgb3duIGBjYXJnbyBmbXQgLS1hbGxgOyB3ZSBpbnRlbnRpb25hbGx5IGRvIG5vdCBkZWR1cFxuICAvLyBieSBkaXJlY3RvcnkuIEEgbmVzdGVkIG9yIHNpYmxpbmcgY3JhdGUgY2FuIGJlIGFuIGluZGVwZW5kZW50IENhcmdvXG4gIC8vIHdvcmtzcGFjZSB0aGF0IGEgcGFyZW50J3MgYGNhcmdvIGZtdCAtLWFsbGAgbmV2ZXIgcmVhY2hlcywgc28gc2tpcHBpbmcgaXRcbiAgLy8gd291bGQgbGVhdmUgaXQgdW5mb3JtYXR0ZWQsIHdoaWxlIGFueSBnZW51aW5lbHkgb3ZlcmxhcHBpbmcgcnVucyBhcmVcbiAgLy8gaGFybWxlc3MgYmVjYXVzZSBydXN0Zm10IGlzIGRldGVybWluaXN0aWMgYW5kIGlkZW1wb3RlbnQuIERlZHVwaW5nIGJ5IHJlYWxcbiAgLy8gd29ya3NwYWNlIG1lbWJlcnNoaXAgd291bGQgcmVxdWlyZSBpbnZva2luZyBgY2FyZ28gbG9jYXRlLXByb2plY3RgLlxuICBjb25zdCBjYXJnb0Zvcm1hdFByb2plY3RzID0gbmV3IFNldDxQcm9qZWN0PigpO1xuICBjb25zdCBwcmV0dGllckZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzID0gZmFsc2U7XG4gIGxldCBwcmV0dGllckFyZ3M6IHN0cmluZ1tdO1xuICBsZXQgc29ydFBhY2thZ2VKc29uQXJnczogc3RyaW5nW107XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbGludFRhcmdldHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbGVzLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlKTtcbiAgICAgICAgY29uc3QgZmlsZUtpbmQgPSBhd2FpdCBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm4geyBmaWxlS2luZCwgZmlsZVBhdGggfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHsgZmlsZUtpbmQsIGZpbGVQYXRoIH0gb2YgbGludFRhcmdldHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaCguLi5nZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHsgbGludFBhdGgsIHByb2plY3QgfSBvZiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2sgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGNvbnN0IHB5dGhvbkZpbGVQYXRocyA9IHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgcHl0aG9uRmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGNvbnN0IGRhcnRGaWxlUGF0aHMgPSBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGRhcnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0NhcmdvVG9tbCAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHJ1c3RFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGNhcmdvRm9ybWF0UHJvamVjdHMuYWRkKHByb2plY3QpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3QsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBjb25zdCBsaW50RmlsZVBhdGhzID0gbGludEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgbGludEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgICAgICAgIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2goYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGxpbnRQYXRoKSwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZvcm1hdHRlclBhdGggb2YgYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MocHJvamVjdCwgbGludFBhdGgsIGZpbGVLaW5kLCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFyZ3YuZm9ybWF0ICYmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10ICYmIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1BvdGVudGlhbExpbnRUYXJnZXQoZXh0ZW5zaW9uKSAmJiAhcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTm8gbGludGVyIGZvdW5kIGZvciAke3Byb2plY3QubmFtZX0uIEluc3RhbGwgT3hsaW50LmApKTtcbiAgICAgICAgICBtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcmV0dGllckFyZ3MgPSBbLi4ubmV3IFNldChwcmV0dGllckZpbGVQYXRocyldO1xuICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBbLi4ubmV3IFNldChwYWNrYWdlSnNvbkZpbGVQYXRocyldO1xuICB9IGVsc2Uge1xuICAgIHByZXR0aWVyQXJncyA9IGJ1aWxkUHJldHRpZXJBcmdzKHByb2plY3RzLnNlbGYuZGlyUGF0aCwgcHJvamVjdHMuZGVzY2VuZGFudHMpO1xuICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IHAucGFja2FnZUpzb25QYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdHRlckNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdID0gW107XG4gIGNvbnN0IGxpbnRlckNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdID0gW107XG4gIGNvbnN0IGxpbnRSdW5PcHRpb25zID0geyBleGl0SWZGYWlsZWQ6IGZhbHNlLCBwcmVzZXJ2ZUNvbG9yOiAhYXJndi5wcmludEFsbE91dHB1dCB9IGFzIGNvbnN0O1xuICBjb25zdCBzaG91bGRSdW5Gb3JtYXR0ZXJzID0gQm9vbGVhbihhcmd2LmZvcm1hdCk7XG4gIGNvbnN0IHNob3VsZFJ1bkxpbnRlcnMgPSAhYXJndi5mb3JtYXQgfHwgYXJndi5maXg7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGxpbnRGaWxlUGF0aHNdIG9mIGxpbnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICBpZiAoIWxpbnRDb21tYW5kKSBjb250aW51ZTtcblxuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIHB5dGhvbkZpbGVQYXRoc10gb2YgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2LCBweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzXSBvZiBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBjYXJnb0Zvcm1hdFByb2plY3RzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgb3hmbXRGaWxlUGF0aHNdIG9mIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGlmIChsaW50Q29tbWFuZCkgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3YpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0NhcmdvVG9tbCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkQ2FyZ29Gb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGxpbnRFeGl0Q29kZXM6IG51bWJlcltdID0gW107XG5cbiAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICBjb25zdCBmb3JtYXR0ZXJSZXN1bHRzID0gYXdhaXQgcnVuTGludENvbW1hbmRzKGZvcm1hdHRlckNvbW1hbmRzLCBhcmd2LCBsaW50UnVuT3B0aW9ucyk7XG4gICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhmb3JtYXR0ZXJSZXN1bHRzLCBhcmd2KTtcbiAgICBsaW50RXhpdENvZGVzLnB1c2goLi4uZm9ybWF0dGVyUmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LmV4aXRDb2RlKSk7XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAobWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcykge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICBpZiAocHJldHRpZXJBcmdzLmxlbmd0aCA+IDAgJiYgcHJvamVjdHMuc2VsZi5oYXNQcmV0dGllcikge1xuICAgICAgY29uc3QgcHJldHRpZXJSZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAgICdZQVJOJyxcbiAgICAgICAgICAncHJldHRpZXInLFxuICAgICAgICAgICctLWNhY2hlJyxcbiAgICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICctLScsXG4gICAgICAgICAgLi4ucHJldHRpZXJBcmdzLFxuICAgICAgICBdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtwcmV0dGllclJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHByZXR0aWVyUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG4gICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydFBhY2thZ2VKc29uUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtzb3J0UGFja2FnZUpzb25SZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChzb3J0UGFja2FnZUpzb25SZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgY29uc3QgbGludGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhsaW50ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMobGludGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmxpbnRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuICB9XG5cbiAgcmV0dXJuIGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZHMoXG4gIGNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdLFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHRbXT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoY29tbWFuZHMubWFwKCh7IGNvbW1hbmQsIHByb2plY3QgfSkgPT4gcnVuTGludENvbW1hbmQoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykpKTtcbn1cblxuZnVuY3Rpb24gcnVuTGludENvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogTGludENvbW1hbmRBcmd2LFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd25JblBhcmFsbGVsPlszXVxuKTogUHJvbWlzZTxMaW50UnVuUmVzdWx0PiB7XG4gIGlmIChhcmd2LnNpbGVudCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChyZXN1bHQpID0+ICh7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICBjb21tYW5kOiBub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSxcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChleGl0Q29kZSkgPT4gKHsgZXhpdENvZGUgfSkpO1xufVxuXG5mdW5jdGlvbiBwcmludFNpbGVudExpbnRPdXRwdXRzKFxuICByZXN1bHRzOiBMaW50UnVuUmVzdWx0W10sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAncHJpbnRBbGxPdXRwdXQnIHwgJ3NpbGVudCc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcHJpbnRhYmxlUmVzdWx0cyA9XG4gICAgYXJndi5zaWxlbnQgJiYgIWFyZ3YucHJpbnRBbGxPdXRwdXRcbiAgICAgID8gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4gJ291dHB1dCcgaW4gcmVzdWx0ICYmIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQocmVzdWx0LmV4aXRDb2RlLCByZXN1bHQub3V0cHV0KSlcbiAgICAgIDogcmVzdWx0cztcbiAgaWYgKHByaW50YWJsZVJlc3VsdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcHJpbnRhYmxlUmVzdWx0cykge1xuICAgIGlmICghKCdvdXRwdXQnIGluIHJlc3VsdCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGFyZ3YucHJpbnRBbGxPdXRwdXQpIHtcbiAgICAgIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJndi5zaWxlbnQpIHtcbiAgICAgICAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcbiAgICAgIH1cbiAgICAgIHByaW50QnVmZmVyZWRPdXRwdXQocmVzdWx0LmV4aXRDb2RlLCByZXN1bHQub3V0cHV0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdDogQnVmZmVyZWRMaW50UnVuUmVzdWx0KTogdm9pZCB7XG4gIHByaW50Q29tbWFuZEhlYWRlcihyZXN1bHQuY29tbWFuZCwgcmVzdWx0LmN3ZCk7XG5cbiAgaWYgKHJlc3VsdC5leGl0Q29kZSA9PT0gMCAmJiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQocmVzdWx0LmNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXQudHJpbSgpO1xuICBpZiAob3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kSGVhZGVyKGNvbW1hbmQ6IHN0cmluZywgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdDb21tYW5kOicpLCBjb21tYW5kKSArIGNoYWxrLmdyYXkoYCBhdCAke2N3ZH1gKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJyBveGZtdCAnKSB8fCBjb21tYW5kLmluY2x1ZGVzKCcgc29ydC1wYWNrYWdlLWpzb24gJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc1R5cGVBd2FyZU94bGludCc+LFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ294bGludCcsXG4gICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAvLyBUeXBlLWF3YXJlIG1vZGUgbWFrZXMgb3hsaW50IHJlcG9ydCB0eXBlLWNoZWNrIGRpYWdub3N0aWNzLiBQYXNzIHRoZSBmbGFncyBleHBsaWNpdGx5XG4gICAgICAvLyBiZWNhdXNlIG94bGludCByZWplY3RzIHRoZSBlcXVpdmFsZW50IG9wdGlvbnMgaW4gbm9uLXJvb3QgY29uZmlncywgc28gcGVyLXBhY2thZ2UgcnVuc1xuICAgICAgLy8gaW4gbW9ub3JlcG9zIHdvdWxkIG90aGVyd2lzZSBtaXNzIHR5cGUgZXJyb3JzLlxuICAgICAgLi4uKHByb2plY3QuaGFzVHlwZUF3YXJlT3hsaW50ID8gWyctLXR5cGUtYXdhcmUnLCAnLS10eXBlLWNoZWNrJ10gOiBbXSksXG4gICAgICAuLi4oYXJndi5xdWlldCA/IFsnLS1xdWlldCddIDogW10pLFxuICAgICAgLi4uKGFyZ3YuZml4ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICBdKTtcbiAgfVxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE94Zm10Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAnWUFSTicsXG4gICAgJ294Zm10JyxcbiAgICAnLS13cml0ZScsXG4gICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgJyEqKi9wYWNrYWdlLmpzb24nLFxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gW1xuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdpc29ydCcsICctLXByb2ZpbGUnLCAnYmxhY2snLCAnLS1maWx0ZXItZmlsZXMnLCAuLi50YXJnZXRzXSksXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2JsYWNrJywgLi4udGFyZ2V0c10pLFxuICBdLmpvaW4oJyAmJiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndjogUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LCBmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50YXJnZXRzXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpOiBzdHJpbmcge1xuICAvLyBGb3JtYXR0aW5nIG11c3QgZ28gdGhyb3VnaCBjYXJnbyAobm90IHJ1c3RmbXQgb24gaW5kaXZpZHVhbCBmaWxlcykgc28gZWFjaFxuICAvLyBjcmF0ZSdzIGVkaXRpb24gYW5kIHJ1c3RmbXQgY29uZmlndXJhdGlvbiBhcmUgcmVzcGVjdGVkOyBgLS1hbGxgIGNvdmVyc1xuICAvLyBldmVyeSB3b3Jrc3BhY2UgbWVtYmVyIGFuZCBpcyBhIG5vLW9wIHN1ZmZpeCBmb3Igc2luZ2xlLWNyYXRlIHByb2plY3RzLlxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydjYXJnbycsICdmbXQnLCAnLS1hbGwnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnZm9ybWF0JywgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0TGludENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdhbmFseXplJywgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcmV0dGllckFyZ3MoXG4gIHNlbGZEaXJQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz5bXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzID0gbmV3IFNldDxzdHJpbmc+KFtgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmICghbmVlZHNQcmV0dGllcihwcm9qZWN0KSkgY29udGludWU7XG5cbiAgICBjb25zdCBwcm9qZWN0UGF0dGVybiA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKTtcbiAgICBhcmdzLmFkZChwYXRoLnJlbGF0aXZlKHNlbGZEaXJQYXRoLCBwcm9qZWN0UGF0dGVybikgfHwgcHJvamVjdFBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBbLi4uYXJnc107XG59XG5cbmZ1bmN0aW9uIGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG93bmluZ1Byb2plY3Q6IFByb2plY3QgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmIChcbiAgICAgIChmaWxlUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7cHJvamVjdC5kaXJQYXRofS9gKSkgJiZcbiAgICAgICghb3duaW5nUHJvamVjdCB8fCBwcm9qZWN0LmRpclBhdGgubGVuZ3RoID4gb3duaW5nUHJvamVjdC5kaXJQYXRoLmxlbmd0aClcbiAgICApIHtcbiAgICAgIG93bmluZ1Byb2plY3QgPSBwcm9qZWN0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3duaW5nUHJvamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlcyhhcmd2OiBQaWNrPExpbnRDb21tYW5kQXJndiwgJy0tJyB8ICdfJyB8ICdmaWxlcyc+KTogc3RyaW5nW10ge1xuICBjb25zdCBsaW50VGFyZ2V0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFsuLi4oYXJndi5maWxlcyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXSkge1xuICAgIGxpbnRUYXJnZXRzLmFkZChTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gWy4uLmxpbnRUYXJnZXRzXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwnZGlyZWN0b3J5JyB8ICdvdGhlcic+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gJ2RpcmVjdG9yeSc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE1pc3NpbmcgcGF0aHMgYXJlIGhhbmRsZWQgYnkgdGhlIGRvd25zdHJlYW0gdG9vbHMuXG4gIH1cblxuICByZXR1cm4gJ290aGVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0Lmhhc094Zm10KSByZXR1cm4gb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICBpZiAobmVlZHNQcmV0dGllcihwcm9qZWN0KSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBwcmV0dGllck9ubHlFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBuZWVkc1ByZXR0aWVyKHByb2plY3QpKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl07XG4gIH1cbiAgaWYgKHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4oZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oZmlsZVBhdGgsIGAqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb25QYXRoJz5bXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSByZXR1cm4gW107XG4gIHJldHVybiBwcm9qZWN0c1xuICAgIC5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT5cbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGggPT09IHBhdGguam9pbihmaWxlUGF0aCwgJ3BhY2thZ2UuanNvbicpIHx8XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKVxuICAgIC5tYXAoKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb25QYXRoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0TGludFRhcmdldHMoXG4gIHByb2plY3RzOiBQcm9qZWN0W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHsgbGludFBhdGg6IHN0cmluZzsgcHJvamVjdDogUHJvamVjdCB9W10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgY29uc3QgZGVzY2VuZGFudFByb2plY3RzID0gcHJvamVjdHMuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+IHByb2plY3QuZGlyUGF0aCA9PT0gZmlsZVBhdGggfHwgcHJvamVjdC5kaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKTtcbiAgICBpZiAoZGVzY2VuZGFudFByb2plY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkZXNjZW5kYW50UHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiAoeyBsaW50UGF0aDogcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0IH0pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHMsIGZpbGVQYXRoKTtcbiAgcmV0dXJuIHByb2plY3QgPyBbeyBsaW50UGF0aDogZmlsZVBhdGgsIHByb2plY3QgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPiwgZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50JykgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNQcmV0dGllcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFwcm9qZWN0Lmhhc094Zm10ICYmIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jztcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBDaGVja3MgdGhlIGdpdmVuIHBvcnQgYW5kIGtpbGxzIGFueSBwcm9jZXNzIHVzaW5nIGl0LlxuICogTm90ZSB3YiBhbHdheXMgcmVxdWlyZXMgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHJhd1BvcnQ6IHVua25vd24sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHJhd1BvcnQpO1xuICBpZiAoIXBvcnQpIHRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIHBvcnQgKCR7cG9ydH0pIGlzIGludmFsaWQuYCk7XG5cbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydCwgcHJvamVjdCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBvcnQgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gY2hlY2tcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHBvcnQgaXMgYXZhaWxhYmxlLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzUG9ydEF2YWlsYWJsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQ2hlY2sgYm90aCBzdGFja3MgdG8gY2F0Y2ggcHJvY2Vzc2VzIGJvdW5kIG9ubHkgb24gSVB2NiBvciBJUHY0LlxuICBmb3IgKGNvbnN0IGhvc3Qgb2YgWycxMjcuMC4wLjEnLCAnOjonXSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IHByb2JlUG9ydChob3N0LCBwb3J0KTtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9iZVBvcnQoaG9zdDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUZOT1NVUFBPUlQnKSB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jLCBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcbmNvbnN0IHN0YWxlUHJvY2Vzc1BvbGxJbnRlcnZhbE1zID0gMTAwO1xuY29uc3Qgc3RhbGVQcm9jZXNzTWF4UG9sbHMgPSAxMDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQsIHByb2plY3QpO1xuICBraWxsTGlzdGVuaW5nUHJvY2Vzc2VzQnlQb3J0KHBvcnQpO1xufVxuXG5mdW5jdGlvbiBraWxsTGlzdGVuaW5nUHJvY2Vzc2VzQnlQb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHBpZCBvZiBsaXN0TGlzdGVuaW5nUHJvY2Vzc0lkcyhwb3J0KSkge1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwocGlkLCAnU0lHS0lMTCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0TGlzdGVuaW5nUHJvY2Vzc0lkcyhwb3J0OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gZXhlY0ZpbGVTeW5jKCdsc29mJywgWyctdGknLCBgdGNwOiR7cG9ydH1gLCAnLXNUQ1A6TElTVEVOJ10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gICAgcmV0dXJuIHN0ZG91dFxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHBpZCkgPT4gTnVtYmVyKHBpZC50cmltKCkpKVxuICAgICAgLmZpbHRlcigocGlkKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgJiYgcGlkID4gMCAmJiBwaWQgIT09IHByb2Nlc3MucGlkKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVTdGFsZVByb2Nlc3MocGlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFsZVByb2Nlc3NNYXhQb2xsczsgaSsrKSB7XG4gICAgYXdhaXQgc2V0VGltZW91dChzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyk7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VTUkNIJykgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzLCByZW1vdmVTdGFsZVByb2Nlc3MgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2RlbGF5LW1zJzoge1xuICAgIGRlZmF1bHQ6IDUwMDAsXG4gICAgZGVzY3JpYmU6ICdEZWxheSBiZWZvcmUgc3RhcnRpbmcgdGhlIG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xudHlwZSBNYWludGVuYW5jZUFyZ3YgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPiAmIHtcbiAgYWN0aW9uOiAnc3RhcnQnIHwgJ3N0b3AnO1xufTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMgPSA1O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMgPSAxMDA7XG5jb25zdCBtYXhUaW1lb3V0RGVsYXlNcyA9IDJfMTQ3XzQ4M182NDc7XG5jb25zdCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUgPSAnLndiJztcbmNvbnN0IG1haW50ZW5hbmNlSHRtbCA9IGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJqYVwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj5cbiAgICA8dGl0bGU+44Oh44Oz44OG44OK44Oz44K55LitPC90aXRsZT5cbiAgICA8c3R5bGU+XG4gICAgICBib2R5IHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgICAgY29sb3I6ICMxMTE4Mjc7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7XG4gICAgICB9XG5cbiAgICAgIG1haW4ge1xuICAgICAgICBwYWRkaW5nOiAyNHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOiAyOHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgICBtYXJnaW46IDAgMCAxNnB4O1xuICAgICAgfVxuXG4gICAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS44O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bWFpbj5cbiAgICAgIDxoMT7nj77lnKjjg6Hjg7Pjg4bjg4rjg7PjgrnkuK3jgafjgZk8L2gxPlxuICAgICAgPHA+55qG5qeY44Gr44Gv44GU5LiN5L6/44KS44GK44GL44GR44GX44G+44GZ44GM44CB44Oh44Oz44OG44OK44Oz44K557WC5LqG44G+44Gn44GX44Gw44KJ44GP44GK5b6F44Gh44GP44Gg44GV44GE44CCPC9wPlxuICAgIDwvbWFpbj5cbiAgPC9ib2R5PlxuPC9odG1sPmA7XG5cbmV4cG9ydCBjb25zdCBtYWludGVuYW5jZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTWFpbnRlbmFuY2VBcmd2PiA9IHtcbiAgY29tbWFuZDogJ21haW50ZW5hbmNlIDxhY3Rpb24+JyxcbiAgZGVzY3JpYmU6ICdTdGFydCBvciBzdG9wIGEgbGlnaHR3ZWlnaHQgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuIEV4YW1wbGU6IHdiIG1haW50ZW5hbmNlIHN0YXJ0JyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzXG4gICAgICAucG9zaXRpb25hbCgnYWN0aW9uJywge1xuICAgICAgICBjaG9pY2VzOiBbJ3N0YXJ0JywgJ3N0b3AnXSBhcyBjb25zdCxcbiAgICAgICAgZGVzY3JpYmU6ICdNYWludGVuYW5jZSBzZXJ2ZXIgYWN0aW9uJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcikgYXMgdW5rbm93biBhcyBBcmd2PE1haW50ZW5hbmNlQXJndj4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gYXJndi5hY3Rpb247XG4gICAgaWYgKHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2UgJHthY3Rpb259IGJlY2F1c2UgV0JfRU5WIGlzIHRlc3QuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChwcm9qZWN0LmVudi5QT1JUKTtcbiAgICBpZiAoYWN0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgICBhd2FpdCBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQsIGFyZ3YuZGVsYXlNcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICdzdG9wJykge1xuICAgICAgYXdhaXQgc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtYWludGVuYW5jZSBhY3Rpb246ICR7YWN0aW9ufWApO1xuICB9LFxufTtcblxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGFzc2VydC5vayhOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpICYmIHBvcnQgPiAwLCBgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlciwgZGVsYXlNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFzc2VydC5vayhcbiAgICBOdW1iZXIuaXNGaW5pdGUoZGVsYXlNcykgJiYgZGVsYXlNcyA+PSAwICYmIGRlbGF5TXMgPD0gbWF4VGltZW91dERlbGF5TXMsXG4gICAgYGRlbGF5LW1zIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke21heFRpbWVvdXREZWxheU1zfTogJHtkZWxheU1zfWBcbiAgKTtcblxuICBjb25zdCBwaWRGaWxlUGF0aCA9IGF3YWl0IHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwcm9jZXNzLnBpZCk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlU2lnbmFsSGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KGRlbGF5TXMsIHVuZGVmaW5lZCwgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0KTtcbiAgICBpZiAoIXNlcnZlcikgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBTdGFydGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgYXdhaXQgd2FpdEZvclNodXRkb3duKHNlcnZlcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGF3YWl0IGNsZWFudXAoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0OiBudW1iZXIpOiBQcm9taXNlPGh0dHAuU2VydmVyIHwgdW5kZWZpbmVkPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHNlcnZlciwgcG9ydCwgaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IpO1xuICAgICAgcmV0dXJuIHNlcnZlcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScgJiYgYXR0ZW1wdCA8IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlIHNlcnZlciBiZWNhdXNlIHBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQsIGVycik7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZSBtYWludGVuYW5jZSBzZXJ2ZXIgc3RhcnR1cCBzdGF0ZS4nKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydDogbnVtYmVyLCBlcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKTogbmV2ZXIge1xuICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICBjb25zb2xlLmluZm8oYFN0b3BwZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTogaHR0cC5TZXJ2ZXIge1xuICByZXR1cm4gaHR0cC5jcmVhdGVTZXJ2ZXIoKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDMsIHtcbiAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLXN0b3JlJyxcbiAgICAgICdjb250ZW50LXR5cGUnOiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyxcbiAgICB9KTtcbiAgICByZXNwb25zZS5lbmQobWFpbnRlbmFuY2VIdG1sKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKFxuICBzZXJ2ZXI6IGh0dHAuU2VydmVyLFxuICBwb3J0OiBudW1iZXIsXG4gIG9uUnVudGltZUVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uU3RhcnR1cEVycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTGlzdGVuaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgICBzZXJ2ZXIub24oJ2Vycm9yJywgb25SdW50aW1lRXJyb3IpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMC4wLjAuMCcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclNodXRkb3duKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzaHV0ZG93biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIGNsb3NlIG1haW50ZW5hbmNlIHNlcnZlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9O1xuICAgIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNlcnZlci5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VSUl9TRVJWRVJfTk9UX1JVTk5JTkcnKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLmNsb3NlQWxsQ29ubmVjdGlvbnMoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHBpZEZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShwaWRGaWxlUGF0aCwgYCR7cHJvY2Vzcy5waWR9XFxuYCwgJ3V0ZjgnKTtcbiAgcmV0dXJuIHBpZEZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICBpZiAocGlkICE9PSB1bmRlZmluZWQgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCkge1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwaWQsICdTSUdURVJNJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQpO1xuICB9XG4gIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcGlkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcsIGV4cGVjdGVkUGlkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleHBlY3RlZFBpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gICAgaWYgKHBpZCAhPT0gZXhwZWN0ZWRQaWQpIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy5ybShwaWRGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaWRUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUocGlkRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGlkID0gTnVtYmVyKHBpZFRleHQudHJpbSgpKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgPyBwaWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LnJvb3REaXJQYXRoLCBwb3J0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocm9vdERpclBhdGg6IHN0cmluZywgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihyb290RGlyUGF0aCwgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lLCBgbWFpbnRlbmFuY2UtJHtwb3J0fS5waWRgKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbi8qKlxuICogTWF0ZXJpYWxpemF0aW9uIG9mIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCByZWdpc3RyeSAoVmVyZGFjY2lvKSBkZXBlbmRlbmNpZXMgZm9yIERvY2tlciBidWlsZHM6XG4gKiB0aGUgcGFja2FnZXMgYXJlIGRvd25sb2FkZWQgb24gdGhlIGhvc3QgKGF1dGggdmlhIC5ucG1yYyAvIH4vLm5wbXJjIGxvY2FsbHksIG9yIFZFUkRBQ0NJT19UT0tFTlxuICogb24gQ0kpIGFuZCBleHRyYWN0ZWQgbmV4dCB0byB0aGUgcmVwb3NpdG9yeSBzbyBpbWFnZSBidWlsZHMgbmVlZCBubyByZWdpc3RyeSBjcmVkZW50aWFsc1xuICogKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlJztcblxuLy8gYGdpdDpgL2BnaXQrYC9gZ2l0QGAgKG5vdCB0aGUgYmFyZSB3b3JkIGBnaXRgKTogbnBtIGFsbG93cyBhcmJpdHJhcnkgZGlzdC10YWdzLCBzbyBhIHRhZyBuYW1lZFxuLy8gYGdpdGAgb3IgYGdpdC1uZXh0YCBtdXN0IHN0aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWdpc3RyeSBzcGVjaWZpZXIuXG5jb25zdCBub25SZWdpc3RyeVNwZWNpZmllclByZWZpeGVzID0gW1xuICAnZ2l0OicsXG4gICdnaXQrJyxcbiAgJ2dpdEAnLFxuICAnZmlsZTonLFxuICAnbGluazonLFxuICAnd29ya3NwYWNlOicsXG4gICdodHRwOicsXG4gICdodHRwczonLFxuICAncG9ydGFsOicsXG4gICdwYXRjaDonLFxuXTtcblxuLy8gVGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHdoaWNoIGdpdCBzcGVjaWZpZXJzIHRoZSBwcml2YXRlLXBhY2thZ2UgdG9vbGluZyBzdXBwb3J0czpcbi8vIGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCBtYXRlcmlhbGl6ZXMgZXhhY3RseSB0aGVzZSwgYW5kIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYCBtdXN0XG4vLyByZXdyaXRlIGV4YWN0bHkgdGhlc2UgKHJld3JpdGluZyBvdGhlciBvcmdzJyBTU0ggVVJMcyB3b3VsZCBwb2ludCBhdCBuZXZlci1tYXRlcmlhbGl6ZWQgcGF0aHMpLlxuY29uc3QgcHJpdmF0ZUdpdERlcGVuZGVuY3lQYXR0ZXJuID0gL15naXRAZ2l0aHViXFwuY29tOig/OldpbGxCb29zdGVyfFdpbGxCb29zdGVyTGFiKVxcL1teLyNdKyg/OlxcLmdpdCk/KD86Iy4qKT8kLztcblxuLy8gUmV0dXJucyBib29sZWFuIChub3QgYSBgdmFsdWUgaXMgc3RyaW5nYCBwcmVkaWNhdGUpOiBhIHByZWRpY2F0ZSB3b3VsZCBuYXJyb3cgdGhlIG5lZ2F0aXZlXG4vLyBicmFuY2ggdG8gYHVuZGVmaW5lZGAgYW5kIGJyZWFrIGBlbHNlIGlmYCBjaGFpbnMgb3ZlciBgc3RyaW5nIHwgdW5kZWZpbmVkYCBkZXBlbmRlbmN5IHZhbHVlcy5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHByaXZhdGVHaXREZXBlbmRlbmN5UGF0dGVybi50ZXN0KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBuYW1lLnN0YXJ0c1dpdGgoYCR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0vYCkgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgIW5vblJlZ2lzdHJ5U3BlY2lmaWVyUHJlZml4ZXMuc29tZSgocHJlZml4KSA9PiB2YWx1ZS5zdGFydHNXaXRoKHByZWZpeCkpXG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZVJlZ2lzdHJ5QXV0aCB7XG4gIHJlZ2lzdHJ5VXJsOiBzdHJpbmc7XG4gIGF1dGhUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHJlZ2lzdHJ5IFVSTCBhbmQgYXV0aCB0b2tlbiBmb3IgdGhlIHByaXZhdGUgc2NvcGUgZnJvbSB0aGUgcHJvamVjdCdzIC5ucG1yYyBhbmRcbiAqIH4vLm5wbXJjIChuZWFyZXIgZmlsZSB3aW5zKSwgZXhwYW5kaW5nIGAke1ZBUn1gIHJlZmVyZW5jZXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuIE9uIENJIHRoZVxuICogVkVSREFDQ0lPX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlIHNlcnZlcyBhcyB0aGUgZmFsbGJhY2sgdG9rZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aChyb290RGlyUGF0aDogc3RyaW5nKTogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgLy8gUmV2ZXJzZSBvcmRlciBzbyBuZWFyZXIgZmlsZXMgb3ZlcndyaXRlIHRoZSBob21lLWRpcmVjdG9yeSBkZWZhdWx0cy5cbiAgZm9yIChjb25zdCBucG1yY1BhdGggb2YgW3BhdGguam9pbihvcy5ob21lZGlyKCksICcubnBtcmMnKSwgcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnLm5wbXJjJyldKSB7XG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW50cmllcywgcGFyc2VOcG1yYyhmcy5yZWFkRmlsZVN5bmMobnBtcmNQYXRoLCAndXRmOCcpKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG5wbXJjIGZpbGVzIGFyZSBmaW5lOyB0aGUgb3RoZXIgZmlsZSBvciBWRVJEQUNDSU9fVE9LRU4gbWF5IHN0aWxsIHByb3ZpZGUgYXV0aC5cbiAgICB9XG4gIH1cblxuICBjb25zdCByZWdpc3RyeVVybCA9IGVudHJpZXNbYCR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX06cmVnaXN0cnlgXT8ucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gIGlmICghcmVnaXN0cnlVcmwpIHJldHVybjtcblxuICAvLyBucG0tc3R5bGUgVVJJIG1hdGNoaW5nOiBub3JtYWxpemUgYm90aCBzaWRlcyB0byBhIHRyYWlsaW5nIHNsYXNoIHNvIGEgdG9rZW4gZm9yXG4gIC8vIGAvL3ZlcmRhY2Npby5leGFtcGxlLmNvbS9gIGNhbiBuZXZlciBtYXRjaCBgLy92ZXJkYWNjaW8uZXhhbXBsZS5jb20tb3RoZXIub3JnL2AsIGFuZCBwaWNrIHRoZVxuICAvLyBNT1NUIFNQRUNJRklDIChsb25nZXN0KSBtYXRjaGluZyBwcmVmaXggc28gYC8vaG9zdC9wcml2YXRlL2AgYmVhdHMgYC8vaG9zdC9gLlxuICBjb25zdCBub3JtYWxpemVkUmVnaXN0cnlVcmwgPSBgJHtyZWdpc3RyeVVybC5yZXBsYWNlKC9eaHR0cHM/Oi8sICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKX0vYDtcbiAgbGV0IG1hdGNoZWRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgbWF0Y2hlZFByZWZpeExlbmd0aCA9IC0xO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgIC8vIFNraXAgZW1wdHkgdG9rZW5zIChhbiB1bnNldCBgJHtWQVJ9YCBleHBhbmRzIHRvICcnKTogYW4gZW1wdHkgbWF0Y2ggbXVzdCBub3QgZGVmZWF0IHRoZVxuICAgIC8vIFZFUkRBQ0NJT19UT0tFTiBmYWxsYmFjayBiZWxvdy5cbiAgICBpZiAoIWtleS5lbmRzV2l0aCgnOl9hdXRoVG9rZW4nKSB8fCAhdmFsdWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHByZWZpeCA9IGAke2tleS5zbGljZSgwLCAtJzpfYXV0aFRva2VuJy5sZW5ndGgpLnJlcGxhY2UoL1xcLyskLywgJycpfS9gO1xuICAgIGlmIChub3JtYWxpemVkUmVnaXN0cnlVcmwuc3RhcnRzV2l0aChwcmVmaXgpICYmIHByZWZpeC5sZW5ndGggPiBtYXRjaGVkUHJlZml4TGVuZ3RoKSB7XG4gICAgICBtYXRjaGVkUHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aDtcbiAgICAgIG1hdGNoZWRUb2tlbiA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvLyBObyBQcm9qZWN0IGluc3RhbmNlIGV4aXN0cyBhdCB0aGlzIGxheWVyLCBzbyBwcm9jZXNzLmVudiBpcyB0aGUgb25seSBzb3VyY2UgZm9yIHRoZVxuICAvLyBDSS1pbmplY3RlZCBmYWxsYmFjayB0b2tlbi5cbiAgY29uc3QgYXV0aFRva2VuID0gbWF0Y2hlZFRva2VuID8/IHByb2Nlc3MuZW52LlZFUkRBQ0NJT19UT0tFTjtcbiAgcmV0dXJuIHsgcmVnaXN0cnlVcmwsIGF1dGhUb2tlbiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOcG1yYyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBsaW5lID0gcmF3TGluZS50cmltKCk7XG4gICAgaWYgKCFsaW5lIHx8IGxpbmUuc3RhcnRzV2l0aCgnIycpIHx8IGxpbmUuc3RhcnRzV2l0aCgnOycpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4IDw9IDApIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qga2V5ID0gbGluZS5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkudHJpbSgpO1xuICAgIGNvbnN0IHZhbHVlID0gbGluZVxuICAgICAgLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSlcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlQWxsKC9cXCRcXHsoW159XSspXFx9L2csIChfLCB2YXJpYWJsZU5hbWU6IHN0cmluZykgPT4gcHJvY2Vzcy5lbnZbdmFyaWFibGVOYW1lXSA/PyAnJyk7XG4gICAgZW50cmllc1trZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogRG93bmxvYWQgYW5kIGV4dHJhY3Qgb25lIHJlZ2lzdHJ5IHBhY2thZ2UgaW50byBgdGFyZ2V0RGlyUGF0aGAuIFRoZSBzcGVjaWZpZXIgbWF5IGJlIGFuIGV4YWN0XG4gKiBzZW12ZXIgdmVyc2lvbiAodGhlIG9yZydzIGNvbW1vbiBjYXNlIHZpYSBidW5maWcgYGV4YWN0ID0gdHJ1ZWApLCBhbnkgc2VtdmVyIHJhbmdlIChyZXNvbHZlZFxuICogbWF4LXNhdGlzZnlpbmcgYWdhaW5zdCB0aGUgcmVnaXN0cnkncyBwdWJsaXNoZWQgdmVyc2lvbnMsIG1hdGNoaW5nIGBucG0gaW5zdGFsbGApLCBvciBhXG4gKiBkaXN0LXRhZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nLFxuICB0YXJnZXREaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcmVzb2x2ZVZlcnNpb24oYXV0aCwgcGFja2FnZU5hbWUsIHZlcnNpb25TcGVjaWZpZXIpO1xuICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGZldGNoUmVnaXN0cnlKc29uPHsgZGlzdD86IHsgdGFyYmFsbD86IHN0cmluZyB9IH0+KFxuICAgIGF1dGgsXG4gICAgYCR7YXV0aC5yZWdpc3RyeVVybH0vJHtlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSl9LyR7dmVyc2lvbn1gXG4gICk7XG4gIGNvbnN0IHRhcmJhbGxVcmwgPSBtZXRhZGF0YS5kaXN0Py50YXJiYWxsO1xuICBpZiAoIXRhcmJhbGxVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRhcmJhbGwgVVJMIGZvciAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259IGluICR7YXV0aC5yZWdpc3RyeVVybH0uYCk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGgsIHRhcmJhbGxVcmwpO1xuICBjb25zdCB0YXJiYWxsUGF0aCA9IHBhdGguam9pbihcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLXByaXZhdGUtcGFja2FnZS0nKSksXG4gICAgJ3BhY2thZ2UudGd6J1xuICApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh0YXJiYWxsUGF0aCwgQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0YXJnZXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAvLyBucG0gdGFyYmFsbHMgcGxhY2UgdGhlIGNvbnRlbnQgdW5kZXIgYSB0b3AtbGV2ZWwgYHBhY2thZ2UvYCBkaXJlY3RvcnkuXG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ3RhcicsIFsnLXh6ZicsIHRhcmJhbGxQYXRoLCAnLUMnLCB0YXJnZXREaXJQYXRoLCAnLS1zdHJpcC1jb21wb25lbnRzPTEnXSwge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259ICgke3RhcmJhbGxVcmx9KS5gKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5kaXJuYW1lKHRhcmJhbGxQYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVWZXJzaW9uKFxuICBhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIFByZXJlbGVhc2UgYW5kIGArYnVpbGRgIG1ldGFkYXRhIGFyZSBib3RoIHBhcnQgb2YgdmFsaWQgZXhhY3QgU2VtVmVyIHZlcnNpb25zLCBzbyBhbiBleGFjdFxuICAvLyBzcGVjaWZpZXIgcmVzb2x2ZXMgdG8gaXRzZWxmIHdpdGhvdXQgYSBwYWNrdW1lbnQgZmV0Y2guXG4gIGlmIChpc0V4YWN0VmVyc2lvbih2ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuIHZlcnNpb25TcGVjaWZpZXI7XG5cbiAgY29uc3QgcGFja3VtZW50ID0gYXdhaXQgZmV0Y2hSZWdpc3RyeUpzb248UGFja3VtZW50PihhdXRoLCBgJHthdXRoLnJlZ2lzdHJ5VXJsfS8ke2VuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKX1gKTtcbiAgY29uc3QgdmVyc2lvbiA9IHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KHZlcnNpb25TcGVjaWZpZXIsIHBhY2t1bWVudCk7XG4gIGlmICghdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgcmVzb2x2ZSAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb25TcGVjaWZpZXJ9IGFnYWluc3QgJHthdXRoLnJlZ2lzdHJ5VXJsfTsgdXNlIGFuIGV4YWN0IHZlcnNpb24sIGEgc2VtdmVyIHJhbmdlLCBvciBhIGRpc3QtdGFnLmBcbiAgICApO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2t1bWVudCB7XG4gICdkaXN0LXRhZ3MnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgdmVyc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBucG0ncyBzcGVjaWZpZXIgY2xhc3NpZmljYXRpb246IGAqYCBhbmQgZGlzdC10YWcgbmFtZXMgcmVzb2x2ZSB2aWEgZGlzdC10YWdzIChucG0gcmVzb2x2ZXMgYCpgXG4gKiB0byB0aGUgYGxhdGVzdGAgdGFnKSwgd2hpbGUgYW55IG90aGVyIHZhbGlkIHNlbXZlciByYW5nZSByZXNvbHZlcyB0byB0aGUgaGlnaGVzdCBwdWJsaXNoZWRcbiAqIHZlcnNpb24gc2F0aXNmeWluZyBpdCwgbWF0Y2hpbmcgYG5wbSBpbnN0YWxsYCdzIG1heC1zYXRpc2Z5aW5nIHNlbWFudGljcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZywgcGFja3VtZW50OiBQYWNrdW1lbnQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodmVyc2lvblNwZWNpZmllciAhPT0gJyonICYmIHNlbXZlci52YWxpZFJhbmdlKHZlcnNpb25TcGVjaWZpZXIpKSB7XG4gICAgcmV0dXJuIHNlbXZlci5tYXhTYXRpc2Z5aW5nKE9iamVjdC5rZXlzKHBhY2t1bWVudC52ZXJzaW9ucyA/PyB7fSksIHZlcnNpb25TcGVjaWZpZXIpID8/IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcGFja3VtZW50WydkaXN0LXRhZ3MnXT8uW3ZlcnNpb25TcGVjaWZpZXIgPT09ICcqJyA/ICdsYXRlc3QnIDogdmVyc2lvblNwZWNpZmllcl07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVnaXN0cnlKc29uPFQ+KGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsIHVybDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hGcm9tUmVnaXN0cnkoYXV0aCwgdXJsKTtcbiAgcmV0dXJuIChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIFQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsIHVybDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAvLyBUYXJiYWxsIFVSTHMgY29tZSBmcm9tIHJlZ2lzdHJ5LWNvbnRyb2xsZWQgbWV0YWRhdGE7IGF0dGFjaCB0aGUgdG9rZW4gb25seSB0byB0aGUgY29uZmlndXJlZFxuICAvLyByZWdpc3RyeSdzIG93biBvcmlnaW4gc28gYSBtYWxpY2lvdXMgb3IgbWlzY29uZmlndXJlZCByZWdpc3RyeSBjYW5ub3QgcmVkaXJlY3QgdGhlIGNyZWRlbnRpYWxcbiAgLy8gdG8gYSB0aGlyZC1wYXJ0eSBob3N0LlxuICBjb25zdCBzZW5kQXV0aFRva2VuID0gISFhdXRoLmF1dGhUb2tlbiAmJiBpc1NhbWVPcmlnaW4odXJsLCBhdXRoLnJlZ2lzdHJ5VXJsKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBoZWFkZXJzOiBzZW5kQXV0aFRva2VuID8geyBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXV0aC5hdXRoVG9rZW59YCB9IDoge30sXG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9OiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luKHVybDogc3RyaW5nLCByZWdpc3RyeVVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsKS5vcmlnaW4gPT09IG5ldyBVUkwocmVnaXN0cnlVcmwpLm9yaWdpbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgnLycsICclMkYnKTtcbn1cblxuLy8gVGhlIG9mZmljaWFsIFNlbVZlciAyLjAuMCBncmFtbWFyIChzZW12ZXIub3JnKSwgYW5jaG9yZWQ6IG51bWVyaWMtbG9va2luZyBkaXN0LXRhZ3Mgc3VjaCBhc1xuLy8gYDEuMi4zbGF0ZXN0YCwgbGVhZGluZy16ZXJvIHZlcnNpb25zIChgMDEuMi4zYCksIGFuZCB1bmRlcnNjb3JlIGlkZW50aWZpZXJzIGFyZSBOT1QgdmVyc2lvbnMg4oCUXG4vLyByZXNvbHZlVmVyc2lvbiB0cmVhdHMgdGhlbSBhcyB0YWdzLCBtYXRjaGluZyBub2RlLXNlbXZlcidzIGNsYXNzaWZpY2F0aW9uLlxuY29uc3QgZXhhY3RTZW12ZXJQYXR0ZXJuID1cbiAgL14oPzowfFsxLTldXFxkKilcXC4oPzowfFsxLTldXFxkKilcXC4oPzowfFsxLTldXFxkKikoPzotKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKD86XFwuKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKSopPyg/OlxcK1swLTlhLXpBLVotXSsoPzpcXC5bMC05YS16QS1aLV0rKSopPyQvO1xuXG4vKiogV2hldGhlciB0aGUgc3BlY2lmaWVyIGlzIGFuIGV4YWN0IFNlbVZlciB2ZXJzaW9uIChub3QgYSByYW5nZSwgdGFnLCBvciBnaXQgVVJMKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V4YWN0VmVyc2lvbihzcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFzcGVjaWZpZXIgJiYgZXhhY3RTZW12ZXJQYXR0ZXJuLnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIEVWRVJZIHZlcnNpb24gYHNwZWNpZmllcmAgY2FuIHJlc29sdmUgdG8gYWxzbyBzYXRpc2ZpZXMgYHJlcXVpcmVtZW50YCAoZXhhY3QgdmVyc2lvbnNcbiAqIGNvdW50IGFzIHNpbmdsZS12ZXJzaW9uIHJhbmdlcykuIENvbmZsaWN0IGNoZWNrcyB1c2UgdGhpcyBiZWNhdXNlIHRoZSBhY3R1YWxseSByZXNvbHZlZCB2ZXJzaW9uXG4gKiBpcyB1bmtub3duIGJlZm9yZSB0aGUgcmVnaXN0cnkgaXMgY29uc3VsdGVkOiBhIHN1YnNldCBzcGVjaWZpZXIncyBtYXgtc2F0aXNmeWluZyByZXNvbHV0aW9uIGlzXG4gKiBndWFyYW50ZWVkIHRvIHNhdGlzZnkgdGhlIHdpZGVyIHJlcXVpcmVtZW50LiBOb24tcmFuZ2Ugc3BlY2lmaWVycyAoZGlzdC10YWdzLCBnaXQgVVJMcykgYXJlIG5vdFxuICogY29tcGFyYWJsZSBhbmQgcmV0dXJuIGZhbHNlIOKAlCBjYWxsZXJzIGFjY2VwdCB0aG9zZSBvbmx5IG9uIGV4YWN0IHN0cmluZyBlcXVhbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwZWNpZmllclN1YnNldChzcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZCwgcmVxdWlyZW1lbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoc3BlY2lmaWVyID09PSB1bmRlZmluZWQgfHwgcmVxdWlyZW1lbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAvLyBgKmAgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgYGxhdGVzdGAgZGlzdC10YWcgKHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KSwgbm90IGFzIGEgcmFuZ2UsIHNvXG4gIC8vIGl0IGlzIG5vdCBzdGF0aWNhbGx5IGNvbXBhcmFibGUgaW4gZWl0aGVyIHBvc2l0aW9uLlxuICBpZiAoc3BlY2lmaWVyID09PSAnKicgfHwgcmVxdWlyZW1lbnQgPT09ICcqJykgcmV0dXJuIGZhbHNlO1xuICAvLyBCdWlsZCBtZXRhZGF0YSBkaXN0aW5ndWlzaGVzIHJlZ2lzdHJ5IGFydGlmYWN0cyAocmVzb2x2ZVZlcnNpb24gZmV0Y2hlcyBhbiBleGFjdCBzcGVjaWZpZXJcbiAgLy8gdmVyYmF0aW0pIGJ1dCBzZW12ZXIgY29tcGFyaXNvbnMgaWdub3JlIGl0LCBzbyB0d28gZXhhY3QgdmVyc2lvbnMgbXVzdCBtYXRjaCBhcyBzdHJpbmdzLlxuICBpZiAoaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyKSAmJiBpc0V4YWN0VmVyc2lvbihyZXF1aXJlbWVudCkpIHJldHVybiBzcGVjaWZpZXIgPT09IHJlcXVpcmVtZW50O1xuICBpZiAoIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikgfHwgIXNlbXZlci52YWxpZFJhbmdlKHJlcXVpcmVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gc2VtdmVyLnN1YnNldChzcGVjaWZpZXIsIHJlcXVpcmVtZW50KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBtYXRlcmlhbGl6ZWQgYHZlcnNpb25gIGNhbiBiZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVnaXN0cnkgYHNwZWNpZmllcmAuXG4gKiBEaXN0LXRhZ3MgKGludmFsaWQgcmFuZ2VzKSBhcmUgbm90IHN0YXRpY2FsbHkgY2hlY2thYmxlIGFuZCBwYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXI6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEJ1aWxkIG1ldGFkYXRhIGRpc3Rpbmd1aXNoZXMgcmVnaXN0cnkgYXJ0aWZhY3RzLCBzbyBhbiBleGFjdCBzcGVjaWZpZXIgYWRtaXRzIG9ubHkgdGhlXG4gIC8vIGlkZW50aWNhbCB2ZXJzaW9uIHN0cmluZy5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikpIHJldHVybiBzcGVjaWZpZXIgPT09IHZlcnNpb247XG4gIGlmICghc2VtdmVyLnZhbGlkUmFuZ2Uoc3BlY2lmaWVyKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBzZW12ZXIuc2F0aXNmaWVzKHZlcnNpb24sIHNwZWNpZmllcik7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgaW5zdGFsbGVkIGB2ZXJzaW9uYCBpcyBzdGF0aWNhbGx5IEtOT1dOIHRvIHNhdGlzZnkgdGhlIHJlZ2lzdHJ5IGBzcGVjaWZpZXJgLlxuICogRGlzdC10YWdzIChpbnZhbGlkIHJhbmdlcykgYXJlIG5vdCBzdGF0aWNhbGx5IGNoZWNrYWJsZSBhbmQgcmV0dXJuIGZhbHNlIOKAlCB1bmxpa2VcbiAqIG1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXMsIGNhbGxlcnMgdXNlIHRoaXMgdG8gZGVjaWRlIHdoZXRoZXIgYW4gaW5zdGFsbGVkIGNvcHkgY2FuIHJlcGxhY2VcbiAqIGEgcmVnaXN0cnkgZG93bmxvYWQsIHNvIHVuY2VydGFpbnR5IG11c3QgZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXI6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGAqYCByZXNvbHZlcyB0aHJvdWdoIHRoZSBgbGF0ZXN0YCBkaXN0LXRhZyAoc2VsZWN0VmVyc2lvbkZyb21QYWNrdW1lbnQpLCBzbyBsaWtlIGFueSBvdGhlclxuICAvLyBkaXN0LXRhZyBpdCBpcyBub3Qgc3RhdGljYWxseSBjaGVja2FibGUgYWdhaW5zdCBhbiBpbnN0YWxsZWQgdmVyc2lvbi5cbiAgaWYgKHNwZWNpZmllciA9PT0gJyonKSByZXR1cm4gZmFsc2U7XG4gIC8vIHJlc29sdmVWZXJzaW9uIGZldGNoZXMgYW4gZXhhY3Qgc3BlY2lmaWVyIHZlcmJhdGltIChidWlsZCBtZXRhZGF0YSBpbmNsdWRlZCksIHNvIGFuIGluc3RhbGxlZFxuICAvLyBjb3B5IG1heSByZXBsYWNlIHRoZSBkb3dubG9hZCBvbmx5IHdoZW4gdGhlIHZlcnNpb24gc3RyaW5ncyBtYXRjaCBleGFjdGx5LlxuICBpZiAoaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyKSkgcmV0dXJuIHNwZWNpZmllciA9PT0gdmVyc2lvbjtcbiAgcmV0dXJuICEhc2VtdmVyLnZhbGlkUmFuZ2Uoc3BlY2lmaWVyKSAmJiBzZW12ZXIuc2F0aXNmaWVzKHZlcnNpb24sIHNwZWNpZmllcik7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMsIHR5cGUgRm91bmRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcml2YXRlUmVnaXN0cnlBdXRoIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZSxcbiAgaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyxcbiAgaXNQcml2YXRlR2l0RGVwZW5kZW5jeSxcbiAgaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5LFxuICByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgc3BlY2lmaWVyU3Vic2V0LFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbnRlcmZhY2UgUHJpdmF0ZVBhY2thZ2Uge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6ICdnaXQnIHwgJ3JlZ2lzdHJ5JztcbiAgLyoqXG4gICAqIFVuZGVmaW5lZCBmb3IgcmVnaXN0cnkgcGFja2FnZXMgdGhhdCBtdXN0IGJlIGRvd25sb2FkZWQ7IHNldCBmb3IgZ2l0IHBhY2thZ2VzIGFuZCBmb3JcbiAgICogcmVnaXN0cnkgcGFja2FnZXMgd2hvc2UgaW5zdGFsbGVkIGNvcHkgaW4gbm9kZV9tb2R1bGVzIGFscmVhZHkgc2F0aXNmaWVzIHRoZSBzcGVjaWZpZXJcbiAgICogKHNvIENJIHN0ZXBzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMgY2FuIHN0aWxsIG1hdGVyaWFsaXplIHRoZW0pLlxuICAgKi9cbiAgc291cmNlRGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0YXJnZXREaXJQYXRoOiBzdHJpbmc7XG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBvbmNlIGFuIGluc3RhbGxlZCBjb3B5IGlzIHNlbGVjdGVkIG9yIGEgZG93bmxvYWQgaXMgZXh0cmFjdGVkLiAqL1xuICByZXNvbHZlZFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgZGVwZW5kZW5jeUtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAnb3V0LWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RpcmVjdG9yeSB0byBjb3B5IHByaXZhdGUgcGFja2FnZXMgaW50bycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ0B3aWxsYm9vc3RlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHsgZHJ5UnVuPzogYm9vbGVhbiB9LCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cC1wcml2YXRlLXBhY2thZ2VzJyxcbiAgZGVzY3JpYmU6XG4gICAgJ01hdGVyaWFsaXplIHByaXZhdGUgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzOiBjb3B5IGdpdCBkZXBlbmRlbmNpZXMsIHJldXNlIGluc3RhbGxlZCBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIHJlZ2lzdHJ5IHBhY2thZ2VzIHdob3NlIGV4YWN0LXZlcnNpb24gb3Igc2VtdmVyLXJhbmdlIHNwZWNpZmllciB0aGUgaW5zdGFsbGVkIGNvcHkgc2F0aXNmaWVzLCBhbmQgZG93bmxvYWQgdGhlIHJlc3QgKGF1dGggdmlhIC5ucG1yYyAvIH4vLm5wbXJjIGxvY2FsbHksIG9yIFZFUkRBQ0NJT19UT0tFTiBvbiBDSTsgZGlzdC10YWcgc3BlY2lmaWVycyBzdWNoIGFzIGBsYXRlc3RgIGFsd2F5cyBkb3dubG9hZCkuICcgK1xuICAgICdUaGUgRG9ja2VyZmlsZSBtdXN0IENPUFkgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyAoZS5nLiBgQ09QWSBAd2lsbGJvb3N0ZXIvIEB3aWxsYm9vc3Rlci9gIGFuZCBgQ09QWSBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8gQHdpbGxib29zdGVyLXByaXZhdGUvYCkgc28gdGhlIGluLWltYWdlIGluc3RhbGwgcmVzb2x2ZXMgdGhlIHJld3JpdHRlbiBmaWxlOiBwYXRocy4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCByb290QW5kU2VsZiA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXJvb3RBbmRTZWxmKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFJlc29sdmUgdGhlIGRlc2NlbmRhbnQgc2V0IGZyb20gdGhlIHJlcG9zaXRvcnkgUk9PVCAobm90IHRoZSBjdXJyZW50IGRpcmVjdG9yeSkgc28gdGhlXG4gICAgLy8gY29tbWFuZCBzY2FucyB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0IHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaXQgcnVuczpcbiAgICAvLyBmaW5kRGVzY2VuZGFudFByb2plY3RzIHJldHVybnMgb25seSB0aGUgY3VycmVudCBwcm9qZWN0IHdoZW4gaW52b2tlZCBmcm9tIGEgd29ya3NwYWNlLlxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcm9vdEFuZFNlbGYucm9vdC5kaXJQYXRoKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gU2NhbiB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0OiBhIHByaXZhdGUgZGVwZW5kZW5jeSBtYXkgYmUgZGVjbGFyZWQgaW5cbiAgICAvLyBhIHN1Yi1wYWNrYWdlIChlLmcuIHBhY2thZ2VzL3NlcnZlcikgcmF0aGVyIHRoYW4gdGhlIHJvb3QsIHlldCBpdCBzdGlsbCBtYXRlcmlhbGl6ZXMgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290IHNvIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYCByZXNvbHZlcyBpdCB1bmlmb3JtbHkuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgY29sbGVjdE1hbmlmZXN0cyhwcm9qZWN0cyksIHtcbiAgICAgICAgb3V0RGlyOiBhcmd2Lm91dERpcixcbiAgICAgICAgZHJ5UnVuOiBCb29sZWFuKGFyZ3YuZHJ5UnVuKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzT3B0aW9ucyB7XG4gIC8qKiBEaXJlY3RvcnkgKHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QpIHRoYXQgZ2l0IGRlcGVuZGVuY2llcyBhcmUgY29waWVkIGludG8uICovXG4gIG91dERpcj86IHN0cmluZztcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbn1cblxuLyoqIFRoZSByb290IG1hbmlmZXN0IGZvbGxvd2VkIGJ5IGVhY2ggZGlzdGluY3Qgd29ya3NwYWNlIG1hbmlmZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RNYW5pZmVzdHMocHJvamVjdHM6IEZvdW5kUHJvamVjdHMpOiBQYWNrYWdlSnNvbltdIHtcbiAgY29uc3QgbWFuaWZlc3RzQnlEaXJQYXRoID0gbmV3IE1hcDxzdHJpbmcsIFBhY2thZ2VKc29uPigpO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgW3Byb2plY3RzLnJvb3QsIC4uLnByb2plY3RzLmRlc2NlbmRhbnRzXSkge1xuICAgIGlmICghbWFuaWZlc3RzQnlEaXJQYXRoLmhhcyhwcm9qZWN0LmRpclBhdGgpKSBtYW5pZmVzdHNCeURpclBhdGguc2V0KHByb2plY3QuZGlyUGF0aCwgcHJvamVjdC5wYWNrYWdlSnNvbik7XG4gIH1cbiAgcmV0dXJuIFsuLi5tYW5pZmVzdHNCeURpclBhdGgudmFsdWVzKCldO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXMoXG4gIHJvb3RQcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBtYW5pZmVzdFBhY2thZ2VKc29uczogUGFja2FnZUpzb25bXSxcbiAgb3B0aW9uczogTWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXNPcHRpb25zID0ge31cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IG91dERpciA9ICdAd2lsbGJvb3N0ZXInLCBkcnlSdW4gPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAvLyBPdXRwdXQgcGF0aHMgYXJlIHJlY3Vyc2l2ZWx5IERFTEVURUQgYmVmb3JlIGJlaW5nIHJlY3JlYXRlZCwgc28gbm9uZSBvZiB0aGVtIG1heSBjb250YWluIGFcbiAgLy8gc3ltbGluayBjb21wb25lbnQ6IGEgc3ltbGluayAoZS5nLiBgZXNjYXBlIC0+IG5vZGVfbW9kdWxlc2AsIG9yIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZWBcbiAgLy8gaXRzZWxmIGxpbmtpbmcgZWxzZXdoZXJlKSB3b3VsZCBlaXRoZXIgc211Z2dsZSB0aGUgZGVsZXRlIHBhc3QgdGhlIGxleGljYWwgb3ZlcmxhcCBndWFyZHNcbiAgLy8gb3IgZGVzdHJveSB0aGUgc3ltbGluaydzIHRhcmdldC4gUmVqZWN0aW5nIGNhbm9uaWNhbC9sZXhpY2FsIG1pc21hdGNoZXMga2VlcHMgZXZlcnlcbiAgLy8gZGVzdHJ1Y3RpdmUgb3BlcmF0aW9uIG9uIHRoZSBpbnRlbmRlZCBsZXhpY2FsIGxvY2F0aW9uLiBUaGVzZSBndWFyZHMgVEhST1cgKG5vdCBwcm9jZXNzLmV4aXQpXG4gIC8vIHNvIHRoZSBhdXRvbWF0aWMgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlYCBjYWxsZXIgY2FuIGNhdGNoIHRoZW0gYW5kIGNvbnRpbnVlXG4gIC8vIG5vbi1mYXRhbGx5OyB0aGUgZXhwbGljaXQgY29tbWFuZCdzIGhhbmRsZXIgY2F0Y2hlcyBhbmQgZXhpdHMuXG4gIGNvbnN0IHJvb3REaXJQYXRoID0gY2Fub25pY2FsaXplUGF0aChyb290UHJvamVjdERpclBhdGgpO1xuICBjb25zdCByZXNvbHZlT3V0cHV0RGlyUGF0aCA9IChyZWxhdGl2ZU9yQWJzb2x1dGVQYXRoOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGxleGljYWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCByZWxhdGl2ZU9yQWJzb2x1dGVQYXRoKTtcbiAgICBjb25zdCBjYW5vbmljYWxQYXRoID0gY2Fub25pY2FsaXplUGF0aChsZXhpY2FsUGF0aCk7XG4gICAgaWYgKGNhbm9uaWNhbFBhdGggIT09IGxleGljYWxQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9IG11c3Qgbm90IGNvbnRhaW4gc3ltbGlua3MgKCR7bGV4aWNhbFBhdGh9IHJlc29sdmVzIHRvICR7Y2Fub25pY2FsUGF0aH0pLmApO1xuICAgIH1cbiAgICByZXR1cm4gbGV4aWNhbFBhdGg7XG4gIH07XG4gIGNvbnN0IG91dERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChvdXREaXIsICctLW91dC1kaXInKTtcbiAgYXNzZXJ0U3ViZGlyZWN0b3J5KHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKTtcbiAgLy8gUmVnaXN0cnkgcGFja2FnZXMgYWx3YXlzIG1hdGVyaWFsaXplIGF0IHRoZSByZXBvc2l0b3J5IHJvb3Q6IGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYFxuICAvLyByZXNvbHZlcyB0aGVtIGZyb20gYDxyb290Pi9Ad2lsbGJvb3N0ZXItcHJpdmF0ZWAgcmVnYXJkbGVzcyBvZiBgLS1vdXQtZGlyYC5cbiAgY29uc3QgcmVnaXN0cnlPdXREaXJQYXRoID0gcmVzb2x2ZU91dHB1dERpclBhdGgoXG4gICAgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSxcbiAgICBgVGhlICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0gb3V0cHV0IGRpcmVjdG9yeWBcbiAgKTtcbiAgaWYgKHBhdGhzT3ZlcmxhcChvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgLy8gZS5nLiBgLS1vdXQtZGlyIEB3aWxsYm9vc3Rlci1wcml2YXRlYCBvciBgLS1vdXQtZGlyIEB3aWxsYm9vc3Rlci1wcml2YXRlL3N1YmA6IHRoZVxuICAgIC8vIHJlZ2lzdHJ5IHN0ZXAgcmVjdXJzaXZlbHkgZGVsZXRlcyByZWdpc3RyeU91dERpclBhdGgsIHdoaWNoIHdvdWxkIGRlc3Ryb3kgdGhlIGdpdFxuICAgIC8vIHBhY2thZ2VzIGNvcGllZCBpbnRvIGFuIGVxdWFsIG9yIE5FU1RFRCBkaXJlY3RvcnkgbW9tZW50cyBlYXJsaWVyLlxuICAgIHRocm93IG5ldyBFcnJvcihgLS1vdXQtZGlyIG11c3Qgbm90IG92ZXJsYXAgdGhlICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0gcmVnaXN0cnkgb3V0cHV0IGRpcmVjdG9yeS5gKTtcbiAgfVxuICBjb25zdCBzdGFnaW5nRGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKFxuICAgIHBhdGguam9pbignLnRtcCcsICd3Yi1wcml2YXRlLXJlZ2lzdHJ5LXN0YWdpbmcnKSxcbiAgICAnVGhlIHJlZ2lzdHJ5IHN0YWdpbmcgZGlyZWN0b3J5J1xuICApO1xuICBjb25zdCBnaXRTdGFnaW5nRGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKFxuICAgIHBhdGguam9pbignLnRtcCcsICd3Yi1wcml2YXRlLWdpdC1zdGFnaW5nJyksXG4gICAgJ1RoZSBnaXQgc3RhZ2luZyBkaXJlY3RvcnknXG4gICk7XG4gIGlmIChwYXRoc092ZXJsYXAob3V0RGlyUGF0aCwgY2Fub25pY2FsaXplUGF0aChwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnKSkpKSB7XG4gICAgLy8gVGhlIHJlY3Vyc2l2ZSBkZWxldGUgb2Ygb3V0RGlyUGF0aCB3b3VsZCBkZXN0cm95IHRoZSBpbnN0YWxsZWQgc291cmNlcyB0aGUgY29waWVzIHJlYWQuXG4gICAgdGhyb3cgbmV3IEVycm9yKCctLW91dC1kaXIgbXVzdCBub3Qgb3ZlcmxhcCBub2RlX21vZHVsZXMuJyk7XG4gIH1cbiAgZm9yIChjb25zdCBbc3RhZ2luZ0xhYmVsLCBzdGFnaW5nUGF0aF0gb2YgW1xuICAgIFsncmVnaXN0cnknLCBzdGFnaW5nRGlyUGF0aF0sXG4gICAgWydnaXQnLCBnaXRTdGFnaW5nRGlyUGF0aF0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHN0YWdpbmdQYXRoKSkge1xuICAgICAgLy8gRWFjaCBzdGFnaW5nIHN0ZXAgcmVjcmVhdGVzIGl0cyBkaXJlY3RvcnksIHNpbGVudGx5IGRpc2NhcmRpbmcgYW55dGhpbmcgY29waWVkIGludG8gYW5cbiAgICAgIC8vIGVxdWFsIG9yIG5lc3RlZCAtLW91dC1kaXIgbW9tZW50cyBlYXJsaWVyLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAtLW91dC1kaXIgbXVzdCBub3Qgb3ZlcmxhcCB0aGUgJHtzdGFnaW5nTGFiZWx9IHN0YWdpbmcgZGlyZWN0b3J5ICgke3N0YWdpbmdQYXRofSkuYCk7XG4gICAgfVxuICB9XG4gIGlmIChwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKSAhPT0gJ0B3aWxsYm9vc3RlcicpIHtcbiAgICAvLyBQcmUtZXhpc3RpbmcgbGltaXRhdGlvbiBvZiB0aGUgb3B0aW9uOiB0aGUgRG9ja2VyIG1hbmlmZXN0IHJld3JpdGUgaGFzIG5vIGFjY2VzcyB0byBpdC5cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICdOb3RlOiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIHJld3JpdGVzIGdpdCBkZXBlbmRlbmNpZXMgdG8gPHJvb3Q+L0B3aWxsYm9vc3RlcjsgYSBjdXN0b20gLS1vdXQtZGlyIHJlcXVpcmVzIGEgbWF0Y2hpbmcgRG9ja2VyZmlsZSBsYXlvdXQuJ1xuICAgICAgKVxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gYXdhaXQgY29sbGVjdFByaXZhdGVQYWNrYWdlcyhcbiAgICByb290RGlyUGF0aCxcbiAgICBtYW5pZmVzdFBhY2thZ2VKc29ucyxcbiAgICBvdXREaXJQYXRoLFxuICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICApO1xuXG4gIGlmIChkcnlSdW4pIHtcbiAgICBwcmludERyeVJ1blJlc3VsdChvdXREaXJQYXRoLCBwcml2YXRlUGFja2FnZXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIHdob3NlIGluc3RhbGxlZCBjb3B5IHNhdGlzZmllcyB0aGUgc3BlY2lmaWVyIGFyZSBjb3BpZWQgZnJvbVxuICAvLyBub2RlX21vZHVsZXM7IG9ubHkgdGhlIHJlc3QgYXJlIGRvd25sb2FkZWQsIHNvIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIGFyZSBuZWVkZWQgb25seSB3aGVuIGFcbiAgLy8gZG93bmxvYWQgYWN0dWFsbHkgaGFwcGVucyAoQ0kgdGVzdCBzdGVwcyBkZWxpYmVyYXRlbHkgcmVjZWl2ZSBubyBWZXJkYWNjaW8gdG9rZW4pLlxuICBjb25zdCBkb3dubG9hZGVkUGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ3JlZ2lzdHJ5JyAmJiAhcC5zb3VyY2VEaXJQYXRoKTtcbiAgLy8gUmVzb2x2ZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIEJFRk9SRSBkZWxldGluZyB0aGUgZXhpc3RpbmcgbWF0ZXJpYWxpemF0aW9ucywgc28gYSBtaXNzaW5nXG4gIC8vIHJlZ2lzdHJ5IGNvbmZpZ3VyYXRpb24gY2Fubm90IGRlc3Ryb3kgYSBwcmV2aW91c2x5IHVzYWJsZSBvdXRwdXQgdHJlZS4gVGhyb3cgKHJhdGhlciB0aGFuXG4gIC8vIGV4aXQpIHNvIGNhbGxlcnMgY2FuIGRlY2lkZTogYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIHJlcG9ydHMgaXQgYW5kIGV4aXRzLCB3aGlsZSB0aGVcbiAgLy8gYXV0b21hdGljIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZWAgc3RlcCBjYXRjaGVzIGl0IGFuZCBjb250aW51ZXMsIGxlYXZpbmcgdGhlXG4gIC8vIGV4aXN0aW5nIG91dHB1dCB1bnRvdWNoZWQgKG5vdGhpbmcgaGFzIGJlZW4gZGVsZXRlZCB5ZXQgYXQgdGhpcyBwb2ludCkuXG4gIGNvbnN0IGF1dGggPSBkb3dubG9hZGVkUGFja2FnZXMubGVuZ3RoID4gMCA/IHJlc29sdmVQcml2YXRlUmVnaXN0cnlBdXRoKHJvb3REaXJQYXRoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGRvd25sb2FkZWRQYWNrYWdlcy5sZW5ndGggPiAwICYmICFhdXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCBkb3dubG9hZCAke2Rvd25sb2FkZWRQYWNrYWdlcy5tYXAoKHApID0+IHAubmFtZSkuam9pbignLCAnKX06IG5vIHJlZ2lzdHJ5IGNvbmZpZ3VyZWQgZm9yIHRoZSAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9IHNjb3BlOyBgICtcbiAgICAgICAgYGFkZCBcIiR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX06cmVnaXN0cnk9Li4uXCIgdG8gLm5wbXJjIG9yIH4vLm5wbXJjLiBPbmx5IGluc3RhbGxlZCBjb3BpZXMgc2F0aXNmeWluZyBhbiBleGFjdCB2ZXJzaW9uIG9yIGAgK1xuICAgICAgICAnc2VtdmVyIHJhbmdlIGFyZSByZXVzZWQgd2l0aG91dCByZWdpc3RyeSBhY2Nlc3M7IGRpc3QtdGFnIHNwZWNpZmllcnMgKGUuZy4gYGxhdGVzdGApIGFsd2F5cyByZXF1aXJlIGl0LidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29waWVkUGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ2dpdCcpO1xuICBjb25zdCByZWdpc3RyeVBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScpO1xuXG4gIC8vIENvcHkgZ2l0IHBhY2thZ2VzIGludG8gYSBzdGFnaW5nIGRpcmVjdG9yeSBhbmQgc3dhcCBpdCBpbiBvbmx5IGFmdGVyIGV2ZXJ5IGNvcHkgc3VjY2VlZGVkLFxuICAvLyBtaXJyb3JpbmcgdGhlIHJlZ2lzdHJ5IHN0YWdpbmcgYmVsb3c6IGEgY29weSB0aGF0IGZhaWxzIHBhcnR3YXkgKGUuZy4gYSBkYW5nbGluZyBzeW1saW5rIGluXG4gIC8vIHRoZSBpbnN0YWxsZWQgc291cmNlKSBtdXN0IG5vdCBsZWF2ZSBhIGhhbGYtcG9wdWxhdGVkIEB3aWxsYm9vc3RlciB0cmVlIHRoYXQgdGhlIGF1dG9tYXRpY1xuICAvLyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIGNhbGxlciDigJQgd2hpY2ggY2F0Y2hlcyB0aGUgZmFpbHVyZSBhbmQgY29udGludWVzIOKAlCB3b3VsZCB0aGVuIHJld3JpdGVcbiAgLy8gZGVwZW5kZW5jaWVzIGFnYWluc3QuIEJvdGggb3V0cHV0IGRpcmVjdG9yaWVzIGFsd2F5cyBleGlzdCBhZnRlcndhcmRzOiBEb2NrZXJmaWxlcyBDT1BZIHRoZW1cbiAgLy8gdW5jb25kaXRpb25hbGx5LCBhbmQgYSBtaXNzaW5nIHNvdXJjZSBwYXRoIGZhaWxzIHRoZSBidWlsZC5cbiAgYXdhaXQgZnMucHJvbWlzZXMucm0oZ2l0U3RhZ2luZ0RpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZ2l0U3RhZ2luZ0RpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGNvcHlJbnN0YWxsZWRQYWNrYWdlKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UsXG4gICAgICAgIHBhdGguam9pbihnaXRTdGFnaW5nRGlyUGF0aCwgcGF0aC5yZWxhdGl2ZShvdXREaXJQYXRoLCBwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSlcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKG91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUoZ2l0U3RhZ2luZ0RpclBhdGgsIG91dERpclBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGdpdFN0YWdpbmdEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBpZiAocmVnaXN0cnlQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gRG93bmxvYWQgaW50byBhIHN0YWdpbmcgZGlyZWN0b3J5IGFuZCBzd2FwIGl0IGluIG9ubHkgYWZ0ZXIgZXZlcnkgZG93bmxvYWQgc3VjY2VlZGVkLCBzb1xuICAgIC8vIGEgZmFpbGluZyByZWdpc3RyeS90b2tlbi9leHRyYWN0aW9uIGNhbm5vdCBkZXN0cm95IHRoZSBsYXN0IHVzYWJsZSBtYXRlcmlhbGl6YXRpb24uXG4gICAgY29uc3QgdG9TdGFnZWRQYXRoID0gKHRhcmdldERpclBhdGg6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgICAgcGF0aC5qb2luKHN0YWdpbmdEaXJQYXRoLCBwYXRoLnJlbGF0aXZlKHJlZ2lzdHJ5T3V0RGlyUGF0aCwgdGFyZ2V0RGlyUGF0aCkpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHN0YWdpbmdEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoc3RhZ2luZ0RpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHJlZ2lzdHJ5UGFja2FnZXMpIHtcbiAgICAgICAgaWYgKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpIHtcbiAgICAgICAgICBhd2FpdCBjb3B5SW5zdGFsbGVkUGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UsIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAgICAgLy8gZG93bmxvYWRlZFBhY2thZ2VzIGlzIG5vbi1lbXB0eSBvbiB0aGlzIHBhdGgsIHNvIHRoZSBhdXRoIGNoZWNrIGFib3ZlIHBhc3NlZC5cbiAgICAgICAgICAgIGF1dGghLFxuICAgICAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZSxcbiAgICAgICAgICAgIHByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXIgPz8gJ2xhdGVzdCcsXG4gICAgICAgICAgICB0b1N0YWdlZFBhdGgocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aClcbiAgICAgICAgICApO1xuICAgICAgICAgIHByaXZhdGVQYWNrYWdlLnJlc29sdmVkVmVyc2lvbiA9IHJlYWRJbnN0YWxsZWRWZXJzaW9uKFxuICAgICAgICAgICAgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpLFxuICAgICAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgYERvd25sb2FkZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgZG93bmxvYWRlZCBwYWNrYWdlIG1heSBpdHNlbGYgZGVwZW5kIG9uIHByaXZhdGUgcGFja2FnZXMgdGhhdCB3ZXJlIG5vdCB2aXNpYmxlXG4gICAgICAgIC8vIGJlZm9yZSBleHRyYWN0aW9uOyBtYXRlcmlhbGl6ZSB0aGVtIHRvby4gSW5zdGFsbGVkIGNvcGllcyB3ZXJlIGFscmVhZHkgZGVlcC1zY2FubmVkXG4gICAgICAgIC8vIGJ5IGNvbGxlY3RQcml2YXRlUGFja2FnZXMuXG4gICAgICAgIGlmICghcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCkge1xuICAgICAgICAgIGF3YWl0IGNvbGxlY3ROZXN0ZWRQcml2YXRlUGFja2FnZXMoXG4gICAgICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgICAgIGF1dGghLFxuICAgICAgICAgICAgcHJpdmF0ZVBhY2thZ2UsXG4gICAgICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgICAgICBvdXREaXJQYXRoLFxuICAgICAgICAgICAgcmVnaXN0cnlPdXREaXJQYXRoLFxuICAgICAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocmVnaXN0cnlPdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUoc3RhZ2luZ0RpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHN0YWdpbmdEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocmVnaXN0cnlPdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVnaXN0cnlPdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGF3YWl0IHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZXMpO1xuICBjb25zb2xlLmluZm8oXG4gICAgYEVuc3VyZSB0aGUgRG9ja2VyZmlsZSBDT1BZcyAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIG91dERpclBhdGgpfS8gYW5kICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0vIGludG8gdGhlIGltYWdlIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcy5gXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RQcml2YXRlUGFja2FnZXMoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIG1hbmlmZXN0UGFja2FnZUpzb25zOiBQYWNrYWdlSnNvbltdLFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPj4ge1xuICBjb25zdCBwcml2YXRlUGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KCk7XG4gIC8vIFNlZWQgZnJvbSBldmVyeSBtYW5pZmVzdCAocm9vdCArIHdvcmtzcGFjZXMpOyBvbmUgcHJpdmF0ZSBwYWNrYWdlIG1heSBiZSByZXF1ZXN0ZWQgYnkgc2V2ZXJhbFxuICAvLyBtYW5pZmVzdHMsIHNvIG1lcmdlIGR1cGxpY2F0ZXMgdGhlIHNhbWUgd2F5IG5lc3RlZCBkaXNjb3ZlcnkgZG9lcyDigJQga2VlcCB0aGUgbmFycm93ZXJcbiAgLy8gY29tcGF0aWJsZSByZXF1aXJlbWVudCBhbmQgZmFpbCBsb3VkbHkgb24gYSBnZW51aW5lIGNvbmZsaWN0LlxuICBjb25zdCBwYWNrYWdlc1RvUHJvY2VzczogUHJpdmF0ZVBhY2thZ2VbXSA9IFtdO1xuICBjb25zdCBxdWV1ZWRQYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4oKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvbiBvZiBtYW5pZmVzdFBhY2thZ2VKc29ucykge1xuICAgIGZvciAoY29uc3QgcmVxdWVzdGVkIG9mIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uLCBvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgICBjb25zdCBxdWV1ZWQgPSBxdWV1ZWRQYWNrYWdlcy5nZXQocmVxdWVzdGVkLm5hbWUpO1xuICAgICAgaWYgKCFxdWV1ZWQpIHtcbiAgICAgICAgcXVldWVkUGFja2FnZXMuc2V0KHJlcXVlc3RlZC5uYW1lLCByZXF1ZXN0ZWQpO1xuICAgICAgICBwYWNrYWdlc1RvUHJvY2Vzcy5wdXNoKHJlcXVlc3RlZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgbmFycm93ZXIgPSBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChxdWV1ZWQsIHJlcXVlc3RlZCk7XG4gICAgICBpZiAobmFycm93ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChxdWV1ZWQsIHJlcXVlc3RlZCwgcGFja2FnZUpzb24ubmFtZSA/PyAnYSB3b3Jrc3BhY2UgbWFuaWZlc3QnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlZC52ZXJzaW9uU3BlY2lmaWVyID0gbmFycm93ZXIudmVyc2lvblNwZWNpZmllcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGFja2FnZXNUb1Byb2Nlc3MubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgcHJpdmF0ZVBhY2thZ2UgPSBwYWNrYWdlc1RvUHJvY2Vzc1tpbmRleF07XG4gICAgaWYgKCFwcml2YXRlUGFja2FnZSkgY29udGludWU7XG4gICAgaWYgKHByaXZhdGVQYWNrYWdlcy5oYXMocHJpdmF0ZVBhY2thZ2UubmFtZSkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHByaXZhdGVQYWNrYWdlLmtpbmQgPT09ICdnaXQnKSB7XG4gICAgICBwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbnN0YWxsZWQgPSBmaW5kSW5zdGFsbGVkUmVnaXN0cnlQYWNrYWdlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZSk7XG4gICAgICBwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoID0gaW5zdGFsbGVkPy5kaXJQYXRoO1xuICAgICAgcHJpdmF0ZVBhY2thZ2UucmVzb2x2ZWRWZXJzaW9uID0gaW5zdGFsbGVkPy52ZXJzaW9uO1xuICAgIH1cbiAgICAvLyBTZWxlY3RlZCBCRUZPUkUgdGhlIGRlZXAgc2NhbjogYSBtYW5pZmVzdCBpbnNpZGUgdGhlIHBhY2thZ2UgbWF5IHJlZmVyIGJhY2sgdG8gdGhlIHBhY2thZ2VcbiAgICAvLyBpdHNlbGYsIGFuZCB0aGF0IHJlcXVpcmVtZW50IG11c3QgYmUgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHNlbGVjdGlvbiAoYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3RcbiAgICAvLyBiZWxvdyksIG5ldmVyIG5hcnJvdyB0aGUgYWxyZWFkeS1zZWxlY3RlZCBzcGVjaWZpZXIuXG4gICAgcHJpdmF0ZVBhY2thZ2VzLnNldChwcml2YXRlUGFja2FnZS5uYW1lLCBwcml2YXRlUGFja2FnZSk7XG4gICAgLy8gTmVzdGVkIHByaXZhdGUgZGVwZW5kZW5jaWVzIG9mIGFuIGluc3RhbGxlZCBwYWNrYWdlIGFyZSBkaXNjb3ZlcmFibGUgcmlnaHQgYXdheTsgcmVnaXN0cnlcbiAgICAvLyBwYWNrYWdlcyB3aXRob3V0IGEgdXNhYmxlIGluc3RhbGxlZCBjb3B5IGFyZSBpbnNwZWN0ZWQgYWZ0ZXIgZG93bmxvYWQgaW5zdGVhZFxuICAgIC8vIChjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKS5cbiAgICBpZiAocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCkge1xuICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoKTtcbiAgICAgICAgZm9yIChjb25zdCBuZXN0ZWQgb2YgZmluZFByaXZhdGVEZXBlbmRlbmNpZXMocGFja2FnZUpzb24sIG91dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBxdWV1ZWQgPSBxdWV1ZWRQYWNrYWdlcy5nZXQobmVzdGVkLm5hbWUpO1xuICAgICAgICAgIGlmICghcXVldWVkKSB7XG4gICAgICAgICAgICBxdWV1ZWRQYWNrYWdlcy5zZXQobmVzdGVkLm5hbWUsIG5lc3RlZCk7XG4gICAgICAgICAgICBwYWNrYWdlc1RvUHJvY2Vzcy5wdXNoKG5lc3RlZCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByaXZhdGVQYWNrYWdlcy5oYXMobmVzdGVkLm5hbWUpKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IG1hdGVyaWFsaXplZCAob3Igc2VsZWN0ZWQpOiB0aGUgcmVxdWlyZW1lbnQgbXVzdCBhZG1pdCB0aGF0IHNlbGVjdGlvbi5cbiAgICAgICAgICAgIGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0KHF1ZXVlZCwgbmVzdGVkLCBwcml2YXRlUGFja2FnZS5uYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU3RpbGwgcXVldWVkOiBrZWVwIHRoZSBOQVJST1dFUiBjb21wYXRpYmxlIHJlcXVpcmVtZW50IHNvIGRpc2NvdmVyeSBvcmRlciBjYW5ub3RcbiAgICAgICAgICAgIC8vIHR1cm4gY29tcGF0aWJsZSBjb25zdHJhaW50cyAoZS5nLiBgXjEuMC4wYCBhbmQgYDEuMi4zYCkgaW50byBhIHNwdXJpb3VzIGNvbmZsaWN0LlxuICAgICAgICAgICAgY29uc3QgbmFycm93ZXIgPSBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChxdWV1ZWQsIG5lc3RlZCk7XG4gICAgICAgICAgICBpZiAobmFycm93ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChxdWV1ZWQsIG5lc3RlZCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBxdWV1ZWQudmVyc2lvblNwZWNpZmllciA9IG5hcnJvd2VyLnZlcnNpb25TcGVjaWZpZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHByaXZhdGVQYWNrYWdlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgZXh0cmFjdGVkUGFja2FnZTogUHJpdmF0ZVBhY2thZ2UsXG4gIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+LFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nLFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIHN0aWxsIGxpdmUgaW4gdGhlIHN0YWdpbmcgZGlyZWN0b3J5IGF0IHRoaXMgcG9pbnQgKHRoZXkgYXJlIHN3YXBwZWQgaW50b1xuICAvLyBwbGFjZSBvbmx5IGFmdGVyIGV2ZXJ5IGRvd25sb2FkIHN1Y2NlZWRlZCk7IGdpdCBwYWNrYWdlcyBhcmUgY29waWVkIHN0cmFpZ2h0IHRvIHRoZWlyIGZpbmFsXG4gIC8vIGxvY2F0aW9uLCBzbyB0aGVpciBtYW5pZmVzdCBtdXN0IGJlIHJlYWQgdGhlcmUuXG4gIGNvbnN0IGV4dHJhY3RlZERpclBhdGggPVxuICAgIGV4dHJhY3RlZFBhY2thZ2Uua2luZCA9PT0gJ3JlZ2lzdHJ5J1xuICAgICAgPyB0b1N0YWdlZFBhdGgoZXh0cmFjdGVkUGFja2FnZS50YXJnZXREaXJQYXRoKVxuICAgICAgOiBleHRyYWN0ZWRQYWNrYWdlLnRhcmdldERpclBhdGg7XG4gIC8vIFNjYW4gRVZFUlkgbWFuaWZlc3Qgb2YgdGhlIG1hdGVyaWFsaXplZCBwYWNrYWdlIChvcmcgZ2l0IGRlcGVuZGVuY2llcyBhcmUgd2hvbGUgbW9ub3JlcG9cbiAgLy8gY2hlY2tvdXRzIHdpdGggcGFja2FnZXMvKi9wYWNrYWdlLmpzb24pLCBtaXJyb3JpbmcgY29sbGVjdFByaXZhdGVQYWNrYWdlcycgZGVlcCBzY2FuIOKAlCB0aGVcbiAgLy8gZGVwZW5kZW5jeS1yZXdyaXRlIHN0ZXAgd2Fsa3MgdGhlIHNhbWUgc2V0LCBzbyBhbnl0aGluZyBkZWNsYXJlZCB0aGVyZSBtdXN0IGJlIG1hdGVyaWFsaXplZC5cbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoZXh0cmFjdGVkRGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgICAgIGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nLmtpbmQgPT09ICdyZWdpc3RyeScgJiYgIWV4aXN0aW5nLnNvdXJjZURpclBhdGggJiYgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTdGlsbCBhd2FpdGluZyBpdHMgZG93bmxvYWQgKG5vIGluc3RhbGxlZCBjb3B5IHNlbGVjdGVkLCBub3RoaW5nIGV4dHJhY3RlZCB5ZXQpOiBrZWVwXG4gICAgICAgICAgLy8gdGhlIE5BUlJPV0VSIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQsIGV4YWN0bHkgYXMgY29sbGVjdFByaXZhdGVQYWNrYWdlcyBkb2VzIGZvclxuICAgICAgICAgIC8vIHF1ZXVlZCBwYWNrYWdlcywgc28gbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBjb25zdHJhaW50cyBjYW5ub3QgZmFicmljYXRlIGNvbmZsaWN0cy5cbiAgICAgICAgICBjb25zdCBuYXJyb3dlciA9IG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KGV4aXN0aW5nLCBuZXN0ZWQpO1xuICAgICAgICAgIGlmIChuYXJyb3dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID0gbmFycm93ZXIudmVyc2lvblNwZWNpZmllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ29sbGFwc2luZyBkaWZmZXJlbnQgcmVxdWVzdGVkIHZlcnNpb25zIGludG8gb25lIG1hdGVyaWFsaXphdGlvbiB3b3VsZCBzaWxlbnRseVxuICAgICAgICAgIC8vIHZpb2xhdGUgdGhlIGRlcGVuZGVudCdzIHJlcXVpcmVtZW50LCBzbyBjb25mbGljdHMgbXVzdCBmYWlsIGxvdWRseS5cbiAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVzdGVkLmtpbmQgPT09ICdnaXQnKSB7XG4gICAgICAgIG5lc3RlZC5zb3VyY2VEaXJQYXRoID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGgsIG5lc3RlZC5uYW1lKTtcbiAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgbmVzdGVkLnRhcmdldERpclBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW5zdGFsbGVkID0gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShyb290RGlyUGF0aCwgbmVzdGVkKTtcbiAgICAgICAgbmVzdGVkLnNvdXJjZURpclBhdGggPSBpbnN0YWxsZWQ/LmRpclBhdGg7XG4gICAgICAgIG5lc3RlZC5yZXNvbHZlZFZlcnNpb24gPSBpbnN0YWxsZWQ/LnZlcnNpb247XG4gICAgICAgIGlmIChuZXN0ZWQuc291cmNlRGlyUGF0aCkge1xuICAgICAgICAgIGF3YWl0IGNvcHlJbnN0YWxsZWRQYWNrYWdlKHJvb3REaXJQYXRoLCBuZXN0ZWQsIHRvU3RhZ2VkUGF0aChuZXN0ZWQudGFyZ2V0RGlyUGF0aCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgICBuZXN0ZWQubmFtZSxcbiAgICAgICAgICAgIG5lc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/ICdsYXRlc3QnLFxuICAgICAgICAgICAgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgbmVzdGVkLnJlc29sdmVkVmVyc2lvbiA9IHJlYWRJbnN0YWxsZWRWZXJzaW9uKHRvU3RhZ2VkUGF0aChuZXN0ZWQudGFyZ2V0RGlyUGF0aCksIG5lc3RlZC5uYW1lKTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYERvd25sb2FkZWQgJHtuZXN0ZWQubmFtZX0gKG5lc3RlZCBkZXBlbmRlbmN5KSB0byAke25lc3RlZC50YXJnZXREaXJQYXRofWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5lc3RlZC5uYW1lLCBuZXN0ZWQpO1xuICAgICAgYXdhaXQgY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcyhcbiAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2VzLFxuICAgICAgICBvdXREaXJQYXRoLFxuICAgICAgICByZWdpc3RyeU91dERpclBhdGgsXG4gICAgICAgIHRvU3RhZ2VkUGF0aFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIGBkZXN0aW5hdGlvbkRpclBhdGhgIG1heSBkaWZmZXIgZnJvbSBgdGFyZ2V0RGlyUGF0aGAgd2hpbGUgcmVnaXN0cnkgcGFja2FnZXMgc3RhZ2UuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5SW5zdGFsbGVkUGFja2FnZShcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2U6IFByaXZhdGVQYWNrYWdlLFxuICBkZXN0aW5hdGlvbkRpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgcmVnaXN0cnkgcGFja2FnZSdzIHRhcmJhbGwgbWF5IGxlZ2l0aW1hdGVseSBjb250YWluIG5vZGVfbW9kdWxlcy8gY29udGVudCB2aWFcbiAgLy8gYnVuZGxlZERlcGVuZGVuY2llczsgdGhvc2UgZmlsZXMgYXJlIHBhcnQgb2YgdGhlIGFydGlmYWN0IGFuZCBtdXN0IHN1cnZpdmUgdGhlIGNvcHkuIEdpdFxuICAvLyBjaGVja291dHMgKGFuZCBub24tYnVuZGxlZCBuYW1lcykgc3RpbGwgZXhjbHVkZSBub2RlX21vZHVsZXMsIHdoaWNoIGhvbGRzIGxvY2FsbHkgaW5zdGFsbGVkXG4gIC8vIGRlcGVuZGVuY2llcyB0aGVyZS5cbiAgY29uc3QgYnVuZGxlZERlcGVuZGVuY3lOYW1lcyA9XG4gICAgcHJpdmF0ZVBhY2thZ2Uua2luZCA9PT0gJ3JlZ2lzdHJ5JyA/IHJlYWRCdW5kbGVkRGVwZW5kZW5jeU5hbWVzKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghKSA6IFtdO1xuICBhd2FpdCBmcy5wcm9taXNlcy5jcChwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoISwgZGVzdGluYXRpb25EaXJQYXRoLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIGZvcmNlOiB0cnVlLFxuICAgIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciBleHBvc2VzIGluc3RhbGxlZCBwYWNrYWdlcyB0aHJvdWdoIHN5bWxpbmtzOyB0aGUgbWF0ZXJpYWxpemVkIHRyZWVcbiAgICAvLyBtdXN0IGNvbnRhaW4gcmVhbCBmaWxlcyAoYSBjb3BpZWQgYWJzb2x1dGUgc3ltbGluayB3b3VsZCBkYW5nbGUgaW5zaWRlIHRoZSBEb2NrZXIgaW1hZ2UsXG4gICAgLy8gYW5kIGxhdGVyIGRlcGVuZGVuY3kgcmV3cml0aW5nIHdvdWxkIHdyaXRlIHRocm91Z2ggaXQgaW50byB0aGUgc2hhcmVkIHN0b3JlKS5cbiAgICBkZXJlZmVyZW5jZTogdHJ1ZSxcbiAgICBmaWx0ZXI6IChzcmMpID0+IHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5yZWxhdGl2ZShwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoISwgc3JjKS5zcGxpdChwYXRoLnNlcCk7XG4gICAgICBpZiAoc2VnbWVudHMuaW5jbHVkZXMoJy5naXQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgbm9kZU1vZHVsZXNJbmRleCA9IHNlZ21lbnRzLmluZGV4T2YoJ25vZGVfbW9kdWxlcycpO1xuICAgICAgaWYgKG5vZGVNb2R1bGVzSW5kZXggPT09IC0xKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChidW5kbGVkRGVwZW5kZW5jeU5hbWVzID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChidW5kbGVkRGVwZW5kZW5jeU5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gVGhlIG5vZGVfbW9kdWxlcyAoYW5kIEBzY29wZSkgZGlyZWN0b3JpZXMgdGhlbXNlbHZlcyBtdXN0IGNvcHkgc28gYnVuZGxlZCBzdWJ0cmVlcyBjYW47XG4gICAgICAvLyBvbmx5IHRoZSBmaXJzdCBub2RlX21vZHVsZXMgbGV2ZWwgZmlsdGVycyDigJQgYW55dGhpbmcgaW5zaWRlIGEgYnVuZGxlZCBzdWJ0cmVlIGJlbG9uZ3MgdG9cbiAgICAgIC8vIHRoZSBhcnRpZmFjdCwgaW5jbHVkaW5nIGl0cyBvd24gbmVzdGVkIG5vZGVfbW9kdWxlcy5cbiAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHNlZ21lbnRzLnNsaWNlKG5vZGVNb2R1bGVzSW5kZXggKyAxKTtcbiAgICAgIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChmaXJzdC5zdGFydHNXaXRoKCdAJykgJiYgc2Vjb25kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMuc29tZSgobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKGAke2ZpcnN0fS9gKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGZpcnN0LnN0YXJ0c1dpdGgoJ0AnKSA/IGAke2ZpcnN0fS8ke3NlY29uZH1gIDogZmlyc3Q7XG4gICAgICByZXR1cm4gYnVuZGxlZERlcGVuZGVuY3lOYW1lcy5pbmNsdWRlcyhwYWNrYWdlTmFtZSk7XG4gICAgfSxcbiAgfSk7XG4gIGNvbnNvbGUuaW5mbyhgQ29waWVkICR7cHJpdmF0ZVBhY2thZ2UubmFtZX0gdG8gJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKX1gKTtcbn1cblxuLyoqIERlY2xhcmVkIGJ1bmRsZWQgZGVwZW5kZW5jeSBuYW1lcyBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2U7IGB0cnVlYCBidW5kbGVzIGV2ZXJ5IGRlcGVuZGVuY3kuICovXG5mdW5jdGlvbiByZWFkQnVuZGxlZERlcGVuZGVuY3lOYW1lcyhzb3VyY2VEaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB8IHRydWUge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHNvdXJjZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgICAgYnVuZGxlRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfCBib29sZWFuO1xuICAgICAgYnVuZGxlZERlcGVuZGVuY2llcz86IHN0cmluZ1tdIHwgYm9vbGVhbjtcbiAgICB9O1xuICAgIGNvbnN0IGJ1bmRsZWQgPSBwYWNrYWdlSnNvbi5idW5kbGVEZXBlbmRlbmNpZXMgPz8gcGFja2FnZUpzb24uYnVuZGxlZERlcGVuZGVuY2llcztcbiAgICBpZiAoYnVuZGxlZCA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYnVuZGxlZCkgPyBidW5kbGVkLmZpbHRlcigobmFtZSkgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSA6IFtdO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgbWF0ZXJpYWxpemF0aW9uIGZvciBgZXhpc3RpbmdgIGlzIGFscmVhZHkgc2VsZWN0ZWQgKGEgcmFuZ2UgcmVzb2x2ZXMgbWF4LXNhdGlzZnlpbmcgYWdhaW5zdFxuICogdGhlIHJlZ2lzdHJ5IOKAlCBzZWUgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKSwgc28gYWNjZXB0IGByZXF1ZXN0ZWRgIG9ubHkgd2hlbiBpdCBpc1xuICogZ3VhcmFudGVlZCBzYXRpc2ZpZWQ6IGBleGlzdGluZ2AgbXVzdCBiZSBhIHN1YnNldCBvZiBpdCAoZXZlcnkgcG9zc2libGUgcmVzb2x1dGlvbiBvZiBgZXhpc3RpbmdgXG4gKiB0aGVuIHNhdGlzZmllcyBgcmVxdWVzdGVkYCkuIE5vbi1yYW5nZSBzcGVjaWZpZXJzIChkaXN0LXRhZ3MsIGdpdCBVUkxzL3JldmlzaW9ucykgbXVzdCBtYXRjaFxuICogZXhhY3RseS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QoZXhpc3Rpbmc6IFByaXZhdGVQYWNrYWdlLCByZXF1ZXN0ZWQ6IFByaXZhdGVQYWNrYWdlLCBkZXBlbmRlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXN0aW5nLmtpbmQgPT09IHJlcXVlc3RlZC5raW5kKSB7XG4gICAgaWYgKGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPT09IHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSByZXR1cm47XG4gICAgaWYgKHNwZWNpZmllclN1YnNldChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyLCByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikpIHJldHVybjtcbiAgICAvLyBPbmNlIHRoZSBjb25jcmV0ZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBpcyBrbm93biAoaW5zdGFsbGVkIGNvcHkgb3IgZXh0cmFjdGVkIGRvd25sb2FkKSwgYVxuICAgIC8vIHJlcXVpcmVtZW50IGl0IHNhdGlzZmllcyBpcyBjb21wYXRpYmxlIGV2ZW4gd2hlbiB0aGUgb3JpZ2luYWwgc3BlY2lmaWVycyBhcmUgbm90IHN1YnNldHNcbiAgICAvLyAoZS5nLiBgXjEuMC4wYCByZXNvbHZlZCB0byAxLjIuMyBhbHNvIHNhdGlzZmllcyBhIGxhdGVyIGV4YWN0IGAxLjIuM2ApLlxuICAgIGlmIChcbiAgICAgIGV4aXN0aW5nLnJlc29sdmVkVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YWxsZWRWZXJzaW9uU2F0aXNmaWVzKHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyLCBleGlzdGluZy5yZXNvbHZlZFZlcnNpb24pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDb25mbGljdGluZyByZXF1aXJlbWVudHMgZm9yICR7ZXhpc3RpbmcubmFtZX06IGAgK1xuICAgICAgYCR7ZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA/PyBleGlzdGluZy5raW5kfSBpcyBhbHJlYWR5IHNlbGVjdGVkLCBidXQgJHtkZXBlbmRlbnROYW1lfSByZXF1aXJlcyBgICtcbiAgICAgIGAke3JlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/IHJlcXVlc3RlZC5raW5kfS4gT25seSBhIHNpbmdsZSB2ZXJzaW9uIHBlciBwcml2YXRlIHBhY2thZ2UgaXMgc3VwcG9ydGVkLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBzeW1saW5rcyBpbiB0aGUgZGVlcGVzdCBFWElTVElORyBhbmNlc3RvciBvZiB0aGUgcGF0aCBhbmQgcmVhdHRhY2hlcyB0aGUgbm90LXlldFxuICogZXhpc3RpbmcgcmVtYWluZGVyLCBzbyBsZXhpY2FsIGNvbnRhaW5tZW50L292ZXJsYXAgY2hlY2tzIG9wZXJhdGUgb24gcGh5c2ljYWwgbG9jYXRpb25zLlxuICovXG5mdW5jdGlvbiBjYW5vbmljYWxpemVQYXRoKHRhcmdldFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBleGlzdGluZ1BhdGggPSBwYXRoLnJlc29sdmUodGFyZ2V0UGF0aCk7XG4gIGNvbnN0IHJlbWFpbmRlclNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMoZXhpc3RpbmdQYXRoKSkge1xuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoZXhpc3RpbmdQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gZXhpc3RpbmdQYXRoKSBicmVhaztcbiAgICByZW1haW5kZXJTZWdtZW50cy51bnNoaWZ0KHBhdGguYmFzZW5hbWUoZXhpc3RpbmdQYXRoKSk7XG4gICAgZXhpc3RpbmdQYXRoID0gcGFyZW50UGF0aDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXRoLmpvaW4oZnMucmVhbHBhdGhTeW5jKGV4aXN0aW5nUGF0aCksIC4uLnJlbWFpbmRlclNlZ21lbnRzKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh0YXJnZXRQYXRoKTtcbiAgfVxufVxuXG4vKiogV2hldGhlciB0aGUgdHdvIHBhdGhzIGFyZSBlcXVhbCBvciBvbmUgY29udGFpbnMgdGhlIG90aGVyLiAqL1xuZnVuY3Rpb24gcGF0aHNPdmVybGFwKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYSwgYikgfHwgaXNFcXVhbE9yQW5jZXN0b3JQYXRoKGIsIGEpO1xufVxuXG5mdW5jdGlvbiBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYW5jZXN0b3JQYXRoOiBzdHJpbmcsIGRlc2NlbmRhbnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShhbmNlc3RvclBhdGgsIGRlc2NlbmRhbnRQYXRoKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aCA9PT0gJycgfHwgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTdWJkaXJlY3Rvcnkocm9vdERpclBhdGg6IHN0cmluZywgb3V0RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIG91dERpclBhdGgpO1xuICBpZiAocmVsYXRpdmVQYXRoICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpIHJldHVybjtcblxuICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCBkaXJlY3RvcnkgbXVzdCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCByb290OiAke291dERpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3REaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB1bnNjb3BlZE5hbWUgPSB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpO1xuICAvLyByZWFscGF0aFN5bmMgcmVzb2x2ZXMgdGhlIGlzb2xhdGVkIGxpbmtlcidzIHN5bWxpbmsgc28gY29waWVzIHJlYWQgKGFuZCB0aGUgY29weSBmaWx0ZXJcbiAgLy8gY29tcHV0ZXMgcmVsYXRpdmUgcGF0aHMgYWdhaW5zdCkgdGhlIGFjdHVhbCBwYWNrYWdlIGRpcmVjdG9yeS5cbiAgY29uc3QgZGlyZWN0RGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICdAd2lsbGJvb3N0ZXInLCB1bnNjb3BlZE5hbWUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyZWN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHJldHVybiBmcy5yZWFscGF0aFN5bmMoZGlyZWN0RGlyUGF0aCk7XG4gIH1cbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIGtlZXBzIHRyYW5zaXRpdmUtb25seSBkZXBlbmRlbmNpZXMgb3V0IG9mIHRoZSByb290IG5vZGVfbW9kdWxlcztcbiAgLy8gc2VhcmNoIHRoZSAuYnVuIHN0b3JlIGZvciB0aGUgcGFja2FnZSBiZWZvcmUgZ2l2aW5nIHVwLiBUaGUgc3RvcmUgbWF5IGxlZ2l0aW1hdGVseSBob2xkXG4gIC8vIE1VTFRJUExFIHJlc29sdXRpb25zIG9mIG9uZSBwYWNrYWdlIChkaWZmZXJlbnQgdmVyc2lvbnMvcmV2aXNpb25zKSwgYW5kIHBpY2tpbmcgYW4gYXJiaXRyYXJ5XG4gIC8vIG9uZSBjb3VsZCBzaWxlbnRseSBtYXRlcmlhbGl6ZSB0aGUgd3JvbmcgY29udGVudCDigJQgc28gYW1iaWd1aXR5IGZhaWxzIGxvdWRseS5cbiAgY29uc3QgYnVuU3RvcmVEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5idW4nKTtcbiAgY29uc3QgY2FuZGlkYXRlRGlyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBmcy5yZWFkZGlyU3luYyhidW5TdG9yZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgICAgY29uc3QgY2FuZGlkYXRlRGlyUGF0aCA9IHBhdGguam9pbihidW5TdG9yZURpclBhdGgsIGRpcmVudC5uYW1lLCAnbm9kZV9tb2R1bGVzJywgJ0B3aWxsYm9vc3RlcicsIHVuc2NvcGVkTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY2FuZGlkYXRlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICBjYW5kaWRhdGVEaXJQYXRocy5hZGQoZnMucmVhbHBhdGhTeW5jKGNhbmRpZGF0ZURpclBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vIC5idW4gc3RvcmUgKGhvaXN0ZWQgaW5zdGFsbCk7IGZhbGwgdGhyb3VnaCB0byB0aGUgZXJyb3IgYmVsb3cuXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZURpclBhdGhzLnNpemUgPT09IDEpIHJldHVybiBbLi4uY2FuZGlkYXRlRGlyUGF0aHNdWzBdITtcbiAgaWYgKGNhbmRpZGF0ZURpclBhdGhzLnNpemUgPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE11bHRpcGxlIGluc3RhbGxlZCByZXNvbHV0aW9ucyBmb3VuZCBmb3IgJHtwYWNrYWdlTmFtZX06ICR7Wy4uLmNhbmRpZGF0ZURpclBhdGhzXS5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICdEZWR1cGxpY2F0ZSB0aGUgZGVwZW5kZW5jeSBzbyBhIHNpbmdsZSByZXNvbHV0aW9uIHJlbWFpbnMuJ1xuICAgICk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJHtwYWNrYWdlTmFtZX0gKCR7ZGlyZWN0RGlyUGF0aH0pYCk7XG59XG5cbi8qKlxuICogVGhlIGluc3RhbGxlZCBtYXRlcmlhbGl6YXRpb24gb2YgYSByZWdpc3RyeSBwYWNrYWdlLCB3aGVuIGl0cyB2ZXJzaW9uIGlzIHN0YXRpY2FsbHkga25vd24gdG9cbiAqIHNhdGlzZnkgdGhlIHNwZWNpZmllciDigJQgc3RlcHMgd2l0aG91dCByZWdpc3RyeSBjcmVkZW50aWFscyAoZS5nLiBDSSB0ZXN0IHN0ZXBzLCB3aGljaFxuICogZGVsaWJlcmF0ZWx5IHJlY2VpdmUgbm8gVmVyZGFjY2lvIHRva2VuKSByZXVzZSBpdCBpbnN0ZWFkIG9mIGRvd25sb2FkaW5nLiBSZXR1cm5zIHVuZGVmaW5lZFxuICogKGZhbGxpbmcgYmFjayB0byBhIGRvd25sb2FkKSB3aGVuIG5vIHVuYW1iaWd1b3VzbHkgY29ycmVjdCBpbnN0YWxsZWQgY29weSBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbnN0YWxsZWRSZWdpc3RyeVBhY2thZ2UoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHByaXZhdGVQYWNrYWdlOiBQcml2YXRlUGFja2FnZVxuKTogeyBkaXJQYXRoOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3BlY2lmaWVyID0gcHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JztcbiAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5qb2luKCdub2RlX21vZHVsZXMnLCAuLi5wcml2YXRlUGFja2FnZS5uYW1lLnNwbGl0KCcvJykpO1xuICBjb25zdCBhZGRDYW5kaWRhdGUgPSAoY2FuZGlkYXRlczogTWFwPHN0cmluZywgc3RyaW5nPiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJlYWRJbnN0YWxsZWRWZXJzaW9uKGRpclBhdGgsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgIGlmICh2ZXJzaW9uICYmIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyLCB2ZXJzaW9uKSkgY2FuZGlkYXRlcy5zZXQoZnMucmVhbHBhdGhTeW5jKGRpclBhdGgpLCB2ZXJzaW9uKTtcbiAgfTtcbiAgLy8gQSByb290LWxldmVsIGluc3RhbGxhdGlvbiBpcyBUSEUgbG9ja2ZpbGUgcmVzb2x1dGlvbiBmb3IgdGhlIHJvb3QgZGVwZW5kZW5jeTsgdGhlIC5idW4gc3RvcmVcbiAgLy8gaXMgY29uc3VsdGVkIG9ubHkgZm9yIHRyYW5zaXRpdmUtb25seSBwYWNrYWdlcywgd2hlcmUgbXVsdGlwbGUgc2F0aXNmeWluZyByZXNvbHV0aW9ucyBtYXlcbiAgLy8gY29leGlzdCBhbmQgcGlja2luZyBvbmUgYXJiaXRyYXJpbHkgY291bGQgbWF0ZXJpYWxpemUgdGhlIHdyb25nIGNvbnRlbnQuXG4gIGNvbnN0IGRpcmVjdENhbmRpZGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBhZGRDYW5kaWRhdGUoZGlyZWN0Q2FuZGlkYXRlcywgcGF0aC5qb2luKHJvb3REaXJQYXRoLCByZWxhdGl2ZURpclBhdGgpKTtcbiAgaWYgKGRpcmVjdENhbmRpZGF0ZXMuc2l6ZSA9PT0gMSkgcmV0dXJuIHRvU2luZ2xlQ2FuZGlkYXRlKGRpcmVjdENhbmRpZGF0ZXMpO1xuXG4gIGNvbnN0IHN0b3JlQ2FuZGlkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZnMucmVhZGRpclN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5idW4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBhZGRDYW5kaWRhdGUoc3RvcmVDYW5kaWRhdGVzLCBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicsIGRpcmVudC5uYW1lLCByZWxhdGl2ZURpclBhdGgpKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vIC5idW4gc3RvcmUgKGhvaXN0ZWQgaW5zdGFsbCk7IGZhbGwgYmFjayB0byBkb3dubG9hZGluZy5cbiAgfVxuICByZXR1cm4gdG9TaW5nbGVDYW5kaWRhdGUoc3RvcmVDYW5kaWRhdGVzKTtcbn1cblxuZnVuY3Rpb24gdG9TaW5nbGVDYW5kaWRhdGUoY2FuZGlkYXRlczogTWFwPHN0cmluZywgc3RyaW5nPik6IHsgZGlyUGF0aDogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IFtlbnRyeV0gPSBjYW5kaWRhdGVzO1xuICByZXR1cm4gY2FuZGlkYXRlcy5zaXplID09PSAxICYmIGVudHJ5ID8geyBkaXJQYXRoOiBlbnRyeVswXSwgdmVyc2lvbjogZW50cnlbMV0gfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVhZEluc3RhbGxlZFZlcnNpb24oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSBwYWNrYWdlTmFtZSAmJiB0eXBlb2YgcGFja2FnZUpzb24udmVyc2lvbiA9PT0gJ3N0cmluZydcbiAgICAgID8gcGFja2FnZUpzb24udmVyc2lvblxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFByaXZhdGVEZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJpdmF0ZVBhY2thZ2VbXSB7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4oKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBjb25zdCBpc0dpdCA9IGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpO1xuICAgICAgaWYgKCFpc0dpdCAmJiAhaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKSkgY29udGludWU7XG4gICAgICBpZiAoaXNHaXQgJiYgIW5hbWUuc3RhcnRzV2l0aCgnQHdpbGxib29zdGVyLycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJpdmF0ZSBnaXQgZGVwZW5kZW5jeSBtdXN0IGJlIGFuIEB3aWxsYm9vc3RlciBwYWNrYWdlOiAke25hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1bnNjb3BlZE5hbWUgPSB0b1Vuc2NvcGVkUGFja2FnZU5hbWUobmFtZSk7XG4gICAgICAvLyBEZXBlbmRlbmN5IG5hbWVzIGJlY29tZSBleHRlcm5hbCBkYXRhIG9uY2UgbmVzdGVkIG1hbmlmZXN0cyBjb21lIGZyb20gZG93bmxvYWRlZFxuICAgICAgLy8gdGFyYmFsbHM7IHJlamVjdCBhbnl0aGluZyAocGF0aCBzZXBhcmF0b3JzLCBgLi5gLCBoaWRkZW4tZmlsZSBwcmVmaXhlcykgdGhhdCBjb3VsZFxuICAgICAgLy8gZXNjYXBlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRoZSBuYW1lIGlzIGpvaW5lZCBpbnRvIGJlZm9yZSBpdCBpcyByZWN1cnNpdmVseSBkZWxldGVkLlxuICAgICAgaWYgKCEvXltcXHcuLV0rJC8udGVzdCh1bnNjb3BlZE5hbWUpIHx8IHVuc2NvcGVkTmFtZS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByaXZhdGUgcGFja2FnZSBuYW1lOiAke25hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0ZWQ6IFByaXZhdGVQYWNrYWdlID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBraW5kOiBpc0dpdCA/ICdnaXQnIDogJ3JlZ2lzdHJ5JyxcbiAgICAgICAgc291cmNlRGlyUGF0aDogdW5kZWZpbmVkLFxuICAgICAgICByZXNvbHZlZFZlcnNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgdGFyZ2V0RGlyUGF0aDogcGF0aC5qb2luKGlzR2l0ID8gb3V0RGlyUGF0aCA6IHJlZ2lzdHJ5T3V0RGlyUGF0aCwgdW5zY29wZWROYW1lKSxcbiAgICAgICAgLy8gVGhlIGZ1bGwgZ2l0IHNwZWNpZmllciBpcyBwcmVzZXJ2ZWQgc28gZGl2ZXJnZW50IFVSTHMvcmV2aXNpb25zICgjYWJjIHZzICNkZWYpIGFyZVxuICAgICAgICAvLyBkZXRlY3RlZCBhcyBjb25mbGljdHMgaW5zdGVhZCBvZiBzaWxlbnRseSBjb2xsYXBzaW5nIGludG8gb25lIGNvcGllZCBwYWNrYWdlLlxuICAgICAgICB2ZXJzaW9uU3BlY2lmaWVyOiB2YWx1ZSBhcyBzdHJpbmcsXG4gICAgICB9O1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgcHJpdmF0ZVBhY2thZ2VzLnNldChuYW1lLCBleGlzdGluZyA/IG1lcmdlU2FtZU1hbmlmZXN0UmVxdWlyZW1lbnQoZXhpc3RpbmcsIHJlcXVlc3RlZCkgOiByZXF1ZXN0ZWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV07XG59XG5cbi8qKlxuICogQSBtYW5pZmVzdCBtYXkgbGVnaXRpbWF0ZWx5IHJlcXVlc3Qgb25lIHBhY2thZ2UgZnJvbSBzZXZlcmFsIGRlcGVuZGVuY3kgc2VjdGlvbnMgKGUuZy4gYW4gZXhhY3RcbiAqIGRldkRlcGVuZGVuY2llcyBwaW4gYWxvbmdzaWRlIGEgcGVlckRlcGVuZGVuY2llcyByYW5nZSkuIEtlZXAgdGhlIE5BUlJPV0VSIHJlcXVpcmVtZW50IOKAlCBpdHNcbiAqIG1heC1zYXRpc2Z5aW5nIHJlc29sdXRpb24gc2F0aXNmaWVzIHRoZSB3aWRlciBvbmUgYnkgZGVmaW5pdGlvbiAoYW4gZXhhY3QgcGluIGlzIHRoZSBuYXJyb3dlc3RcbiAqIHJhbmdlKSDigJQgYW5kIGZhaWwgbG91ZGx5IHdoZW4gdGhlIHJlcXVpcmVtZW50cyBnZW51aW5lbHkgZGl2ZXJnZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UpOiBQcml2YXRlUGFja2FnZSB7XG4gIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQoZXhpc3RpbmcsIHJlcXVlc3RlZCk7XG4gIGlmIChuYXJyb3dlcikgcmV0dXJuIG5hcnJvd2VyO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfSB3aXRoaW4gb25lIG1hbmlmZXN0OiBgICtcbiAgICAgIGAke2V4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPz8gZXhpc3Rpbmcua2luZH0gdnMgJHtyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciA/PyByZXF1ZXN0ZWQua2luZH0uYFxuICApO1xufVxuXG4vKipcbiAqIFRoZSByZXF1aXJlbWVudCB3aG9zZSBtYXgtc2F0aXNmeWluZyByZXNvbHV0aW9uIGlzIGd1YXJhbnRlZWQgdG8gc2F0aXNmeSB0aGUgb3RoZXIgKGFuIGV4YWN0XG4gKiBwaW4gaXMgdGhlIG5hcnJvd2VzdCByYW5nZSksIG9yIHVuZGVmaW5lZCB3aGVuIG5laXRoZXIgc3Vic3VtZXMgdGhlIG90aGVyLlxuICovXG5mdW5jdGlvbiBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChcbiAgZXhpc3Rpbmc6IFByaXZhdGVQYWNrYWdlLFxuICByZXF1ZXN0ZWQ6IFByaXZhdGVQYWNrYWdlXG4pOiBQcml2YXRlUGFja2FnZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChleGlzdGluZy5raW5kICE9PSByZXF1ZXN0ZWQua2luZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPT09IHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSByZXR1cm4gZXhpc3Rpbmc7XG4gIGlmIChzcGVjaWZpZXJTdWJzZXQoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciwgcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpKSByZXR1cm4gZXhpc3Rpbmc7XG4gIGlmIChzcGVjaWZpZXJTdWJzZXQocmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIsIGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIpKSByZXR1cm4gcmVxdWVzdGVkO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXBsYWNlUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT5cbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgaWYgKCFyZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25QYXRoLCBwYWNrYWdlSnNvbiwgcHJpdmF0ZVBhY2thZ2VzKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIGAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCB1bmRlZmluZWQsIDIpfVxcbmAsICd1dGY4Jyk7XG4gICAgICBjb25zb2xlLmluZm8oYFJld3JvdGUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgaW4gJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpfWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+XG4pOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBpZiAoIWlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRhcmdldFBhY2thZ2UgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCF0YXJnZXRQYWNrYWdlKSBjb250aW51ZTtcblxuICAgICAgZGVwZW5kZW5jaWVzW25hbWVdID0gYGZpbGU6JHtwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCB0YXJnZXRQYWNrYWdlLnRhcmdldERpclBhdGgpfWA7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblBhdGhzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRpclBhdGgpKSByZXR1cm4gW107XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoZGlyZW50Lm5hbWUgPT09ICdub2RlX21vZHVsZXMnIHx8IGRpcmVudC5uYW1lID09PSAnLmdpdCcpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHBhY2thZ2VKc29uUGF0aHMucHVzaCguLi4oYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoY2hpbGRQYXRoKSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUgPT09ICdwYWNrYWdlLmpzb24nKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goY2hpbGRQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IFByb21pc2U8UGFja2FnZUpzb24+IHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbn1cblxuZnVuY3Rpb24gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgvXkB3aWxsYm9vc3Rlcig/Oi1wcml2YXRlKT9cXC8vLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4pOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKGBbZHJ5LXJ1bl0gV291bGQgcmVjcmVhdGUgJHtvdXREaXJQYXRofWApO1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGhcbiAgICAgICAgPyBgW2RyeS1ydW5dIFdvdWxkIGNvcHkgJHtwcml2YXRlUGFja2FnZS5uYW1lfTogJHtwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRofWBcbiAgICAgICAgOiBwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0J1xuICAgICAgICAgID8gYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06IChpbnN0YWxsZWQgdW5kZXIgbm9kZV9tb2R1bGVzKWBcbiAgICAgICAgICA6IGBbZHJ5LXJ1bl0gV291bGQgZG93bmxvYWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfUAke3ByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXJ9IHRvICR7cHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aH1gXG4gICAgKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZXdyaXRlIGNvcGllZCBwcml2YXRlIGRlcGVuZGVuY2llcyB0byBmaWxlOi4uLzxuYW1lPmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQge1xuICBmaW5kRGVzY2VuZGFudFByb2plY3RzLFxuICBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIGdldEZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIHR5cGUgUHJvamVjdCxcbn0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyxcbn0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuaW1wb3J0IHsgY29sbGVjdE1hbmlmZXN0cywgbWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuL3NldHVwUHJpdmF0ZVBhY2thZ2VzLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IHNxbGl0ZUZpbGVQYXR0ZXJuID0gL1xcLig/OnNxbGl0ZTM/fGRiKSg/OlstLl0oPzpqb3VybmFsfHNobXx3YWwpKT8kL2k7XG5jb25zdCBkb2NrZXJCdWlsZENhY2hlUGF0aHMgPSBbXG4gICcuY2FjaGUnLFxuICAnLm15cHlfY2FjaGUnLFxuICAnLm5leHQvY2FjaGUnLFxuICAnLnBhcmNlbC1jYWNoZScsXG4gICcucHl0ZXN0X2NhY2hlJyxcbiAgJy5ydWZmX2NhY2hlJyxcbiAgJy50b3gnLFxuICAnLnR1cmJvJyxcbiAgJy52ZW52JyxcbiAgJy55YXJuL2NhY2hlJyxcbiAgJy55YXJuL2luc3RhbGwtc3RhdGUuZ3onLFxuICAnX19weWNhY2hlX18nLFxuICAnY292ZXJhZ2UnLFxuICAnbm9kZV9tb2R1bGVzLy5jYWNoZScsXG4gICdwbGF5d3JpZ2h0LXJlcG9ydCcsXG4gICdzdG9yeWJvb2stc3RhdGljJyxcbiAgJ3RhcmdldCcsXG4gICd0ZXN0LXJlc3VsdHMnLFxuXTtcbmNvbnN0IGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyA9IFsnKiovKi5weWMnLCAnKiovKi50c2J1aWxkaW5mbycsICcqKi9fX3B5Y2FjaGVfXyddO1xuY29uc3QgZ2VuZXJhdGVkU3FsaXRlRGlyTmFtZXMgPSBbJ3ByaXNtYScsICdkYicsICdkcml6emxlJ10gYXMgY29uc3Q7XG5jb25zdCBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMgPSBbJy9kYXRhJ10gYXMgY29uc3Q7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gTWF0ZXJpYWxpemUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgb24gdGhlIGhvc3QgZmlyc3Qgc28gdGhlIHBlci1wcm9qZWN0IHJld3JpdGUgYmVsb3cgcmVzb2x2ZXNcbiAgICAvLyB0aGVtIHRvIGZpbGU6IHBhdGhzIGFuZCB0aGUgRG9ja2VyIGJ1aWxkIG5lZWRzIG5vIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLiBPbmx5IGluIC0tb3V0c2lkZVxuICAgIC8vIG1vZGUgKHRoZSBpbi1pbWFnZSBzZWNvbmQgcGFzcyBoYXMgbm8gbm9kZV9tb2R1bGVzL3JlZ2lzdHJ5IHRvIG1hdGVyaWFsaXplIGZyb20pIGFuZCBvbmx5XG4gICAgLy8gd2hlbiBhIHByaXZhdGUgZGVwZW5kZW5jeSBpcyBhY3R1YWxseSBkZWNsYXJlZCwgc28gcmVwb3Mgd2l0aG91dCBvbmUgYXJlIHVudG91Y2hlZCDigJQgbm8gZW1wdHlcbiAgICAvLyBvdXRwdXQgZGlyZWN0b3JpZXMsIG5vIHNwdXJpb3VzIFwiQ09QWVwiIGhpbnQuIEZhaWx1cmVzIGFyZSBub24tZmF0YWwgYW5kIG5vbi1kZXN0cnVjdGl2ZTpcbiAgICAvLyBtYXRlcmlhbGl6ZSB0aHJvd3MgYmVmb3JlIGRlbGV0aW5nIGFueSBleGlzdGluZyBvdXRwdXQgKGFuZCBjbGVhbnMgdXAgaXRzIHN0YWdpbmcgb24gYSBmYWlsZWRcbiAgICAvLyBkb3dubG9hZCksIHNvIGEgcmVwbyBsYWNraW5nIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIGtlZXBzIGJ1aWxkaW5nIGV4YWN0bHkgYXMgYmVmb3JlLCB3aXRoIHRoZVxuICAgIC8vIHBlci1wcm9qZWN0IHJld3JpdGUgYmVsb3cgZW1pdHRpbmcgdGhlIGV4aXN0aW5nIFwicnVuIHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNcIiBoaW50LiBUaGlzXG4gICAgLy8ga2VlcHMgdGhlIHN0ZXAgYSBwdXJlIGNvbnZlbmllbmNlIHRoYXQgbGV0cyByZXBvc2l0b3JpZXMgZHJvcCB0aGUgZXhwbGljaXQgY29tbWFuZC5cbiAgICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHdvcmtzcGFjZSBzZXQgZnJvbSB0aGUgcmVwb3NpdG9yeSByb290IHNvIGEgcHJpdmF0ZSBkZXBlbmRlbmN5IGRlY2xhcmVkIGluXG4gICAgICAvLyBhbnkgc2libGluZyB3b3Jrc3BhY2UgaXMgbWF0ZXJpYWxpemVkIGV2ZW4gd2hlbiBvcHRpbWl6ZSBydW5zIGZyb20gYSBzdWJwYWNrYWdlIGRpcmVjdG9yeS5cbiAgICAgIGNvbnN0IHJvb3RQcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RzLnJvb3QuZGlyUGF0aCk7XG4gICAgICBjb25zdCBtYW5pZmVzdHMgPSBjb2xsZWN0TWFuaWZlc3RzKHJvb3RQcm9qZWN0cyA/PyBwcm9qZWN0cyk7XG4gICAgICBpZiAobWFuaWZlc3RzLnNvbWUoZGVjbGFyZXNQcml2YXRlRGVwZW5kZW5jeSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyhwcm9qZWN0cy5yb290LmRpclBhdGgsIG1hbmlmZXN0cywgeyBkcnlSdW46IEJvb2xlYW4oYXJndi5kcnlSdW4pIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBhdXRvLW1hdGVyaWFsaXplIHByaXZhdGUgcGFja2FnZXMgKCR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfSk7IGAgK1xuICAgICAgICAgICAgICAgICdydW4gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIGlmIHRoZSBEb2NrZXIgYnVpbGQgbmVlZHMgdGhlbS4gQ29udGludWluZy4nXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9wdGltaXplZFByb2plY3RzOiBQcm9qZWN0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdCwgcGFja2FnZUpzb24pO1xuICAgICAgY29uc3QgcmVtb3ZlZERldkRlcGVuZGVuY2llcyA9IG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uLCB7XG4gICAgICAgIHJlbW92ZVdiUG9zdGluc3RhbGw6ICFhcmd2Lm91dHNpZGUgJiYgcmVtb3ZlZERldkRlcGVuZGVuY2llcy5pbmNsdWRlcygnQHdpbGxib29zdGVyL3diJyksXG4gICAgICB9KTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgICAgYXdhaXQgd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMocGF0aC5qb2luKGRpc3REaXJQYXRoLCAnYmFzaCcpKTtcbiAgICAgIH1cbiAgICAgIG9wdGltaXplZFByb2plY3RzLnB1c2gocHJvamVjdCk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocHJvamVjdHMucm9vdC5wYWNrYWdlTWFuYWdlckNvbW1hbmQsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICAgIGF3YWl0IGNsZWFudXBEb2NrZXJCdWlsZEFydGlmYWN0cyhvcHRpbWl6ZWRQcm9qZWN0cyk7XG4gICAgfVxuICB9LFxufTtcblxuLyoqIFdoZXRoZXIgYW55IGRlcGVuZGVuY3kgc2VjdGlvbiBkZWNsYXJlcyBhIHByaXZhdGUgZ2l0IG9yIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCByZWdpc3RyeSBkZXBlbmRlbmN5LiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNQcml2YXRlRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5cy5zb21lKChrZXkpID0+IHtcbiAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XTtcbiAgICByZXR1cm4gKFxuICAgICAgZGVwcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBPYmplY3QuZW50cmllcyhkZXBzKS5zb21lKFxuICAgICAgICAoW25hbWUsIHZhbHVlXSkgPT4gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkgfHwgaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llcyhwcm9qZWN0OiBQcm9qZWN0LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llc0ZvckRpcihwcm9qZWN0LnJvb3REaXJQYXRoLCBwcm9qZWN0LmRpclBhdGgsIHBhY2thZ2VKc29uKTtcbn1cblxuZnVuY3Rpb24gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXNGb3JEaXIoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICBjb25zdCByZXdyaXR0ZW5EZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgaWYgKGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpKSB7XG4gICAgICAgIC8vIERvY2tlciBidWlsZHMgY2Fubm90IGFjY2VzcyBwcml2YXRlIFNTSCBVUkxzIHVubGVzcyBjcmVkZW50aWFscyBhcmUgZm9yd2FyZGVkLlxuICAgICAgICAvLyBUaGUgRG9ja2VyZmlsZSBjb3BpZXMgdGhvc2Ugd29ya3NwYWNlIHBhY2thZ2VzIGludG8gdGhlIGltYWdlIGluc3RlYWQuIE9ubHkgdGhlIG9yZydzXG4gICAgICAgIC8vIG93biBnaXQgZGVwZW5kZW5jaWVzIGFyZSByZXdyaXR0ZW4g4oCUIHRoZSBzaGFyZWQgcHJlZGljYXRlIG1hdGNoZXMgZXhhY3RseSB3aGF0XG4gICAgICAgIC8vIGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCBtYXRlcmlhbGl6ZXMsIHNvIG90aGVyIFNTSCBVUkxzIGFyZSBsZWZ0IHVuY2hhbmdlZCBpbnN0ZWFkXG4gICAgICAgIC8vIG9mIGJlaW5nIHBvaW50ZWQgYXQgbmV2ZXItbWF0ZXJpYWxpemVkIGxvY2FsIHBhdGhzLlxuICAgICAgICBkZXBzW25hbWVdID0gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIocm9vdERpclBhdGgsIHBhY2thZ2VEaXJQYXRoLCAnQHdpbGxib29zdGVyJywgbmFtZSk7XG4gICAgICAgIHJld3JpdHRlbkRlcGVuZGVuY2llcy5wdXNoKGAke2tleX0uJHtuYW1lfWApO1xuICAgICAgfSBlbHNlIGlmIChpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IG1hdGVyaWFsaXplZFZlcnNpb24gPSByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGgsIG5hbWUpO1xuICAgICAgICBpZiAobWF0ZXJpYWxpemVkVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gTGVhdmluZyB0aGUgcmVnaXN0cnkgc3BlY2lmaWVyIG1lYW5zIHRoZSBpbi1pbWFnZSBpbnN0YWxsIG5lZWRzIFZlcmRhY2Npb1xuICAgICAgICAgIC8vIGNyZWRlbnRpYWxzIOKAlCB0aGUgZmFpbHVyZSB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIGF2b2lkIOKAlCBzbyBzYXkgc28gb3V0IGxvdWQuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgJHtuYW1lfSBpcyBub3QgbWF0ZXJpYWxpemVkIHVuZGVyICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0vOyBydW4gXFxgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1xcYCBzbyB0aGUgRG9ja2VyIGJ1aWxkIGRvZXMgbm90IG5lZWQgcmVnaXN0cnkgY3JlZGVudGlhbHMuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIG1hdGVyaWFsaXplZCB2ZXJzaW9uIGlzIHN0YWxlIHdoZW4gdGhlIHNwZWNpZmllciAoYW4gZXhhY3QgdmVyc2lvbiBvciBhbnkgc2VtdmVyXG4gICAgICAgIC8vIHJhbmdlIGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCByZXNvbHZlcyBtYXgtc2F0aXNmeWluZyBhZ2FpbnN0IHRoZSByZWdpc3RyeSkgZG9lc1xuICAgICAgICAvLyBub3QgYWRtaXQgaXQuIERpc3QtdGFnIHNwZWNpZmllcnMgKGUuZy4gYDIwMjYtc3RhYmxlYCkgc2tpcCB0aGUgc3RhbGVuZXNzIGNoZWNrLlxuICAgICAgICBpZiAoIW1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXModmFsdWUsIG1hdGVyaWFsaXplZFZlcnNpb24pKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAgICAgYE1hdGVyaWFsaXplZCAke25hbWV9IGlzICR7bWF0ZXJpYWxpemVkVmVyc2lvbn0gYnV0IHBhY2thZ2UuanNvbiByZXF1aXJlcyAke3ZhbHVlfTsgcmVydW4gXFxgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1xcYC5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVnaXN0cnkgcGFja2FnZXMgdGhhdCBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgbWF0ZXJpYWxpemVkIG9uIHRoZSBob3N0IGFyZSB1c2VkIGFzXG4gICAgICAgIC8vIGxvY2FsIHBhdGhzIHNvIGltYWdlIGJ1aWxkcyBuZWVkIG5vIFZlcmRhY2NpbyBjcmVkZW50aWFsczsgdGhlIENPTU1JVFRFRCBwYWNrYWdlLmpzb25cbiAgICAgICAgLy8ga2VlcHMgdGhlIHJlZ2lzdHJ5IHNwZWNpZmllciDigJQgb25seSB0aGUgZ2VuZXJhdGVkIChkaXN0LylwYWNrYWdlLmpzb24gaXMgcmV3cml0dGVuXG4gICAgICAgIC8vIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NjQpLlxuICAgICAgICBkZXBzW25hbWVdID0gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIocm9vdERpclBhdGgsIHBhY2thZ2VEaXJQYXRoLCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLCBuYW1lKTtcbiAgICAgICAgcmV3cml0dGVuRGVwZW5kZW5jaWVzLnB1c2goYCR7a2V5fS4ke25hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmV3cm90ZSBwcml2YXRlIGRlcGVuZGVuY2llczonLCByZXdyaXR0ZW5EZXBlbmRlbmNpZXMuam9pbignLCAnKSB8fCAnbm9uZScpO1xuICByZXR1cm4gcmV3cml0dGVuRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgc2NvcGVEaXJOYW1lOiBzdHJpbmcsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgc2NvcGVEaXJOYW1lLCB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VEaXJQYXRoKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuXG5mdW5jdGlvbiB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYWNrYWdlTmFtZS5yZXBsYWNlKC9eQHdpbGxib29zdGVyKD86LXByaXZhdGUpP1xcLy8sICcnKTtcbn1cblxuLyoqIFVuZGVmaW5lZCB3aGVuIHRoZSBwYWNrYWdlIGlzIG5vdCBtYXRlcmlhbGl6ZWQgKG9yIGl0cyBtYW5pZmVzdCBpcyB1bnJlYWRhYmxlL3ZlcnNpb25sZXNzKS4gKi9cbmZ1bmN0aW9uIHJlYWRNYXRlcmlhbGl6ZWRQYWNrYWdlVmVyc2lvbihyb290RGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgIHJvb3REaXJQYXRoLFxuICAgIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gICAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKSxcbiAgICAncGFja2FnZS5qc29uJ1xuICApO1xuICB0cnkge1xuICAgIHJldHVybiAoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbikudmVyc2lvbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc291cmNlRGlyUGF0aCA9IGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHNvdXJjZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRmlsZSgpIHx8ICFkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnNoJykpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0RmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLmNvcHlGaWxlKHBhdGguam9pbihzb3VyY2VEaXJQYXRoLCBkaXJlbnQubmFtZSksIHRhcmdldEZpbGVQYXRoKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jaG1vZCh0YXJnZXRGaWxlUGF0aCwgMG83NTUpO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhgR2VuZXJhdGVkIERvY2tlciBzaGVsbCBzY3JpcHRzOiAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZGlyUGF0aCkgfHwgZGlyUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gZmluZERvY2tlclNoZWxsU2NyaXB0c0RpclBhdGgoKTogc3RyaW5nIHtcbiAgbGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICdkb2NrZXInLCAnYmFzaCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG9ja2VyIHNoZWxsIHNjcmlwdHMgZGlyZWN0b3J5IG5vdCBmb3VuZC4nKTtcbiAgICB9XG4gICAgY3VycmVudERpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAvLyBPdXRzaWRlIG9wdGltaXphdGlvbiB3cml0ZXMgZGlzdC9wYWNrYWdlLmpzb24gYmVmb3JlIERvY2tlciBidWlsZHMgdGhlIGFwcC5cbiAgICAvLyBLZWVwIGJ1aWxkLXRpbWUgZGVwZW5kZW5jaWVzIGFuZCByZW1vdmUgb25seSBrbm93biBub24tYnVpbGQgdG9vbGluZy5cbiAgICByZXR1cm4gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb24pO1xuICB9XG5cbiAgLy8gSW5zaWRlIERvY2tlciwgY29kZWdlbi9idWlsZCBoYXMgYWxyZWFkeSBmaW5pc2hlZCwgc28gcHJvZHVjdGlvbiBpbnN0YWxsIHNob3VsZCBub3Qgc2VlIGRldiB0b29saW5nLlxuICBjb25zdCByZW1vdmVkRGVwZW5kZW5jaWVzID0gT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9KTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gIHJldHVybiByZW1vdmVkRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVVbm5lY2Vzc2FyeURldkRlcGVuZGVuY2llc0Zvck91dHNpZGVEb2NrZXJCdWlsZChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIC8vIEluIC0tb3V0c2lkZSBtb2RlLCBEb2NrZXIgc3RpbGwgcnVucyBjb2RlZ2VuL2J1aWxkIGJlZm9yZSBhIHNlY29uZCBpbi1pbWFnZSBvcHRpbWl6YXRpb24uXG4gIC8vIFJlbW92ZSBvbmx5IHRvb2xpbmcgdGhhdCBpcyBub3QgbmVlZGVkIGZvciB0aGF0IGJ1aWxkIHBoYXNlLlxuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnYmlvbWUnLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdveGZtdCcsXG4gICAgJ294bGludCcsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFNoYXJlZCBjb25maWcgcGFja2FnZXMgYXJlIG5lZWRlZCBvbmx5IGZvciBsaW50L2Zvcm1hdC90ZXN0IGNvbW1hbmRzLCBub3QgRG9ja2VyIGJ1aWxkcy5cbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbiAgcmV0dXJuIHJlbW92ZWREZXBzO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uLCBvcHRpb25zOiB7IHJlbW92ZVdiUG9zdGluc3RhbGw6IGJvb2xlYW4gfSk6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICAob3B0aW9ucy5yZW1vdmVXYlBvc3RpbnN0YWxsICYmIG5hbWUgPT09ICdwb3N0aW5zdGFsbCcgJiYgY29udGVudC50cmltKCkgPT09ICd3YiBnZW4tY29kZScpIHx8XG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBEb2NrZXJCdWlsZEFydGlmYWN0cyhwcm9qZWN0czogUHJvamVjdFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGF3YWl0IHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdCk7XG4gICAgYXdhaXQgcmVtb3ZlR2VuZXJhdGVkTG9jYWxEYXRhKHByb2plY3QpO1xuICAgIHJ1bkRvY2tlckNsZWFudXBTY3JpcHQocHJvamVjdCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUHJvamVjdENhY2hlcyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBbXG4gICAgLi4uKGF3YWl0IHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXRocyhwcm9qZWN0KSksXG4gICAgLi4uKGF3YWl0IHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0KSksXG4gIF07XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBEb2NrZXIgYnVpbGQgY2FjaGVzOicsIHJlbGF0aXZlUGF0aHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiBkb2NrZXJCdWlsZENhY2hlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBhd2FpdCBnbG9iYnkoZG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMnLCAnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqLy55YXJuJywgJyoqLy55YXJuLyoqJywgJyoqLy5naXQnLCAnKiovLmdpdC8qKiddLFxuICAgIG9ubHlGaWxlczogZmFsc2UsXG4gIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByZWxhdGl2ZVBhdGhzLm1hcCgocmVsYXRpdmVQYXRoKSA9PlxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgKVxuICApO1xuICByZXR1cm4gcmVsYXRpdmVQYXRocztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTG9jYWxEYXRhKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVtb3ZlZFBhdGhHcm91cHMgPSBhd2FpdCBQcm9taXNlLmFsbChbcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3QpLCByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0KV0pO1xuICBjb25zdCByZW1vdmVkUGF0aHMgPSByZW1vdmVkUGF0aEdyb3Vwcy5mbGF0KCk7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBnZW5lcmF0ZWQgbG9jYWwgZGF0YTonLCByZW1vdmVkUGF0aHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRNb3VudERpcnMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRocyA9IGdldEdlbmVyYXRlZE1vdW50RGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgcmVsYXRpdmVQYXRocykge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXRQYXRoKSkgY29udGludWU7XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0YXJnZXRQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmVtb3ZlZFBhdGhzLnB1c2gocmVsYXRpdmVQYXRoKTtcbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlZmF1bHRQYXRocyA9IGdlbmVyYXRlZFNxbGl0ZURpck5hbWVzLm1hcCgoZGlyTmFtZSkgPT4gcGF0aC5qb2luKGRpck5hbWUsICdtb3VudCcpKTtcbiAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuIGRlZmF1bHRQYXRocztcblxuICBjb25zdCBhYnNvbHV0ZURpclBhdGggPSBwYXRoLmRpcm5hbWUoZGJQYXRoKTtcbiAgaWYgKHBhdGguYmFzZW5hbWUoYWJzb2x1dGVEaXJQYXRoKSAhPT0gJ21vdW50JyB8fCAhaXNQYXRoSW5zaWRlUHJvamVjdChwcm9qZWN0LCBhYnNvbHV0ZURpclBhdGgpKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRQYXRocztcbiAgfVxuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgYWJzb2x1dGVEaXJQYXRoKTtcbiAgaWYgKCFyZWxhdGl2ZVBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kZWZhdWx0UGF0aHMsIHJlbGF0aXZlUGF0aF0pXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzSW5EZWZhdWx0RGlycyhwcm9qZWN0KSxcbiAgICByZW1vdmVFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0KSxcbiAgXSk7XG4gIHJldHVybiByZW1vdmVkUGF0aHMuZmxhdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBhd2FpdCBnZXRHZW5lcmF0ZWRTcWxpdGVEaXJQYXRocyhwcm9qZWN0KTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gYXdhaXQgUHJvbWlzZS5hbGwoZGlyUGF0aHMubWFwKChkaXJQYXRoKSA9PiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGlyKHByb2plY3QsIGRpclBhdGgpKSk7XG4gIHJldHVybiByZW1vdmVkUGF0aHMuZmxhdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRHZW5lcmF0ZWRTcWxpdGVEaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkaXJQYXRocyA9IGdlbmVyYXRlZFNxbGl0ZURpck5hbWVzLm1hcCgoZGlyTmFtZSkgPT4gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZGlyTmFtZSkpO1xuICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoZGlyUGF0aHMubWFwKChkaXJQYXRoKSA9PiBpc0RpcmVjdG9yeShkaXJQYXRoKSkpO1xuICByZXR1cm4gZGlyUGF0aHMuZmlsdGVyKChfLCBpbmRleCkgPT4gcmVzdWx0c1tpbmRleF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkYkZpbGVQYXRocyA9IGdldEVudkdlbmVyYXRlZFNxbGl0ZUZpbGVQYXRocyhwcm9qZWN0KTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRiRmlsZVBhdGggb2YgZGJGaWxlUGF0aHMpIHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldFBhdGggb2YgZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGgpKSB7XG4gICAgICBpZiAoIShhd2FpdCBpc0ZpbGUodGFyZ2V0UGF0aCkpKSBjb250aW51ZTtcblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHJlbW92ZWRQYXRocy5wdXNoKHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmZ1bmN0aW9uIGdldEVudkdlbmVyYXRlZFNxbGl0ZUZpbGVQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZURiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGggfHwgIWFic29sdXRlRGJQYXRoKSByZXR1cm4gW107XG5cbiAgY29uc3QgZmlsZVBhdGhzID0gcGF0aC5pc0Fic29sdXRlKGRiUGF0aClcbiAgICA/IFtkYlBhdGhdXG4gICAgOiBbYWJzb2x1dGVEYlBhdGgsIC4uLmdlbmVyYXRlZFNxbGl0ZURpck5hbWVzLm1hcCgoZGlyTmFtZSkgPT4gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGlyTmFtZSwgZGJQYXRoKSldO1xuICByZXR1cm4gWy4uLm5ldyBTZXQoZmlsZVBhdGhzKV0uZmlsdGVyKChmaWxlUGF0aCkgPT4gaXNHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aFNhZmUocHJvamVjdCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aFNhZmUocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQYXRoSW5zaWRlUHJvamVjdChwcm9qZWN0LCBmaWxlUGF0aCkgfHwgaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdCwgZmlsZVBhdGgpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckdlbmVyYXRlZERhdGFGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghaXNEb2NrZXJFbmFibGVkKHByb2plY3QpKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRvY2tlckdlbmVyYXRlZERhdGFEaXJQYXRocy5zb21lKChkaXJQYXRoKSA9PiB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJycgJiYgcmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVGaWxlRmFtaWx5UGF0aHMoZGJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGRiRmlsZVBhdGgsXG4gICAgYCR7ZGJGaWxlUGF0aH0tam91cm5hbGAsXG4gICAgYCR7ZGJGaWxlUGF0aH0tc2htYCxcbiAgICBgJHtkYkZpbGVQYXRofS13YWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LmpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LnNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0ud2FsYCxcbiAgXTtcbn1cblxuZnVuY3Rpb24gaXNQYXRoSW5zaWRlUHJvamVjdChwcm9qZWN0OiBQcm9qZWN0LCB0YXJnZXRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHRhcmdldFBhdGgpO1xuICAvLyBgc3RhcnRzV2l0aCgnLi4nKWAgd291bGQgcmVqZWN0IHByb2plY3QtbG9jYWwgbmFtZXMgc3VjaCBhcyBgLi5jYWNoZWAuXG4gIHJldHVybiByZWxhdGl2ZVBhdGggPT09ICcnIHx8IChyZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKGAuLiR7cGF0aC5zZXB9YCkpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9qZWN0LmVudi5XQl9ET0NLRVIgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnMCcgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnZmFsc2UnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpc0ZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0ZpbGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGRpclBhdGgpO1xuICAgIHJldHVybiBzdGF0LmlzRGlyZWN0b3J5KCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGlyKHByb2plY3Q6IFByb2plY3QsIGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBzcWxpdGVGaWxlTmFtZXMgPSBkaXJlbnRzXG4gICAgLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgc3FsaXRlRmlsZVBhdHRlcm4udGVzdChkaXJlbnQubmFtZSkpXG4gICAgLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG5cbiAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGRpclBhdGgpO1xuICByZXR1cm4gc3FsaXRlRmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGguam9pbihyZWxhdGl2ZURpclBhdGgsIGZpbGVOYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRvY2tlckNsZWFudXBTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNjcmlwdFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnYmFzaCcsICdjbGVhbnVwLnNoJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzY3JpcHRQYXRoKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdiYXNoJywgW3NjcmlwdFBhdGgsICctLWtlZXAtc2NyaXB0cyddLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHNjcmlwdFBhdGgpfWApO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VPcm0sIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMsIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCwgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQsIGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgYWxpYXNlczogWydkYiddLFxuICBkZXNjcmliZTpcbiAgICBcIlJ1biBkYXRhYmFzZSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIERyaXp6bGUgcHJvamVjdHMgdXNlIGRyaXp6bGUta2l0LiBFeGFtcGxlOiB3YiBwcmlzbWEgbWlncmF0ZS1kZXYgLS0gLS1uYW1lIGluaXRcIixcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLmNvbW1hbmQoY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZ2VuZXJhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGlzdEJhY2t1cHNDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NsZWFudXAtbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnQ2xlYW4gdXAgdGVtcG9yYWwgTGl0ZXN0cmVhbSBmaWxlcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBjbGVhbnVwLWxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5jbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy9ldGMvbGl0ZXN0cmVhbS55bWwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcjogY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgaWYgKGFsbFByb2plY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NyZWF0aW5nIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmb3IgbXVsdGlwbGUgcHJvamVjdHMgYXQgb25jZSBpcyBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgdGhleSB3b3VsZCBvdmVyd3JpdGUgZWFjaCBvdGhlci4nXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0LCBvcm0sIGFyZ3Yub3V0cHV0KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95Rm9yY2UocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGdlbmVyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdnZW5lcmF0ZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgT1JNIGNsaWVudCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGdlbmVyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZ2VuZXJhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgY29uZmlnOiB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGxpdGVzdHJlYW1Db25maWdCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXN0LWJhY2t1cHMnLFxuICBkZXNjcmliZTogJ0xpc3QgTGl0ZXN0cmVhbSBiYWNrdXBzJyxcbiAgYnVpbGRlcjogbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBsaXN0LWJhY2t1cHMnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5saXN0QmFja3Vwcyhwcm9qZWN0LCBhcmd2LmNvbmZpZyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnY2hlY2staWRlbXBvdGVuY3knOiB7XG4gICAgZGVzY3JpcHRpb246ICdSdW4gdGhlIG1pZ3JhdGlvbiBjb21tYW5kIHR3aWNlIHRvIGNvbmZpcm0gaXQgaXMgaWRlbXBvdGVudC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIG1pZ3JhdGVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyOiBtaWdyYXRlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2NoZWNrLWlkZW1wb3RlbmN5J10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3JtU2NyaXB0cyA9IGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBvcm1TY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0LCBhcmd2LmNoZWNrSWRlbXBvdGVuY3kpKSB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0KSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFNraXBwaW5nIGlkZW1wb3RlbmN5IGNoZWNrIGZvciAke3Byb2plY3QubmFtZX0gaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIG9ybVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3Q6IFByb2plY3QsIGNoZWNrSWRlbXBvdGVuY3k6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrSWRlbXBvdGVuY3kgPz8gaXNEb2NrZXJFbmFibGVkKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9qZWN0LmVudi5XQl9ET0NLRVIgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnMCcgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnZmFsc2UnO1xufVxuXG5mdW5jdGlvbiBpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAncHJvZHVjdGlvbicpO1xufVxuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gRm9yY2UgdG8gcmVzZXQgdGVzdCBkYXRhYmFzZVxuICAgIGlmIChwcm9jZXNzLmVudi5XQl9FTlYgIT09ICd0ZXN0Jykge1xuICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WID0gJ3Rlc3QnO1xuICAgICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKFxuICAgICAgICAnV0JfRU5WPXRlc3QgZGIgcmVzZXQnLFxuICAgICAgICBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KVxuICAgICAgKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8ZHJpenpsZXxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGFyZ3Yub3V0cHV0ID8/IGdldERlZmF1bHRSZXN0b3JlT3V0cHV0KHByb2plY3QsIG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzdG9yZShwcm9qZWN0LCBvdXRwdXQsIGFyZ3YuY29uZmlnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gZGF0YWJhc2Ugc3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydkYi11cmwtb3ItcGF0aCcsICdyZXN0b3JlZCddKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkID8gJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6XG4gICAgXCJQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gdGhlIGRldGVjdGVkIE9STSBhcyBpcy4gQWRkaXRpb25hbCBQcmlzbWEgZmxhZ3MgY2FuIGFsc28gYmUgZm9yd2FyZGVkIGFmdGVyICctLScuXCIsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoYGRiICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBjb21tYW5kID0gb3JtID09PSAncHJpc21hJyA/IGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gIDogYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBmdWxsQ29tbWFuZCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24od2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGNvbW1hbmQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIE1ha2UgRHJpenpsZSBjb21tYW5kcyB3b3JrIG9uIENsb3VkZmxhcmUgRDEgcHJvamVjdHMgYnkgcG9pbnRpbmcgREFUQUJBU0VfVVJMXG4gKiBhdCB0aGUgbG9jYWwgbWluaWZsYXJlIEQxIFNRTGl0ZSBmaWxlLlxuICovXG5mdW5jdGlvbiB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybTogRGF0YWJhc2VPcm0sIHByb2plY3Q6IFByb2plY3QsIHNjcmlwdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ2RyaXp6bGUnID8gd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdCwgc2NyaXB0KSA6IHNjcmlwdDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0OiBQcm9qZWN0LCBvcm06IERhdGFiYXNlT3JtLCBjb25maWdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0TGl0ZXN0cmVhbURiUGF0aChwcm9qZWN0LCBvcm0pO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZyA9IGBzbmFwc2hvdDpcbiAgaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICByZXRlbnRpb246IDcyaCAjIEtlZXAgYmFja3VwcyBmb3IgMyBkYXlzXG5kYnM6XG4gIC0gcGF0aDogJHtkYlBhdGh9XG4gICAgYnVzeS10aW1lb3V0OiA1c1xuICAgIGNoZWNrcG9pbnQtaW50ZXJ2YWw6IDFtXG4gICAgcmVwbGljYTpcbiAgICAgIHR5cGU6IHMzXG4gICAgICBlbmRwb2ludDogaHR0cHM6Ly8ke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRH0ucjIuY2xvdWRmbGFyZXN0b3JhZ2UuY29tXG4gICAgICBidWNrZXQ6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRX1cbiAgICAgIGFjY2Vzcy1rZXktaWQ6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEfVxuICAgICAgc2VjcmV0LWFjY2Vzcy1rZXk6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWX1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDFtXG5gO1xuXG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBsaXRlc3RyZWFtQ29uZmlnKTtcbiAgICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCAke2NvbmZpZ1BhdGh9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlICR7Y29uZmlnUGF0aH06ICR7cmVhc29ufWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0UmVzdG9yZU91dHB1dChwcm9qZWN0OiBQcm9qZWN0LCBvcm06IERhdGFiYXNlT3JtKTogc3RyaW5nIHtcbiAgaWYgKG9ybSA9PT0gJ3ByaXNtYScpIHJldHVybiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnO1xuICByZXR1cm4gJ2RyaXp6bGUvcmVzdG9yZWQuc3FsaXRlMyc7XG59XG5cbmZ1bmN0aW9uIGdldExpdGVzdHJlYW1EYlBhdGgocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSk6IHN0cmluZyB7XG4gIGlmIChvcm0gPT09ICdwcmlzbWEnKSB7XG4gICAgY29uc3QgZGlyTmFtZSA9ICdwcmlzbWEnO1xuICAgIHJldHVybiBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGIgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnIGZvciBEcml6emxlIHJlcXVpcmVzIGZpbGU6IERBVEFCQVNFX1VSTC4nKTtcbiAgfVxuICByZXR1cm4gZGJQYXRoO1xufVxuXG5pbnRlcmZhY2UgRGF0YWJhc2VPcm1Qcm9qZWN0IHtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAgb3JtOiBEYXRhYmFzZU9ybTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3JtPzogRGF0YWJhc2VPcm0pOiBQcm9taXNlPERhdGFiYXNlT3JtUHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgLm1hcCgocHJvamVjdCkgPT4gKHByb2plY3QuZGF0YWJhc2VPcm0gPyB7IHByb2plY3QsIG9ybTogcHJvamVjdC5kYXRhYmFzZU9ybSB9IDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKChwcm9qZWN0KTogcHJvamVjdCBpcyBEYXRhYmFzZU9ybVByb2plY3QgPT4gISFwcm9qZWN0ICYmICghb3JtIHx8IHByb2plY3Qub3JtID09PSBvcm0pKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKG9ybSA/IGBObyAke29ybX0gcHJvamVjdCBmb3VuZC5gIDogJ05vIHN1cHBvcnRlZCBkYXRhYmFzZSBPUk0gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybTogRGF0YWJhc2VPcm0pOiB0eXBlb2YgcHJpc21hU2NyaXB0cyB8IHR5cGVvZiBkcml6emxlU2NyaXB0cyB7XG4gIHJldHVybiBvcm0gPT09ICdwcmlzbWEnID8gcHJpc21hU2NyaXB0cyA6IGRyaXp6bGVTY3JpcHRzO1xufVxuXG5mdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIHByb2plY3RzOiBEYXRhYmFzZU9ybVByb2plY3RbXVxuKTogR2VuZXJhdG9yPERhdGFiYXNlT3JtUHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBjb25zdCBvcm1Qcm9qZWN0QnlQcm9qZWN0ID0gbmV3IE1hcChwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IFtwcm9qZWN0LnByb2plY3QsIHByb2plY3RdKSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoXG4gICAgY29tbWFuZE5hbWUsXG4gICAgcHJvamVjdHMubWFwKCh7IHByb2plY3QgfSkgPT4gcHJvamVjdClcbiAgKSkge1xuICAgIGNvbnN0IG9ybVByb2plY3QgPSBvcm1Qcm9qZWN0QnlQcm9qZWN0LmdldChwcm9qZWN0KTtcbiAgICBpZiAoIW9ybVByb2plY3QpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRldGVjdCBkYXRhYmFzZSBPUk0gZm9yICR7cHJvamVjdC5uYW1lfS5gKTtcblxuICAgIHlpZWxkIG9ybVByb2plY3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBPUk0gY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJy0tJyxcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IEFycmF5LmlzQXJyYXkoYXJndlsnLS0nXSkgPyBhcmd2WyctLSddLm1hcChTdHJpbmcpIDogW107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4udW5rbm93bk9wdGlvbnMsIC4uLnBhc3N0aHJvdWdoQXJnc10pO1xufVxuIiwiaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IHJlYWRFbnZFeGFtcGxlS2V5cyB9IGZyb20gJy4vZ2VuRGV2VmFycy5qcyc7XG5cbi8vIFJhaWx3YXkgaW5qZWN0cyBpdHMgb3duIHN5c3RlbSB2YXJpYWJsZXMgYW5kIHBsYXRmb3JtLW1hbmFnZWQgdmFsdWVzOyBuZXZlciBtaXJyb3IgdGhvc2UgYmFjayxcbi8vIGFuZCBza2lwIGxvY2FsLW9ubHkga2V5cy4gQXBwIHZhcmlhYmxlcyAoaW5jbHVkaW5nIERBVEFCQVNFX1VSTCwgUE9SVCkgc3RheSBlbGlnaWJsZSBiZWNhdXNlXG4vLyBmbm94IGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGgg4oCUIGEgcmVwbyB0aGF0IG11c3QgTk9UIG93biBhIHZhbHVlIChlLmcuIGEgUmFpbHdheSByZWZlcmVuY2Vcbi8vIHZhcmlhYmxlIHBvaW50aW5nIGF0IGEgbGlua2VkIGRhdGFiYXNlIHNlcnZpY2UpIHNpbXBseSBrZWVwcyBpdCBvdXQgb2YgZm5veC8uZW52LmV4YW1wbGUuXG5jb25zdCBOT05fUkFJTFdBWV9LRVlTID0gbmV3IFNldChbJ0NJJ10pO1xuY29uc3QgTk9OX1JBSUxXQVlfS0VZX1BSRUZJWEVTID0gWydSQUlMV0FZXycsICdOSVhQQUNLU18nXTtcblxuZnVuY3Rpb24gaXNOb25SYWlsd2F5S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fUkFJTFdBWV9LRVlTLmhhcyhrZXkpIHx8IE5PTl9SQUlMV0FZX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG4vKipcbiAqIFRoZSBrZXlzIGFjdHVhbGx5IGRlY2xhcmVkIGluIHRoZSBwcm9qZWN0J3MgZm5veC8uZW52IHNvdXJjZXMuIGBtaXNlIGVudmAgaXMgcmVwb3J0ZWQgYXMgYVxuICogcHNldWRvLXNvdXJjZSB0aGF0IG1peGVzIGluIGhvc3QvdG9vbCB2YXJpYWJsZXMgKFBBVEgsIENBUkdPX0hPTUUsIFJVU1RVUF8qLCAuLi4pOyB0aG9zZSBtdXN0XG4gKiBuZXZlciBiZSBwdXNoZWQgdG8gUmFpbHdheSwgc28gdGhleSBhcmUgZXhjbHVkZWQgaGVyZSAobWlycm9ycyB3YiBkZXBsb3kpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RG90ZW52U291cmNlZEtleXMoZW52U291cmNlczogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCByZWFkb25seSBzdHJpbmdbXV0+KTogU2V0PHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFNldChlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpKTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSB2YXJpYWJsZXMgdG8gcHVzaCB0byBSYWlsd2F5IGZyb20gYSByZXNvbHZlZCBlbnZpcm9ubWVudDogZHJvcCBlbXB0eS91bmRlZmluZWQgdmFsdWVzXG4gKiAoc28gYSBgS0VZPWAgcGxhY2Vob2xkZXIgbmV2ZXIgYmxhbmtzIGEgcmVhbCBSYWlsd2F5IHZhcmlhYmxlKSBhbmQgUmFpbHdheS1tYW5hZ2VkIGtleXMsIHNvcnRlZFxuICogZm9yIGEgc3RhYmxlIGNvbW1hbmQgYW5kIGxvZyBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0UmFpbHdheVZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogW3N0cmluZywgc3RyaW5nXVtdIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpXG4gICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBbc3RyaW5nLCBzdHJpbmddID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICcnICYmICFpc05vblJhaWx3YXlLZXkoa2V5KTtcbiAgICB9KVxuICAgIC50b1NvcnRlZCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBSYWlsd2F5RW52Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgUmFpbHdheUVudkNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCByYWlsd2F5RW52Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBSYWlsd2F5RW52Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAncmFpbHdheS1lbnYnLFxuICBkZXNjcmliZTpcbiAgICAnU3luYyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGRlY2xhcmVkIGZvciB0aGUgY3VycmVudCBXQl9FTlYgKHJlc29sdmVkIGZyb20gZm5veC8uZW52KSB0byB0aGUgUmFpbHdheSBzZXJ2aWNlLCBrZWVwaW5nIGZub3ggdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguIFJhaWx3YXktbWFuYWdlZCBrZXlzIChSQUlMV0FZXyosIE5JWFBBQ0tTXyosIENJKSBhcmUgbmV2ZXIgcHVzaGVkLicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogUmFpbHdheUVudkNvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0cmljdCB0byB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHByb2plY3QncyBmbm94Ly5lbnYgc291cmNlczsgaWdub3JlIHByb2Nlc3MuZW52IHNvXG4gICAgLy8gUmFpbHdheSdzIG93biBpbmplY3RlZCB2YXJpYWJsZXMgbmV2ZXIgbGVhayBpbi4gVGhlIGVmZmVjdGl2ZSB2YWx1ZXMgY29tZSBmcm9tIHByb2plY3QuZW52XG4gICAgLy8gKGZub3gtcmVzb2x2ZWQgZm9yIFdCX0VOVikuIE1pcnJvcnMgd2IgZGVwbG95LlxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZTb3VyY2VzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBwcm9qZWN0LmRpclBhdGgsIHsgaWdub3JlUHJvY2Vzc0VudjogdHJ1ZSB9KTtcbiAgICAvLyBgbWlzZSBlbnZgIGlzIHJlcG9ydGVkIGFzIGEgcHNldWRvLXNvdXJjZSB0aGF0IG1peGVzIGluIGhvc3QvdG9vbCB2YXJpYWJsZXMgc3VjaCBhcyBQQVRIIGFuZFxuICAgIC8vIENBUkdPX0hPTUU7IHRob3NlIG11c3QgbmV2ZXIgYmUgcHVzaGVkIHRvIFJhaWx3YXksIHNvIGtlZXAgb25seSBmbm94Ly5lbnYtZGVjbGFyZWQga2V5cy5cbiAgICBjb25zdCBkb3RlbnZLZXlzID0gc2VsZWN0RG90ZW52U291cmNlZEtleXMoZW52U291cmNlcyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGlmICghZG90ZW52S2V5cy5oYXMoa2V5KSkgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gICAgLy8gZm5veCByZXBvcyBrZWVwIHZhbHVlcyBvdXQgb2YgY29tbWl0dGVkIGZpbGVzLCBzbyB0aGUgZGVjbGFyZWQga2V5IGxpc3QgbGl2ZXMgaW5cbiAgICAvLyAuZW52LmV4YW1wbGU7IENJIGFsc28gc3VwcGxpZXMgdGhlc2UgYXMgd29ya2Zsb3cgZW52LiBwcm9qZWN0LmVudiBjYXJyaWVzIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ucmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3QpLCAnV0JfRU5WJywgJ05FWFRfUFVCTElDX1dCX0VOViddKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZW52VmFyc1trZXldID09PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuICAgIC8vIEV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aW4gb3ZlciBmaWxlIHZhbHVlcyAobWF0Y2hlcyB3YiBkZXBsb3kgLyBnZW4tZGV2LXZhcnMpLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZWZmZWN0aXZlVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllcyA9IHNlbGVjdFJhaWx3YXlWYXJpYWJsZXMoZW52VmFycyk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdObyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc3luYyB0byBSYWlsd2F5LicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlOYW1lcyA9IGVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihgV291bGQgc3luYyAke2VudHJpZXMubGVuZ3RofSB2YXJpYWJsZShzKSB0byBSYWlsd2F5ICgke2Vudk5hbWV9KTogJHtrZXlOYW1lcy5qb2luKCcsICcpfWApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBSYWlsd2F5IENMSSByZWFkcyBhdXRoIChSQUlMV0FZX0FQSV9UT0tFTikgYW5kIGRlZmF1bHRzIGZyb20gdGhlIGVudmlyb25tZW50OyBwYXNzIHRoZVxuICAgIC8vIHByb2plY3Qvc2VydmljZS9lbnZpcm9ubWVudCBleHBsaWNpdGx5IHdoZW4gYXZhaWxhYmxlIHNvIHRoZSBjb21tYW5kIHdvcmtzIHVuYXR0ZW5kZWQgaW4gQ0kuXG4gICAgY29uc3QgY29udGV4dEFyZ3M6IHN0cmluZ1tdID0gWyctLXNraXAtZGVwbG95cyddO1xuICAgIGlmIChwcm9jZXNzLmVudi5SQUlMV0FZX1BST0pFQ1RfSUQpIGNvbnRleHRBcmdzLnB1c2goYC0tcHJvamVjdD0ke3Byb2Nlc3MuZW52LlJBSUxXQVlfUFJPSkVDVF9JRH1gKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuUkFJTFdBWV9TRVJWSUNFX0lEKSBjb250ZXh0QXJncy5wdXNoKGAtLXNlcnZpY2U9JHtwcm9jZXNzLmVudi5SQUlMV0FZX1NFUlZJQ0VfSUR9YCk7XG4gICAgY29udGV4dEFyZ3MucHVzaChgLS1lbnZpcm9ubWVudD0ke2Vudk5hbWV9YCk7XG4gICAgY29uc3Qgc2V0QXJncyA9IGVudHJpZXMuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PiBbJy0tc2V0JywgYCR7a2V5fT0ke3ZhbHVlfWBdKTtcblxuICAgIC8vIHN0ZGlvOiAncGlwZScga2VlcHMgdGhlIFJhaWx3YXkgQ0xJJ3MgdmFyaWFibGUgbGlzdGluZyAod2hpY2ggZWNob2VzIHZhbHVlcykgb3V0IG9mIENJIGxvZ3M7XG4gICAgLy8gdGhpcyBjb21tYW5kIG9ubHkgZXZlciBwcmludHMga2V5IG5hbWVzLCBuZXZlciB2YWx1ZXMuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYygnYnVueCcsIFsnQHJhaWx3YXkvY2xpJywgJ3ZhcmlhYmxlcycsIC4uLmNvbnRleHRBcmdzLCAuLi5zZXRBcmdzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgRmFpbGVkIHRvIHN5bmMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIFJhaWx3YXkgKGV4aXQgJHtyZXQuc3RhdHVzfSkuIEtleXM6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdChyZXQuc3RhdHVzID8/IDEpO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFN5bmNlZCAke2VudHJpZXMubGVuZ3RofSB2YXJpYWJsZShzKSB0byBSYWlsd2F5ICgke2Vudk5hbWV9KTogJHtrZXlOYW1lcy5qb2luKCcsICcpfWApKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzLCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbnR5cGUgUmVsZWFzZUFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgYXJncz86IHVua25vd25bXTtcbiAgJy0tJz86IHVua25vd25bXTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWxlYXNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3JlbGVhc2UgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICAnUnVuIHNlbWFudGljLXJlbGVhc2UgKG9yIG11bHRpLXNlbWFudGljLXJlbGVhc2UpIHNvIHRoYXQgcmVwb3NpdG9yaWVzIHVzaW5nIEJ1biBpc29sYXRlZCBpbnN0YWxscyBjYW4gcHVibGlzaCB0byBucG06ICcgK1xuICAgIFwicmVpbnN0YWxsIHdpdGggdGhlIGhvaXN0ZWQgbGlua2VyIChucG0gY2Fubm90IHdhbGsgQnVuJ3MgaXNvbGF0ZWQgbm9kZV9tb2R1bGVzIGxheW91dCksIFwiICtcbiAgICAncmV3cml0ZSBgd29ya3NwYWNlOmAgcmFuZ2VzIG5wbSBjYW5ub3QgcGFyc2UsIHJ1biB0aGUgcmVsZWFzZSwgdGhlbiByZXN0b3JlIHRoZSBtb2RpZmllZCBmaWxlcy4gJyArXG4gICAgJ0V4dHJhIGFyZ3VtZW50cyAoZS5nLiBgLS1kZWJ1Z2AsIGFmdGVyIGAtLWApIGFyZSBmb3J3YXJkZWQgdG8gdGhlIHJlbGVhc2UgY29tbWFuZC4nLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+IHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHJlbGVhc2UoYXJndiBhcyBSZWxlYXNlQXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVsZWFzZShhcmd2OiBSZWxlYXNlQXJndiwgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIC8vIHNlbWFudGljLXJlbGVhc2UgbXVzdCBydW4gYXQgdGhlIHJlcG9zaXRvcnkgcm9vdDogaXQgcmVhZHMgdGhlIGdpdCByZXBvIGFuZCwgZm9yIG1vbm9yZXBvcyxcbiAgLy8gbXVsdGktc2VtYW50aWMtcmVsZWFzZSB3YWxrcyB0aGUgd29ya3NwYWNlcyBpdHNlbGYuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5yb290O1xuXG4gIC8vIE1hcHMgYSBtdXRhdGVkIGZpbGUgdG8gaXRzIHByZS1yZWxlYXNlIGNvbnRlbnQgKHJhdyBieXRlcyDigJQgYnVuLmxvY2tiIGlzIGJpbmFyeSk7IGB1bmRlZmluZWRgXG4gIC8vIG1hcmtzIGEgZmlsZSB0aGF0IGRpZCBub3QgZXhpc3QgYW5kIG11c3QgYmUgZGVsZXRlZCBvbiByZXN0b3JlIChlLmcuIGEgY3JlYXRlZCBsb2NrZmlsZSkuXG4gIGNvbnN0IG1vZGlmaWVkRmlsZXMgPSBuZXcgTWFwPHN0cmluZywgQnVmZmVyIHwgdW5kZWZpbmVkPigpO1xuICAvLyBXaXRoIGEgaGFuZGxlciBpbnN0YWxsZWQsIFNJR0lOVC9TSUdURVJNIG5vIGxvbmdlciB0ZXJtaW5hdGUgdGhpcyBwcm9jZXNzLCBzbyB0aGVcbiAgLy8gZmluYWxseS1yZXN0b3JlIGFsd2F5cyBleGVjdXRlcyBhbmQgdGhlIHNpZ25hbCBpcyByZS1yYWlzZWQgYWZ0ZXJ3YXJkcy4gVGhlIGhhbmRsZXIgYWxzb1xuICAvLyBGT1JXQVJEUyB0aGUgc2lnbmFsIHRvIHRoZSBydW5uaW5nIGNoaWxkOiBjaGlsZHJlbiBhcmUgc3Bhd25lZCBhc3luY2hyb25vdXNseSAobmV2ZXJcbiAgLy8gc3Bhd25TeW5jLCB3aGljaCB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCBhbmQgZGVmZXIgdGhlIGhhbmRsZXIgdW50aWwgYWZ0ZXIgdGhlIGNoaWxkIOKAlFxuICAvLyBhbmQgYSBwdWJsaXNoIOKAlCBjb21wbGV0ZWQpLCBzbyBhIHNpZ25hbCB0YXJnZXRlZCBhdCB0aGlzIHByb2Nlc3MgYWxvbmUgc3RpbGwgY2FuY2VscyB0aGVcbiAgLy8gY2hpbGQgcHJvbXB0bHkuXG4gIGxldCByZWNlaXZlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZiA9IHsgY3VycmVudDogdW5kZWZpbmVkIH07XG4gIGNvbnN0IHNpZ25hbEhhbmRsZXIgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIHJlY2VpdmVkU2lnbmFsID0gc2lnbmFsO1xuICAgIC8vIHRyZWVLaWxsIChub3QgY2hpbGQua2lsbCk6IHNlbWFudGljLXJlbGVhc2UgYW5kIGJ1biBpbnN0YWxsIHNwYXduIHRoZWlyIG93biBzdWJwcm9jZXNzZXNcbiAgICAvLyAobnBtIHB1Ymxpc2gsIGdpdCBwdXNoLCAuLi4pLCB3aGljaCBtdXN0IG5vdCBrZWVwIHB1Ymxpc2hpbmcgYWZ0ZXIgd2IgcmVwb3J0cyBjYW5jZWxsYXRpb24uXG4gICAgLy8gdHJlZUtpbGwgVEhST1dTIChtaXNzaW5nL3RpbWluZy1vdXQgYHBzYCwgRVBFUk0pLCBhbmQgYW4gZXhjZXB0aW9uIGVzY2FwaW5nIGEgc2lnbmFsXG4gICAgLy8gbGlzdGVuZXIgd291bGQgdGVybWluYXRlIHRoZSBwcm9jZXNzIGFuZCBza2lwIHRoZSByZXN0b3JpbmcgZmluYWxseSDigJQgc28gZGVncmFkZSB0b1xuICAgIC8vIGtpbGxpbmcgdGhlIGRpcmVjdCBjaGlsZCBpbnN0ZWFkLlxuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0aXZlQ2hpbGQuY3VycmVudD8ucGlkKSB0cmVlS2lsbChhY3RpdmVDaGlsZC5jdXJyZW50LnBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYEZhaWxlZCB0byB0ZXJtaW5hdGUgdGhlIHJlbGVhc2UgY2hpbGQgcHJvY2VzcyB0cmVlOiAke1N0cmluZyhlcnJvcil9YCkpO1xuICAgICAgYWN0aXZlQ2hpbGQuY3VycmVudD8ua2lsbChzaWduYWwpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ3VhcmRlZFNpZ25hbHM6IE5vZGVKUy5TaWduYWxzW10gPSBbJ1NJR0lOVCcsICdTSUdURVJNJ107XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIGd1YXJkZWRTaWduYWxzKSBwcm9jZXNzLm9uKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG5cbiAgbGV0IGV4aXRDb2RlID0gMDtcbiAgbGV0IHJlbGVhc2VSYW5TdWNjZXNzZnVsbHkgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgcmVsZWFzZVB1Ymxpc2hlc1RvTnBtKHByb2plY3QpKSB7XG4gICAgICBhd2FpdCBwcmVwYXJlTnBtQ29tcGF0aWJsZUxheW91dChwcm9qZWN0LCBhcmd2LCBtb2RpZmllZEZpbGVzLCBhY3RpdmVDaGlsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBob2lzdGVkIHJlaW5zdGFsbCBhbmQgd29ya3NwYWNlLXJhbmdlIHJld3JpdGUgZXhpc3Qgc29sZWx5IHNvIG5wbSAod2hpY2ggdGhlXG4gICAgICAvLyBAc2VtYW50aWMtcmVsZWFzZS9ucG0gcGx1Z2luIHNoZWxscyBvdXQgdG8pIGNhbiBkaWdlc3QgdGhlIGNoZWNrb3V0OyB3aXRob3V0IHRoYXQgcGx1Z2luXG4gICAgICAvLyB0aGUgcmVsZWFzZSBydW5zIGRpcmVjdGx5IG9uIHRoZSBpc29sYXRlZCBsYXlvdXQgKGlzc3VlICMxMDAwKS5cbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICAnU2tpcHBpbmcgdGhlIGhvaXN0ZWQgcmVpbnN0YWxsIGJlY2F1c2UgdGhlIHNlbWFudGljLXJlbGVhc2UgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBpbmNsdWRlIEBzZW1hbnRpYy1yZWxlYXNlL25wbS4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEEgc2lnbmFsIG1heSBoYXZlIGFycml2ZWQgYmV0d2VlbiBjaGlsZHJlbiAobm90aGluZyB0byBmb3J3YXJkIHRvIGF0IHRoYXQgaW5zdGFudCksIHNvIGl0XG4gICAgLy8gbXVzdCBiZSBjaGVja2VkIGV4cGxpY2l0bHkgYmVmb3JlIGFueXRoaW5nIHB1Ymxpc2hlcy5cbiAgICBpZiAocmVjZWl2ZWRTaWduYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWJvcnRlZCBieSAke3JlY2VpdmVkU2lnbmFsfSBiZWZvcmUgcnVubmluZyB0aGUgcmVsZWFzZS5gKTtcbiAgICB9XG4gICAgZXhpdENvZGUgPSBhd2FpdCBydW5TZW1hbnRpY1JlbGVhc2UocHJvamVjdCwgYXJndiwgYWN0aXZlQ2hpbGQpO1xuICAgIC8vIFJlY29yZGVkIHNlcGFyYXRlbHkgZnJvbSByZWNlaXZlZFNpZ25hbDogYSBzaWduYWwgYXJyaXZpbmcgQUZURVIgYSBzdWNjZXNzZnVsIHB1Ymxpc2ggbXVzdFxuICAgIC8vIG5vdCBkZW1vdGUgdGhlIHJlc3RvcmUgdG8gYnl0ZS1mb3ItYnl0ZSAodGhhdCB3b3VsZCByZXZlcnQgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIGJ1bXBzKS5cbiAgICByZWxlYXNlUmFuU3VjY2Vzc2Z1bGx5ID0gZXhpdENvZGUgPT09IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRXJyb3JzIG11c3QgdW53aW5kIHRocm91Z2ggdGhpcyB0cnkgKG5ldmVyIGBwcm9jZXNzLmV4aXRgIGluc2lkZSBpdCk6IHRoZSByZXN0b3JlIGJlbG93IGlzXG4gICAgLy8gdGhlIG9ubHkgdGhpbmcgdGhhdCB1bmRvZXMgdGhlIGJ1bmZpZy9wYWNrYWdlLmpzb24gbXV0YXRpb25zLlxuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKSkpO1xuICAgIGV4aXRDb2RlID0gMTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBPbiBmYWlsdXJlIG9yIGludGVycnVwdGlvbiwgcmVzdG9yZSBieXRlLWZvci1ieXRlOiBzZW1hbnRpYy1yZWxlYXNlIG1heSBoYXZlIGxlZnQgUEFSVElBTFxuICAgIC8vIGVkaXRzIChlLmcuIGEgdmVyc2lvbiBidW1wIHdpdGhvdXQgYSBwdWJsaXNoKSwgd2hpY2ggbXVzdCBub3Qgc3Vydml2ZS4gVGhlIHNlbWFudGljXG4gICAgLy8gd29ya3NwYWNlLXJhbmdlIHJlc3RvcmUgaXMgcmVzZXJ2ZWQgZm9yIGEgc3VjY2Vzc2Z1bCByZWxlYXNlLlxuICAgIGNvbnN0IHJlc3RvcmVkRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBtb2RpZmllZEZpbGVzKSB7XG4gICAgICBpZiAocmVzdG9yZU1vZGlmaWVkRmlsZShmaWxlUGF0aCwgY29udGVudCwgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSkpIHJlc3RvcmVkRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgIH1cbiAgICBpZiAocmVzdG9yZWRGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5jeWFuKGBSZXN0b3JlZCAke3Jlc3RvcmVkRmlsZVBhdGhzLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHApKS5qb2luKCcsICcpfS5gKVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVGhlIGhpbnQgYXBwbGllcyBvbmx5IHdoZW4gdGhlIGhvaXN0ZWQgcmVpbnN0YWxsIGFjdHVhbGx5IHJhbjsgYnVuZmlnLnRvbWwgaXMgc25hcHNob3R0ZWRcbiAgICAvLyBleGFjdGx5IGluIHRoYXQgYnJhbmNoLlxuICAgIGNvbnN0IHJlaW5zdGFsbGVkV2l0aEhvaXN0ZWRMaW5rZXIgPSBbLi4ubW9kaWZpZWRGaWxlcy5rZXlzKCldLnNvbWUoXG4gICAgICAoZmlsZVBhdGgpID0+IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpID09PSAnYnVuZmlnLnRvbWwnXG4gICAgKTtcbiAgICBpZiAocmVpbnN0YWxsZWRXaXRoSG9pc3RlZExpbmtlciAmJiAhaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICdub2RlX21vZHVsZXMgbm93IHVzZXMgdGhlIGhvaXN0ZWQgbGF5b3V0OyBydW4gYSBjbGVhbiByZWluc3RhbGwgKGBybSAtcmYgbm9kZV9tb2R1bGVzIHBhY2thZ2VzLyovbm9kZV9tb2R1bGVzICYmIGJ1biBpbnN0YWxsYCkgdG8gcmVzdG9yZSB0aGUgaXNvbGF0ZWQgbGF5b3V0LidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzaWduYWwgb2YgZ3VhcmRlZFNpZ25hbHMpIHByb2Nlc3Mub2ZmKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gIH1cbiAgaWYgKHJlY2VpdmVkU2lnbmFsKSB7XG4gICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNpZ25hbCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEFjdGl2ZUNoaWxkUmVmIHtcbiAgY3VycmVudDogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3Bhd24gYXN5bmNocm9ub3VzbHkgYW5kIGF3YWl0IHRoZSBleGl0IHN0YXR1cy4gVGhlIGV2ZW50IGxvb3Agc3RheXMgZnJlZSwgc28gcGFyZW50LW9ubHlcbiAqIHNpZ25hbHMgYXJlIGhhbmRsZWQgcHJvbXB0bHkgYW5kIGZvcndhcmRlZCB0byB0aGUgY2hpbGQgYnkgcmVsZWFzZSgpJ3Mgc2lnbmFsIGhhbmRsZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNwYXduQW5kV2FpdChcbiAgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmLFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBvcHRpb25zOiBjaGlsZF9wcm9jZXNzLlNwYXduT3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPG51bWJlcj4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oY29tbWFuZCwgYXJncywgb3B0aW9ucyk7XG4gICAgYWN0aXZlQ2hpbGQuY3VycmVudCA9IGNoaWxkO1xuICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgYWN0aXZlQ2hpbGQuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHJlc29sdmUoMSk7XG4gICAgfSk7XG4gICAgY2hpbGQub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgYWN0aXZlQ2hpbGQuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIHJlc29sdmUoY29kZSA/PyAxKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVsZWFzZSBjYW4gcHVibGlzaCB0byBucG0uIFRydWUgdW5sZXNzIGEgcGx1Z2luIGxpc3QgaXMgZXhwbGljaXRseSBjb25maWd1cmVkXG4gKiAoaW4gYSBKU09OLXBhcnNlYWJsZSBzb3VyY2UpIGFuZCBvbWl0cyBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCBldmVyeXdoZXJlIGluIHNjb3BlIOKAlCB0aGUgcm9vdFxuICogYW5kLCBmb3IgbXVsdGktc2VtYW50aWMtcmVsZWFzZSBtb25vcmVwb3MsIGVhY2ggd29ya3NwYWNlIHBhY2thZ2UgKGEgcGFja2FnZS1sZXZlbCBwbHVnaW4gbGlzdFxuICogb3ZlcnJpZGVzIHRoZSByb290J3MpLiBzZW1hbnRpYy1yZWxlYXNlJ3MgREVGQVVMVCBwbHVnaW4gbGlzdCBpbmNsdWRlcyB0aGUgbnBtIHBsdWdpbiwgc28gYVxuICogbWlzc2luZyBwbHVnaW4gbGlzdCwgYSBub24tSlNPTiBjb25maWcgZmlsZSwgb3IgYW4gYGV4dGVuZHNgIHByZXNldCBjb25zZXJ2YXRpdmVseSBrZWVwcyB0aGVcbiAqIG5wbSBwcmVwYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VQdWJsaXNoZXNUb05wbShcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb24nIHwgJ3VzZXNCdW5QYWNrYWdlTWFuYWdlcic+XG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgcm9vdFBsdWdpbnMgPSByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zKHByb2plY3QuZGlyUGF0aCwgcHJvamVjdC5wYWNrYWdlSnNvbik7XG4gIC8vIFdpdGhvdXQgYW4gZXhwbGljaXQgcm9vdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCAobnBtIGluY2x1ZGVkKSBhcHBsaWVzLlxuICBpZiAoIUFycmF5LmlzQXJyYXkocm9vdFBsdWdpbnMpIHx8IHBsdWdpbnNJbmNsdWRlTnBtKHJvb3RQbHVnaW5zKSkgcmV0dXJuIHRydWU7XG5cbiAgZm9yIChjb25zdCBwYWNrYWdlRGlyUGF0aCBvZiBhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocHJvamVjdCkpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyhwYWNrYWdlRGlyUGF0aCwgdW5kZWZpbmVkKTtcbiAgICAvLyBBIHdvcmtzcGFjZSBwYWNrYWdlIHdpdGhvdXQgaXRzIG93biBwbHVnaW4gbGlzdCBpbmhlcml0cyB0aGUgcm9vdCdzIChucG0tZnJlZSkgZGVjaXNpb24uXG4gICAgaWYgKHBsdWdpbnMgPT09ICd1bmtub3duJyB8fCAoQXJyYXkuaXNBcnJheShwbHVnaW5zKSAmJiBwbHVnaW5zSW5jbHVkZU5wbShwbHVnaW5zKSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGx1Z2luc0luY2x1ZGVOcG0ocGx1Z2luczogcmVhZG9ubHkgdW5rbm93bltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBwbHVnaW5zLnNvbWUoKHBsdWdpbikgPT4gKEFycmF5LmlzQXJyYXkocGx1Z2luKSA/IHBsdWdpblswXSA6IHBsdWdpbikgPT09ICdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKTtcbn1cblxuLyoqXG4gKiBjb3NtaWNvbmZpZyA5J3MgZGVmYXVsdCBzZWFyY2hQbGFjZXMgb3JkZXIgZm9yIG1vZHVsZSBcInJlbGVhc2VcIiAod2hhdCBzZW1hbnRpYy1yZWxlYXNlIDI1XG4gKiBkZWxlZ2F0ZXMgdG8pLCBtaW51cyB0aGUgbGVhZGluZyBwYWNrYWdlLmpzb24gZW50cnksIHdoaWNoIHRoZSBjYWxsZXIgY2hlY2tzIGZpcnN0LiBUaGUgRklSU1RcbiAqIGV4aXN0aW5nIHBsYWNlIHdpbnM7IHBsYWNlcyB3aG9zZSBmb3JtYXQgSlNPTi5wYXJzZSBjYW5ub3QgcmVhZCBtYWtlIHRoZSBlZmZlY3RpdmUgcGx1Z2luXG4gKiBsaXN0ICd1bmtub3duJy5cbiAqL1xuY29uc3Qgc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzOiB7IGZpbGVOYW1lOiBzdHJpbmc7IGpzb25QYXJzZWFibGU6IGJvb2xlYW4gfVtdID0gW1xuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYycsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnltbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5tanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5janMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy5qc29uJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLmNqcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy50cycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5tanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcuY2pzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbl07XG5cbmZ1bmN0aW9uIHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkXG4pOiByZWFkb25seSB1bmtub3duW10gfCB1bmRlZmluZWQgfCAndW5rbm93bicge1xuICAvLyBjb3NtaWNvbmZpZyBzZWFyY2hlcyBwYWNrYWdlLmpzb24ncyBgcmVsZWFzZWAga2V5IEJFRk9SRSBhbnkgcmMvY29uZmlnIGZpbGU7IGEgbWlzc2luZyBvclxuICAvLyB1bnJlYWRhYmxlIHBhY2thZ2UuanNvbiBqdXN0IGZhbGxzIHRocm91Z2ggdG8gdGhlIGZpbGUgc2VhcmNoIHBsYWNlcy5cbiAgaWYgKHBhY2thZ2VKc29uID09PSB1bmRlZmluZWQpIHtcbiAgICB0cnkge1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHBhY2thZ2VKc29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICBsZXQgY29uZmlnID0gKHBhY2thZ2VKc29uIGFzIHsgcmVsZWFzZT86IHsgcGx1Z2lucz86IHVua25vd247IGV4dGVuZHM/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlbGVhc2U7XG4gIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgeyBmaWxlTmFtZSwganNvblBhcnNlYWJsZSB9IG9mIHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlcykge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFqc29uUGFyc2VhYmxlKSByZXR1cm4gJ3Vua25vd24nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSkgYXMgdHlwZW9mIGNvbmZpZztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcucGx1Z2lucykpIHJldHVybiBjb25maWcucGx1Z2lucztcbiAgLy8gQW4gYGV4dGVuZHNgIHByZXNldCBtYXkgY29udHJpYnV0ZSBpdHMgb3duIHBsdWdpbiBsaXN0LCB3aGljaCBjYW5ub3QgYmUgcmVzb2x2ZWQgc3RhdGljYWxseS5cbiAgcmV0dXJuIGNvbmZpZy5leHRlbmRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAndW5rbm93bic7XG59XG5cbi8qKlxuICogTWFrZSB0aGUgY2hlY2tvdXQgZGlnZXN0aWJsZSBmb3IgbnBtLCB3aGljaCBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvIGZvclxuICogYG5wbSB2ZXJzaW9uYCAvIGBucG0gcHVibGlzaGA6XG4gKiAxLiBucG0ncyBhcmJvcmlzdCBjYW5ub3Qgd2FsayBCdW4ncyBJU09MQVRFRCBub2RlX21vZHVsZXMgbGF5b3V0ICh0aGUgYC5idW5gIHN5bWxpbmsgZmFybSksIHNvXG4gKiAgICBjbGVhbi1yZWluc3RhbGwgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgZmlyc3QuIEEgbm9uLWNsZWFuIGxpbmtlciBzd2l0Y2ggd291bGQgbGVhdmUgc3RhbGVcbiAqICAgIGdsb2JhbC1zdG9yZSBzeW1saW5rcyBiZWhpbmQgKHBhY2thZ2VzIHRoZW4gcmVzb2x2ZSBmcm9tIH4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzIHdoZXJlXG4gKiAgICBwaGFudG9tIGRlcGVuZGVuY2llcyBhcmUgdW5yZWFjaGFibGUpLCBzbyBldmVyeSBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGlzIHdpcGVkIGZpcnN0LlxuICogMi4gbnBtIGNhbm5vdCBwYXJzZSBgd29ya3NwYWNlOmAgc3BlY2lmaWVycywgd2hpbGUgQnVuIFJFUVVJUkVTIHRoZSBwcm90b2NvbCBzbyBhIGNvbGQgaW5zdGFsbFxuICogICAgbGlua3MgdGhlIHdvcmtzcGFjZSDigJQgc28gcmV3cml0ZSB0aGUgcmFuZ2VzIHRvIGAqYCBBRlRFUiB0aGUgcmVpbnN0YWxsIChCdW4gbXVzdCBzdGlsbCBzZWVcbiAqICAgIHRoZSBwcm90b2NvbCB3aGlsZSBpbnN0YWxsaW5nOyBucG0gb25seSBuZWVkcyB0aGUgbWFuaWZlc3QgVEVYVCB0byBiZSBwYXJzZWFibGUpLiBUaGVcbiAqICAgIGFmZmVjdGVkIG1hbmlmZXN0cyBhcmUgcHJpdmF0ZS91bnB1Ymxpc2hlZCBvciByZXdyaXR0ZW4gYnkgdGhlIG5wbSBwbHVnaW4gb24gcHVibGlzaC5cbiAqIEFsbCBtdXRhdGlvbnMgYXJlIHJlc3RvcmVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdGhlIHJlbGVhc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVOcG1Db21wYXRpYmxlTGF5b3V0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBSZWxlYXNlQXJndixcbiAgbW9kaWZpZWRGaWxlczogTWFwPHN0cmluZywgQnVmZmVyIHwgdW5kZWZpbmVkPixcbiAgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYnVuZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICBjb25zdCBidW5maWcgPSBmcy5leGlzdHNTeW5jKGJ1bmZpZ1BhdGgpID8gZnMucmVhZEZpbGVTeW5jKGJ1bmZpZ1BhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhvaXN0ZWRCdW5maWcgPSBidW5maWcgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJ1aWxkSG9pc3RlZEJ1bmZpZyhidW5maWcpO1xuICBpZiAoYnVuZmlnICE9PSB1bmRlZmluZWQgJiYgaG9pc3RlZEJ1bmZpZyAhPT0gYnVuZmlnKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oJ0NsZWFuLXJlaW5zdGFsbGluZyB3aXRoIHRoZSBob2lzdGVkIGxpbmtlciBzbyBucG0gY2FuIHdhbGsgbm9kZV9tb2R1bGVzLi4uJykpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KGJ1bmZpZ1BhdGgsIEJ1ZmZlci5mcm9tKGJ1bmZpZywgJ3V0ZjgnKSk7XG4gICAgICAvLyBUaGUgaG9pc3RlZCByZWluc3RhbGwgbWF5IHJld3JpdGUgKG9yIGNyZWF0ZSkgdGhlIGxvY2tmaWxlOyBzbmFwc2hvdCB0aGUgcmF3IGJ5dGVzIHNvIGFcbiAgICAgIC8vIHN1Y2Nlc3NmdWwgcmVsZWFzZSBsZWF2ZXMgbm8gdHJhY2tlZCBvciB1bnRyYWNrZWQgbG9ja2ZpbGUgY2hhbmdlcyBiZWhpbmQuXG4gICAgICBmb3IgKGNvbnN0IGxvY2tGaWxlTmFtZSBvZiBbJ2J1bi5sb2NrJywgJ2J1bi5sb2NrYiddKSB7XG4gICAgICAgIGNvbnN0IGxvY2tGaWxlUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGxvY2tGaWxlTmFtZSk7XG4gICAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KGxvY2tGaWxlUGF0aCwgZnMuZXhpc3RzU3luYyhsb2NrRmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGxvY2tGaWxlUGF0aCkgOiB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhidW5maWdQYXRoLCBob2lzdGVkQnVuZmlnID8/ICcnLCAndXRmOCcpO1xuICAgICAgY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRocyA9IFtwcm9qZWN0LmRpclBhdGgsIC4uLihhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocHJvamVjdCkpXS5tYXAoKGRpclBhdGgpID0+XG4gICAgICAgIHBhdGguam9pbihkaXJQYXRoLCAnbm9kZV9tb2R1bGVzJylcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aCBvZiBub2RlTW9kdWxlc0RpclBhdGhzKSB7XG4gICAgICAgIGZzLnJtU3luYyhub2RlTW9kdWxlc0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFJlc29sdmUgYW5kIGRvd25sb2FkIHdpdGggbGlmZWN5Y2xlIHNjcmlwdHMgRElTQUJMRUQgd2hpbGUgdGhlIHJlbGVhc2UgY3JlZGVudGlhbHNcbiAgICAgIC8vIChWRVJEQUNDSU9fVE9LRU4sIE5QTV9UT0tFTiwgR0lUSFVCX1RPS0VOLCBGTk9YX0FHRV9LRVksIC4uLikgYXJlIGluIHRoZSBlbnZpcm9ubWVudCxcbiAgICAgIC8vIHNvIHJlcG9zaXRvcnktIG9yIGRlcGVuZGVuY3ktZGVmaW5lZCBwcmVpbnN0YWxsL3Bvc3RpbnN0YWxsIGNhbiBuZXZlciByZWFkIHRoZW0g4oCUXG4gICAgICAvLyBtaXJyb3JpbmcgcmV1c2FibGUtd29ya2Zsb3dzJyB0d28tc3RlcCByZWxlYXNlIGluc3RhbGwgKGlzc3VlICMxMDAzKS5cbiAgICAgIGNvbnN0IGluc3RhbGxTdGF0dXMgPSBhd2FpdCBzcGF3bkFuZFdhaXQoYWN0aXZlQ2hpbGQsICdidW4nLCBbJ2luc3RhbGwnLCAnLS1pZ25vcmUtc2NyaXB0cyddLCB7XG4gICAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBpZiAoaW5zdGFsbFN0YXR1cyAhPT0gMCkge1xuICAgICAgICAvLyBUaHJvd2luZyAoaW5zdGVhZCBvZiBwcm9jZXNzLmV4aXQsIHdoaWNoIHdvdWxkIHNraXAgdGhlIGNhbGxlcidzIGZpbmFsbHkpIGxldHMgdGhlXG4gICAgICAgIC8vIHJlc3RvcmUgcnVuIGJlZm9yZSB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1biBpbnN0YWxsIGZhaWxlZCB3aGlsZSBwcmVwYXJpbmcgdGhlIHJlbGVhc2UuJyk7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYXkgdGhlIHNraXBwZWQgbGlmZWN5Y2xlIHNjcmlwdHMgaW4gYSBjcmVkZW50aWFsLXNjcnViYmVkIGVudmlyb25tZW50LiBBIHJlcGVhdGVkXG4gICAgICAvLyBgYnVuIGluc3RhbGxgIGlzIGEgbm8tb3AgdGhhdCBkb2VzIG5vdCByZXBsYXkgdGhlbSwgc28gbm9kZV9tb2R1bGVzIGlzIHdpcGVkIGFnYWluO1xuICAgICAgLy8gZXZlcnkgcGFja2FnZSBpcyBhbHJlYWR5IGluIGJ1bidzIGNhY2hlIGZyb20gdGhlIGNyZWRlbnRpYWxlZCBzdGVwLCBzbyB0aGlzIHJlLWxpbmtcbiAgICAgIC8vIG5lZWRzIG5vIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLlxuICAgICAgZm9yIChjb25zdCBub2RlTW9kdWxlc0RpclBhdGggb2Ygbm9kZU1vZHVsZXNEaXJQYXRocykge1xuICAgICAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXBsYXlTdGF0dXMgPSBhd2FpdCBzcGF3bkFuZFdhaXQoYWN0aXZlQ2hpbGQsICdidW4nLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgZW52OiBidWlsZENyZWRlbnRpYWxGcmVlRW52KHByb2plY3QuZW52KSxcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcGxheVN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1biBpbnN0YWxsIGZhaWxlZCB3aGlsZSByZXBsYXlpbmcgbGlmZWN5Y2xlIHNjcmlwdHMgZm9yIHRoZSByZWxlYXNlLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZVBhY2thZ2VEaXJzID0gYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBbXG4gICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGgsXG4gICAgLi4ud29ya3NwYWNlUGFja2FnZURpcnMubWFwKChkaXJQYXRoKSA9PiBwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgXSkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG9yaWdpbmFsID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBTbmFwc2hvdCBFVkVSWSBtYW5pZmVzdCAobm90IG9ubHkgcmV3cml0dGVuIG9uZXMpOiBzZW1hbnRpYy1yZWxlYXNlIGFsc28gZWRpdHMgbWFuaWZlc3RzXG4gICAgLy8gd2l0aG91dCB3b3Jrc3BhY2U6IHJhbmdlcyAodmVyc2lvbiBidW1wcyksIGFuZCBhIGZhaWxlZCByZWxlYXNlIG11c3QgcmVzdG9yZSB0aG9zZSB0b28uXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgbW9kaWZpZWRGaWxlcy5zZXQocGFja2FnZUpzb25QYXRoLCBCdWZmZXIuZnJvbShvcmlnaW5hbCwgJ3V0ZjgnKSk7XG4gICAgfVxuICAgIGNvbnN0IHJld3JpdHRlbiA9IHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMob3JpZ2luYWwpO1xuICAgIGlmIChyZXdyaXR0ZW4gPT09IG9yaWdpbmFsKSBjb250aW51ZTtcblxuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSZXdyaXRpbmcgd29ya3NwYWNlOiByYW5nZXMgaW4gJHtwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKX0uLi5gKSk7XG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIHJld3JpdHRlbiwgJ3V0ZjgnKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIGNyZWRlbnRpYWxzIHRoZSByZWxlYXNlIHdvcmtmbG93IGluamVjdHMgKGNmLiByZXVzYWJsZS13b3JrZmxvd3MnIHJlbGVhc2UueW1sIHNlY3JldHMgYW5kXG4vLyBucG0ncyBvd24gdG9rZW4gdmFyaWFibGVzKS4gVGhlIHJlbGVhc2UgY29tbWFuZCBsb2FkcyB0aGUgcHJvamVjdCB3aXRoIGxvYWRFbnY6IGZhbHNlLCBzbyBub1xuLy8gd2ItbG9hZGVyLWluamVjdGVkIGtleXMgZXhpc3QgdG8gc2NydWIgYmV5b25kIHRoZXNlLiBBIGRlbnlsaXN0IChub3QgYW4gYWxsb3dsaXN0KSBpc1xuLy8gZGVsaWJlcmF0ZTogaW4gdGhlIHN1cHBvcnRlZCBlbnRyeSBwb2ludCDigJQgcmV1c2FibGUtd29ya2Zsb3dzJyByZWxlYXNlIGpvYiDigJQgdGhlc2UgZW51bWVyYXRlZFxuLy8gdmFyaWFibGVzIGFyZSB0aGUgT05MWSBzZWNyZXRzIGluIHRoZSBhbWJpZW50IGVudmlyb25tZW50IChmbm94IHNlY3JldHMgc3RheSBlbmNyeXB0ZWQgYmVjYXVzZVxuLy8gRk5PWF9BR0VfS0VZIGlzIHNjcnViYmVkIGFuZCBuZXZlciBleHBvcnRlZCBhcyBwbGFpbnRleHQgdGhlcmUpLCB3aGlsZSBhbiBhbGxvd2xpc3Qgd291bGRcbi8vIGJyZWFrIGxpZmVjeWNsZSBzY3JpcHRzIHRoYXQgbGVnaXRpbWF0ZWx5IHJlYWQgb3BlcmF0aW9uYWwgdmFyaWFibGVzIChQQVRILCBIT01FLCBDSSwgLi4uKS5cbi8vIEEgbG9jYWwgYHdiIHJlbGVhc2VgIGluaGVyaXRzIHdoYXRldmVyIHRoZSBkZXZlbG9wZXIncyBzaGVsbCBhbHJlYWR5IGV4cG9zZXMgdG8gZXZlcnlcbi8vIGBidW4gaW5zdGFsbGAsIHdoaWNoIHRoaXMgcmVwbGF5IGRvZXMgbm90IHdpZGVuLlxuY29uc3QgY3JlZGVudGlhbEVudlZhck5hbWVzID0gW1xuICAnVkVSREFDQ0lPX1RPS0VOJyxcbiAgJ05QTV9UT0tFTicsXG4gICdOT0RFX0FVVEhfVE9LRU4nLFxuICAnR0lUSFVCX1RPS0VOJyxcbiAgJ0dIX1RPS0VOJyxcbiAgJ0dIX1BBQ0tBR0VTX1RPS0VOJyxcbiAgJ0dIX1BLR19SRUFEX1RPS0VOJyxcbiAgJ0ZOT1hfQUdFX0tFWScsXG5dO1xuXG4vKipcbiAqIEEgY29weSBvZiBgZW52YCBzYWZlIHRvIGV4cG9zZSB0byBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzLiBDcmVkZW50aWFsIHZhcmlhYmxlcyBhcmVcbiAqIEVNUFRJRUQgcmF0aGVyIHRoYW4gZGVsZXRlZCBzbyBgJHtWRVJEQUNDSU9fVE9LRU59YC1zdHlsZSByZWZlcmVuY2VzIGluIC5ucG1yYyBrZWVwIGV4cGFuZGluZ1xuICogdG8gJycgaW5zdGVhZCBvZiBjcmFzaGluZyB0aGUgaW5zdGFsbCAodGhlIHBhdHRlcm4gcmV1c2FibGUtd29ya2Zsb3dzIHJlbGllcyBvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENyZWRlbnRpYWxGcmVlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzY3J1YmJlZEVudiA9IHsgLi4uZW52IH07XG4gIGZvciAoY29uc3QgbmFtZSBvZiBjcmVkZW50aWFsRW52VmFyTmFtZXMpIHtcbiAgICBpZiAobmFtZSBpbiBzY3J1YmJlZEVudikgc2NydWJiZWRFbnZbbmFtZV0gPSAnJztcbiAgfVxuICByZXR1cm4gc2NydWJiZWRFbnY7XG59XG5cbi8qKlxuICogVW5kbyB0aGUgdGVtcG9yYXJ5IHJlbGVhc2UtdGltZSBtdXRhdGlvbnMgb2Ygb25lIGZpbGUuIGBwYWNrYWdlLmpzb25gIGZpbGVzIGFyZSByZXN0b3JlZFxuICogc2VtYW50aWNhbGx5IGluc3RlYWQgb2YgYnl0ZS1mb3ItYnl0ZTogc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gd3JpdGVzIHRoZSByZWxlYXNlZFxuICogdmVyc2lvbiBpbnRvIG1hbmlmZXN0cyB3aGlsZSB0aGV5IGhvbGQgdGhlIHJld3JpdHRlbiByYW5nZXMsIGFuZCBhIGJ5dGUgcmVzdG9yZSB3b3VsZCBzaWxlbnRseVxuICogcmV2ZXJ0IHRoYXQgYnVtcCDigJQgc28gd2hlbiB0aGUgZmlsZSBjaGFuZ2VkIGR1cmluZyB0aGUgcmVsZWFzZSwgb25seSB0aGUgYHdvcmtzcGFjZTpgXG4gKiBzcGVjaWZpZXJzIGFyZSB3cml0dGVuIGJhY2sgaW50byB0aGUgQ1VSUkVOVCBjb250ZW50LlxuICovXG4vKiogUmV0dXJucyB3aGV0aGVyIHRoZSBvbi1kaXNrIGNvbnRlbnQgYWN0dWFsbHkgY2hhbmdlZCAoZHJpdmVzIHRoZSBcIlJlc3RvcmVkIC4uLlwiIG1lc3NhZ2UpLiAqL1xuZnVuY3Rpb24gcmVzdG9yZU1vZGlmaWVkRmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgb3JpZ2luYWxDb250ZW50OiBCdWZmZXIgfCB1bmRlZmluZWQsXG4gIHJlbGVhc2VTdWNjZWVkZWQ6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICBpZiAob3JpZ2luYWxDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBleGlzdGVkID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIHJldHVybiBleGlzdGVkO1xuICB9XG4gIGlmIChyZWxlYXNlU3VjY2VlZGVkICYmIHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpID09PSAncGFja2FnZS5qc29uJyAmJiBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IG9yaWdpbmFsQ29udGVudC50b1N0cmluZygndXRmOCcpO1xuICAgIGlmIChjdXJyZW50Q29udGVudCAhPT0gcmV3cml0ZVdvcmtzcGFjZVJhbmdlcyhvcmlnaW5hbFRleHQpKSB7XG4gICAgICBjb25zdCByZXN0b3JlZENvbnRlbnQgPSByZXN0b3JlV29ya3NwYWNlUmFuZ2VzKGN1cnJlbnRDb250ZW50LCBvcmlnaW5hbFRleHQpO1xuICAgICAgaWYgKHJlc3RvcmVkQ29udGVudCA9PT0gY3VycmVudENvbnRlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIHJlc3RvcmVkQ29udGVudCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBjdXJyZW50QnVmZmVyID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgpIDogdW5kZWZpbmVkO1xuICBpZiAoY3VycmVudEJ1ZmZlcj8uZXF1YWxzKG9yaWdpbmFsQ29udGVudCkpIHJldHVybiBmYWxzZTtcbiAgLy8gV3JpdGUgdGhlIHNuYXBzaG90IGJ5dGVzIHZlcmJhdGltOiBidW4ubG9ja2IgaXMgYmluYXJ5LCBzbyBhbnkgdGV4dCBkZWNvZGUvZW5jb2RlIHJvdW5kIHRyaXBcbiAgLy8gd291bGQgY29ycnVwdCBpdC5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgb3JpZ2luYWxDb250ZW50KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEhvaXN0ZWRCdW5maWcoYnVuZmlnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVuZmlnXG4gICAgLnJlcGxhY2UoL14oXFxzKmxpbmtlclxccyo9XFxzKilbXCInXWlzb2xhdGVkW1wiJ10vbXUsICckMVwiaG9pc3RlZFwiJylcbiAgICAucmVwbGFjZSgvXlxccypnbG9iYWxTdG9yZVxccyo9XFxzKnRydWVbXlxcbl0qXFxuPy9tdSwgJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV3cml0ZVdvcmtzcGFjZVJhbmdlcyhwYWNrYWdlSnNvbkNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE9wZXJhdGUgb25seSBpbnNpZGUgdGhlIGRlcGVuZGVuY3kgc2VjdGlvbnM6IGEgYmxhbmtldCBgXCJ3b3Jrc3BhY2U6Li4uXCJgIHJlcGxhY2VtZW50IHdvdWxkXG4gIC8vIGFsc28gY29ycnVwdCB1bnJlbGF0ZWQgc3RyaW5nIHZhbHVlcyAoZS5nLiBhIGRlc2NyaXB0aW9uIHN0YXJ0aW5nIHdpdGggYHdvcmtzcGFjZTpgKSwgYW5kIGFcbiAgLy8gbmFtZS1rZXllZCBnbG9iYWwgcmVwbGFjZW1lbnQgd291bGQgdG91Y2ggc2FtZS1uYW1lZCBrZXlzIGluIG90aGVyIHNlY3Rpb25zIChlLmcuIG92ZXJyaWRlcykuXG4gIHJldHVybiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMocGFja2FnZUpzb25Db250ZW50LCAoc2VjdGlvbikgPT5cbiAgICBzZWN0aW9uLnJlcGxhY2VBbGwoLyhcIlteXCJcXG5dK1wiXFxzKjpcXHMqKVwid29ya3NwYWNlOlteXCJdKlwiL2d1LCAnJDFcIipcIicpXG4gICk7XG59XG5cbi8qKlxuICogUmUtYXBwbHkgdGhlIG9yaWdpbmFsIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXJzIHRvIHRoZSBDVVJSRU5UIG1hbmlmZXN0IGNvbnRlbnQuIE1hdGNoaW5nIGtleXNcbiAqIG9mZiB0aGUgZGVwZW5kZW5jeSBOQU1FIChub3QgdGhlIGBcIipcImAgcGxhY2Vob2xkZXIpIGlzIGRlbGliZXJhdGU6IG11bHRpLXNlbWFudGljLXJlbGVhc2Unc1xuICogcHJlcGFyZSBzdGVwIG92ZXJ3cml0ZXMgbG9jYWwgZGVwZW5kZW5jeSBzcGVjaWZpZXJzIHdpdGggY29uY3JldGUgcmVsZWFzZWQgdmVyc2lvbnMsIGFuZCB0aGVcbiAqIGNvbW1pdHRlZCBtYW5pZmVzdCBtdXN0IGdldCBpdHMgYHdvcmtzcGFjZTpgIHByb3RvY29sIGJhY2sgcmVnYXJkbGVzcyDigJQgQnVuIHJlcXVpcmVzIHRoZVxuICogcHJvdG9jb2wgc28gYSBjb2xkIGluc3RhbGwgbGlua3MgdGhlIHdvcmtzcGFjZSBpbnN0ZWFkIG9mIHJlc29sdmluZyBhIHJlZ2lzdHJ5IGNvcHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlV29ya3NwYWNlUmFuZ2VzKGN1cnJlbnRDb250ZW50OiBzdHJpbmcsIG9yaWdpbmFsQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29ya3NwYWNlRGVwZW5kZW5jaWVzID0gY29sbGVjdFdvcmtzcGFjZURlcGVuZGVuY2llcyhvcmlnaW5hbENvbnRlbnQpO1xuICAvLyBSZXN0b3JlIHBlciAoc2VjdGlvbiwgbmFtZSk6IGEgc2FtZS1uYW1lZCBkZXBlbmRlbmN5IGluIGFub3RoZXIgc2VjdGlvbiBtYXkgbGVnaXRpbWF0ZWx5XG4gIC8vIGhvbGQgYSBub24td29ya3NwYWNlIHJhbmdlIChlLmcuIGEgcGVlckRlcGVuZGVuY2llcyBgPj0xLjAuMGAgbmV4dCB0byBhIGRldkRlcGVuZGVuY2llc1xuICAvLyBgd29ya3NwYWNlOipgKSBvciBhIGRpZmZlcmVudCB3b3Jrc3BhY2UgcmFuZ2UsIGFuZCBtdXN0IGtlZXAgaXRzIG93biB2YWx1ZS5cbiAgcmV0dXJuIHJlcGxhY2VJbkRlcGVuZGVuY3lTZWN0aW9ucyhjdXJyZW50Q29udGVudCwgKHNlY3Rpb24sIHNlY3Rpb25LZXkpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gc2VjdGlvbjtcbiAgICBmb3IgKGNvbnN0IHsgc2VjdGlvbjogZGVwZW5kZW5jeVNlY3Rpb24sIG5hbWUsIHNwZWNpZmllciB9IG9mIHdvcmtzcGFjZURlcGVuZGVuY2llcykge1xuICAgICAgaWYgKGRlcGVuZGVuY3lTZWN0aW9uICE9PSBzZWN0aW9uS2V5KSBjb250aW51ZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlQWxsKFxuICAgICAgICBuZXcgUmVnRXhwKGAoXCIke2VzY2FwZVJlZ0V4cChuYW1lKX1cIlxcXFxzKjpcXFxccyopXCJbXlwiXSpcImAsICdndScpLFxuICAgICAgICAvLyBBIHJlcGxhY2VyIGZ1bmN0aW9uLCBub3QgYSByZXBsYWNlbWVudCBzdHJpbmc6IHNwZWNpZmllcnMgY29udGFpbmluZyBgJGAgbXVzdCBiZVxuICAgICAgICAvLyBpbnNlcnRlZCBsaXRlcmFsbHkgaW5zdGVhZCBvZiBiZWluZyBpbnRlcnByZXRlZCBhcyBzdWJzdGl0dXRpb24gcGF0dGVybnMuXG4gICAgICAgIChfbWF0Y2gsIHByZWZpeDogc3RyaW5nKSA9PiBgJHtwcmVmaXh9JHtKU09OLnN0cmluZ2lmeShzcGVjaWZpZXIpfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG4vKiogRGVwZW5kZW5jeSBzZWN0aW9ucyBjb250YWluIG9ubHkgYFwibmFtZVwiOiBcInNwZWNpZmllclwiYCBzdHJpbmcgcGFpcnMsIHNvIGBbXnt9XSpgIHNwYW5zIHRoZW0uICovXG5mdW5jdGlvbiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgcmVwbGFjZVNlY3Rpb246IChzZWN0aW9uOiBzdHJpbmcsIHNlY3Rpb25LZXk6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKFxuICAgIC8oXCIoZGVwZW5kZW5jaWVzfGRldkRlcGVuZGVuY2llc3xvcHRpb25hbERlcGVuZGVuY2llc3xwZWVyRGVwZW5kZW5jaWVzKVwiXFxzKjpcXHMqXFx7KShbXnt9XSopKFxcfSkvZ3UsXG4gICAgKF9tYXRjaCwgcHJlZml4OiBzdHJpbmcsIHNlY3Rpb25LZXk6IHN0cmluZywgYm9keTogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykgPT5cbiAgICAgIGAke3ByZWZpeH0ke3JlcGxhY2VTZWN0aW9uKGJvZHksIHNlY3Rpb25LZXkpfSR7c3VmZml4fWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFdvcmtzcGFjZURlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25Db250ZW50OiBzdHJpbmdcbik6IHsgc2VjdGlvbjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNwZWNpZmllcjogc3RyaW5nIH1bXSB7XG4gIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb247XG4gIHRyeSB7XG4gICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudCkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmNpZXM6IHsgc2VjdGlvbjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNwZWNpZmllcjogc3RyaW5nIH1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0KSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VKc29uW2tleV0gPz8ge30pKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goeyBzZWN0aW9uOiBrZXksIG5hbWUsIHNwZWNpZmllcjogdmFsdWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bJCgpKisuP1tcXFxcXFxdXnt8fV0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlbWFudGljUmVsZWFzZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBSZWxlYXNlQXJndiwgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgZm9yd2FyZGVkQXJncyA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXS5tYXAoU3RyaW5nKTtcbiAgLy8gVGhlIFBBQ0tBR0UgbmFtZSAoZm9yIGBidW54YC9geWFybiBkbHhgLCB3aGljaCBmZXRjaCBhIHBhY2thZ2UpIGFuZCB0aGUgQklOIG5hbWUgKGZvciB0aGVcbiAgLy8gbG9jYWwgbm9kZV9tb2R1bGVzLy5iaW4gbG9va3VwKSBkaWZmZXIgZm9yIHRoZSBzY29wZWQgZm9ya3M6IGBidW54IG11bHRpLXNlbWFudGljLXJlbGVhc2VgXG4gIC8vIHdvdWxkIGZldGNoIHRoZSB1bnJlbGF0ZWQgdW5zY29wZWQgbnBtIHBhY2thZ2UgaW5zdGVhZCBvZiBlLmcuIEBhbm9saWxhYidzIGZvcmsuXG4gIGNvbnN0IHJlbGVhc2VQYWNrYWdlTmFtZSA9IChcbiAgICBbJ0Bhbm9saWxhYi9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJywgJ211bHRpLXNlbWFudGljLXJlbGVhc2UnLCAnQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddIGFzIGNvbnN0XG4gICkuZmluZCgocGFja2FnZU5hbWUpID0+IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdKTtcbiAgY29uc3QgcmVsZWFzZUJpbiA9IHJlbGVhc2VQYWNrYWdlTmFtZSA/ICdtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJyA6ICdzZW1hbnRpYy1yZWxlYXNlJztcblxuICAvLyBUaGUgcHJvamVjdCBpcyBsb2FkZWQgd2l0aCBsb2FkRW52OiBmYWxzZSAoc2VtYW50aWMtcmVsZWFzZSBydW5zIHdpdGggdGhlIGFtYmllbnQvQ0lcbiAgLy8gZW52aXJvbm1lbnQgYnkgZGVzaWduKSwgc28gcHJvamVjdC5lbnYgYWxpYXNlcyBwcm9jZXNzLmVudiBoZXJlOyB1c2luZyBpdCBrZWVwcyB0aGVcbiAgLy8gcHJvamVjdC5lbnYgY29udmVudGlvbiBhbmQgcGlja3MgdXAgZW52IGxvYWRpbmcgaWYgdGhhdCBkZXNpZ24gZXZlciBjaGFuZ2VzLlxuICBjb25zdCBlbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChwcm9qZWN0LmRpclBhdGgsIGVudik7XG4gIGNvbnN0IGhhc0xvY2FsQmluID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nLCByZWxlYXNlQmluKSk7XG4gIGNvbnN0IGZhbGxiYWNrUGFja2FnZU5hbWUgPSByZWxlYXNlUGFja2FnZU5hbWUgPz8gJ3NlbWFudGljLXJlbGVhc2UnO1xuICBjb25zdCBjb21tYW5kID0gaGFzTG9jYWxCaW5cbiAgICA/IFtyZWxlYXNlQmluLCAuLi5mb3J3YXJkZWRBcmdzXVxuICAgIDogcHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmQgPT09ICdidW4nXG4gICAgICA/IFsnYnVueCcsIGZhbGxiYWNrUGFja2FnZU5hbWUsIC4uLmZvcndhcmRlZEFyZ3NdXG4gICAgICA6IFsneWFybicsICdkbHgnLCBmYWxsYmFja1BhY2thZ2VOYW1lLCAuLi5mb3J3YXJkZWRBcmdzXTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFJ1bm5pbmc6ICR7Y29tbWFuZC5qb2luKCcgJyl9YCkpO1xuICBpZiAoYXJndi5kcnlSdW4pIHJldHVybiAwO1xuXG4gIHJldHVybiBhd2FpdCBzcGF3bkFuZFdhaXQoYWN0aXZlQ2hpbGQsIGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52LFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIG9uU2lnbmFsOiAoc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiAoZC5uYW1lID09PSAnbWlzZS50b21sJyB8fCBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ21pc2UgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICAvLyBgbWlzZSB3aGljaCBweXRob25gIHJlc29sdmVzIHRoZSBwcm9qZWN0J3MgQUNUSVZFIGludGVycHJldGVyIHRvIGEgc2luZ2xlIGFic29sdXRlIHBhdGgsXG4gICAgICAvLyB1bmxpa2UgYG1pc2UgY3VycmVudCBweXRob25gLCB3aGljaCBwcmludHMgZXZlcnkgY29uZmlndXJlZCB2ZXJzaW9uIChtaXNlIHN1cHBvcnRzXG4gICAgICAvLyBtdWx0aS12ZXJzaW9uIHBpbnMpIGFuZCB3b3VsZCBwYXNzIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRvIGBwb2V0cnkgZW52IHVzZWAuXG4gICAgICBsZXQgcHl0aG9uUGF0aCA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHl0aG9uUGF0aCA9IGNoaWxkX3Byb2Nlc3NcbiAgICAgICAgICAuZXhlY1N5bmMoJ21pc2Ugd2hpY2ggcHl0aG9uJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10gfSlcbiAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbWlzZSBtaXNzaW5nIG9yIHB5dGhvbiB1bmNvbmZpZ3VyZWQ7IGxldCBwb2V0cnkgcGljayBpdHMgZGVmYXVsdCBpbnRlcnByZXRlci5cbiAgICAgIH1cbiAgICAgIGlmIChweXRob25QYXRoKSB7XG4gICAgICAgIC8vIFRoZSBjb21tYW5kIHJ1bnMgdGhyb3VnaCBhIHNoZWxsOyBQT1NJWCBzaW5nbGUgcXVvdGVzIGtlZXAgdGhlIHBhdGggb25lIGxpdGVyYWwgYXJndW1lbnRcbiAgICAgICAgLy8gZXZlbiB3aGVuIGEgcmVsb2NhdGVkIG1pc2UgZGF0YSBkaXIgcHV0cyBtZXRhY2hhcmFjdGVycyBpbnRvIGl0LlxuICAgICAgICBjb25zdCBxdW90ZWRQeXRob25QYXRoID0gYCcke3B5dGhvblBhdGgucmVwbGFjZUFsbChcIidcIiwgU3RyaW5nLnJhd2AnXFwnJ2ApfSdgO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3F1b3RlZFB5dGhvblBhdGh9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgJy0tJz86IHN0cmluZ1tdO1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbiAgc2lsZW50PzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7ICctLSc/OiBzdHJpbmdbXSB9XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZXZOdWxsKGFyZ3Y6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKGFyZ3YgYXMgeyBzaWxlbnQ6IGJvb2xlYW4gfSkuc2lsZW50ID8gYCA+IC9kZXYvbnVsbGAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZEltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICdZQVJOIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IG1pc2VBZ2VLZXlTZWNyZXRPcHRpb24gPSBwcm9qZWN0LmVudi5NSVNFX0FHRV9LRVlcbiAgICAgID8gJ1xcbiAgICAgICAgLS1zZWNyZXQgaWQ9bWlzZV9hZ2Vfa2V5LGVudj1NSVNFX0FHRV9LRVknXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIHg4Nl82NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0ke21pc2VBZ2VLZXlTZWNyZXRPcHRpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICBjb25zdCBtaXNlQWdlS2V5RW52T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZID8gJy0tZW52IE1JU0VfQUdFX0tFWSAnIDogJyc7XG4gICAgcmV0dXJuIGBkb2NrZXIgcnVuIC0tcm0gJHthbGxvY2F0ZVR0eSA/ICctaXQgJyA6ICcnfSR7bWlzZUFnZUtleUVudk9wdGlvbn0tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZG9ja2VyIHJtIC1mICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ID4gL2Rldi9udWxsIDI+JjEgfHwgdHJ1ZWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQge1xuICBmaW5kRDFNaWdyYXRpb25zRGlyUGF0aCxcbiAgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxuICB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXN0b21TdGFydFNjcmlwdFBhdGggPSBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0KTtcbiAgICBpZiAoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSB7XG4gICAgICBjb25zdCBzdGFydENvbW1hbmQgPVxuICAgICAgICBgJHtidWlsZFNoZWxsQ29tbWFuZChbJ2Jhc2gnLCBjdXN0b21TdGFydFNjcmlwdFBhdGhdKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAgIC8vIEEgc3RhcnQgc2NyaXB0IGZvdW5kIGF0IHRoZSBtb25vcmVwbyByb290IChjZi4gUHJvamVjdC5maW5kRmlsZSkgaXMgd3JpdHRlbiB0byBydW4gZnJvbVxuICAgICAgLy8gdGhlIHJvb3QsIGxpa2UgRG9ja2VyJ3MgV09SS0RJUiwgc28gaXRzIGN3ZCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBzY3JpcHRzLy5cbiAgICAgIGNvbnN0IHNjcmlwdFJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShjdXN0b21TdGFydFNjcmlwdFBhdGgpKTtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgc2NyaXB0Um9vdERpclBhdGggPT09IHByb2plY3QuZGlyUGF0aFxuICAgICAgICAgID8gc3RhcnRDb21tYW5kXG4gICAgICAgICAgOiBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIHNjcmlwdFJvb3REaXJQYXRoXSl9ICYmICR7c3RhcnRDb21tYW5kfSlgLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZWNvc3lzdGVtQ29uZmlnUGF0aCA9IGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gZWNvc3lzdGVtQ29uZmlnUGF0aFxuICAgICAgPyBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXVxuICAgICAgOiB0aGlzLmJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBjb21tYW5kcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAvLyBUZXN0LWVudmlyb25tZW50IHdyYW5nbGVyIHN0YXRlIGlzIGRpc3Bvc2FibGU7IHdpcGUgaXQgZW50aXJlbHkgKG5vdCBqdXN0IEQxKSBiZWZvcmVcbiAgICAvLyBtaWdyYXRpbmcsIHNpbmNlIHN0YWxlIEtWIGNhY2hlIGVudHJpZXMgb3IgRHVyYWJsZSBPYmplY3Qgc3RvcmFnZSBjYW4gYnJlYWsgZTJlIHRlc3RzLlxuICAgIGNvbnN0IHdyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMgPVxuICAgICAgaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpXG4gICAgICAgID8gW2BybSAtUmYgXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImBdXG4gICAgICAgIDogW107XG4gICAgLy8gQSBwcm9qZWN0IHdob3NlIEQxIGJpbmRpbmdzIGNhcnJ5IHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGFwcGxpZXMgdGhlbSB3aXRoIHdyYW5nbGVyXG4gICAgLy8gKHNlZSBXb3JrZXJzU2NyaXB0cyAvIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKS4gUnVubmluZyBkcml6emxlLWtpdCBtaWdyYXRlIGFnYWluc3RcbiAgICAvLyB0aGUgc2FtZSBsb2NhbCBEMSB3b3VsZCBhcHBseSB0aGUgc2FtZSBTUUwgdHdpY2Ug4oCUIGRyaXp6bGUncyBnZW5lcmF0ZWQgc3RhdGVtZW50cyBhcmUgbm90XG4gICAgLy8gaWRlbXBvdGVudCAoYENSRUFURSBJTkRFWGAgd2l0aG91dCBJRiBOT1QgRVhJU1RTKSDigJQgc28gZHJpenpsZSBzdGF5cyBPUk0tb25seSB0aGVyZS5cbiAgICBjb25zdCBtaWdyYXRlc0QxV2l0aFdyYW5nbGVyID0gISFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kcyA9IFtcbiAgICAgIC4uLndyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMsXG4gICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc0RyaXp6bGUgJiYgIW1pZ3JhdGVzRDFXaXRoV3JhbmdsZXJcbiAgICAgICAgPyBbd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdCwgZHJpenpsZVNjcmlwdHMubWlncmF0ZUZvclN0YXJ0KHByb2plY3QpKV1cbiAgICAgICAgOiBbXSksXG4gICAgXTtcbiAgICAvLyBTcGxpdHRpbmcgbWF5IGN1dCB0aHJvdWdoIGEgYChjZCDigKYgJiYg4oCmKWAgc3Vic2hlbGwsIGJ1dCByZWpvaW5pbmcgd2l0aCAnICYmICcgYW5kIHBlci1waWVjZVxuICAgIC8vIHJlZGlyZWN0cyBrZWVwcyB0aGUgc2NyaXB0IHZhbGlkLCBhbmQgd2ItZ2VuZXJhdGVkIHBhdGhzIG5ldmVyIGNvbnRhaW4gJyYmJy5cbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLmZsYXRNYXAoKGNtZCkgPT4gY21kLnNwbGl0KCcmJicpKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MuXG4gICAgcmV0dXJuIGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ05PREVfRU5WJywgJycpfSAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBcHAocHJvamVjdCksXG4gICAgXSl9YDtcbiAgfVxuXG4gIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSB0aGlzLmJ1aWxkUGxheXdyaWdodE9ubHlDb21tYW5kKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gcGxheXdyaWdodENvbW1hbmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA2MDAwMDAgLWkgMjAwMCcpfVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfWAsXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogSnVzdCBydW5zIFBsYXl3cmlnaHQgKHBsdXMgdGhlIG9wdGlvbmFsIGB0ZXN0L2UyZS1hZGRpdGlvbmFsYCBzY3JpcHQpLCB3aXRob3V0IGxhdW5jaGluZyB0aGUgYXBwLlxuICAgKiBVc2Ugd2hlbiBQbGF5d3JpZ2h0J3Mgb3duIGB3ZWJTZXJ2ZXJgIGNvbmZpZyBidWlsZHMgYW5kIHN0YXJ0cyB0aGUgYXBwIHVuZGVyIHRlc3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gW10sIHBsYXl3cmlnaHRBcmdzID0gWyd0ZXN0JywgJ3Rlc3QvZTJlLyddIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgJHtidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMsIGFyZ3YuYmFpbCwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpfSR7c3VmZml4fWA7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICdydW4nLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDUwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDEwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCAtaSAyMDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMjAwMDAgLWkgNDAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwIC1pIDUwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA5MDAwMCAtaSAxMDAwMCcpfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3RcbiAgICApfSB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQpfSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB3YWl0LW9uIGJvb3QgY2hlY2sgcG9sbGluZyBgaHR0cC1nZXQ6Ly9sb2NhbGhvc3Q6PHBvcnQ+YC4gYGxvY2FsaG9zdGAgKG5vdCBgMTI3LjAuMC4xYClcbiAqIGxldHMgTm9kZSdzIEhhcHB5IEV5ZWJhbGxzIHRyeSBib3RoIGFkZHJlc3MgZmFtaWxpZXM6IG9uIG1hY09TLCBkZXYgc2VydmVycyB3aXRob3V0IGFuIGV4cGxpY2l0XG4gKiBob3N0IChlLmcuIHZpbmV4dC9WaXRlKSBjYW4gYmluZCBJUHY2LW9ubHkgKGA6OjFgKSwgc28gYW4gSVB2NC1vbmx5IHBvbGwgd291bGQgaGFuZyB1bnRpbCB0aW1lb3V0XG4gKiBldmVuIHRob3VnaCB0aGUgc2VydmVyIGlzIHVwLiBUaGUgYE5PX1BST1hZYC9gbm9fcHJveHlgIHByZWZpeCBrZWVwcyB0aGUgbG9vcGJhY2sgcG9sbCBvZmYgSFRUUFxuICogcHJveGllczogd2FpdC1vbidzIGF4aW9zIGFwcGxpZXMgYEhUVFAoUylfUFJPWFlgIGVudiB2YXJzIHVubGVzcyBgTk9fUFJPWFlgIG1hdGNoZXMgdGhlIHBvbGxlZFxuICogaG9zdCwgYW5kIGV4aXN0aW5nIGBOT19QUk9YWWAgY29udmVudGlvbnMgbWF5IGxpc3QgYDEyNy4wLjAuMWAgd2l0aG91dCBgbG9jYWxob3N0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgd2FpdE9uQXJncz86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgTk9fUFJPWFk9bG9jYWxob3N0IG5vX3Byb3h5PWxvY2FsaG9zdCB3YWl0LW9uICR7d2FpdE9uQXJncyA/IGAke3dhaXRPbkFyZ3N9IGAgOiAnJ31odHRwLWdldDovL2xvY2FsaG9zdDoke3BvcnR9YDtcbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ3NjcmlwdHMvc3RhcnQtcHJvZHVjdGlvbi5zaCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKFxuICBwbGF5d3JpZ2h0QXJnczogc3RyaW5nW10sXG4gIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sXG4gIGJhaWw/OiBib29sZWFuLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IFsnQlVOJywgJ3BsYXl3cmlnaHQnXTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgaWYgKHBsYXl3cmlnaHRBcmdzWzBdICE9PSAndGVzdCcgfHwgIW5vcm1hbGl6ZWRUYXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oWy4uLmJhc2UsIC4uLnBsYXl3cmlnaHRBcmdzLCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sIGJhaWwpO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKDEpO1xuICBjb25zdCBleHBsaWNpdFRhcmdldEluZGV4ZXMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhyZXN0KTtcbiAgY29uc3QgcmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCA9XG4gICAgZXhwbGljaXRUYXJnZXRJbmRleGVzLmxlbmd0aCA9PT0gMCA/IHJlc3QgOiByZXN0LmZpbHRlcigoXywgaW5kZXgpID0+ICFleHBsaWNpdFRhcmdldEluZGV4ZXMuaW5jbHVkZXMoaW5kZXgpKTtcbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFxuICAgIFsuLi5iYXNlLCAndGVzdCcsIC4uLm5vcm1hbGl6ZWRUYXJnZXRzLCAuLi5yZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0LCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sXG4gICAgYmFpbFxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoYXJnczogc3RyaW5nW10pOiBudW1iZXJbXSB7XG4gIGxldCBwZW5kaW5nVmFsdWVNb2RlOiAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgYXJnXSBvZiBhcmdzLmVudHJpZXMoKSkge1xuICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlKSB7XG4gICAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSA9PT0gJ3JlcXVpcmVkJyB8fCAhYXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgcmV0dXJuIFsuLi50YXJnZXRJbmRleGVzLCAuLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkubWFwKChfLCBvZmZzZXQpID0+IGluZGV4ICsgMSArIG9mZnNldCldO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIGlmIChhcmcuaW5jbHVkZXMoJz0nKSkgY29udGludWU7XG4gICAgICBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9IGVsc2UgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAnb3B0aW9uYWwnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICBjb25zdCBzaG9ydE9wdGlvbiA9IGFyZy5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID09PSAyICYmIFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhzaG9ydE9wdGlvbikpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRJbmRleGVzO1xufVxuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1icm93c2VyJyxcbiAgJy0tY29uZmlnJyxcbiAgJy0tZ3JlcCcsXG4gICctLWdyZXAtaW52ZXJ0JyxcbiAgJy0tZ2xvYmFsLXRpbWVvdXQnLFxuICAnLS1tYXgtZmFpbHVyZXMnLFxuICAnLS1vdXRwdXQnLFxuICAnLS1wcm9qZWN0JyxcbiAgJy0tcmVwZWF0LWVhY2gnLFxuICAnLS1yZXBvcnRlcicsXG4gICctLXJldHJpZXMnLFxuICAnLS1zaGFyZCcsXG4gICctLXRlc3QtbGlzdCcsXG4gICctLXRlc3QtbGlzdC1pbnZlcnQnLFxuICAnLS10aW1lb3V0JyxcbiAgJy0tdHJhY2UnLFxuICAnLS10c2NvbmZpZycsXG4gICctLXVpLWhvc3QnLFxuICAnLS11aS1wb3J0JyxcbiAgJy0tdWktdGl0bGUnLFxuICAnLS13b3JrZXJzJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1vbmx5LWNoYW5nZWQnLFxuICAnLS11cGRhdGUtc25hcHNob3RzJyxcbiAgJy0tdXBkYXRlLXNvdXJjZS1tZXRob2QnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbJy1jJywgJy1nJywgJy1qJ10pO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMsIGJ1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kLCB0eXBlIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBjbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXTtcbiAgICBjb25zdCB0ZXN0Q29tbWFuZCA9IHRoaXMudGVzdFVuaXQocHJvamVjdCwgeyAuLi5hcmd2LCB0YXJnZXRzOiBub3JtYWxpemVkVGFyZ2V0cyB9KTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwMCAtaSAyMDAwJyl9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBZQVJOIG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgU0VSVkVSX0xPR19GSUxFID0gJ3NlcnZlci5sb2cnO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBTRVJWRVJfTE9HX0ZJTEUgfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVXaXRoUGxheXdyaWdodE1hbmFnZWRTZXJ2ZXIocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFV2l0aFBsYXl3cmlnaHRNYW5hZ2VkU2VydmVyKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVEb2NrZXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGxpYnJhcnkgaGFzIG5vIHNlcnZlciBvZiBpdHMgb3duLCBidXQgaXQgbWF5IHNoaXAgYSBzZWxmLWNvbnRhaW5lZCBQbGF5d3JpZ2h0IGZpeHR1cmUgd2hvc2VcbiAgICogY29uZmlnIGJ1aWxkcyBhbmQgc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdCB2aWEgYSBgd2ViU2VydmVyYCBibG9jayAoZS5nLiBhIE5leHQuanMgZml4dHVyZSB0aGF0XG4gICAqIHZlcmlmaWVzIHRoZSBwdWJsaXNoZWQgcGFja2FnZSBpbXBvcnRzIGNsZWFubHkpLiBSdW4gUGxheXdyaWdodCBkaXJlY3RseSBpbiB0aGF0IGNhc2Ug4oCUIGluY2x1ZGluZ1xuICAgKiBvbiBDSSwgd2hlcmUgUGxheXdyaWdodCdzIG93biBgd2ViU2VydmVyYCBzdGFydHMgdGhlIGZpeHR1cmUg4oCUIG90aGVyd2lzZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgdGVzdEUyRVdpdGhQbGF5d3JpZ2h0TWFuYWdlZFNlcnZlcihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIHByb2plY3QuaGFzUGxheXdyaWdodFdlYlNlcnZlckNvbmZpZ1xuICAgICAgICA/IHRoaXMuYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQocHJvamVjdCwgYXJndiwgb3B0aW9ucylcbiAgICAgICAgOiBgZWNobyAnZG8gbm90aGluZy4nYFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHZpbmV4dCAoTmV4dC5qcyBvbiBWaXRlKSBhcHBzIHRhcmdldGluZyBDbG91ZGZsYXJlIFdvcmtlcnMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpbmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICAvLyBVbmxpa2UgYG5leHQgZGV2YCwgVml0ZS1iYXNlZCB2aW5leHQgZG9lcyBub3QgcmVhZCB0aGUgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICBjb25zdCBkZXZDb21tYW5kID0gYFlBUk4gdmluZXh0IGRldiAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICAgIC8vIFRoZSBDbG91ZGZsYXJlIHZpdGUgcGx1Z2luIChtaW5pZmxhcmUpIHJlYWRzIHJ1bnRpbWUgdmFycyBvbmx5IGZyb20gYSAuZGV2LnZhcnMgZmlsZSxcbiAgICAvLyBzbyBpdCBtdXN0IGJlIHJlZ2VuZXJhdGVkIGZyb20gdGhlIHdiLW1hbmFnZWQgLmVudiBmaWxlcyBiZWZvcmUgc2VydmluZy5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICcuZGV2LnZhcnMnKV07XG4gICAgLy8gYHZpbmV4dCBkZXZgIChtaW5pZmxhcmUpIHN0YXJ0cyB3aXRoIGFuIGVtcHR5IGxvY2FsIEQxIGFuZCBhcHBsaWVzIG5vIG1pZ3JhdGlvbnMgaXRzZWxmO1xuICAgIC8vIHRoZSB0ZXN0IGVudmlyb25tZW50IHdpcGVzIGl0cyBzdGF0ZSBkaXJlY3RvcnksIHNvIGV2ZXJ5IHBhZ2Ugd291bGQgNTAwIHdpdGhvdXQgdGhpcy5cbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kID0gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSA/IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtaWdyYXRpb25Db21tYW5kKSBjb21tYW5kcy5wdXNoKG1pZ3JhdGlvbkNvbW1hbmQpO1xuICAgIHJldHVybiBbLi4uY29tbWFuZHMsIGRldkNvbW1hbmRdLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICAvLyBTZXJ2aW5nIHRoZSBidWlsdCB3b3JrZXIgc3RhcnRzIGZyb20gYW4gZW1wdHkgKG9yIHdpcGVkKSBsb2NhbCBEMSwgc28gd3JhbmdsZXItbmF0aXZlXG4gICAgLy8gbWlncmF0aW9ucyAoaWYgYW55KSBtdXN0IGJlIGFwcGxpZWQgZmlyc3Q7IGRyaXp6bGUvcHJpc21hIG1pZ3JhdGlvbnMgYXJlIGhhbmRsZWQgYnlcbiAgICAvLyBidWlsZFByb2R1Y3Rpb25Db21tYW5kLlxuICAgIGNvbnN0IGQxTWlncmF0aW9uc0NvbW1hbmQgPSBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KTtcbiAgICAvLyBgdmluZXh0IGJ1aWxkYCBlbWl0cyBhIHdvcmtlciBidW5kbGUgYW5kIGl0cyB3cmFuZ2xlciBjb25maWcgdW5kZXIgZGlzdC9zZXJ2ZXIsIHNvIHRoZVxuICAgIC8vIC5kZXYudmFycyBmaWxlIGV4cG9zaW5nIHdiLW1hbmFnZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3QgYmUgZ2VuZXJhdGVkIGFmdGVyIGJ1aWxkaW5nLlxuICAgIC8vIGAtLWxvY2FsLXVwc3RyZWFtYCBrZWVwcyByZXF1ZXN0IFVSTHMgb24gdGhlIGxvY2FsIGhvc3Q7IG90aGVyd2lzZSwgd3JhbmdsZXIgZGV2IHNpbXVsYXRlc1xuICAgIC8vIHRoZSBwcm9kdWN0aW9uIGN1c3RvbSBkb21haW4gZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyByb3V0ZXMuXG4gICAgcmV0dXJuIFtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnZGlzdC9zZXJ2ZXIvLmRldi52YXJzJyksXG4gICAgICAuLi4oZDFNaWdyYXRpb25zQ29tbWFuZCA/IFtkMU1pZ3JhdGlvbnNDb21tYW5kXSA6IFtdKSxcbiAgICAgIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKFxuICAgICAgICBgZGV2IC0tY29uZmlnIGRpc3Qvc2VydmVyL3dyYW5nbGVyLmpzb24gLS1pcCAxMjcuMC4wLjEgLS1wb3J0ICR7cG9ydH0gLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1sb2NhbC11cHN0cmVhbSBsb2NhbGhvc3Q6JHtwb3J0fSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXG4gICAgICApLFxuICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpbmV4dFNjcmlwdHMgPSBuZXcgVmluZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFZpdGUtYmFzZWQgYXBwcyB3aXRoIFBsYXl3cmlnaHQgZTJlIHRlc3RzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaXRlU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIHZpdGUgZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgWUFSTiB2aXRlIHByZXZpZXcgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgdml0ZVNjcmlwdHMgPSBuZXcgVml0ZVNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQsXG4gIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQsXG4gIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kLFxuICBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIsXG59IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBIdHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgcGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcHMgKGRldGVjdGVkIHZpYSBhIHdyYW5nbGVyXG4gKiBjb25maWcgZmlsZSB3aGVuIG5vIG90aGVyIGZyYW1ld29yayBtYXRjaGVzOyB2aW5leHQgYXBwcyBoYXZlIHRoZWlyIG93biBzY3JpcHRzKS5cbiAqIEV4dGVuZHMgSHR0cFNlcnZlclNjcmlwdHMgc28gdGhhdCBlMmUgdGVzdHMgcnVuIHZpYSB0aGUgdW5pdC10ZXN0IHJ1bm5lciBhZ2FpbnN0IHRoZSBydW5uaW5nXG4gKiB3b3JrZXIgd2hlbiB0aGUgcHJvamVjdCBoYXMgbm8gUGxheXdyaWdodCBjb25maWcuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFdvcmtlcnNTY3JpcHRzIGV4dGVuZHMgSHR0cFNlcnZlclNjcmlwdHMge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3QsIGFyZ3YpLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIC8vIHdyYW5nbGVyIGRldiBidW5kbGVzIHRoZSB3b3JrZXIgaXRzZWxmLCBzbyBubyBzZXBhcmF0ZSBidWlsZCBzdGVwIGlzIG5lZWRlZC5cbiAgICByZXR1cm4gdGhpcy5idWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICc4Nzg3JztcbiAgICBjb25zdCBzdGF0ZURpciA9IGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KTtcblxuICAgIC8vIFRoZXNlIGhlbHBlcnMgcmVhZCB0aGUgZGVmYXVsdC1uYW1lZCB3cmFuZ2xlciBjb25maWc7IHRoYXQgaXMgc2FmZSBiZWNhdXNlIHdvcmtlcnNTY3JpcHRzXG4gICAgLy8gaXRzZWxmIGlzIG9ubHkgc2VsZWN0ZWQgd2hlbiBzdWNoIGEgY29uZmlnIGZpbGUgZXhpc3RzIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICcuZGV2LnZhcnMnKV07XG4gICAgLy8gQXBwbHkgd3JhbmdsZXItbmF0aXZlIEQxIG1pZ3JhdGlvbnMgKGlmIGFueSkgc28gdGhlIGxvY2FsIGRhdGFiYXNlIG1hdGNoZXMgdGhlIGRlcGxveWVkIG9uZS5cbiAgICBjb25zdCBkMU1pZ3JhdGlvbnNDb21tYW5kID0gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKGQxTWlncmF0aW9uc0NvbW1hbmQpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goZDFNaWdyYXRpb25zQ29tbWFuZCk7XG4gICAgfVxuICAgIGNvbW1hbmRzLnB1c2goXG4gICAgICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChcbiAgICAgICAgYGRldiAtLWlwIDEyNy4wLjAuMSAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAtLXBlcnNpc3QtdG8gXCIke3N0YXRlRGlyfVwiICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBjb21tYW5kcztcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd29ya2Vyc1NjcmlwdHMgPSBuZXcgV29ya2Vyc1NjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnLCAnaG9ubyddO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiU3RhcnQgYXBwLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGFwcCBjb21tYW5kLiBFeGFtcGxlOiB3YiBzdGFydCAtLSAtLWhvc3QgMC4wLjAuMFwiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KS5vcHRpb25zKGJ1aWxkZXIpIGFzIEFyZ3Y8XG4gICAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuICAgID4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSB7XG4gICAgICAgIC8vIHZpbmV4dCBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIHRoaXMgY2hlY2sgbXVzdCBjb21lIGZpcnN0LlxuICAgICAgICBzY3JpcHRzID0gdmluZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkge1xuICAgICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICAgIHNjcmlwdHMgPSB3b3JrZXJzU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQgPSAyMDA7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPID0gMC4wNTtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246ICdIb3cgdG8gcnVuIEUyRSB0ZXN0cycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYmFpbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RvcCB0ZXN0cyBhZnRlciB0aGUgZmlyc3QgZmFpbHVyZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgYXJyYXk6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdVbml0IG9yIEUyRSB0ZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFRlc3RDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj47XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VGVzdENvbW1hbmRPcHRpb25zPiAmIHsgJy0tJz86IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdFJ1bk9wdGlvbnMge1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVGVzdENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgZmxhZ3MgdG8gUGxheXdyaWdodC4gRXhhbXBsZTogd2IgdGVzdCAtLSAtLWdyZXAgJ3VwbG9hZGVkIGltYWdlIGFzc2V0J1wiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pOiBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4gPT5cbiAgICB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpXG4gICAgICAucG9zaXRpb25hbCgndGFyZ2V0cycsIGFyZ3VtZW50c0J1aWxkZXIudGFyZ2V0cykgYXMgQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoYXJndjogVGVzdENvbW1hbmRBcmd2LCBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3YpO1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHModGVzdEFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKHRlc3RBcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IHRlc3RBcmd2WyctLSddID8/IFtdO1xuICBjb25zdCB7IHNob3VsZFJ1bkUyZSwgc2hvdWxkUnVuVW5pdCB9ID0gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKHRlc3RUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgZW52aXJvbm1lbnQgZWFnZXJseTogd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudiBmb3JjZXMgdGhlIHRlc3QgY2FzY2FkZSBhbmRcbiAgICAvLyBQcm9qZWN0LmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudiBmYWxscyBiYWNrIFdCX0VOViB0byB0aGF0IG1vZGUg4oCUIGJ1dCB0aGUgZW52IGdldHRlciBpc1xuICAgIC8vIGxhenksIHNvIGEgcHJvamVjdCB3aXRoIG5vIHJ1bm5hYmxlIHRlc3RzIHdvdWxkIG90aGVyd2lzZSBza2lwIHRoZSB2YWxpZGF0aW9uIGVudGlyZWx5LlxuICAgIHZvaWQgcHJvamVjdC5lbnY7XG5cbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy52aW5leHQgfHwgZGV2RGVwcy52aW5leHQpIHtcbiAgICAgIC8vIHZpbmV4dCBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIHRoaXMgY2hlY2sgbXVzdCBjb21lIGZpcnN0LlxuICAgICAgc2NyaXB0cyA9IHZpbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkge1xuICAgICAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICAgICAgc2NyaXB0cyA9IHdvcmtlcnNTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgY29uc3QgZGVmYXVsdFVuaXRUYXJnZXRzID0gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3QpO1xuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGRlZmF1bHRVbml0VGFyZ2V0cyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB0YXJnZXRzID1cbiAgICAgICAgdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogZGVmYXVsdFVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBkZWZhdWx0VW5pdFRhcmdldHMgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHMgfTtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVW5pdFRlc3RDb21tYW5kKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICAgICAgICB0aW1lb3V0OiB0ZXN0QXJndi51bml0VGltZW91dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgaWYgKHNob3VsZFJ1bkUyZSkgd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUocHJvamVjdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLm5leHQgfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgICAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vKipcbiAqIFdhcm4gd2hlbiBhIHByb2plY3QgaGFzIGEgUGxheXdyaWdodCBjb25maWcgYnV0IG5vIHRlc3QvZTJlIGRpcmVjdG9yeS5cbiAqIHdiIGRpc2NvdmVycyBlMmUgdGVzdHMgb25seSB1bmRlciB0ZXN0L2UyZS8sIHNvIHN1Y2ggcHJvamVjdHMgd291bGQgb3RoZXJ3aXNlIGhhdmUgdGhlaXJcbiAqIFBsYXl3cmlnaHQgc3BlY3Mgc2lsZW50bHkgc2tpcHBlZCBhbmQgYHdiIHRlc3RgIC8gYHdiIHZlcmlmeSAtLWZ1bGxgIHdvdWxkIHJlcG9ydCBzdWNjZXNzXG4gKiB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ25hbWUnIHwgJ3BhY2thZ2VKc29uJz5cbik6IHZvaWQge1xuICAvLyBDYWxsZXJzIGludm9rZSB0aGlzIG9ubHkgYWZ0ZXIgZXN0YWJsaXNoaW5nIHRoYXQgdGVzdC9lMmUgaXMgbWlzc2luZywgc28gaXQgaXMgbm90IHJlLWNoZWNrZWRcbiAgLy8gaGVyZS4gQSB3b3Jrc3BhY2Ugcm9vdCBkZWxlZ2F0ZXMgZTJlIHRvIGl0cyBwYWNrYWdlcywgc28gaXQgbmV2ZXIgd2FybnMgKGNoZWNrZWQgZmlyc3QgdG8gc2tpcFxuICAvLyB0aGUgZmlsZXN5c3RlbSBsb29rdXAgYmVsb3cpLiBPbmx5IGEgcHJvamVjdCdzIE9XTiBQbGF5d3JpZ2h0IGNvbmZpZyBjb3VudHM6IGBoYXNQbGF5d3JpZ2h0Q29uZmlnYFxuICAvLyB3YWxrcyB1cCB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc28gcmV1c2luZyBpdCB3b3VsZCBmYWxzZS1wb3NpdGl2ZSBvbiBsaWJyYXJ5IHBhY2thZ2VzIGFuZCB0aGVcbiAgLy8gcm9vdCBpdHNlbGYsIHdoaWNoIGxlZ2l0aW1hdGVseSBzaGFyZSBhIHJvb3QtbGV2ZWwgcGxheXdyaWdodC5jb25maWcudHMgYnV0IGtlZXAgZTJlIHNwZWNzIGluIGFcbiAgLy8gc2luZ2xlIGFwcCBwYWNrYWdlLlxuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSByZXR1cm47XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKSkpIHJldHVybjtcblxuICBjb25zb2xlLndhcm4oXG4gICAgY2hhbGsueWVsbG93KFxuICAgICAgYFNraXBwaW5nIGUyZSB0ZXN0cyBmb3IgJHtwcm9qZWN0Lm5hbWV9OiBhIFBsYXl3cmlnaHQgY29uZmlnIGV4aXN0cyBidXQgdGhlIHRlc3QvZTJlIGRpcmVjdG9yeSBpcyBtaXNzaW5nLiB3YiBvbmx5IGRpc2NvdmVycyBQbGF5d3JpZ2h0IHNwZWNzIHVuZGVyIHRlc3QvZTJlLywgc28gbW92ZSB0aGVtIHRoZXJlIHRvIHJ1biBlMmUgdGVzdHMuYFxuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndjogVGVzdENvbW1hbmRBcmd2KTogVGVzdENvbW1hbmRBcmd2IHtcbiAgaWYgKGFyZ3YuZW52Py5sZW5ndGggfHwgYXJndi5jYXNjYWRlRW52IHx8IGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiA9PT0gZmFsc2UpIHtcbiAgICAvLyBFeHBsaWNpdCBlbnYgZmxhZ3Mga2VlcCB0aGVpciBmaWxlLXNlbGVjdGlvbiBzZW1hbnRpY3MsIGJ1dCB0aGUgc3Bhd25lZCB0ZXN0cyBtdXN0IHN0aWxsXG4gICAgLy8gcnVuIGFzIGB0ZXN0YCB3aGVuIHRob3NlIGZpbGVzIGRlZmluZSBubyBXQl9FTlYgKHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKS5cbiAgICByZXR1cm4geyAuLi5hcmd2LCBjb21tYW5kRGVmYXVsdFdiRW52OiAndGVzdCcgfTtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSA/IFsndGVzdCcsICctLWV4Y2x1ZGUnLCAndGVzdC9lMmUvKionXSA6IFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aW5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHdvcmtlcnNTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vd29ya2Vyc1NjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUgfSBmcm9tICcuL3Rlc3QuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gU3Bhd25lZCBjb21tYW5kcyByZS1kZXJpdmUgdGhlaXIgZG90ZW52IGNhc2NhZGUgZnJvbSB0aGUgZXhwb3J0ZWQgV0JfRU5WLCBzbyBhbiB1bmV4cG9ydGVkXG4gIC8vIFdCX0VOViB3b3VsZCBsZXQgYSBjb21taXR0ZWQgYC5lbnZgIChlLmcuIFdCX0VOVj1kZXZlbG9wbWVudCkgc2VsZWN0IHRoZSBkZXZlbG9wbWVudFxuICAvLyBlbnZpcm9ubWVudCDigJQgcnVubmluZyB0aGUgZGVzdHJ1Y3RpdmUgZTJlIHN1aXRlIGFnYWluc3QgdGhlIGRldmVsb3BlcidzIG93biBkYXRhYmFzZS5cbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIHByb2plY3QuZW52LkNJIHx8PSAnMSc7XG4gICAgLy8gT3ZlcndyaXRlLCBub3QgfHw9OiBwcm9qZWN0LmVudiBhbHJlYWR5IGNhcnJpZXMgdGhlIGRvdGVudi1kZXJpdmVkIHZhbHVlLlxuICAgIHByb2plY3QuZW52LldCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLnZpbmV4dCB8fCBkZXZEZXBzLnZpbmV4dCkge1xuICAgICAgLy8gdmluZXh0IGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gdGhpcyBjaGVjayBtdXN0IGNvbWUgZmlyc3QuXG4gICAgICBzY3JpcHRzID0gdmluZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpKSB7XG4gICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICBzY3JpcHRzID0gd29ya2Vyc1NjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZShwcm9qZWN0KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFRyZWVLaWxsQ29tbWFuZEFyZ3Mge1xuICBwaWQ6IG51bWJlcjtcbiAgc2lnbmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSAoeWFyZ3M6IEFyZ3YpOiBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0+XG4gIHlhcmdzXG4gICAgLnBvc2l0aW9uYWwoJ3BpZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByb2Nlc3MgSUQgdG8ga2lsbC4nLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdzaWduYWwnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpZ25hbCB0byBzZW5kIHRvIHRoZSBwcm9jZXNzIHRyZWUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJ1NJR1RFUk0nLFxuICAgIH0pIGFzIEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz47XG5cbmV4cG9ydCBjb25zdCB0cmVlS2lsbENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8b2JqZWN0LCBUcmVlS2lsbENvbW1hbmRBcmdzPiA9IHtcbiAgY29tbWFuZDogJ3RyZWUta2lsbCA8cGlkPiBbc2lnbmFsXScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgYWxsIGRlc2NlbmRhbnRzJyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGFyZ3Yuc2lnbmFsIGFzIE5vZGVKUy5TaWduYWxzO1xuICAgICAgaWYgKCEoc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgIH1cbiAgICAgIHRyZWVLaWxsKGFyZ3YucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG5leHBvcnQgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHR5cGVDaGVjayhhcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZUNoZWNrKGFyZ3Y6IFR5cGVDaGVja0NvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKC4uLmJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpKTtcbiAgICB9XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdweXJpZ2h0JykpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgIH1cbiAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIHByZXNlcnZlQ29sb3I6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gIGZvciAoY29uc3QgZXhpdENvZGUgb2YgZXhpdENvZGVzKSB7XG4gICAgaWYgKGV4aXRDb2RlKSBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgYHR5cGVzY3JpcHRgIChgdHNjYCk7IHdiZnkgcmVtb3ZlcyB0aGVcbiAgLy8gYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgcHJldmlldyBmcm9tIG5vbi1OZXh0LmpzIHJlcG9zIChOZXh0LmpzLWZhbWlseVxuICAvLyByZXBvcyBrZWVwIGl0IGZvciBgbmV4dCBidWlsZGApLCBzbyByZXBvcyBzdGlsbCBvbiB0aGUgcHJldmlldyBzaG91bGQgcnVuIHdiZnlcbiAgLy8gaW5zdGVhZCBvZiByZWx5aW5nIG9uIGEgdHNnbyBmYWxsYmFjayBoZXJlLlxuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCd0eXBlc2NyaXB0JykpIHtcbiAgICByZXR1cm4gWydCVU4gdHNjIC0tbm9FbWl0J107XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzLCBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2LCB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52IH0gZnJvbSAnLi90ZXN0LmpzJztcbmltcG9ydCB7IHR5cGVDaGVjaywgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiB9IGZyb20gJy4vdHlwZWNoZWNrLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xudHlwZSBQYWNrYWdlQ29tbWFuZEFyZ3YgPSBQaWNrPFZlcmlmeUNvZGVDb21tYW5kQXJndiwgJ2RyeVJ1bicgfCAndmVyYm9zZSc+O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCAoYXJndi5mdWxsID8gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YpIDogdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2KTtcbiAgICBhd2FpdCBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGluc3RhbGxgLCBwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAnY2xlYW51cCcsXG4gICAgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBMaW50Q29tbWFuZEFyZ3YpLFxuICAgIHsgc2lsZW50OiB0cnVlIH1cbiAgKTtcbiAgLy8gVHlwZS1hd2FyZSBsaW50IHJlcG9ydHMgVHlwZVNjcmlwdCBkaWFnbm9zdGljcyBvbmx5IGZvciB0aGUgZmlsZXMgb3hsaW50IGFjdHVhbGx5IGxpbnRzLCBhbmRcbiAgLy8gdGhlIHNoYXJlZCBjb25maWcgaWdub3JlcyBkaXJlY3RvcmllcyB0c2Mgc3RpbGwgY29tcGlsZXMgKGUuZy4gYF9fZ2VuZXJhdGVkX19gLCBgQHR5cGVzYCxcbiAgLy8gYGRpc3RgKS4gS2VlcCB0aGUgdHlwZWNoZWNrIGNvbW1hbmQgc28gYHZlcmlmeWAgc3RheXMgZXF1aXZhbGVudCB0byBcInRoZSByZXBvc2l0b3J5IGNvbXBpbGVzXCIuXG4gIC8vIFRoZSBvdmVybGFwIHdpdGggbGludCBpcyBkZWxpYmVyYXRlOiBgLS10eXBlLWF3YXJlYCBhbHNvIHBvd2VycyB0eXBlLWF3YXJlIGxpbnQgcnVsZXMsIGFuZFxuICAvLyBkcm9wcGluZyBvbmx5IGAtLXR5cGUtY2hlY2tgIGZyb20gbGludCBzYXZlcyB+MC4xcywgZmFyIGxlc3MgdGhhbiB0aGUgY292ZXJhZ2UgaXQgd291bGQgY29zdC5cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAndHlwZWNoZWNrJyxcbiAgICAoKSA9PiB0eXBlQ2hlY2soeyAuLi5hcmd2LCBfOiBbJ3R5cGVjaGVjayddIH0gYXMgdW5rbm93biBhcyBUeXBlQ2hlY2tDb21tYW5kQXJndiksXG4gICAgeyBzaWxlbnQ6IHRydWUgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KHtcbiAgICAuLi5hcmd2LFxuICAgIF86IFsndGVzdCddLFxuICAgIGUyZTogJ2hlYWRsZXNzJyxcbiAgICBzaWxlbnQ6IHRydWUsXG4gIH0gYXMgdW5rbm93biBhcyBUZXN0Q29tbWFuZEFyZ3YpO1xuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSByZXR1cm47XG5cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGItcmVzZXQnXSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCAndGVzdCcpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKFxuICAgIGNoYWxrLnllbGxvdygnVGVzdHMgZmFpbGVkLiBUaGlzIHByb2plY3QgZGVmaW5lcyBcImRiLXJlc2V0XCIsIHNvIHdiIHdpbGwgcmVzZXQgdGhlIGRhdGFiYXNlIG9uY2UgYW5kIHJldHJ5IHRlc3RzLicpXG4gICk7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBkYi1yZXNldGAsIGZpbmRUZXN0UHJvamVjdChwcm9qZWN0LCB0ZXN0QXJndiksIHRlc3RBcmd2LCB7XG4gICAgcHJpbnRSYXdPdXRwdXQ6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IHJldHJ5RXhpdENvZGUgPSBhd2FpdCB0ZXN0KHRlc3RBcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gIGlmIChyZXRyeUV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke3JldHJ5RXhpdENvZGV9KTpgKSwgJ3Rlc3QgYWZ0ZXIgZGItcmVzZXQgcmV0cnknKSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldHJ5RXhpdENvZGUpO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignVGVzdHMgcGFzc2VkIGFmdGVyIGRiLXJlc2V0IHJldHJ5LicpKTtcbn1cblxuZnVuY3Rpb24gZmluZFRlc3RQcm9qZWN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFByb2plY3Qge1xuICBjb25zdCB0ZXN0UHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoIXRlc3RQcm9qZWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0IG5vdCBmb3VuZDogJHtwcm9qZWN0LmRpclBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHRlc3RQcm9qZWN0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5JblByb2Nlc3NDb21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBjb21tYW5kOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkpO1xuICB9XG4gIGNvbnN0IGV4aXRDb2RlID0gKGF3YWl0IGNvbW1hbmQoKSkgPz8gMDtcbiAgaWYgKGV4aXRDb2RlID09PSAwIHx8IG9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBjb21tYW5kTmFtZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFja2FnZUNvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHByaW50UmF3T3V0cHV0PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgcHJlc2VydmVDb2xvcjogZmFsc2UgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICghb3B0aW9ucy5wcmludFJhd091dHB1dCkge1xuICAgIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZCwgZXhpdENvZGUsIHJldC5zdGRvdXQpO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUHJpbnRzIHBhY2thZ2UgY29tbWFuZCBvdXRwdXQgZm9yIGB3YiB2ZXJpZnlgLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBzbyBzdWNjZXNzZnVsIG5vaXN5XG4gKiBjb21tYW5kcyBhcmUgc3VtbWFyaXplZCB3aGlsZSBmYWlsdXJlIG91dHB1dCByZW1haW5zIGF2YWlsYWJsZSBmb3IgZGlhZ25vc2lzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIFRoZSBleGVjdXRlZCBjb21tYW5kLlxuICogQHBhcmFtIGV4aXRDb2RlIFRoZSBjb21tYW5kIGV4aXQgY29kZS5cbiAqIEBwYXJhbSBvdXRwdXQgVGhlIG1lcmdlZCBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kOiBzdHJpbmcsIGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCAmJiAvXig/OmJ1bnx5YXJuKSAoPzppbnN0YWxsfGdlbi1jb2RlKSQvdS50ZXN0KGNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWRPdXRwdXQgPSBvdXRwdXQudHJpbSgpO1xuICBpZiAodHJpbW1lZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHRyaW1tZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdDogUHJvamVjdCk6IHtcbiAgZmFpbDogKGVycm9yPzogdW5rbm93bikgPT4gdm9pZDtcbiAgZmluaXNoOiAoKSA9PiB2b2lkO1xuICBzdWNjZWVkOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHdiRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcud2InKTtcbiAgZnMubWtkaXJTeW5jKHdiRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4od2JEaXJQYXRoLCAndmVyaWZ5LWZ1bGwubG9nJyk7XG4gIGNvbnN0IGxvZ0ZpbGUgPSBmcy5vcGVuU3luYyhsb2dGaWxlUGF0aCwgJ3cnKTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRvdXRXcml0ZSA9IHByb2Nlc3Muc3Rkb3V0LndyaXRlLmJpbmQocHJvY2Vzcy5zdGRvdXQpO1xuICBjb25zdCBvcmlnaW5hbFN0ZGVycldyaXRlID0gcHJvY2Vzcy5zdGRlcnIud3JpdGUuYmluZChwcm9jZXNzLnN0ZGVycik7XG4gIGxldCBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZG91dFdyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUob3JpZ2luYWxTdGRlcnJXcml0ZSwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihjaGFsay5ib2xkKCdGdWxsIGxvZzonKSwgbG9nRmlsZVBhdGgpKTtcblxuICBjb25zdCBmaW5pc2ggPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSBvcmlnaW5hbFN0ZG91dFdyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IG9yaWdpbmFsU3RkZXJyV3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuXG4gICAgY29uc3QgZWxhcHNlZFRpbWUgPSBmb3JtYXRFbGFwc2VkVGltZShEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBzdGF0dXMgPSBzdWNjZWVkZWQgPyAnU3VjY2VlZGVkJyA6ICdGYWlsZWQnO1xuICAgIGNvbnN0IHN1bW1hcnkgPSBgJHtzdGF0dXN9IGluICR7ZWxhcHNlZFRpbWV9LiBGdWxsIGxvZzogJHtsb2dGaWxlUGF0aH1cXG5gO1xuICAgIGNvbnN0IGNvbG9yZWRTdW1tYXJ5ID0gc3VjY2VlZGVkID8gY2hhbGsuZ3JlZW4oc3VtbWFyeSkgOiBjaGFsay5yZWQoc3VtbWFyeSk7XG4gICAgb3JpZ2luYWxTdGRvdXRXcml0ZShjb2xvcmVkU3VtbWFyeSk7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIHN1bW1hcnkpO1xuICAgIGZzLmNsb3NlU3luYyhsb2dGaWxlKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCBmaW5pc2gpO1xuXG4gIHJldHVybiB7XG4gICAgZmFpbDogKGVycm9yKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbmlzaDogKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignZXhpdCcsIGZpbmlzaCk7XG4gICAgICBmaW5pc2goKTtcbiAgICB9LFxuICAgIHN1Y2NlZWQ6ICgpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGVlV3JpdGUob3JpZ2luYWxXcml0ZTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlLCBsb2dGaWxlOiBudW1iZXIpOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUge1xuICByZXR1cm4gKChcbiAgICBjaHVuazogVWludDhBcnJheSB8IHN0cmluZyxcbiAgICBlbmNvZGluZ09yQ2FsbGJhY2s/OiBCdWZmZXJFbmNvZGluZyB8ICgoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpLFxuICAgIGNhbGxiYWNrPzogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkXG4gICkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9XG4gICAgICB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnXG4gICAgICAgID8gQnVmZmVyLmZyb20oY2h1bmssIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdzdHJpbmcnID8gZW5jb2RpbmdPckNhbGxiYWNrIDogJ3V0ZjgnKVxuICAgICAgICA6IGNodW5rO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBidWZmZXIpO1xuICAgIC8vIFdyaXRlIHRvIHRoZSB0ZXJtaW5hbCB2aWEgdGhlIG9yaWdpbmFsIHN0cmVhbSBtZXRob2Q6IGEgc3luY2hyb25vdXMgZnMud3JpdGVTeW5jIG9uIHRoZVxuICAgIC8vIHN0ZG91dC9zdGRlcnIgZmQgdGhyb3dzIEVBR0FJTiBvbiBDSSdzIG5vbi1ibG9ja2luZyBwaXBlcyB3aGVuIGxhcmdlIG91dHB1dCBmbHVzaGVzIGF0IG9uY2UsXG4gICAgLy8gd2hpbGUgdGhlIHN0cmVhbSBtZXRob2QgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBoYW5kbGVzIGJhY2twcmVzc3VyZS5cbiAgICByZXR1cm4gb3JpZ2luYWxXcml0ZShidWZmZXIsIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiBjYWxsYmFjayk7XG4gIH0pIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gYCR7cmVtYWluaW5nU2Vjb25kc31zYDtcbiAgfVxuICByZXR1cm4gYCR7bWludXRlc31tICR7cmVtYWluaW5nU2Vjb25kc31zYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBjb25jdXJyZW50bHlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jb25jdXJyZW50bHkuanMnO1xuaW1wb3J0IHsgZGVwbG95Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZGVwbG95LmpzJztcbmltcG9ydCB7IGRvdGVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2RvdGVudi5qcyc7XG5pbXBvcnQgeyBnZW5Db2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuQ29kZS5qcyc7XG5pbXBvcnQgeyBnZW5EZXZWYXJzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuRGV2VmFycy5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgbWFpbnRlbmFuY2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9tYWludGVuYW5jZS5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmFpbHdheUVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JhaWx3YXlFbnYuanMnO1xuaW1wb3J0IHsgcmVsZWFzZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JlbGVhc2UuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRyZWVLaWxsQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHJlZUtpbGwuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgdmVyaWZ5Q29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeUNvZGUuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52LlBBVEg/LmluY2x1ZGVzKCcvYnVuLW5vZGUtJykpIHtcbiAgICAgIC8vIE5vdCBmaXhlZCB1cCBoZXJlOiB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KSBtYXkgaGFuZyBvclxuICAgICAgLy8gY3Jhc2ggdW5kZXIgdGhlIHNoaW0sIGFuZCBzb21lICh3cmFuZ2xlciBkZXYpIGZhaWwgc2lsZW50bHksIHNvIHN1cmZhY2UgdGhlIGNhdXNlIHVwZnJvbnQuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiV2FybmluZzogUEFUSCBjb250YWlucyBhIGJ1bi1ub2RlIHNoaW0gKGZyb20gYGJ1biAtLWJ1bmAgb3IgYnVuZmlnJ3MgYHJ1bi5idW5gKTsgXCIgK1xuICAgICAgICAgICdydW4gd2Igd2l0aG91dCBgLS1idW5gIGFuZCByZW1vdmUgYFtydW5dIGJ1bmAgZnJvbSBidW5maWcudG9tbC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKHZlcmlmeUNvZGVDb21tYW5kKVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoY29uY3VycmVudGx5Q29tbWFuZClcbiAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgLmNvbW1hbmQoZG90ZW52Q29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuQ29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkRldlZhcnNDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQobWFpbnRlbmFuY2VDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmFpbHdheUVudkNvbW1hbmQpXG4gIC5jb21tYW5kKHJlbGVhc2VDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHRyZWVLaWxsQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxubGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG5cbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwcm9jZXNzLnBpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvY2Vzcy5waWR9KSBkdXJpbmcgc2h1dGRvd246YCwgZXJyb3IpO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoKTtcbiAgfSk7XG59XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzcsOCw5LDEwLDExXSwibWFwcGluZ3Mi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LFdBQVcsV0FBVyxXQUFXLE1BQU0sV0FBVyxXQUFXLEVBQUUsV0FBVyxVQUFVLEVBQUUsU0FBU0MsR0FBRSxFQUFFLENBQUMsT0FBTyxJQUFJLEdBQUUsSUFBSSxHQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTUMsR0FBRSxHQUFHLENBQUMsSUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBTSxHQUFOLEtBQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxRQUFRLEVBQUUsS0FBSyxXQUFXLEVBQUUsS0FBSyxXQUFXLE1BQU0sR0FBRyxJQUFJLEVBQUUsS0FBSyxVQUFVLEtBQUssWUFBWSxFQUFFLEtBQUssYUFBYSxHQUFHLEVBQUUsS0FBSyxZQUFZLEdBQUcsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxLQUFLLFVBQVUsTUFBVSxNQUFNLHlCQUF5QixFQUFFLElBQU0sRUFBRSxLQUFLLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLEVBQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNLElBQUksS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBR0YsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEdBQUcsT0FBTyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBS0EsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUlBLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxLQUFLLElBQUksR0FBRyxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsR0FBRyxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLE1BQU0sR0FBRyxLQUFLLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLEVBQUUsS0FBSyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUUsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBTSxNQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxDQUFDLEVBQUUsSUFBTSxFQUFFLEtBQUssT0FBVyxFQUFFLEtBQUssY0FBb0IsRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxLQUFLLFFBQVEsRUFBRSxHQUFHLEtBQUssZ0JBQWdCLEtBQUssVUFBVSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsRUFBRSxJQUFNLEVBQUUsS0FBSyxXQUFlLEVBQUUsS0FBSyxFQUFRLEVBQUUsS0FBSyxhQUFhLEVBQUUsS0FBSyxXQUFlLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBR0QsRUFBRSxHQUFHLEVBQUUsSUFBSUEsRUFBRSxHQUFHLEdBQUdBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxFQUFFLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxJQUFJLElBQUksRUFBRUcsR0FBRSxDQUFDLEVBQUVDLEdBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHSixFQUFFLEdBQUcsRUFBRSxJQUFJQSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBR0EsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksR0FBR0EsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBQyxNQUFNSSxHQUFFLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEdBQUcsR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRyxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxJQUFJLEVBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFHLEdBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUUsR0FBRyxFQUFFLElBQUksR0FBRSxFQUFFLEVBQUUsRUNSaGxLLEdBQUUsVUFBVSxDQUFzeUIsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUE1eUIsU0FBUyxNQUFNLEtBQUssR0FBRyxDQUFDLElBQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFnQixFQUFFLFFBQVgsSUFBSyxJQUFhLEVBQUUsS0FB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QUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsR0FBVSxJQUFQLEtBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDLElBQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUUsT0FBTyxFQUFFLENBQUMsSUFBTSxFQUFFLEdBQUUsT0FBTyxHQUFFLE9BQU8sRUFBRSxHQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUssQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFNLEVBQUUsRUFBRSxZQUFZLEdBQWUsT0FBTyxHQUFuQixXQUFxQixDQUFDLElBQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQVksSUFBVCxJQUFLLEdBQU0sTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBTSxFQUFFLE9BQU8sUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQ0F2cEMsU0FBUyxHQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU9FLEdBQUVDLEdBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBaUMsU0FBUyxJQUFHLENBQUMsTUFBTSxFQUFFLENDQTFGLE1BQU0sRUFBRSxHQUFFLENBQUMsWUFBWUMsRUFBQyxDQUFDLEVBQUksR0FBRSxDQUFDLFlBQVlDLEVBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRSxDQUFDLGNBQWMsRUFBRSxJQUF5QixZQUFZLEVBQUVELElBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBaUIsR0FBRyxPQUFkLFNBQW1CLFVBQVUsQ0FBQyxJQUFNLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUMsSUFBTSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENDV2pkLFNB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
|
|
99
|
+
&& ${ys.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`}startProductionProtected(e,n){let r=xs(e);if(r){let i=`${V([`bash`,r])} ${n.normalizedArgsText??``}`.trim(),a=t.dirname(t.dirname(r));return this.buildProductionCommand(e,n,[e.buildCommand,a===e.dirPath?i:`(${V([`cd`,a])} && ${i})`])}let i=Ss(e),a=i?[e.buildCommand,`pm2-runtime start --no-autorestart ${i}`]:this.buildDefaultProductionStartCommands(e,n);return this.buildProductionCommand(e,n,a)}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`${e.isBunAvailable?`bun`:`node`} dist/index.js ${t.normalizedArgsText??``}`.trim()]}buildProductionCommand(e,t,n){let r=vt(e,`test`)&&U(e)?[`rm -Rf "${st(e)}"`]:[],i=!!at(e);return[...[...r,...e.hasPrisma?[dr.migrate(e)]:[],...e.hasDrizzle&&!i?[rt(e,An.migrateForStart(e))]:[]].flatMap(e=>e.split(`&&`)),...n].filter(Boolean).map(e=>`${e} ${vs(t)}`.trim()).join(` && `)}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,ys.stopAndStart(e),n)}async testStart(e,t){return e.env.PORT||=`3000`,await li(e.env.PORT,e),`${Qe(`NODE_ENV`,``)} ${V([`YARN`,`wb`,`concurrently`,...Xe(t),`--kill-others`,`--success`,`first`,this.startDevProtected(e,t),this.waitApp(e)])}`}async testE2EProtected(e,t,n,r){e.env.PORT||=`3000`;let i=await li(e.env.PORT,e),a=this.buildPlaywrightOnlyCommand(e,t,r);return e.skipLaunchingServerForPlaywright?a:V([`YARN`,`wb`,`concurrently`,...Xe(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`${$(i,`-t 600000 -i 2000`)}
|
|
100
|
+
&& ${a}`])}buildPlaywrightOnlyCommand(e,t,{forwardedPlaywrightArgs:n=[],playwrightArgs:r=[`test`,`test/e2e/`]}){let i=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``;return`${Cs(r,t.targets,t.bail,n)}${i}`}testUnit(e,t){let n=t.targets?.map(String);return e.hasVitest?V([`YARN`,`vitest`,`run`,...n?.length?n:[`test/unit/`],`--passWithNoTests`,`--allowOnly`,`--watch=false`,...t.bail?[`--bail=1`]:[]]):e.isBunAvailable?V([`bun`,`test`,...n?.length?n:[`test/unit/`],...t.bail?[`--bail`]:[]]):`echo "No tests."`}waitApp(e){let t=e.env.PORT;return`${$(t,`-t 10000`)} 2> /dev/null
|
|
101
|
+
|| ${$(t,`-t 10000 -i 500`)} 2> /dev/null
|
|
102
|
+
|| ${$(t,`-t 10000 -i 1000`)} 2> /dev/null
|
|
103
|
+
|| ${$(t,`-t 10000 -i 2000`)} 2> /dev/null
|
|
104
|
+
|| ${$(t,`-t 20000 -i 4000`)} 2> /dev/null
|
|
105
|
+
|| ${$(t,`-t 60000 -i 5000`)} 2> /dev/null
|
|
106
|
+
|| ${$(t,`-t 90000 -i 10000`)}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || ${$(t)} && open-cli http://\${HOST:-localhost}:${t}`}};function $(e,t){return`NO_PROXY=localhost no_proxy=localhost wait-on ${t?`${t} `:``}http-get://localhost:${e}`}function xs(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function Ss(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function Cs(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return ws([...i,...e,...r],n);let o=e.slice(1),s=Ts(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return ws([...i,`test`,...a,...c,...r],n)}function ws(e,t){let n=e.indexOf(`playwright`),r=n!==-1&&e[n+1]===`test`;return!t||!r||e.some(e=>e===`--max-failures`||e.startsWith(`--max-failures=`))?V(e):V([...e,`--max-failures=1`])}function Ts(e){let t,n=[];for(let[r,i]of e.entries()){if(t){if(t===`required`||!i.startsWith(`-`)){t=void 0;continue}t=void 0}if(i===`--`)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(i.startsWith(`--`)){if(i.includes(`=`))continue;Es.has(i)?t=`required`:Ds.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&Os.has(e)&&(t=`required`);continue}n.push(r)}return n}const Es=new Set([`--browser`,`--config`,`--grep`,`--grep-invert`,`--global-timeout`,`--max-failures`,`--output`,`--project`,`--repeat-each`,`--reporter`,`--retries`,`--shard`,`--test-list`,`--test-list-invert`,`--timeout`,`--trace`,`--tsconfig`,`--ui-host`,`--ui-port`,`--ui-title`,`--workers`]),Ds=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),Os=new Set([`-c`,`-g`,`-j`]);var ks=class extends bs{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);e.env.PORT||=`3000`;let i=await li(e.env.PORT,e),a=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,o=t.targets?.map(String),s=o?.length?o:[`test/e2e/`],c=this.testUnit(e,{...t,targets:s});return V([`YARN`,`wb`,`concurrently`,...Xe(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`${$(i,`-t 600000 -i 2000`)} && ${c}${a}`])}};const As=new ks,js=new class extends bs{constructor(){super(!0)}startDevProtected(e,t){return`YARN next dev --turbopack ${t.normalizedArgsText??``}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??``}`.trim()]}},Ms=new class extends bs{constructor(){super(!1)}startDevProtected(e,t){throw Error(`This method should not be called.`)}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${e.isBunAvailable?`bun run`:`node`} dist/index.js ${t.normalizedArgsText??``} | tee server.log`)}startTest(){return Promise.resolve(`echo 'do nothing.'`)}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,`development`)} && ${ys.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(e,t,n){return this.testE2EWithPlaywrightManagedServer(e,t,n)}testE2EProduction(e,t,n){return this.testE2EWithPlaywrightManagedServer(e,t,n)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testE2EWithPlaywrightManagedServer(e,t,n){return Promise.resolve(e.hasPlaywrightWebServerConfig?this.buildPlaywrightOnlyCommand(e,t,n):`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},Ns=new class extends bs{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[et(t,`.dev.vars`)],i=vt(e,`test`)?nt(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=nt(e);return[e.buildCommand,et(t,`dist/server/.dev.vars`),...r?[r]:[],tt(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${st(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},Ps=new class extends bs{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??``}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??``}`.trim()}},Fs=new class extends ks{startDevProtected(e,t){return this.buildWranglerDevCommands(e,t).join(` && `)}buildDefaultProductionStartCommands(e,t){return this.buildWranglerDevCommands(e,t)}buildWranglerDevCommands(e,t){e.env.PORT||=`8787`;let n=st(e),r=[et(t,`.dev.vars`)],i=nt(e);return i&&r.push(i),r.push(tt(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}},Is=[`express`,`fastify`,`elysia`,`hono`],Ls={...gs,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},Rs={command:`start [args..]`,describe:`Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0`,builder:e=>e.parserConfiguration({"populate--":!0}).options(Ls),async handler(e){_s(e);let t=await G(e);t||(console.error(p.red(`No project found.`)),process.exit(1));for(let n of t.descendants){let t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{},i;if(t.vinext||r.vinext)i=Ns;else if(t.next)i=js;else if(r.vite)i=Ps;else if(U(n))i=Fs;else if(Is.some(e=>t[e])&&!t[`firebase-functions`]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=As;else if(t[`build-ts`]||r[`build-ts`])i=Ms;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await K(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await K(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await K(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await K(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await K(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},zs=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),Bs=.05,Vs={e2e:{description:`How to run E2E tests`,type:`string`,choices:[`headless`,`headless-dev`,`headed`,`headed-dev`,`docker`,`docker-debug`,`debug`,`generate`,`trace`],default:`headless`},silent:{description:`Reduce redundant outputs`,type:`boolean`},bail:{description:`Stop tests after the first failure`,type:`boolean`},"unit-timeout":{description:`Timeout for unit tests`,type:`number`}},Hs={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},Us={command:`test [targets...]`,describe:`Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'`,builder:e=>e.parserConfiguration({"populate--":!0}).options(Vs).positional(`targets`,Hs.targets),async handler(e){process.exit(await Ws(e))}};async function Ws(n,r={}){let i=Ks(n),a=await G(i);if(!a)return console.error(p.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=rc(o,s);for(let n of a.descendants){n.env;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d;d=a.vinext||u.vinext?Ns:a.next?js:u.vite?Ps:U(n)?Fs:Is.some(e=>a[e])&&!a[`firebase-functions`]?As:Ms,console.info(`Running "test" for ${n.name} ...`);let f=qs(n);if(l&&f!==!1){let e=o.filter(e=>e.includes(`/unit`)),t=e.length>0?e:f.length>0?f:void 0,a={...i,targets:t},s=await Xs(d.testUnit(n,a),n,i,{exitIfFailed:r.exitIfFailed,timeout:i.unitTimeout});if(s!==0)return s}if(!c||!e.existsSync(t.join(n.dirPath,`test`,`e2e`))){c&&Gs(n);continue}let p=o.filter(e=>e.includes(`/e2e`)),m={...i,targets:p.length>0?p:void 0};switch(i.e2e){case`headless`:{let e=await Ys(await d.testE2EProduction(n,m,{playwrightArgs:nc(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await Ys(await d.testE2EDev(n,m,{playwrightArgs:nc(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await Js(n,m,d,nc(p,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await Js(n,m,d,nc(p,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.next||u.vite)switch(i.e2e){case`headed`:{let e=await Ys(await d.testE2EProduction(n,m,{playwrightArgs:nc(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await Ys(await d.testE2EDev(n,m,{playwrightArgs:nc(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await Ys(await d.testE2EProduction(n,m,{playwrightArgs:nc(p,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await Ys(await d.testE2EProduction(n,m,{playwrightArgs:[`codegen`,`http://localhost:${n.env.PORT}`]}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`trace`:{let e=await Ys(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function Gs(n){n.packageJson.workspaces||e.existsSync(t.join(n.dirPath,`playwright.config.ts`))&&console.warn(p.yellow(`Skipping e2e tests for ${n.name}: a Playwright config exists but the test/e2e directory is missing. wb only discovers Playwright specs under test/e2e/, so move them there to run e2e tests.`))}function Ks(e){return e.env?.length||e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?{...e,commandDefaultWbEnv:`test`}:{...e,cascadeEnv:`test`}}function qs(n){return e.existsSync(t.join(n.dirPath,`test`,`unit`))?[]:n.hasVitest&&e.existsSync(t.join(n.dirPath,`test`))?e.existsSync(t.join(n.dirPath,`test`,`e2e`))?[`test`,`--exclude`,`test/e2e/**`]:[`test`]:!1}async function Js(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await K(`${n.buildDocker(e,`test`)}${vs(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await Ys(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await K(ys.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function Ys(e,t,n,r={}){return K(e,t,n,{...r,processSilentOutput:Zs})}function Xs(e,t,n,r={}){return K(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function Zs(e){let t=[],n=new Set,r=[];for(let i of Qs(e)){let e=ec(i);n.has(e)||t.some(t=>tc(t,e))||($s(t,n,e),r.push(i))}return r.join(`
|
|
107
|
+
`)}function*Qs(e){let t=0;for(;t<=e.length;){let n=e.indexOf(`
|
|
108
|
+
`,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function $s(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;let r=e.shift();r!==void 0&&t.delete(r)}function ec(e){return e.replaceAll(zs,``).trim().replaceAll(/^(?:\[[^\]]+\]\s*)+/g,``).replaceAll(/\(node:\d+\)/g,`(node:<number>)`).replaceAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?\b/g,`<timestamp>`).replaceAll(/([?&]cache=)\d+/g,`$1<number>`)}function tc(e,t){let n=Math.max(e.length,t.length);return n===0?!0:Math.abs(e.length-t.length)>n*Bs?!1:D(e,t)/n<=Bs}function nc(e,t=[],n=[]){let r=Ts(t).length>0;return[`test`,...e.length>0||r?[]:[`test/e2e/`],...n]}function rc(e,t=[]){let n=e.some(e=>e.includes(`/e2e`)),r=e.some(e=>e.includes(`/unit`)),i=e.length===0&&t.length===0;return{shouldRunUnit:i||r,shouldRunE2e:i||n||t.length>0}}const ic={command:`test-on-ci`,describe:`Test project on CI with no options.`,builder:{silent:{description:`Reduce redundant outputs`,type:`boolean`}},async handler(e){await ac(e)}};async function ac(n){process.env.WB_ENV||=`test`;let r=await G(n);r||(console.error(p.red(`No project found.`)),process.exit(1));for(let i of r.descendants){i.env.CI||=`1`,i.env.WB_ENV=process.env.WB_ENV;let r=i.packageJson.dependencies??{},a=i.packageJson.devDependencies??{},o;o=r.vinext||a.vinext?Ns:r.next?js:a.vite?Ps:U(i)?Fs:Is.some(e=>r[e])&&!r[`firebase-functions`]?As:Ms,console.info(`Running "test-on-ci" for ${i.name} ...`);let s=i.hasDockerfile;if(s&&await q(ys.stopAll(),i,n),e.existsSync(t.join(i.dirPath,`test`,`unit`))&&await q(o.testUnit(i,n).replaceAll(` --allowOnly`,``),i,n),e.existsSync(t.join(i.dirPath,`test`,`e2e`))){await q(await o.testStart(i,n),i,n),await Bt.promiseAll(),s&&(i.env.WB_DOCKER||=`1`,await K(`${o.buildDocker(i,`test`)}${vs(n)}`,i,n));let e=s?await o.testE2EDocker(i,n,{}):await o.testE2EProduction(i,n,{});process.exitCode=await K(e.replaceAll(` --allowOnly`,``),i,n,{exitIfFailed:!1}),s&&await K(ys.stop(i),i,n)}else Gs(i)}}const oc={command:`tree-kill <pid> [signal]`,describe:`Kill the given process and all descendants`,builder:e=>e.positional(`pid`,{description:`The process ID to kill.`,type:`number`,demandOption:!0}).option(`signal`,{description:`Signal to send to the process tree.`,type:`string`,default:`SIGTERM`}),handler(e){try{let t=e.signal;if(!(t in g.signals))throw Error(`Invalid signal: ${t}`);I(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},sc={command:`typecheck`,describe:`Run type checking. .env files are ignored.`,builder:{},async handler(e){process.exit(await cc(e))}};async function cc(n){let r=await G(n,!1);if(!r)return console.error(p.red(`No project found.`)),1;let i=!1,a=r.descendants.map(async a=>{let o=[];for((!a.packageJson.workspaces||a.hasSourceCode)&&o.push(...lc(a)),!a.packageJson.workspaces&&a.hasOwnDependency(`pyright`)&&o.push(`YARN pyright`);o.length>0;){let s=await q(o.join(` && `),a,n,{ci:r.descendants.length>1,exitIfFailed:!1,preserveColor:!0}),c=t.join(a.dirPath,`.next`);if(s&&e.existsSync(c)){e.rmSync(c,{force:!0,recursive:!0}),console.info(p.yellow("Removed `.next` directory. We will re-try type checking.")),i=!0;continue}return s}}),o=await Promise.all(a),s=0;for(let e of o)e&&(s=e);return s||console.info(p.green(i?`-----
|
|
109
|
+
No type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.`:`No type errors found.`)),s}function lc(e){return e.hasOwnDependency(`typescript`)?[`BUN tsc --noEmit`]:[]}const uc={...sc,command:`tc`},dc={command:`verify`,describe:`Verify project code`,builder:{full:{type:`boolean`,default:!1,describe:`Run tests after verifying project code`}},async handler(e){let t=yt(e,!1);t||(console.error(p.red(`No project found.`)),process.exit(1)),await(e.full?fc(t.self,e):pc(t.self,e))}};async function fc(e,t){let n=bc(e);try{await pc(e,t),await mc(e,t),n.succeed()}catch(e){throw n.fail(e),e}finally{n.finish()}}async function pc(e,t){await _c(`${e.packageManagerCommand} install`,e,t),e.packageJson.scripts?.[`gen-code`]&&await _c(`${e.packageManagerCommand} gen-code`,e,t),await gc(`cleanup`,()=>Lr({...t,_:[`lint`],fix:!0,format:!0,silent:!0}),{silent:!0}),await gc(`typecheck`,()=>cc({...t,_:[`typecheck`]}),{silent:!0})}async function mc(e,t){let n=Ks({...t,_:[`test`],e2e:`headless`,silent:!0}),r=await Ws(n,{exitIfFailed:!1});if(r===0)return;e.packageJson.scripts?.[`db-reset`]||(console.info(p.red(p.bold(`Failed (exit code ${r}):`),`test`)),process.exit(r)),console.info(p.yellow(`Tests failed. This project defines "db-reset", so wb will reset the database once and retry tests.`)),await _c(`${e.packageManagerCommand} db-reset`,hc(e,n),n,{printRawOutput:!0});let i=await Ws(n,{exitIfFailed:!1});i!==0&&(console.info(p.red(p.bold(`Failed (exit code ${i}):`),`test after db-reset retry`)),process.exit(i)),console.info(p.green(`Tests passed after db-reset retry.`))}function hc(e,t){let n=W(t,!0,e.dirPath);if(!n)throw Error(`Project not found: ${e.dirPath}`);return n}async function gc(e,t,n={}){n.silent||console.info(`
|
|
110
|
+
`+p.cyan(p.bold(`Start:`),e));let r=await t()??0;return r===0||n.allowFailure?n.silent||console.info(p.green(p.bold(`Finished:`),e)):(console.info(p.red(p.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function _c(e,t,n,r={}){if(yc(e,t.dirPath),n.dryRun)return 0;let i=await L(e,void 0,{cwd:t.dirPath,env:Kt(t.env,{preserveColor:!1}),shell:!0,stdio:`pipe`,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),a=i.status??1;return r.printRawOutput||vc(e,a,i.stdout),a!==0&&!r.allowFailure&&(console.info(p.red(p.bold(`Failed (exit code ${a}):`),e)),process.exit(a)),a}function vc(e,t,n){if(t===0&&/^(?:bun|yarn) (?:install|gen-code)$/u.test(e)){console.info(p.green(`Succeeded.`));return}let r=n.trim();r&&(process.stdout.write(r),process.stdout.write(`
|
|
111
|
+
`))}function yc(e,t){console.info(`
|
|
112
|
+
`+p.cyan(p.bold(`Command:`),e)+p.gray(` at ${t}`))}function bc(n){let r=Date.now(),i=t.join(n.dirPath,`.wb`);e.mkdirSync(i,{recursive:!0});let a=t.join(i,`verify-full.log`),o=e.openSync(a,`w`),s=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr),l=!1,u=!1;process.stdout.write=xc(s,o),process.stderr.write=xc(c,o),console.info(p.cyan(p.bold(`Full log:`),a));let d=()=>{if(u)return;u=!0,process.stdout.write=s,process.stderr.write=c;let t=Sc(Date.now()-r),n=`${l?`Succeeded`:`Failed`} in ${t}. Full log: ${a}\n`,i=l?p.green(n):p.red(n);s(i),e.writeSync(o,n),e.closeSync(o)};return process.once(`exit`,d),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener(`exit`,d),d()},succeed:()=>{l=!0}}}function xc(t,n){return((r,i,a)=>{let o=typeof r==`string`?Buffer.from(r,typeof i==`string`?i:`utf8`):r;return e.writeSync(n,o),t(o,typeof i==`function`?i:a)})}function Sc(e){let t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}await d(f(process.argv)).scriptName(`wb`).options(Ye).middleware(e=>{let n=e[`working-dir`];if(n){let e=t.resolve(n);process.chdir(e)}process.env.PATH?.includes(`/bun-node-`)&&console.warn("Warning: PATH contains a bun-node shim (from `bun --bun` or bunfig's `run.bun`); run wb without `--bun` and remove `[run] bun` from bunfig.toml."),me(process.env)}).command(dc).command(Tt).command(Xt).command(Un).command(Xn).command(fr).command(Ln).command(xr).command(Ir).command(wi).command(za).command(bo).command(Jo).command(Yo).command(ps).command(ms).command(sa).command(Rs).command(Us).command(ic).command(oc).command(sc).command(uc).demandCommand().strict().version(Cc()).help().argv;function Cc(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,`package.json`));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`)).version}let wc=!1;for(let e of[`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,()=>{if(!wc){wc=!0;try{I(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
|
|
113
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsInQiLCJpIiwibyIsIm4iLCJyIiwiYSIsIm4iLCJyIiwibiIsInQiLCJlIiwiYnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYXJndW1lbnRzQnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUiLCJERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgiLCJidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZCIsImdldExpdGVzdHJlYW1Db25maWdPcHRpb24iLCJwYXJzZSIsInBhcnNlRG90ZW52IiwiZGVwbG95Q29tbWFuZCIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZnMiLCJzZXRUaW1lb3V0IiwiYnVpbGRlciIsInNldFRpbWVvdXQiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwidG9VbnNjb3BlZFBhY2thZ2VOYW1lIiwiYnVpbGRlciIsImlzRG9ja2VyRW5hYmxlZCIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZnMiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiYnVpbGRlciIsImRlcGxveUNvbW1hbmQiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9iaW5QYXRoLnRzIiwiLi4vc3JjL3V0aWxzL2NpLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL3V0aWxzL3dyYW5nbGVyLnRzIiwiLi4vc3JjL3Byb2plY3QudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy9zY3JpcHRzL3J1bi50cyIsIi4uL3NyYy9jb21tYW5kcy9jb25jdXJyZW50bHkudHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5EZXZWYXJzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2RlcGxveS50cyIsIi4uL3NyYy9jb21tYW5kcy9kb3RlbnYudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkNvZGUudHMiLCIuLi9zcmMvY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLnRzIiwiLi4vc3JjL3V0aWxzL291dHB1dC50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy9jb21tYW5kcy9tYWludGVuYW5jZS50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUmVnaXN0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JhaWx3YXlFbnYudHMiLCIuLi9zcmMvY29tbWFuZHMvcmVsZWFzZS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2J1aWxkZXIudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3V0aWxzL2xvZy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9odHRwU2VydmVyUGFja2FnZXMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0T25DaS50cyIsIi4uL3NyYy9jb21tYW5kcy90cmVlS2lsbC50cyIsIi4uL3NyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyaWZ5Q29kZS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIG5hcmdzOiAxLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICAncXVpZXQtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3VwcHJlc3MgLmVudiBmaWxlIGxvYWRpbmcgaW5mb3JtYXRpb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+ICYge1xuICAvKipcbiAgICogQ29tbWFuZC1sZXZlbCBmYWxsYmFjayBmb3IgYW4gdW5zZXQgV0JfRU5WIChlLmcuIGB3YiB0ZXN0YCBzdXBwbGllcyAndGVzdCcgd2hlbiBleHBsaWNpdCBlbnZcbiAgICogZmxhZ3Mgc3VwcHJlc3MgaXRzIGRlZmF1bHQgdGVzdCBjYXNjYWRlKS4gTm90IGEgQ0xJIGZsYWcuXG4gICAqL1xuICBjb21tYW5kRGVmYXVsdFdiRW52Pzogc3RyaW5nO1xufTtcblxuY29uc3Qgc3RhbmRhcmRXYkVudk1vZGVzID0gbmV3IFNldChbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBXQl9FTlYgdmFsdWUgd2IgZmFsbHMgYmFjayB0byB3aGVuIG5vIGVudiBzb3VyY2UgYW5kIG5vIGV4cG9ydGVkIHZhcmlhYmxlIGRlZmluZXNcbiAqIGl0OiB0aGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGZpcnN0IChgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgIGxvYWRzIHRoZSBzdGFnaW5nIGZpbGVzXG4gKiBidXQgaXRzIHRlc3RzIG11c3Qgc3RpbGwgcnVuIGFzIGB0ZXN0YCwgbWlycm9yaW5nIHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKSwgdGhlbiB0aGVcbiAqIGZvcmNlZCBjYXNjYWRlLCB0aGVuIHRoZSBhbWJpZW50LU5PREVfRU5WLWRyaXZlbiBhdXRvIGNhc2NhZGUgY2xhbXBlZCB0byBhIHN0YW5kYXJkIG1vZGUgKGFcbiAqIG5vbi1zdGFuZGFyZCBOT0RFX0VOViBzdWNoIGFzIGBxYWAgc3RpbGwgc2VsZWN0cyB0aGUgY2FzY2FkZSBzdWZmaXgsIGJ1dCBtdXN0IG5vdCBwcm9kdWNlIGFcbiAqIG5vbi1zdGFuZGFyZCBXQl9FTlYpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZyB7XG4gIGlmIChhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnYpIHJldHVybiBhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnY7XG4gIGlmIChhcmd2LmNhc2NhZGVFbnYpIHJldHVybiBhcmd2LmNhc2NhZGVFbnY7XG4gIC8vIFJlYWQgTk9ERV9FTlYgdGhyb3VnaCB0aGUgYWxpYXMgZm9yIHRoZSBzYW1lIGJ1bmRsZXItaW5saW5pbmcgcmVhc29uIGFzIGluXG4gIC8vIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgYW5kIGZyb20gdGhlIEFNQklFTlQgZW52aXJvbm1lbnQgKG5vdCBsb2FkZWQgZmlsZXMpIGJlY2F1c2UgdGhlXG4gIC8vIGNhc2NhZGUgc2VsZWN0aW9uIGJlbG93IHVzZXMgdGhlIGFtYmllbnQgdmFsdWUgYXMgd2VsbC5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBkZXJpdmVkID1cbiAgICBhcmd2LmNhc2NhZGVOb2RlRW52IHx8IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogJ2RldmVsb3BtZW50JztcbiAgcmV0dXJuIHN0YW5kYXJkV2JFbnZNb2Rlcy5oYXMoZGVyaXZlZCkgPyBkZXJpdmVkIDogJ2RldmVsb3BtZW50Jztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyTmFtZXNdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgLyoqXG4gICAgICogTG9hZCB2YXJpYWJsZXMgZXZlbiBpZiB0aGV5IGFscmVhZHkgZXhpc3QgaW4gcHJvY2Vzcy5lbnYuXG4gICAgICogVXNlZnVsIHdoZW4gYSBwYXJlbnQgcHJvY2VzcyBoYXMgYWxyZWFkeSBpbmplY3RlZCB0aGUgLmVudiB2YWx1ZXMgaW50byB0aGUgZW52aXJvbm1lbnRcbiAgICAgKiBhbmQgdGhlIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXMgdGhlbXNlbHZlcyBhcmUgbmVlZGVkIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKS5cbiAgICAgKi9cbiAgICBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBFeHBhbmQgYCR7V0JfRU5WfWAgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBmYWxsYmFjayBtb2RlIHdoZW4gbm90aGluZyBkZWZpbmVzIFdCX0VOVi5cbiAgICAgKiBPbmx5IGZvciBjYWxsZXJzIHRoYXQgc3Vic2VxdWVudGx5IENPTVBMRVRFIFdCX0VOViB3aXRoIHRoYXQgZmFsbGJhY2sgKHdiJ3MgUHJvamVjdC5lbnYpLlxuICAgICAqL1xuICAgIGV4cGFuZEZhbGxiYWNrV2JFbnY/OiBib29sZWFuO1xuICB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICAvLyBSZWFkIE5PREVfRU5WIHRocm91Z2ggYW4gYWxpYXMsIG5ldmVyIGFzIHRoZSBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIG1lbWJlciBleHByZXNzaW9uOlxuICAvLyBidW5kbGVycyByZXBsYWNlIHRoYXQgZXhhY3QgZXhwcmVzc2lvbiBhdCBidWlsZCB0aW1lIChyb2xsZG93bi9idWlsZC10cyBpbmxpbmUgaXQgYXNcbiAgLy8gJ3Byb2R1Y3Rpb24nKSwgd2hpY2ggY29uc3RhbnQtZm9sZHMgdGhlIGZhbGxiYWNrIGJlbG93IGFuZCBtYWRlIHRoZSBwdWJsaXNoZWQgd2Igc2VsZWN0XG4gIC8vIHRoZSBwcm9kdWN0aW9uIHByb2ZpbGUgd2hlbmV2ZXIgV0JfRU5WIHdhcyB1bnNldC5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHJ1bnRpbWVFbnYuV0JfRU5WIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGNvbnN0IHNob3VsZFN1cHByZXNzT3V0cHV0ID0gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtydW50aW1lRW52LldCX0VOVn0sIE5PREVfRU5WOiAke3J1bnRpbWVFbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIC8vIFdoZW4gdGhlIGNhbGxlciBleHBsaWNpdGx5IGZvcmNlcyBhIG1vZGUgKC0tY2FzY2FkZS1lbnYgLyAtLWNhc2NhZGUtbm9kZS1lbnYgLyBhbiBleHBvcnRlZFxuICAvLyBXQl9FTlYpLCB2YWx1ZXMgdGhhdCB0aGUgbW9kZSdzIG93biBlbnYgZmlsZXMgZGVmaW5lIG11c3Qgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZCBmcm9tXG4gIC8vIHRoZSBwYXJlbnQgc2hlbGw6IGEgc3RhbGUgYGV4cG9ydCBEQVRBQkFTRV9VUkw9Li4uYCBmcm9tIGEgZGV2ZWxvcG1lbnQgc2hlbGwgbXVzdCBub3QgbGVha1xuICAvLyBpbnRvIGB3YiB0ZXN0YCdzIHRlc3QgbW9kZSAoY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuIE9uIENJIHRoZVxuICAvLyBpbmhlcml0ZWQgdmFyaWFibGVzIGtlZXAgd2lubmluZyDigJQgd29ya2Zsb3dzIGRlbGliZXJhdGVseSBpbmplY3QgZW52IHZhcnMgdGhhdCBvdmVycmlkZSB0aGVcbiAgLy8gY29tbWl0dGVkIGZpbGVzIOKAlCBhbmQgdGhhdCBzaGFkb3dpbmcgaXMgdGhlIGRlc2lnbmVkIGJlaGF2aW9yLCBzbyBubyB3YXJuaW5nIGlzIGVtaXR0ZWQuXG4gIGNvbnN0IG1vZGVJc0ZvcmNlZCA9IEJvb2xlYW4oXG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnYgPyBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCcgOiBhcmd2LmF1dG9DYXNjYWRlRW52ID8gcnVudGltZUVudi5XQl9FTlYgOiB1bmRlZmluZWQpXG4gICk7XG4gIGNvbnN0IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiA9IG1vZGVJc0ZvcmNlZCAmJiAhaXNDSUVudmlyb25tZW50KHJ1bnRpbWVFbnYuQ0kpO1xuICAvLyBPdmVycmlkZSBlbGlnaWJpbGl0eSBpcyBkZWNpZGVkIHBlciBLRVksIG5vdCBwZXIgZmlsZTogYC5lbnYubG9jYWxgIG91dHJhbmtzIGAuZW52Ljxtb2RlPmBcbiAgLy8gaW4gdGhlIGNhc2NhZGUsIHNvIG9uY2UgdGhlIG1vZGUgZGVmaW5lcyBhIGtleSwgdGhlIHZhbHVlIHdpbm5pbmcgdGhlIG5vcm1hbCBmaWxlIHByZWNlZGVuY2VcbiAgLy8gKHdoaWNoIG1heSBjb21lIGZyb20gYC5lbnYubG9jYWxgKSBtdXN0IGJlIHRoZSBvbmUgb3ZlcnJpZGluZyB0aGUgc2hlbGwuXG4gIGNvbnN0IG1vZGVTcGVjaWZpY0VudktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgaWYgKG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiB0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycgJiYgY2FzY2FkZS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgICBpZiAoZW52UGF0aC5lbmRzV2l0aChgLiR7Y2FzY2FkZX1gKSB8fCBlbnZQYXRoLmVuZHNXaXRoKGAuJHtjYXNjYWRlfS5sb2NhbGApKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIG1vZGVTcGVjaWZpY0VudktleXMuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKGtleSBpbiBlbnZWYXJzKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgaW5oZXJpdGVkVmFsdWUgPSBwcm9jZXNzLmVudltrZXldO1xuICAgICAgY29uc3Qgc2hhZG93ZWRCeVByb2Nlc3NFbnYgPSAhb3B0aW9ucz8uaWdub3JlUHJvY2Vzc0VudiAmJiBrZXkgaW4gcHJvY2Vzcy5lbnY7XG4gICAgICBpZiAoc2hhZG93ZWRCeVByb2Nlc3NFbnYgJiYgIShtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgJiYgbW9kZVNwZWNpZmljRW52S2V5cy5oYXMoa2V5KSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2hhZG93ZWRCeVByb2Nlc3NFbnYgJiYgaW5oZXJpdGVkVmFsdWUgIT09IHZhbHVlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFdhcm5pbmc6ICR7a2V5fSBpbiAke2VudlBhdGh9IG92ZXJyaWRlcyB0aGUgdmFsdWUgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBlbnZpcm9ubWVudCBiZWNhdXNlIHRoZSAke2Nhc2NhZGV9IGVudmlyb25tZW50IGlzIGV4cGxpY2l0bHkgZm9yY2VkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtlbnZQYXRoLCBrZXlzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQgJiYga2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtrZXlzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBbZm5veEVudlZhcnMsIGZub3hFbnZWYXJOYW1lc10gPSByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgY2FzY2FkZSwgZW52VmFycywge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52LFxuICB9KTtcbiAgT2JqZWN0LmFzc2lnbihlbnZWYXJzLCBmbm94RW52VmFycyk7XG4gIC8vIFJlcG9ydCB0aGUgZm5veCBzb3VyY2Ugd2hlbmV2ZXIgZm5veC50b21sIGV4aXN0cyDigJQgZXZlbiB3aGVuIGl0IHlpZWxkcyBubyBrZXlzIChhbGwgc2hhZG93ZWQsXG4gIC8vIGVtcHR5IHByb2ZpbGUsIG9yIGEgZmFpbGluZyBleHBvcnQpOiBjb25zdW1lcnMgc3VjaCBhcyB3YidzIHJlcXVpcmVkLWVudmlyb25tZW50IHZhbGlkYXRpb25cbiAgLy8gbXVzdCBzZWUgdGhhdCBhIGRlY2xhcmVkIGVudiBzb3VyY2UgZXhpc3RzIHJhdGhlciB0aGFuIHNpbGVudGx5IGZhaWxpbmcgb3Blbi5cbiAgaWYgKGZub3hFbnZWYXJOYW1lcy5sZW5ndGggPiAwIHx8IGhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZCkpIHtcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZm5veEVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKSwgZm5veEVudlZhck5hbWVzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2Zub3hFbnZWYXJOYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7Zm5veEVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKX1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW21pc2VFbnZWYXJzLCBtaXNlRW52VmFyTmFtZXNdID0gcmVhZE1pc2VFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIGVudlZhcnMsIG9wdGlvbnMpO1xuICBPYmplY3QuYXNzaWduKGVudlZhcnMsIG1pc2VFbnZWYXJzKTtcbiAgaWYgKG1pc2VFbnZWYXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW21pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSksIG1pc2VFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHttaXNlRW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke21pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmICghYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGBSZWFkIGVudiBmaWxlczogJHtlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMubWFwKChbZW52UGF0aCwga2V5c10pID0+IChrZXlzLmxlbmd0aCA+IDAgPyBgJHtlbnZQYXRofSAoJHtrZXlzLmpvaW4oJywgJyl9KWAgOiBlbnZQYXRoKSkuam9pbignLCAnKSB8fCAnbm90aGluZyd9YFxuICAgICk7XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpKTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSAmJiAhKGtleSBpbiBwcm9jZXNzLmVudikpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIC8vIEV4cGFuZCByZWZlcmVuY2VzIGFnYWluc3QgdGhlIGxpdmUgZW52aXJvbm1lbnQgZm9yIGtleXMgTk9UIGxvYWRlZCBmcm9tIGZpbGVzLCBzbyB0aGF0IGFcbiAgLy8gcmVmZXJlbmNlIHRvIGFuIGV4cG9ydGVkIGtleSAoZXhjbHVkZWQgZnJvbSBlbnZWYXJzIGJ5IHByb2Nlc3MtZW52IHByZWNlZGVuY2UpIHJlc29sdmVzIHRvXG4gIC8vIHRoZSBlZmZlY3RpdmUgdmFsdWUgaW5zdGVhZCBvZiBhbiBlbXB0eSBzdHJpbmcuIExvYWRlZCBrZXlzIGFyZSBkZWxpYmVyYXRlbHkgYWJzZW50IGZyb21cbiAgLy8gdGhlIHJlZmVyZW5jZSBzZXQ6IGRvdGVudi1leHBhbmQgd291bGQgb3RoZXJ3aXNlIHJlcGxhY2UgdGhlaXIgcGFyc2VkIHZhbHVlcyB3aXRoIHRoZVxuICAvLyBwcm9jZXNzIHZhbHVlcywgYnJlYWtpbmcgY2FsbGVycyB0aGF0IG5lZWQgdGhlIGZpbGUtZGVmaW5lZCB2YWx1ZXMgdGhlbXNlbHZlcy5cbiAgY29uc3QgcmVmZXJlbmNlRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KSkge1xuICAgIC8vIEVzY2FwZSBkb2xsYXIgc2lnbnMgc28gZG90ZW52LWV4cGFuZCBzdWJzdGl0dXRlcyBleHBvcnRlZCB2YWx1ZXMgbGl0ZXJhbGx5IGluc3RlYWQgb2ZcbiAgICAvLyByZWN1cnNpdmVseSByZS1leHBhbmRpbmcgdGhlbSAoYW4gZXhwb3J0ZWQgYHBhJHdvcmRgIG11c3Qgc3RheSBgcGEkd29yZGApLlxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICEoa2V5IGluIGVudlZhcnMpKSByZWZlcmVuY2VFbnZba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoJyQnLCBTdHJpbmcucmF3YFxcJGApO1xuICB9XG4gIC8vIGRvdGVudi1leHBhbmQgcmVzb2x2ZXMgcmVmZXJlbmNlcyBpbiBrZXktaW5zZXJ0aW9uIG9yZGVyLCBzbyBhIC5lbnYgdmFsdWUgcmVmZXJlbmNpbmcgYVxuICAvLyBmbm94L21pc2UtcHJvdmlkZWQga2V5IHdvdWxkIHNlZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGZub3gvbWlzZSBlbnRyaWVzIHN0YXllZCBhcHBlbmRlZFxuICAvLyBhZnRlciB0aGUgLmVudiBlbnRyaWVzLiBSZWJ1aWxkIHRoZSBleHBhbnNpb24gaW5wdXQgd2l0aCB0aGUgbG93ZXItcHJpb3JpdHkgc291cmNlcyBmaXJzdDtcbiAgLy8gdGhlIHZhbHVlcyB0aGVtc2VsdmVzIGFscmVhZHkgcmVmbGVjdCB0aGUgaW50ZW5kZWQgLmVudi1vdmVyLWZub3gtb3Zlci1taXNlIHByZWNlZGVuY2UuXG4gIGNvbnN0IG9yZGVyZWRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFsuLi5taXNlRW52VmFyTmFtZXMsIC4uLmZub3hFbnZWYXJOYW1lc10pIG9yZGVyZWRFbnZWYXJzW2tleV0gPSBlbnZWYXJzW2tleV0hO1xuICBPYmplY3QuYXNzaWduKG9yZGVyZWRFbnZWYXJzLCBlbnZWYXJzKTtcbiAgLy8gZXhwYW5kKCkgbXV0YXRlcyBCT1RIIGl0cyBwYXJzZWQgaW5wdXQgQU5EIHByb2Nlc3NFbnYgKGRvdGVudi1leHBhbmQgd3JpdGVzIGV2ZXJ5IHBhcnNlZFxuICAvLyByZXN1bHQgaW50byBwcm9jZXNzRW52KSwgc28gc25hcHNob3QgYm90aCBmb3IgdGhlIHJlLWV4cGFuc2lvbiBiZWxvdyDigJQgdGhlIHJldHJ5IG11c3Qgbm90XG4gIC8vIHNlZSB0aGUgZmlyc3QgcGFzcydzIHN0YWxlIGRlcGVuZGVudCB2YWx1ZXMuXG4gIGNvbnN0IHByZUV4cGFuc2lvbkVudlZhcnMgPSB7IC4uLm9yZGVyZWRFbnZWYXJzIH07XG4gIGNvbnN0IHByaXN0aW5lUmVmZXJlbmNlRW52ID0geyAuLi5yZWZlcmVuY2VFbnYgfTtcbiAgbGV0IGV4cGFuZGVkRW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZDogb3JkZXJlZEVudlZhcnMsIHByb2Nlc3NFbnY6IHJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gb3JkZXJlZEVudlZhcnM7XG4gIC8vIEEgdmFsdWUgcmVmZXJlbmNpbmcgJHtXQl9FTlZ9IG11c3QgZXhwYW5kIHRvIHdoYXQgdGhlIGNoaWxkIHdpbGwgYWN0dWFsbHkgc2VlOiB3aGVuIHRoZVxuICAvLyBFRkZFQ1RJVkUgV0JfRU5WIGVuZHMgdXAgZW1wdHkg4oCUIHdoZXRoZXIgaXQgd2FzIG5ldmVyIGRlZmluZWQsIGRlZmluZWQgZW1wdHksIG9yIGVtcHRpZWQgYnlcbiAgLy8gdGhlIGV4cGFuc2lvbiBpdHNlbGYgKGUuZy4gYFdCX0VOVj0ke01JU1NJTkdfTU9ERX1gKSDigJQgd2IncyBQcm9qZWN0LmVudiBsYXRlciBmaWxscyBpdCB3aXRoXG4gIC8vIHRoZSBmYWxsYmFjayBtb2RlLCBzbyByZS1leHBhbmQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVzIHdpdGggdGhhdCBmYWxsYmFjayBhdmFpbGFibGUuXG4gIC8vIE9wdC1pbiB2aWEgdGhlIG9wdGlvbjogYSBkaXJlY3QgcmVhZEVudmlyb25tZW50VmFyaWFibGVzL3JlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzXG4gIC8vIGNhbGxlciBuZXZlciByZWNlaXZlcyB0aGUgY29tcGxldGVkIFdCX0VOViwgYW5kIGV4cGFuZGluZyByZWZlcmVuY2VzIGFnYWluc3QgYSB2YWx1ZSB0aGF0IGlzXG4gIC8vIG5vdCBhY3R1YWxseSBhcHBsaWVkIHdvdWxkIG1ha2UgdGhlIHBhaXIgaW5jb25zaXN0ZW50LlxuICAvLyBUaGUgbG9hZGVkIGtleSBtYXNrcyB0aGUgYW1iaWVudCB2YWx1ZSwgc28gYSBsb2FkZWQtYnV0LWVtcHRpZWQgV0JfRU5WIG5lZWRzIHRoZSByZXRyeSBldmVuXG4gIC8vIHdoZW4gYW4gZXhwb3J0ZWQgV0JfRU5WIGV4aXN0cyAoYSBmb3JjZWQgbW9kZSBmaWxlIG92ZXJyaWRlcyB0aGUgZXhwb3J0IGxvY2FsbHkpOiByZXRyeSB3aXRoXG4gIC8vIHRoZSB2YWx1ZSB0aGUgbWVyZ2VkIGVudmlyb25tZW50IHdpbGwgdWx0aW1hdGVseSByZXRhaW4uXG4gIGNvbnN0IGVmZmVjdGl2ZVdiRW52ID0gZXhwYW5kZWRFbnZWYXJzLldCX0VOViA/PyBydW50aW1lRW52LldCX0VOVjtcbiAgaWYgKG9wdGlvbnM/LmV4cGFuZEZhbGxiYWNrV2JFbnYgJiYgIWVmZmVjdGl2ZVdiRW52KSB7XG4gICAgY29uc3QgcmVFeHBhbnNpb25JbnB1dCA9IHsgLi4ucHJlRXhwYW5zaW9uRW52VmFycyB9O1xuICAgIGRlbGV0ZSByZUV4cGFuc2lvbklucHV0LldCX0VOVjtcbiAgICBjb25zdCByZXRyeVJlZmVyZW5jZUVudiA9IHsgLi4ucHJpc3RpbmVSZWZlcmVuY2VFbnYsIFdCX0VOVjogcnVudGltZUVudi5XQl9FTlYgfHwgcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndikgfTtcbiAgICBleHBhbmRlZEVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQ6IHJlRXhwYW5zaW9uSW5wdXQsIHByb2Nlc3NFbnY6IHJldHJ5UmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyByZUV4cGFuc2lvbklucHV0O1xuICB9XG4gIHJldHVybiBbZXhwYW5kZWRFbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIHJlcG9zaXRvcnkncyBmbm94IGNvbmZpZ3VyYXRpb24gKGBmbm94LnRvbWxgKS5cbiAqIFRoZSBiYXNlIGBbc2VjcmV0c11gIHRhYmxlIGNvcnJlc3BvbmRzIHRvIGAuZW52YCwgYW5kIGBbcHJvZmlsZXMuPGNhc2NhZGU+LnNlY3JldHNdYCBjb3JyZXNwb25kcyB0b1xuICogYC5lbnYuPGNhc2NhZGU+YDsgYW4gdW5rbm93biBwcm9maWxlIGZhbGxzIGJhY2sgdG8gdGhlIGJhc2Ugc2VjcmV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvcHRpb25zPzogeyBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbjsgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52PzogYm9vbGVhbiB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCFoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2QpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3Qgc2VjcmV0cyA9IHJ1bkZub3hFeHBvcnQoY3dkLCBjYXNjYWRlLCB7IHF1aWV0OiBmYWxzZSB9KTtcbiAgaWYgKCFzZWNyZXRzKSByZXR1cm4gW3t9LCBbXV07XG4gIC8vIGBbcHJvZmlsZXMuPGNhc2NhZGU+LnNlY3JldHNdYCBpcyB0aGUgZm5veCBhbmFsb2d1ZSBvZiBgLmVudi48Y2FzY2FkZT5gOiB3aGVuIHRoZSBjYWxsZXJcbiAgLy8gZm9yY2VzIGEgbW9kZSBvZmYgQ0ksIHByb2ZpbGUtc3BlY2lmaWMgdmFsdWVzIG11c3Qgb3ZlcnJpZGUgaW5oZXJpdGVkIHNoZWxsIHZhcmlhYmxlcyBqdXN0XG4gIC8vIGxpa2UgYC5lbnYuPG1vZGU+YCB2YWx1ZXMgZG8sIHdoaWxlIGJhc2UgYFtzZWNyZXRzXWAgdmFsdWVzIGtlZXAgbG9zaW5nIHRvIHByb2Nlc3MuZW52LiBBIGtleVxuICAvLyBpcyBwcm9maWxlLXNwZWNpZmljIHdoZW4gdGhlIHByb2ZpbGUgZXhwb3J0J3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBiYXNlIGV4cG9ydCdzOyB3aGVuIHRoZVxuICAvLyBiYXNlIGV4cG9ydCBmYWlscywgbm8gb3ZlcnJpZGUgaXMgYXBwbGllZCAoY29uc2VydmF0aXZlKS4gVGhlIGJhc2UgZXhwb3J0IHJ1bnMgTEFaSUxZLCBvbmx5XG4gIC8vIHdoZW4gYSBwcm9jZXNzLmVudiBjb2xsaXNpb24gYWN0dWFsbHkgbmVlZHMgYWRqdWRpY2F0aW5nIOKAlCBpdCB3b3VsZCBvdGhlcndpc2UgYWRkIGFcbiAgLy8gc3VicHJvY2VzcyAoaW5jbHVkaW5nIGFnZSBkZWNyeXB0aW9uKSB0byBldmVyeSBmb3JjZWQtbW9kZSBpbnZvY2F0aW9uIGZvciBub3RoaW5nLlxuICBsZXQgY2FjaGVkQmFzZVNlY3JldHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHwgZmFsc2UgPSBmYWxzZTtcbiAgY29uc3QgZ2V0QmFzZVNlY3JldHMgPSAoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChjYWNoZWRCYXNlU2VjcmV0cyA9PT0gZmFsc2UpIHtcbiAgICAgIGNhY2hlZEJhc2VTZWNyZXRzID0gcnVuRm5veEV4cG9ydChjd2QsIHVuZGVmaW5lZCwgeyBxdWlldDogdHJ1ZSwgaWdub3JlUHJvZmlsZUVudlZhcjogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZEJhc2VTZWNyZXRzO1xuICB9O1xuXG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VjcmV0cykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCBrZXkgaW4gY3VycmVudEVudlZhcnMpIGNvbnRpbnVlO1xuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbiBvdmVyIGZub3ggYmFzZSB2YWx1ZXMsIG1pcnJvcmluZyB0aGUgLmVudiBydWxlLlxuICAgIC8vIChUaGUgbWlzZSByZWFkZXIgYmVsb3cgaW50ZW50aW9uYWxseSB1c2VzIGEgdmFsdWUtZXF1YWxpdHkgY2hlY2sgaW5zdGVhZDogYG1pc2UgZW52YCBlY2hvZXNcbiAgICAvLyBiYWNrIHZhcmlhYmxlcyB0aGUgYW1iaWVudCBtaXNlIGFjdGl2YXRpb24gYWxyZWFkeSBleHBvcnRlZCwgYW5kIGEgZGlmZmVyaW5nIHZhbHVlIG1lYW5zIHRoZVxuICAgIC8vIHJlcXVlc3RlZCBjYXNjYWRlIHByb2ZpbGUgc2hvdWxkIHdpbiBvdmVyIHRoZSBzdGFsZSBhY3RpdmF0aW9uLilcbiAgICBpZiAoIW9wdGlvbnM/Lmlnbm9yZVByb2Nlc3NFbnYgJiYga2V5IGluIHByb2Nlc3MuZW52KSB7XG4gICAgICBjb25zdCBiYXNlU2VjcmV0cyA9IG9wdGlvbnM/Lm1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiBjYXNjYWRlID8gZ2V0QmFzZVNlY3JldHMoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBiYXNlU2VjcmV0cyAhPT0gdW5kZWZpbmVkICYmIGJhc2VTZWNyZXRzW2tleV0gIT09IHZhbHVlO1xuICAgICAgaWYgKCFvdmVycmlkZXNQcm9jZXNzRW52KSBjb250aW51ZTtcbiAgICB9XG4gICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcnVuRm5veEV4cG9ydChcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogeyBxdWlldDogYm9vbGVhbjsgaWdub3JlUHJvZmlsZUVudlZhcj86IGJvb2xlYW4gfVxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAvLyBgLS1pZi1taXNzaW5nIGVycm9yYDogZm5veCBvdGhlcndpc2UgZXhpdHMgMCBhbmQgc2lsZW50bHkgb21pdHMgc2VjcmV0cyBpdCBmYWlscyB0byByZXNvbHZlXG4gIC8vIChlLmcuIGEgbWlzc2luZyBhZ2Uga2V5KSwgd2hpY2ggd291bGQgYmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIHNlY3JldHMuXG4gIC8vIGAtLW5vbi1pbnRlcmFjdGl2ZWA6IHByb21wdHMgb3IgYnJvd3NlciBhdXRoIGZsb3dzIHdvdWxkIGhhbmcgZm9yZXZlciBiZWNhdXNlIHN0ZGluIGlzIGlnbm9yZWQuXG4gIGNvbnN0IGFyZ3MgPSBbJ2V4cG9ydCcsICctLWZvcm1hdCcsICdqc29uJywgJy0tbm8tY29sb3InLCAnLS1pZi1taXNzaW5nJywgJ2Vycm9yJywgJy0tbm9uLWludGVyYWN0aXZlJ107XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tcHJvZmlsZScsIGNhc2NhZGUpO1xuICB9XG4gIGlmIChvcHRpb25zLmlnbm9yZVByb2ZpbGVFbnZWYXIpIHtcbiAgICAvLyBXaXRob3V0IGAtLXByb2ZpbGVgLCBmbm94IGZhbGxzIGJhY2sgdG8gRk5PWF9QUk9GSUxFOyB0aGUgYmFzZS1hZGp1ZGljYXRpb24gZXhwb3J0IG11c3RcbiAgICAvLyByZWFkIHRoZSBCQVNFIHNlY3JldHMsIHNvIHRoZSBpbmhlcml0ZWQgcHJvZmlsZSBzZWxlY3Rpb24gaXMgY2xlYXJlZCBmb3IgaXQg4oCUIGFuZCBvbmx5IGZvclxuICAgIC8vIGl0LiBBIFBSSU1BUlkgZXhwb3J0IHN0aWxsIGhvbm9ycyBGTk9YX1BST0ZJTEU6IGl0IGVpdGhlciBzdGF5cyBwcm9maWxlLWxlc3MgKGZub3ggcmVhZHMgdGhlXG4gICAgLy8gdmFyaWFibGUpIG9yIGZvbGRzIGl0IGludG8gdGhlIGAtLXByb2ZpbGVgIGl0IHBhc3NlcyAoc2VlIHdiIGRvdGVudidzIGNhc2NhZGUpLlxuICAgIGRlbGV0ZSBlbnYuRk5PWF9QUk9GSUxFO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoJ2Zub3gnLCBhcmdzLCB7XG4gICAgY3dkLFxuICAgIGVudixcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSB7XG4gICAgLy8gVGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMgZm5veC1tYW5hZ2VkIHNlY3JldHMgKGZub3gudG9tbCBleGlzdHMpLCBzbyBhIGZhaWxpbmcgZXhwb3J0IG11c3QgYmVcbiAgICAvLyBzdXJmYWNlZDogc3dhbGxvd2luZyBpdCB3b3VsZCBtYWtlIGRlY2xhcmVkIHNlY3JldHMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIG9uZXMuXG4gICAgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBmbm94IHNlY3JldHM6ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlIHx8IHJlc3VsdC5zdGRlcnI/LnRyaW0oKSB8fCBgZm5veCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtyZXN1bHQuc3RhdHVzfWB9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc2VjcmV0cyA9IChwYXJzZWQgYXMgeyBzZWNyZXRzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uc2VjcmV0cztcbiAgaWYgKCFzZWNyZXRzIHx8IHR5cGVvZiBzZWNyZXRzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNlY3JldHMpKSByZXR1cm47XG4gIHJldHVybiBzZWNyZXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvamVjdEZub3hDb25maWcoY3dkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoY3dkKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmbm94RW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYGZub3ggZXhwb3J0IC0tcHJvZmlsZSAke2Nhc2NhZGV9YCA6ICdmbm94IGV4cG9ydCc7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvcHRpb25zPzogeyBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbiB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCFoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2QpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgYXJncyA9IFsnZW52JywgJy0tanNvbicsICctLWNkJywgY3dkXTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tZW52JywgY2FzY2FkZSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnbWlzZScsIGFyZ3MsIHtcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW3t9LCBbXV07XG4gIH1cbiAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwga2V5IGluIGN1cnJlbnRFbnZWYXJzKSBjb250aW51ZTtcbiAgICBpZiAob3B0aW9ucz8uaWdub3JlUHJvY2Vzc0Vudikge1xuICAgICAgLy8gYG1pc2UgZW52YCBhbHdheXMgZW1pdHMgUEFUSCBkdWUgdG8gdG9vbCBzaGltczsgY29uc3VtZXJzIG9mIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXNcbiAgICAgIC8vIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKSBtdXN0IG5vdCBwcm9wYWdhdGUgaXQuXG4gICAgICBpZiAoa2V5ID09PSAnUEFUSCcpIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QpOyA7IGN1cnJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJ21pc2UudG9tbCcpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5taXNlLnRvbWwnKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYG1pc2UgZW52IC0tZW52ICR7Y2FzY2FkZX1gIDogJ21pc2UgZW52Jztcbn1cblxuZnVuY3Rpb24gaXNDSUVudmlyb25tZW50KGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCBvdXRwdXRPcHRpb25zID0gYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBxdWlldEVudj86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfTtcbiAgcmV0dXJuIG91dHB1dE9wdGlvbnMucXVpZXRFbnYgPT09IHRydWUgfHwgKG91dHB1dE9wdGlvbnMucXVpZXRFbnYgIT09IGZhbHNlICYmIG91dHB1dE9wdGlvbnMuc2lsZW50ID09PSB0cnVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICAvLyBFeGlzdGluZyBwcm9jZXNzLmVudiBrZXlzIGFyZSBrZXB0OiBlbnZWYXJzIG1heSBkZWxpYmVyYXRlbHkgY29udGFpbiBkaWZmZXJpbmcgdmFsdWVzIHRoYXRcbiAgICAvLyBtdXN0IHdpbiBvbmx5IGluIHRoZSByZXR1cm5lZCByZWNvcmQgKG1pc2UgY2FzY2FkZS1wcm9maWxlIHZhbHVlcywgZm9yY2VkLW1vZGUgb3ZlcnJpZGVzXG4gICAgLy8gY29uc3VtZWQgdmlhIGBwcm9qZWN0LmVudmApLCBuZXZlciBjbG9iYmVyIHRoZSBjYWxsZXIncyBvd24gcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgYmxhbmstb25seSBsaW5lcyBhcmUgc2tpcHBlZCB3aGlsZSBwcmludGluZyBzdGRvdXQvc3RkZXJyIGluIHJlYWx0aW1lICovXG4gIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBjb25zdCBzdGRvdXRQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3Rkb3V0LCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgY29uc3Qgc3RkZXJyUHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZGVyciwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHN0ZG91dFByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHN0ZGVyclByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgc3Rkb3V0UHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBzdGRlcnJQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcblxuZnVuY3Rpb24gY3JlYXRlUmVhbHRpbWVQcmludGVyKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0ZVN0cmVhbSxcbiAgb21pdEJsYW5rTGluZXMgPSBmYWxzZVxuKTogeyB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDsgZmx1c2g6ICgpID0+IHZvaWQgfSB7XG4gIGlmICghb21pdEJsYW5rTGluZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IChkYXRhKSA9PiBzdHJlYW0ud3JpdGUoZGF0YSksXG4gICAgICBmbHVzaDogKCkgPT4ge30sXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwZW5kaW5nID0gJyc7XG4gIHJldHVybiB7XG4gICAgd3JpdGU6IChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nICs9IGRhdGE7XG4gICAgICBjb25zdCBsaW5lcyA9IHBlbmRpbmcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKSA/PyAnJztcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWlzQmxhbmtMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgc3RyZWFtLndyaXRlKGAke2xpbmV9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoIWlzQmxhbmtMaW5lKHBlbmRpbmcpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShwZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSAnJztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JsYW5rTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobixlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogUHJlcGVuZCBldmVyeSBleGlzdGluZyBgbm9kZV9tb2R1bGVzLy5iaW5gIGRpcmVjdG9yeSBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkgdXAgdG8gdGhlXG4gKiByZXBvc2l0b3J5IHJvb3QgKG9yIGZpbGVzeXN0ZW0gcm9vdCkgdG8gdGhlIGVudmlyb25tZW50J3MgUEFUSCwgbmVhcmVzdCBkaXJlY3RvcnkgZmlyc3Qgc29cbiAqIGEgd29ya3NwYWNlLWxvY2FsIGRlcGVuZGVuY3kgd2lucyBvdmVyIGEgcmVwb3NpdG9yeS1yb290IG9uZS4gTmVlZGVkIHdoZXJldmVyIHdiIHN0cmlwc1xuICogeWFybidzIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGZyb20gUEFUSCAoeWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMgb25seVxuICogdGhyb3VnaCB0aGF0IGZvbGRlciwgbmV2ZXIgdGhyb3VnaCBgbm9kZV9tb2R1bGVzLy5iaW5gIG9uIFBBVEgpLCBzbyB0aGF0IGJhcmUgYmluYXJ5IG5hbWVzXG4gKiBpbiB3cmFwcGVkIGNvbW1hbmRzIGtlZXAgcmVzb2x2aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKGRpclBhdGg6IHN0cmluZywgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpblBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgYmluUGF0aHMucHVzaChiaW5QYXRoKTtcbiAgICB9XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICB9XG4gIGlmIChiaW5QYXRocy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgZW52LlBBVEggPSBlbnYuUEFUSCA/IGAke2JpblBhdGhzLmpvaW4oJzonKX06JHtlbnYuUEFUSH1gIDogYmluUGF0aHMuam9pbignOicpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHNpbGVudD86IGJvb2xlYW4gfSkuc2lsZW50ID09PSB0cnVlICYmXG4gICAgZ2V0T3B0aW9uVmFsdWUoYXJndiwgJ3F1aWV0LWVudicpID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgYXJncy5wdXNoKCctLXF1aWV0LWVudicpO1xuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4vc2hlbGwuanMnO1xuXG5jb25zdCB3cmFuZ2xlckNvbmZpZ0ZpbGVOYW1lcyA9IFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ107XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGdlbmVyYXRpbmcgYSAuZGV2LnZhcnMgZmlsZSAodmlhIGB3YiBnZW4tZGV2LXZhcnNgKSBzbyB0aGF0XG4gKiBgd3JhbmdsZXIgZGV2YCBjYW4gc2VlIHRoZSB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndjogU2NyaXB0QXJndiwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICd3YicsICdnZW4tZGV2LXZhcnMnLCAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksIG91dHB1dFBhdGhdKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGB3cmFuZ2xlciBkZXZgLXN0eWxlIGNvbW1hbmQuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlZgIG1ha2VzIHdyYW5nbGVyIHNlcnZlIHRoZSB0b3AtbGV2ZWxcbiAqIChub24tZGVwbG95KSBjb25maWcuIHdyYW5nbGVyIChsaWtlIHZpbmV4dCkgcmVxdWlyZXMgcmVhbCBOb2RlLmpzIOKAlCBgYnVuIHJ1bmAgcmVzcGVjdHMgdGhlIGJpbidzXG4gKiBub2RlIHNoZWJhbmcsIGFuZCB3YiBuZXZlciBjb21wb3NlcyBgLS1idW5gICh3aG9zZSBub2RlLT5idW4gUEFUSCBzaGltIGJyZWFrcyBib3RoIHRvb2xzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKGFyZ3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZW52IC11IENMT1VERkxBUkVfRU5WIFlBUk4gd3JhbmdsZXIgJHthcmdzfWAudHJpbSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBhcHBseWluZyB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyB0byB0aGUgbG9jYWwgZGF0YWJhc2UsIG9yIHVuZGVmaW5lZFxuICogaWYgdGhlIHByb2plY3QgaGFzIG5vIEQxIGRhdGFiYXNlIG9yIG5vIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGRpcmVjdG9yeS5cbiAqIENJPXRydWUgc3VwcHJlc3NlcyB3cmFuZ2xlcidzIGludGVyYWN0aXZlIGNvbmZpcm1hdGlvbiBwcm9tcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSB8fCAhZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdCkpIHJldHVybjtcblxuICByZXR1cm4gYENJPXRydWUgWUFSTiB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5ICR7ZGF0YWJhc2VOYW1lfSAtLWxvY2FsIC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiYDtcbn1cblxuLyoqXG4gKiBQcmVmaXggdGhlIGdpdmVuIHNjcmlwdCB3aXRoIGNvbW1hbmRzIGV4cG9ydGluZyBEQVRBQkFTRV9VUkwgcG9pbnRpbmcgdG8gdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZSxcbiAqIHNvIHRoYXQgZHJpenpsZS1raXQgYW5kIHNlZWQgc2NyaXB0cyBjYW4gb3BlcmF0ZSBvbiB0aGUgc2FtZSBkYXRhYmFzZSBhcyB0aGUgYXBwLlxuICogRG8gbm90aGluZyBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2UgaW4gaXRzIHdyYW5nbGVyIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSkgcmV0dXJuIHNjcmlwdDtcblxuICAvLyBFeGNsdWRpbmcgbWluaWZsYXJlJ3MgbWV0YWRhdGEuc3FsaXRlLCB3aGljaCBsaXZlcyBuZXh0IHRvIHRoZSBoYXNoLW5hbWVkIGRhdGFiYXNlIGZpbGUuXG4gIC8vIEFuIHVubWF0Y2hlZCBnbG9iIGNhbm5vdCBoYXBwZW4gaGVyZTogdGhlIHNjcmlwdCBydW5zIHVuZGVyIC9iaW4vc2ggKHZpYSBOb2RlJ3MgYHNoZWxsOiB0cnVlYCksXG4gIC8vIGFuZCB0aGUgcHJlY2VkaW5nIG1hdGVyaWFsaXphdGlvbiBjb21tYW5kIGd1YXJhbnRlZXMgdGhlIFNRTGl0ZSBmaWxlIGV4aXN0cy5cbiAgLy8gUHJvamVjdHMgd2l0aCBtdWx0aXBsZSBEMSBkYXRhYmFzZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IHRoZSBoYXNoLW5hbWVkIGZpbGVzIGNhbm5vdCBiZVxuICAvLyBkaXN0aW5ndWlzaGVkIGNoZWFwbHkgKG1hdGVyaWFsaXphdGlvbiBkb2VzIG5vdCBldmVuIHVwZGF0ZSB0aGUgdGFyZ2V0IGZpbGUncyBtdGltZSkuXG4gIC8vIFRoZSBzdGF0ZSBkaXJlY3RvcnkgbXVzdCBiZSBhYnNvbHV0ZSBiZWNhdXNlIHRoZSB3cmFwcGVkIHNjcmlwdCBtYXkgYGNkYCB0byB0aGUgbW9ub3JlcG8gcm9vdC5cbiAgY29uc3Qgc3RhdGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpKTtcbiAgY29uc3QgZXhwb3J0Q29tbWFuZCA9IGBleHBvcnQgREFUQUJBU0VfVVJMPVwiZmlsZTokKGxzIFwiJHtzdGF0ZURpclBhdGh9XCIvdjMvZDEvbWluaWZsYXJlLUQxRGF0YWJhc2VPYmplY3QvKi5zcWxpdGUgfCBncmVwIC12IG1ldGFkYXRhIHwgaGVhZCAtMSlcImA7XG4gIHJldHVybiBgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZGF0YWJhc2VOYW1lKX0gJiYgJHtleHBvcnRDb21tYW5kfSAmJiAke3NjcmlwdH1gO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgRDEgZGF0YWJhc2UgZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIC8vIENvdmVyIEpTT04oQykgKGBcImRhdGFiYXNlX25hbWVcIjogXCIuLi5cImApIGFuZCBUT01MLCBpbmNsdWRpbmcgaXRzIGlubGluZS10YWJsZSBmb3JtXG4gIC8vIChgZDFfZGF0YWJhc2VzID0gW3sgLi4uLCBkYXRhYmFzZV9uYW1lID0gXCIuLi5cIiB9XWApLCB3aXRob3V0IGZ1bGwgcGFyc2Vycy5cbiAgLy8gQ29tbWVudGVkLW91dCBsaW5lcyBhcmUgc2tpcHBlZCBzbyB0aGF0IHRoZXkgY2Fubm90IHNoYWRvdyB0aGUgYWN0aXZlIGRhdGFiYXNlIG5hbWUsXG4gIC8vIGFuZCB0aGUga2V5IG11c3QgZm9sbG93IGEgbGluZSBzdGFydCwgYHtgIG9yIGAsYCBzbyB0aGF0IHByb3NlIG1lbnRpb25pbmcgaXQgY2Fubm90IG1hdGNoLlxuICBmb3IgKGNvbnN0IGxpbmUgb2YgZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jykuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKC9eXFxzKig/OiN8XFwvXFwvKS91LnRlc3QobGluZSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbWF0Y2ggPSAvKD86XnxbLHtdKVxccypbXCInXT9kYXRhYmFzZV9uYW1lW1wiJ10/XFxzKls6PV1cXHMqW1wiJ10oW15cIiddKylbXCInXS91LmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBUZXN0cyBtYXkgcGFzcyBwYXJ0aWFsIFByb2plY3Qgb2JqZWN0cyB3aXRob3V0IGRpclBhdGguXG4gIGlmICghcHJvamVjdC5kaXJQYXRoKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiB3cmFuZ2xlckNvbmZpZ0ZpbGVOYW1lcykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggb2YgdGhlIHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIGRpcmVjdG9yeSAoYG1pZ3JhdGlvbnNfZGlyYCBpbiB0aGUgd3JhbmdsZXJcbiAqIGNvbmZpZywgZGVmYXVsdGluZyB0byBgbWlncmF0aW9uc2ApIGlmIGl0IGV4aXN0cyBvbiBkaXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIGxldCBtaWdyYXRpb25zRGlyID0gJ21pZ3JhdGlvbnMnO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jykuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKC9eXFxzKig/OiN8XFwvXFwvKS91LnRlc3QobGluZSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbWF0Y2ggPSAvKD86XnxbLHtdKVxccypbXCInXT9taWdyYXRpb25zX2RpcltcIiddP1xccypbOj1dXFxzKltcIiddKFteXCInXSspW1wiJ10vdS5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgbWlncmF0aW9uc0RpciA9IG1hdGNoWzFdIGFzIHN0cmluZztcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBjb25zdCBtaWdyYXRpb25zRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIG1pZ3JhdGlvbnNEaXIpO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhtaWdyYXRpb25zRGlyUGF0aCkgPyBtaWdyYXRpb25zRGlyUGF0aCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGNvbW1hbmQgbWF0ZXJpYWxpemluZyB0aGUgbG9jYWwgbWluaWZsYXJlIEQxIFNRTGl0ZSBmaWxlLlxuICogQSBuby1vcCBxdWVyeSBmb3JjZXMgbWluaWZsYXJlIHRvIGNyZWF0ZSB0aGUgU1FMaXRlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuXG4gKiBPbmx5IHN0ZG91dCBpcyBzdXBwcmVzc2VkOyB3cmFuZ2xlciByZXBvcnRzIGVycm9ycyBvbiBzdGRlcnIsIHdoaWNoIG11c3Qgc3RheSB2aXNpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+LCBkYXRhYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWUFSTiB3cmFuZ2xlciBkMSBleGVjdXRlICR7ZGF0YWJhc2VOYW1lfSAtLWxvY2FsIC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiIC0tY29tbWFuZCBcIlNFTEVDVCAxXCIgPiAvZGV2L251bGxgO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbG9jYWwgd3JhbmdsZXIvbWluaWZsYXJlIHN0YXRlIGRpcmVjdG9yeS5cbiAqIERldmVsb3BtZW50IGZvbGxvd3Mgd3JhbmdsZXIncyBkZWZhdWx0IGRpcmVjdG9yeSBzbyB0aGF0IHBsYWluIGB3cmFuZ2xlciBkZXZgIC8gYHZpbmV4dCBkZXZgXG4gKiAod2l0aG91dCBhIHBlcnNpc3QtcGF0aCBvdmVycmlkZSkgc2hhcmVzIHRoZSBzYW1lIGRhdGFiYXNlIGFzIHdiLW1hbmFnZWQgZGIgY29tbWFuZHMuXG4gKiBPdGhlciBlbnZpcm9ubWVudHMgKGUuZy4gdGVzdCkgZ2V0IHRoZWlyIG93biBkaXJlY3Rvcnkgc28gdGhhdCB0aGV5IGNhbiBiZSByZXNldFxuICogd2l0aG91dCBkZXN0cm95aW5nIGRldmVsb3BtZW50IHN0YXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogc3RyaW5nIHtcbiAgLy8gRGVzdHJ1Y3RpdmUgdGVzdCByZXNldHMgYXJlIGdhdGVkIG9uIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JyksIHdoaWNoIGFjY2VwdHNcbiAgLy8gZWl0aGVyIFdCX0VOViBvciBNSVNFX0VOVjsgcmVzb2x2ZSB0byB0aGUgdGVzdCBkaXJlY3Rvcnkgd2hlbmV2ZXIgZWl0aGVyIHNheXMgJ3Rlc3QnIHNvXG4gIC8vIHRoYXQgc3VjaCByZXNldHMgY2FuIG5ldmVyIHRhcmdldCB0aGUgZGV2ZWxvcG1lbnQgc3RhdGUuXG4gIGNvbnN0IHdiRW52ID0gW3Byb2plY3QuZW52LldCX0VOViwgcHJvamVjdC5lbnYuTUlTRV9FTlZdLmluY2x1ZGVzKCd0ZXN0JylcbiAgICA/ICd0ZXN0J1xuICAgIDogcHJvamVjdC5lbnYuV0JfRU5WIHx8IHByb2plY3QuZW52Lk1JU0VfRU5WO1xuICByZXR1cm4gIXdiRW52IHx8IHdiRW52ID09PSAnZGV2ZWxvcG1lbnQnID8gJy53cmFuZ2xlci9zdGF0ZScgOiBgLndyYW5nbGVyL3N0YXRlLSR7d2JFbnZ9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybixcbiAgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLFxuICByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbiAgcmVzb2x2ZUZhbGxiYWNrV2JFbnYsXG4gIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbi8qKiBUaGUgZmlsZSBgd3JhbmdsZXIgdHlwZXNgIHdyaXRlcyBieSBkZWZhdWx0LiAqL1xuY29uc3QgV09SS0VSX1RZUEVTX0ZJTEVfTkFNRSA9ICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgLy8gVGhlIHBhY2thZ2UgbWFuYWdlciBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiOlxuICAvLyBgbm9kZSB3YiAuLi5gIGFnYWluc3QgYSBCdW4gcmVwbyBtdXN0IHN0aWxsIHJ1biBgYnVuIGluc3RhbGxgLCBhbmQgdmljZSB2ZXJzYS5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCgpOiAnYnVuJyB8ICd5YXJuJyB7XG4gICAgcmV0dXJuIHRoaXMuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIGdldCBwYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoKTogJ2J1biBydW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIC8vIEEgc2luZ2xlIHNpZ25hbCBkZWNpZGVzIGV2ZXJ5IGJ1bi12cy15YXJuIGJyYW5jaCBpbiB3YiAoc2NyaXB0IG5vcm1hbGl6YXRpb24gaW5jbHVkZWQpOlxuICAvLyBzcGxpdHRpbmcgdGhlIHRvb2wtbWFuaWZlc3Qgc2lnbmFsIGZyb20gdGhlIGxvY2tmaWxlIHNpZ25hbCBvbmNlIHByb2R1Y2VkIGNvbW1hbmRzIG1peGluZ1xuICAvLyBgYnVuIGluc3RhbGxgIHdpdGggYHlhcm4gcHJpc21hIC4uLmAgaW4gbWlzZS1waW5uZWQgcmVwb3Mgd2hvc2UgYnVuLmxvY2sgaXMgZ2l0aWdub3JlZC5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNCdW5Ub29sVmVyc2lvbigpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5oYXNCdW5Mb2NrZmlsZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNCdW5QYWNrYWdlTWFuYWdlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Ub29sVmVyc2lvbigpOiBib29sZWFuIHtcbiAgICAvLyB3YmZ5IG1pZ3JhdGVzIC50b29sLXZlcnNpb25zIGludG8gbWlzZS50b21sLCBzbyBhIG1pc2UtcGlubmVkIGJ1biBtdXN0IGNvdW50IGFzIHdlbGw6XG4gICAgLy8gcmVwb3MgdGhhdCBnaXRpZ25vcmUgYnVuLmxvY2sgYW5kIGhhdmUgbm8gcGFja2FnZU1hbmFnZXIgZmllbGQgcmVseSBvbiB0aGUgdG9vbCBtYW5pZmVzdC5cbiAgICBpZiAodGVzdEZpbGVDb250ZW50KHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgLyhefFxcbilidW5cXHMvKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIHRlc3RGaWxlQ29udGVudChwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgZmlsZU5hbWUpLCAvXlxccyooPzpcImJ1blwifGJ1bilcXHMqPS9tKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1bkxvY2tmaWxlKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHJlbHkgb24gdGhlIGxvY2tmaWxlIG9yIHBhY2thZ2VNYW5hZ2VyIGZpZWxkIGluc3RlYWQgb2YgbWlzZS5cbiAgICAvLyBEb2NrZXIgb3B0aW1pemF0aW9uIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2IuXG4gICAgcmV0dXJuIFsnYnVuLmxvY2snLCAnYnVuLmxvY2tiJ10uc29tZSgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsIGZpbGVOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHRoaXMucm9vdFBhY2thZ2VKc29uPy5wYWNrYWdlTWFuYWdlciA/PyB0aGlzLnBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyO1xuICAgIHJldHVybiB0eXBlb2YgcGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnICYmIHBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ2J1bkAnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICAvLyBDYWNoZWQgaW4gYSBwbGFpbiBmaWVsZCByYXRoZXIgdGhhbiB3aXRoIEBtZW1vaXplT25lOiB0aGF0IGRlY29yYXRvciBrZXlzIGl0cyBjYWNoZSBvbiBhIGhhc2hcbiAgLy8gb2YgdGhlIGluc3RhbmNlLCB3aGljaCBjaGFuZ2VzIGFzIG90aGVyIG1lbW9pemVkIGdldHRlcnMgcG9wdWxhdGUgdGhlIGluc3RhbmNlLCBzbyBgZW52YCBjb3VsZFxuICAvLyBzaWxlbnRseSBiZSByZWNvbXB1dGVkIOKAlCBkcm9wcGluZyBpbi1wbGFjZSBtdXRhdGlvbnMgKGUuZy4gYHByb2plY3QuZW52LlBPUlQgfHw9IOKApmAsIG9yIHRoZVxuICAvLyBzZWNyZXRzIGB3YiBkZXBsb3lgIG1lcmdlcyBmcm9tIC5lbnYuY2xvdWRmbGFyZSkgdGhhdCBjYWxsZXJzIHJlbHkgb24gZm9yIHNwYXduZWQgY29tbWFuZHMuXG4gIHByaXZhdGUgZW52Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5lbnZDYWNoZSkgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZW52Q2FjaGUgPSBwcm9jZXNzLmVudjtcbiAgICAgIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICAgIH1cblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCwge1xuICAgICAgLy8gY29tcGxldGVBbmRWYWxpZGF0ZVdiRW52IGJlbG93IGZpbGxzIGFuIHVuc2V0IFdCX0VOViB3aXRoIHRoZSBzYW1lIGZhbGxiYWNrLCBzbyBleHBhbmRpbmdcbiAgICAgIC8vICR7V0JfRU5WfSByZWZlcmVuY2VzIGFnYWluc3QgaXQga2VlcHMgdGhlIHBhaXIgY29uc2lzdGVudC5cbiAgICAgIGV4cGFuZEZhbGxiYWNrV2JFbnY6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKCFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgIGZvciAoY29uc3QgW2VudlBhdGgsIG5hbWVzXSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7bmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNwcmVhZGluZyBlbnZWYXJzIGxhc3QgaXMgc2FmZSBmb3IgZXhwb3J0ZWQtdmFyaWFibGUgcHJlY2VkZW5jZTogcmVhZEVudmlyb25tZW50VmFyaWFibGVzXG4gICAgLy8gYWxyZWFkeSBleGNsdWRlcyBrZXlzIHByZXNlbnQgaW4gcHJvY2Vzcy5lbnYgZnJvbSAuZW52L2Zub3ggc291cmNlcyAocmV0dXJuaW5nIGEga2V5IHRoYXRcbiAgICAvLyBleGlzdHMgaW4gcHJvY2Vzcy5lbnYgb25seSBmb3IgZGVsaWJlcmF0ZSBmb3JjZWQtbW9kZSBvdmVycmlkZXMpLiBNaXNlIHZhbHVlcyB0aGF0XG4gICAgLy8gZGlmZmVyIGZyb20gdGhlIGFtYmllbnQgYWN0aXZhdGlvbiBhcmUgZGVsaWJlcmF0ZWx5IGtlcHQgc28gdGhlIHJlcXVlc3RlZCBjYXNjYWRlIHByb2ZpbGVcbiAgICAvLyAoZS5nLiBgLS1jYXNjYWRlLWVudj10ZXN0YCkgd2lucyBvdmVyIGEgc3RhbGUgYG1pc2UgYWN0aXZhdGVgIGVudmlyb25tZW50LlxuICAgIHRoaXMuZW52Q2FjaGUgPSB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnZWYXJzIH07XG4gICAgLy8gYG1pc2UgZW52YCBpcyBleGNsdWRlZDogaXQgcmVwb3J0cyB0b29sLWFjdGl2YXRpb24gb3V0cHV0IChlLmcuIFBBVEgpIGV2ZW4gaW4gcmVwb3MgdGhhdFxuICAgIC8vIGRlY2xhcmUgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGF0IGFsbCwgd2hpY2ggbXVzdCBub3QgdHJpZ2dlciB0aGUgQ0kgc3RyaWN0bmVzcyBiZWxvdy5cbiAgICB0aGlzLmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzLnNvbWUoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpKTtcbiAgICByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuICAvKipcbiAgICogQ29tcGxldGVzIGFuZCB2YWxpZGF0ZXMgdGhlIHJlc29sdmVkIGBXQl9FTlZgIHBlciB0aGUgb3JnIHN0YW5kYXJkIChzZWUgdGhlXG4gICAqIGd1aWRlbGluZXMtZm9yLW1pc2UtZm5veCBza2lsbCk6XG4gICAqIC0gTG9jYWxseSwgYW4gdW5zZXQgYFdCX0VOVmAgZmFsbHMgYmFjayB0byB0aGUgc2VsZWN0ZWQgY2FzY2FkZSBtb2RlIChkZXZlbG9wbWVudCB1bmxlc3MgYVxuICAgKiAgIGNvbW1hbmQgZm9yY2VzIGFub3RoZXIsIGUuZy4gYHdiIHRlc3RgIGZvcmNlcyB0ZXN0KSwgc28gY2FzdWFsIGBidW4gd2IgLi4uYCBpbnZvY2F0aW9uc1xuICAgKiAgIHdvcmsgaW4gcmVwb3NpdG9yaWVzIHRoYXQgZGVmaW5lIG5vIFdCX0VOViBhdCBhbGwuXG4gICAqIC0gT24gQ0ksIGFuIHVuc2V0IGBXQl9FTlZgIGlzIGEgaGFyZCBlcnJvciB3aGVuIGVudiBzb3VyY2VzIGV4aXN0OiB3b3JrZmxvd3MgbXVzdCBleHBvcnQgdGhlXG4gICAqICAgZW52aXJvbm1lbnQgZXhwbGljaXRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHJ1bm5pbmcgaW4gYW4gYW1iaWd1b3VzIG1vZGUuXG4gICAqIC0gVGhlIHZhbHVlIG11c3QgbmFtZSBhIHN0YW5kYXJkIG1vZGU7IGFuIHVua25vd24gdmFsdWUgKGUuZy4gYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gKSB3b3VsZFxuICAgKiAgIG90aGVyd2lzZSBzaWxlbnRseSBzZWxlY3QgdGhlIGRldmVsb3BtZW50IGNhc2NhZGUsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIHRoaXMgZ3VhcmRzIGFnYWluc3QuXG4gICAqIC0gYE5FWFRfUFVCTElDX1dCX0VOVmAgaXMgZGVyaXZlZCBmcm9tIGBXQl9FTlZgIGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzIHdoZW4gbWlzc2luZywgc28gYVxuICAgKiAgIHByb2R1Y3Rpb24gYnVpbGQgY2FuIG5vIGxvbmdlciBiYWtlIGEgc3RhbGUgZGV2ZWxvcG1lbnQgdmFsdWUgaW50byB0aGUgY2xpZW50IGJ1bmRsZS5cbiAgICogU2tpcHBlZCB3aGVuIGBXQl9TS0lQX0VOVl9DSEVDSz0xYCBpcyBzZXQuXG4gICAqL1xuICBwcml2YXRlIGNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihoYXNFbnZpcm9ubWVudFNvdXJjZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBlbnYgPSB0aGlzLmVudkNhY2hlO1xuICAgIGlmICghZW52KSByZXR1cm47XG4gICAgaWYgKGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8IGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnKSByZXR1cm47XG5cbiAgICAvLyBPbiBDSSwgV0JfRU5WIG11c3QgYmUgRVhQT1JURUQgYnkgdGhlIHdvcmtmbG93IOKAlCBjaGVja2VkIGFnYWluc3QgcHJvY2Vzcy5lbnYsIG5vdCB0aGVcbiAgICAvLyBtZXJnZWQgZW52aXJvbm1lbnQ6IGEgY29tbWl0dGVkIGJhc2UgZGVmYXVsdCAoZS5nLiBmbm94J3MgZGV2ZWxvcG1lbnQgZW50cnkpIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNhdGlzZnkgdGhlIGNoZWNrIGFuZCBzaWxlbnRseSBydW4gQ0kgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cbiAgICBpZiAoaXNDSShlbnYuQ0kpICYmICFwcm9jZXNzLmVudi5XQl9FTlYgJiYgaGFzRW52aXJvbm1lbnRTb3VyY2VzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgJ1dCX0VOViBpcyBub3QgZXhwb3J0ZWQgb24gQ0kuIEV4cG9ydCBXQl9FTlYgZXhwbGljaXRseSAodGhlIHJldXNhYmxlIHdvcmtmbG93cyBwYXNzIGl0IHZpYSB0aGUgXCJlbnZpcm9ubWVudFwiIGlucHV0KSwgJyArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFlbnYuV0JfRU5WKSB7XG4gICAgICAvLyBUaGUgc2hhcmVkIHJlc29sdmVyIGtlZXBzIHRoaXMgZmFsbGJhY2sgY29uc2lzdGVudCB3aXRoIHRoZSBjYXNjYWRlIHNlbGVjdGlvbiBBTkQgd2l0aFxuICAgICAgLy8gdGhlICR7V0JfRU5WfSBleHBhbnNpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzIGFscmVhZHkgcGVyZm9ybWVkOiB0aGUgZm9yY2VkIGNhc2NhZGVcbiAgICAgIC8vIChlLmcuIGB3YiB0ZXN0YCksIHRoZW4gdGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCwgdGhlbiB0aGUgQU1CSUVOVC1OT0RFX0VOVi1kcml2ZW4gYXV0b1xuICAgICAgLy8gY2FzY2FkZSBjbGFtcGVkIHRvIGEgc3RhbmRhcmQgbW9kZSAoYW4gZXhwbGljaXQgLS1jYXNjYWRlLWVudiBrZWVwcyBpdHMgdmFsdWUgYW5kIGlzXG4gICAgICAvLyB2YWxpZGF0ZWQgYmVsb3cgbGlrZSBhbnkgb3RoZXIgV0JfRU5WKS5cbiAgICAgIGNvbnN0IG1vZGUgPSByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpO1xuICAgICAgZW52LldCX0VOViA9IG1vZGU7XG4gICAgICBpZiAoaGFzRW52aXJvbm1lbnRTb3VyY2VzICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBXQl9FTlYgaXMgbm90IGRlZmluZWQ7IGRlZmF1bHRpbmcgdG8gXCIke21vZGV9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViBtdXN0IGJlIG9uZSBvZiBkZXZlbG9wbWVudCwgdGVzdCwgc3RhZ2luZywgb3IgcHJvZHVjdGlvbiwgYnV0IGlzIFwiJHtlbnYuV0JfRU5WfVwiLiBgICtcbiAgICAgICAgICAgICdGaXggdGhlIHZhbHVlIGluIHRoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZSwgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gQSBmb3JjZWQgbW9kZSAoYW4gZXhwbGljaXQvY29tbWFuZC1kZWZhdWx0IC0tY2FzY2FkZS1lbnYsIG9yIGFuIGV4cG9ydGVkIFdCX0VOViB3aG9zZVxuICAgIC8vIG1vZGUtc3BlY2lmaWMgZmlsZXMgbWF5IG92ZXJyaWRlIGl0IGxvY2FsbHkgcGVyIGlzc3VlICM5MzApIG11c3Qgbm90IGJlIHNpbGVudGx5IHJlcGxhY2VkXG4gICAgLy8gYnkgYW5vdGhlciBtb2RlIGEgbW9kZSBmaWxlIGRlZmluZXM6IGB3YiB0ZXN0YCByZXNvbHZpbmcgV0JfRU5WPWRldmVsb3BtZW50IGZyb20gYVxuICAgIC8vIGNvbW1pdHRlZCBgLmVudmAgd291bGQgcnVuIHRoZSB0ZXN0cyBhZ2FpbnN0IGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGFuIGV4cG9ydGVkXG4gICAgLy8gV0JfRU5WPXByb2R1Y3Rpb24gb3ZlcnJpZGRlbiB0byBkZXZlbG9wbWVudCBieSBgLmVudi5wcm9kdWN0aW9uYCB3b3VsZCBidWlsZC9kZXBsb3kgdGhlXG4gICAgLy8gd3JvbmcgZW52aXJvbm1lbnQgd2hpbGUgbG9va2luZyBzdWNjZXNzZnVsLlxuICAgIC8vIC0tY2FzY2FkZS1ub2RlLWVudiBmb3JjZXMgPE5PREVfRU5WIHx8IGRldmVsb3BtZW50PiAocGVyIGl0cyBvd24gZG9jdW1lbnRhdGlvbiksIHJlYWQgZnJvbVxuICAgIC8vIHRoZSBBTUJJRU5UIGVudmlyb25tZW50IGxpa2UgdGhlIGNhc2NhZGUgc2VsZWN0aW9uLiBPbmx5IGEgU1RBTkRBUkQgZm9yY2VkIG1vZGUgaXMgZW5mb3JjZWQ6XG4gICAgLy8gYSBub24tc3RhbmRhcmQgb25lIChlLmcuIE5PREVfRU5WPXFhKSBhbHJlYWR5IGhhZCBpdHMgZmFsbGJhY2sgY2xhbXBlZCB0byBkZXZlbG9wbWVudCBhYm92ZSxcbiAgICAvLyBhbmQgZXJyb3Jpbmcgb24gdGhhdCBjbGFtcCB3b3VsZCBjb250cmFkaWN0IGl0LlxuICAgIGNvbnN0IGZvcmNlZE1vZGUgPVxuICAgICAgdGhpcy5hcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAgICh0aGlzLmFyZ3YuY2FzY2FkZU5vZGVFbnYgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHVuZGVmaW5lZCk7XG4gICAgLy8gVGhlIEFVVE8tc2VsZWN0ZWQgbW9kZSBjb3VudHMgYXMgdGhlIGV4cGVjdGF0aW9uIHRvbzogd2l0aCBub3RoaW5nIHNldCBhbnl3aGVyZSwgdGhlXG4gICAgLy8gZGV2ZWxvcG1lbnQgY2FzY2FkZSdzIGZpbGVzIGFyZSBsb2FkZWQsIHNvIGEgYC5lbnYubG9jYWxgIGRlY2xhcmluZyBXQl9FTlY9cHJvZHVjdGlvbiB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBydW4gZGV2ZWxvcG1lbnQgc291cmNlcyBsYWJlbGVkIGFzIHByb2R1Y3Rpb24uXG4gICAgY29uc3QgZXhwZWN0ZWRNb2RlID1cbiAgICAgIGZvcmNlZE1vZGUgPz8gKHRoaXMuYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2UgPyByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpIDogdW5kZWZpbmVkKTtcbiAgICAvLyBUaGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGlzIGEgbGVnaXRpbWF0ZSBzZWNvbmQgZXhwZWN0YXRpb246IGB3YiB0ZXN0IC0tY2FzY2FkZS1lbnY9c3RhZ2luZ2BcbiAgICAvLyBsb2FkcyB0aGUgc3RhZ2luZyBmaWxlcyB3aGlsZSB0aGUgZmFsbGJhY2sgY29ycmVjdGx5IGZpbGxzIFdCX0VOVj10ZXN0LlxuICAgIGlmIChcbiAgICAgIGV4cGVjdGVkTW9kZSAmJlxuICAgICAgUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGV4cGVjdGVkTW9kZSkgJiZcbiAgICAgIGVudi5XQl9FTlYgIT09IGV4cGVjdGVkTW9kZSAmJlxuICAgICAgZW52LldCX0VOViAhPT0gdGhpcy5hcmd2LmNvbW1hbmREZWZhdWx0V2JFbnZcbiAgICApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgV0JfRU5WIHJlc29sdmVzIHRvIFwiJHtlbnYuV0JfRU5WfVwiIGFsdGhvdWdoIHRoZSBcIiR7ZXhwZWN0ZWRNb2RlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgICAgICBgRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgbW9kZSdzIGVudiBzb3VyY2UgKGUuZy4gLmVudi4ke2V4cGVjdGVkTW9kZX0gb3IgdGhlIGZub3ggXCIke2V4cGVjdGVkTW9kZX1cIiBwcm9maWxlKSwgYCArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVxdWlyZXNOZXh0UHVibGljV2JFbnYgJiYgZW52Lk5FWFRfUFVCTElDX1dCX0VOViAhPT0gZW52LldCX0VOVikge1xuICAgICAgLy8gQXNzaWduIHVuY29uZGl0aW9uYWxseSwgbm90IGB8fD1gOiB0aGUgcGFpciBtdXN0IGFncmVlIGJ5IGNvbnZlbnRpb24sIGFuZCBhIHN0YWxlIHZhbHVlXG4gICAgICAvLyAoZS5nLiBhIGJhc2UgYC5lbnZgJ3MgZGV2ZWxvcG1lbnQgZGVmYXVsdCB3aGlsZSBDSSBleHBvcnRzIFdCX0VOVj10ZXN0KSB3b3VsZCBvdGhlcndpc2VcbiAgICAgIC8vIGJlIGJha2VkIGludG8gdGhlIGNsaWVudCBidW5kbGUgZXZlbiB0aG91Z2ggdGhlIHNlcnZlciBzaWRlIHJ1bnMgd2l0aCB0aGUgY29ycmVjdCBXQl9FTlYuXG4gICAgICBpZiAoZW52Lk5FWFRfUFVCTElDX1dCX0VOViAmJiAhc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCh0aGlzLmFyZ3YpKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgT3ZlcnJpZGluZyBORVhUX1BVQkxJQ19XQl9FTlYgKFwiJHtlbnYuTkVYVF9QVUJMSUNfV0JfRU5WfVwiKSB3aXRoIFdCX0VOViAoXCIke2Vudi5XQl9FTlZ9XCIpLmApO1xuICAgICAgfVxuICAgICAgZW52Lk5FWFRfUFVCTElDX1dCX0VOViA9IGVudi5XQl9FTlY7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcmVxdWlyZXNOZXh0UHVibGljV2JFbnYoKTogYm9vbGVhbiB7XG4gICAgLy8gT1dOIGRlcGVuZGVuY2llcyBvbmx5OiBhIHJvb3QtbGV2ZWwgbmV4dC92aW5leHQgZGV2RGVwZW5kZW5jeSBpbiBhIG1peGVkIG1vbm9yZXBvIG11c3Qgbm90XG4gICAgLy8gZm9yY2UgTkVYVF9QVUJMSUNfV0JfRU5WIG9udG8gZXZlcnkgbm9uLU5leHQgd29ya3NwYWNlIHBhY2thZ2UuXG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignbmV4dCcpIHx8ICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigndmluZXh0Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGB3cmFuZ2xlciB0eXBlc2Agc2hvdWxkIGdlbmVyYXRlIGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCBoZXJlLiBBIHdyYW5nbGVyIGNvbmZpZ1xuICAgKiBhbmQgYW4gb3duIHdyYW5nbGVyIGRlcGVuZGVuY3kgYXJlIGJvdGggcmVxdWlyZWQg4oCUIHdyYW5nbGVyIGV4aXRzIG5vbi16ZXJvIHdpdGhvdXQgYSBjb25maWcsXG4gICAqIGFuZCBpbiBhIG1peGVkIG1vbm9yZXBvIGEgcm9vdC1sZXZlbCB3cmFuZ2xlciBkZXZEZXBlbmRlbmN5IG11c3Qgbm90IG1ha2UgZXZlcnkgd29ya3NwYWNlXG4gICAqIHBhY2thZ2UgZW1pdCB0eXBlcyBpdCBuZXZlciBjb25zdW1lcy5cbiAgICpcbiAgICogVGhlIHBhY2thZ2UncyBvd24gY29tbWl0dGVkIGdpdGlnbm9yZSBydWxlIGlzIHRoZSB0aGlyZCBzaWduYWwsIGFuZCB0aGUgb25lIHRoYXQgc2F5cyB0aGVcbiAgICogcGFja2FnZSBhY3R1YWxseSBDT05TVU1FUyB0aGUgZmlsZTogd2JmeSB3cml0ZXMgdGhhdCBydWxlIG9ubHkgZm9yIHBhY2thZ2VzIHdob3NlIG93biB0c2NvbmZpZ1xuICAgKiBjYW4gcmVmZXJlbmNlIGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCwgYW5kIGRlbGliZXJhdGVseSBsZWF2ZXMgYWxvbmUgcGFja2FnZXMgdGhhdFxuICAgKiBoYW5kLW1haW50YWluIHRoZWlyIGBFbnZgIGluc3RlYWQuIFdpdGhvdXQgdGhpcyBjaGVjaywgc3VjaCBhIHBhY2thZ2Ugd291bGQgZ2FpbiBhbiB1bnRyYWNrZWRcbiAgICogfjUwMEtCIGdlbmVyYXRlZCBmaWxlIG9uIGV2ZXJ5IGluc3RhbGwuXG4gICAqL1xuICBAbWVtb2l6ZU9uZVxuICBnZXQgZ2VuZXJhdGVzV29ya2VyVHlwZXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaW5kV3JhbmdsZXJDb25maWdQYXRoKHRoaXMpIHx8ICF0aGlzLmhhc093bkRlcGVuZGVuY3koJ3dyYW5nbGVyJykpIHJldHVybiBmYWxzZTtcbiAgICAvLyBEZWZlbnNlIGluIGRlcHRoIGFnYWluc3Qgd2JmeSdzIGdpdGlnbm9yZSBydWxlIGFuZCB0aGlzIHByZWRpY2F0ZSBkcmlmdGluZyBhcGFydDogaWYgdGhlIHBhY2thZ2Ugc3RpbGxcbiAgICAvLyBydW5zIGl0cyBvd24gb3V0cHV0LWNoYW5naW5nIGB3cmFuZ2xlciB0eXBlc2AgKGUuZy4gYC0tc3RyaWN0LXZhcnM9ZmFsc2VgKSwgdGhlIGJhcmUgaW52b2NhdGlvbiBoZXJlIHdvdWxkXG4gICAgLy8gb3ZlcndyaXRlIHRoYXQgZmlsZSB3aXRoIGEgZGlmZmVyZW50IGBFbnZgLlxuICAgIGlmIChoYXNPdXRwdXRDaGFuZ2luZ1dyYW5nbGVyVHlwZXModGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9LCB0aGlzLmRpclBhdGgpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGhhc01hbmFnZWRHaXRpZ25vcmVSdWxlKHRoaXMuZGlyUGF0aCwgV09SS0VSX1RZUEVTX0ZJTEVfTkFNRSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ByaXNtYScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBQbGF5d3JpZ2h0IGNvbmZpZyBkZWNsYXJlcyBhIGB3ZWJTZXJ2ZXJgIGJsb2NrLCBpLmUuIFBsYXl3cmlnaHQgaXRzZWxmIGJ1aWxkcyBhbmRcbiAgICogc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC4gVW5saWtlIHtAbGluayBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodH0gdGhpcyBpZ25vcmVzIENJLCBzb1xuICAgKiBpdCBhbHNvIGhvbGRzIGZvciBsaWJyYXJ5IGZpeHR1cmVzIHdob3NlIG9ubHkgc2VydmVyIGlzIHRoZSBvbmUgUGxheXdyaWdodCBtYW5hZ2VzLlxuICAgKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICAvLyBPbiBDSSB3YiBsYXVuY2hlcyB0aGUgYXBwIGl0c2VsZiBzbyB0aGUgcnVuIGRvZXMgbm90IGRlcGVuZCBvbiBQbGF5d3JpZ2h0J3MgYHJldXNlRXhpc3RpbmdTZXJ2ZXJgXG4gICAgLy8gKHdoaWNoIGlzIGRpc2FibGVkIG9uIENJKTsgbG9jYWxseSwgYSBgd2ViU2VydmVyYCBibG9jayBtZWFucyBQbGF5d3JpZ2h0IGFscmVhZHkgb3ducyB0aGUgc2VydmVyLlxuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWc7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKHRoaXMuZGlyUGF0aCwgdGhpcy5lbnYpO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGhhc0RlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpID8/IHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5yb290UGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm47XG5cbiAgICByZXR1cm4gKFxuICAgICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJvb3RQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucm9vdERpclBhdGggPT09IHRoaXMuZGlyUGF0aCkgcmV0dXJuIHRoaXMucGFja2FnZUpzb247XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbd2JdIEZhaWxlZCB0byByZWFkIG9yIHBhcnNlICR7cGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKX1gLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3UGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByYXdQYXRoLnN0YXJ0c1dpdGgoJy8vJykgPyByYXdQYXRoLnNsaWNlKDIpIDogcmF3UGF0aDtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoIHx8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4gJiBQYXJ0aWFsPFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3Jvb3REaXJQYXRoJz4+XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSkgcmV0dXJuIGRiUGF0aDtcblxuICBjb25zdCBiYXNlRGlyUGF0aCA9IHByb2plY3Qucm9vdERpclBhdGggPz8gcHJvamVjdC5kaXJQYXRoO1xuICByZXR1cm4gYmFzZURpclBhdGggPyBwYXRoLnJlc29sdmUoYmFzZURpclBhdGgsIGRiUGF0aCkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdDogUHJvamVjdCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9qZWN0LmVudi5XQl9FTlYgPT09IG5hbWUgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlYgPT09IG5hbWU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmZ1bmN0aW9uIHRlc3RGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByb290IHByb2plY3QgZm9sbG93ZWQgYnkgb25lIFByb2plY3QgcGVyIHdvcmtzcGFjZSBkaXJlY3RvcnkgdGhlIHRhcmdldCByZXBvc2l0b3J5J3NcbiAqIHBhY2thZ2UgbWFuYWdlciB3b3VsZCBsaW5rIChpc3N1ZSAjMTAwOCk6IEJ1biByZXBvcyB1c2UgdGhlIHNoYXJlZCBCdW4tZXhhY3QgcmVzb2x2ZXJcbiAqIChuZWdhdGlvbnMsIHBpbm5lZCBwb3NpdGl2ZXMsIGFuZCBiYXNlbGluZS1zZWVkaW5nIG5lZ2F0aW9ucyBpbmNsdWRlZCksIHdoaWxlIFlhcm4gcmVwb3Mga2VlcFxuICogZ2xvYiBzZW1hbnRpY3Mg4oCUIEJ1bi1vbmx5IHJ1bGVzIHN1Y2ggYXMgdGhlIGltcGxpY2l0IGJhc2VsaW5lIHdvdWxkIGludmVudCB3b3Jrc3BhY2VzIFlhcm5cbiAqIG5ldmVyIGxpbmtzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290UHJvamVjdCk7XG4gIHJldHVybiBbcm9vdFByb2plY3QsIC4uLndvcmtzcGFjZURpclBhdGhzLm1hcCgod29ya3NwYWNlRGlyUGF0aCkgPT4gbmV3IFByb2plY3Qod29ya3NwYWNlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpXTtcbn1cblxuLyoqXG4gKiBUaGUgYWJzb2x1dGUgZGlyZWN0b3J5IG9mIGV2ZXJ5IHdvcmtzcGFjZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBwYWNrYWdlIG1hbmFnZXIgd291bGQgbGluayxcbiAqIG1hdGNoaW5nIHRoZSBtYW5hZ2VyIHRoZSB3YXkgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIGRlc2NyaWJlcy4gRXhwb3J0ZWQgZm9yIHdiIHJlbGVhc2UsIHdob3NlXG4gKiBwbHVnaW4gaW5zcGVjdGlvbiwgbm9kZV9tb2R1bGVzIGNsZWFudXAsIGFuZCBtYW5pZmVzdCByZXdyaXRpbmcgbXVzdCBzZWUgdGhlIHNhbWUgd29ya3NwYWNlIHNldC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb24nIHwgJ3VzZXNCdW5QYWNrYWdlTWFuYWdlcic+XG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmIChwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlcikge1xuICAgIHJldHVybiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMsIHByb2plY3QuZGlyUGF0aCkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICApO1xuICB9XG4gIC8vIFlhcm4gMS4yMi4yMiByZXNvbHZlcyBlYWNoIGRlY2xhcmVkIHBhdHRlcm4gKGFycmF5IG9yIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBmb3JtKSBpbmRlcGVuZGVudGx5XG4gIC8vIGFuZCB1bmlvbnMgdGhlIHJlc3VsdHMsIHNvIGEgbGVhZGluZy1gIWAgcGF0dGVybiBpcyBub3QgYW4gZXhjbHVzaW9uIOKAlCBgW1wicGFja2FnZXMvKlwiLFxuICAvLyBcIiFwYWNrYWdlcy9hXCJdYCBzdGlsbCBsaW5rcyBwYWNrYWdlcy9hLiBZYXJuIGFkZGl0aW9uYWxseSBpZ25vcmVzIG1hbmlmZXN0cyBtaXNzaW5nIGEgbmFtZSBvclxuICAvLyB2ZXJzaW9uIChcIk1pc3NpbmcgdmVyc2lvbiBpbiB3b3Jrc3BhY2Ug4oCmLCBpZ25vcmluZy5cIiksIGJ1dCB0aGF0IGlzIGRlbGliZXJhdGVseSBOT1QgbWlycm9yZWQ6XG4gIC8vIHdiJ3MgZGVzY2VuZGFudCBkaXNjb3ZlcnkgZXhpc3RzIHRvIHJ1biBjb21tYW5kcyAobGludCwgdGVzdCwgdHlwZWNoZWNrLCDigKYpIGluIHN1Yi1wYWNrYWdlcyxcbiAgLy8gYW5kIHZlcnNpb24tbGVzcyBwcml2YXRlIHBhY2thZ2VzIG11c3Qgc3RheSBkaXNjb3ZlcmVkIOKAlCB0aGUgbG9uZy1zdGFuZGluZyBiZWhhdmlvciB3YidzXG4gIC8vIG1vbm9yZXBvIGZpeHR1cmVzIGVuY29kZS4gR2xvYiBmb3IgdGhlIG1hbmlmZXN0cyB0aGVtc2VsdmVzOiBnbG9iYnkncyBgb25seURpcmVjdG9yaWVzYFxuICAvLyB3b3VsZCByZXR1cm4gYSBsaXRlcmFsIGRpcmVjdG9yeSBwYXR0ZXJuJ3MgQ0hJTERSRU4gaW5zdGVhZCBvZiB0aGUgZGlyZWN0b3J5LiBUaGUgcmVhbHBhdGhcbiAgLy8gY29udGFpbm1lbnQgbWlycm9ycyByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRoczogYSB3b3Jrc3BhY2Ugc3ltbGluayBlc2NhcGluZyB0aGVcbiAgLy8gcmVwb3NpdG9yeSBtdXN0IG5vdCBsZXQgY29uc3VtZXJzIHRvdWNoIGFub3RoZXIgY2hlY2tvdXQuXG4gIGNvbnN0IHBvc2l0aXZlUGF0dGVybnMgPSBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykuZmlsdGVyKFxuICAgIChwYXR0ZXJuKSA9PiAhcGF0dGVybi5zdGFydHNXaXRoKCchJykgJiYgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHBhdHRlcm4pXG4gICk7XG4gIGlmIChwb3NpdGl2ZVBhdHRlcm5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAvLyBleHBhbmREaXJlY3RvcmllczogZmFsc2Ug4oCUIGdsb2JieSB3b3VsZCBvdGhlcndpc2UgZXhwYW5kIGEgbGl0ZXJhbCBkaXJlY3RvcnkgcGF0dGVybiB0byBpdHNcbiAgLy8gQ0hJTERSRU4sIHR1cm5pbmcgZS5nLiBgcGFja2FnZXNgIGludG8gbWF0Y2hlcyBmb3IgZXZlcnkgcGFja2FnZXMvKiBzdWJkaXJlY3RvcnkuXG4gIGNvbnN0IGdsb2JieU9wdGlvbnMgPSB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZXhwYW5kRGlyZWN0b3JpZXM6IGZhbHNlLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgfTtcbiAgLy8gZmFzdC1nbG9iIChnbG9iYnkncyBlbmdpbmUpIHJldHVybnMgbm8gbWF0Y2hlcyBmb3IgZmlsZSBnbG9icyB3aXRoIGEgbG9uZS1gP2Agc2VnbWVudCAoZS5nLlxuICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSBhbHRob3VnaCBZYXJuIGxpbmtzIHN1Y2ggd29ya3NwYWNlczsgZm9yIGA/YC1jYXJyeWluZyBwYXR0ZXJuc1xuICAvLyBvbmx5IChhIGRpcmVjdG9yeSBnbG9iIGZvciBlLmcuIGAqKmAgd291bGQgc2NhbiBldmVyeSBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZ1xuICAvLyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYi5cbiAgY29uc3QgZ2xvYmJlZE1hbmlmZXN0UGF0aHMgPSBhd2FpdCBnbG9iYnkoXG4gICAgcG9zaXRpdmVQYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IHBhdGgucG9zaXguam9pbihwYXR0ZXJuLCAncGFja2FnZS5qc29uJykpLFxuICAgIGdsb2JieU9wdGlvbnNcbiAgKTtcbiAgY29uc3QgbWFuaWZlc3RQYXRoU2V0ID0gbmV3IFNldChnbG9iYmVkTWFuaWZlc3RQYXRocyk7XG4gIGNvbnN0IHF1ZXN0aW9uTWFya1BhdHRlcm5zID0gcG9zaXRpdmVQYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4uaW5jbHVkZXMoJz8nKSk7XG4gIGlmIChxdWVzdGlvbk1hcmtQYXR0ZXJucy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGF3YWl0IGdsb2JieShxdWVzdGlvbk1hcmtQYXR0ZXJucywgeyAuLi5nbG9iYnlPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBtYW5pZmVzdFBhdGgpKSkgbWFuaWZlc3RQYXRoU2V0LmFkZChtYW5pZmVzdFBhdGgpO1xuICAgIH1cbiAgfVxuICBjb25zdCBtYW5pZmVzdFBhdGhzID0gWy4uLm1hbmlmZXN0UGF0aFNldF07XG4gIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhwcm9qZWN0LmRpclBhdGgpO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IG1hbmlmZXN0UGF0aHNcbiAgICAvLyBBIGAqKmAgcGF0dGVybiByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0IGFuZCBpbnN0YWxsZWQgcGFja2FnZXMsIGJ1dCBuZWl0aGVyIGlzIGFcbiAgICAvLyB3b3Jrc3BhY2UgdG8gWWFybiAod2hpY2ggbmV2ZXIgZGVzY2VuZHMgaW50byBub2RlX21vZHVsZXMpLlxuICAgIC5maWx0ZXIoKG1hbmlmZXN0UGF0aCkgPT4ge1xuICAgICAgaWYgKG1hbmlmZXN0UGF0aCA9PT0gJ3BhY2thZ2UuanNvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWFuaWZlc3RQYXRoKSkpO1xuICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBtYW5pZmVzdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbDogbm90IGEgd29ya3NwYWNlLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSlcbiAgICAubWFwKChtYW5pZmVzdFBhdGgpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHBhdGgucG9zaXguZGlybmFtZShtYW5pZmVzdFBhdGgpKSk7XG4gIHJldHVybiBbLi4ubmV3IFNldCh3b3Jrc3BhY2VEaXJQYXRocyldLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcGFja2FnZSdzIG93biBjb21taXR0ZWQgLmdpdGlnbm9yZSBjYXJyaWVzIHdiZnkncyBtYW5hZ2VkIHJ1bGUgZm9yIHRoZSBmaWxlLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgYGdpdCBjaGVjay1pZ25vcmVgOiB0aGF0IGFsc28gaG9ub3JzIGAuZ2l0L2luZm8vZXhjbHVkZWAgYW5kIHRoZSB1c2VyJ3MgZ2xvYmFsXG4gKiBleGNsdWRlcywgd2hpY2ggYSBmcmVzaCBjbG9uZSBhbmQgQ0kgZG8gbm90IGhhdmUuIEEgZGV2ZWxvcGVyIHdpdGggYSBwZXJzb25hbFxuICogYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGV4Y2x1ZGUgd291bGQgb3RoZXJ3aXNlIHR1cm4gZ2VuZXJhdGlvbiBvbiBmb3IgYSBwYWNrYWdlIHdiZnlcbiAqIGRlbGliZXJhdGVseSBsZWZ0IHVubWFuYWdlZCwgYW5kIHRoZSByZXN1bHRpbmcgZmlsZSB3b3VsZCBiZSBpbnZpc2libGUgaW4gYGdpdCBzdGF0dXNgLlxuICogYHBhY2thZ2VzL3diZnkvc3JjL2ZpeGVycy93b3JrZXJUeXBlcy50c2AgZ2F0ZXMgb24gdGhlIHNhbWUgY29tbWl0dGVkIHJ1bGUuXG4gKi9cbmZ1bmN0aW9uIGhhc01hbmFnZWRHaXRpZ25vcmVSdWxlKGRpclBhdGg6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXRpZ25vcmUnKSwgJ3V0ZjgnKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLnNvbWUoKGxpbmUpID0+IGxpbmUudHJpbSgpID09PSBgLyR7ZmlsZU5hbWV9YCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBwYWNrYWdlIHNjcmlwdCBydW5zIGEgYHdyYW5nbGVyIHR5cGVzYCB0aGF0IHdvdWxkIHdyaXRlIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXQgdGhlIGJhcmVcbiAqIGludm9jYXRpb24gd3JpdGVzLiBgLS1jaGVja2AvYC0taGVscGAgdmFsaWRhdGUgb3IgcHJpbnQgYW5kIHdyaXRlIG5vdGhpbmcsIHNvIHRoZXkgZG8gbm90IGNvdW50LiBgLS1lbnYtZmlsZWBcbiAqIGNvdW50cyB3aGVuZXZlciBhIGZpbGUgaXQgbmFtZXMgRVhJU1RTOiB0aGUgZmxhZyBzZWxlY3RzIHdoYXQgd3JhbmdsZXIgcmVhZHMgdG8gaW5mZXIgbG9jYWwgdmFycyBhbmQgc2VjcmV0cyxcbiAqIHNvIHRoZSBiYXJlIGludm9jYXRpb24gaGVyZSB3b3VsZCByZWdlbmVyYXRlIGEgc21hbGxlciBgRW52YC4gTWlycm9ycyB3YmZ5J3MgYGhhc0N1c3RvbVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uYFxuICogKGluY2x1ZGluZyBpdHMgYG5hbWVzT25seU1pc3NpbmdFbnZGaWxlc2AgcnVsZSk7IHRoZSB0d28gbXVzdCBhZ3JlZSwgc2luY2Ugd2JmeSdzIGFuc3dlciBkZWNpZGVzIHRoZVxuICogZ2l0aWdub3JlIHJ1bGUgdGhpcyBwcmVkaWNhdGUga2V5cyBvbi5cbiAqL1xuZnVuY3Rpb24gaGFzT3V0cHV0Q2hhbmdpbmdXcmFuZ2xlclR5cGVzKHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB3cmFuZ2xlclR5cGVzUGF0dGVybiA9IC8oPzpefFxccyl3cmFuZ2xlclxccyt0eXBlcyg/Olxcc3wkKS91O1xuICBjb25zdCBlbnZGaWxlT25seVBhdHRlcm4gPSAvXig/Oig/OmJ1bnh8bnB4KVxccyt8KD86eWFybnxwbnBtKVxccytkbHhcXHMrKT93cmFuZ2xlclxccyt0eXBlcyg/OlxccystLWVudi1maWxlXFxzK1xcUyspKiQvdTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB7XG4gICAgaWYgKCFzY3JpcHQgfHwgIXdyYW5nbGVyVHlwZXNQYXR0ZXJuLnRlc3Qoc2NyaXB0KSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIENoZWNrZWQgb24gdGhlIFdIT0xFIHNjcmlwdCwgYmVmb3JlIHNwbGl0dGluZzogYGNkIHN1YiAmJiB3cmFuZ2xlciB0eXBlc2AgcnVucyB0aGUgZ2VuZXJhdG9yIGluIGFub3RoZXJcbiAgICAvLyBkaXJlY3RvcnkgYWdhaW5zdCBhbm90aGVyIGNvbmZpZywgYnV0IGl0cyBzZWNvbmQgc2VnbWVudCBhbG9uZSBsb29rcyBsaWtlIGEgcGxhaW4gaW52b2NhdGlvbi4gd2JmeVxuICAgIC8vIGNsYXNzaWZpZXMgYW55IHNjcmlwdCBjYXJyeWluZyB0aGlzIHN5bnRheCBhcyBjdXN0b20sIGFuZCB0aGUgdHdvIHByZWRpY2F0ZXMgbXVzdCBhZ3JlZS5cbiAgICBpZiAoL1s7fDw+YCQnXCIoKV18XFxiY2RcXHMvdS50ZXN0KHNjcmlwdCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBzY3JpcHRcbiAgICAgIC5zcGxpdCgnJiYnKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKSlcbiAgICAgIC5zb21lKChzZWdtZW50KSA9PiB7XG4gICAgICAgIGlmICghd3JhbmdsZXJUeXBlc1BhdHRlcm4udGVzdChzZWdtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoLyg/Ol58XFxzKSg/Oi0taGVscHwtaCkoPzpcXHN8PXwkKS91LnRlc3Qoc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gYC0tY2hlY2tgIGNvbXBhcmVzIHRoZSByZXN1bHQgRk9SIFRIRSBTVVBQTElFRCBPUFRJT05TLCBzbyBpdCBpcyBvbmx5IGhhcm1sZXNzIHdoZW4gdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgIC8vIGludm9jYXRpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgYmFyZSBvbmUuXG4gICAgICAgIGNvbnN0IHdpdGhvdXRDaGVjayA9IHNlZ21lbnRcbiAgICAgICAgICAucmVwbGFjZSgvKD86XnxcXHMpLS1jaGVjayg/Olxcc3w9fCQpL3UsICcgJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHdpdGhvdXRDaGVjayA9PT0gc2VnbWVudCA/IHNlZ21lbnQgOiB3aXRob3V0Q2hlY2s7XG4gICAgICAgIC8vIE5vdCBlcXVpdmFsZW50IHRvIHRoZSBiYXJlIGludm9jYXRpb24sIHdpdGggb3Igd2l0aG91dCBgLS1jaGVja2A6IGAtLWNoZWNrYCBjb21wYXJlcyB0aGUgcmVzdWx0IEZPUlxuICAgICAgICAvLyBUSEUgU1VQUExJRUQgT1BUSU9OUywgc28gYC0tY2hlY2sgLS1zdHJpY3QtdmFycz1mYWxzZWAgc3RpbGwgZGVzY3JpYmVzIGEgZGlmZmVyZW50IGZpbGUuXG4gICAgICAgIGlmICghZW52RmlsZU9ubHlQYXR0ZXJuLnRlc3QoY2FuZGlkYXRlKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBbLi4uY2FuZGlkYXRlLm1hdGNoQWxsKC8tLWVudi1maWxlXFxzKyhcXFMrKS9ndSldLnNvbWUoXG4gICAgICAgICAgKG1hdGNoKSA9PiAhIW1hdGNoWzFdICYmIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIG1hdGNoWzFdKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeUxpa2UsIEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0J1aWxkIG91dHB1dCBwYXRocyAocmVsYXRpdmUgdG8gdGhlIHByb2plY3QgZGlyZWN0b3J5KSB0aGF0IG11c3QgZXhpc3QgZm9yIHRoZSBjYWNoZSB0byBiZSB2YWxpZCAoZGVmYXVsdDogYXV0by1kZXRlY3RlZCBjb21tb24gb3V0cHV0IGRpcmVjdG9yaWVzKScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBidWlsZENvbW1hbmQgPVxuICAgIGFyZ3YuY29tbWFuZCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZCA/IGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBidWlsZGAgOiB1bmRlZmluZWQpO1xuICBpZiAoIWJ1aWxkQ29tbWFuZCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU2tpcCB0byBidWlsZCBiZWNhdXNlIG5vIGJ1aWxkIGNvbW1hbmQgaXMgZGVmaW5lZC4nKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGJ1aWxkQ29tbWFuZCB9O1xuXG4gIC8vIFRoZSBjYWNoZSByZXF1aXJlcyB0aGUgZ2l0IHJlcG9zaXRvcnkgcm9vdCB0byBCRSByb290RGlyUGF0aDogcG9yY2VsYWluIHBhdGhzIGFuZCBkaWZmXG4gIC8vIHBhdGhzcGVjcyBiZWxvdyBhcmUgam9pbmVkL2V4ZWN1dGVkIGFnYWluc3Qgcm9vdERpclBhdGguIFdoZW4gdGhlIHJlcG8gcm9vdCBpcyBlbHNld2hlcmVcbiAgLy8gKGUuZy4gYSBzdWJwcm9qZWN0IG9mIGEgbGFyZ2VyIHJlcG9zaXRvcnkpLCBhbHdheXMgYnVpbGQgaW5zdGVhZCBvZiBtaXMtcmVzb2x2aW5nIHBhdGhzLlxuICAvLyBBIGZyZXNobHkgaW5pdGlhbGl6ZWQgcmVwbyB3aXRob3V0IGNvbW1pdHMgKHVuYm9ybiBIRUFEKSBsaWtld2lzZSBidWlsZHMgd2l0aG91dCBjYWNoaW5nOlxuICAvLyBgZ2l0IHJldi1wYXJzZSBIRUFEYCB3b3VsZCB0aHJvdy5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSB8fCAhaGFzR2l0Q29tbWl0KHByb2plY3QpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBkZXRlY3RFeGlzdGluZ0RlZmF1bHRPdXRwdXRQYXRocyhwcm9qZWN0KTtcbiAgICBpZiAob3V0cHV0UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBXaXRoIG5vIHJlY29yZGVkIG91dHB1dHMsIGEgZGVsZXRlZCBidWlsZCBkaXJlY3RvcnkgY2FuIG5ldmVyIGludmFsaWRhdGUgdGhlIGNhY2hlOyBtYWtlXG4gICAgICAvLyB0aGUgaW5hY3RpdmUgcHJvdGVjdGlvbiB2aXNpYmxlIGluc3RlYWQgb2YgZmFpbGluZyBzaWxlbnRseSAoY2YuIGlzc3VlICM5ODEpLlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay55ZWxsb3coJ05vIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgZGV0ZWN0ZWQ7IHBhc3MgLS1vdXRwdXQgdG8gZW5hYmxlIG1pc3Npbmctb3V0cHV0IGNhY2hlIGludmFsaWRhdGlvbi4nKVxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHsgaGFzaDogY29udGVudEhhc2gsIG91dHB1dFBhdGhzIH0pLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBDb21tb24gYnVpbGQgb3V0cHV0IGRpcmVjdG9yaWVzIHVzZWQgYWNyb3NzIG9yZyBwcm9qZWN0cyAodmluZXh0L2J1aWxkLXRzIGVtaXQgZGlzdCxcbi8vIE5leHQuanMgZW1pdHMgLm5leHQsIENSQS1zdHlsZSBhcHBzIGVtaXQgYnVpbGQsIGBuZXh0IGV4cG9ydGAgZW1pdHMgb3V0KS5cbmNvbnN0IGRlZmF1bHRPdXRwdXRDYW5kaWRhdGVzID0gWydkaXN0JywgJ2J1aWxkJywgJy5uZXh0JywgJ291dCddO1xuXG5mdW5jdGlvbiBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhcmd2Lm91dHB1dD8ubGVuZ3RoID8gYXJndi5vdXRwdXQubWFwKFN0cmluZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRldGVjdEV4aXN0aW5nRGVmYXVsdE91dHB1dFBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FuZGlkYXRlcy5maWx0ZXIoKG91dHB1dFBhdGgpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpKTtcbn1cblxuLyoqIEFuIGAtLW91dHB1dGAgdmFsdWUgbWF5IG5hbWUgYSBmaWxlLCBzbyBtYXRjaCB0aGUgZXhhY3QgcGF0aCBhcyB3ZWxsIGFzIGRlc2NlbmRhbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc091dHB1dFBhdGgob3V0cHV0UGF0aHM6IHN0cmluZ1tdLCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRwdXRQYXRocy5zb21lKChvdXRwdXRQYXRoKSA9PiBmaWxlUGF0aCA9PT0gb3V0cHV0UGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke291dHB1dFBhdGh9L2ApKTtcbn1cblxuZnVuY3Rpb24gaGFzR2l0Q29tbWl0KHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydyZXYtcGFyc2UnLCAnLS12ZXJpZnknLCAnSEVBRCddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICB9KS5zdGF0dXMgPT09IDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgLy8gVGhlIGludm9rZWQgYnVpbGQgY29tbWFuZCBpcyBwYXJ0IG9mIHRoZSBjYWNoZSBpZGVudGl0eTogYC1jIGNvbW1hbmRCYCBtdXN0IG5vdCByZXVzZSBhXG4gIC8vIGNhY2hlIHJlY29yZGVkIGZvciBjb21tYW5kQSB3aXRoIG90aGVyd2lzZSB1bmNoYW5nZWQgaW5wdXRzLlxuICBoYXNoLnVwZGF0ZShhcmd2LmNvbW1hbmQgPz8gJycpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICBjb25zdCBjYWNoZSA9IHBhcnNlQnVpbGRDYWNoZShjYWNoZWRDb250ZW50KTtcbiAgaWYgKGNhY2hlPy5oYXNoICE9PSBjb250ZW50SGFzaCkgcmV0dXJuIFtmYWxzZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xuXG4gIC8vIFRoZSBjYWNoZSBpcyB2YWxpZCBvbmx5IHdoaWxlIHRoZSByZWNvcmRlZCAob3IgZXhwbGljaXRseSByZXF1ZXN0ZWQpIGJ1aWxkIG91dHB1dHMgc3RpbGxcbiAgLy8gZXhpc3Q6IGEgZGVsZXRlZCBvdXRwdXQgZGlyZWN0b3J5IChlLmcuIGBybSAtcmYgZGlzdGApIG11c3QgdHJpZ2dlciBhIHJlYnVpbGQgZXZlbiB3aGVuIHRoZVxuICAvLyBpbnB1dHMgYXJlIHVuY2hhbmdlZCAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTgxKS5cbiAgY29uc3QgcmVxdWlyZWRPdXRwdXRQYXRocyA9IGdldEV4cGxpY2l0T3V0cHV0UGF0aHMoYXJndikgPz8gY2FjaGUub3V0cHV0UGF0aHM7XG4gIGNvbnN0IG1pc3NpbmdPdXRwdXRQYXRocyA9IHJlcXVpcmVkT3V0cHV0UGF0aHMuZmlsdGVyKFxuICAgIChvdXRwdXRQYXRoKSA9PiAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBvdXRwdXRQYXRoKSlcbiAgKTtcbiAgaWYgKG1pc3NpbmdPdXRwdXRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdyhgUmVidWlsZGluZyBiZWNhdXNlIGJ1aWxkIG91dHB1dHMgYXJlIG1pc3Npbmc6ICR7bWlzc2luZ091dHB1dFBhdGhzLmpvaW4oJywgJyl9YCkpO1xuICAgIHJldHVybiBbZmFsc2UsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbiAgfVxuICByZXR1cm4gW3RydWUsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VCdWlsZENhY2hlKGNhY2hlZENvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgaGFzaDogc3RyaW5nOyBvdXRwdXRQYXRoczogc3RyaW5nW10gfSB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2FjaGVkQ29udGVudCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2FjaGVkQ29udGVudCkgYXMgeyBoYXNoPzogdW5rbm93bjsgb3V0cHV0UGF0aHM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQ/Lmhhc2ggIT09ICdzdHJpbmcnKSByZXR1cm47XG4gICAgY29uc3Qgb3V0cHV0UGF0aHMgPSBBcnJheS5pc0FycmF5KHBhcnNlZC5vdXRwdXRQYXRocylcbiAgICAgID8gcGFyc2VkLm91dHB1dFBhdGhzLmZpbHRlcigocCkgPT4gdHlwZW9mIHAgPT09ICdzdHJpbmcnKVxuICAgICAgOiBbXTtcbiAgICByZXR1cm4geyBoYXNoOiBwYXJzZWQuaGFzaCwgb3V0cHV0UGF0aHMgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBsZWdhY3kgY2FjaGUgZmlsZSBjb250YWlucyBhIHJhdyBjb250ZW50IGhhc2ggd2l0aG91dCBvdXRwdXQgcmVjb3Jkcy4gVHJlYXQgaXQgYXMgYSBtaXNzOlxuICAgIC8vIGhvbm9yaW5nIGl0IHdvdWxkIGxldCBhIG1hdGNoaW5nIGhhc2ggc2tpcCBhIGJ1aWxkIHdob3NlIG91dHB1dHMgd2VyZSBkZWxldGVkLCBhbmQgb25lXG4gICAgLy8gcmVidWlsZCB1cGdyYWRlcyB0aGUgcmVjb3JkIHRvIHRoZSBKU09OIGZvcm1hdC5cbiAgICByZXR1cm47XG4gIH1cbn1cblxuLy8gTWF0Y2hlZCBhcyBjb21wbGV0ZSBwYXRoIFNFR01FTlRTIChub3Qgc3Vic3RyaW5ncyk6IGBzcmMvY29udGVzdC9gIG11c3Qgbm90IGJlIGV4Y2x1ZGVkIGJ5XG4vLyBgdGVzdGAsIGFuZCBgbXlzcmMvYCBtdXN0IG5vdCBiZSBpbmNsdWRlZCBieSBgc3JjYC5cbmNvbnN0IGluY2x1ZGVEaXJOYW1lcyA9IG5ldyBTZXQoWydzcmMnLCAncHVibGljJ10pO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuICAnYnVuLmxvY2snLFxuICAnYnVuLmxvY2tiJyxcbl07XG5jb25zdCBleGNsdWRlRGlyTmFtZXMgPSBuZXcgU2V0KFsndGVzdCcsICd0ZXN0cycsICdfX3Rlc3RzX18nLCAndGVzdC1maXh0dXJlcyddKTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgLy8gYC11YWxsYCBsaXN0cyB1bnRyYWNrZWQgZmlsZXMgaW5kaXZpZHVhbGx5IChub3QganVzdCB0aGVpciBkaXJlY3RvcnkpLCBzbyBuZXcgZmlsZXMgaW4gYVxuICAgIC8vIGJyYW5kLW5ldyBzb3VyY2UgZGlyZWN0b3J5IHBhcnRpY2lwYXRlIGluIHRoZSBoYXNoIGJlbG93LiBgLXpgIHlpZWxkcyBOVUwtZGVsaW1pdGVkLFxuICAgIC8vIFVOUVVPVEVEIHJlY29yZHM6IHdpdGhvdXQgaXQgZ2l0IEMtcXVvdGVzIG5vbi1BU0NJSSBwYXRocywgd2hpY2ggd291bGQgc2lsZW50bHkgZHJvcCB0aG9zZVxuICAgIC8vIGZpbGVzIGZyb20gYm90aCB0aGUgdW50cmFja2VkIGhhc2hpbmcgYW5kIHRoZSBgZ2l0IGRpZmZgIHBhdGhzcGVjcy5cbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nLCAnLXVhbGwnLCAnLXonXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgdG9rZW5zID0gcmV0LnN0ZG91dC5zcGxpdCgnXFwwJykuZmlsdGVyKCh0b2tlbikgPT4gdG9rZW4ubGVuZ3RoID4gMCk7XG4gICAgY29uc3Qgc3RhdHVzRW50cmllczogeyB1bnRyYWNrZWQ6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfVtdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2Vucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XSE7XG4gICAgICBjb25zdCBzdGF0dXMgPSB0b2tlbi5zbGljZSgwLCAyKTtcbiAgICAgIHN0YXR1c0VudHJpZXMucHVzaCh7IHVudHJhY2tlZDogc3RhdHVzID09PSAnPz8nLCBmaWxlUGF0aDogdG9rZW4uc2xpY2UoMykgfSk7XG4gICAgICAvLyBSZW5hbWUvY29weSByZWNvcmRzIGNhcnJ5IHRoZSBPUklHSU5BTCBwYXRoIGFzIGFuIGV4dHJhIE5VTC1kZWxpbWl0ZWQgZmllbGQ7IGluY2x1ZGUgaXRcbiAgICAgIC8vIHNvIGEgZmlsZSByZW5hbWVkIG91dCBvZiB0aGUgYnVpbGQgaW5wdXRzIHN0aWxsIGludmFsaWRhdGVzIHRoZSBjYWNoZS5cbiAgICAgIGlmIChzdGF0dXMuaW5jbHVkZXMoJ1InKSB8fCBzdGF0dXMuaW5jbHVkZXMoJ0MnKSkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbFBhdGggPSB0b2tlbnNbKytpbmRleF07XG4gICAgICAgIGlmIChvcmlnaW5hbFBhdGgpIHN0YXR1c0VudHJpZXMucHVzaCh7IHVudHJhY2tlZDogZmFsc2UsIGZpbGVQYXRoOiBvcmlnaW5hbFBhdGggfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRFbnRyaWVzID0gc3RhdHVzRW50cmllcy5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgLi4uZW50cnksXG4gICAgICBoYXNoUGF0aDpcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCdcbiAgICAgICAgICA/IGVudHJ5LmZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKVxuICAgICAgICAgIDogZW50cnkuZmlsZVBhdGgsXG4gICAgfSkpO1xuICAgIC8vIEJ1aWxkIE9VVFBVVFMgbXVzdCBuZXZlciBjb3VudCBhcyBidWlsZCBpbnB1dHM6IGhhc2hpbmcgZS5nLiBhbiB1bnRyYWNrZWQgZGlzdC8gZmlsZSB3b3VsZFxuICAgIC8vIGNoYW5nZSB0aGUgaGFzaCBvbiBldmVyeSBidWlsZCBhbmQgZGlzYWJsZSB0aGUgY2FjaGUgcGVybWFuZW50bHkuXG4gICAgY29uc3QgcHJvamVjdFJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5yb290RGlyUGF0aCwgcHJvamVjdC5kaXJQYXRoKTtcbiAgICBjb25zdCBleHBsaWNpdE91dHB1dFBhdGhzID0gKGdldEV4cGxpY2l0T3V0cHV0UGF0aHMoYXJndikgPz8gW10pLm1hcCgob3V0cHV0UGF0aCkgPT5cbiAgICAgIHBhdGguam9pbihwcm9qZWN0UmVsYXRpdmVEaXJQYXRoLCBvdXRwdXRQYXRoKVxuICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRFbnRyaWVzID0gbm9ybWFsaXplZEVudHJpZXMuZmlsdGVyKCh7IGZpbGVQYXRoLCBoYXNoUGF0aCB9KSA9PiB7XG4gICAgICBjb25zdCBkaXJlY3RvcnlTZWdtZW50cyA9IGhhc2hQYXRoLnNwbGl0KCcvJykuc2xpY2UoMCwgLTEpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGRpcmVjdG9yeVNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+IGluY2x1ZGVEaXJOYW1lcy5oYXMoc2VnbWVudCkpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGhhc2hQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZGlyZWN0b3J5U2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gZXhjbHVkZURpck5hbWVzLmhhcyhzZWdtZW50KSkgJiZcbiAgICAgICAgLy8gT25seSBFWFBMSUNJVExZIGRlY2xhcmVkIG91dHB1dHMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGlucHV0IGhhc2guIERlZmF1bHQgY2FuZGlkYXRlc1xuICAgICAgICAvLyAoZGlzdC9idWlsZC8ubmV4dC9vdXQpIGFyZSBOT1Q6IGdpdGlnbm9yZWQgYXJ0aWZhY3RzIG5ldmVyIGFwcGVhciBpbiBgZ2l0IHN0YXR1c2BcbiAgICAgICAgLy8gYW55d2F5LCBhbmQgYSBub24taWdub3JlZCBmaWxlIHRoZXJlIG1heSBiZSBnZW51aW5lIHNvdXJjZSAoZS5nLiBidWlsZC8gc2NyaXB0cyksIHdob3NlXG4gICAgICAgIC8vIGNoYW5nZXMgbXVzdCBpbnZhbGlkYXRlIHRoZSBjYWNoZSDigJQgY29ycmVjdG5lc3Mgb3ZlciBjYWNoZSBoaXRzLiBQcm9qZWN0cyBrZWVwaW5nXG4gICAgICAgIC8vIG5vbi1pZ25vcmVkIGFydGlmYWN0cyBpbiB0aG9zZSBkaXJlY3RvcmllcyBzaG91bGQgZ2l0aWdub3JlIHRoZW0gb3IgcGFzcyAtLW91dHB1dC5cbiAgICAgICAgIW1hdGNoZXNPdXRwdXRQYXRoKGV4cGxpY2l0T3V0cHV0UGF0aHMsIGZpbGVQYXRoKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRFbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5Lmhhc2hQYXRoKS5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIFVudHJhY2tlZCBmaWxlcyBuZXZlciBhcHBlYXIgaW4gYGdpdCBkaWZmYCwgc28gaGFzaCB0aGVpciBjb250ZW50cyBkaXJlY3RseS5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZpbHRlcmVkRW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS51bnRyYWNrZWQpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBoYXNoLnVwZGF0ZShlbnRyeS5oYXNoUGF0aCk7XG4gICAgICAgIGhhc2gudXBkYXRlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgZW50cnkuZmlsZVBhdGgpKSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIGZpbGUgbWF5IHZhbmlzaCBjb25jdXJyZW50bHk7IHRoZSB0cmFja2VkLXN0YXRlIGRpZmYgYmVsb3cgaXMgdW5hZmZlY3RlZC5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0cmFja2VkUGF0aHMgPSBmaWx0ZXJlZEVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gIWVudHJ5LnVudHJhY2tlZCkubWFwKChlbnRyeSkgPT4gZW50cnkuaGFzaFBhdGgpO1xuICAgIGlmICh0cmFja2VkUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBgZ2l0IGRpZmYgSEVBRCAtLWAgd2l0aCBubyBwYXRoc3BlYyB3b3VsZCBkaWZmIEVWRVJZIGZpbGUsIGxldHRpbmcgZXhjbHVkZWQgY2hhbmdlc1xuICAgICAgLy8gKGRvY3MsIHRlc3RzKSBpbnZhbGlkYXRlIHRoZSBjYWNoZS5cbiAgICAgIHJlc29sdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYGdpdCBkaWZmIEhFQURgIChub3QgcGxhaW4gYGdpdCBkaWZmYCkgc28gc3RhZ2VkLW9ubHkgY2hhbmdlcyBpbnZhbGlkYXRlIHRoZSBjYWNoZSB0b287XG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoLlxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnSEVBRCcsICctLScsIC4uLnRyYWNrZWRQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBvbWl0U2lsZW50U3RhcnQ/OiBib29sZWFuO1xuICBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbjtcbiAgcHJvY2Vzc1NpbGVudE91dHB1dD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcmludFJhd091dHB1dD86IGJvb2xlYW47XG4gIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seT86IGJvb2xlYW47XG4gIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc2lsZW50U3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZmZlcmVkUnVuUmVzdWx0IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgb3V0cHV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHsgc2lsZW50PzogYm9vbGVhbiB9LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKCEoYXJndi5zaWxlbnQgJiYgb3B0cy5vbWl0U2lsZW50U3RhcnQgJiYgIWFyZ3YuZHJ5UnVuKSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsIGFyZ3Yuc2lsZW50ID8gJ0NvbW1hbmQnIDogJ1N0YXJ0Jyk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgPSBCb29sZWFuKFxuICAgIGFyZ3Yuc2lsZW50ICYmIChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPz8gb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkpXG4gICk7XG4gIGxldCB3cm90ZVNpbGVudFByb2dyZXNzID0gZmFsc2U7XG4gIGNvbnN0IHByb2dyZXNzVGltZXIgPVxuICAgIGFyZ3Yuc2lsZW50ICYmIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zXG4gICAgICA/IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLicpO1xuICAgICAgICAgIHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB9LCBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyAoYXJndi5zaWxlbnQgPyB0cnVlIDogdW5kZWZpbmVkKSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogYXJndi5zaWxlbnQgPyAncGlwZScgOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZzogYXJndi5zaWxlbnQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBpZiAocHJvZ3Jlc3NUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKHdyb3RlU2lsZW50UHJvZ3Jlc3MpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbiAgaWYgKHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgJiYgKCFvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSB8fCBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICBjb25zdCBvdXRwdXQgPSAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8gb3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0KHJldC5zdGRvdXQpIDogcmV0LnN0ZG91dCkudHJpbSgpO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICB9XG4gIGlmIChhcmd2LnNpbGVudCAmJiBleGl0Q29kZSA9PT0gMCAmJiBvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpKTtcbiAgfVxuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIGV4aXRDb2RlLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCAmJiAhb3B0cy5wcmludFJhd091dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPEJ1ZmZlcmVkUnVuUmVzdWx0PiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICBvdXRwdXQ6ICcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gdHJ1ZSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4aXRDb2RlOiByZXQuc3RhdHVzID8/IDEsXG4gICAgICBvdXRwdXQ6IHJldC5zdGRvdXQsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICAvLyBObyBgLS1idW5gOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrcyB0b29scyByZXF1aXJpbmdcbiAgLy8gcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgY29uc3QgcHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbCgvUFJJU01BIGdlbmVyYXRlKD8hXFxzKy0tbm8taGludHMpKD89XFxzfCQpL2d1LCAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gcnVuICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4pIHJ1bmAuXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIHJ1biBidW4gcnVuJywgJ2J1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAvLyBLZWVwIFBsYXl3cmlnaHQgYXMgYSBwYWNrYWdlLW1hbmFnZXIgY29tbWFuZCBpbnN0ZWFkIG9mIHJlc29sdmluZyBpdCB0aHJvdWdoIG5vZGVfbW9kdWxlcy8uYmluLlxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgIC5yZXBsYWNlQWxsKCdZQVJOICcsICFwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCk7XG4gIHJldHVybiB7XG4gICAgcHJpbnRhYmxlOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBkb3RlbnYgLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz4sXG4gIHByaW50T3B0aW9uczogeyBzaWxlbnRTdWNjZXNzPzogYm9vbGVhbiB9ID0ge31cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBpZiAocHJpbnRPcHRpb25zLnNpbGVudFN1Y2Nlc3MpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBjb25maWd1cmVDb2xvckVudihuZXdFbnYsIG9wdHMucHJlc2VydmVDb2xvcik7XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBjaGlsZC1wcm9jZXNzIGNvbG9yIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igd2ItbWFuYWdlZCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIGVudiBUaGUgY2hpbGQtcHJvY2VzcyBlbnZpcm9ubWVudCB0byBtdXRhdGUuXG4gKiBAcGFyYW0gcHJlc2VydmVDb2xvciBXaGV0aGVyIHdiIHNob3VsZCBwcmVzZXJ2ZSBjb2xvcnMgZm9yIG91dHB1dCB0aGF0IGl0IGNhcHR1cmVzIGFuZCByZXByaW50cyB0byBhbiBpbnRlcmFjdGl2ZSBUVFkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVDb2xvckVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIHByZXNlcnZlQ29sb3I/OiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChlbnYuTk9fQ09MT1IgIT09IHVuZGVmaW5lZCB8fCBwcmVzZXJ2ZUNvbG9yID09PSBmYWxzZSkge1xuICAgIC8vIE5PX0NPTE9SIGFuZCBwcmVzZXJ2ZUNvbG9yPWZhbHNlIGFyZSBleHBsaWNpdCBuby1jb2xvciBjaG9pY2VzLCBzbyBpbmhlcml0ZWQgRk9SQ0VfQ09MT1IgbXVzdCBub3QgbGVhayB0aHJvdWdoLlxuICAgIGRlbGV0ZSBlbnYuRk9SQ0VfQ09MT1I7XG4gIH0gZWxzZSBpZiAocHJlc2VydmVDb2xvciAmJiBwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAgIGVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IEZPUkNFX0tJTExfREVMQVlfTVMgPSA1MDAwO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAna2lsbC1vdGhlcnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZXhpdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2tpbGwtb3RoZXJzLW9uLWZhaWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZmFpbHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc3VjY2Vzczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGVmaW5lIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBjcml0ZXJpYScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogWydhbGwnLCAnZmlyc3QnXSxcbiAgICBkZWZhdWx0OiAnYWxsJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdDb21tYW5kcyB0byBydW4gY29uY3VycmVudGx5JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuaW50ZXJmYWNlIFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMge1xuICBjb21tYW5kczogc3RyaW5nW107XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIGtpbGxPdGhlcnM6IGJvb2xlYW47XG4gIGtpbGxPdGhlcnNPbkZhaWw6IGJvb2xlYW47XG4gIHN1Y2Nlc3M6ICdhbGwnIHwgJ2ZpcnN0JztcbiAgY2k/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbmN1cnJlbnRseShvcHRpb25zOiBSdW5Db25jdXJyZW50bHlPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zLmNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT5cbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduKG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBvcHRpb25zLnByb2plY3QpLnJ1bm5hYmxlLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMucHJvamVjdC5kaXJQYXRoLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihvcHRpb25zLnByb2plY3QuZW52LCB7IGNpOiBvcHRpb25zLmNpIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gICk7XG5cbiAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gIGxldCBpbnRlcnJ1cHRlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RvcFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JjZUtpbGxQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5mcm9tPG51bWJlciB8IHVuZGVmaW5lZD4oeyBsZW5ndGg6IGNoaWxkcmVuLmxlbmd0aCB9KTtcbiAgY29uc3Qgd2FpdEZvckV4aXRQcm9taXNlcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dGxlID0gKGV4aXRDb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBleGl0Q29kZTtcbiAgICAgICAgZmlyc3RSZXN1bHQgPz89IGV4aXRDb2RlO1xuXG4gICAgICAgIGlmICghc3RvcHBpbmcgJiYgc2hvdWxkU3RvcE90aGVycyhleGl0Q29kZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICBzdG9wUmVzdWx0ID0gZXhpdENvZGU7XG4gICAgICAgICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sICdTSUdURVJNJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSA/PyB1bmRlZmluZWQsIHNpZ25hbCA/PyB1bmRlZmluZWQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBzdG9wQWxsID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICBpbnRlcnJ1cHRlZFNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgIGlmIChzdG9wcGluZykgcmV0dXJuO1xuXG4gICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIHNpZ25hbCkpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdpbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHSU5UJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3Rlcm0gPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHVEVSTScpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdxdWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1FVSVQnKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICBwcm9jZXNzLm9uKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvckV4aXRQcm9taXNlcyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZm9yY2VLaWxsUHJvbWlzZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgfVxuXG4gIGlmIChpbnRlcnJ1cHRlZFNpZ25hbCkge1xuICAgIHJldHVybiBnZXRFeGl0Q29kZSh1bmRlZmluZWQsIGludGVycnVwdGVkU2lnbmFsKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcpIHtcbiAgICByZXR1cm4gZmlyc3RSZXN1bHQgPz8gMTtcbiAgfVxuICBpZiAoc3RvcFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0b3BSZXN1bHQ7XG4gIH1cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGl0Q29kZShjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgaWYgKHNpZ25hbCAmJiBzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpIHtcbiAgICByZXR1cm4gMTI4ICsgY29uc3RhbnRzLnNpZ25hbHNbc2lnbmFsXTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3RvcE90aGVycyhcbiAgZXhpdENvZGU6IG51bWJlcixcbiAgb3B0aW9uczogUGljazxSdW5Db25jdXJyZW50bHlPcHRpb25zLCAna2lsbE90aGVycycgfCAna2lsbE90aGVyc09uRmFpbCcgfCAnc3VjY2Vzcyc+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0JyB8fCBvcHRpb25zLmtpbGxPdGhlcnMgfHwgKG9wdGlvbnMua2lsbE90aGVyc09uRmFpbCAmJiBleGl0Q29kZSAhPT0gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZvcmNlS2lsbFBpZHMgPSBzaWduYWxQaWRzKHRvQ2hpbGRQaWRzKGNoaWxkcmVuKSwgc2lnbmFsKTtcbiAgaWYgKGZvcmNlS2lsbFBpZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgaWYgKGF3YWl0IHdhaXRGb3JGb3JjZUtpbGwoZm9yY2VLaWxsUGlkcykpIHtcbiAgICBzaWduYWxQaWRzKGZvcmNlS2lsbFBpZHMsICdTSUdLSUxMJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9DaGlsZFBpZHMoY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBjaGlsZHJlbi5mbGF0TWFwKChjaGlsZCkgPT4gKGNoaWxkLnBpZCA9PT0gdW5kZWZpbmVkID8gW10gOiBbY2hpbGQucGlkXSkpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxQaWRzKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogbnVtYmVyW10ge1xuICBjb25zdCBzaWduYWxlZFBpZHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgcGlkIG9mIHBpZHMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFraWxsUHJvY2Vzc0dyb3VwKHBpZCwgc2lnbmFsKSkgY29udGludWU7XG5cbiAgICAgIHNpZ25hbGVkUGlkcy5wdXNoKHBpZCk7XG4gICAgICB0cmVlS2lsbChwaWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGtpbGwgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaWduYWxlZFBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JGb3JjZUtpbGwocGlkczogcmVhZG9ubHkgbnVtYmVyW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRk9SQ0VfS0lMTF9ERUxBWV9NUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChwaWRzLmV2ZXJ5KGlzUHJvY2Vzc0dyb3VwR29uZSkpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IHNsZWVwKE1hdGgubWluKDEwMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0dyb3VwR29uZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCAwKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzR3JvdXAocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgc2lnbmFsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IGJ1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZCwgZ2V0RDFEYXRhYmFzZU5hbWUsIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpciB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuY29uc3QgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FID0gJ2xpdGVzdHJlYW0ueW1sJztcbmNvbnN0IERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcblxuY2xhc3MgRHJpenpsZVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnY2xlYW51cC1saXRlc3RyZWFtJyk7XG4gICAgY29uc3Qgd2FsQ2hlY2twb2ludENvbW1hbmQgPSBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF0gJiYgY29tbWFuZCAtdiBzcWxpdGUzID4vZGV2L251bGw7IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBzcWxpdGUzIFwiJHtkYlBhdGh9XCI7IGZpYDtcbiAgICByZXR1cm4gYCR7d2FsQ2hlY2twb2ludENvbW1hbmR9OyBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qOyBybSAtUmYgXCIke3BhdGguZGlybmFtZShkYlBhdGgpfS8uJHtwYXRoLmJhc2VuYW1lKGRiUGF0aCl9XCIqIHx8IHRydWVgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgZDFEYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgICBpZiAoZDFEYXRhYmFzZU5hbWUpIHtcbiAgICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBEMSBzdWJ0cmVlIHNvIHRoYXQgb3RoZXIgbG9jYWxseS1wZXJzaXN0ZWQgYmluZGluZ3MgKEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKSBzdXJ2aXZlLFxuICAgICAgLy8gdGhlbiByZS1tYXRlcmlhbGl6ZSB0aGUgRDEgU1FMaXRlIGZpbGUuIEl0cyBwYXRoIGlzIGRldGVybWluaXN0aWMsIHNvIGEgREFUQUJBU0VfVVJMIGV4cG9ydGVkXG4gICAgICAvLyBiZWZvcmUgdGhlIHJlbW92YWwgc3RheXMgdmFsaWQuXG4gICAgICByZXR1cm4gYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfS92My9kMVwiICYmICR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGQxRGF0YWJhc2VOYW1lKX0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpO1xuICAgIGlmICghcmVtb3ZlQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgcmVzZXQgc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VlZENvbW1hbmQgPSB0aGlzLnNlZWQocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0ZUNvbW1hbmQgPSB0aGlzLmRlcGxveShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlZWRDb21tYW5kID09PSAndHJ1ZScgPyBtaWdyYXRlQ29tbWFuZCA6IGAke21pZ3JhdGVDb21tYW5kfSAmJiAke3NlZWRDb21tYW5kfWA7XG4gIH1cblxuICBtaWdyYXRlRm9yU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgKGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpIHx8IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgbWlncmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdkZXBsb3ktZm9yY2UnKTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGgpO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIFRoZSBlbnZpcm9ubWVudCBhc3NpZ25tZW50IG11c3QgZ28gdGhyb3VnaCBidWlsZERyaXp6bGVLaXRDb21tYW5kOiBwcmVmaXhpbmcgaXRzXG4gICAgLy8gcG9zc2libHktcGFyZW50aGVzaXplZCByZXN1bHQgd2l0aCBgQUxMT1dfVE9fU0tJUF9TRUVEPTBgIHdvdWxkIGJlIGEgc2hlbGwgc3ludGF4IGVycm9yLlxuICAgIGNvbnN0IG1pZ3JhdGVXaXRoU2VlZENvbW1hbmQgPSBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsICdtaWdyYXRlJywgJ0FMTE9XX1RPX1NLSVBfU0VFRD0wJyk7XG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07ICR7dGhpcy5kZXBsb3kocHJvamVjdCl9ICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofVwiICYmIGxzIC1haGwgXCIke2RiUGF0aH1cIiAmJiAke21pZ3JhdGVXaXRoU2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdsaXN0LWJhY2t1cHMnKTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ3Jlc3RvcmUnKTtcbiAgICByZXR1cm4gYCR7YnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKG91dHB1dFBhdGgpfTsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gXCIke291dHB1dFBhdGh9XCIgXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICBnZW5lcmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgZ2VuZXJhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cblxuICBtaWdyYXRlRGV2KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5zZWVkKSByZXR1cm4gJ1lBUk4gcnVuIHNlZWQnO1xuICAgIGNvbnN0IGRlZmF1bHRTZWVkUGF0aCA9IHBhdGguam9pbignZGInLCAnc2VlZC50cycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRlZmF1bHRTZWVkUGF0aCkpKSB7XG4gICAgICByZXR1cm4gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgQlVOICR7ZGVmYXVsdFNlZWRQYXRofWAgOiBgQlVOIGJ1aWxkLXRzIHJ1biAke2RlZmF1bHRTZWVkUGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHN0dWRpbyBmb3IgRHJpenpsZSBkb2VzIG5vdCBzdXBwb3J0IGRiLXVybC1vci1wYXRoLicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmdzOiBzdHJpbmcsIGVudmlyb25tZW50QXNzaWdubWVudCA9ICcnKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZCA9IGAke2Vudmlyb25tZW50QXNzaWdubWVudCAmJiBgJHtlbnZpcm9ubWVudEFzc2lnbm1lbnR9IGB9WUFSTiBkcml6emxlLWtpdCAke2FyZ3N9YDtcbiAgLy8gQSBjYWxsZXItc3VwcGxpZWQgLS1jb25maWcgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHNvIHRoZSBjd2QgbXVzdCBzdGF5IHRoZXJlLlxuICByZXR1cm4gYXJncy5pbmNsdWRlcygnLS1jb25maWcnKSA/IGNvbW1hbmQgOiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgY29tbWFuZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdDogUHJvamVjdCwgY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIC8vIGRyaXp6bGUta2l0IHJlc29sdmVzIHJlbGF0aXZlIHBhdGhzIGluIGl0cyBjb25maWcgYWdhaW5zdCB0aGUgY3dkLCBzbyB0aGUgY29tbWFuZCBtdXN0IHJ1blxuICAvLyBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZHJpenpsZS5jb25maWcuKiBldmVuIHdoZW4gbW9ub3JlcG8gcGFja2FnZXMgc2hhcmUgaXQgYXQgdGhlIHJvb3QuXG4gIHJldHVybiBjb25maWcgJiYgY29uZmlnLmRpclBhdGggIT09IHByb2plY3QuZGlyUGF0aFxuICAgID8gYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBjb25maWcuZGlyUGF0aF0pfSAmJiAke2NvbW1hbmR9KWBcbiAgICA6IGNvbW1hbmQ7XG59XG5cbi8qKlxuICogV2hldGhlciBkcml6emxlLWtpdCBpcyB0aGUgcHJvamVjdCdzIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20uIEEgZHJpenpsZS1vcm0gZGVwZW5kZW5jeSBhbG9uZSBpc1xuICogbm90IGEgcmVsaWFibGUgbWFya2VyOiBhIFdvcmtlciBtYXkgdXNlIEQxIG9ubHkgZm9yIGNhY2hpbmcgd2hpbGUgaXRzIGRyaXp6bGUgY29uZmlnIHRhcmdldHMgYW5cbiAqIHVucmVsYXRlZCBkYXRhYmFzZSAoZS5nLiBQb3N0Z3JlU1FMIHZpYSBIeXBlcmRyaXZlKSwgYW5kIHJ1bm5pbmcgYGRyaXp6bGUta2l0IG1pZ3JhdGVgIGFnYWluc3RcbiAqIHRoYXQgZGF0YWJhc2UgZHVyaW5nIGEgRDEgZGVwbG95IHdvdWxkIGJlIHdyb25nIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NDIpLlxuICogU28gcmVxdWlyZSBhbiBleHBsaWNpdCBtYXJrZXI6IGEgZHJpenpsZSBjb25maWcgd2hvc2UgZGlhbGVjdC9kcml2ZXIgdGFyZ2V0cyBzcWxpdGUsIGQxLWh0dHAsIG9yXG4gKiBkdXJhYmxlLXNxbGl0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXNEcml6emxlS2l0Rm9yRDEocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGZpbmREcml6emxlQ29uZmlnKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHN0cmlwSnNDb21tZW50cyhmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBjb25maWcuZmlsZU5hbWUpLCAndXRmOCcpKTtcbiAgICAvLyBTY2FuIG9ubHkgdGhlIGV4cG9ydGVkIGNvbmZpZydzIG9iamVjdCBsaXRlcmFsOiBkcml6emxlLWtpdCBjb25zdW1lcyB0aGUgZGVmYXVsdCBleHBvcnQsXG4gICAgLy8gYW5kIG1hdGNoaW5nIG90aGVyIHRleHQgKGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50IGFib3ZlIHRoZSBleHBvcnQsIG9yIG1hcmtlci1saWtlXG4gICAgLy8gc3RyaW5nIGNvbnRlbnQgaW4gc3RhdGVtZW50cyBhZnRlciBpdCkgd291bGQgc2VsZWN0IHRoZSB3cm9uZyBtaWdyYXRpb24gbWVjaGFuaXNtLlxuICAgIC8vIFBPU0lUSU9OUyAoZXhwb3J0IG1hcmtlcnMsIGRlY2xhcmF0aW9ucykgYXJlIGxvY2F0ZWQgb24gYSBzdHJpbmctbWFza2VkIHZpZXcgb2YgdGhlIHNhbWVcbiAgICAvLyBsZW5ndGgsIHNvIGBleHBvcnQgZGVmYXVsdGAgaW5zaWRlIGEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IG1pc2xlYWQgdGhlIHNlYXJjaC5cbiAgICBjb25zdCBtYXNrZWRDb250ZW50ID0gbWFza1N0cmluZ0NvbnRlbnRzKGNvbnRlbnQpO1xuICAgIGNvbnN0IGV4cG9ydEluZGljZXMgPSBbJ2V4cG9ydCBkZWZhdWx0JywgJ21vZHVsZS5leHBvcnRzJ11cbiAgICAgIC5tYXAoKG1hcmtlcikgPT4gbWFza2VkQ29udGVudC5pbmRleE9mKG1hcmtlcikpXG4gICAgICAuZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKTtcbiAgICBjb25zdCBleHBvcnRTdGFydEluZGV4ID0gZXhwb3J0SW5kaWNlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4uZXhwb3J0SW5kaWNlcykgOiAwO1xuICAgIGNvbnN0IG9iamVjdFNwYW4gPSBleHRyYWN0RXhwb3J0ZWRDb25maWdPYmplY3QoY29udGVudCwgbWFza2VkQ29udGVudCwgZXhwb3J0U3RhcnRJbmRleCk7XG4gICAgcmV0dXJuIG9iamVjdFNwYW4gIT09IHVuZGVmaW5lZCAmJiBkZWNsYXJlc1NxbGl0ZVRhcmdldChvYmplY3RTcGFuKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG9iamVjdCBsaXRlcmFsIHRoZSBleHBvcnQgYWN0dWFsbHkgZXZhbHVhdGVzIHRvOiBmb3IgYGV4cG9ydCBkZWZhdWx0IHsuLi59YCBvclxuICogYGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7Li4ufSlgIHRoZSBmaXJzdCBiYWxhbmNlZCBvYmplY3QgYWZ0ZXIgdGhlIG1hcmtlciwgYW5kIGZvclxuICogYGV4cG9ydCBkZWZhdWx0IGNvbmZpZztgIHRoZSBpbml0aWFsaXplciBvZiB0aGF0IGlkZW50aWZpZXIncyBkZWNsYXJhdGlvbiDigJQgbmV2ZXIgdGhlIHdob2xlXG4gKiBmaWxlLCBzaW5jZSBhbiB1bnJlbGF0ZWQgb2JqZWN0IChlLmcuIGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50KSBtdXN0IG5vdCBiZSBzZWxlY3RlZC5cbiAqIFVuZGVmaW5lZCB3aGVuIHRoZSBleHByZXNzaW9uIGNhbm5vdCBiZSByZXNvbHZlZDsgd2IgZGVwbG95J3MgdW5tYW5hZ2VkLUQxIHdhcm5pbmcgY292ZXJzIHRoYXQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRlZENvbmZpZ09iamVjdChcbiAgY29udGVudDogc3RyaW5nLFxuICBtYXNrZWRDb250ZW50OiBzdHJpbmcsXG4gIGV4cG9ydFN0YXJ0SW5kZXg6IG51bWJlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhwb3J0ZWRFeHByZXNzaW9uID0gbWFza2VkQ29udGVudFxuICAgIC5zbGljZShleHBvcnRTdGFydEluZGV4KVxuICAgIC5yZXBsYWNlKC9eKD86ZXhwb3J0XFxzK2RlZmF1bHR8bW9kdWxlXFwuZXhwb3J0c1xccyo9KVxccyovLCAnJyk7XG4gIC8vIEFuIGlkZW50aWZpZXIgZXhwb3J0IG1heSBjYXJyeSBhIFR5cGVTY3JpcHQgdHlwZSBwb3N0Zml4IChgY29uZmlnIHNhdGlzZmllcyBDb25maWc7YCAvXG4gIC8vIGBjb25maWcgYXMgQ29uZmlnO2ApOyB0aGUgaWRlbnRpZmllciBpcyByZWNvZ25pemVkIEZJUlNUIHNvIGEgcG9zdGZpeCBjb250YWluaW5nIGEgVFlQRVxuICAvLyBsaXRlcmFsIChgc2F0aXNmaWVzIHsgZGlhbGVjdDogJ3NxbGl0ZScgfCAuLi4gfWApIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcnVudGltZSBjb25maWcuXG4gIGNvbnN0IGlkZW50aWZpZXJNYXRjaCA9IC9eKFtBLVphLXpfJF1bXFx3JF0qKVxccyooPzpzYXRpc2ZpZXNcXGJ8YXNcXGJ8O3xcXG58JCkvLmV4ZWMoZXhwb3J0ZWRFeHByZXNzaW9uKTtcbiAgaWYgKCFpZGVudGlmaWVyTWF0Y2gpIHtcbiAgICBjb25zdCBicmFjZU9mZnNldCA9IG1hc2tlZENvbnRlbnQuc2xpY2UoZXhwb3J0U3RhcnRJbmRleCkuaW5kZXhPZigneycpO1xuICAgIGlmIChicmFjZU9mZnNldCA9PT0gLTEpIHJldHVybjtcbiAgICByZXR1cm4gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudC5zbGljZShleHBvcnRTdGFydEluZGV4ICsgYnJhY2VPZmZzZXQpKTtcbiAgfVxuXG4gIC8vIGAkYCBpcyBsZWdhbCBpbiBpZGVudGlmaWVycyBidXQgYSByZWdleCBhbmNob3IsIHNvIGl0IG11c3QgYmUgZXNjYXBlZCBiZWZvcmUgaW50ZXJwb2xhdGlvbjtcbiAgLy8gYCg/IVtcXHckXSlgIChub3QgYFxcYmApIGVuZHMgdGhlIG1hdGNoIGJlY2F1c2UgYFxcYmAgbmV2ZXIgZmlyZXMgYWZ0ZXIgYSB0cmFpbGluZyBgJGAuXG4gIGNvbnN0IGVzY2FwZWRJZGVudGlmaWVyID0gaWRlbnRpZmllck1hdGNoWzFdIS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgY29uc3QgZGVjbGFyYXRpb25FbmRJbmRleCA9IGZpbmRNb2R1bGVTY29wZURlY2xhcmF0aW9uRW5kKG1hc2tlZENvbnRlbnQsIGVzY2FwZWRJZGVudGlmaWVyKTtcbiAgaWYgKGRlY2xhcmF0aW9uRW5kSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAvLyBUaGUgaW5pdGlhbGl6ZXIgbXVzdCBiZWxvbmcgdG8gVEhJUyBkZWNsYXJhdGlvbiAoYSB0eXBlIGFubm90YXRpb24gbWF5IHByZWNlZGUgdGhlIGA9YCk7IGFuXG4gIC8vIHVuaW5pdGlhbGl6ZWQgYGxldCBjb25maWc7YCBzdGF5cyB1bnJlc29sdmVkIGluc3RlYWQgb2YgZ3JhYmJpbmcgYSBsYXRlciBzdGF0ZW1lbnQncyBgPWAuXG4gIGNvbnN0IGFzc2lnbm1lbnRNYXRjaCA9IC9eXFxzKig/OjpbXj07XFxuXSopPz0vLmV4ZWMobWFza2VkQ29udGVudC5zbGljZShkZWNsYXJhdGlvbkVuZEluZGV4KSk7XG4gIGlmICghYXNzaWdubWVudE1hdGNoKSByZXR1cm47XG4gIHJldHVybiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50LnNsaWNlKGRlY2xhcmF0aW9uRW5kSW5kZXggKyBhc3NpZ25tZW50TWF0Y2hbMF0ubGVuZ3RoKSk7XG59XG5cbi8qKlxuICogVGhlIGVuZCBpbmRleCBvZiB0aGUgaWRlbnRpZmllcidzIGRlY2xhcmF0aW9uIGF0IGJyYWNlIGRlcHRoIFpFUk8gKG1vZHVsZSBzY29wZSk6IGEgc2FtZS1uYW1lZFxuICogZGVjbGFyYXRpb24gaW5zaWRlIGEgZnVuY3Rpb24gYm9keSBtdXN0IG5vdCBzaGFkb3cgdGhlIGJpbmRpbmcgdGhlIGV4cG9ydCByZWZlcmVuY2VzLCBhbmRcbiAqIGluZGVudGF0aW9uIGlzIG5vIHNjb3BlIHNpZ25hbCDigJQgZGVwdGggb3ZlciB0aGUgc3RyaW5nLW1hc2tlZCBjb250ZW50IGlzLlxuICovXG5mdW5jdGlvbiBmaW5kTW9kdWxlU2NvcGVEZWNsYXJhdGlvbkVuZChtYXNrZWRDb250ZW50OiBzdHJpbmcsIGVzY2FwZWRJZGVudGlmaWVyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNsYXJhdGlvblJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YCg/PCFbXFx3JF0pKD86ZXhwb3J0XFxzKyk/KD86Y29uc3R8bGV0fHZhcilcXHMrJHtlc2NhcGVkSWRlbnRpZmllcn0oPyFbXFx3JF0pYCxcbiAgICAnZydcbiAgKTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHNjYW5JbmRleCA9IDA7XG4gIGZvciAobGV0IG1hdGNoID0gZGVjbGFyYXRpb25SZWdleC5leGVjKG1hc2tlZENvbnRlbnQpOyBtYXRjaDsgbWF0Y2ggPSBkZWNsYXJhdGlvblJlZ2V4LmV4ZWMobWFza2VkQ29udGVudCkpIHtcbiAgICBmb3IgKDsgc2NhbkluZGV4IDwgbWF0Y2guaW5kZXg7IHNjYW5JbmRleCsrKSB7XG4gICAgICBjb25zdCBjaGFyID0gbWFza2VkQ29udGVudFtzY2FuSW5kZXhdO1xuICAgICAgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09ICd9JykgZGVwdGgtLTtcbiAgICB9XG4gICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdGhlIENPTlRFTlRTIG9mIHN0cmluZyBsaXRlcmFscyB3aXRoIHNwYWNlcyAoc2FtZSBsZW5ndGgsIG5ld2xpbmVzIGtlcHQpLCBzbyBwb3NpdGlvblxuICogc2VhcmNoZXMgb3ZlciB0aGUgcmVzdWx0IGNhbm5vdCBtYXRjaCB0ZXh0IGluc2lkZSBzdHJpbmdzIHdoaWxlIGFsbCBpbmRleGVzIHN0aWxsIG1hcCAxOjEgdG9cbiAqIHRoZSBvcmlnaW5hbCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBtYXNrU3RyaW5nQ29udGVudHMoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICByZXN1bHQgKz0gJyAgJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHtcbiAgICAgICAgc3RyaW5nRGVsaW1pdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhciA9PT0gJ1xcbicgPyAnXFxuJyA6ICcgJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmctYXdhcmUgc2NhbiBmb3IgdGhlIG1hcmtlcnMgaW5kaWNhdGluZyB0aGUgY29uZmlnIG1hbmFnZXMgYSAoQ2xvdWRmbGFyZSBEMSBjb21wYXRpYmxlKVxuICogU1FMaXRlIGRhdGFiYXNlIOKAlCBhIGBkaWFsZWN0OiAnc3FsaXRlJ2AsIGBkcml2ZXI6ICdkMS1odHRwJ2AsIG9yIGBkcml2ZXI6ICdkdXJhYmxlLXNxbGl0ZSdgXG4gKiBQUk9QRVJUWSAocGxhaW4gb3IgcXVvdGVkIGtleSkuIEtleXMgYXJlIG9ubHkgcmVjb2duaXplZCBpbiBjb2RlIHBvc2l0aW9uLCBzbyBtYXJrZXItbGlrZSB0ZXh0XG4gKiBlbWJlZGRlZCBpbiB1bnJlbGF0ZWQgc3RyaW5nIHZhbHVlcyAoZS5nLiBhIHNjaGVtYSBwYXRoKSBjYW5ub3QgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzU3FsaXRlVGFyZ2V0KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZ3MoY29udGVudCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHZhbHVlVG9rZW5JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnY29kZScpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58W1xcc3ssKF0pKGRpYWxlY3R8ZHJpdmVyKVxccyo6XFxzKiQvLmV4ZWModG9rZW4udmFsdWUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGtleSA9IG1hdGNoWzFdO1xuICAgICAgICB2YWx1ZVRva2VuSW5kZXggPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ2RpYWxlY3QnIHx8IHRva2VuLnZhbHVlID09PSAnZHJpdmVyJykge1xuICAgICAgLy8gQSBxdW90ZWQga2V5OiB0aGUgc3Vycm91bmRpbmcgY29kZSB0b2tlbnMgbXVzdCBmb3JtIGEgcHJvcGVydHkgcG9zaXRpb24gKGB7YC9gLGAgYmVmb3JlLFxuICAgICAgLy8gYDpgIGFmdGVyKS5cbiAgICAgIGNvbnN0IHByZXZpb3VzVG9rZW4gPSB0b2tlbnNbaW5kZXggLSAxXTtcbiAgICAgIGNvbnN0IG5leHRUb2tlbiA9IHRva2Vuc1tpbmRleCArIDFdO1xuICAgICAgaWYgKFxuICAgICAgICBwcmV2aW91c1Rva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL1t7LChdXFxzKiQvLnRlc3QocHJldmlvdXNUb2tlbi52YWx1ZSkgJiZcbiAgICAgICAgbmV4dFRva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL15cXHMqOlxccyokLy50ZXN0KG5leHRUb2tlbi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBrZXkgPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgdmFsdWVUb2tlbkluZGV4ID0gaW5kZXggKyAyO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwgdmFsdWVUb2tlbkluZGV4ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdmFsdWVUb2tlbiA9IHRva2Vuc1t2YWx1ZVRva2VuSW5kZXhdO1xuICAgIGlmICh2YWx1ZVRva2VuPy50eXBlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgaWYgKGtleSA9PT0gJ2RpYWxlY3QnICYmIHZhbHVlVG9rZW4udmFsdWUgPT09ICdzcWxpdGUnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoa2V5ID09PSAnZHJpdmVyJyAmJiAodmFsdWVUb2tlbi52YWx1ZSA9PT0gJ2QxLWh0dHAnIHx8IHZhbHVlVG9rZW4udmFsdWUgPT09ICdkdXJhYmxlLXNxbGl0ZScpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXQgaW50byBhbHRlcm5hdGluZyBjb2RlIGFuZCBzdHJpbmctbGl0ZXJhbC1jb250ZW50IHRva2VucyAocXVvdGVzIGV4Y2x1ZGVkKS4gVGhlIGlucHV0IGlzXG4gKiBhbHJlYWR5IGNvbW1lbnQtZnJlZSDigJQgdXNlc0RyaXp6bGVLaXRGb3JEMSBydW5zIHN0cmlwSnNDb21tZW50cyBiZWZvcmUgYW55IHNjYW5uaW5nIOKAlCBzb1xuICogY29tbWVudCBkZWxpbWl0ZXJzIG5lZWQgbm8gaGFuZGxpbmcgaGVyZSAoYSBjb21tZW50ZWQtb3V0IGAvLyBkaWFsZWN0OiAnc3FsaXRlJ2AgY2FuIG5ldmVyXG4gKiByZWFjaCB0aGlzIHRva2VuaXplcikuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplU3RyaW5ncyhjb250ZW50OiBzdHJpbmcpOiB7IHR5cGU6ICdjb2RlJyB8ICdzdHJpbmcnOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IHRva2VuczogeyB0eXBlOiAnY29kZScgfCAnc3RyaW5nJzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgbGV0IGNvZGUgPSAnJztcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ2NvZGUnLCB2YWx1ZTogY29kZSB9KTtcbiAgICAgIGNvZGUgPSAnJztcbiAgICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSBjaGFyKSB7XG4gICAgICAgIGlmIChjb250ZW50W2luZGV4XSA9PT0gJ1xcXFwnKSBpbmRleCsrO1xuICAgICAgICB2YWx1ZSArPSBjb250ZW50W2luZGV4XSA/PyAnJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ3N0cmluZycsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvZGUgKz0gY2hhcjtcbiAgfVxuICB0b2tlbnMucHVzaCh7IHR5cGU6ICdjb2RlJywgdmFsdWU6IGNvZGUgfSk7XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBUaGUgZmlyc3QgYHsgLi4uIH1gIHNwYW4gKHN0cmluZy1hd2FyZSBicmFjZSBtYXRjaGluZyksIG9yIHVuZGVmaW5lZCB3aGVuIG5vbmUgZXhpc3RzLiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhcnRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZigneycpO1xuICBpZiAoc3RhcnRJbmRleCA9PT0gLTEpIHJldHVybjtcblxuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykgaW5kZXgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSBzdHJpbmdEZWxpbWl0ZXIgPSBjaGFyO1xuICAgIGVsc2UgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICBlbHNlIGlmIChjaGFyID09PSAnfScgJiYgLS1kZXB0aCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQuc2xpY2Uoc3RhcnRJbmRleCwgaW5kZXggKyAxKTtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogUmVtb3ZlIGJsb2NrIGFuZCBsaW5lIGNvbW1lbnRzIHNvIGNvbW1lbnRlZC1vdXQgbWFya2VycyAoZS5nLiBgLy8gZGlhbGVjdDogJ3NxbGl0ZSdgIGluIGFcbiAqIFBvc3RncmVTUUwgY29uZmlnKSBjYW5ub3QgbWlzY2xhc3NpZnkgdGhlIGNvbmZpZy4gVGhlIHNjYW5uZXIgdHJhY2tzIHN0cmluZyBzdGF0ZSwgc28gYC8vYFxuICogaW5zaWRlIHN0cmluZyBsaXRlcmFscyAoVVJMcyBzdWNoIGFzIGBodHRwczovLy4uLmAgaW4gY29ubmVjdGlvbiBzdHJpbmdzKSBzdXJ2aXZlcyB3aGlsZVxuICogY29tbWVudHMgZGlyZWN0bHkgYWZ0ZXIgYSBzdHJpbmcgbGl0ZXJhbCBhcmUgc3RpbGwgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBKc0NvbW1lbnRzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IHN0cmluZ0RlbGltaXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGNvbnN0IG5leHRDaGFyID0gY29udGVudFtpbmRleCArIDFdO1xuICAgIGlmIChzdHJpbmdEZWxpbWl0ZXIpIHtcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXIgKyAobmV4dENoYXIgPz8gJycpO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkge1xuICAgICAgICBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnLycpIHtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIHJlc3VsdCArPSAnXFxuJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnKicpIHtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb250ZW50Lmxlbmd0aCAmJiAhKGNvbnRlbnRbaW5kZXhdID09PSAnKicgJiYgY29udGVudFtpbmRleCArIDFdID09PSAnLycpKSBpbmRleCsrO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZERyaXp6bGVDb25maWcocHJvamVjdDogUHJvamVjdCk6IHsgZGlyUGF0aDogc3RyaW5nOyBmaWxlTmFtZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gWydkcml6emxlLmNvbmZpZy50cycsICdkcml6emxlLmNvbmZpZy5tdHMnLCAnZHJpenpsZS5jb25maWcuanMnLCAnZHJpenpsZS5jb25maWcubWpzJ107XG4gIGZvciAoY29uc3QgZGlyUGF0aCBvZiBbcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnJvb3REaXJQYXRoXSkge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gY2FuZGlkYXRlcy5maW5kKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gICAgaWYgKGZpbGVOYW1lKSByZXR1cm4geyBkaXJQYXRoLCBmaWxlTmFtZSB9O1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG4gIHJldHVybiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoYWJzb2x1dGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtZiBcIiR7ZGJQYXRofVwiIFwiJHtkYlBhdGh9LXdhbFwiIFwiJHtkYlBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkZhbWlseUNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdiIGRiICR7Y29tbWFuZE5hbWV9IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuYCk7XG4gIH1cbiAgcmV0dXJuIGRiUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdCwgY29tbWFuZE5hbWUpO1xuICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKGRiUGF0aCkgPyBkYlBhdGggOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYlBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWdQYXRoKSByZXR1cm4gYC1jb25maWcgXCIke2NvbmZpZ1BhdGh9XCJgO1xuXG4gIGNvbnN0IGxvY2FsQ29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsQ29uZmlnUGF0aCkpIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG4gIGlmIChmcy5leGlzdHNTeW5jKERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCkpIHJldHVybiBgLWNvbmZpZyAke0RFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSH1gO1xuICByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xufVxuXG5leHBvcnQgY29uc3QgZHJpenpsZVNjcmlwdHMgPSBuZXcgRHJpenpsZVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi93cmFuZ2xlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JhbmdsZXJEMURhdGFiYXNlIHtcbiAgYmluZGluZz86IHN0cmluZztcbiAgZGF0YWJhc2VfbmFtZT86IHN0cmluZztcbiAgZGF0YWJhc2VfaWQ/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfZGlyPzogc3RyaW5nO1xuICBtaWdyYXRpb25zX3BhdHRlcm4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgRDEgYmluZGluZyB1c2VzIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIHRoYXQgYHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHlgXG4gKiB3b3VsZCBhY3R1YWxseSBkaXNjb3ZlcjogYW4gZXhwbGljaXQgYG1pZ3JhdGlvbnNfcGF0dGVybmAgb3B0cyBpbiwgb3RoZXJ3aXNlIHRoZSBtaWdyYXRpb25zXG4gKiBkaXJlY3RvcnkgbXVzdCBjb250YWluIGZsYXQgYCouc3FsYCBmaWxlcyAod3JhbmdsZXIncyBkZWZhdWx0IHBhdHRlcm4pLiBBIGRyaXp6bGUta2l0IGBvdXRgXG4gKiBkaXJlY3Rvcnkgd2l0aCBuZXN0ZWQgYDxuYW1lPi9taWdyYXRpb24uc3FsYCBmaWxlcyBhbmQgbm8gcGF0dGVybiB3b3VsZCBtYXRjaCBub3RoaW5nIGFuZFxuICogc2lsZW50bHkgYXBwbHkgemVybyBtaWdyYXRpb25zLCBzbyBpdCBtdXN0IGZhbGwgdGhyb3VnaCB0byB0aGUgZHJpenpsZS1raXQgbWVjaGFuaXNtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlc1dyYW5nbGVyTmF0aXZlTWlncmF0aW9ucyhwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sIGRhdGFiYXNlOiBXcmFuZ2xlckQxRGF0YWJhc2UpOiBib29sZWFuIHtcbiAgLy8gQW4gZXhwbGljaXQgcGF0dGVybiBvcHRzIGludG8gdGhlIHdyYW5nbGVyLW5hdGl2ZSBtZWNoYW5pc20gZXZlbiBiZWZvcmUgdGhlIGRpcmVjdG9yeVxuICAvLyBleGlzdHM7IHdyYW5nbGVyIHRoZW4gZmFpbHMgc2FmZWx5IHdpdGggXCJObyBtaWdyYXRpb25zIGZvbGRlciBmb3VuZFwiIGluc3RlYWQgb2Ygd2JcbiAgLy8gc2lsZW50bHkgc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IG1pZ3JhdGlvbiBlbmdpbmUuXG4gIGlmIChkYXRhYmFzZS5taWdyYXRpb25zX3BhdHRlcm4pIHJldHVybiB0cnVlO1xuICBjb25zdCBtaWdyYXRpb25zRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRhdGFiYXNlLm1pZ3JhdGlvbnNfZGlyID8/ICdtaWdyYXRpb25zJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhtaWdyYXRpb25zRGlyUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGZzLnJlYWRkaXJTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKS5zb21lKChmaWxlTmFtZSkgPT4gZmlsZU5hbWUuZW5kc1dpdGgoJy5zcWwnKSk7XG59XG5cbmNvbnN0IE5BTUVfS0VZRURfQklORElOR19QQVJFTlRTID0gbmV3IFNldChbJ2JpbmRpbmdzJywgJ3NlbmRfZW1haWwnLCAncmF0ZWxpbWl0cyddKTtcbmNvbnN0IFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMgPSBuZXcgU2V0KFsnd2FzbV9tb2R1bGVzJywgJ3RleHRfYmxvYnMnLCAnZGF0YV9ibG9icyddKTtcblxuLyoqXG4gKiBDb2xsZWN0IGV2ZXJ5IGJpbmRpbmcgbmFtZSBkZWNsYXJlZCBpbiB0aGUgKGVudmlyb25tZW50LXJlc29sdmVkKSBjb25maWcgc3VidHJlZTogYGJpbmRpbmdgXG4gKiBwcm9wZXJ0aWVzIGFueXdoZXJlIChEMSwgS1YsIFIyLCBzZXJ2aWNlcywgYXNzZXRzLCBxdWV1ZXMsIGV0Yy4pLCB0aGUgYG5hbWVgLWtleWVkIGJpbmRpbmdzXG4gKiAoYGR1cmFibGVfb2JqZWN0cy5iaW5kaW5nc2AsIGBsb2dmd2RyLmJpbmRpbmdzYCwgYHNlbmRfZW1haWxgLCBgcmF0ZWxpbWl0c2ApLCBhbmQgdGhlXG4gKiByZWNvcmQta2V5ZWQgbGVnYWN5IG1vZHVsZSBiaW5kaW5ncyAoYHdhc21fbW9kdWxlc2AsIGB0ZXh0X2Jsb2JzYCwgYGRhdGFfYmxvYnNgKS4gQSBzZWNyZXRcbiAqIHNoYXJpbmcgYSBiaW5kaW5nJ3MgbmFtZSB3b3VsZCBzaWxlbnRseSByZXBsYWNlIHRoYXQgYmluZGluZyB3aXRoIGEgcGxhaW4gc3RyaW5nIG9uIGRlcGxveS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RCaW5kaW5nTmFtZXModmFsdWU6IHVua25vd24sIG5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCksIHBhcmVudEtleSA9ICcnKTogU2V0PHN0cmluZz4ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIGNvbGxlY3RCaW5kaW5nTmFtZXMoaXRlbSwgbmFtZXMsIHBhcmVudEtleSk7XG4gICAgcmV0dXJuIG5hbWVzO1xuICB9XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIG5hbWVzO1xuICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICBpZiAoa2V5ID09PSAnYmluZGluZycgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25hbWUnICYmIHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgJiYgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMuaGFzKHBhcmVudEtleSkpIHtcbiAgICAgIG5hbWVzLmFkZChjaGlsZCk7XG4gICAgfSBlbHNlIGlmIChSRUNPUkRfS0VZRURfQklORElOR19LRVlTLmhhcyhrZXkpICYmIGNoaWxkICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmdOYW1lIG9mIE9iamVjdC5rZXlzKGNoaWxkKSkgbmFtZXMuYWRkKGJpbmRpbmdOYW1lKTtcbiAgICB9IGVsc2UgaWYgKGtleSAhPT0gJ2VudicgJiYga2V5ICE9PSAndmFycycgJiYga2V5ICE9PSAnbWV0YWRhdGEnICYmIGtleSAhPT0gJ29wdGlvbnMnKSB7XG4gICAgICAvLyBOZXN0ZWQgYGVudmAgc3VidHJlZXMgYmVsb25nIHRvIG90aGVyIGVudmlyb25tZW50czsgYHZhcnNgIHZhbHVlcywgYHVuc2FmZS5tZXRhZGF0YWAsXG4gICAgICAvLyBhbmQgYHVuc2FmZS5iaW5kaW5nc1tdLmRldi5vcHRpb25zYCBhcmUgYXJiaXRyYXJ5IEpTT04gd2hvc2UgcHJvcGVydGllcyAoZS5nLiBhXG4gICAgICAvLyBcImJpbmRpbmdcIiBmaWVsZCkgYXJlIGRhdGEsIG5vdCBXb3JrZXIgYmluZGluZ3MuXG4gICAgICBjb2xsZWN0QmluZGluZ05hbWVzKGNoaWxkLCBuYW1lcywga2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkV3JhbmdsZXJDb25maWcge1xuICAvKiogVGhlIFdvcmtlciBuYW1lIGZvciB0aGUgZGVwbG95IGVudmlyb25tZW50ICh3cmFuZ2xlciBhcHBlbmRzIGAtPGVudj5gIHdoZW4gdGhlIGVudiBzZWN0aW9uIGhhcyBubyBvd24gbmFtZSkuICovXG4gIHdvcmtlck5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRJZD86IHN0cmluZztcbiAgdmFyS2V5czogc3RyaW5nW107XG4gIC8qKiBUaGUgZW52aXJvbm1lbnQncyBgdmFyc2AgdmFsdWVzIChuZWVkZWQgZm9yIENsb3VkZmxhcmUncyBjb21iaW5lZCBjb3VudC9zaXplIGxpbWl0cykuICovXG4gIHZhcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU2VjcmV0cyBkZWNsYXJlZCBhcyByZXF1aXJlZCB2aWEgd3JhbmdsZXIncyBgc2VjcmV0cy5yZXF1aXJlZGAgKHZhbGlkYXRlZCBhdCBkZXBsb3kgdGltZSkuICovXG4gIHJlcXVpcmVkU2VjcmV0TmFtZXM6IHN0cmluZ1tdO1xuICAvKiogTmFtZXMgb2YgYWxsIG5vbi12YXIgYmluZGluZ3MgKEQxLCBLViwgUjIsIER1cmFibGUgT2JqZWN0cywgc2VuZF9lbWFpbCwgc2VydmljZXMsIC4uLikuICovXG4gIGJpbmRpbmdOYW1lczogc3RyaW5nW107XG4gIGQxRGF0YWJhc2VzOiBXcmFuZ2xlckQxRGF0YWJhc2VbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudmlyb25tZW50IGNvbWVzIGZyb20gYW4gYGVudi48bmFtZT5gIHNlY3Rpb24gKHRoZW4gd3JhbmdsZXIgY29tbWFuZHMgbmVlZFxuICAgKiBgLS1lbnYgPG5hbWU+YCAvIGBDTE9VREZMQVJFX0VOVj08bmFtZT5gKS4gYHByb2R1Y3Rpb25gIG1heSBiZSBlaXRoZXIgdGhlIHRvcCBsZXZlbCBvciBhXG4gICAqIG5hbWVkIGBlbnYucHJvZHVjdGlvbmAgc2VjdGlvbjsgdGhlIHNlY3Rpb24gd2lucyB3aGVuIGl0IGV4aXN0cy5cbiAgICovXG4gIHVzZXNFbnZTZWN0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUmF3V3JhbmdsZXJDb25maWcge1xuICBuYW1lPzogc3RyaW5nO1xuICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICB2YXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGQxX2RhdGFiYXNlcz86IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICBhc3NldHM/OiB1bmtub3duO1xuICBsb2dmd2RyPzogdW5rbm93bjtcbiAgd2FzbV9tb2R1bGVzPzogdW5rbm93bjtcbiAgdGV4dF9ibG9icz86IHVua25vd247XG4gIGRhdGFfYmxvYnM/OiB1bmtub3duO1xuICBzaXRlPzogdW5rbm93bjtcbiAgc2VjcmV0cz86IHsgcmVxdWlyZWQ/OiBzdHJpbmdbXSB9O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBSYXdXcmFuZ2xlckNvbmZpZz47XG59XG5cbi8vIFdvcmtlcnMgU2l0ZXMgaW1wbGljaXRseSBiaW5kcyBpdHMgS1YgbmFtZXNwYWNlIGFzIF9fU1RBVElDX0NPTlRFTlQuXG5mdW5jdGlvbiBzaXRlQmluZGluZ05hbWVzKGNvbmZpZzogUmF3V3JhbmdsZXJDb25maWcsIGVudkNvbmZpZz86IFJhd1dyYW5nbGVyQ29uZmlnKTogc3RyaW5nW10ge1xuICByZXR1cm4gKGVudkNvbmZpZz8uc2l0ZSA/PyBjb25maWcuc2l0ZSkgPyBbJ19fU1RBVElDX0NPTlRFTlQnXSA6IFtdO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHdyYW5nbGVyIGNvbmZpZyB2YWx1ZXMgbmVlZGVkIGZvciBkZXBsb3lpbmcgdG8gdGhlIGdpdmVuIGVudmlyb25tZW50LlxuICogRm9sbG93cyB3cmFuZ2xlcidzIGluaGVyaXRhbmNlIHJ1bGVzOiBgYWNjb3VudF9pZGAgaXMgaW5oZXJpdGVkIGJ5IG5hbWVkIGVudmlyb25tZW50cyxcbiAqIHdoaWxlIGB2YXJzYCBhbmQgYGQxX2RhdGFiYXNlc2AgYXJlIG5vdCBhbmQgbXVzdCBiZSByZWRlY2xhcmVkIHBlciBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXcmFuZ2xlckNvbmZpZ0ZvckVudihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+LFxuICBlbnZOYW1lOiBzdHJpbmdcbik6IFJlc29sdmVkV3JhbmdsZXJDb25maWcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFjb25maWdQYXRoKSByZXR1cm47XG4gIGlmIChwYXRoLmV4dG5hbWUoY29uZmlnUGF0aCkgPT09ICcudG9tbCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3diIGRlcGxveSBzdXBwb3J0cyB3cmFuZ2xlci5qc29uYy93cmFuZ2xlci5qc29uIGNvbmZpZ3Mgb25seTsgbWlncmF0ZSB3cmFuZ2xlci50b21sIGZpcnN0LicpO1xuICB9XG5cbiAgLy8ganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCB3b3VsZCByZXR1cm4gYSBwYXJ0aWFsIG9iamVjdCBmb3IgbWFsZm9ybWVkIGlucHV0LFxuICAvLyB3aGljaCBjb3VsZCBtaWdyYXRlIGEgcmVtb3RlIGRhdGFiYXNlIGZyb20gYSBoYWxmLXJlYWQgY29uZmlnOyByZWplY3QgYW55IHBhcnNlIGVycm9yLlxuICBjb25zdCBwYXJzZUVycm9yczogUGFyc2VFcnJvcltdID0gW107XG4gIGNvbnN0IGNvbmZpZyA9IHBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLCBwYXJzZUVycm9ycywge1xuICAgIGFsbG93VHJhaWxpbmdDb21tYTogdHJ1ZSxcbiAgfSkgYXMgUmF3V3JhbmdsZXJDb25maWcgfCB1bmRlZmluZWQ7XG4gIGlmIChwYXJzZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgJHtjb25maWdQYXRofTogJHtwYXJzZUVycm9ycy5sZW5ndGh9IEpTT05DIHN5bnRheCBlcnJvcihzKS5gKTtcbiAgfVxuICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuXG4gIGNvbnN0IGVudkNvbmZpZyA9IGNvbmZpZy5lbnY/LltlbnZOYW1lXTtcbiAgaWYgKCFlbnZDb25maWcgJiYgZW52TmFtZSAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgd3JhbmdsZXIgY29uZmlnIGhhcyBubyBcImVudlwiOiB7IFwiJHtlbnZOYW1lfVwiOiAuLi4gfSBzZWN0aW9uLmApO1xuICB9XG4gIHJldHVybiBlbnZDb25maWdcbiAgICA/IHtcbiAgICAgICAgd29ya2VyTmFtZTogZW52Q29uZmlnLm5hbWUgPz8gKGNvbmZpZy5uYW1lID8gYCR7Y29uZmlnLm5hbWV9LSR7ZW52TmFtZX1gIDogdW5kZWZpbmVkKSxcbiAgICAgICAgYWNjb3VudElkOiBlbnZDb25maWcuYWNjb3VudF9pZCA/PyBjb25maWcuYWNjb3VudF9pZCxcbiAgICAgICAgdmFyS2V5czogT2JqZWN0LmtleXMoZW52Q29uZmlnLnZhcnMgPz8ge30pLFxuICAgICAgICB2YXJzOiBlbnZDb25maWcudmFycyA/PyB7fSxcbiAgICAgICAgLy8gTW9zdCBiaW5kaW5ncyBhcmUgbm9uLWluaGVyaXRhYmxlIGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LCBzbyBvbmx5IHRoZVxuICAgICAgICAvLyBlbnZpcm9ubWVudCdzIG93biBuYW1lcyBjb3VudCDigJQgcGx1cyB0aGUgZ2VudWluZWx5IGluaGVyaXRlZCBzaGFwZXMgKGFzc2V0cywgbG9nZndkciksXG4gICAgICAgIC8vIHdoaWNoIHdyYW5nbGVyIHJlc29sdmVzIGFzIHdob2xlIGZpZWxkczogdGhlIGVudmlyb25tZW50J3Mgb3duIGZpZWxkIG92ZXJyaWRlcyB0aGVcbiAgICAgICAgLy8gdG9wIGxldmVsIGVudGlyZWx5LCBzbyBvbmx5IHRoZSBlZmZlY3RpdmUgdmFsdWUncyBuYW1lcyBjb3VudC5cbiAgICAgICAgYmluZGluZ05hbWVzOiBbXG4gICAgICAgICAgLi4uY29sbGVjdEJpbmRpbmdOYW1lcyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXNzZXRzOiBlbnZDb25maWcuYXNzZXRzID8/IGNvbmZpZy5hc3NldHMsXG4gICAgICAgICAgICAgIGxvZ2Z3ZHI6IGVudkNvbmZpZy5sb2dmd2RyID8/IGNvbmZpZy5sb2dmd2RyLFxuICAgICAgICAgICAgICB3YXNtX21vZHVsZXM6IGVudkNvbmZpZy53YXNtX21vZHVsZXMgPz8gY29uZmlnLndhc21fbW9kdWxlcyxcbiAgICAgICAgICAgICAgdGV4dF9ibG9iczogZW52Q29uZmlnLnRleHRfYmxvYnMgPz8gY29uZmlnLnRleHRfYmxvYnMsXG4gICAgICAgICAgICAgIGRhdGFfYmxvYnM6IGVudkNvbmZpZy5kYXRhX2Jsb2JzID8/IGNvbmZpZy5kYXRhX2Jsb2JzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoZW52Q29uZmlnKVxuICAgICAgICAgICksXG4gICAgICAgICAgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcsIGVudkNvbmZpZyksXG4gICAgICAgIF0sXG4gICAgICAgIGQxRGF0YWJhc2VzOiBlbnZDb25maWcuZDFfZGF0YWJhc2VzID8/IFtdLFxuICAgICAgICAvLyBgc2VjcmV0c2AgaXMgbm9uLWluaGVyaXRhYmxlOiBhIHRvcC1sZXZlbCByZXF1aXJlbWVudCBtdXN0IG5vdCBmb3JjZSAob3IgdXBsb2FkKVxuICAgICAgICAvLyBhIHNlY3JldCBpbnRvIGEgbmFtZWQgZW52aXJvbm1lbnQuXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGVudkNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IHRydWUsXG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIHdvcmtlck5hbWU6IGNvbmZpZy5uYW1lLFxuICAgICAgICBhY2NvdW50SWQ6IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhjb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICBiaW5kaW5nTmFtZXM6IFsuLi5jb2xsZWN0QmluZGluZ05hbWVzKGNvbmZpZyksIC4uLnNpdGVCaW5kaW5nTmFtZXMoY29uZmlnKV0sXG4gICAgICAgIGQxRGF0YWJhc2VzOiBjb25maWcuZDFfZGF0YWJhc2VzID8/IFtdLFxuICAgICAgICByZXF1aXJlZFNlY3JldE5hbWVzOiBjb25maWcuc2VjcmV0cz8ucmVxdWlyZWQgPz8gW10sXG4gICAgICAgIHVzZXNFbnZTZWN0aW9uOiBmYWxzZSxcbiAgICAgIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VEb3RlbnYgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBDbG91ZGZsYXJlIFdvcmtlcnMgZG9uJ3Qgc2VlIHRoZSBwcm9jZXNzIGVudmlyb25tZW50OyB3cmFuZ2xlciBkZXYgcmVhZHMgdmFycyBmcm9tIGEgLmRldi52YXJzXG4vLyBmaWxlIG5leHQgdG8gaXRzIGNvbmZpZyBmaWxlIGluc3RlYWQuIFRoaXMgY29tbWFuZCBicmlkZ2VzIHdiLW1hbmFnZWQgLmVudiBmaWxlcyB0byB0aGF0IGZpbGUuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIEdlbkRldlZhcnNDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgJiB7IHBhdGg/OiBzdHJpbmcgfT47XG5cbmV4cG9ydCBjb25zdCBnZW5EZXZWYXJzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnZ2VuLWRldi12YXJzIFtwYXRoXScsXG4gIGRlc2NyaWJlOlxuICAgICdHZW5lcmF0ZSBhIC5kZXYudmFycyBmaWxlIGZvciBgd3JhbmdsZXIgZGV2YCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbG9hZGVkIGZyb20gLmVudiBmaWxlcyAocGx1cyBXQl9FTlYgYW5kIE5FWFRfUFVCTElDX1dCX0VOVikuJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PlxuICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGgnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSBnZW5lcmF0ZWQgLmRldi52YXJzIGZpbGUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJy5kZXYudmFycycsXG4gICAgfSkgYXMgdW5rbm93biBhcyBBcmd2PEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogR2VuRGV2VmFyc0NvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0cmljdCB0byB0aGUgdmFyaWFibGVzIGxvYWRlZCBmcm9tIC5lbnYgZmlsZXMgKHdiJ3MgZW52aXJvbm1lbnQgY29udHJhY3QpIHNvIHRoYXRcbiAgICAvLyB1bnJlbGF0ZWQgcHJvY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbmV2ZXIgbGVhayBpbnRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4gSWdub3JlXG4gICAgLy8gcHJvY2Vzcy5lbnYgYmVjYXVzZSB0aGUgcGFyZW50IHdiIHByb2Nlc3MgaW5qZWN0cyB0aGUgLmVudiB2YWx1ZXMgaW50byBpdCwgd2hpY2ggd291bGRcbiAgICAvLyBvdGhlcndpc2Ugc3VwcHJlc3MgbG9hZGluZyB0aGVtIGhlcmUuXG4gICAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIHByb2plY3QuZGlyUGF0aCwgeyBpZ25vcmVQcm9jZXNzRW52OiB0cnVlIH0pO1xuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgd2luIG92ZXIgZG90ZW52IHZhbHVlcyBmb3IgZmlsZS1kZWZpbmVkXG4gICAgLy8ga2V5cyAocHJvamVjdC5lbnYgYXBwbGllcyB0aGF0IHByZWNlZGVuY2UpLCBvciBgQVVUSF9TRUNSRVQ9Li4uIHdiIHN0YXJ0YCB3b3VsZCBzZXJ2ZVxuICAgIC8vIHRoZSBzdGFsZSBmaWxlIHZhbHVlLiBBbiBleHBvcnQgdGhhdCBlbXB0aWVzIGEgbm9uLWVtcHR5IGZpbGUgdmFsdWUgaXMgZGVsaWJlcmF0ZSBhbmRcbiAgICAvLyBtdXN0IHN1cnZpdmUgdGhlIGVtcHR5LXZhbHVlIGZpbHRlciBiZWxvdyAodW5saWtlIGBLRVk9YCBwbGFjZWhvbGRlcnMgaW4gLmVudiBmaWxlcyxcbiAgICAvLyB3aGljaCBzdGF5IG9taXR0ZWQgc28gdGhleSBjYW5ub3Qgb3ZlcnJpZGUgd3JhbmdsZXIgYHZhcnNgIHdpdGggZW1wdHkgc3RyaW5ncykuXG4gICAgY29uc3QgZXhwbGljaXRseUVtcHRpZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSA9PT0gJycgJiYgZW52VmFyc1trZXldICE9PSAnJykgZXhwbGljaXRseUVtcHRpZWRLZXlzLmFkZChrZXkpO1xuICAgICAgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuICAgIC8vIFN1cHBsZW1lbnQgd2l0aCBwcm9jZXNzIGVudmlyb25tZW50IHZhbHVlcyBmb3IgdGhlIGtleXMgbmFtZWQgaW4gLmVudi5leGFtcGxlOiBDSSBvZnRlblxuICAgIC8vIHByb3ZpZGVzIHRoZW0gYXMgd29ya2Zsb3cgZW52IGluc3RlYWQgb2YgLmVudiBmaWxlcyAoc3RpbGwgYW4gYWxsb3dsaXN0LCBzbyB1bnJlbGF0ZWRcbiAgICAvLyBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBjYW5ub3QgbGVhaykuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgWy4uLnJlYWRFbnZFeGFtcGxlS2V5cyhwcm9qZWN0KSwgJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVudlZhcnNba2V5XSB8fCBlZmZlY3RpdmVWYWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gPT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVWYWx1ZSA9PT0gJycpIGV4cGxpY2l0bHlFbXB0aWVkS2V5cy5hZGQoa2V5KTtcbiAgICAgIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXMoZW52VmFycylcbiAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUgIT09ICcnIHx8IGV4cGxpY2l0bHlFbXB0aWVkS2V5cy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3F1b3RlRG90ZW52VmFsdWUoa2V5LCB2YWx1ZSl9YCk7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGFyZ3YucGF0aCA/PyAnLmRldi52YXJzJyk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgV291bGQgZ2VuZXJhdGUgJHtvdXRwdXRQYXRofSB3aXRoICR7bGluZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuYCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZzLm1rZGlyU3luYyhwYXRoLmRpcm5hbWUob3V0cHV0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgbGluZXMuam9pbignXFxuJykgKyAnXFxuJyk7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBHZW5lcmF0ZWQgJHtvdXRwdXRQYXRofSB3aXRoICR7bGluZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuYCkpO1xuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZFeGFtcGxlS2V5cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBsZXQgZW52RXhhbXBsZVBhdGg6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBlbnZFeGFtcGxlUGF0aCA9IHByb2plY3QuZmluZEZpbGUoJy5lbnYuZXhhbXBsZScpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gZG90ZW52J3Mgb3duIHBhcnNlciBjb3ZlcnMgYGV4cG9ydCBLRVk9YCBwcmVmaXhlcyBhbmQgd2hpdGVzcGFjZSBhcm91bmQgYD1gLFxuICAvLyB3aGljaCBhIGxpbmUgcmVnZXggd291bGQgc2lsZW50bHkgbWlzcy5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcnNlRG90ZW52KGZzLnJlYWRGaWxlU3luYyhlbnZFeGFtcGxlUGF0aCwgJ3V0ZjgnKSkpO1xufVxuXG4vKipcbiAqIFF1b3RlIGEgdmFsdWUgZm9yIGRvdGVudiAod2hpY2ggd3JhbmdsZXIgdXNlcyBmb3IgLmRldi52YXJzKS4gRXZlcnkgY2FuZGlkYXRlIHJlcHJlc2VudGF0aW9uXG4gKiBpcyB2ZXJpZmllZCBieSBhY3R1YWxseSBwYXJzaW5nIGl0IGJhY2sgKG91ciBkb3RlbnYgcGFyc2VyIG1hdGNoZXMgd3JhbmdsZXIncyBidW5kbGVkIGRvdGVudlxuICogMTYgZm9yIHRoZXNlIGNvbnN0cnVjdHMpLCBzbyBhIHZhbHVlIGlzIGVpdGhlciBzZXJpYWxpemVkIGxvc3NsZXNzbHkgb3IgcmVqZWN0ZWQg4oCUIG5ldmVyXG4gKiBzaWxlbnRseSBjb3JydXB0ZWQuIENhbmRpZGF0ZXM6IHNpbmdsZSBxdW90ZXMgKGxpdGVyYWwgc3BhbjsgY2xvc2VkIGVhcmx5IGJ5IGFuIGFwb3N0cm9waGUpLFxuICogYmFja3RpY2tzIChlcXVhbGx5IGxpdGVyYWwpLCB0aGVuIGRvdWJsZSBxdW90ZXMgd2l0aCBlc2NhcGVkIG5ld2xpbmVzL0NScyAoZG90ZW52IGRvZXMgbm90XG4gKiB1bmVzY2FwZSBpbm5lciBcXFwiIOKAlCBhIGAjYCBhZnRlciBhbiBlbWJlZGRlZCBxdW90ZSBzdGFydHMgYSBjb21tZW50LCB3aGljaCB0aGUgcm91bmQtdHJpcFxuICogY2hlY2sgY2F0Y2hlcyBhbmQgcmVqZWN0cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZURvdGVudlZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZG91YmxlUXVvdGVkQm9keSA9IHZhbHVlLnJlcGxhY2VBbGwoJ1xcbicsIFN0cmluZy5yYXdgXFxuYCkucmVwbGFjZUFsbCgnXFxyJywgU3RyaW5nLnJhd2BcXHJgKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtgJyR7dmFsdWV9J2AsIGBcXGAke3ZhbHVlfVxcYGAsIGBcIiR7ZG91YmxlUXVvdGVkQm9keX1cImBdO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHBhcnNlRG90ZW52KGAke2tleX09JHtjYW5kaWRhdGV9YClba2V5XSA9PT0gdmFsdWUpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdmFsdWUgb2YgJHtrZXl9IGNhbm5vdCBiZSBsb3NzbGVzc2x5IHNlcmlhbGl6ZWQgaW50byAuZGV2LnZhcnM7IHNpbXBsaWZ5IGl0cyBxdW90aW5nLmApO1xufVxuIiwiaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQsIHVzZXNEcml6emxlS2l0Rm9yRDEgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCwgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkV3JhbmdsZXJDb25maWcsIFdyYW5nbGVyRDFEYXRhYmFzZSB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlc29sdmVXcmFuZ2xlckNvbmZpZ0ZvckVudiwgdXNlc1dyYW5nbGVyTmF0aXZlTWlncmF0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyQ29uZmlnLmpzJztcblxuaW1wb3J0IHsgcmVhZEVudkV4YW1wbGVLZXlzIH0gZnJvbSAnLi9nZW5EZXZWYXJzLmpzJztcblxuLyoqXG4gKiBLZXlzIHRoYXQgZHJpdmUgdGhlIGRlcGxveSBpdHNlbGYgKG9yIGFyZSBtZWFuaW5nZnVsIG9ubHkgbG9jYWxseSkgYW5kIHRodXMgbXVzdCBuZXZlciBiZVxuICogcHVzaGVkIHRvIHRoZSBXb3JrZXIgYXMgc2VjcmV0cy4gYFdCX0VOVmAgLyBgTkVYVF9QVUJMSUNfV0JfRU5WYCBiZWxvbmcgaW4gd3JhbmdsZXIgYHZhcnNgLlxuICovXG5jb25zdCBOT05fU0VDUkVUX0tFWVMgPSBuZXcgU2V0KFtcbiAgJ0NJJyxcbiAgLy8gV3JhbmdsZXIgc3lzdGVtL2F1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcyAoaHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3dvcmtlcnMvd3JhbmdsZXIvc3lzdGVtLWVudmlyb25tZW50LXZhcmlhYmxlcy8pLFxuICAvLyBpbmNsdWRpbmcgbGVnYWN5IGFsaWFzZXM7IGFwcC1zcGVjaWZpYyBuYW1lcyBzdWNoIGFzIENMT1VERkxBUkVfUjJfQUNDRVNTX0tFWV9JRCBzdGF5IGVsaWdpYmxlLlxuICAnQ0ZfQUNDT1VOVF9JRCcsXG4gICdDRl9BUElfQkFTRV9VUkwnLFxuICAnQ0ZfQVBJX0VNQUlMJyxcbiAgJ0NGX0FQSV9LRVknLFxuICAnQ0ZfQVBJX1RPS0VOJyxcbiAgJ0NGX0VNQUlMJyxcbiAgJ0NMT1VERkxBUkVfQUNDRVNTX0NMSUVOVF9JRCcsXG4gICdDTE9VREZMQVJFX0FDQ0VTU19DTElFTlRfU0VDUkVUJyxcbiAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCcsXG4gICdDTE9VREZMQVJFX0FQSV9CQVNFX1VSTCcsXG4gICdDTE9VREZMQVJFX0FQSV9LRVknLFxuICAnQ0xPVURGTEFSRV9BUElfVE9LRU4nLFxuICAnQ0xPVURGTEFSRV9BVVRIX1VTRV9LRVlSSU5HJyxcbiAgJ0NMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQnLFxuICAnQ0xPVURGTEFSRV9FTUFJTCcsXG4gICdDTE9VREZMQVJFX0VOVicsXG4gICdDTE9VREZMQVJFX0lOQ0xVREVfUFJPQ0VTU19FTlYnLFxuICAnQ0xPVURGTEFSRV9MT0FEX0RFVl9WQVJTX0ZST01fRE9UX0VOVicsXG4gICdET0NLRVJfSE9TVCcsXG4gICdIVFRQX1BST1hZJyxcbiAgJ0hUVFBTX1BST1hZJyxcbiAgJ2h0dHBfcHJveHknLFxuICAnaHR0cHNfcHJveHknLFxuICAnRk9SQ0VfQ09MT1InLFxuICAnTUlOSUZMQVJFX0NBQ0hFX0RJUicsXG4gICdNSVNFX0VOVicsXG4gICdOT19DT0xPUicsXG4gICdORVhUX1BVQkxJQ19XQl9FTlYnLFxuICAnTkVYVF9QVUJMSUNfV0JfVkVSU0lPTicsXG4gICdOT0RFX0VOVicsXG4gICdQT1JUJyxcbiAgJ1dCX0VOVicsXG4gICdXQl9WRVJTSU9OJyxcbl0pO1xuXG5jb25zdCBOT05fU0VDUkVUX0tFWV9QUkVGSVhFUyA9IFsnV1JBTkdMRVJfJywgJ0NMT1VERkxBUkVfSFlQRVJEUklWRV9MT0NBTF9DT05ORUNUSU9OX1NUUklOR18nLCAnQ0xPVURGTEFSRV9DRl9GRVRDSF8nXTtcblxuZnVuY3Rpb24gaXNOb25TZWNyZXRLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE5PTl9TRUNSRVRfS0VZUy5oYXMoa2V5KSB8fCBOT05fU0VDUkVUX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgRGVwbG95Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgRGVwbG95Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8RGVwbG95Q29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBEZXBsb3lDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTpcbiAgICAnRGVwbG95IGEgQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcCAodmluZXh0IG9yIHBsYWluIFdvcmtlcikgdG8gdGhlIFdCX0VOViBlbnZpcm9ubWVudDogdmFsaWRhdGUgc2VjcmV0cywgYnVpbGQsIGFwcGx5IHJlbW90ZSBEMSBtaWdyYXRpb25zLCB0aGVuIGRlcGxveSBjb2RlIGFuZCBzZWNyZXRzIGF0b21pY2FsbHkuJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB5YXJncyBhcyB1bmtub3duIGFzIEFyZ3Y8RGVwbG95Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3Y6IERlcGxveUNvbW1hbmRBcmd2KSB7XG4gICAgLy8gQSBzdHJheSBleHBvcnRlZCBDTE9VREZMQVJFX0VOViB3b3VsZCBiYWtlIHRoZSB3cm9uZyBlbnZpcm9ubWVudCBpbnRvIHRoZSBidWlsZCBhbmRcbiAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlIG9uIGRlcGxveTsgaXQgaXMgcmUtc2V0IGV4cGxpY2l0bHkgd2hlcmUgbmVlZGVkLlxuICAgIC8vIEEgZG90ZW52IGZpbGUgZGVmaW5pbmcgaXQgc3RpbGwgc3VyZmFjZXMgdGhyb3VnaCBwcm9qZWN0LmVudiwgd2hpY2ggdGhlIGV4cGxpY2l0IGAtLWVudmBcbiAgICAvLyBmbGFncyBiZWxvdyBvdmVycmlkZS5cbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuQ0xPVURGTEFSRV9FTlY7XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCB3cmFuZ2xlckNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICAgIGlmICghd3JhbmdsZXJDb25maWdQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnd2IgZGVwbG95IGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IENsb3VkZmxhcmUgV29ya2VycyBhcHBzIChubyB3cmFuZ2xlciBjb25maWcgZm91bmQpLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgdmFsdWVzIGdvIGludG8gYm90aCBwcm9jZXNzLmVudiAoaW5oZXJpdGVkIGJ5IGV2ZXJ5dGhpbmcgd2Igc3Bhd25zKSBhbmQgcHJvamVjdC5lbnZcbiAgICAvLyAodGhlIGVudmlyb25tZW50IHdiIGl0c2VsZiByZWFkcyBhbmQgcGFzc2VzIGV4cGxpY2l0bHkpOyB0aGUgbGF0dGVyIGlzIGEgY2FjaGVkIHNuYXBzaG90XG4gICAgLy8gdGFrZW4gYmVmb3JlIHRoaXMgcG9pbnQsIHNvIHdyaXRpbmcgb25seSB0byBwcm9jZXNzLmVudiB3b3VsZCBsZWF2ZSB3YidzIG93biBwcmVmbGlnaHQg4oCUXG4gICAgLy8gYW5kIGFueSBjb21tYW5kIHNwYXduZWQgd2l0aCBwcm9qZWN0LmVudiDigJQgd2l0aG91dCB0aGUgdG9rZW4uXG4gICAgLy8gT25seSAtLWluY2x1ZGUtcm9vdC1lbnYgZ2F0ZXMgdGhlIHJvb3QgbG9va3VwLCBub3QgYW4gZXhwbGljaXQgLS1lbnY6IC0tZW52IHJlcGxhY2VzIHRoZVxuICAgIC8vIGRvdGVudiBWQVJJQUJMRSBzb3VyY2VzLCB3aGlsZSAuZW52LmNsb3VkZmxhcmUgaXMgYSBjcmVkZW50aWFsIHNpZGVjYXIgcmVhZCBvdXRzaWRlIHRoYXRcbiAgICAvLyBjYXNjYWRlICh0aGUgcHJvamVjdCdzIG93biBjb3B5IGlzIHJlYWQgcmVnYXJkbGVzcyBvZiAtLWVudiwgYXMgaXQgYWx3YXlzIGhhcyBiZWVuKS5cbiAgICAvLyBHYXRpbmcgb24gLS1lbnYgd291bGQgbWFrZSBgd2IgZGVwbG95IC0tZW52IDxmaWxlPmAgc2lsZW50bHkgc3RvcCBmaW5kaW5nIHRoZSByZXBvJ3MgdG9rZW4uXG4gICAgY29uc3QgY2xvdWRmbGFyZUVudlZhcnMgPSByZWFkQ2xvdWRmbGFyZUVudkZpbGVzKFxuICAgICAgcHJvamVjdC5kaXJQYXRoLFxuICAgICAgYXJndi5pbmNsdWRlUm9vdEVudiA/IHByb2plY3Qucm9vdERpclBhdGggOiB1bmRlZmluZWRcbiAgICApO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNsb3VkZmxhcmVFbnZWYXJzKSkge1xuICAgICAgLy8gPz89IHNvIHRoYXQgYW4gZXhwbGljaXRseSBleHBvcnRlZCBlbXB0eSB2YWx1ZSBzdGlsbCB3aW5zIG92ZXIgdGhlIGZpbGUuXG4gICAgICBwcm9jZXNzLmVudltrZXldID8/PSB2YWx1ZTtcbiAgICAgIHByb2plY3QuZW52W2tleV0gPz89IHZhbHVlO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWRDb25maWcgPSByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYocHJvamVjdCwgZW52TmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoIXJlc29sdmVkQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHBhcnNlICR7d3JhbmdsZXJDb25maWdQYXRofS5gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGFjY291bnRJZCA9IHJlc29sdmVkQ29uZmlnLmFjY291bnRJZCA/PyBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQ7XG4gICAgLy8gUHJlZmVyIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIHdoZW5ldmVyIHRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCdzIEQxIGJpbmRpbmdzIGhhdmUgYW5cbiAgICAvLyBleGlzdGluZyBtaWdyYXRpb25zIGRpcmVjdG9yeS4gQSBkcml6emxlLW9ybSBkZXBlbmRlbmN5IGFsb25lIGRvZXMgbm90IGltcGx5IHRoZSBwcm9qZWN0XG4gICAgLy8gbWlncmF0ZXMgRDEgd2l0aCBkcml6emxlLWtpdCdzIGQxLWh0dHAgZHJpdmVyOiB0aGUgZXhwbGljaXQgbWFya2VyIGlzIGEgZHJpenpsZSBjb25maWdcbiAgICAvLyB3aG9zZSBkaWFsZWN0L2RyaXZlciB0YXJnZXRzIHNxbGl0ZSAvIGQxLWh0dHAgLyBkdXJhYmxlLXNxbGl0ZSAoc2VlIHVzZXNEcml6emxlS2l0Rm9yRDE7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTQyKS4gQSBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgYW5vdGhlclxuICAgIC8vIGRhdGFiYXNlIChlLmcuIFBvc3RncmVTUUwgdmlhIEh5cGVyZHJpdmUpIGxlYXZlcyB0aGUgRDEgYmluZGluZ3MgdW5tYW5hZ2VkIGJ5IHdiIGRlcGxveS5cbiAgICBjb25zdCB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT5cbiAgICAgIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMocHJvamVjdCwgZGF0YWJhc2UpXG4gICAgKTtcbiAgICBjb25zdCBkcml6emxlS2l0TWFuYWdlc0QxID0gdXNlc0RyaXp6bGVLaXRGb3JEMShwcm9qZWN0KTtcbiAgICBpZiAoXG4gICAgICBkcml6emxlS2l0TWFuYWdlc0QxICYmXG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoIDwgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAvLyBNaWdyYXRpbmcgb25seSB0aGUgd3JhbmdsZXItbmF0aXZlIHN1YnNldCB3b3VsZCBzaWxlbnRseSBkZXBsb3kgY29kZSBhZ2FpbnN0IHRoZVxuICAgICAgLy8gb3RoZXIsIHVubWlncmF0ZWQgZGF0YWJhc2VzLlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgZG9lcyBub3Qgc3VwcG9ydCBtaXhpbmcgd3JhbmdsZXItbmF0aXZlIGFuZCBub24tbmF0aXZlIEQxIG1pZ3JhdGlvbiBsYXlvdXRzLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBkcml6emxlRDFEYXRhYmFzZSA9XG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBkcml6emxlS2l0TWFuYWdlc0QxID8gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID09PSAwICYmIGRyaXp6bGVLaXRNYW5hZ2VzRDEgJiYgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgc3VwcG9ydHMgZHJpenpsZS1raXQgbWlncmF0aW9ucyBvbmx5IGZvciBhIHNpbmdsZSBEMSBiaW5kaW5nOyBmb3VuZCBtdWx0aXBsZS4nKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlZEQxRGF0YWJhc2VzID0gbmV3IFNldCh3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKTtcbiAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UpIG1hbmFnZWREMURhdGFiYXNlcy5hZGQoZHJpenpsZUQxRGF0YWJhc2UpO1xuICAgIGNvbnN0IHVubWFuYWdlZEQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT4gIW1hbmFnZWREMURhdGFiYXNlcy5oYXMoZGF0YWJhc2UpKTtcbiAgICBpZiAodW5tYW5hZ2VkRDFEYXRhYmFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU2F5IHNvIG91dCBsb3VkIGluc3RlYWQgb2Ygc2lsZW50bHkgZGVwbG95aW5nIGNvZGUgYWdhaW5zdCB1bm1pZ3JhdGVkIGRhdGFiYXNlczogdGhlXG4gICAgICAvLyBkcml6emxlIG1hcmtlciBkZXRlY3Rpb24gaXMgaGV1cmlzdGljICh0ZXh0IHNjYW4gb2YgZHJpenpsZS5jb25maWcuKiksIHNvIGEgcHJvamVjdCB0aGF0XG4gICAgICAvLyBnZW51aW5lbHkgbWlncmF0ZXMgRDEgbXVzdCBiZSBhYmxlIHRvIG5vdGljZSB3aGVuIG5vIG1lY2hhbmlzbSB3YXMgc2VsZWN0ZWQuIFRoaXMgYWxzb1xuICAgICAgLy8gY292ZXJzIHBhcnRpYWwgbGF5b3V0cyAoc29tZSBiaW5kaW5ncyB3cmFuZ2xlci1uYXRpdmUsIG90aGVycyB1bm1hbmFnZWQpLlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYE5vIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20gZGV0ZWN0ZWQgZm9yICR7dW5tYW5hZ2VkRDFEYXRhYmFzZXNcbiAgICAgICAgICAgIC5tYXAoKGRhdGFiYXNlKSA9PiBkYXRhYmFzZS5iaW5kaW5nID8/IGRhdGFiYXNlLmRhdGFiYXNlX25hbWUgPz8gJ3VubmFtZWQgYmluZGluZycpXG4gICAgICAgICAgICAuam9pbignLCAnKX0gYCArXG4gICAgICAgICAgICAnKG5vIHdyYW5nbGVyIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGFuZCBubyBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgc3FsaXRlL2QxLWh0dHAvZHVyYWJsZS1zcWxpdGUpOyB3YiBkZXBsb3kgd2lsbCBub3QgcnVuIEQxIG1pZ3JhdGlvbnMgZm9yIHRoZW0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBEcnkgcnVucyBleGVjdXRlIG5vdGhpbmcgYXV0aGVudGljYXRlZCwgc28gdGhleSBza2lwIHRoZSBjcmVkZW50aWFsIHByZWZsaWdodCBlbnRpcmVseS5cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICAvLyBBIGRyaXp6bGUtc2VsZWN0ZWQgRDEgZGF0YWJhc2Ugcm91dGVzIGJvdGggdGhlIG1pZ3JhdGlvbiBpbiBzdGVwIDMgYW5kIGFueSBkZXBsb3kvcG9zdFxuICAgICAgLy8gaG9vayB0aHJvdWdoIGRyaXp6bGUta2l0J3MgZDEtaHR0cCBkcml2ZXIsIHdoaWNoIG5lZWRzIENMT1VERkxBUkVfQVBJX1RPS0VOIGV2ZW4gZm9yXG4gICAgICAvLyBsb2NhbCwgd3JhbmdsZXItT0F1dGggZGVwbG95cy4gRmFpbGluZyBoZXJlIGtlZXBzIHRoZSBmYWlsLWZhc3Qgb3JkZXJpbmc6IGEgbWlzc2luZyB0b2tlblxuICAgICAgLy8gbXVzdCBhYm9ydCBiZWZvcmUgdGhlIGRlcGxveSBnb2VzIGxpdmUsIG5vdCBkdXJpbmcgbWlncmF0aW9uIG9yIGRlcGxveS9wb3N0XG4gICAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTU2KS4gV3JhbmdsZXItbmF0aXZlIHByb2plY3RzICh3aXRoIG9yXG4gICAgICAvLyB3aXRob3V0IGhvb2tzKSBtdXN0IG5vdCByZXF1aXJlIHRoZSB0b2tlbjogYSBsb2NhbCB3cmFuZ2xlciBPQXV0aCBsb2dpbiBzdWZmaWNlcyB0aGVyZSxcbiAgICAgIC8vIGV2ZW4gdGhvdWdoIHN0ZXAgNSBzdGlsbCBleHBvcnRzIENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgdG8gdGhlaXIgaG9va3MuXG4gICAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UgJiYgIXByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX1RPS0VOKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdDTE9VREZMQVJFX0FQSV9UT0tFTiBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uID1cbiAgICAgICAgISFwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIXByb2plY3QuZW52LkNGX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIShwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9FTUFJTCkgfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0ZfQVBJX0tFWSAmJiBwcm9qZWN0LmVudi5DRl9FTUFJTCk7XG4gICAgICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgIWhhc1dyYW5nbGVyQXV0aGVudGljYXRpb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dyYW5nbGVyIGF1dGhlbnRpY2F0aW9uIChlLmcuIENMT1VERkxBUkVfQVBJX1RPS0VOKSBpcyByZXF1aXJlZCB0byBkZXBsb3kgb24gQ0kuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwLXNwZWNpZmljIHZhbGlkYXRpb24gaG9vayAoZS5nLiBzZWNyZXQgcGFpcnMgdGhhdCBtdXN0IGJlIGJvdGgtc2V0LW9yLWJvdGgtZW1wdHkpLlxuICAgIC8vIFRoZSByZXVzYWJsZSBkZXBsb3kueW1sIGFscmVhZHkgcnVucyBpdCBvbiBDSTsgcnVuIGl0IGhlcmUgZm9yIGxvY2FsIGRlcGxveXMuXG4gICAgaWYgKCFpc0NJKHByb2plY3QuZW52LkNJKSAmJiBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGVwbG95L2NpLXNldHVwJ10pIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZGVwbG95L2NpLXNldHVwJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgLy8gMS4gUmVzb2x2ZSBhbmQgdmFsaWRhdGUgYWxsIHNlY3JldHMgYmVmb3JlIGFueSBidWlsZCBvciByZW1vdGUgbXV0YXRpb24sIHNvIGEgbWlzc2luZ1xuICAgIC8vICAgIHNlY3JldCBhYm9ydHMgdGhlIGRlcGxveSBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBtaWdyYXRlZCBkYXRhYmFzZSBiZWhpbmQgYW4gb2xkIFdvcmtlci5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gUmVzdHJpY3QgdGhlIHNlY3JldHMgZG9tYWluIHRvIGtleXMgZGVmaW5lZCBpbiB0aGUgcHJvamVjdCdzIC5lbnYgZmlsZXM6IGBtaXNlIGVudmBcbiAgICAvLyBvdXRwdXQgKHJlcG9ydGVkIGFzIGEgcHNldWRvLXNvdXJjZSkgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyBzdWNoIGFzIENBUkdPX0hPTUUsXG4gICAgLy8gd2hpY2ggbXVzdCBuZXZlciBiZSB1cGxvYWRlZCBhcyBXb3JrZXIgc2VjcmV0cy5cbiAgICBjb25zdCBkb3RlbnZLZXlzID0gbmV3IFNldChcbiAgICAgIGVudlNvdXJjZXMuZmlsdGVyKChbc291cmNlXSkgPT4gIXNvdXJjZS5zdGFydHNXaXRoKCdtaXNlIGVudicpKS5mbGF0TWFwKChbLCBrZXlzXSkgPT4ga2V5cylcbiAgICApO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBpZiAoIWRvdGVudktleXMuaGFzKGtleSkpIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVpcmVkS2V5cyA9IHJlYWRFbnZFeGFtcGxlS2V5cyhwcm9qZWN0KTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZXF1aXJlZEtleXMpIHtcbiAgICAgIGVudlZhcnNba2V5XSA/Pz0gcHJvamVjdC5lbnZba2V5XSA/PyAnJztcbiAgICB9XG4gICAgLy8gTmFtZXMgZGVjbGFyZWQgdmlhIHdyYW5nbGVyIGBzZWNyZXRzLnJlcXVpcmVkYCBtYXkgbGlrZXdpc2UgYmUgc3VwcGxpZWQgcHVyZWx5IGFzXG4gICAgLy8gZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuIENJIHdvcmtmbG93IGVudikgaW5zdGVhZCBvZiBkb3RlbnYgdmFsdWVzLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMpIHtcbiAgICAgIGNvbnN0IGV4cG9ydGVkVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVudlZhcnNba2V5XSA9PT0gdW5kZWZpbmVkICYmIGV4cG9ydGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZXhwb3J0ZWRWYWx1ZTtcbiAgICB9XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBkb3RlbnYgdmFsdWVzIChwcm9qZWN0LmVudiBhbHJlYWR5XG4gICAgLy8gYXBwbGllcyB0aGF0IHByZWNlZGVuY2UpLCBvciBgQVVUSF9TRUNSRVQ9Li4uIHdiIGRlcGxveWAgd291bGQgcHVzaCB0aGUgc3RhbGUgZmlsZSB2YWx1ZS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cbiAgICBjb25zdCB7IG1pc3NpbmdLZXlzLCBzZWNyZXRzIH0gPSBzZWxlY3RXb3JrZXJTZWNyZXRzKFxuICAgICAgZW52VmFycyxcbiAgICAgIFsuLi5yZXNvbHZlZENvbmZpZy52YXJLZXlzLCAuLi5yZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXNdLFxuICAgICAgcmVxdWlyZWRLZXlzXG4gICAgKTtcbiAgICAvLyBgLS12YXIgV0JfVkVSU0lPTjouLi5gIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBjb25maWd1cmF0aW9uIHZhbHVlcyBvbiBkZXBsb3ksIHNvIGFcbiAgICAvLyByZXNvdXJjZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSB3b3VsZCBzaWxlbnRseSBiZWNvbWUgYSBzdHJpbmcgdmFyaWFibGUuXG4gICAgaWYgKHByb2plY3QuZW52LldCX1ZFUlNJT04gJiYgcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKCdXQl9WRVJTSU9OJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdXQl9WRVJTSU9OIGNvbGxpZGVzIHdpdGggYSBXb3JrZXIgYmluZGluZyBuYW1lOyByZW5hbWUgdGhlIGJpbmRpbmcuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBiaW5kaW5nQ29sbGlzaW9ucyA9IE9iamVjdC5rZXlzKGVudlZhcnMpLmZpbHRlcigoa2V5KSA9PiByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgaWYgKGJpbmRpbmdDb2xsaXNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFVwbG9hZGluZyBhIHNlY3JldCBuYW1lZCBsaWtlIGEgYmluZGluZyB3b3VsZCByZXBsYWNlIHRoZSBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgZW52IGtleXMgdGhhdCBjb2xsaWRlIHdpdGggV29ya2VyIGJpbmRpbmcgbmFtZXM6ICR7YmluZGluZ0NvbGxpc2lvbnMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgTWlzc2luZyByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGZyb20gLmVudi5leGFtcGxlIG9yIHdyYW5nbGVyIHNlY3JldHMucmVxdWlyZWQpOiAke21pc3NpbmdLZXlzLmpvaW4oJywgJyl9YFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBXcmFuZ2xlciB2YWxpZGF0ZXMgYHNlY3JldHMucmVxdWlyZWRgIG9ubHkgZHVyaW5nIHRoZSByZWFsIHVwbG9hZCDigJQgYWZ0ZXIgbWlncmF0aW9ucyDigJRcbiAgICAvLyBzbyB3YiBjaGVja3MgdXBmcm9udDogZWFjaCByZXF1aXJlZCBuYW1lIG11c3QgYmUgYSBrZXkgaW4gdGhlIG91dGdvaW5nIHBheWxvYWQgKHByZXNlbmNlLFxuICAgIC8vIG5vdCB0cnV0aGluZXNzIOKAlCBhbiBleHBsaWNpdCBlbXB0eSBjbGVhcnMgYSBzdGFsZSB2YWx1ZSkgb3IgYW4gZWZmZWN0aXZlIHZhci9iaW5kaW5nLlxuICAgIGNvbnN0IHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcyA9IHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMuZmlsdGVyKFxuICAgICAgKG5hbWUpID0+XG4gICAgICAgICFPYmplY3QuaGFzT3duKHNlY3JldHMsIG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy52YXJLZXlzLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMobmFtZSlcbiAgICApO1xuICAgIGlmICh1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBTZWNyZXRzIHJlcXVpcmVkIGJ5IHRoZSB3cmFuZ2xlciBjb25maWcgYXJlIG5vdCBwcm92aWRlZDogJHt1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMuam9pbignLCAnKX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHNlY3JldEtleXMgPSBPYmplY3Qua2V5cyhzZWNyZXRzKS50b1NvcnRlZCgpO1xuICAgIC8vIENsb3VkZmxhcmUgbGltaXRzIGEgYnVsayB1cGxvYWQgdG8gMTAwIHNlY3JldHMsIGVhY2ggdmFyaWFibGUvc2VjcmV0IHZhbHVlIHRvIDUgS0IsIGFuZFxuICAgIC8vIHRoZSBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgY291bnQgdG8gMTI4ICg2NCBvbiB0aGUgRnJlZSBwbGFuLCB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWRcbiAgICAvLyBoZXJlIOKAlCBoZW5jZSBhIHdhcm5pbmcpLiBGYWlsaW5nIGJlZm9yZSBhbnkgYnVpbGQgb3IgbWlncmF0aW9uIGtlZXBzIGFuIG92ZXJzaXplZCBwYXlsb2FkXG4gICAgLy8gZnJvbSBhYm9ydGluZyB0aGUgZGVwbG95IGFmdGVyIHJlbW90ZSBtaWdyYXRpb25zIGFscmVhZHkgcmFuLlxuICAgIGlmIChzZWNyZXRLZXlzLmxlbmd0aCA+IDEwMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBDbG91ZGZsYXJlIGFjY2VwdHMgYXQgbW9zdCAxMDAgc2VjcmV0cyBwZXIgZGVwbG95LCBidXQgJHtzZWNyZXRLZXlzLmxlbmd0aH0gd2VyZSBzZWxlY3RlZC5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gVGhlIENMSS1wcm92aWRlZCBXQl9WRVJTSU9OIG92ZXJsYXlzIGEgY29uZmlndXJlZCB2YXIgb2YgdGhlIHNhbWUgbmFtZSBvbiBkZXBsb3ksXG4gICAgLy8gc28gb25seSB0aGUgZWZmZWN0aXZlIHZhbHVlIHBhcnRpY2lwYXRlcyBpbiB0aGUgbGltaXQgY2hlY2tzLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVZhcnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzPHVua25vd24+KHJlc29sdmVkQ29uZmlnLnZhcnMpKTtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikgZWZmZWN0aXZlVmFycy5zZXQoJ1dCX1ZFUlNJT04nLCBwcm9qZWN0LmVudi5XQl9WRVJTSU9OKTtcbiAgICBjb25zdCB2YXJFbnRyaWVzID0gWy4uLmVmZmVjdGl2ZVZhcnNdO1xuICAgIGNvbnN0IG92ZXJzaXplZEtleXMgPSBbXG4gICAgICAuLi5zZWNyZXRLZXlzLmZpbHRlcigoa2V5KSA9PiBCdWZmZXIuYnl0ZUxlbmd0aChzZWNyZXRzW2tleV0gPz8gJycsICd1dGY4JykgPiA1ICogMTAyNCksXG4gICAgICAuLi52YXJFbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFssIHZhbHVlXSkgPT4gQnVmZmVyLmJ5dGVMZW5ndGgodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpLCAndXRmOCcpID4gNSAqIDEwMjRcbiAgICAgICAgKVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICBdO1xuICAgIGlmIChvdmVyc2l6ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBWYXJpYWJsZSBvciBzZWNyZXQgdmFsdWVzIGV4Y2VlZCBDbG91ZGZsYXJlJ3MgNSBLQiBsaW1pdDogJHtvdmVyc2l6ZWRLZXlzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlOiByZW1vdGUgc2VjcmV0cyBhYnNlbnQgZnJvbSB0aGUgcGF5bG9hZCBzdGF5IGF0dGFjaGVkIHRvIHRoZVxuICAgIC8vIG5ldyB2ZXJzaW9uLCBzbyB0aGV5IGNvdW50IGFnYWluc3QgdGhlIGNvbWJpbmVkIGxpbWl0IHRvby4gTGlzdGluZyB0aGVtIG5lZWRzIGFuXG4gICAgLy8gYXV0aGVudGljYXRlZCByZW1vdGUgcm91bmQtdHJpcCwgd2hpY2ggZHJ5IHJ1bnMgc2tpcDsgd2hlbiB0aGUgbGlzdGluZyBmYWlscyBmb3IgYW55XG4gICAgLy8gcmVhc29uIG90aGVyIHRoYW4gYSBub3QteWV0LWNyZWF0ZWQgV29ya2VyLCBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGNvdW50IGluc3RlYWQgb2ZcbiAgICAvLyBibG9ja2luZyBhIGRlcGxveSB0aGF0IHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuXG4gICAgY29uc3QgcmVtb3RlU2VjcmV0TmFtZXMgPSBhcmd2LmRyeVJ1blxuICAgICAgPyBbXVxuICAgICAgOiBhd2FpdCBsaXN0UmVtb3RlV29ya2VyU2VjcmV0TmFtZXMocHJvamVjdCwgYXJndiwgd3JhbmdsZXJDb25maWdQYXRoLCByZXNvbHZlZENvbmZpZywgZW52TmFtZSk7XG4gICAgY29uc3QgaW5oZXJpdGVkU2VjcmV0TmFtZXMgPSBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgICAgIHJlbW90ZVNlY3JldE5hbWVzID8/IFtdLFxuICAgICAgc2VjcmV0cyxcbiAgICAgIHZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICAgIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc1xuICAgICk7XG4gICAgY29uc3QgY29tYmluZWRDb3VudCA9XG4gICAgICBuZXcgU2V0KFsuLi5zZWNyZXRLZXlzLCAuLi52YXJFbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSldKS5zaXplICsgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoO1xuICAgIGNvbnN0IGluaGVyaXRlZE5vdGUgPVxuICAgICAgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgKGluY2x1ZGluZyAke2luaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aH0gcmVtb3RlIHNlY3JldHMga2VwdCBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uOiAke2luaGVyaXRlZFNlY3JldE5hbWVzLmpvaW4oJywgJyl9KWBcbiAgICAgICAgOiAnJztcbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDEyOCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBDbG91ZGZsYXJlIGFsbG93cyBhdCBtb3N0IDEyOCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgY29tYmluZWQsIGJ1dCAke2NvbWJpbmVkQ291bnR9IHdlcmUgc2VsZWN0ZWQke2luaGVyaXRlZE5vdGV9LmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiA2NCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYCR7Y29tYmluZWRDb3VudH0gdmFyaWFibGVzIGFuZCBzZWNyZXRzJHtpbmhlcml0ZWROb3RlfSBleGNlZWQgdGhlIEZyZWUgcGxhbidzIGxpbWl0IG9mIDY0LmApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5jeWFuKFxuICAgICAgICBgRGVwbG95aW5nICR7cmVzb2x2ZWRDb25maWcud29ya2VyTmFtZSA/PyBwcm9qZWN0Lm5hbWV9ICgke2Vudk5hbWV9KSB3aXRoICR7c2VjcmV0S2V5cy5sZW5ndGh9IHNlY3JldHM6ICR7c2VjcmV0S2V5cy5qb2luKCcsICcpfWBcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gMi4gQnVpbGQgKHZpbmV4dCBlbWJlZHMgdGhlIGVudmlyb25tZW50LWFwcGxpZWQgd3JhbmdsZXIgY29uZmlnIGludG8gZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbikuXG4gICAgLy8gICAgQnVpbGRpbmcgYmVmb3JlIG1pZ3JhdGluZyBrZWVwcyBhIGJ1aWxkIGZhaWx1cmUgZnJvbSBsZWF2aW5nIGEgbWlncmF0ZWQgc2NoZW1hIGJlaGluZFxuICAgIC8vICAgIHRoZSBvbGQgV29ya2VyLiBQbGFpbiBXb3JrZXJzIGhhdmUgbm8gYnVpbGQgc3RlcDsgd3JhbmdsZXIgYnVuZGxlcyB0aGUgZW50cnkgaXRzZWxmLlxuICAgIGNvbnN0IGlzVmluZXh0ID0gISEocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpbmV4dCA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udmluZXh0KTtcbiAgICBjb25zdCBkZXBsb3lDb25maWdQYXRoID0gaXNWaW5leHQgPyBwYXRoLmpvaW4oJ2Rpc3QnLCAnc2VydmVyJywgJ3dyYW5nbGVyLmpzb24nKSA6IHdyYW5nbGVyQ29uZmlnUGF0aDtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52QXNzaWdubWVudCA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uXG4gICAgICA/IGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ0NMT1VERkxBUkVfRU5WJywgZW52TmFtZSl9IGBcbiAgICAgIDogJyc7XG4gICAgaWYgKGlzVmluZXh0KSB7XG4gICAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikge1xuICAgICAgICBwcm9qZWN0LmVudi5ORVhUX1BVQkxJQ19XQl9WRVJTSU9OIHx8PSBwcm9qZWN0LmVudi5XQl9WRVJTSU9OO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZ2VuLWNvZGUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtjbG91ZGZsYXJlRW52QXNzaWdubWVudH1ZQVJOIHZpbmV4dCBidWlsZGAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgLy8gT24gZHJ5IHJ1bnMgdGhlIHZpbmV4dCBidWlsZCBhYm92ZSBpcyBhIHByaW50ZWQgbm8tb3AsIHNvIHRoZSBidWlsdCBjb25maWcgaXNcbiAgICAgIC8vIGxlZ2l0aW1hdGVseSBhYnNlbnQgYW5kIG11c3Qgbm90IGFib3J0IHRoZSBydW4uXG4gICAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRlcGxveUNvbmZpZ1BhdGgpKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgJHtkZXBsb3lDb25maWdQYXRofSBub3QgZm91bmQ7IHRoZSB2aW5leHQgYnVpbGQgZGlkIG5vdCBwcm9kdWNlIGEgZGVwbG95IGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIFdyYW5nbGVyIHZhbGlkYXRlcyBpdHMgY29uZmlnIHNjaGVtYSBvbmx5IHdoZW4gaXQgcnVucywgc28gYSBkcnkgcnVuIG9mIHRoZSBidWlsdFxuICAgICAgLy8gY29uZmlnIHN1cmZhY2VzIGNvbmZpZyBhbmQgYnVuZGxlIGVycm9ycyBCRUZPUkUgdGhlIHJlbW90ZSBtaWdyYXRpb25zIGJlbG93IG11dGF0ZVxuICAgICAgLy8gdGhlIGRhdGFiYXNlLCBtaXJyb3JpbmcgdGhlIHBsYWluLVdvcmtlciBkcnkgcnVuLiBObyAtLWVudjogdGhlIGJ1aWx0IGNvbmZpZyBhbHJlYWR5XG4gICAgICAvLyBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRlcGxveUNvbmZpZ1BhdGgpfWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBsYWluIFdvcmtlcnMgYXJlIGZpcnN0IGNvbXBpbGVkIGJ5IHdyYW5nbGVyIGR1cmluZyB0aGUgZGVwbG95IGl0c2VsZjsgYSBkcnkgcnVuXG4gICAgICAvLyBzdXJmYWNlcyBjb21waWxlIGVycm9ycyAoZS5nLiBhIG1pc3NpbmcgZW50cnkgcG9pbnQpIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnNcbiAgICAgIC8vIGJlbG93IG11dGF0ZSB0aGUgZGF0YWJhc2UuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IGAgLS1lbnYgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGVudk5hbWUpfWAgOiAnJ31gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIEFwcGx5IEQxIG1pZ3JhdGlvbnMgdG8gdGhlIHJlbW90ZSBkYXRhYmFzZSB3aXRoIHRoZSBwcm9qZWN0J3Mgc2luZ2xlIG1pZ3JhdGlvblxuICAgIC8vICAgIG1lY2hhbmlzbSAod3JhbmdsZXItbmF0aXZlIHdoZW4gYSBtaWdyYXRpb25zIGRpcmVjdG9yeSBleGlzdHMsIGVsc2UgZHJpenpsZS1raXQgd2hlblxuICAgIC8vICAgIHRoZSBkcml6emxlIGNvbmZpZyB0YXJnZXRzIHNxbGl0ZS9kMS1odHRwL2R1cmFibGUtc3FsaXRlKS4gTWlncmF0aW9ucyBtdXN0IGJlIGJhY2t3YXJkXG4gICAgLy8gICAgY29tcGF0aWJsZTogdGhlIG9sZCBXb3JrZXIgc2VydmVzXG4gICAgLy8gICAgdHJhZmZpYyB1bnRpbCB0aGUgZGVwbG95IGJlbG93LlxuICAgIGNvbnN0IGVudk9wdGlvbiA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gYCAtLWVudiAke3NoZWxsRXNjYXBlQXJndW1lbnQoZW52TmFtZSl9YCA6ICcnO1xuICAgIGZvciAoY29uc3QgZGF0YWJhc2Ugb2Ygd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcykge1xuICAgICAgY29uc3QgZGF0YWJhc2VOYW1lID0gZGF0YWJhc2UuZGF0YWJhc2VfbmFtZSA/PyBkYXRhYmFzZS5iaW5kaW5nO1xuICAgICAgaWYgKCFkYXRhYmFzZU5hbWUpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRhdGFiYXNlTmFtZSl9IC0tcmVtb3RlIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudCh3cmFuZ2xlckNvbmZpZ1BhdGgpfSR7ZW52T3B0aW9ufWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSkge1xuICAgICAgaWYgKCFkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVGhlICR7ZW52TmFtZX0gRDEgYmluZGluZyBoYXMgbm8gZGF0YWJhc2VfaWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGlmICghYWNjb3VudElkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCAob3IgYWNjb3VudF9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnKSBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBidWlsZERyaXp6bGVLaXRDb21tYW5kKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgJ21pZ3JhdGUnLFxuICAgICAgICAgIGBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEPSR7ZHJpenpsZUQxRGF0YWJhc2UuZGF0YWJhc2VfaWR9IENMT1VERkxBUkVfQUNDT1VOVF9JRD0ke2FjY291bnRJZH1gXG4gICAgICAgICksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gNC4gRGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseSAobm8gcG9zdC1kZXBsb3kgc2VjcmV0IHB1c2ggdGhhdCBjb3VsZCBsZWF2ZSB0aGVcbiAgICAvLyAgICBuZXcgdmVyc2lvbiBydW5uaW5nIHdpdGhvdXQg4oCUIG9yIHdpdGggc3RhbGUg4oCUIHNlY3JldHMpLiBUaGUgc2VjcmV0cyBKU09OIGdvZXMgdGhyb3VnaFxuICAgIC8vICAgIGEgbW9kZS0wNjAwIGZpbGUgaW4gYSBwcml2YXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZGVsZXRlZCByaWdodCBhZnRlciB0aGUgZGVwbG95OlxuICAgIC8vICAgIC9kZXYvc3RkaW4gaXMgTk9UIHJlbGlhYmxlIGhlcmUgYmVjYXVzZSB3cmFuZ2xlciByZWFkcyB0aGUgc2VjcmV0cyBmaWxlIG9ubHkgYWZ0ZXJcbiAgICAvLyAgICB1cGxvYWRpbmcgYXNzZXRzLCBieSB3aGljaCBwb2ludCB0aGUgcGlwZWQgc3RkaW4gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNvbnN1bWVkIOKAlFxuICAgIC8vICAgIG9ic2VydmVkIGFzIGEgZmxha3kgYENvdWxkIG5vdCByZWFkIGZpbGU6IC9kZXYvc3RkaW5gIG9uIENJLiBFeHBsaWNpdGx5IGVtcHR5IHZhbHVlc1xuICAgIC8vICAgIHN0YXkgaW4gdGhlIHBheWxvYWQ6IC0tc2VjcmV0cy1maWxlIGlzIGFkZGl0aXZlLCBzbyBwdXNoaW5nICcnIGlzIHRoZSBvbmx5IHdheSB0b1xuICAgIC8vICAgIGNsZWFyIGEgc3RhbGUgc2VjcmV0LlxuICAgIGNvbnN0IGRlcGxveUFyZ3MgPSBbXG4gICAgICAnZGVwbG95JyxcbiAgICAgICctLWNvbmZpZycsXG4gICAgICBkZXBsb3lDb25maWdQYXRoLFxuICAgICAgLy8gdmluZXh0J3MgYnVpbHQgY29uZmlnIGFscmVhZHkgaGFzIHRoZSBlbnZpcm9ubWVudCBhcHBsaWVkOyBwYXNzaW5nIC0tZW52IHRoZXJlIHdvdWxkXG4gICAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlLlxuICAgICAgLi4uKCFpc1ZpbmV4dCAmJiByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IFsnLS1lbnYnLCBlbnZOYW1lXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0LmVudi5XQl9WRVJTSU9OID8gWyctLXZhcicsIGBXQl9WRVJTSU9OOiR7cHJvamVjdC5lbnYuV0JfVkVSU0lPTn1gXSA6IFtdKSxcbiAgICAgICctLXNlY3JldHMtZmlsZScsXG4gICAgXTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogd3JhbmdsZXIgJHtkZXBsb3lBcmdzLmpvaW4oJyAnKX0gPHRlbXBvcmFyeSBzZWNyZXRzIGZpbGU+YCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gICAgICBjb25zdCBkZXBsb3lFbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gICAgICBkZWxldGUgZGVwbG95RW52LkNMT1VERkxBUkVfRU5WO1xuICAgICAgLy8gMG83MDAgZGlyZWN0b3J5ICsgMG82MDAgZmlsZTogcmVhZGFibGUgb25seSBieSB0aGUgZGVwbG95aW5nIHVzZXIsIGxpa2UgdGhlIGRvdGVudlxuICAgICAgLy8gZmlsZXMgdGhlIENJIHdvcmtmbG93IGFscmVhZHkgd3JpdGVzIG5leHQgdG8gaXQuIHdyYW5nbGVyIHJ1bnMgdGhyb3VnaCBhbiBhc3luYyBzcGF3blxuICAgICAgLy8gKHNwYXduU3luYyB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCwgc28gYSBzaHV0ZG93biBzaWduYWwgd291bGQga2lsbCB0aGUgcHJvY2Vzc1xuICAgICAgLy8gYmVmb3JlIGFueSBjbGVhbnVwKSBhbmQgdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIGluIGEgZmluYWxseSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgICAgIC8vIGRlcGxveSBjYW5ub3QgbGVhdmUgdGhlIHBsYWludGV4dCBzZWNyZXRzIGJlaGluZC4gU2h1dGRvd24gaGFuZGxpbmcgZGV0YWlsczpcbiAgICAgIC8vIC0gSGFuZGxlcnMgKGluY2x1ZGluZyBTSUdIVVAsIG9uIHdoaWNoIE5vZGUgYWxzbyB0ZXJtaW5hdGVzIGJ5IGRlZmF1bHQpIGFyZSBpbnN0YWxsZWRcbiAgICAgIC8vICAgQkVGT1JFIHRoZSBmaWxlIGlzIHdyaXR0ZW4gYW5kIHVzZSBwcm9jZXNzLm9uLCBub3Qgb25jZSwgc28gYSByZXBlYXRlZCBzaWduYWwgY2Fubm90XG4gICAgICAvLyAgIGZhbGwgYmFjayB0byBkZWZhdWx0IHRlcm1pbmF0aW9uIGFuZCBieXBhc3MgdGhlIGZpbmFsbHkgY2xlYW51cC5cbiAgICAgIC8vIC0gU0lHSFVQL1NJR1FVSVQgYXJlIGZvcndhcmRlZCB0byB3cmFuZ2xlciBhcyBTSUdURVJNOiB3cmFuZ2xlcidzIGxhdW5jaGVyIHJlbGF5cyBvbmx5XG4gICAgICAvLyAgIFNJR0lOVC9TSUdURVJNIHRvIGl0cyBpbm5lciBOb2RlIHByb2Nlc3MsIGFuZCBhbnl0aGluZyBlbHNlIHdvdWxkIG9ycGhhbiBhIGRlcGxveW1lbnRcbiAgICAgIC8vICAgdGhhdCBrZWVwcyBtdXRhdGluZyB0aGUgcmVtb3RlIFdvcmtlciBhZnRlciB3YiBleGl0cy5cbiAgICAgIC8vIC0gVGhlIHJlLXJhaXNlIGJlbG93IHVzZXMgdGhlIHNpZ25hbCB3YiBpdHNlbGYgcmVjZWl2ZWQ6IHdyYW5nbGVyIGNhdGNoZXMgU0lHSU5UIGFuZFxuICAgICAgLy8gICBleGl0cyBudW1lcmljYWxseSAoZS5nLiAxNDMpLCB3aGljaCBtdXN0IG5vdCBtYXNxdWVyYWRlIGFzIGFuIG9yZGluYXJ5IGZhaWx1cmUuXG4gICAgICBjb25zdCBzZWNyZXRzRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLWRlcGxveS0nKSk7XG4gICAgICBjb25zdCBzaHV0ZG93blNpZ25hbHMgPSBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBsZXQgd3JhbmdsZXJQcm9jZXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWNlaXZlZFNodXRkb3duU2lnbmFsID8/PSBzaWduYWw7XG4gICAgICAgICAgaWYgKHdyYW5nbGVyUHJvY2Vzcykge1xuICAgICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLmtpbGwoc2lnbmFsID09PSAnU0lHSU5UJyB8fCBzaWduYWwgPT09ICdTSUdURVJNJyA/IHNpZ25hbCA6ICdTSUdURVJNJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIFdpdGggdGhlIGhhbmRsZXJzIHJlbW92ZWQsIHJlLXJhaXNpbmcgdHJpZ2dlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbGV0IGRlcGxveVN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VjcmV0c0ZpbGVQYXRoID0gcGF0aC5qb2luKHNlY3JldHNEaXJQYXRoLCAnc2VjcmV0cy5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2VjcmV0c0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZWNyZXRzKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICAgICAgZGVwbG95U3RhdHVzID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2VzcyA9IHNwYXduKCd3cmFuZ2xlcicsIFsuLi5kZXBsb3lBcmdzLCBzZWNyZXRzRmlsZVBhdGhdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGVudjogZGVwbG95RW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHNpZ25hbCA/IDEgOiAoY29kZSA/PyB1bmRlZmluZWQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBwcm9jZXNzLmV4aXQgc2tpcHMgZmluYWxseSBibG9ja3MsIHNvIHRoZSBleGl0LW9uLWZhaWx1cmUgYmVsb3cgc3RheXMgb3V0c2lkZS5cbiAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2VpdmVkU2h1dGRvd25TaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2Ugc28gdGhlIGNhbGxlciBvYnNlcnZlcyB0aGUgc2FtZSBzaWduYWwtZGVyaXZlZCBleGl0IHN0YXR1cy5cbiAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNodXRkb3duU2lnbmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRlcGxveVN0YXR1cyAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgd3JhbmdsZXIgZGVwbG95IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2RlcGxveVN0YXR1cyA/PyAndW5rbm93bid9LmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGRlcGxveVN0YXR1cyA/PyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LiBPcHRpb25hbCBwb3N0LWRlcGxveSBob29rIChlLmcuIHNlZWRpbmcgdGhlIHJlbW90ZSBEMSB2aWEgZHJpenpsZSdzIGQxLWh0dHAgZHJpdmVyKS5cbiAgICAvLyAgICBBc3NpZ24gdGhlIHJlc29sdmVkIGlkcyB1bmNvbmRpdGlvbmFsbHk6IGEgc3RhbGUgZXhwb3J0ZWQgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRFxuICAgIC8vICAgIG11c3Qgbm90IHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvcG9zdCddKSB7XG4gICAgICAvLyBUaGUgaWQgaXMgdW5hbWJpZ3VvdXMgb25seSB3aXRoIGEgc2luZ2xlIEQxIGJpbmRpbmc7IHdpdGggbXVsdGlwbGUsIHRoZSBob29rIG11c3RcbiAgICAgIC8vIHJlc29sdmUgaXRzIHRhcmdldCBpdHNlbGYuIENsZWFyIGZpcnN0IGVpdGhlciB3YXk6IGEgc3RhbGUgaW5oZXJpdGVkIGlkIG11c3Qgbm90XG4gICAgICAvLyByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgICAgY29uc3QgaG9va0QxRGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ7XG4gICAgICBpZiAocmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdNdWx0aXBsZSBEMSBiaW5kaW5ncyBleGlzdDsgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCBpcyBub3Qgc2V0IGZvciBkZXBsb3kvcG9zdC4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoaG9va0QxRGF0YWJhc2U/LmRhdGFiYXNlX2lkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEID0gaG9va0QxRGF0YWJhc2UuZGF0YWJhc2VfaWQ7XG4gICAgICBpZiAoYWNjb3VudElkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQgPSBhY2NvdW50SWQ7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9wb3N0JywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBSZWFkIHRoZSBDbG91ZGZsYXJlIEFQSSB0b2tlbiB0aGF0IENJIGRyb3BzIGluIGEgYC5lbnYuY2xvdWRmbGFyZWAgZmlsZSAoZS5nLiB0aGUgcmV1c2FibGVcbiAqIGRlcGxveSB3b3JrZmxvdydzIGBmaWxlX3BhdGhfMWApLCBsb29raW5nIGJlc2lkZSB0aGUgV29ya2VyJ3Mgd3JhbmdsZXIgY29uZmlnIGFuZCBhdCB0aGVcbiAqIG1vbm9yZXBvIHJvb3Qg4oCUIGBmaWxlX3BhdGhfMWAgaXMgcmVwby1yZWxhdGl2ZSwgc28gYm90aCBzcGVsbGluZ3Mgb2NjdXIgaW4gcHJhY3RpY2UuXG4gKiBOZWFyZXIgZmlsZXMgd2luLCBtaXJyb3JpbmcgdGhlIGAuZW52YCBjYXNjYWRlOiBhIHdvcmtzcGFjZSBtYXkgb3ZlcnJpZGUgdGhlIHJvb3QgdG9rZW4sXG4gKiBuZXZlciB0aGUgcmV2ZXJzZS4gUGFzcyBgcm9vdERpclBhdGhgIGFzIHVuZGVmaW5lZCB0byByZWFkIHRoZSB3b3Jrc3BhY2UgYWxvbmUsIHNvIHRoYXRcbiAqIGAtLWluY2x1ZGUtcm9vdC1lbnY9ZmFsc2VgIGlzb2xhdGVzIHRoaXMgZmlsZSBmcm9tIHRoZSByb290IGp1c3QgYXMgaXQgZG9lcyB0aGUgY2FzY2FkZS5cbiAqIGBDTE9VREZMQVJFX0VOVmAgaXMgZHJvcHBlZDsgaXQgd291bGQgZG91YmxlLWFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ2xvdWRmbGFyZUVudkZpbGVzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgY3VycmVudERpclBhdGggb2YgbmV3IFNldChyb290RGlyUGF0aCA/IFtkaXJQYXRoLCByb290RGlyUGF0aF0gOiBbZGlyUGF0aF0pKSB7XG4gICAgY29uc3QgY2xvdWRmbGFyZUVudlBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICcuZW52LmNsb3VkZmxhcmUnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xvdWRmbGFyZUVudlBhdGgpKSBjb250aW51ZTtcbiAgICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBjbG91ZGZsYXJlRW52UGF0aCwgcHJvY2Vzc0Vudjoge30sIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICBpZiAoa2V5ID09PSAnQ0xPVURGTEFSRV9FTlYnKSBjb250aW51ZTtcbiAgICAgIGVudlZhcnNba2V5XSA/Pz0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFNlbGVjdCB0aGUgc2VjcmV0cyB0byBwdXNoIHRvIHRoZSBXb3JrZXIgZnJvbSB0aGUgZG90ZW52LWxvYWRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiBldmVyeSBleHBsaWNpdGx5IHNldCB2YWx1ZSDigJQgaW5jbHVkaW5nIGVtcHR5IHN0cmluZ3MsIHdoaWNoIGNsZWFyIHN0YWxlIHJlbW90ZSBzZWNyZXRzXG4gKiBzaW5jZSBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpcyBhZGRpdGl2ZSDigJQgZXhjZXB0IHdyYW5nbGVyIGB2YXJzYCAoYSBzZWNyZXQgbWF5XG4gKiBub3Qgc2hhcmUgYSBuYW1lIHdpdGggYSB2YXIpLCBkZXBsb3ktY29udHJvbCBrZXlzLCBhbmQgbG9jYWwgYGZpbGU6YCBEQVRBQkFTRV9VUkxzLlxuICogUmV0dXJucyB0aGUgcmVxdWlyZWQga2V5cyAoZnJvbSAuZW52LmV4YW1wbGUpIHRoYXQgYXJlIHN0aWxsIGVtcHR5IHNvIHRoZSBkZXBsb3kgY2FuXG4gKiBhYm9ydCBiZWZvcmUgYW55IHJlbW90ZSBtdXRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFdvcmtlclNlY3JldHMoXG4gIGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGNvbmZpZ1ZhcktleXM6IHN0cmluZ1tdLFxuICByZXF1aXJlZEtleXM6IHN0cmluZ1tdXG4pOiB7IG1pc3NpbmdLZXlzOiBzdHJpbmdbXTsgc2VjcmV0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHtcbiAgY29uc3QgY29uZmlnS2V5cyA9IG5ldyBTZXQoY29uZmlnVmFyS2V5cyk7XG4gIGNvbnN0IHNlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgLy8gTm8gcnVudGltZSB1bmRlZmluZWQgY2hlY2sgb24gYHZhbHVlYDogZW52VmFycyBpcyBidWlsdCBleGNsdXNpdmVseSBmcm9tIGRvdGVudi1wYXJzZWRcbiAgLy8gc3RyaW5ncywgYW5kIGV2ZXJ5IGNhbGxlci1zaWRlIG1lcmdlIGVpdGhlciBjb2FsZXNjZXMgd2l0aCBgPz8gJydgIG9yIGd1YXJkcyBhZ2FpbnN0XG4gIC8vIHVuZGVmaW5lZCBiZWZvcmUgYXNzaWduaW5nLCBzbyB0aGUgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB0eXBlIGhvbGRzIGF0IHJ1bnRpbWUgdG9vLlxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmIChjb25maWdLZXlzLmhhcyhrZXkpIHx8IGlzTm9uU2VjcmV0S2V5KGtleSkpIGNvbnRpbnVlO1xuICAgIGlmIChrZXkgPT09ICdEQVRBQkFTRV9VUkwnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ2ZpbGU6JykpIGNvbnRpbnVlO1xuICAgIHNlY3JldHNba2V5XSA9IHZhbHVlO1xuICB9XG4gIGNvbnN0IG1pc3NpbmdLZXlzID0gcmVxdWlyZWRLZXlzLmZpbHRlcigoa2V5KSA9PiAhY29uZmlnS2V5cy5oYXMoa2V5KSAmJiAhaXNOb25TZWNyZXRLZXkoa2V5KSAmJiAhZW52VmFyc1trZXldKTtcbiAgcmV0dXJuIHsgbWlzc2luZ0tleXMsIHNlY3JldHMgfTtcbn1cblxuLyoqXG4gKiBMaXN0IHRoZSBzZWNyZXQgbmFtZXMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSBkZXBsb3kgdGFyZ2V0IFdvcmtlci4gUmV0dXJucyB1bmRlZmluZWQgd2hlblxuICogdGhlIGxpc3RpbmcgZmFpbHMgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiB0aGUgV29ya2VyIG5vdCBleGlzdGluZyB5ZXQgKGZpcnN0IGRlcGxveSksIHNvXG4gKiB0aGUgY2FsbGVyIGNhbiBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGxpbWl0IGNoZWNrcyBpbnN0ZWFkIG9mIGJsb2NraW5nIGEgZGVwbG95IHRoYXRcbiAqIHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuIEZhaWxpbmcgY2xvc2VkIGluc3RlYWQgd291bGQgdHVybiBldmVyeSB0cmFuc2llbnQgbGlzdGluZ1xuICogZmFpbHVyZSAobmV0d29yaywgYSB0b2tlbiB3aXRob3V0IHNlY3JldC1yZWFkIHBlcm1pc3Npb24pIGludG8gYSBkZXBsb3kgYmxvY2tlciwgYW5kIOKAlCBzaW5jZVxuICogd3JhbmdsZXIgNC54IHJlcG9ydHMgYSBtaXNzaW5nIFdvcmtlciBvbmx5IHZpYSBhbiBlcnJvci1tZXNzYWdlIGhpbnQg4oCUIGFueSB1bnJlY29nbml6ZWRcbiAqIG5vdC1mb3VuZCBzaGFwZSB3b3VsZCB0aGVuIGJsb2NrIGZpcnN0IGRlcGxveXMgZW50aXJlbHk7IHRoaXMgcHJlZmxpZ2h0IG11c3Qgb25seSBldmVyIGFkZFxuICogZmFpbHVyZXMgdGhhdCB3cmFuZ2xlciBpdHNlbGYgd291bGQgcmFpc2UgYWZ0ZXIgdGhlIG1pZ3JhdGlvbnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RSZW1vdGVXb3JrZXJTZWNyZXROYW1lcyhcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogRGVwbG95Q29tbWFuZEFyZ3YsXG4gIHdyYW5nbGVyQ29uZmlnUGF0aDogc3RyaW5nLFxuICByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyxcbiAgZW52TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gIGNvbnN0IGxpc3RBcmdzID0gW1xuICAgICdzZWNyZXQnLFxuICAgICdsaXN0JyxcbiAgICAnLS1mb3JtYXQnLFxuICAgICdqc29uJyxcbiAgICAnLS1jb25maWcnLFxuICAgIHdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgICAuLi4ocmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBbJy0tZW52JywgZW52TmFtZV0gOiBbXSksXG4gIF07XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2xpc3RBcmdzLmpvaW4oJyAnKX1gKSk7XG4gIGxldCByZXQ7XG4gIHRyeSB7XG4gICAgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYygnd3JhbmdsZXInLCBsaXN0QXJncywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBgRmFpbGVkIHRvIHJ1biB3cmFuZ2xlciB0byBsaXN0IHJlbW90ZSBzZWNyZXRzOyBjaGVja2luZyBvbmx5IHRoZSBsb2NhbCBwYXlsb2FkIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGxpbWl0cy5cXG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChyZXQuc3RhdHVzID09PSAwKSB7XG4gICAgLy8gQ3V0IHRoZSBKU09OIGFycmF5IG91dCBvZiB0aGUgc3Vycm91bmRpbmcgb3V0cHV0OiB3cmFuZ2xlciBtYXkgcHJpbnQgaXRzIGJhbm5lciBhbmRcbiAgICAvLyBcIk11bHRpcGxlIGVudmlyb25tZW50c1wiIHdhcm5pbmdzIGFyb3VuZCB0aGUgcGF5bG9hZC5cbiAgICBjb25zdCBqc29uU3RhcnQgPSByZXQuc3Rkb3V0LmluZGV4T2YoJ1snKTtcbiAgICBjb25zdCBqc29uRW5kID0gcmV0LnN0ZG91dC5sYXN0SW5kZXhPZignXScpO1xuICAgIGlmIChqc29uU3RhcnQgIT09IC0xICYmIGpzb25FbmQgIT09IC0xICYmIGpzb25TdGFydCA8IGpzb25FbmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmV0LnN0ZG91dC5zbGljZShqc29uU3RhcnQsIGpzb25FbmQgKyAxKSkgYXMgeyBuYW1lPzogdW5rbm93biB9W107XG4gICAgICAgIHJldHVybiBwYXJzZWQubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkuZmlsdGVyKChuYW1lKTogbmFtZSBpcyBzdHJpbmcgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHdhcm5pbmcgYmVsb3cuXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKC9cXFtjb2RlOiAxMDAoMDd8OTApXFxdfElmIHRoaXMgaXMgYSBuZXcgV29ya2VyLy50ZXN0KHJldC5zdGRvdXQgKyByZXQuc3RkZXJyKSkge1xuICAgIC8vIFRoZSBXb3JrZXIgZG9lcyBub3QgZXhpc3QgeWV0LCBzbyBhIGZpcnN0IGRlcGxveSBpbmhlcml0cyBub3RoaW5nLiBXcmFuZ2xlciA0LnggY2F0Y2hlc1xuICAgIC8vIHRoZSBDbG91ZGZsYXJlIEFQSSBlcnJvcnMgMTAwMDcgKHdvcmtlcnMuYXBpLmVycm9yLnNlcnZpY2Vfbm90X2ZvdW5kKSBhbmQgMTAwOTBcbiAgICAvLyAod29ya2Vycy5hcGkuZXJyb3Iuc2NyaXB0X25vdF9mb3VuZCkgYW5kIHJldGhyb3dzIHRoZW0gYXMgYSBVc2VyRXJyb3IgY29udGFpbmluZyB0aGVcbiAgICAvLyAnSWYgdGhpcyBpcyBhIG5ldyBXb3JrZXIsIHJ1biBgd3JhbmdsZXIgZGVwbG95YCBmaXJzdCcgaGludCB3aXRob3V0IHRoZSBudW1lcmljIGNvZGUsXG4gICAgLy8gc28gbWF0Y2ggYm90aCBzaGFwZXMuXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnNvbGUud2FybihcbiAgICBjaGFsay55ZWxsb3coXG4gICAgICBgRmFpbGVkIHRvIGxpc3QgdGhlIHJlbW90ZSBXb3JrZXIgc2VjcmV0czsgY2hlY2tpbmcgb25seSB0aGUgbG9jYWwgcGF5bG9hZCBhZ2FpbnN0IENsb3VkZmxhcmUncyBsaW1pdHMuXFxuJHsocmV0LnN0ZGVyciB8fCByZXQuc3Rkb3V0KS50cmltKCl9YFxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdGUgc2VjcmV0cyB0aGF0IHN0YXkgYXR0YWNoZWQgdG8gdGhlIG5ldyB2ZXJzaW9uOiBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpc1xuICogYWRkaXRpdmUsIHNvIGV2ZXJ5IHJlbW90ZSBzZWNyZXQgdGhlIG91dGdvaW5nIHBheWxvYWQgZG9lcyBub3Qgb3ZlcndyaXRlIGtlZXBzIGNvdW50aW5nXG4gKiBhZ2FpbnN0IENsb3VkZmxhcmUncyBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgbGltaXQg4oCUIGV4Y2VwdCBuYW1lcyB0aGF0IGFuIGVmZmVjdGl2ZSB2YXIgb3JcbiAqIGJpbmRpbmcgcmVwbGFjZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgcmVtb3RlU2VjcmV0TmFtZXM6IHN0cmluZ1tdLFxuICBvdXRnb2luZ1NlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGVmZmVjdGl2ZVZhcktleXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBiaW5kaW5nTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlcGxhY2VkTmFtZXMgPSBuZXcgU2V0KFsuLi5lZmZlY3RpdmVWYXJLZXlzLCAuLi5iaW5kaW5nTmFtZXNdKTtcbiAgcmV0dXJuIHJlbW90ZVNlY3JldE5hbWVzLmZpbHRlcigobmFtZSkgPT4gIU9iamVjdC5oYXNPd24ob3V0Z29pbmdTZWNyZXRzLCBuYW1lKSAmJiAhcmVwbGFjZWROYW1lcy5oYXMobmFtZSkpO1xufVxuXG4vKipcbiAqIFJlYWRpbmcgYmluRXhpc3RzIHByZXBlbmRzIG5vZGVfbW9kdWxlcy8uYmluIGRpcmVjdG9yaWVzIHRvIHByb2plY3QuZW52LlBBVEgsXG4gKiBzbyB0aGUgZGlyZWN0IChub24tc2hlbGwpIHdyYW5nbGVyIHNwYXducyByZXNvbHZlIHRoZSBsb2NhbCBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBpZiAoIXByb2plY3QuYmluRXhpc3RzKSB7XG4gICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnbm9kZV9tb2R1bGVzLy5iaW4gbm90IGZvdW5kOyByZWx5aW5nIG9uIFBBVEggdG8gcmVzb2x2ZSB3cmFuZ2xlci4nKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7XG4gIGhhc1Byb2plY3RGbm94Q29uZmlnLFxuICByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzLFxuICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmludGVyZmFjZSBQYXJzZWREb3RlbnZBcmdzIHtcbiAgY29tbWFuZDogc3RyaW5nW107XG59XG5cbmNvbnN0IHNodXRkb3duU2lnbmFscyA9IG5ldyBTZXQ8Tm9kZUpTLlNpZ25hbHM+KFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKTtcblxuZXhwb3J0IGNvbnN0IGRvdGVudkNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdkb3RlbnYgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ0xvYWQgLmVudiBmaWxlcyBhbmQgcnVuIGEgY29tbWFuZC4nLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+IHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHJ1blBhcnNlZERvdGVudkNvbW1hbmQoZ2V0UGFyc2VkRG90ZW52QXJnc0Zyb21ZYXJncyhhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5QYXJzZWREb3RlbnZDb21tYW5kKHsgY29tbWFuZCB9OiBQYXJzZWREb3RlbnZBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb21tYW5kLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1VzYWdlOiB3YiBkb3RlbnYgLS0gPGNvbW1hbmQ+IFthcmdzLi4uXScpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGN3ZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKTtcbiAgcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkKTtcbiAgY29uc3QgYmVycnlCaW5Gb2xkZXJQYXRoID0gcHJvY2Vzcy5lbnYuQkVSUllfQklOX0ZPTERFUjtcbiAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgLy8gU3RyaXBwaW5nIHlhcm4ncyBlbnZpcm9ubWVudCBhbHNvIHJlbW92ZXMgaXRzIHRlbXBvcmFyeSBiaW4gZm9sZGVyIOKAlCB0aGUgT05MWSBwbGFjZVxuICAvLyB5YXJuIEJlcnJ5IGV4cG9zZXMgZGVwZW5kZW5jeSBleGVjdXRhYmxlcyDigJQgc28gcmVzdG9yZSB0aGUgcHJvamVjdCdzIG93blxuICAvLyBub2RlX21vZHVsZXMvLmJpbiBkaXJlY3RvcmllcyB0byBrZWVwIGJhcmUgYmluYXJ5IG5hbWVzIHJlc29sdmFibGUuIFBsdWcnbidQbGF5IGluc3RhbGxzXG4gIC8vIGNyZWF0ZSBubyBub2RlX21vZHVsZXMgYXQgYWxsOyB0aGUgdGVtcG9yYXJ5IGJpbiBmb2xkZXIgaXMgdGhlbiB0aGUgc29sZSBzb3VyY2Ugb2ZcbiAgLy8gZGVwZW5kZW5jeSBleGVjdXRhYmxlcywgc28gcmVzdG9yZSBpdCBpbnN0ZWFkLlxuICAvLyBUaGUgdGVtcG9yYXJ5IGZvbGRlciBpcyBkZWxpYmVyYXRlbHkgTk9UIHJlc3RvcmVkIHdoZW4gLmJpbiBkaXJlY3RvcmllcyBleGlzdDogaXQgYWxzb1xuICAvLyBjb250YWlucyBub2RlL3lhcm4gc2hpbXMsIGFuZCBhIGxlYWtlZCBub2RlIHNoaW0gd291bGQgdmlvbGF0ZSB3YidzIHJlYWwtTm9kZSBndWFyYW50ZWVcbiAgLy8gZm9yIHRvb2xzIGxpa2Ugd3JhbmdsZXIvdmluZXh0LiBDaGlsZCBgeWFybmAgaW52b2NhdGlvbnMgc3RheSByZXNvbHZhYmxlIHRocm91Z2ggdGhlXG4gIC8vIGxhdW5jaGVyIG9uIHRoZSBiYXNlIFBBVEggKG1pc2UvY29yZXBhY2spLCB3aGljaCBldmVyeSBzdXBwb3J0ZWQgZW52aXJvbm1lbnQgaGFzIOKAlFxuICAvLyBub3RoaW5nIGNvdWxkIGhhdmUgc3RhcnRlZCBgeWFybiBydW5gL2B3YiBkb3RlbnZgIHdpdGhvdXQgaXQuXG4gIGlmICghcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKGN3ZCwgcHJvY2Vzcy5lbnYpICYmIGJlcnJ5QmluRm9sZGVyUGF0aCkge1xuICAgIHByb2Nlc3MuZW52LlBBVEggPSBwcm9jZXNzLmVudi5QQVRIID8gYCR7YmVycnlCaW5Gb2xkZXJQYXRofToke3Byb2Nlc3MuZW52LlBBVEh9YCA6IGJlcnJ5QmluRm9sZGVyUGF0aDtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oY29tbWFuZFswXSEsIGNvbW1hbmQuc2xpY2UoMSksIHtcbiAgICBjd2QsXG4gICAgZW52OiBwcm9jZXNzLmVudixcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbiAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH0pO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICBjb25zdCBzaWduYWxIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY2hpbGQua2lsbChzaWduYWwpO1xuICAgIH07XG4gICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gIH1cbiAgY2hpbGQub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIC8vIFJlLXJhaXNlIGV2ZW4gZm9yIGZvcndhcmRlZCBzaHV0ZG93biBzaWduYWxzIHNvIGNhbGxlcnMgb2JzZXJ2ZSB0aGUgY29udmVudGlvbmFsXG4gICAgICAvLyBzaWduYWwgZXhpdCBzdGF0dXMgKGUuZy4gMTMwIGZvciBTSUdJTlQpIGluc3RlYWQgb2YgYSBtaXNsZWFkaW5nIHN1Y2Nlc3MuXG4gICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDEpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VkRG90ZW52QXJnc0Zyb21ZYXJncyhhcmd2OiBBcmd1bWVudHNDYW1lbENhc2UpOiBQYXJzZWREb3RlbnZBcmdzIHtcbiAgcmV0dXJuIHtcbiAgICBjb21tYW5kOiBbXG4gICAgICAuLi4oKGFyZ3YuYXJncyBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAgIC4uLigoYXJndlsnLS0nXSBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICBdLFxuICB9O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZml4VGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFxuICAgICF2YWx1ZSB8fFxuICAgIFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXS5pbmNsdWRlcyh2YWx1ZSkgfHxcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8XG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgPT09ICd0cnVlJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5lcnJvcihcbiAgICBgV0JfRU5WIG11c3QgYmUgb25lIG9mIGRldmVsb3BtZW50LCB0ZXN0LCBzdGFnaW5nLCBvciBwcm9kdWN0aW9uLCBidXQgaXMgXCIke3ZhbHVlfVwiLiBgICtcbiAgICAgIGBGaXggJHtmaXhUYXJnZXR9LCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suYFxuICApO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbi8vIE5PVEU6IGB3YiBkb3RlbnZgIGRlbGliZXJhdGVseSBza2lwcyBQcm9qZWN0LmVudidzIGZ1bGwgdmFsaWRhdGlvbjogaXQgaXMgYSBnZW5lcmljIHJ1bm5lciBhbHNvXG4vLyB1c2VkIGJlZm9yZSBlbnYgc291cmNlcyBleGlzdCAoYm9vdHN0cmFwKSBhbmQgbXVzdCBub3QgZmFpbCBmYXN0IGZvciByZXBvc2l0b3JpZXMgdGhhdCBoYXZlIG5vdFxuLy8gYWRvcHRlZCB0aGUgb3JnIGVudiBzdGFuZGFyZC4gQSBOT04tRU1QVFkgV0JfRU5WIGlzIHN0aWxsIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzdGFuZGFyZCBtb2Rlcyxcbi8vIHRob3VnaCDigJQgYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gIHdvdWxkIG90aGVyd2lzZSBzaWxlbnRseSBzZWxlY3QgdGhlIGJhc2UgKGRldmVsb3BtZW50KSB2YWx1ZXMuXG5mdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2Q6IHN0cmluZyk6IHZvaWQge1xuICAvLyBUaGUgbW9kZSBpcyBGT1JDRUQgb25seSB3aGVuIFdCX0VOViBpcyBleHBsaWNpdGx5IGV4cG9ydGVkOyBpdCBkcml2ZXMgdGhlIGZvcmNlZC1tb2RlIG92ZXJyaWRlXG4gIC8vIGJlbG93IGFuZCB0aGUgdmFsaWRhdGlvbiBhdCB0aGUgZW5kLlxuICBjb25zdCBtb2RlID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAvLyBUd28gc2VsZWN0b3JzLCBib3RoIGRlZmF1bHRpbmcgdG8gZGV2ZWxvcG1lbnQgbGlrZSB3YidzIG1haW4gbG9hZGVyIChgV0JfRU5WIHx8IE5PREVfRU5WIHx8XG4gIC8vICdkZXZlbG9wbWVudCdgLCBzZWUgcmVhZEVudmlyb25tZW50VmFyaWFibGVzKSBzbyBhIHJlcG8ga2VlcGluZyBkZXYtb25seSBzZWNyZXRzIGluXG4gIC8vIGBbcHJvZmlsZXMuZGV2ZWxvcG1lbnQuc2VjcmV0c11gIGxvYWRzIHRoZW0gd2hlbiBXQl9FTlYgaXMgdW5zZXQgaW5zdGVhZCBvZiBvbmx5IHRoZSBiYXNlIHRhYmxlOlxuICAvLyAgIC0gZW52Q2FzY2FkZSBwaWNrcyB0aGUgYC5lbnYuPGVudkNhc2NhZGU+YCBmaWxlcy4gSXQgbXVzdCBOT1QgY29uc3VsdCBGTk9YX1BST0ZJTEUg4oCUIHRoYXQgaXMgYVxuICAvLyAgICAgZm5veC1vbmx5IHNlbGVjdG9yLCBhbmQgbGV0dGluZyBpdCByZWRpcmVjdCBhIGxlZ2FjeSBgLmVudmAtb25seSBwcm9qZWN0J3MgY2FzY2FkZSB3b3VsZCBsb2FkXG4gIC8vICAgICB0aGUgd3JvbmcgZmlsZXMuXG4gIC8vICAgLSBmbm94Q2FzY2FkZSBwaWNrcyB0aGUgZm5veCBgLS1wcm9maWxlYCBhbmQgZ2F0ZXMgdGhlIFdCX0VOViBjaGVjayBiZWxvdy4gSXQgYWRkaXRpb25hbGx5IGhvbm9yc1xuICAvLyAgICAgYW4gZXhwbGljaXQgRk5PWF9QUk9GSUxFLCBiZWNhdXNlIGZub3ggaG9ub3JzIGl0IGFuZCBgd2IgZG90ZW52YCB3aXRob3V0IFdCX0VOViBpcyBkb2N1bWVudGVkXG4gIC8vICAgICB0byBhcyB3ZWxsIChzZWUgcnVuRm5veEV4cG9ydCdzIGlnbm9yZVByb2ZpbGVFbnZWYXIgbm90ZSkuXG4gIC8vIE5PREVfRU5WIGlzIHJlYWQgdGhyb3VnaCB0aGUgYHJ1bnRpbWVFbnZgIGFsaWFzLCBuZXZlciBhcyB0aGUgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCBtZW1iZXJcbiAgLy8gZXhwcmVzc2lvbiB0aGF0IHRoZSBidW5kbGVyIGlubGluZXMgdG8gJ3Byb2R1Y3Rpb24nICh3aGljaCB3b3VsZCB3cm9uZ2x5IHNlbGVjdCBwcm9kdWN0aW9uKS5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBlbnZDYXNjYWRlID0gbW9kZSB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG4gIGNvbnN0IGZub3hDYXNjYWRlID0gbW9kZSB8fCBydW50aW1lRW52LkZOT1hfUFJPRklMRSB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG4gIGNvbnN0IHJlYWRFbnZGaWxlID0gKGZpbGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+XG4gICAgY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKGN3ZCwgZmlsZU5hbWUpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAvLyBNb2RlLXNwZWNpZmljIHNvdXJjZXMgZHJpdmUgdGhlIGZvcmNlZC1tb2RlIG92ZXJyaWRlIGJlbG93IChvbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgbW9kZSBpcyBmb3JjZWQpLlxuICBjb25zdCBtb2RlVmFycyA9IG1vZGUgPyB7IC4uLnJlYWRFbnZGaWxlKGAuZW52LiR7bW9kZX1gKSwgLi4ucmVhZEVudkZpbGUoYC5lbnYuJHttb2RlfS5sb2NhbGApIH0gOiB7fTtcbiAgLy8gTWlycm9yIHRoZSBzaGFyZWQgY2FzY2FkZSdzIHByZWNlZGVuY2U6IC5lbnYuPGM+LmxvY2FsID4gLmVudi5sb2NhbCA+IC5lbnYuPGM+ID4gLmVudiAoYyA9IGVudkNhc2NhZGUpLlxuICBjb25zdCBkb3RlbnZWYXJzID0ge1xuICAgIC4uLnJlYWRFbnZGaWxlKCcuZW52JyksXG4gICAgLi4ucmVhZEVudkZpbGUoYC5lbnYuJHtlbnZDYXNjYWRlfWApLFxuICAgIC4uLnJlYWRFbnZGaWxlKCcuZW52LmxvY2FsJyksXG4gICAgLi4ucmVhZEVudkZpbGUoYC5lbnYuJHtlbnZDYXNjYWRlfS5sb2NhbGApLFxuICB9O1xuICAvLyBXQl9FTlYgaW4gcHJvY2Vzcy5lbnYgbWVhbnMgdGhlIG1vZGUgaXMgZXhwbGljaXRseSBmb3JjZWQsIHNvIHZhbHVlcyBmcm9tIHRoZSBtb2RlJ3Mgb3duXG4gIC8vIHNvdXJjZXMgKC5lbnYuPG1vZGU+Wy5sb2NhbF0gYW5kIHRoZSBmbm94IHByb2ZpbGUpIHdpbiBvdmVyIHZhcmlhYmxlcyBpbmhlcml0ZWQgZnJvbSB0aGVcbiAgLy8gcGFyZW50IHNoZWxsIOKAlCBleGNlcHQgb24gQ0ksIHdoZXJlIGluamVjdGVkIGVudiB2YXJzIG11c3Qga2VlcCBvdmVycmlkaW5nIGNvbW1pdHRlZCBmaWxlc1xuICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuXG4gIGNvbnN0IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiA9ICEhbW9kZSAmJiAhaXNDSShwcm9jZXNzLmVudi5DSSk7XG4gIC8vIGZub3gudG9tbCBpcyB0aGUgY29tbWl0dGVkLCBlbmNyeXB0ZWQgZXF1aXZhbGVudCBvZiAuZW52IGZpbGVzOyBsb2NhbCAuZW52IGZpbGVzIHN0aWxsIHdpbiBvdmVyIGl0LlxuICBjb25zdCBbZm5veFZhcnNdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGZub3hDYXNjYWRlLCBkb3RlbnZWYXJzLCB7IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiB9KTtcbiAgY29uc3QgcGFyc2VkID0geyAuLi5mbm94VmFycywgLi4uZG90ZW52VmFycyB9O1xuICAvLyBFeHBhbmQgJHsuLi59IHJlZmVyZW5jZXMgYWdhaW5zdCBleHBvcnRlZCB2YXJpYWJsZXMgd2hvc2UgRklMRSB2YWx1ZSBsb3NlcyB0byB0aGUgc2hlbGxcbiAgLy8gKG1pcnJvcmluZyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMnIGVmZmVjdGl2ZS12YWx1ZSBzZW1hbnRpY3MpOiBhIHJlZmVyZW5jZSBtdXN0IHJlc29sdmUgdG9cbiAgLy8gdGhlIHZhbHVlIHRoZSBjaGlsZCB3aWxsIGFjdHVhbGx5IHNlZSwgc28gYSBzaGVsbC1zaGFkb3dlZCBrZXkgZXhwYW5kcyB0byB0aGUgc2hlbGwgdmFsdWVcbiAgLy8gd2hpbGUgYSB3aW5uaW5nIGZpbGUvb3ZlcnJpZGUgdmFsdWUgZXhwYW5kcyB0byB0aGUgZmlsZSB2YWx1ZS5cbiAgY29uc3QgZmlsZVZhbHVlV2lucyA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICAhKGtleSBpbiBwcm9jZXNzLmVudikgfHwgKG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiAoa2V5IGluIG1vZGVWYXJzIHx8IGtleSBpbiBmbm94VmFycykpO1xuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBleHBvcnRlZCB2YWx1ZXMgc3Vic3RpdHV0ZSBsaXRlcmFsbHkgKHBhJHdvcmQgc3RheXMgcGEkd29yZCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gcGFyc2VkICYmIGZpbGVWYWx1ZVdpbnMoa2V5KSkpIHtcbiAgICAgIHJlZmVyZW5jZUVudltrZXldID0gdmFsdWUucmVwbGFjZUFsbCgnJCcsIFN0cmluZy5yYXdgXFwkYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQsIHByb2Nlc3NFbnY6IHJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gcGFyc2VkO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzIHJldHVybnMgYSBwcm9jZXNzLmVudi1zaGFkb3dlZCBrZXkgb25seSB3aGVuIHRoZSBmb3JjZWRcbiAgICAvLyBwcm9maWxlIG92ZXJyaWRlcyBpdCwgc28gZm5veC1wcm92aWRlZCBrZXlzIGNvdW50IGFzIG1vZGUtc3BlY2lmaWMgaGVyZS5cbiAgICBpZiAoIShrZXkgaW4gbW9kZVZhcnMgfHwga2V5IGluIGZub3hWYXJzKSB8fCBwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkgY29udGludWU7XG5cbiAgICBpZiAobW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nOiAke2tleX0gaW4gdGhlIFwiJHttb2RlfVwiIG1vZGUncyBlbnYgc291cmNlcyBvdmVycmlkZXMgdGhlIHZhbHVlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgYmVjYXVzZSBXQl9FTlYgaXMgZXhwbGljaXRseSBzZXQuYFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gT24gQ0ksIGluaGVyaXRlZCB2YXJpYWJsZXMgaW50ZW50aW9uYWxseSB3aW4gKHdvcmtmbG93cyBkZWxpYmVyYXRlbHkgaW5qZWN0IGVudiB2YXJzIHRoYXRcbiAgICAvLyBvdmVycmlkZSB0aGUgY29tbWl0dGVkIGZpbGVzKTsgdGhpcyBpcyB0aGUgZGVzaWduZWQgYmVoYXZpb3IsIHNvIG5vIHdhcm5pbmcgaXMgZW1pdHRlZC5cbiAgfVxuICAvLyBWYWxpZGF0ZSBvbmx5IEFGVEVSIGFwcGx5aW5nIHRoZSBzb3VyY2VzLCBzbyBhIFdCX1NLSVBfRU5WX0NIRUNLIGRlZmluZWQgaW4gYW4gZW52IEZJTEUgaXNcbiAgLy8gaG9ub3JlZDogYm90aCB0aGUgY2FwdHVyZWQgZXhwb3J0ZWQgbW9kZSAoaXQgc2VsZWN0ZWQgdGhlIGNhc2NhZGUpIGFuZCB0aGUgRklOQUwgdmFsdWUgdGhlXG4gIC8vIGNoaWxkIHdpbGwgc2VlIOKAlCB0aGUgZW52IHNvdXJjZXMgbWF5IGRlZmluZSBhIGJyb2tlbiBXQl9FTlYgKGUuZy4gYC5lbnZgIHdpdGhcbiAgLy8gYFdCX0VOVj1wcm9kY3V0aW9uYCksIGFuZCBhIGZvcmNlZCBtb2RlJ3MgZmlsZXMgbWF5IGV2ZW4gb3ZlcnJpZGUgYSBWQUxJRCBleHBvcnRlZCB2YWx1ZS5cbiAgdmFsaWRhdGVTdGFuZGFyZFdiRW52KG1vZGUsICd0aGUgZXhwb3J0ZWQgdmFyaWFibGUnKTtcbiAgdmFsaWRhdGVTdGFuZGFyZFdiRW52KHByb2Nlc3MuZW52LldCX0VOViwgJ3RoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZScpO1xuICAvLyBUaGUgc2VsZWN0ZWQgZW52aXJvbm1lbnQgaXMgd2hhdCBhbiBlbnYgc291cmNlIHNpbGVudGx5IHJlc29sdmluZyBXQl9FTlYgdG8gYSBESUZGRVJFTlQgdmFsdWUgbXVzdFxuICAvLyBhZ3JlZSB3aXRoLCBlbHNlIHRoZSBjaGlsZCBydW5zIGxhYmVsZWQgb25lIGVudmlyb25tZW50IHdoaWxlIGNhcnJ5aW5nIGFub3RoZXIncyBzZWNyZXRzLiBUaGVcbiAgLy8gZXhwZWN0YXRpb24gaXMgYGZub3hDYXNjYWRlYCBvbmx5IHdoZW4gYSBmbm94IGNvbmZpZyBwYXJ0aWNpcGF0ZXMgKGl0cyBwcm9maWxlIHByb3ZpZGVzIFdCX0VOViBpbiBhXG4gIC8vIGNvbXBsaWFudCByZXBvKTsgaW4gYSBsZWdhY3kgYC5lbnZgLW9ubHkgcHJvamVjdCBGTk9YX1BST0ZJTEUgaXMgaXJyZWxldmFudCwgc28gdGhlIGV4cGVjdGF0aW9uIGlzXG4gIC8vIGBlbnZDYXNjYWRlYC4gVGhpcyBjb3ZlcnMgYm90aCBhIGZvcmNlZCBgLmVudi5wcm9kdWN0aW9uYCBjb250YWluaW5nIGBXQl9FTlY9ZGV2ZWxvcG1lbnRgIGFuZCB0aGVcbiAgLy8gZGVmYXVsdC1kZXZlbG9wbWVudCBwYXRoIChgLmVudi5kZXZlbG9wbWVudGAsIHJlYWQgZXZlbiB3aGVuIFdCX0VOViBpcyB1bnNldCwgY29udGFpbmluZ1xuICAvLyBgV0JfRU5WPXByb2R1Y3Rpb25gKSwgY29tcGFyaW5nIGFnYWluc3QgdGhlIHNlbGVjdGVkIGNhc2NhZGUgcmF0aGVyIHRoYW4ganVzdCB0aGUgZm9yY2VkIGBtb2RlYC5cbiAgLy8gT25seSBhIFNUQU5EQVJEIGNhc2NhZGUgaXMgZW5mb3JjZWQgKG1pcnJvcmluZyBQcm9qZWN0LmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudik6IGEgY3VzdG9tIHN1ZmZpeFxuICAvLyBzdWNoIGFzIGBOT0RFX0VOVj1xYWAgbGVnaXRpbWF0ZWx5IHNlbGVjdHMgYC5lbnYucWFgIHdoaWxlIFdCX0VOViBzdGF5cyBhIHN0YW5kYXJkIG1vZGUuXG4gIGNvbnN0IGV4cGVjdGVkQ2FzY2FkZSA9IGhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZCkgPyBmbm94Q2FzY2FkZSA6IGVudkNhc2NhZGU7XG4gIGlmIChcbiAgICBwcm9jZXNzLmVudi5XQl9FTlYgJiZcbiAgICBbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10uaW5jbHVkZXMoZXhwZWN0ZWRDYXNjYWRlKSAmJlxuICAgIHByb2Nlc3MuZW52LldCX0VOViAhPT0gZXhwZWN0ZWRDYXNjYWRlICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgIT09ICcxJyAmJlxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLICE9PSAndHJ1ZSdcbiAgKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBXQl9FTlYgcmVzb2x2ZXMgdG8gXCIke3Byb2Nlc3MuZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke2V4cGVjdGVkQ2FzY2FkZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICBgRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgZW52IHNvdXJjZXMsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgRklMRV9TQ0hFTUEsIGdldEZpbGVEYXRhYmFzZVVybFBhdGggfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuLyoqIFdoZXJlIHRoZSBQcmlzbWEgU1FMaXRlIGRhdGFiYXNlIGlzIG1vdW50ZWQsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS4gKi9cbmNvbnN0IGRhdGFiYXNlRGlyUGF0aCA9ICdwcmlzbWEvbW91bnQnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5jb25zdCBQT1NTSUJMRV9QUklTTUFfUEFUSFMgPSBbXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG5dO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0oXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGRhdGFiYXNlRGlyUGF0aDtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBnZW5lcmF0ZShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gWydQUklTTUEgZ2VuZXJhdGUnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBkYXRhYmFzZURpclBhdGg7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgbHMgLWFobCAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGRhdGFiYXNlRGlyUGF0aDtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfSAmJiAke3RoaXMuZ2VuZXJhdGUocHJvamVjdCl9ICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGRhdGFiYXNlRGlyUGF0aDtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uc2VlZCkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgICAgIGlmIChiYXNlRGlyKSB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIsIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8gJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnUGF0aCkgcmV0dXJuIGAtY29uZmlnIFwiJHtjb25maWdQYXRofVwiYDtcblxuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgUFJJU01BIGRiIGV4ZWN1dGUgLS1zdGRpbiAtLXVybCBcIiR7RklMRV9TQ0hFTUF9JHtkYlBhdGh9XCI7IGZpICYmIHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSpgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhd0RiUGF0aCA9IGdldEZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghcmF3RGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShyYXdEYlBhdGgpXG4gICAgPyByYXdEYlBhdGhcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIgPz8gJy4nLCByYXdEYlBhdGgpO1xuXG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERyaXp6bGVDb25maWcsIHdyYXBXaXRoRHJpenpsZUNvbmZpZ0RpciB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGdlbkNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZ2VuLWNvZGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIGNvZGUgZm9yIHRoZSBjdXJyZW50IHByb2plY3QnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbkNvZGVUYXJnZXRzID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAgIC5tYXAoKHByb2plY3QpID0+ICh7IHByb2plY3QsIHNjcmlwdHM6IGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3QpIH0pKVxuICAgICAgLmZpbHRlcigoeyBzY3JpcHRzIH0pID0+IHNjcmlwdHMubGVuZ3RoID4gMCk7XG4gICAgaWYgKGdlbkNvZGVUYXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdObyBjb2RlIGdlbmVyYXRpb24gbmVlZGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QsIHNjcmlwdHMgfSBvZiBnZW5Db2RlVGFyZ2V0cykge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiZ2VuLWNvZGVcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgLy8gRmlyc3Q6IGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCBpcyBnaXRpZ25vcmVkLCBzbyBvbiBhIGZyZXNoIGNoZWNrb3V0IGl0IGRvZXMgbm90IGV4aXN0IHlldCxcbiAgLy8gYW5kIHRoZSBnZW5lcmF0b3JzIGJlbG93IHR5cGUtY2hlY2sgYWdhaW5zdCB0aGUgQ2xvdWRmbGFyZSBgRW52YCBpdCBkZWNsYXJlcy5cbiAgY29uc3Qgd3JhbmdsZXJUeXBlc1NjcmlwdCA9IGdldFdyYW5nbGVyVHlwZXNTY3JpcHQocHJvamVjdCk7XG4gIGlmICh3cmFuZ2xlclR5cGVzU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKHdyYW5nbGVyVHlwZXNTY3JpcHQpO1xuICB9XG4gIGNvbnN0IHByaXNtYUdlbmVyYXRlU2NyaXB0ID0gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdCk7XG4gIGlmIChwcmlzbWFHZW5lcmF0ZVNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChwcmlzbWFHZW5lcmF0ZVNjcmlwdCk7XG4gIH1cbiAgY29uc3QgY2hha3JhVHlwZWdlblNjcmlwdCA9IGdldENoYWtyYVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKGNoYWtyYVR5cGVnZW5TY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goY2hha3JhVHlwZWdlblNjcmlwdCk7XG4gIH1cbiAgY29uc3QgZHJpenpsZUNoZWNrU2NyaXB0ID0gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3QpO1xuICBpZiAoZHJpenpsZUNoZWNrU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGRyaXp6bGVDaGVja1NjcmlwdCk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzU2NyaXB0ID0gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3QpO1xuICBpZiAoZ2VuSTE4blRzU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGdlbkkxOG5Uc1NjcmlwdCk7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbi8qKlxuICogYFlBUk4gd3JhbmdsZXJgIHJhdGhlciB0aGFuIGBidW54IHdyYW5nbGVyYDogd3JhbmdsZXIgbmVlZHMgcmVhbCBOb2RlLmpzLCBhbmQgYGJ1bnhgIG1heSByZXNvbHZlXG4gKiBhIHZlcnNpb24gb3RoZXIgdGhhbiB0aGUgbG9ja2ZpbGUncy4gRmxhZ3MgYXJlIGRlbGliZXJhdGVseSBvbWl0dGVkIOKAlCBgLS1lbnYtZmlsZWAgaXMgYSBsZWdhY3lcbiAqIGAuZW52YCBpZGlvbSB0aGF0IGZub3ggcmVwb3NpdG9yaWVzIGhhdmUgbm8gZmlsZSBmb3IsIGFuZCBgLS1zdHJpY3QtdmFyc2AgaXMgYSBwZXItcmVwb3NpdG9yeVxuICogdHlwZS1zdHJpY3RuZXNzIGNob2ljZSB0aGF0IGJlbG9uZ3MgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZywgbm90IGluIGV2ZXJ5IGNhbGxlci5cbiAqL1xuZnVuY3Rpb24gZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0LmdlbmVyYXRlc1dvcmtlclR5cGVzKSByZXR1cm47XG4gIHJldHVybiAnWUFSTiB3cmFuZ2xlciB0eXBlcyc7XG59XG5cbmZ1bmN0aW9uIGdldEdlbkkxOG5Uc1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSB7XG4gICAgaWYgKCFwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHJldHVybjtcbiAgICByZXR1cm4gJ1lBUk4gcnVuIGdlbi1pMThuLXRzJztcbiAgfVxuICBpZiAoXG4gICAgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdnZW4taTE4bi10cycpICYmXG4gICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnaTE4bicpKVxuICApIHtcbiAgICByZXR1cm4gJ1lBUk4gZ2VuLWkxOG4tdHMgLWkgaTE4biAtbyBzcmMvX19nZW5lcmF0ZWRfXy9pMThuLnRzIC1kIGphLUpQJztcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUdlbmVyYXRlU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzUHJpc21hKSByZXR1cm47XG4gIGlmICghaGFzUHJpc21hU2NoZW1hKHByb2plY3QpKSByZXR1cm47XG4gIHJldHVybiBwcmlzbWFTY3JpcHRzLmdlbmVyYXRlKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBnZXRDaGFrcmFTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdAY2hha3JhLXVpL2NsaScpKSByZXR1cm47XG4gIGlmICghZmlsZUV4aXN0cyhwcm9qZWN0LCAnc3JjL3RoZW1lLnRzJykpIHJldHVybjtcbiAgcmV0dXJuICdZQVJOIGNoYWtyYSB0eXBlZ2VuIHNyYy90aGVtZS50cyAtLXN0cmljdCc7XG59XG5cbmZ1bmN0aW9uIGdldERyaXp6bGVDaGVja1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc0RyaXp6bGUpIHJldHVybjtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIGlmICghY29uZmlnKSByZXR1cm47XG4gIC8vIEtlZXAgdGhlIGV4cGxpY2l0IC0tY29uZmlnIGJlY2F1c2UgZHJpenpsZS1raXQncyBkZWZhdWx0IGxvb2t1cCBtaXNzZXMgc29tZSBleHRlbnNpb25zIChlLmcuIC5tdHMpLlxuICByZXR1cm4gYCR7d3JhcFdpdGhEcml6emxlQ29uZmlnRGlyKHByb2plY3QsIGBZQVJOIGRyaXp6bGUta2l0IGNoZWNrIC0tY29uZmlnICR7Y29uZmlnLmZpbGVOYW1lfWApfSB8fCB0cnVlYDtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGhhc1ByaXNtYVNjaGVtYShwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ3ByaXNtYS9zY2hlbWEucHJpc21hJywgJ3ByaXNtYS9zY2hlbWEnLCAnZGIvc2NoZW1hLnByaXNtYSddLnNvbWUoKGZpbGVQYXRoKSA9PlxuICAgIGZpbGVFeGlzdHMocHJvamVjdCwgZmlsZVBhdGgpXG4gICk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAna2lsbC1wb3J0LWlmLW5vbi1jaScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBub24tQ0kuJyxcbiAgYnVpbGRlcjoga2lsbFBvcnRJZk5vbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQga2lsbFBvcnRJZk5vbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0SWZOb25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXAga2lsbGluZyBwb3J0IGR1ZSB0byBDSTogJHtwcm9qZWN0LmVudi5DSX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3J0RW52ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPD0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBLaWxsaW5nIHRoZSBwb3J0OiAke3BvcnR9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBwcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZSwgb3V0cHV0KSkgcmV0dXJuO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPdXRwdXQgPSBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQpO1xuICBpZiAobm9ybWFsaXplZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG5vcm1hbGl6ZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZXhpdENvZGUgIT09IDAgfHwgaGFzV2FybmluZ091dHB1dChvdXRwdXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3V0cHV0LnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzV2FybmluZ091dHB1dChvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndhcm4oPzppbmcpP3M/XFxiL2kudGVzdChvdXRwdXQucmVwbGFjZUFsbCgvXFxiKD86MHxubykgd2FybmluZ3M/XFxiL2dpLCAnJykpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgQnVmZmVyZWRSdW5SZXN1bHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTY3JpcHQsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmludEJ1ZmZlcmVkT3V0cHV0LCBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0IH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgcXVpZXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlcG9ydCBlcnJvcnMgb25seScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ByaW50IG9ubHkgZmFpbGVkIG9yIHdhcm5pbmcgY29tbWFuZCBvdXRwdXQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPFxuICB0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlclxuPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYge1xuICAnLS0nPzogdW5rbm93bltdO1xuICBfOiB1bmtub3duW107XG4gIHByaW50QWxsT3V0cHV0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG94bGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddKTtcbmNvbnN0IHB5dGhvbkV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncHknXSk7XG5jb25zdCBkYXJ0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydkYXJ0J10pO1xuY29uc3QgcnVzdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncnMnXSk7XG5jb25zdCBveGZtdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgLi4ub3hsaW50RXh0ZW5zaW9ucyxcbiAgJ2NzcycsXG4gICdncWwnLFxuICAnZ3JhcGhxbCcsXG4gICdoYnMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdsZXNzJyxcbiAgJ21kJyxcbiAgJ21keCcsXG4gICdzY3NzJyxcbiAgJ3RvbWwnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjc3MnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2phdmEnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIW94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuY29uc3QgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiA9ICchKiovdGVzdHstLC99Zml4dHVyZXMvKionO1xuXG50eXBlIEJ1ZmZlcmVkTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkUnVuUmVzdWx0ICYgeyBjb21tYW5kOiBzdHJpbmc7IGN3ZDogc3RyaW5nIH07XG50eXBlIExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgfCB7IGV4aXRDb2RlOiBudW1iZXIgfTtcbmludGVyZmFjZSBMaW50UnVuQ29tbWFuZCB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgcHJvamVjdDogUHJvamVjdDtcbn1cblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIExpbnRDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgbGludChhcmd2IGFzIExpbnRDb21tYW5kQXJndik7XG4gICAgaWYgKGV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbnQoYXJndjogTGludENvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndik7XG4gIGNvbnN0IGxpbnRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IGRhcnRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICAvLyBgY2FyZ28gZm10IC0tYWxsYCBhbHdheXMgZm9ybWF0cyB0aGUgd2hvbGUgd29ya3NwYWNlLCBzbyB3ZSB0cmFjayB0YXJnZXRcbiAgLy8gcHJvamVjdHMgcmF0aGVyIHRoYW4gaW5kaXZpZHVhbCBmaWxlIHBhdGhzLiBFdmVyeSBwcm9qZWN0IHdpdGggaXRzIG93blxuICAvLyBgQ2FyZ28udG9tbGAgcnVucyBpdHMgb3duIGBjYXJnbyBmbXQgLS1hbGxgOyB3ZSBpbnRlbnRpb25hbGx5IGRvIG5vdCBkZWR1cFxuICAvLyBieSBkaXJlY3RvcnkuIEEgbmVzdGVkIG9yIHNpYmxpbmcgY3JhdGUgY2FuIGJlIGFuIGluZGVwZW5kZW50IENhcmdvXG4gIC8vIHdvcmtzcGFjZSB0aGF0IGEgcGFyZW50J3MgYGNhcmdvIGZtdCAtLWFsbGAgbmV2ZXIgcmVhY2hlcywgc28gc2tpcHBpbmcgaXRcbiAgLy8gd291bGQgbGVhdmUgaXQgdW5mb3JtYXR0ZWQsIHdoaWxlIGFueSBnZW51aW5lbHkgb3ZlcmxhcHBpbmcgcnVucyBhcmVcbiAgLy8gaGFybWxlc3MgYmVjYXVzZSBydXN0Zm10IGlzIGRldGVybWluaXN0aWMgYW5kIGlkZW1wb3RlbnQuIERlZHVwaW5nIGJ5IHJlYWxcbiAgLy8gd29ya3NwYWNlIG1lbWJlcnNoaXAgd291bGQgcmVxdWlyZSBpbnZva2luZyBgY2FyZ28gbG9jYXRlLXByb2plY3RgLlxuICBjb25zdCBjYXJnb0Zvcm1hdFByb2plY3RzID0gbmV3IFNldDxQcm9qZWN0PigpO1xuICBjb25zdCBwcmV0dGllckZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzID0gZmFsc2U7XG4gIGxldCBwcmV0dGllckFyZ3M6IHN0cmluZ1tdO1xuICBsZXQgc29ydFBhY2thZ2VKc29uQXJnczogc3RyaW5nW107XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbGludFRhcmdldHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbGVzLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlKTtcbiAgICAgICAgY29uc3QgZmlsZUtpbmQgPSBhd2FpdCBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm4geyBmaWxlS2luZCwgZmlsZVBhdGggfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHsgZmlsZUtpbmQsIGZpbGVQYXRoIH0gb2YgbGludFRhcmdldHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaCguLi5nZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHsgbGludFBhdGgsIHByb2plY3QgfSBvZiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2sgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGNvbnN0IHB5dGhvbkZpbGVQYXRocyA9IHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgcHl0aG9uRmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGNvbnN0IGRhcnRGaWxlUGF0aHMgPSBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGRhcnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0NhcmdvVG9tbCAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHJ1c3RFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGNhcmdvRm9ybWF0UHJvamVjdHMuYWRkKHByb2plY3QpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3QsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBjb25zdCBsaW50RmlsZVBhdGhzID0gbGludEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgbGludEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgICAgICAgIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2goYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGxpbnRQYXRoKSwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZvcm1hdHRlclBhdGggb2YgYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MocHJvamVjdCwgbGludFBhdGgsIGZpbGVLaW5kLCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFyZ3YuZm9ybWF0ICYmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSkge1xuICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10ICYmIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1BvdGVudGlhbExpbnRUYXJnZXQoZXh0ZW5zaW9uKSAmJiAhcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTm8gbGludGVyIGZvdW5kIGZvciAke3Byb2plY3QubmFtZX0uIEluc3RhbGwgT3hsaW50LmApKTtcbiAgICAgICAgICBtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcmV0dGllckFyZ3MgPSBbLi4ubmV3IFNldChwcmV0dGllckZpbGVQYXRocyldO1xuICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBbLi4ubmV3IFNldChwYWNrYWdlSnNvbkZpbGVQYXRocyldO1xuICB9IGVsc2Uge1xuICAgIHByZXR0aWVyQXJncyA9IGJ1aWxkUHJldHRpZXJBcmdzKHByb2plY3RzLnNlbGYuZGlyUGF0aCwgcHJvamVjdHMuZGVzY2VuZGFudHMpO1xuICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IHAucGFja2FnZUpzb25QYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdHRlckNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdID0gW107XG4gIGNvbnN0IGxpbnRlckNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdID0gW107XG4gIGNvbnN0IGxpbnRSdW5PcHRpb25zID0geyBleGl0SWZGYWlsZWQ6IGZhbHNlLCBwcmVzZXJ2ZUNvbG9yOiAhYXJndi5wcmludEFsbE91dHB1dCB9IGFzIGNvbnN0O1xuICBjb25zdCBzaG91bGRSdW5Gb3JtYXR0ZXJzID0gQm9vbGVhbihhcmd2LmZvcm1hdCk7XG4gIGNvbnN0IHNob3VsZFJ1bkxpbnRlcnMgPSAhYXJndi5mb3JtYXQgfHwgYXJndi5maXg7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGxpbnRGaWxlUGF0aHNdIG9mIGxpbnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICBpZiAoIWxpbnRDb21tYW5kKSBjb250aW51ZTtcblxuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIHB5dGhvbkZpbGVQYXRoc10gb2YgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2LCBweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzXSBvZiBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBjYXJnb0Zvcm1hdFByb2plY3RzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgb3hmbXRGaWxlUGF0aHNdIG9mIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGlmIChsaW50Q29tbWFuZCkgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3YpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0NhcmdvVG9tbCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkQ2FyZ29Gb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGxpbnRFeGl0Q29kZXM6IG51bWJlcltdID0gW107XG5cbiAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICBjb25zdCBmb3JtYXR0ZXJSZXN1bHRzID0gYXdhaXQgcnVuTGludENvbW1hbmRzKGZvcm1hdHRlckNvbW1hbmRzLCBhcmd2LCBsaW50UnVuT3B0aW9ucyk7XG4gICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhmb3JtYXR0ZXJSZXN1bHRzLCBhcmd2KTtcbiAgICBsaW50RXhpdENvZGVzLnB1c2goLi4uZm9ybWF0dGVyUmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LmV4aXRDb2RlKSk7XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAobWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcykge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICBpZiAocHJldHRpZXJBcmdzLmxlbmd0aCA+IDAgJiYgcHJvamVjdHMuc2VsZi5oYXNQcmV0dGllcikge1xuICAgICAgY29uc3QgcHJldHRpZXJSZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAgICdZQVJOJyxcbiAgICAgICAgICAncHJldHRpZXInLFxuICAgICAgICAgICctLWNhY2hlJyxcbiAgICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICctLScsXG4gICAgICAgICAgLi4ucHJldHRpZXJBcmdzLFxuICAgICAgICBdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtwcmV0dGllclJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHByZXR0aWVyUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG4gICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydFBhY2thZ2VKc29uUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtzb3J0UGFja2FnZUpzb25SZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChzb3J0UGFja2FnZUpzb25SZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgY29uc3QgbGludGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhsaW50ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMobGludGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmxpbnRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuICB9XG5cbiAgcmV0dXJuIGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZHMoXG4gIGNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdLFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHRbXT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoY29tbWFuZHMubWFwKCh7IGNvbW1hbmQsIHByb2plY3QgfSkgPT4gcnVuTGludENvbW1hbmQoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykpKTtcbn1cblxuZnVuY3Rpb24gcnVuTGludENvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogTGludENvbW1hbmRBcmd2LFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd25JblBhcmFsbGVsPlszXVxuKTogUHJvbWlzZTxMaW50UnVuUmVzdWx0PiB7XG4gIGlmIChhcmd2LnNpbGVudCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChyZXN1bHQpID0+ICh7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICBjb21tYW5kOiBub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSxcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChleGl0Q29kZSkgPT4gKHsgZXhpdENvZGUgfSkpO1xufVxuXG5mdW5jdGlvbiBwcmludFNpbGVudExpbnRPdXRwdXRzKFxuICByZXN1bHRzOiBMaW50UnVuUmVzdWx0W10sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAncHJpbnRBbGxPdXRwdXQnIHwgJ3NpbGVudCc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcHJpbnRhYmxlUmVzdWx0cyA9XG4gICAgYXJndi5zaWxlbnQgJiYgIWFyZ3YucHJpbnRBbGxPdXRwdXRcbiAgICAgID8gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCkgPT4gJ291dHB1dCcgaW4gcmVzdWx0ICYmIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQocmVzdWx0LmV4aXRDb2RlLCByZXN1bHQub3V0cHV0KSlcbiAgICAgIDogcmVzdWx0cztcbiAgaWYgKHByaW50YWJsZVJlc3VsdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcHJpbnRhYmxlUmVzdWx0cykge1xuICAgIGlmICghKCdvdXRwdXQnIGluIHJlc3VsdCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGFyZ3YucHJpbnRBbGxPdXRwdXQpIHtcbiAgICAgIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJndi5zaWxlbnQpIHtcbiAgICAgICAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcbiAgICAgIH1cbiAgICAgIHByaW50QnVmZmVyZWRPdXRwdXQocmVzdWx0LmV4aXRDb2RlLCByZXN1bHQub3V0cHV0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdDogQnVmZmVyZWRMaW50UnVuUmVzdWx0KTogdm9pZCB7XG4gIHByaW50Q29tbWFuZEhlYWRlcihyZXN1bHQuY29tbWFuZCwgcmVzdWx0LmN3ZCk7XG5cbiAgaWYgKHJlc3VsdC5leGl0Q29kZSA9PT0gMCAmJiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQocmVzdWx0LmNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXQudHJpbSgpO1xuICBpZiAob3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kSGVhZGVyKGNvbW1hbmQ6IHN0cmluZywgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdDb21tYW5kOicpLCBjb21tYW5kKSArIGNoYWxrLmdyYXkoYCBhdCAke2N3ZH1gKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJyBveGZtdCAnKSB8fCBjb21tYW5kLmluY2x1ZGVzKCcgc29ydC1wYWNrYWdlLWpzb24gJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc1R5cGVBd2FyZU94bGludCc+LFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ294bGludCcsXG4gICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAvLyBUeXBlLWF3YXJlIG1vZGUgbWFrZXMgb3hsaW50IHJlcG9ydCB0eXBlLWNoZWNrIGRpYWdub3N0aWNzLiBQYXNzIHRoZSBmbGFncyBleHBsaWNpdGx5XG4gICAgICAvLyBiZWNhdXNlIG94bGludCByZWplY3RzIHRoZSBlcXVpdmFsZW50IG9wdGlvbnMgaW4gbm9uLXJvb3QgY29uZmlncywgc28gcGVyLXBhY2thZ2UgcnVuc1xuICAgICAgLy8gaW4gbW9ub3JlcG9zIHdvdWxkIG90aGVyd2lzZSBtaXNzIHR5cGUgZXJyb3JzLlxuICAgICAgLi4uKHByb2plY3QuaGFzVHlwZUF3YXJlT3hsaW50ID8gWyctLXR5cGUtYXdhcmUnLCAnLS10eXBlLWNoZWNrJ10gOiBbXSksXG4gICAgICAuLi4oYXJndi5xdWlldCA/IFsnLS1xdWlldCddIDogW10pLFxuICAgICAgLi4uKGFyZ3YuZml4ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICBdKTtcbiAgfVxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE94Zm10Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAnWUFSTicsXG4gICAgJ294Zm10JyxcbiAgICAnLS13cml0ZScsXG4gICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgJyEqKi9wYWNrYWdlLmpzb24nLFxuICBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gW1xuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdpc29ydCcsICctLXByb2ZpbGUnLCAnYmxhY2snLCAnLS1maWx0ZXItZmlsZXMnLCAuLi50YXJnZXRzXSksXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2JsYWNrJywgLi4udGFyZ2V0c10pLFxuICBdLmpvaW4oJyAmJiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndjogUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LCBmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50YXJnZXRzXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpOiBzdHJpbmcge1xuICAvLyBGb3JtYXR0aW5nIG11c3QgZ28gdGhyb3VnaCBjYXJnbyAobm90IHJ1c3RmbXQgb24gaW5kaXZpZHVhbCBmaWxlcykgc28gZWFjaFxuICAvLyBjcmF0ZSdzIGVkaXRpb24gYW5kIHJ1c3RmbXQgY29uZmlndXJhdGlvbiBhcmUgcmVzcGVjdGVkOyBgLS1hbGxgIGNvdmVyc1xuICAvLyBldmVyeSB3b3Jrc3BhY2UgbWVtYmVyIGFuZCBpcyBhIG5vLW9wIHN1ZmZpeCBmb3Igc2luZ2xlLWNyYXRlIHByb2plY3RzLlxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydjYXJnbycsICdmbXQnLCAnLS1hbGwnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnZm9ybWF0JywgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0TGludENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdhbmFseXplJywgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcmV0dGllckFyZ3MoXG4gIHNlbGZEaXJQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz5bXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzID0gbmV3IFNldDxzdHJpbmc+KFtgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmICghbmVlZHNQcmV0dGllcihwcm9qZWN0KSkgY29udGludWU7XG5cbiAgICBjb25zdCBwcm9qZWN0UGF0dGVybiA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKTtcbiAgICBhcmdzLmFkZChwYXRoLnJlbGF0aXZlKHNlbGZEaXJQYXRoLCBwcm9qZWN0UGF0dGVybikgfHwgcHJvamVjdFBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBbLi4uYXJnc107XG59XG5cbmZ1bmN0aW9uIGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG93bmluZ1Byb2plY3Q6IFByb2plY3QgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmIChcbiAgICAgIChmaWxlUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7cHJvamVjdC5kaXJQYXRofS9gKSkgJiZcbiAgICAgICghb3duaW5nUHJvamVjdCB8fCBwcm9qZWN0LmRpclBhdGgubGVuZ3RoID4gb3duaW5nUHJvamVjdC5kaXJQYXRoLmxlbmd0aClcbiAgICApIHtcbiAgICAgIG93bmluZ1Byb2plY3QgPSBwcm9qZWN0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3duaW5nUHJvamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlcyhhcmd2OiBQaWNrPExpbnRDb21tYW5kQXJndiwgJy0tJyB8ICdfJyB8ICdmaWxlcyc+KTogc3RyaW5nW10ge1xuICBjb25zdCBsaW50VGFyZ2V0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFsuLi4oYXJndi5maWxlcyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXSkge1xuICAgIGxpbnRUYXJnZXRzLmFkZChTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gWy4uLmxpbnRUYXJnZXRzXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwnZGlyZWN0b3J5JyB8ICdvdGhlcic+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gJ2RpcmVjdG9yeSc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE1pc3NpbmcgcGF0aHMgYXJlIGhhbmRsZWQgYnkgdGhlIGRvd25zdHJlYW0gdG9vbHMuXG4gIH1cblxuICByZXR1cm4gJ290aGVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0Lmhhc094Zm10KSByZXR1cm4gb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICBpZiAobmVlZHNQcmV0dGllcihwcm9qZWN0KSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBwcmV0dGllck9ubHlFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBuZWVkc1ByZXR0aWVyKHByb2plY3QpKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl07XG4gIH1cbiAgaWYgKHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4oZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oZmlsZVBhdGgsIGAqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb25QYXRoJz5bXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSByZXR1cm4gW107XG4gIHJldHVybiBwcm9qZWN0c1xuICAgIC5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT5cbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGggPT09IHBhdGguam9pbihmaWxlUGF0aCwgJ3BhY2thZ2UuanNvbicpIHx8XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKVxuICAgIC5tYXAoKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb25QYXRoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0TGludFRhcmdldHMoXG4gIHByb2plY3RzOiBQcm9qZWN0W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHsgbGludFBhdGg6IHN0cmluZzsgcHJvamVjdDogUHJvamVjdCB9W10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgY29uc3QgZGVzY2VuZGFudFByb2plY3RzID0gcHJvamVjdHMuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+IHByb2plY3QuZGlyUGF0aCA9PT0gZmlsZVBhdGggfHwgcHJvamVjdC5kaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKTtcbiAgICBpZiAoZGVzY2VuZGFudFByb2plY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkZXNjZW5kYW50UHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiAoeyBsaW50UGF0aDogcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0IH0pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHMsIGZpbGVQYXRoKTtcbiAgcmV0dXJuIHByb2plY3QgPyBbeyBsaW50UGF0aDogZmlsZVBhdGgsIHByb2plY3QgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPiwgZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50JykgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNQcmV0dGllcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFwcm9qZWN0Lmhhc094Zm10ICYmIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jztcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBDaGVja3MgdGhlIGdpdmVuIHBvcnQgYW5kIGtpbGxzIGFueSBwcm9jZXNzIHVzaW5nIGl0LlxuICogTm90ZSB3YiBhbHdheXMgcmVxdWlyZXMgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHJhd1BvcnQ6IHVua25vd24sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHJhd1BvcnQpO1xuICBpZiAoIXBvcnQpIHRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIHBvcnQgKCR7cG9ydH0pIGlzIGludmFsaWQuYCk7XG5cbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydCwgcHJvamVjdCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBvcnQgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gY2hlY2tcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHBvcnQgaXMgYXZhaWxhYmxlLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzUG9ydEF2YWlsYWJsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQ2hlY2sgYm90aCBzdGFja3MgdG8gY2F0Y2ggcHJvY2Vzc2VzIGJvdW5kIG9ubHkgb24gSVB2NiBvciBJUHY0LlxuICBmb3IgKGNvbnN0IGhvc3Qgb2YgWycxMjcuMC4wLjEnLCAnOjonXSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IHByb2JlUG9ydChob3N0LCBwb3J0KTtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9iZVBvcnQoaG9zdDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUZOT1NVUFBPUlQnKSB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jLCBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcbmNvbnN0IHN0YWxlUHJvY2Vzc1BvbGxJbnRlcnZhbE1zID0gMTAwO1xuY29uc3Qgc3RhbGVQcm9jZXNzTWF4UG9sbHMgPSAxMDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQsIHByb2plY3QpO1xuICBraWxsTGlzdGVuaW5nUHJvY2Vzc2VzQnlQb3J0KHBvcnQpO1xufVxuXG5mdW5jdGlvbiBraWxsTGlzdGVuaW5nUHJvY2Vzc2VzQnlQb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHBpZCBvZiBsaXN0TGlzdGVuaW5nUHJvY2Vzc0lkcyhwb3J0KSkge1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwocGlkLCAnU0lHS0lMTCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0TGlzdGVuaW5nUHJvY2Vzc0lkcyhwb3J0OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gZXhlY0ZpbGVTeW5jKCdsc29mJywgWyctdGknLCBgdGNwOiR7cG9ydH1gLCAnLXNUQ1A6TElTVEVOJ10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gICAgcmV0dXJuIHN0ZG91dFxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHBpZCkgPT4gTnVtYmVyKHBpZC50cmltKCkpKVxuICAgICAgLmZpbHRlcigocGlkKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgJiYgcGlkID4gMCAmJiBwaWQgIT09IHByb2Nlc3MucGlkKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVTdGFsZVByb2Nlc3MocGlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFsZVByb2Nlc3NNYXhQb2xsczsgaSsrKSB7XG4gICAgYXdhaXQgc2V0VGltZW91dChzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyk7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VTUkNIJykgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzLCByZW1vdmVTdGFsZVByb2Nlc3MgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2RlbGF5LW1zJzoge1xuICAgIGRlZmF1bHQ6IDUwMDAsXG4gICAgZGVzY3JpYmU6ICdEZWxheSBiZWZvcmUgc3RhcnRpbmcgdGhlIG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xudHlwZSBNYWludGVuYW5jZUFyZ3YgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPiAmIHtcbiAgYWN0aW9uOiAnc3RhcnQnIHwgJ3N0b3AnO1xufTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMgPSA1O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMgPSAxMDA7XG5jb25zdCBtYXhUaW1lb3V0RGVsYXlNcyA9IDJfMTQ3XzQ4M182NDc7XG5jb25zdCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUgPSAnLndiJztcbmNvbnN0IG1haW50ZW5hbmNlSHRtbCA9IGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJqYVwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj5cbiAgICA8dGl0bGU+44Oh44Oz44OG44OK44Oz44K55LitPC90aXRsZT5cbiAgICA8c3R5bGU+XG4gICAgICBib2R5IHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgICAgY29sb3I6ICMxMTE4Mjc7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7XG4gICAgICB9XG5cbiAgICAgIG1haW4ge1xuICAgICAgICBwYWRkaW5nOiAyNHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOiAyOHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgICBtYXJnaW46IDAgMCAxNnB4O1xuICAgICAgfVxuXG4gICAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS44O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bWFpbj5cbiAgICAgIDxoMT7nj77lnKjjg6Hjg7Pjg4bjg4rjg7PjgrnkuK3jgafjgZk8L2gxPlxuICAgICAgPHA+55qG5qeY44Gr44Gv44GU5LiN5L6/44KS44GK44GL44GR44GX44G+44GZ44GM44CB44Oh44Oz44OG44OK44Oz44K557WC5LqG44G+44Gn44GX44Gw44KJ44GP44GK5b6F44Gh44GP44Gg44GV44GE44CCPC9wPlxuICAgIDwvbWFpbj5cbiAgPC9ib2R5PlxuPC9odG1sPmA7XG5cbmV4cG9ydCBjb25zdCBtYWludGVuYW5jZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTWFpbnRlbmFuY2VBcmd2PiA9IHtcbiAgY29tbWFuZDogJ21haW50ZW5hbmNlIDxhY3Rpb24+JyxcbiAgZGVzY3JpYmU6ICdTdGFydCBvciBzdG9wIGEgbGlnaHR3ZWlnaHQgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuIEV4YW1wbGU6IHdiIG1haW50ZW5hbmNlIHN0YXJ0JyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzXG4gICAgICAucG9zaXRpb25hbCgnYWN0aW9uJywge1xuICAgICAgICBjaG9pY2VzOiBbJ3N0YXJ0JywgJ3N0b3AnXSBhcyBjb25zdCxcbiAgICAgICAgZGVzY3JpYmU6ICdNYWludGVuYW5jZSBzZXJ2ZXIgYWN0aW9uJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcikgYXMgdW5rbm93biBhcyBBcmd2PE1haW50ZW5hbmNlQXJndj4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gYXJndi5hY3Rpb247XG4gICAgaWYgKHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2UgJHthY3Rpb259IGJlY2F1c2UgV0JfRU5WIGlzIHRlc3QuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChwcm9qZWN0LmVudi5QT1JUKTtcbiAgICBpZiAoYWN0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgICBhd2FpdCBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQsIGFyZ3YuZGVsYXlNcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICdzdG9wJykge1xuICAgICAgYXdhaXQgc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtYWludGVuYW5jZSBhY3Rpb246ICR7YWN0aW9ufWApO1xuICB9LFxufTtcblxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGFzc2VydC5vayhOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpICYmIHBvcnQgPiAwLCBgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlciwgZGVsYXlNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFzc2VydC5vayhcbiAgICBOdW1iZXIuaXNGaW5pdGUoZGVsYXlNcykgJiYgZGVsYXlNcyA+PSAwICYmIGRlbGF5TXMgPD0gbWF4VGltZW91dERlbGF5TXMsXG4gICAgYGRlbGF5LW1zIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke21heFRpbWVvdXREZWxheU1zfTogJHtkZWxheU1zfWBcbiAgKTtcblxuICBjb25zdCBwaWRGaWxlUGF0aCA9IGF3YWl0IHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwcm9jZXNzLnBpZCk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlU2lnbmFsSGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KGRlbGF5TXMsIHVuZGVmaW5lZCwgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0KTtcbiAgICBpZiAoIXNlcnZlcikgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBTdGFydGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgYXdhaXQgd2FpdEZvclNodXRkb3duKHNlcnZlcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGF3YWl0IGNsZWFudXAoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0OiBudW1iZXIpOiBQcm9taXNlPGh0dHAuU2VydmVyIHwgdW5kZWZpbmVkPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHNlcnZlciwgcG9ydCwgaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IpO1xuICAgICAgcmV0dXJuIHNlcnZlcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScgJiYgYXR0ZW1wdCA8IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlIHNlcnZlciBiZWNhdXNlIHBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQsIGVycik7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZSBtYWludGVuYW5jZSBzZXJ2ZXIgc3RhcnR1cCBzdGF0ZS4nKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydDogbnVtYmVyLCBlcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKTogbmV2ZXIge1xuICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICBjb25zb2xlLmluZm8oYFN0b3BwZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTogaHR0cC5TZXJ2ZXIge1xuICByZXR1cm4gaHR0cC5jcmVhdGVTZXJ2ZXIoKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDMsIHtcbiAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLXN0b3JlJyxcbiAgICAgICdjb250ZW50LXR5cGUnOiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyxcbiAgICB9KTtcbiAgICByZXNwb25zZS5lbmQobWFpbnRlbmFuY2VIdG1sKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKFxuICBzZXJ2ZXI6IGh0dHAuU2VydmVyLFxuICBwb3J0OiBudW1iZXIsXG4gIG9uUnVudGltZUVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uU3RhcnR1cEVycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTGlzdGVuaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgICBzZXJ2ZXIub24oJ2Vycm9yJywgb25SdW50aW1lRXJyb3IpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMC4wLjAuMCcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclNodXRkb3duKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzaHV0ZG93biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIGNsb3NlIG1haW50ZW5hbmNlIHNlcnZlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9O1xuICAgIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNlcnZlci5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VSUl9TRVJWRVJfTk9UX1JVTk5JTkcnKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLmNsb3NlQWxsQ29ubmVjdGlvbnMoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHBpZEZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShwaWRGaWxlUGF0aCwgYCR7cHJvY2Vzcy5waWR9XFxuYCwgJ3V0ZjgnKTtcbiAgcmV0dXJuIHBpZEZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICBpZiAocGlkICE9PSB1bmRlZmluZWQgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCkge1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwaWQsICdTSUdURVJNJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQpO1xuICB9XG4gIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcGlkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcsIGV4cGVjdGVkUGlkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleHBlY3RlZFBpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gICAgaWYgKHBpZCAhPT0gZXhwZWN0ZWRQaWQpIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy5ybShwaWRGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaWRUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUocGlkRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGlkID0gTnVtYmVyKHBpZFRleHQudHJpbSgpKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgPyBwaWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LnJvb3REaXJQYXRoLCBwb3J0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocm9vdERpclBhdGg6IHN0cmluZywgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihyb290RGlyUGF0aCwgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lLCBgbWFpbnRlbmFuY2UtJHtwb3J0fS5waWRgKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbi8qKlxuICogTWF0ZXJpYWxpemF0aW9uIG9mIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCByZWdpc3RyeSAoVmVyZGFjY2lvKSBkZXBlbmRlbmNpZXMgZm9yIERvY2tlciBidWlsZHM6XG4gKiB0aGUgcGFja2FnZXMgYXJlIGRvd25sb2FkZWQgb24gdGhlIGhvc3QgKGF1dGggdmlhIC5ucG1yYyAvIH4vLm5wbXJjIGxvY2FsbHksIG9yIFZFUkRBQ0NJT19UT0tFTlxuICogb24gQ0kpIGFuZCBleHRyYWN0ZWQgbmV4dCB0byB0aGUgcmVwb3NpdG9yeSBzbyBpbWFnZSBidWlsZHMgbmVlZCBubyByZWdpc3RyeSBjcmVkZW50aWFsc1xuICogKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlJztcblxuLy8gYGdpdDpgL2BnaXQrYC9gZ2l0QGAgKG5vdCB0aGUgYmFyZSB3b3JkIGBnaXRgKTogbnBtIGFsbG93cyBhcmJpdHJhcnkgZGlzdC10YWdzLCBzbyBhIHRhZyBuYW1lZFxuLy8gYGdpdGAgb3IgYGdpdC1uZXh0YCBtdXN0IHN0aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWdpc3RyeSBzcGVjaWZpZXIuXG5jb25zdCBub25SZWdpc3RyeVNwZWNpZmllclByZWZpeGVzID0gW1xuICAnZ2l0OicsXG4gICdnaXQrJyxcbiAgJ2dpdEAnLFxuICAnZmlsZTonLFxuICAnbGluazonLFxuICAnd29ya3NwYWNlOicsXG4gICdodHRwOicsXG4gICdodHRwczonLFxuICAncG9ydGFsOicsXG4gICdwYXRjaDonLFxuXTtcblxuLy8gVGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHdoaWNoIGdpdCBzcGVjaWZpZXJzIHRoZSBwcml2YXRlLXBhY2thZ2UgdG9vbGluZyBzdXBwb3J0czpcbi8vIGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCBtYXRlcmlhbGl6ZXMgZXhhY3RseSB0aGVzZSwgYW5kIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYCBtdXN0XG4vLyByZXdyaXRlIGV4YWN0bHkgdGhlc2UgKHJld3JpdGluZyBvdGhlciBvcmdzJyBTU0ggVVJMcyB3b3VsZCBwb2ludCBhdCBuZXZlci1tYXRlcmlhbGl6ZWQgcGF0aHMpLlxuY29uc3QgcHJpdmF0ZUdpdERlcGVuZGVuY3lQYXR0ZXJuID0gL15naXRAZ2l0aHViXFwuY29tOig/OldpbGxCb29zdGVyfFdpbGxCb29zdGVyTGFiKVxcL1teLyNdKyg/OlxcLmdpdCk/KD86Iy4qKT8kLztcblxuLy8gUmV0dXJucyBib29sZWFuIChub3QgYSBgdmFsdWUgaXMgc3RyaW5nYCBwcmVkaWNhdGUpOiBhIHByZWRpY2F0ZSB3b3VsZCBuYXJyb3cgdGhlIG5lZ2F0aXZlXG4vLyBicmFuY2ggdG8gYHVuZGVmaW5lZGAgYW5kIGJyZWFrIGBlbHNlIGlmYCBjaGFpbnMgb3ZlciBgc3RyaW5nIHwgdW5kZWZpbmVkYCBkZXBlbmRlbmN5IHZhbHVlcy5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHByaXZhdGVHaXREZXBlbmRlbmN5UGF0dGVybi50ZXN0KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBuYW1lLnN0YXJ0c1dpdGgoYCR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0vYCkgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgIW5vblJlZ2lzdHJ5U3BlY2lmaWVyUHJlZml4ZXMuc29tZSgocHJlZml4KSA9PiB2YWx1ZS5zdGFydHNXaXRoKHByZWZpeCkpXG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZVJlZ2lzdHJ5QXV0aCB7XG4gIHJlZ2lzdHJ5VXJsOiBzdHJpbmc7XG4gIGF1dGhUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHJlZ2lzdHJ5IFVSTCBhbmQgYXV0aCB0b2tlbiBmb3IgdGhlIHByaXZhdGUgc2NvcGUgZnJvbSB0aGUgcHJvamVjdCdzIC5ucG1yYyBhbmRcbiAqIH4vLm5wbXJjIChuZWFyZXIgZmlsZSB3aW5zKSwgZXhwYW5kaW5nIGAke1ZBUn1gIHJlZmVyZW5jZXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuIE9uIENJIHRoZVxuICogVkVSREFDQ0lPX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlIHNlcnZlcyBhcyB0aGUgZmFsbGJhY2sgdG9rZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aChyb290RGlyUGF0aDogc3RyaW5nKTogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgLy8gUmV2ZXJzZSBvcmRlciBzbyBuZWFyZXIgZmlsZXMgb3ZlcndyaXRlIHRoZSBob21lLWRpcmVjdG9yeSBkZWZhdWx0cy5cbiAgZm9yIChjb25zdCBucG1yY1BhdGggb2YgW3BhdGguam9pbihvcy5ob21lZGlyKCksICcubnBtcmMnKSwgcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnLm5wbXJjJyldKSB7XG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW50cmllcywgcGFyc2VOcG1yYyhmcy5yZWFkRmlsZVN5bmMobnBtcmNQYXRoLCAndXRmOCcpKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG5wbXJjIGZpbGVzIGFyZSBmaW5lOyB0aGUgb3RoZXIgZmlsZSBvciBWRVJEQUNDSU9fVE9LRU4gbWF5IHN0aWxsIHByb3ZpZGUgYXV0aC5cbiAgICB9XG4gIH1cblxuICBjb25zdCByZWdpc3RyeVVybCA9IGVudHJpZXNbYCR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX06cmVnaXN0cnlgXT8ucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gIGlmICghcmVnaXN0cnlVcmwpIHJldHVybjtcblxuICAvLyBucG0tc3R5bGUgVVJJIG1hdGNoaW5nOiBub3JtYWxpemUgYm90aCBzaWRlcyB0byBhIHRyYWlsaW5nIHNsYXNoIHNvIGEgdG9rZW4gZm9yXG4gIC8vIGAvL3ZlcmRhY2Npby5leGFtcGxlLmNvbS9gIGNhbiBuZXZlciBtYXRjaCBgLy92ZXJkYWNjaW8uZXhhbXBsZS5jb20tb3RoZXIub3JnL2AsIGFuZCBwaWNrIHRoZVxuICAvLyBNT1NUIFNQRUNJRklDIChsb25nZXN0KSBtYXRjaGluZyBwcmVmaXggc28gYC8vaG9zdC9wcml2YXRlL2AgYmVhdHMgYC8vaG9zdC9gLlxuICBjb25zdCBub3JtYWxpemVkUmVnaXN0cnlVcmwgPSBgJHtyZWdpc3RyeVVybC5yZXBsYWNlKC9eaHR0cHM/Oi8sICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKX0vYDtcbiAgbGV0IG1hdGNoZWRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgbWF0Y2hlZFByZWZpeExlbmd0aCA9IC0xO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgIC8vIFNraXAgZW1wdHkgdG9rZW5zIChhbiB1bnNldCBgJHtWQVJ9YCBleHBhbmRzIHRvICcnKTogYW4gZW1wdHkgbWF0Y2ggbXVzdCBub3QgZGVmZWF0IHRoZVxuICAgIC8vIFZFUkRBQ0NJT19UT0tFTiBmYWxsYmFjayBiZWxvdy5cbiAgICBpZiAoIWtleS5lbmRzV2l0aCgnOl9hdXRoVG9rZW4nKSB8fCAhdmFsdWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHByZWZpeCA9IGAke2tleS5zbGljZSgwLCAtJzpfYXV0aFRva2VuJy5sZW5ndGgpLnJlcGxhY2UoL1xcLyskLywgJycpfS9gO1xuICAgIGlmIChub3JtYWxpemVkUmVnaXN0cnlVcmwuc3RhcnRzV2l0aChwcmVmaXgpICYmIHByZWZpeC5sZW5ndGggPiBtYXRjaGVkUHJlZml4TGVuZ3RoKSB7XG4gICAgICBtYXRjaGVkUHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aDtcbiAgICAgIG1hdGNoZWRUb2tlbiA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvLyBObyBQcm9qZWN0IGluc3RhbmNlIGV4aXN0cyBhdCB0aGlzIGxheWVyLCBzbyBwcm9jZXNzLmVudiBpcyB0aGUgb25seSBzb3VyY2UgZm9yIHRoZVxuICAvLyBDSS1pbmplY3RlZCBmYWxsYmFjayB0b2tlbi5cbiAgY29uc3QgYXV0aFRva2VuID0gbWF0Y2hlZFRva2VuID8/IHByb2Nlc3MuZW52LlZFUkRBQ0NJT19UT0tFTjtcbiAgcmV0dXJuIHsgcmVnaXN0cnlVcmwsIGF1dGhUb2tlbiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOcG1yYyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBsaW5lID0gcmF3TGluZS50cmltKCk7XG4gICAgaWYgKCFsaW5lIHx8IGxpbmUuc3RhcnRzV2l0aCgnIycpIHx8IGxpbmUuc3RhcnRzV2l0aCgnOycpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4IDw9IDApIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qga2V5ID0gbGluZS5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkudHJpbSgpO1xuICAgIGNvbnN0IHZhbHVlID0gbGluZVxuICAgICAgLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSlcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlQWxsKC9cXCRcXHsoW159XSspXFx9L2csIChfLCB2YXJpYWJsZU5hbWU6IHN0cmluZykgPT4gcHJvY2Vzcy5lbnZbdmFyaWFibGVOYW1lXSA/PyAnJyk7XG4gICAgZW50cmllc1trZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogRG93bmxvYWQgYW5kIGV4dHJhY3Qgb25lIHJlZ2lzdHJ5IHBhY2thZ2UgaW50byBgdGFyZ2V0RGlyUGF0aGAuIFRoZSBzcGVjaWZpZXIgbWF5IGJlIGFuIGV4YWN0XG4gKiBzZW12ZXIgdmVyc2lvbiAodGhlIG9yZydzIGNvbW1vbiBjYXNlIHZpYSBidW5maWcgYGV4YWN0ID0gdHJ1ZWApLCBhbnkgc2VtdmVyIHJhbmdlIChyZXNvbHZlZFxuICogbWF4LXNhdGlzZnlpbmcgYWdhaW5zdCB0aGUgcmVnaXN0cnkncyBwdWJsaXNoZWQgdmVyc2lvbnMsIG1hdGNoaW5nIGBucG0gaW5zdGFsbGApLCBvciBhXG4gKiBkaXN0LXRhZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nLFxuICB0YXJnZXREaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcmVzb2x2ZVZlcnNpb24oYXV0aCwgcGFja2FnZU5hbWUsIHZlcnNpb25TcGVjaWZpZXIpO1xuICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGZldGNoUmVnaXN0cnlKc29uPHsgZGlzdD86IHsgdGFyYmFsbD86IHN0cmluZyB9IH0+KFxuICAgIGF1dGgsXG4gICAgYCR7YXV0aC5yZWdpc3RyeVVybH0vJHtlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSl9LyR7dmVyc2lvbn1gXG4gICk7XG4gIGNvbnN0IHRhcmJhbGxVcmwgPSBtZXRhZGF0YS5kaXN0Py50YXJiYWxsO1xuICBpZiAoIXRhcmJhbGxVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRhcmJhbGwgVVJMIGZvciAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259IGluICR7YXV0aC5yZWdpc3RyeVVybH0uYCk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGgsIHRhcmJhbGxVcmwpO1xuICBjb25zdCB0YXJiYWxsUGF0aCA9IHBhdGguam9pbihcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLXByaXZhdGUtcGFja2FnZS0nKSksXG4gICAgJ3BhY2thZ2UudGd6J1xuICApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh0YXJiYWxsUGF0aCwgQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0YXJnZXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAvLyBucG0gdGFyYmFsbHMgcGxhY2UgdGhlIGNvbnRlbnQgdW5kZXIgYSB0b3AtbGV2ZWwgYHBhY2thZ2UvYCBkaXJlY3RvcnkuXG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ3RhcicsIFsnLXh6ZicsIHRhcmJhbGxQYXRoLCAnLUMnLCB0YXJnZXREaXJQYXRoLCAnLS1zdHJpcC1jb21wb25lbnRzPTEnXSwge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259ICgke3RhcmJhbGxVcmx9KS5gKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5kaXJuYW1lKHRhcmJhbGxQYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVWZXJzaW9uKFxuICBhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIFByZXJlbGVhc2UgYW5kIGArYnVpbGRgIG1ldGFkYXRhIGFyZSBib3RoIHBhcnQgb2YgdmFsaWQgZXhhY3QgU2VtVmVyIHZlcnNpb25zLCBzbyBhbiBleGFjdFxuICAvLyBzcGVjaWZpZXIgcmVzb2x2ZXMgdG8gaXRzZWxmIHdpdGhvdXQgYSBwYWNrdW1lbnQgZmV0Y2guXG4gIGlmIChpc0V4YWN0VmVyc2lvbih2ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuIHZlcnNpb25TcGVjaWZpZXI7XG5cbiAgY29uc3QgcGFja3VtZW50ID0gYXdhaXQgZmV0Y2hSZWdpc3RyeUpzb248UGFja3VtZW50PihhdXRoLCBgJHthdXRoLnJlZ2lzdHJ5VXJsfS8ke2VuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKX1gKTtcbiAgY29uc3QgdmVyc2lvbiA9IHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KHZlcnNpb25TcGVjaWZpZXIsIHBhY2t1bWVudCk7XG4gIGlmICghdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgcmVzb2x2ZSAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb25TcGVjaWZpZXJ9IGFnYWluc3QgJHthdXRoLnJlZ2lzdHJ5VXJsfTsgdXNlIGFuIGV4YWN0IHZlcnNpb24sIGEgc2VtdmVyIHJhbmdlLCBvciBhIGRpc3QtdGFnLmBcbiAgICApO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2t1bWVudCB7XG4gICdkaXN0LXRhZ3MnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgdmVyc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBucG0ncyBzcGVjaWZpZXIgY2xhc3NpZmljYXRpb246IGAqYCBhbmQgZGlzdC10YWcgbmFtZXMgcmVzb2x2ZSB2aWEgZGlzdC10YWdzIChucG0gcmVzb2x2ZXMgYCpgXG4gKiB0byB0aGUgYGxhdGVzdGAgdGFnKSwgd2hpbGUgYW55IG90aGVyIHZhbGlkIHNlbXZlciByYW5nZSByZXNvbHZlcyB0byB0aGUgaGlnaGVzdCBwdWJsaXNoZWRcbiAqIHZlcnNpb24gc2F0aXNmeWluZyBpdCwgbWF0Y2hpbmcgYG5wbSBpbnN0YWxsYCdzIG1heC1zYXRpc2Z5aW5nIHNlbWFudGljcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZywgcGFja3VtZW50OiBQYWNrdW1lbnQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodmVyc2lvblNwZWNpZmllciAhPT0gJyonICYmIHNlbXZlci52YWxpZFJhbmdlKHZlcnNpb25TcGVjaWZpZXIpKSB7XG4gICAgcmV0dXJuIHNlbXZlci5tYXhTYXRpc2Z5aW5nKE9iamVjdC5rZXlzKHBhY2t1bWVudC52ZXJzaW9ucyA/PyB7fSksIHZlcnNpb25TcGVjaWZpZXIpID8/IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcGFja3VtZW50WydkaXN0LXRhZ3MnXT8uW3ZlcnNpb25TcGVjaWZpZXIgPT09ICcqJyA/ICdsYXRlc3QnIDogdmVyc2lvblNwZWNpZmllcl07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVnaXN0cnlKc29uPFQ+KGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsIHVybDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hGcm9tUmVnaXN0cnkoYXV0aCwgdXJsKTtcbiAgcmV0dXJuIChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIFQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsIHVybDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAvLyBUYXJiYWxsIFVSTHMgY29tZSBmcm9tIHJlZ2lzdHJ5LWNvbnRyb2xsZWQgbWV0YWRhdGE7IGF0dGFjaCB0aGUgdG9rZW4gb25seSB0byB0aGUgY29uZmlndXJlZFxuICAvLyByZWdpc3RyeSdzIG93biBvcmlnaW4gc28gYSBtYWxpY2lvdXMgb3IgbWlzY29uZmlndXJlZCByZWdpc3RyeSBjYW5ub3QgcmVkaXJlY3QgdGhlIGNyZWRlbnRpYWxcbiAgLy8gdG8gYSB0aGlyZC1wYXJ0eSBob3N0LlxuICBjb25zdCBzZW5kQXV0aFRva2VuID0gISFhdXRoLmF1dGhUb2tlbiAmJiBpc1NhbWVPcmlnaW4odXJsLCBhdXRoLnJlZ2lzdHJ5VXJsKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBoZWFkZXJzOiBzZW5kQXV0aFRva2VuID8geyBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXV0aC5hdXRoVG9rZW59YCB9IDoge30sXG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9OiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luKHVybDogc3RyaW5nLCByZWdpc3RyeVVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsKS5vcmlnaW4gPT09IG5ldyBVUkwocmVnaXN0cnlVcmwpLm9yaWdpbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgnLycsICclMkYnKTtcbn1cblxuLy8gVGhlIG9mZmljaWFsIFNlbVZlciAyLjAuMCBncmFtbWFyIChzZW12ZXIub3JnKSwgYW5jaG9yZWQ6IG51bWVyaWMtbG9va2luZyBkaXN0LXRhZ3Mgc3VjaCBhc1xuLy8gYDEuMi4zbGF0ZXN0YCwgbGVhZGluZy16ZXJvIHZlcnNpb25zIChgMDEuMi4zYCksIGFuZCB1bmRlcnNjb3JlIGlkZW50aWZpZXJzIGFyZSBOT1QgdmVyc2lvbnMg4oCUXG4vLyByZXNvbHZlVmVyc2lvbiB0cmVhdHMgdGhlbSBhcyB0YWdzLCBtYXRjaGluZyBub2RlLXNlbXZlcidzIGNsYXNzaWZpY2F0aW9uLlxuY29uc3QgZXhhY3RTZW12ZXJQYXR0ZXJuID1cbiAgL14oPzowfFsxLTldXFxkKilcXC4oPzowfFsxLTldXFxkKilcXC4oPzowfFsxLTldXFxkKikoPzotKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKD86XFwuKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKSopPyg/OlxcK1swLTlhLXpBLVotXSsoPzpcXC5bMC05YS16QS1aLV0rKSopPyQvO1xuXG4vKiogV2hldGhlciB0aGUgc3BlY2lmaWVyIGlzIGFuIGV4YWN0IFNlbVZlciB2ZXJzaW9uIChub3QgYSByYW5nZSwgdGFnLCBvciBnaXQgVVJMKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V4YWN0VmVyc2lvbihzcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFzcGVjaWZpZXIgJiYgZXhhY3RTZW12ZXJQYXR0ZXJuLnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIEVWRVJZIHZlcnNpb24gYHNwZWNpZmllcmAgY2FuIHJlc29sdmUgdG8gYWxzbyBzYXRpc2ZpZXMgYHJlcXVpcmVtZW50YCAoZXhhY3QgdmVyc2lvbnNcbiAqIGNvdW50IGFzIHNpbmdsZS12ZXJzaW9uIHJhbmdlcykuIENvbmZsaWN0IGNoZWNrcyB1c2UgdGhpcyBiZWNhdXNlIHRoZSBhY3R1YWxseSByZXNvbHZlZCB2ZXJzaW9uXG4gKiBpcyB1bmtub3duIGJlZm9yZSB0aGUgcmVnaXN0cnkgaXMgY29uc3VsdGVkOiBhIHN1YnNldCBzcGVjaWZpZXIncyBtYXgtc2F0aXNmeWluZyByZXNvbHV0aW9uIGlzXG4gKiBndWFyYW50ZWVkIHRvIHNhdGlzZnkgdGhlIHdpZGVyIHJlcXVpcmVtZW50LiBOb24tcmFuZ2Ugc3BlY2lmaWVycyAoZGlzdC10YWdzLCBnaXQgVVJMcykgYXJlIG5vdFxuICogY29tcGFyYWJsZSBhbmQgcmV0dXJuIGZhbHNlIOKAlCBjYWxsZXJzIGFjY2VwdCB0aG9zZSBvbmx5IG9uIGV4YWN0IHN0cmluZyBlcXVhbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwZWNpZmllclN1YnNldChzcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZCwgcmVxdWlyZW1lbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoc3BlY2lmaWVyID09PSB1bmRlZmluZWQgfHwgcmVxdWlyZW1lbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAvLyBgKmAgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgYGxhdGVzdGAgZGlzdC10YWcgKHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KSwgbm90IGFzIGEgcmFuZ2UsIHNvXG4gIC8vIGl0IGlzIG5vdCBzdGF0aWNhbGx5IGNvbXBhcmFibGUgaW4gZWl0aGVyIHBvc2l0aW9uLlxuICBpZiAoc3BlY2lmaWVyID09PSAnKicgfHwgcmVxdWlyZW1lbnQgPT09ICcqJykgcmV0dXJuIGZhbHNlO1xuICAvLyBCdWlsZCBtZXRhZGF0YSBkaXN0aW5ndWlzaGVzIHJlZ2lzdHJ5IGFydGlmYWN0cyAocmVzb2x2ZVZlcnNpb24gZmV0Y2hlcyBhbiBleGFjdCBzcGVjaWZpZXJcbiAgLy8gdmVyYmF0aW0pIGJ1dCBzZW12ZXIgY29tcGFyaXNvbnMgaWdub3JlIGl0LCBzbyB0d28gZXhhY3QgdmVyc2lvbnMgbXVzdCBtYXRjaCBhcyBzdHJpbmdzLlxuICBpZiAoaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyKSAmJiBpc0V4YWN0VmVyc2lvbihyZXF1aXJlbWVudCkpIHJldHVybiBzcGVjaWZpZXIgPT09IHJlcXVpcmVtZW50O1xuICBpZiAoIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikgfHwgIXNlbXZlci52YWxpZFJhbmdlKHJlcXVpcmVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gc2VtdmVyLnN1YnNldChzcGVjaWZpZXIsIHJlcXVpcmVtZW50KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBtYXRlcmlhbGl6ZWQgYHZlcnNpb25gIGNhbiBiZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVnaXN0cnkgYHNwZWNpZmllcmAuXG4gKiBEaXN0LXRhZ3MgKGludmFsaWQgcmFuZ2VzKSBhcmUgbm90IHN0YXRpY2FsbHkgY2hlY2thYmxlIGFuZCBwYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXI6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEJ1aWxkIG1ldGFkYXRhIGRpc3Rpbmd1aXNoZXMgcmVnaXN0cnkgYXJ0aWZhY3RzLCBzbyBhbiBleGFjdCBzcGVjaWZpZXIgYWRtaXRzIG9ubHkgdGhlXG4gIC8vIGlkZW50aWNhbCB2ZXJzaW9uIHN0cmluZy5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikpIHJldHVybiBzcGVjaWZpZXIgPT09IHZlcnNpb247XG4gIGlmICghc2VtdmVyLnZhbGlkUmFuZ2Uoc3BlY2lmaWVyKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBzZW12ZXIuc2F0aXNmaWVzKHZlcnNpb24sIHNwZWNpZmllcik7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgaW5zdGFsbGVkIGB2ZXJzaW9uYCBpcyBzdGF0aWNhbGx5IEtOT1dOIHRvIHNhdGlzZnkgdGhlIHJlZ2lzdHJ5IGBzcGVjaWZpZXJgLlxuICogRGlzdC10YWdzIChpbnZhbGlkIHJhbmdlcykgYXJlIG5vdCBzdGF0aWNhbGx5IGNoZWNrYWJsZSBhbmQgcmV0dXJuIGZhbHNlIOKAlCB1bmxpa2VcbiAqIG1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXMsIGNhbGxlcnMgdXNlIHRoaXMgdG8gZGVjaWRlIHdoZXRoZXIgYW4gaW5zdGFsbGVkIGNvcHkgY2FuIHJlcGxhY2VcbiAqIGEgcmVnaXN0cnkgZG93bmxvYWQsIHNvIHVuY2VydGFpbnR5IG11c3QgZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXI6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGAqYCByZXNvbHZlcyB0aHJvdWdoIHRoZSBgbGF0ZXN0YCBkaXN0LXRhZyAoc2VsZWN0VmVyc2lvbkZyb21QYWNrdW1lbnQpLCBzbyBsaWtlIGFueSBvdGhlclxuICAvLyBkaXN0LXRhZyBpdCBpcyBub3Qgc3RhdGljYWxseSBjaGVja2FibGUgYWdhaW5zdCBhbiBpbnN0YWxsZWQgdmVyc2lvbi5cbiAgaWYgKHNwZWNpZmllciA9PT0gJyonKSByZXR1cm4gZmFsc2U7XG4gIC8vIHJlc29sdmVWZXJzaW9uIGZldGNoZXMgYW4gZXhhY3Qgc3BlY2lmaWVyIHZlcmJhdGltIChidWlsZCBtZXRhZGF0YSBpbmNsdWRlZCksIHNvIGFuIGluc3RhbGxlZFxuICAvLyBjb3B5IG1heSByZXBsYWNlIHRoZSBkb3dubG9hZCBvbmx5IHdoZW4gdGhlIHZlcnNpb24gc3RyaW5ncyBtYXRjaCBleGFjdGx5LlxuICBpZiAoaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyKSkgcmV0dXJuIHNwZWNpZmllciA9PT0gdmVyc2lvbjtcbiAgcmV0dXJuICEhc2VtdmVyLnZhbGlkUmFuZ2Uoc3BlY2lmaWVyKSAmJiBzZW12ZXIuc2F0aXNmaWVzKHZlcnNpb24sIHNwZWNpZmllcik7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMsIHR5cGUgRm91bmRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcml2YXRlUmVnaXN0cnlBdXRoIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZSxcbiAgaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyxcbiAgaXNQcml2YXRlR2l0RGVwZW5kZW5jeSxcbiAgaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5LFxuICByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgc3BlY2lmaWVyU3Vic2V0LFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbnRlcmZhY2UgUHJpdmF0ZVBhY2thZ2Uge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6ICdnaXQnIHwgJ3JlZ2lzdHJ5JztcbiAgLyoqXG4gICAqIFVuZGVmaW5lZCBmb3IgcmVnaXN0cnkgcGFja2FnZXMgdGhhdCBtdXN0IGJlIGRvd25sb2FkZWQ7IHNldCBmb3IgZ2l0IHBhY2thZ2VzIGFuZCBmb3JcbiAgICogcmVnaXN0cnkgcGFja2FnZXMgd2hvc2UgaW5zdGFsbGVkIGNvcHkgaW4gbm9kZV9tb2R1bGVzIGFscmVhZHkgc2F0aXNmaWVzIHRoZSBzcGVjaWZpZXJcbiAgICogKHNvIENJIHN0ZXBzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMgY2FuIHN0aWxsIG1hdGVyaWFsaXplIHRoZW0pLlxuICAgKi9cbiAgc291cmNlRGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0YXJnZXREaXJQYXRoOiBzdHJpbmc7XG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBvbmNlIGFuIGluc3RhbGxlZCBjb3B5IGlzIHNlbGVjdGVkIG9yIGEgZG93bmxvYWQgaXMgZXh0cmFjdGVkLiAqL1xuICByZXNvbHZlZFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgZGVwZW5kZW5jeUtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAnb3V0LWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RpcmVjdG9yeSB0byBjb3B5IHByaXZhdGUgcGFja2FnZXMgaW50bycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ0B3aWxsYm9vc3RlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHsgZHJ5UnVuPzogYm9vbGVhbiB9LCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cC1wcml2YXRlLXBhY2thZ2VzJyxcbiAgZGVzY3JpYmU6XG4gICAgJ01hdGVyaWFsaXplIHByaXZhdGUgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzOiBjb3B5IGdpdCBkZXBlbmRlbmNpZXMsIHJldXNlIGluc3RhbGxlZCBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIHJlZ2lzdHJ5IHBhY2thZ2VzIHdob3NlIGV4YWN0LXZlcnNpb24gb3Igc2VtdmVyLXJhbmdlIHNwZWNpZmllciB0aGUgaW5zdGFsbGVkIGNvcHkgc2F0aXNmaWVzLCBhbmQgZG93bmxvYWQgdGhlIHJlc3QgKGF1dGggdmlhIC5ucG1yYyAvIH4vLm5wbXJjIGxvY2FsbHksIG9yIFZFUkRBQ0NJT19UT0tFTiBvbiBDSTsgZGlzdC10YWcgc3BlY2lmaWVycyBzdWNoIGFzIGBsYXRlc3RgIGFsd2F5cyBkb3dubG9hZCkuICcgK1xuICAgICdUaGUgRG9ja2VyZmlsZSBtdXN0IENPUFkgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyAoZS5nLiBgQ09QWSBAd2lsbGJvb3N0ZXIvIEB3aWxsYm9vc3Rlci9gIGFuZCBgQ09QWSBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8gQHdpbGxib29zdGVyLXByaXZhdGUvYCkgc28gdGhlIGluLWltYWdlIGluc3RhbGwgcmVzb2x2ZXMgdGhlIHJld3JpdHRlbiBmaWxlOiBwYXRocy4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCByb290QW5kU2VsZiA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXJvb3RBbmRTZWxmKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFJlc29sdmUgdGhlIGRlc2NlbmRhbnQgc2V0IGZyb20gdGhlIHJlcG9zaXRvcnkgUk9PVCAobm90IHRoZSBjdXJyZW50IGRpcmVjdG9yeSkgc28gdGhlXG4gICAgLy8gY29tbWFuZCBzY2FucyB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0IHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaXQgcnVuczpcbiAgICAvLyBmaW5kRGVzY2VuZGFudFByb2plY3RzIHJldHVybnMgb25seSB0aGUgY3VycmVudCBwcm9qZWN0IHdoZW4gaW52b2tlZCBmcm9tIGEgd29ya3NwYWNlLlxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcm9vdEFuZFNlbGYucm9vdC5kaXJQYXRoKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gU2NhbiB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0OiBhIHByaXZhdGUgZGVwZW5kZW5jeSBtYXkgYmUgZGVjbGFyZWQgaW5cbiAgICAvLyBhIHN1Yi1wYWNrYWdlIChlLmcuIHBhY2thZ2VzL3NlcnZlcikgcmF0aGVyIHRoYW4gdGhlIHJvb3QsIHlldCBpdCBzdGlsbCBtYXRlcmlhbGl6ZXMgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290IHNvIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYCByZXNvbHZlcyBpdCB1bmlmb3JtbHkuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgY29sbGVjdE1hbmlmZXN0cyhwcm9qZWN0cyksIHtcbiAgICAgICAgb3V0RGlyOiBhcmd2Lm91dERpcixcbiAgICAgICAgZHJ5UnVuOiBCb29sZWFuKGFyZ3YuZHJ5UnVuKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzT3B0aW9ucyB7XG4gIC8qKiBEaXJlY3RvcnkgKHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QpIHRoYXQgZ2l0IGRlcGVuZGVuY2llcyBhcmUgY29waWVkIGludG8uICovXG4gIG91dERpcj86IHN0cmluZztcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbn1cblxuLyoqIFRoZSByb290IG1hbmlmZXN0IGZvbGxvd2VkIGJ5IGVhY2ggZGlzdGluY3Qgd29ya3NwYWNlIG1hbmlmZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RNYW5pZmVzdHMocHJvamVjdHM6IEZvdW5kUHJvamVjdHMpOiBQYWNrYWdlSnNvbltdIHtcbiAgY29uc3QgbWFuaWZlc3RzQnlEaXJQYXRoID0gbmV3IE1hcDxzdHJpbmcsIFBhY2thZ2VKc29uPigpO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgW3Byb2plY3RzLnJvb3QsIC4uLnByb2plY3RzLmRlc2NlbmRhbnRzXSkge1xuICAgIGlmICghbWFuaWZlc3RzQnlEaXJQYXRoLmhhcyhwcm9qZWN0LmRpclBhdGgpKSBtYW5pZmVzdHNCeURpclBhdGguc2V0KHByb2plY3QuZGlyUGF0aCwgcHJvamVjdC5wYWNrYWdlSnNvbik7XG4gIH1cbiAgcmV0dXJuIFsuLi5tYW5pZmVzdHNCeURpclBhdGgudmFsdWVzKCldO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXMoXG4gIHJvb3RQcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBtYW5pZmVzdFBhY2thZ2VKc29uczogUGFja2FnZUpzb25bXSxcbiAgb3B0aW9uczogTWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXNPcHRpb25zID0ge31cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IG91dERpciA9ICdAd2lsbGJvb3N0ZXInLCBkcnlSdW4gPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAvLyBPdXRwdXQgcGF0aHMgYXJlIHJlY3Vyc2l2ZWx5IERFTEVURUQgYmVmb3JlIGJlaW5nIHJlY3JlYXRlZCwgc28gbm9uZSBvZiB0aGVtIG1heSBjb250YWluIGFcbiAgLy8gc3ltbGluayBjb21wb25lbnQ6IGEgc3ltbGluayAoZS5nLiBgZXNjYXBlIC0+IG5vZGVfbW9kdWxlc2AsIG9yIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZWBcbiAgLy8gaXRzZWxmIGxpbmtpbmcgZWxzZXdoZXJlKSB3b3VsZCBlaXRoZXIgc211Z2dsZSB0aGUgZGVsZXRlIHBhc3QgdGhlIGxleGljYWwgb3ZlcmxhcCBndWFyZHNcbiAgLy8gb3IgZGVzdHJveSB0aGUgc3ltbGluaydzIHRhcmdldC4gUmVqZWN0aW5nIGNhbm9uaWNhbC9sZXhpY2FsIG1pc21hdGNoZXMga2VlcHMgZXZlcnlcbiAgLy8gZGVzdHJ1Y3RpdmUgb3BlcmF0aW9uIG9uIHRoZSBpbnRlbmRlZCBsZXhpY2FsIGxvY2F0aW9uLiBUaGVzZSBndWFyZHMgVEhST1cgKG5vdCBwcm9jZXNzLmV4aXQpXG4gIC8vIHNvIHRoZSBhdXRvbWF0aWMgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlYCBjYWxsZXIgY2FuIGNhdGNoIHRoZW0gYW5kIGNvbnRpbnVlXG4gIC8vIG5vbi1mYXRhbGx5OyB0aGUgZXhwbGljaXQgY29tbWFuZCdzIGhhbmRsZXIgY2F0Y2hlcyBhbmQgZXhpdHMuXG4gIGNvbnN0IHJvb3REaXJQYXRoID0gY2Fub25pY2FsaXplUGF0aChyb290UHJvamVjdERpclBhdGgpO1xuICBjb25zdCByZXNvbHZlT3V0cHV0RGlyUGF0aCA9IChyZWxhdGl2ZU9yQWJzb2x1dGVQYXRoOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGxleGljYWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCByZWxhdGl2ZU9yQWJzb2x1dGVQYXRoKTtcbiAgICBjb25zdCBjYW5vbmljYWxQYXRoID0gY2Fub25pY2FsaXplUGF0aChsZXhpY2FsUGF0aCk7XG4gICAgaWYgKGNhbm9uaWNhbFBhdGggIT09IGxleGljYWxQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bGFiZWx9IG11c3Qgbm90IGNvbnRhaW4gc3ltbGlua3MgKCR7bGV4aWNhbFBhdGh9IHJlc29sdmVzIHRvICR7Y2Fub25pY2FsUGF0aH0pLmApO1xuICAgIH1cbiAgICByZXR1cm4gbGV4aWNhbFBhdGg7XG4gIH07XG4gIGNvbnN0IG91dERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChvdXREaXIsICctLW91dC1kaXInKTtcbiAgYXNzZXJ0U3ViZGlyZWN0b3J5KHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKTtcbiAgLy8gUmVnaXN0cnkgcGFja2FnZXMgYWx3YXlzIG1hdGVyaWFsaXplIGF0IHRoZSByZXBvc2l0b3J5IHJvb3Q6IGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYFxuICAvLyByZXNvbHZlcyB0aGVtIGZyb20gYDxyb290Pi9Ad2lsbGJvb3N0ZXItcHJpdmF0ZWAgcmVnYXJkbGVzcyBvZiBgLS1vdXQtZGlyYC5cbiAgY29uc3QgcmVnaXN0cnlPdXREaXJQYXRoID0gcmVzb2x2ZU91dHB1dERpclBhdGgoXG4gICAgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSxcbiAgICBgVGhlICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0gb3V0cHV0IGRpcmVjdG9yeWBcbiAgKTtcbiAgaWYgKHBhdGhzT3ZlcmxhcChvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgLy8gZS5nLiBgLS1vdXQtZGlyIEB3aWxsYm9vc3Rlci1wcml2YXRlYCBvciBgLS1vdXQtZGlyIEB3aWxsYm9vc3Rlci1wcml2YXRlL3N1YmA6IHRoZVxuICAgIC8vIHJlZ2lzdHJ5IHN0ZXAgcmVjdXJzaXZlbHkgZGVsZXRlcyByZWdpc3RyeU91dERpclBhdGgsIHdoaWNoIHdvdWxkIGRlc3Ryb3kgdGhlIGdpdFxuICAgIC8vIHBhY2thZ2VzIGNvcGllZCBpbnRvIGFuIGVxdWFsIG9yIE5FU1RFRCBkaXJlY3RvcnkgbW9tZW50cyBlYXJsaWVyLlxuICAgIHRocm93IG5ldyBFcnJvcihgLS1vdXQtZGlyIG11c3Qgbm90IG92ZXJsYXAgdGhlICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0gcmVnaXN0cnkgb3V0cHV0IGRpcmVjdG9yeS5gKTtcbiAgfVxuICBjb25zdCBzdGFnaW5nUm9vdERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChwYXRoLmpvaW4oJy50bXAnLCAnd2ItcHJpdmF0ZS1zdGFnaW5nJyksICdUaGUgc3RhZ2luZyBkaXJlY3RvcnknKTtcbiAgY29uc3QgYmFja3VwUm9vdERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChwYXRoLmpvaW4oJy50bXAnLCAnd2ItcHJpdmF0ZS1iYWNrdXAnKSwgJ1RoZSBiYWNrdXAgZGlyZWN0b3J5Jyk7XG4gIGlmIChwYXRoc092ZXJsYXAob3V0RGlyUGF0aCwgY2Fub25pY2FsaXplUGF0aChwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnKSkpKSB7XG4gICAgLy8gVGhlIHJlY3Vyc2l2ZSBkZWxldGUgb2Ygb3V0RGlyUGF0aCB3b3VsZCBkZXN0cm95IHRoZSBpbnN0YWxsZWQgc291cmNlcyB0aGUgY29waWVzIHJlYWQuXG4gICAgdGhyb3cgbmV3IEVycm9yKCctLW91dC1kaXIgbXVzdCBub3Qgb3ZlcmxhcCBub2RlX21vZHVsZXMuJyk7XG4gIH1cbiAgZm9yIChjb25zdCBbbGFiZWwsIHRlbXBvcmFyeURpclBhdGhdIG9mIFtcbiAgICBbJ3N0YWdpbmcnLCBzdGFnaW5nUm9vdERpclBhdGhdLFxuICAgIFsnYmFja3VwJywgYmFja3VwUm9vdERpclBhdGhdLFxuICBdIGFzIGNvbnN0KSB7XG4gICAgaWYgKHBhdGhzT3ZlcmxhcChvdXREaXJQYXRoLCB0ZW1wb3JhcnlEaXJQYXRoKSB8fCBwYXRoc092ZXJsYXAocmVnaXN0cnlPdXREaXJQYXRoLCB0ZW1wb3JhcnlEaXJQYXRoKSkge1xuICAgICAgLy8gQm90aCBkaXJlY3RvcmllcyBhcmUgcmVjdXJzaXZlbHkgcmVjcmVhdGVkLCBzaWxlbnRseSBkaXNjYXJkaW5nIGFueXRoaW5nIG1hdGVyaWFsaXplZCBpbnRvXG4gICAgICAvLyBhbiBlcXVhbCBvciBuZXN0ZWQgb3V0cHV0IGRpcmVjdG9yeSBtb21lbnRzIGVhcmxpZXIuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dHB1dCBkaXJlY3RvcmllcyBtdXN0IG5vdCBvdmVybGFwIHRoZSAke2xhYmVsfSBkaXJlY3RvcnkgKCR7dGVtcG9yYXJ5RGlyUGF0aH0pLmApO1xuICAgIH1cbiAgfVxuICAvLyBTdGFnaW5nIE1JUlJPUlMgZWFjaCBvdXRwdXQgdHJlZSdzIHJlcG9zaXRvcnktcm9vdC1yZWxhdGl2ZSBsb2NhdGlvbiAoZS5nLlxuICAvLyBgPHJvb3Q+L0B3aWxsYm9vc3Rlci1wcml2YXRlL2FgIHN0YWdlcyBhdCBgPHN0YWdpbmc+L0B3aWxsYm9vc3Rlci1wcml2YXRlL2FgKSwgc28gdGhlIHJlbGF0aXZlXG4gIC8vIGRpc3RhbmNlIGJldHdlZW4gYW55IHR3byBzdGFnZWQgdHJlZXMgZXF1YWxzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZWlyIGZpbmFsIGxvY2F0aW9ucy4gVGhhdFxuICAvLyBtYWtlcyBjcm9zcy10cmVlIGBmaWxlOmAgcmV3cml0ZXMgKGUuZy4gYC4uLy4uL0B3aWxsYm9vc3Rlci88bmFtZT5gKSBjb21wdXRlZCBhZ2FpbnN0IHN0YWdpbmdcbiAgLy8gY29ycmVjdCBhZnRlciB0aGUgc3dhcCwgd2hpY2ggbGV0cyBldmVyeSBmYWlsdXJlLXByb25lIHN0ZXAg4oCUIGRvd25sb2FkLCBleHRyYWN0aW9uLCBuZXN0ZWRcbiAgLy8gZGlzY292ZXJ5LCByZXdyaXRpbmcg4oCUIGZpbmlzaCBiZWZvcmUgZWl0aGVyIGxpdmUgdHJlZSBpcyB0b3VjaGVkLlxuICBjb25zdCB0b1N0YWdlZFBhdGggPSAoZmluYWxQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgICBwYXRoLmpvaW4oc3RhZ2luZ1Jvb3REaXJQYXRoLCBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBmaW5hbFBhdGgpKTtcbiAgaWYgKHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIG91dERpclBhdGgpICE9PSAnQHdpbGxib29zdGVyJykge1xuICAgIC8vIFByZS1leGlzdGluZyBsaW1pdGF0aW9uIG9mIHRoZSBvcHRpb246IHRoZSBEb2NrZXIgbWFuaWZlc3QgcmV3cml0ZSBoYXMgbm8gYWNjZXNzIHRvIGl0LlxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgJ05vdGU6IHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgcmV3cml0ZXMgZ2l0IGRlcGVuZGVuY2llcyB0byA8cm9vdD4vQHdpbGxib29zdGVyOyBhIGN1c3RvbSAtLW91dC1kaXIgcmVxdWlyZXMgYSBtYXRjaGluZyBEb2NrZXJmaWxlIGxheW91dC4nXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBjb25zdCBwcml2YXRlUGFja2FnZXMgPSBhd2FpdCBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICAgIHJvb3REaXJQYXRoLFxuICAgIG1hbmlmZXN0UGFja2FnZUpzb25zLFxuICAgIG91dERpclBhdGgsXG4gICAgcmVnaXN0cnlPdXREaXJQYXRoXG4gICk7XG5cbiAgaWYgKGRyeVJ1bikge1xuICAgIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGgsIHByaXZhdGVQYWNrYWdlcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmVnaXN0cnkgcGFja2FnZXMgd2hvc2UgaW5zdGFsbGVkIGNvcHkgc2F0aXNmaWVzIHRoZSBzcGVjaWZpZXIgYXJlIGNvcGllZCBmcm9tXG4gIC8vIG5vZGVfbW9kdWxlczsgb25seSB0aGUgcmVzdCBhcmUgZG93bmxvYWRlZCwgc28gcmVnaXN0cnkgY3JlZGVudGlhbHMgYXJlIG5lZWRlZCBvbmx5IHdoZW4gYVxuICAvLyBkb3dubG9hZCBhY3R1YWxseSBoYXBwZW5zIChDSSB0ZXN0IHN0ZXBzIGRlbGliZXJhdGVseSByZWNlaXZlIG5vIFZlcmRhY2NpbyB0b2tlbikuXG4gIGNvbnN0IGRvd25sb2FkZWRQYWNrYWdlcyA9IFsuLi5wcml2YXRlUGFja2FnZXMudmFsdWVzKCldLmZpbHRlcigocCkgPT4gcC5raW5kID09PSAncmVnaXN0cnknICYmICFwLnNvdXJjZURpclBhdGgpO1xuICAvLyBSZXNvbHZlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gQkVGT1JFIGRlbGV0aW5nIHRoZSBleGlzdGluZyBtYXRlcmlhbGl6YXRpb25zLCBzbyBhIG1pc3NpbmdcbiAgLy8gcmVnaXN0cnkgY29uZmlndXJhdGlvbiBjYW5ub3QgZGVzdHJveSBhIHByZXZpb3VzbHkgdXNhYmxlIG91dHB1dCB0cmVlLiBUaHJvdyAocmF0aGVyIHRoYW5cbiAgLy8gZXhpdCkgc28gY2FsbGVycyBjYW4gZGVjaWRlOiBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgcmVwb3J0cyBpdCBhbmQgZXhpdHMsIHdoaWxlIHRoZVxuICAvLyBhdXRvbWF0aWMgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlYCBzdGVwIGNhdGNoZXMgaXQgYW5kIGNvbnRpbnVlcywgbGVhdmluZyB0aGVcbiAgLy8gZXhpc3Rpbmcgb3V0cHV0IHVudG91Y2hlZCAobm90aGluZyBoYXMgYmVlbiBkZWxldGVkIHlldCBhdCB0aGlzIHBvaW50KS5cbiAgY29uc3QgYXV0aCA9IGRvd25sb2FkZWRQYWNrYWdlcy5sZW5ndGggPiAwID8gcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgocm9vdERpclBhdGgpIDogdW5kZWZpbmVkO1xuICBpZiAoZG93bmxvYWRlZFBhY2thZ2VzLmxlbmd0aCA+IDAgJiYgIWF1dGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IGRvd25sb2FkICR7ZG93bmxvYWRlZFBhY2thZ2VzLm1hcCgocCkgPT4gcC5uYW1lKS5qb2luKCcsICcpfTogbm8gcmVnaXN0cnkgY29uZmlndXJlZCBmb3IgdGhlICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0gc2NvcGU7IGAgK1xuICAgICAgICBgYWRkIFwiJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfTpyZWdpc3RyeT0uLi5cIiB0byAubnBtcmMgb3Igfi8ubnBtcmMuIE9ubHkgaW5zdGFsbGVkIGNvcGllcyBzYXRpc2Z5aW5nIGFuIGV4YWN0IHZlcnNpb24gb3IgYCArXG4gICAgICAgICdzZW12ZXIgcmFuZ2UgYXJlIHJldXNlZCB3aXRob3V0IHJlZ2lzdHJ5IGFjY2VzczsgZGlzdC10YWcgc3BlY2lmaWVycyAoZS5nLiBgbGF0ZXN0YCkgYWx3YXlzIHJlcXVpcmUgaXQuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBjb3BpZWRQYWNrYWdlcyA9IFsuLi5wcml2YXRlUGFja2FnZXMudmFsdWVzKCldLmZpbHRlcigocCkgPT4gcC5raW5kID09PSAnZ2l0Jyk7XG4gIGNvbnN0IHJlZ2lzdHJ5UGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ3JlZ2lzdHJ5Jyk7XG5cbiAgLy8gTWF0ZXJpYWxpemUgQk9USCB0cmVlcyBpbnRvIHN0YWdpbmcgYW5kIHN3YXAgdGhlbSBpbiBvbmx5IGFmdGVyIGV2ZXJ5IGZhaWx1cmUtcHJvbmUgc3RlcFxuICAvLyBzdWNjZWVkZWQ6IGEgcmVnaXN0cnkgZmV0Y2gvZXh0cmFjdGlvbi9uZXN0ZWQtZGlzY292ZXJ5L3Jld3JpdGUgZmFpbHVyZSBtdXN0IGxlYXZlIGJvdGggbGl2ZVxuICAvLyB0cmVlcyBleGFjdGx5IGFzIHRoZXkgd2VyZS4gT3RoZXJ3aXNlIHRoZSBhdXRvbWF0aWMgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlYFxuICAvLyBjYWxsZXIg4oCUIHdoaWNoIGNhdGNoZXMgdGhlIGZhaWx1cmUgYW5kIGNvbnRpbnVlcyDigJQgd291bGQgcmV3cml0ZSBkZXBlbmRlbmNpZXMgYWdhaW5zdFxuICAvLyBpbmNvbnNpc3RlbnQgdHJlZXMgKGUuZy4gYSByZWdpc3RyeSBtYW5pZmVzdCBwb2ludGluZyBhdCBhIGRlbGV0ZWQgYEB3aWxsYm9vc3Rlci88bmFtZT5gKS5cbiAgYXdhaXQgZnMucHJvbWlzZXMucm0oc3RhZ2luZ1Jvb3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIHRyeSB7XG4gICAgLy8gQm90aCBvdXRwdXQgZGlyZWN0b3JpZXMgYWx3YXlzIGV4aXN0IGFmdGVyd2FyZHM6IERvY2tlcmZpbGVzIENPUFkgdGhlbSB1bmNvbmRpdGlvbmFsbHksIGFuZFxuICAgIC8vIGEgbWlzc2luZyBzb3VyY2UgcGF0aCBmYWlscyB0aGUgYnVpbGQuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodG9TdGFnZWRQYXRoKG91dERpclBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0b1N0YWdlZFBhdGgocmVnaXN0cnlPdXREaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBjb3BpZWRQYWNrYWdlcykge1xuICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLCB0b1N0YWdlZFBhdGgocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHJlZ2lzdHJ5UGFja2FnZXMpIHtcbiAgICAgIGlmIChwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoKSB7XG4gICAgICAgIGF3YWl0IGNvcHlJbnN0YWxsZWRQYWNrYWdlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZSwgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UoXG4gICAgICAgIC8vIGRvd25sb2FkZWRQYWNrYWdlcyBpcyBub24tZW1wdHkgb24gdGhpcyBwYXRoLCBzbyB0aGUgYXV0aCBjaGVjayBhYm92ZSBwYXNzZWQuXG4gICAgICAgIGF1dGghLFxuICAgICAgICBwcml2YXRlUGFja2FnZS5uYW1lLFxuICAgICAgICBwcml2YXRlUGFja2FnZS52ZXJzaW9uU3BlY2lmaWVyID8/ICdsYXRlc3QnLFxuICAgICAgICB0b1N0YWdlZFBhdGgocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aClcbiAgICAgICk7XG4gICAgICBwcml2YXRlUGFja2FnZS5yZXNvbHZlZFZlcnNpb24gPSByZWFkSW5zdGFsbGVkVmVyc2lvbihcbiAgICAgICAgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpLFxuICAgICAgICBwcml2YXRlUGFja2FnZS5uYW1lXG4gICAgICApO1xuICAgICAgY29uc29sZS5pbmZvKGBEb3dubG9hZGVkICR7cHJpdmF0ZVBhY2thZ2UubmFtZX0gdG8gJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKX1gKTtcbiAgICAgIC8vIEEgZG93bmxvYWRlZCBwYWNrYWdlIG1heSBpdHNlbGYgZGVwZW5kIG9uIHByaXZhdGUgcGFja2FnZXMgdGhhdCB3ZXJlIG5vdCB2aXNpYmxlIGJlZm9yZVxuICAgICAgLy8gZXh0cmFjdGlvbjsgbWF0ZXJpYWxpemUgdGhlbSB0b28uIEluc3RhbGxlZCBjb3BpZXMgd2VyZSBhbHJlYWR5IGRlZXAtc2Nhbm5lZCBieVxuICAgICAgLy8gY29sbGVjdFByaXZhdGVQYWNrYWdlcy5cbiAgICAgIGF3YWl0IGNvbGxlY3ROZXN0ZWRQcml2YXRlUGFja2FnZXMoXG4gICAgICAgIHJvb3REaXJQYXRoLFxuICAgICAgICBhdXRoISxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UsXG4gICAgICAgIHByaXZhdGVQYWNrYWdlcyxcbiAgICAgICAgb3V0RGlyUGF0aCxcbiAgICAgICAgcmVnaXN0cnlPdXREaXJQYXRoLFxuICAgICAgICB0b1N0YWdlZFBhdGhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgcmVwbGFjZVByaXZhdGVEZXBlbmRlbmNpZXMoc3RhZ2luZ1Jvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZXMsIHRvU3RhZ2VkUGF0aCk7XG4gICAgYXdhaXQgc3dhcE1hdGVyaWFsaXplZFRyZWVzKFtvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGhdLCB0b1N0YWdlZFBhdGgsIGJhY2t1cFJvb3REaXJQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShzdGFnaW5nUm9vdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICBjb25zb2xlLmluZm8oXG4gICAgYEVuc3VyZSB0aGUgRG9ja2VyZmlsZSBDT1BZcyAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIG91dERpclBhdGgpfS8gYW5kICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0vIGludG8gdGhlIGltYWdlIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcy5gXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RQcml2YXRlUGFja2FnZXMoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIG1hbmlmZXN0UGFja2FnZUpzb25zOiBQYWNrYWdlSnNvbltdLFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPj4ge1xuICBjb25zdCBwcml2YXRlUGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KCk7XG4gIC8vIFNlZWQgZnJvbSBldmVyeSBtYW5pZmVzdCAocm9vdCArIHdvcmtzcGFjZXMpOyBvbmUgcHJpdmF0ZSBwYWNrYWdlIG1heSBiZSByZXF1ZXN0ZWQgYnkgc2V2ZXJhbFxuICAvLyBtYW5pZmVzdHMsIHNvIG1lcmdlIGR1cGxpY2F0ZXMgdGhlIHNhbWUgd2F5IG5lc3RlZCBkaXNjb3ZlcnkgZG9lcyDigJQga2VlcCB0aGUgbmFycm93ZXJcbiAgLy8gY29tcGF0aWJsZSByZXF1aXJlbWVudCBhbmQgZmFpbCBsb3VkbHkgb24gYSBnZW51aW5lIGNvbmZsaWN0LlxuICBjb25zdCBwYWNrYWdlc1RvUHJvY2VzczogUHJpdmF0ZVBhY2thZ2VbXSA9IFtdO1xuICBjb25zdCBxdWV1ZWRQYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4oKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvbiBvZiBtYW5pZmVzdFBhY2thZ2VKc29ucykge1xuICAgIGZvciAoY29uc3QgcmVxdWVzdGVkIG9mIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uLCBvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgICBjb25zdCBxdWV1ZWQgPSBxdWV1ZWRQYWNrYWdlcy5nZXQocmVxdWVzdGVkLm5hbWUpO1xuICAgICAgaWYgKCFxdWV1ZWQpIHtcbiAgICAgICAgcXVldWVkUGFja2FnZXMuc2V0KHJlcXVlc3RlZC5uYW1lLCByZXF1ZXN0ZWQpO1xuICAgICAgICBwYWNrYWdlc1RvUHJvY2Vzcy5wdXNoKHJlcXVlc3RlZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgbmFycm93ZXIgPSBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChxdWV1ZWQsIHJlcXVlc3RlZCk7XG4gICAgICBpZiAobmFycm93ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChxdWV1ZWQsIHJlcXVlc3RlZCwgcGFja2FnZUpzb24ubmFtZSA/PyAnYSB3b3Jrc3BhY2UgbWFuaWZlc3QnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlZC52ZXJzaW9uU3BlY2lmaWVyID0gbmFycm93ZXIudmVyc2lvblNwZWNpZmllcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGFja2FnZXNUb1Byb2Nlc3MubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgcHJpdmF0ZVBhY2thZ2UgPSBwYWNrYWdlc1RvUHJvY2Vzc1tpbmRleF07XG4gICAgaWYgKCFwcml2YXRlUGFja2FnZSkgY29udGludWU7XG4gICAgaWYgKHByaXZhdGVQYWNrYWdlcy5oYXMocHJpdmF0ZVBhY2thZ2UubmFtZSkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHByaXZhdGVQYWNrYWdlLmtpbmQgPT09ICdnaXQnKSB7XG4gICAgICBwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbnN0YWxsZWQgPSBmaW5kSW5zdGFsbGVkUmVnaXN0cnlQYWNrYWdlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZSk7XG4gICAgICBwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoID0gaW5zdGFsbGVkPy5kaXJQYXRoO1xuICAgICAgcHJpdmF0ZVBhY2thZ2UucmVzb2x2ZWRWZXJzaW9uID0gaW5zdGFsbGVkPy52ZXJzaW9uO1xuICAgIH1cbiAgICAvLyBTZWxlY3RlZCBCRUZPUkUgdGhlIGRlZXAgc2NhbjogYSBtYW5pZmVzdCBpbnNpZGUgdGhlIHBhY2thZ2UgbWF5IHJlZmVyIGJhY2sgdG8gdGhlIHBhY2thZ2VcbiAgICAvLyBpdHNlbGYsIGFuZCB0aGF0IHJlcXVpcmVtZW50IG11c3QgYmUgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHNlbGVjdGlvbiAoYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3RcbiAgICAvLyBiZWxvdyksIG5ldmVyIG5hcnJvdyB0aGUgYWxyZWFkeS1zZWxlY3RlZCBzcGVjaWZpZXIuXG4gICAgcHJpdmF0ZVBhY2thZ2VzLnNldChwcml2YXRlUGFja2FnZS5uYW1lLCBwcml2YXRlUGFja2FnZSk7XG4gICAgLy8gTmVzdGVkIHByaXZhdGUgZGVwZW5kZW5jaWVzIG9mIGFuIGluc3RhbGxlZCBwYWNrYWdlIGFyZSBkaXNjb3ZlcmFibGUgcmlnaHQgYXdheTsgcmVnaXN0cnlcbiAgICAvLyBwYWNrYWdlcyB3aXRob3V0IGEgdXNhYmxlIGluc3RhbGxlZCBjb3B5IGFyZSBpbnNwZWN0ZWQgYWZ0ZXIgZG93bmxvYWQgaW5zdGVhZFxuICAgIC8vIChjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKS5cbiAgICBpZiAocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCkge1xuICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoKTtcbiAgICAgICAgZm9yIChjb25zdCBuZXN0ZWQgb2YgZmluZFByaXZhdGVEZXBlbmRlbmNpZXMocGFja2FnZUpzb24sIG91dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBxdWV1ZWQgPSBxdWV1ZWRQYWNrYWdlcy5nZXQobmVzdGVkLm5hbWUpO1xuICAgICAgICAgIGlmICghcXVldWVkKSB7XG4gICAgICAgICAgICBxdWV1ZWRQYWNrYWdlcy5zZXQobmVzdGVkLm5hbWUsIG5lc3RlZCk7XG4gICAgICAgICAgICBwYWNrYWdlc1RvUHJvY2Vzcy5wdXNoKG5lc3RlZCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByaXZhdGVQYWNrYWdlcy5oYXMobmVzdGVkLm5hbWUpKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IG1hdGVyaWFsaXplZCAob3Igc2VsZWN0ZWQpOiB0aGUgcmVxdWlyZW1lbnQgbXVzdCBhZG1pdCB0aGF0IHNlbGVjdGlvbi5cbiAgICAgICAgICAgIGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0KHF1ZXVlZCwgbmVzdGVkLCBwcml2YXRlUGFja2FnZS5uYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU3RpbGwgcXVldWVkOiBrZWVwIHRoZSBOQVJST1dFUiBjb21wYXRpYmxlIHJlcXVpcmVtZW50IHNvIGRpc2NvdmVyeSBvcmRlciBjYW5ub3RcbiAgICAgICAgICAgIC8vIHR1cm4gY29tcGF0aWJsZSBjb25zdHJhaW50cyAoZS5nLiBgXjEuMC4wYCBhbmQgYDEuMi4zYCkgaW50byBhIHNwdXJpb3VzIGNvbmZsaWN0LlxuICAgICAgICAgICAgY29uc3QgbmFycm93ZXIgPSBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChxdWV1ZWQsIG5lc3RlZCk7XG4gICAgICAgICAgICBpZiAobmFycm93ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChxdWV1ZWQsIG5lc3RlZCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBxdWV1ZWQudmVyc2lvblNwZWNpZmllciA9IG5hcnJvd2VyLnZlcnNpb25TcGVjaWZpZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHByaXZhdGVQYWNrYWdlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgZXh0cmFjdGVkUGFja2FnZTogUHJpdmF0ZVBhY2thZ2UsXG4gIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+LFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nLFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEV2ZXJ5IG1hdGVyaWFsaXplZCBwYWNrYWdlIOKAlCBpbmNsdWRpbmcgYSBsYXRlLWRpc2NvdmVyZWQgbmVzdGVkIGdpdCBkZXBlbmRlbmN5IOKAlCBsaXZlcyBpblxuICAvLyBzdGFnaW5nIHVudGlsIHRoZSBhdG9taWMgc3dhcCwgc28gaXRzIG1hbmlmZXN0cyBtdXN0IGJlIHJlYWQgdGhlcmUuXG4gIGNvbnN0IGV4dHJhY3RlZERpclBhdGggPSB0b1N0YWdlZFBhdGgoZXh0cmFjdGVkUGFja2FnZS50YXJnZXREaXJQYXRoKTtcbiAgLy8gU2NhbiBFVkVSWSBtYW5pZmVzdCBvZiB0aGUgbWF0ZXJpYWxpemVkIHBhY2thZ2UgKG9yZyBnaXQgZGVwZW5kZW5jaWVzIGFyZSB3aG9sZSBtb25vcmVwb1xuICAvLyBjaGVja291dHMgd2l0aCBwYWNrYWdlcy8qL3BhY2thZ2UuanNvbiksIG1pcnJvcmluZyBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzJyBkZWVwIHNjYW4g4oCUIHRoZVxuICAvLyBkZXBlbmRlbmN5LXJld3JpdGUgc3RlcCB3YWxrcyB0aGUgc2FtZSBzZXQsIHNvIGFueXRoaW5nIGRlY2xhcmVkIHRoZXJlIG11c3QgYmUgbWF0ZXJpYWxpemVkLlxuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyhleHRyYWN0ZWREaXJQYXRoKSkge1xuICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKFxuICAgICAgYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCksXG4gICAgICBvdXREaXJQYXRoLFxuICAgICAgcmVnaXN0cnlPdXREaXJQYXRoXG4gICAgKSkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5lc3RlZC5uYW1lKTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICBpZiAoZXhpc3Rpbmcua2luZCA9PT0gJ3JlZ2lzdHJ5JyAmJiAhZXhpc3Rpbmcuc291cmNlRGlyUGF0aCAmJiBleGlzdGluZy5yZXNvbHZlZFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFN0aWxsIGF3YWl0aW5nIGl0cyBkb3dubG9hZCAobm8gaW5zdGFsbGVkIGNvcHkgc2VsZWN0ZWQsIG5vdGhpbmcgZXh0cmFjdGVkIHlldCk6IGtlZXBcbiAgICAgICAgICAvLyB0aGUgTkFSUk9XRVIgY29tcGF0aWJsZSByZXF1aXJlbWVudCwgZXhhY3RseSBhcyBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzIGRvZXMgZm9yXG4gICAgICAgICAgLy8gcXVldWVkIHBhY2thZ2VzLCBzbyBsYXRlLWRpc2NvdmVyZWQgbmVzdGVkIGNvbnN0cmFpbnRzIGNhbm5vdCBmYWJyaWNhdGUgY29uZmxpY3RzLlxuICAgICAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQoZXhpc3RpbmcsIG5lc3RlZCk7XG4gICAgICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0KGV4aXN0aW5nLCBuZXN0ZWQsIGV4dHJhY3RlZFBhY2thZ2UubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPSBuYXJyb3dlci52ZXJzaW9uU3BlY2lmaWVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDb2xsYXBzaW5nIGRpZmZlcmVudCByZXF1ZXN0ZWQgdmVyc2lvbnMgaW50byBvbmUgbWF0ZXJpYWxpemF0aW9uIHdvdWxkIHNpbGVudGx5XG4gICAgICAgICAgLy8gdmlvbGF0ZSB0aGUgZGVwZW5kZW50J3MgcmVxdWlyZW1lbnQsIHNvIGNvbmZsaWN0cyBtdXN0IGZhaWwgbG91ZGx5LlxuICAgICAgICAgIGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0KGV4aXN0aW5nLCBuZXN0ZWQsIGV4dHJhY3RlZFBhY2thZ2UubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXN0ZWQua2luZCA9PT0gJ2dpdCcpIHtcbiAgICAgICAgbmVzdGVkLnNvdXJjZURpclBhdGggPSBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290RGlyUGF0aCwgbmVzdGVkLm5hbWUpO1xuICAgICAgICBhd2FpdCBjb3B5SW5zdGFsbGVkUGFja2FnZShyb290RGlyUGF0aCwgbmVzdGVkLCB0b1N0YWdlZFBhdGgobmVzdGVkLnRhcmdldERpclBhdGgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluc3RhbGxlZCA9IGZpbmRJbnN0YWxsZWRSZWdpc3RyeVBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCk7XG4gICAgICAgIG5lc3RlZC5zb3VyY2VEaXJQYXRoID0gaW5zdGFsbGVkPy5kaXJQYXRoO1xuICAgICAgICBuZXN0ZWQucmVzb2x2ZWRWZXJzaW9uID0gaW5zdGFsbGVkPy52ZXJzaW9uO1xuICAgICAgICBpZiAobmVzdGVkLnNvdXJjZURpclBhdGgpIHtcbiAgICAgICAgICBhd2FpdCBjb3B5SW5zdGFsbGVkUGFja2FnZShyb290RGlyUGF0aCwgbmVzdGVkLCB0b1N0YWdlZFBhdGgobmVzdGVkLnRhcmdldERpclBhdGgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UoXG4gICAgICAgICAgICBhdXRoLFxuICAgICAgICAgICAgbmVzdGVkLm5hbWUsXG4gICAgICAgICAgICBuZXN0ZWQudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JyxcbiAgICAgICAgICAgIHRvU3RhZ2VkUGF0aChuZXN0ZWQudGFyZ2V0RGlyUGF0aClcbiAgICAgICAgICApO1xuICAgICAgICAgIG5lc3RlZC5yZXNvbHZlZFZlcnNpb24gPSByZWFkSW5zdGFsbGVkVmVyc2lvbih0b1N0YWdlZFBhdGgobmVzdGVkLnRhcmdldERpclBhdGgpLCBuZXN0ZWQubmFtZSk7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBEb3dubG9hZGVkICR7bmVzdGVkLm5hbWV9IChuZXN0ZWQgZGVwZW5kZW5jeSkgdG8gJHtuZXN0ZWQudGFyZ2V0RGlyUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJpdmF0ZVBhY2thZ2VzLnNldChuZXN0ZWQubmFtZSwgbmVzdGVkKTtcbiAgICAgIGF3YWl0IGNvbGxlY3ROZXN0ZWRQcml2YXRlUGFja2FnZXMoXG4gICAgICAgIHJvb3REaXJQYXRoLFxuICAgICAgICBhdXRoLFxuICAgICAgICBuZXN0ZWQsXG4gICAgICAgIHByaXZhdGVQYWNrYWdlcyxcbiAgICAgICAgb3V0RGlyUGF0aCxcbiAgICAgICAgcmVnaXN0cnlPdXREaXJQYXRoLFxuICAgICAgICB0b1N0YWdlZFBhdGhcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBgZGVzdGluYXRpb25EaXJQYXRoYCBtYXkgZGlmZmVyIGZyb20gYHRhcmdldERpclBhdGhgIHdoaWxlIHJlZ2lzdHJ5IHBhY2thZ2VzIHN0YWdlLiAqL1xuYXN5bmMgZnVuY3Rpb24gY29weUluc3RhbGxlZFBhY2thZ2UoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHByaXZhdGVQYWNrYWdlOiBQcml2YXRlUGFja2FnZSxcbiAgZGVzdGluYXRpb25EaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBIHJlZ2lzdHJ5IHBhY2thZ2UncyB0YXJiYWxsIG1heSBsZWdpdGltYXRlbHkgY29udGFpbiBub2RlX21vZHVsZXMvIGNvbnRlbnQgdmlhXG4gIC8vIGJ1bmRsZWREZXBlbmRlbmNpZXM7IHRob3NlIGZpbGVzIGFyZSBwYXJ0IG9mIHRoZSBhcnRpZmFjdCBhbmQgbXVzdCBzdXJ2aXZlIHRoZSBjb3B5LiBHaXRcbiAgLy8gY2hlY2tvdXRzIChhbmQgbm9uLWJ1bmRsZWQgbmFtZXMpIHN0aWxsIGV4Y2x1ZGUgbm9kZV9tb2R1bGVzLCB3aGljaCBob2xkcyBsb2NhbGx5IGluc3RhbGxlZFxuICAvLyBkZXBlbmRlbmNpZXMgdGhlcmUuXG4gIGNvbnN0IGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMgPVxuICAgIHByaXZhdGVQYWNrYWdlLmtpbmQgPT09ICdyZWdpc3RyeScgPyByZWFkQnVuZGxlZERlcGVuZGVuY3lOYW1lcyhwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoISkgOiBbXTtcbiAgYXdhaXQgZnMucHJvbWlzZXMuY3AocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCEsIGRlc3RpbmF0aW9uRGlyUGF0aCwge1xuICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICBmb3JjZTogdHJ1ZSxcbiAgICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgZXhwb3NlcyBpbnN0YWxsZWQgcGFja2FnZXMgdGhyb3VnaCBzeW1saW5rczsgdGhlIG1hdGVyaWFsaXplZCB0cmVlXG4gICAgLy8gbXVzdCBjb250YWluIHJlYWwgZmlsZXMgKGEgY29waWVkIGFic29sdXRlIHN5bWxpbmsgd291bGQgZGFuZ2xlIGluc2lkZSB0aGUgRG9ja2VyIGltYWdlLFxuICAgIC8vIGFuZCBsYXRlciBkZXBlbmRlbmN5IHJld3JpdGluZyB3b3VsZCB3cml0ZSB0aHJvdWdoIGl0IGludG8gdGhlIHNoYXJlZCBzdG9yZSkuXG4gICAgZGVyZWZlcmVuY2U6IHRydWUsXG4gICAgZmlsdGVyOiAoc3JjKSA9PiB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGgucmVsYXRpdmUocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCEsIHNyYykuc3BsaXQocGF0aC5zZXApO1xuICAgICAgaWYgKHNlZ21lbnRzLmluY2x1ZGVzKCcuZ2l0JykpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IG5vZGVNb2R1bGVzSW5kZXggPSBzZWdtZW50cy5pbmRleE9mKCdub2RlX21vZHVsZXMnKTtcbiAgICAgIGlmIChub2RlTW9kdWxlc0luZGV4ID09PSAtMSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoYnVuZGxlZERlcGVuZGVuY3lOYW1lcyA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoYnVuZGxlZERlcGVuZGVuY3lOYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFRoZSBub2RlX21vZHVsZXMgKGFuZCBAc2NvcGUpIGRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMgbXVzdCBjb3B5IHNvIGJ1bmRsZWQgc3VidHJlZXMgY2FuO1xuICAgICAgLy8gb25seSB0aGUgZmlyc3Qgbm9kZV9tb2R1bGVzIGxldmVsIGZpbHRlcnMg4oCUIGFueXRoaW5nIGluc2lkZSBhIGJ1bmRsZWQgc3VidHJlZSBiZWxvbmdzIHRvXG4gICAgICAvLyB0aGUgYXJ0aWZhY3QsIGluY2x1ZGluZyBpdHMgb3duIG5lc3RlZCBub2RlX21vZHVsZXMuXG4gICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBzZWdtZW50cy5zbGljZShub2RlTW9kdWxlc0luZGV4ICsgMSk7XG4gICAgICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoZmlyc3Quc3RhcnRzV2l0aCgnQCcpICYmIHNlY29uZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBidW5kbGVkRGVwZW5kZW5jeU5hbWVzLnNvbWUoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aChgJHtmaXJzdH0vYCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBmaXJzdC5zdGFydHNXaXRoKCdAJykgPyBgJHtmaXJzdH0vJHtzZWNvbmR9YCA6IGZpcnN0O1xuICAgICAgcmV0dXJuIGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMuaW5jbHVkZXMocGFja2FnZU5hbWUpO1xuICAgIH0sXG4gIH0pO1xuICBjb25zb2xlLmluZm8oYENvcGllZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9IHRvICR7cGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCl9YCk7XG59XG5cbi8qKiBEZWNsYXJlZCBidW5kbGVkIGRlcGVuZGVuY3kgbmFtZXMgb2YgdGhlIGluc3RhbGxlZCBwYWNrYWdlOyBgdHJ1ZWAgYnVuZGxlcyBldmVyeSBkZXBlbmRlbmN5LiAqL1xuZnVuY3Rpb24gcmVhZEJ1bmRsZWREZXBlbmRlbmN5TmFtZXMoc291cmNlRGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10gfCB0cnVlIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihzb3VyY2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICAgIGJ1bmRsZURlcGVuZGVuY2llcz86IHN0cmluZ1tdIHwgYm9vbGVhbjtcbiAgICAgIGJ1bmRsZWREZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB8IGJvb2xlYW47XG4gICAgfTtcbiAgICBjb25zdCBidW5kbGVkID0gcGFja2FnZUpzb24uYnVuZGxlRGVwZW5kZW5jaWVzID8/IHBhY2thZ2VKc29uLmJ1bmRsZWREZXBlbmRlbmNpZXM7XG4gICAgaWYgKGJ1bmRsZWQgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGJ1bmRsZWQpID8gYnVuZGxlZC5maWx0ZXIoKG5hbWUpID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykgOiBbXTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG1hdGVyaWFsaXphdGlvbiBmb3IgYGV4aXN0aW5nYCBpcyBhbHJlYWR5IHNlbGVjdGVkIChhIHJhbmdlIHJlc29sdmVzIG1heC1zYXRpc2Z5aW5nIGFnYWluc3RcbiAqIHRoZSByZWdpc3RyeSDigJQgc2VlIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZSksIHNvIGFjY2VwdCBgcmVxdWVzdGVkYCBvbmx5IHdoZW4gaXQgaXNcbiAqIGd1YXJhbnRlZWQgc2F0aXNmaWVkOiBgZXhpc3RpbmdgIG11c3QgYmUgYSBzdWJzZXQgb2YgaXQgKGV2ZXJ5IHBvc3NpYmxlIHJlc29sdXRpb24gb2YgYGV4aXN0aW5nYFxuICogdGhlbiBzYXRpc2ZpZXMgYHJlcXVlc3RlZGApLiBOb24tcmFuZ2Ugc3BlY2lmaWVycyAoZGlzdC10YWdzLCBnaXQgVVJMcy9yZXZpc2lvbnMpIG11c3QgbWF0Y2hcbiAqIGV4YWN0bHkuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0KGV4aXN0aW5nOiBQcml2YXRlUGFja2FnZSwgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZSwgZGVwZW5kZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGlzdGluZy5raW5kID09PSByZXF1ZXN0ZWQua2luZCkge1xuICAgIGlmIChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID09PSByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikgcmV0dXJuO1xuICAgIGlmIChzcGVjaWZpZXJTdWJzZXQoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciwgcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpKSByZXR1cm47XG4gICAgLy8gT25jZSB0aGUgY29uY3JldGUgbWF0ZXJpYWxpemVkIHZlcnNpb24gaXMga25vd24gKGluc3RhbGxlZCBjb3B5IG9yIGV4dHJhY3RlZCBkb3dubG9hZCksIGFcbiAgICAvLyByZXF1aXJlbWVudCBpdCBzYXRpc2ZpZXMgaXMgY29tcGF0aWJsZSBldmVuIHdoZW4gdGhlIG9yaWdpbmFsIHNwZWNpZmllcnMgYXJlIG5vdCBzdWJzZXRzXG4gICAgLy8gKGUuZy4gYF4xLjAuMGAgcmVzb2x2ZWQgdG8gMS4yLjMgYWxzbyBzYXRpc2ZpZXMgYSBsYXRlciBleGFjdCBgMS4yLjNgKS5cbiAgICBpZiAoXG4gICAgICBleGlzdGluZy5yZXNvbHZlZFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyhyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciwgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQ29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzIGZvciAke2V4aXN0aW5nLm5hbWV9OiBgICtcbiAgICAgIGAke2V4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPz8gZXhpc3Rpbmcua2luZH0gaXMgYWxyZWFkeSBzZWxlY3RlZCwgYnV0ICR7ZGVwZW5kZW50TmFtZX0gcmVxdWlyZXMgYCArXG4gICAgICBgJHtyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciA/PyByZXF1ZXN0ZWQua2luZH0uIE9ubHkgYSBzaW5nbGUgdmVyc2lvbiBwZXIgcHJpdmF0ZSBwYWNrYWdlIGlzIHN1cHBvcnRlZC5gXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgc3ltbGlua3MgaW4gdGhlIGRlZXBlc3QgRVhJU1RJTkcgYW5jZXN0b3Igb2YgdGhlIHBhdGggYW5kIHJlYXR0YWNoZXMgdGhlIG5vdC15ZXRcbiAqIGV4aXN0aW5nIHJlbWFpbmRlciwgc28gbGV4aWNhbCBjb250YWlubWVudC9vdmVybGFwIGNoZWNrcyBvcGVyYXRlIG9uIHBoeXNpY2FsIGxvY2F0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY2Fub25pY2FsaXplUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgZXhpc3RpbmdQYXRoID0gcGF0aC5yZXNvbHZlKHRhcmdldFBhdGgpO1xuICBjb25zdCByZW1haW5kZXJTZWdtZW50czogc3RyaW5nW10gPSBbXTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKGV4aXN0aW5nUGF0aCkpIHtcbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGV4aXN0aW5nUGF0aCk7XG4gICAgaWYgKHBhcmVudFBhdGggPT09IGV4aXN0aW5nUGF0aCkgYnJlYWs7XG4gICAgcmVtYWluZGVyU2VnbWVudHMudW5zaGlmdChwYXRoLmJhc2VuYW1lKGV4aXN0aW5nUGF0aCkpO1xuICAgIGV4aXN0aW5nUGF0aCA9IHBhcmVudFBhdGg7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0aC5qb2luKGZzLnJlYWxwYXRoU3luYyhleGlzdGluZ1BhdGgpLCAuLi5yZW1haW5kZXJTZWdtZW50cyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBwYXRoLnJlc29sdmUodGFyZ2V0UGF0aCk7XG4gIH1cbn1cblxuLyoqIFdoZXRoZXIgdGhlIHR3byBwYXRocyBhcmUgZXF1YWwgb3Igb25lIGNvbnRhaW5zIHRoZSBvdGhlci4gKi9cbmZ1bmN0aW9uIHBhdGhzT3ZlcmxhcChhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNFcXVhbE9yQW5jZXN0b3JQYXRoKGEsIGIpIHx8IGlzRXF1YWxPckFuY2VzdG9yUGF0aChiLCBhKTtcbn1cblxuZnVuY3Rpb24gaXNFcXVhbE9yQW5jZXN0b3JQYXRoKGFuY2VzdG9yUGF0aDogc3RyaW5nLCBkZXNjZW5kYW50UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoYW5jZXN0b3JQYXRoLCBkZXNjZW5kYW50UGF0aCk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGggPT09ICcnIHx8ICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0U3ViZGlyZWN0b3J5KHJvb3REaXJQYXRoOiBzdHJpbmcsIG91dERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKTtcbiAgaWYgKHJlbGF0aXZlUGF0aCAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpKSByZXR1cm47XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBPdXRwdXQgZGlyZWN0b3J5IG11c3QgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3Qgcm9vdDogJHtvdXREaXJQYXRofWApO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290RGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdW5zY29wZWROYW1lID0gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTtcbiAgLy8gcmVhbHBhdGhTeW5jIHJlc29sdmVzIHRoZSBpc29sYXRlZCBsaW5rZXIncyBzeW1saW5rIHNvIGNvcGllcyByZWFkIChhbmQgdGhlIGNvcHkgZmlsdGVyXG4gIC8vIGNvbXB1dGVzIHJlbGF0aXZlIHBhdGhzIGFnYWluc3QpIHRoZSBhY3R1YWwgcGFja2FnZSBkaXJlY3RvcnkuXG4gIGNvbnN0IGRpcmVjdERpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnQHdpbGxib29zdGVyJywgdW5zY29wZWROYW1lKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpcmVjdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICByZXR1cm4gZnMucmVhbHBhdGhTeW5jKGRpcmVjdERpclBhdGgpO1xuICB9XG4gIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciBrZWVwcyB0cmFuc2l0aXZlLW9ubHkgZGVwZW5kZW5jaWVzIG91dCBvZiB0aGUgcm9vdCBub2RlX21vZHVsZXM7XG4gIC8vIHNlYXJjaCB0aGUgLmJ1biBzdG9yZSBmb3IgdGhlIHBhY2thZ2UgYmVmb3JlIGdpdmluZyB1cC4gVGhlIHN0b3JlIG1heSBsZWdpdGltYXRlbHkgaG9sZFxuICAvLyBNVUxUSVBMRSByZXNvbHV0aW9ucyBvZiBvbmUgcGFja2FnZSAoZGlmZmVyZW50IHZlcnNpb25zL3JldmlzaW9ucyksIGFuZCBwaWNraW5nIGFuIGFyYml0cmFyeVxuICAvLyBvbmUgY291bGQgc2lsZW50bHkgbWF0ZXJpYWxpemUgdGhlIHdyb25nIGNvbnRlbnQg4oCUIHNvIGFtYmlndWl0eSBmYWlscyBsb3VkbHkuXG4gIGNvbnN0IGJ1blN0b3JlRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYnVuJyk7XG4gIGNvbnN0IGNhbmRpZGF0ZURpclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZnMucmVhZGRpclN5bmMoYnVuU3RvcmVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZURpclBhdGggPSBwYXRoLmpvaW4oYnVuU3RvcmVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ25vZGVfbW9kdWxlcycsICdAd2lsbGJvb3N0ZXInLCB1bnNjb3BlZE5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNhbmRpZGF0ZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgY2FuZGlkYXRlRGlyUGF0aHMuYWRkKGZzLnJlYWxwYXRoU3luYyhjYW5kaWRhdGVEaXJQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBObyAuYnVuIHN0b3JlIChob2lzdGVkIGluc3RhbGwpOyBmYWxsIHRocm91Z2ggdG8gdGhlIGVycm9yIGJlbG93LlxuICB9XG4gIGlmIChjYW5kaWRhdGVEaXJQYXRocy5zaXplID09PSAxKSByZXR1cm4gWy4uLmNhbmRpZGF0ZURpclBhdGhzXVswXSE7XG4gIGlmIChjYW5kaWRhdGVEaXJQYXRocy5zaXplID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNdWx0aXBsZSBpbnN0YWxsZWQgcmVzb2x1dGlvbnMgZm91bmQgZm9yICR7cGFja2FnZU5hbWV9OiAke1suLi5jYW5kaWRhdGVEaXJQYXRoc10uam9pbignLCAnKX0uIGAgK1xuICAgICAgICAnRGVkdXBsaWNhdGUgdGhlIGRlcGVuZGVuY3kgc28gYSBzaW5nbGUgcmVzb2x1dGlvbiByZW1haW5zLidcbiAgICApO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgUHJpdmF0ZSBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICR7cGFja2FnZU5hbWV9ICgke2RpcmVjdERpclBhdGh9KWApO1xufVxuXG4vKipcbiAqIFRoZSBpbnN0YWxsZWQgbWF0ZXJpYWxpemF0aW9uIG9mIGEgcmVnaXN0cnkgcGFja2FnZSwgd2hlbiBpdHMgdmVyc2lvbiBpcyBzdGF0aWNhbGx5IGtub3duIHRvXG4gKiBzYXRpc2Z5IHRoZSBzcGVjaWZpZXIg4oCUIHN0ZXBzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMgKGUuZy4gQ0kgdGVzdCBzdGVwcywgd2hpY2hcbiAqIGRlbGliZXJhdGVseSByZWNlaXZlIG5vIFZlcmRhY2NpbyB0b2tlbikgcmV1c2UgaXQgaW5zdGVhZCBvZiBkb3dubG9hZGluZy4gUmV0dXJucyB1bmRlZmluZWRcbiAqIChmYWxsaW5nIGJhY2sgdG8gYSBkb3dubG9hZCkgd2hlbiBubyB1bmFtYmlndW91c2x5IGNvcnJlY3QgaW5zdGFsbGVkIGNvcHkgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBmaW5kSW5zdGFsbGVkUmVnaXN0cnlQYWNrYWdlKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwcml2YXRlUGFja2FnZTogUHJpdmF0ZVBhY2thZ2Vcbik6IHsgZGlyUGF0aDogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNwZWNpZmllciA9IHByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXIgPz8gJ2xhdGVzdCc7XG4gIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGguam9pbignbm9kZV9tb2R1bGVzJywgLi4ucHJpdmF0ZVBhY2thZ2UubmFtZS5zcGxpdCgnLycpKTtcbiAgY29uc3QgYWRkQ2FuZGlkYXRlID0gKGNhbmRpZGF0ZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHZlcnNpb24gPSByZWFkSW5zdGFsbGVkVmVyc2lvbihkaXJQYXRoLCBwcml2YXRlUGFja2FnZS5uYW1lKTtcbiAgICBpZiAodmVyc2lvbiAmJiBpbnN0YWxsZWRWZXJzaW9uU2F0aXNmaWVzKHNwZWNpZmllciwgdmVyc2lvbikpIGNhbmRpZGF0ZXMuc2V0KGZzLnJlYWxwYXRoU3luYyhkaXJQYXRoKSwgdmVyc2lvbik7XG4gIH07XG4gIC8vIEEgcm9vdC1sZXZlbCBpbnN0YWxsYXRpb24gaXMgVEhFIGxvY2tmaWxlIHJlc29sdXRpb24gZm9yIHRoZSByb290IGRlcGVuZGVuY3k7IHRoZSAuYnVuIHN0b3JlXG4gIC8vIGlzIGNvbnN1bHRlZCBvbmx5IGZvciB0cmFuc2l0aXZlLW9ubHkgcGFja2FnZXMsIHdoZXJlIG11bHRpcGxlIHNhdGlzZnlpbmcgcmVzb2x1dGlvbnMgbWF5XG4gIC8vIGNvZXhpc3QgYW5kIHBpY2tpbmcgb25lIGFyYml0cmFyaWx5IGNvdWxkIG1hdGVyaWFsaXplIHRoZSB3cm9uZyBjb250ZW50LlxuICBjb25zdCBkaXJlY3RDYW5kaWRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgYWRkQ2FuZGlkYXRlKGRpcmVjdENhbmRpZGF0ZXMsIHBhdGguam9pbihyb290RGlyUGF0aCwgcmVsYXRpdmVEaXJQYXRoKSk7XG4gIGlmIChkaXJlY3RDYW5kaWRhdGVzLnNpemUgPT09IDEpIHJldHVybiB0b1NpbmdsZUNhbmRpZGF0ZShkaXJlY3RDYW5kaWRhdGVzKTtcblxuICBjb25zdCBzdG9yZUNhbmRpZGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGZzLnJlYWRkaXJTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYnVuJyksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgICAgYWRkQ2FuZGlkYXRlKHN0b3JlQ2FuZGlkYXRlcywgcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5idW4nLCBkaXJlbnQubmFtZSwgcmVsYXRpdmVEaXJQYXRoKSk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBObyAuYnVuIHN0b3JlIChob2lzdGVkIGluc3RhbGwpOyBmYWxsIGJhY2sgdG8gZG93bmxvYWRpbmcuXG4gIH1cbiAgcmV0dXJuIHRvU2luZ2xlQ2FuZGlkYXRlKHN0b3JlQ2FuZGlkYXRlcyk7XG59XG5cbmZ1bmN0aW9uIHRvU2luZ2xlQ2FuZGlkYXRlKGNhbmRpZGF0ZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiB7IGRpclBhdGg6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBbZW50cnldID0gY2FuZGlkYXRlcztcbiAgcmV0dXJuIGNhbmRpZGF0ZXMuc2l6ZSA9PT0gMSAmJiBlbnRyeSA/IHsgZGlyUGF0aDogZW50cnlbMF0sIHZlcnNpb246IGVudHJ5WzFdIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRJbnN0YWxsZWRWZXJzaW9uKGRpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSA9PT0gcGFja2FnZU5hbWUgJiYgdHlwZW9mIHBhY2thZ2VKc29uLnZlcnNpb24gPT09ICdzdHJpbmcnXG4gICAgICA/IHBhY2thZ2VKc29uLnZlcnNpb25cbiAgICAgIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG91dERpclBhdGg6IHN0cmluZyxcbiAgcmVnaXN0cnlPdXREaXJQYXRoOiBzdHJpbmdcbik6IFByaXZhdGVQYWNrYWdlW10ge1xuICBjb25zdCBwcml2YXRlUGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KCk7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lLZXlzKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb25ba2V5XTtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwZW5kZW5jaWVzKSkge1xuICAgICAgY29uc3QgaXNHaXQgPSBpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKTtcbiAgICAgIGlmICghaXNHaXQgJiYgIWlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeShuYW1lLCB2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzR2l0ICYmICFuYW1lLnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgZ2l0IGRlcGVuZGVuY3kgbXVzdCBiZSBhbiBAd2lsbGJvb3N0ZXIgcGFja2FnZTogJHtuYW1lfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgdW5zY29wZWROYW1lID0gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKG5hbWUpO1xuICAgICAgLy8gRGVwZW5kZW5jeSBuYW1lcyBiZWNvbWUgZXh0ZXJuYWwgZGF0YSBvbmNlIG5lc3RlZCBtYW5pZmVzdHMgY29tZSBmcm9tIGRvd25sb2FkZWRcbiAgICAgIC8vIHRhcmJhbGxzOyByZWplY3QgYW55dGhpbmcgKHBhdGggc2VwYXJhdG9ycywgYC4uYCwgaGlkZGVuLWZpbGUgcHJlZml4ZXMpIHRoYXQgY291bGRcbiAgICAgIC8vIGVzY2FwZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSB0aGUgbmFtZSBpcyBqb2luZWQgaW50byBiZWZvcmUgaXQgaXMgcmVjdXJzaXZlbHkgZGVsZXRlZC5cbiAgICAgIGlmICghL15bXFx3Li1dKyQvLnRlc3QodW5zY29wZWROYW1lKSB8fCB1bnNjb3BlZE5hbWUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcml2YXRlIHBhY2thZ2UgbmFtZTogJHtuYW1lfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZSA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAga2luZDogaXNHaXQgPyAnZ2l0JyA6ICdyZWdpc3RyeScsXG4gICAgICAgIHNvdXJjZURpclBhdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVzb2x2ZWRWZXJzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHRhcmdldERpclBhdGg6IHBhdGguam9pbihpc0dpdCA/IG91dERpclBhdGggOiByZWdpc3RyeU91dERpclBhdGgsIHVuc2NvcGVkTmFtZSksXG4gICAgICAgIC8vIFRoZSBmdWxsIGdpdCBzcGVjaWZpZXIgaXMgcHJlc2VydmVkIHNvIGRpdmVyZ2VudCBVUkxzL3JldmlzaW9ucyAoI2FiYyB2cyAjZGVmKSBhcmVcbiAgICAgICAgLy8gZGV0ZWN0ZWQgYXMgY29uZmxpY3RzIGluc3RlYWQgb2Ygc2lsZW50bHkgY29sbGFwc2luZyBpbnRvIG9uZSBjb3BpZWQgcGFja2FnZS5cbiAgICAgICAgdmVyc2lvblNwZWNpZmllcjogdmFsdWUgYXMgc3RyaW5nLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuYW1lKTtcbiAgICAgIHByaXZhdGVQYWNrYWdlcy5zZXQobmFtZSwgZXhpc3RpbmcgPyBtZXJnZVNhbWVNYW5pZmVzdFJlcXVpcmVtZW50KGV4aXN0aW5nLCByZXF1ZXN0ZWQpIDogcmVxdWVzdGVkKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5wcml2YXRlUGFja2FnZXMudmFsdWVzKCldO1xufVxuXG4vKipcbiAqIEEgbWFuaWZlc3QgbWF5IGxlZ2l0aW1hdGVseSByZXF1ZXN0IG9uZSBwYWNrYWdlIGZyb20gc2V2ZXJhbCBkZXBlbmRlbmN5IHNlY3Rpb25zIChlLmcuIGFuIGV4YWN0XG4gKiBkZXZEZXBlbmRlbmNpZXMgcGluIGFsb25nc2lkZSBhIHBlZXJEZXBlbmRlbmNpZXMgcmFuZ2UpLiBLZWVwIHRoZSBOQVJST1dFUiByZXF1aXJlbWVudCDigJQgaXRzXG4gKiBtYXgtc2F0aXNmeWluZyByZXNvbHV0aW9uIHNhdGlzZmllcyB0aGUgd2lkZXIgb25lIGJ5IGRlZmluaXRpb24gKGFuIGV4YWN0IHBpbiBpcyB0aGUgbmFycm93ZXN0XG4gKiByYW5nZSkg4oCUIGFuZCBmYWlsIGxvdWRseSB3aGVuIHRoZSByZXF1aXJlbWVudHMgZ2VudWluZWx5IGRpdmVyZ2UuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlU2FtZU1hbmlmZXN0UmVxdWlyZW1lbnQoZXhpc3Rpbmc6IFByaXZhdGVQYWNrYWdlLCByZXF1ZXN0ZWQ6IFByaXZhdGVQYWNrYWdlKTogUHJpdmF0ZVBhY2thZ2Uge1xuICBjb25zdCBuYXJyb3dlciA9IG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KGV4aXN0aW5nLCByZXF1ZXN0ZWQpO1xuICBpZiAobmFycm93ZXIpIHJldHVybiBuYXJyb3dlcjtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDb25mbGljdGluZyByZXF1aXJlbWVudHMgZm9yICR7ZXhpc3RpbmcubmFtZX0gd2l0aGluIG9uZSBtYW5pZmVzdDogYCArXG4gICAgICBgJHtleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID8/IGV4aXN0aW5nLmtpbmR9IHZzICR7cmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gcmVxdWVzdGVkLmtpbmR9LmBcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWlyZW1lbnQgd2hvc2UgbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBpcyBndWFyYW50ZWVkIHRvIHNhdGlzZnkgdGhlIG90aGVyIChhbiBleGFjdFxuICogcGluIGlzIHRoZSBuYXJyb3dlc3QgcmFuZ2UpLCBvciB1bmRlZmluZWQgd2hlbiBuZWl0aGVyIHN1YnN1bWVzIHRoZSBvdGhlci5cbiAqL1xuZnVuY3Rpb24gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQoXG4gIGV4aXN0aW5nOiBQcml2YXRlUGFja2FnZSxcbiAgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZVxuKTogUHJpdmF0ZVBhY2thZ2UgfCB1bmRlZmluZWQge1xuICBpZiAoZXhpc3Rpbmcua2luZCAhPT0gcmVxdWVzdGVkLmtpbmQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID09PSByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikgcmV0dXJuIGV4aXN0aW5nO1xuICBpZiAoc3BlY2lmaWVyU3Vic2V0KGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIsIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuIGV4aXN0aW5nO1xuICBpZiAoc3BlY2lmaWVyU3Vic2V0KHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyLCBleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuIHJlcXVlc3RlZDtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZVByaXZhdGVEZXBlbmRlbmNpZXMoXG4gIHN0YWdpbmdSb290RGlyUGF0aDogc3RyaW5nLFxuICBwcml2YXRlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPixcbiAgdG9TdGFnZWRQYXRoOiAodGFyZ2V0RGlyUGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSkpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICBpZiAoIXJlcGxhY2VQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhwYWNrYWdlSnNvblBhdGgsIHBhY2thZ2VKc29uLCBwcml2YXRlUGFja2FnZXMsIHRvU3RhZ2VkUGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBgJHtKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKX1cXG5gLCAndXRmOCcpO1xuICAgICAgLy8gU3RhZ2luZyBtaXJyb3JzIHRoZSByb290LXJlbGF0aXZlIGxheW91dCwgc28gdGhpcyBpcyB0aGUgbWFuaWZlc3QncyBwb3N0LXN3YXAgbG9jYXRpb24uXG4gICAgICBjb25zb2xlLmluZm8oYFJld3JvdGUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgaW4gJHtwYXRoLnJlbGF0aXZlKHN0YWdpbmdSb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKX1gKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvblBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBwcml2YXRlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPixcbiAgdG9TdGFnZWRQYXRoOiAodGFyZ2V0RGlyUGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5S2V5cykge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uW2tleV07XG4gICAgaWYgKCFkZXBlbmRlbmNpZXMpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykpIHtcbiAgICAgIGlmICghaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkgJiYgIWlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeShuYW1lLCB2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdGFyZ2V0UGFja2FnZSA9IHByaXZhdGVQYWNrYWdlcy5nZXQobmFtZSk7XG4gICAgICBpZiAoIXRhcmdldFBhY2thZ2UpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBCb3RoIHNpZGVzIGFyZSBzdGFnZWQgcGF0aHM6IHN0YWdpbmcgbWlycm9ycyB0aGUgcm9vdC1yZWxhdGl2ZSBsYXlvdXQsIHNvIHRoZSByZWxhdGl2ZVxuICAgICAgLy8gc3BlY2lmaWVyIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHRoZSBmaW5hbCBsb2NhdGlvbnMgd291bGQgcHJvZHVjZS5cbiAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9XG4gICAgICAgIGBmaWxlOiR7cGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgdG9TdGFnZWRQYXRoKHRhcmdldFBhY2thZ2UudGFyZ2V0RGlyUGF0aCkpfWA7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZWQ7XG59XG5cbi8qKlxuICogTW92ZSBldmVyeSBzdGFnZWQgdHJlZSBvbnRvIGl0cyBmaW5hbCBsb2NhdGlvbiBhcyBvbmUgdHJhbnNhY3Rpb246IGVhY2ggbGl2ZSB0cmVlIGlzIHNldCBhc2lkZVxuICogZmlyc3Qgc28gYSBmYWlsaW5nIHJlbmFtZSBjYW4gcmVzdG9yZSB0aGUgcHJldmlvdXMgc3RhdGUgaW5zdGVhZCBvZiBsZWF2aW5nIG9uZSB0cmVlIHJlcGxhY2VkXG4gKiBhbmQgdGhlIG90aGVyIHN0YWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3dhcE1hdGVyaWFsaXplZFRyZWVzKFxuICBvdXREaXJQYXRoczogc3RyaW5nW10sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nLFxuICBiYWNrdXBSb290RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSBVTklRVUUgZGlyZWN0b3J5IHBlciBpbnZvY2F0aW9uOiB3aGVuIGEgcm9sbGJhY2sgZmFpbHMgaXRzIGJhY2t1cCBpcyByZXRhaW5lZCBmb3IgbWFudWFsXG4gIC8vIHJlY292ZXJ5LCBhbmQgYSBmaXhlZCBwYXRoIHdvdWxkIGxldCB0aGUgbmV4dCBydW4gZGVsZXRlIHRoZSBvbmx5IHJlbWFpbmluZyBjb3B5LlxuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoYmFja3VwUm9vdERpclBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgYmFja3VwRGlyUm9vdCA9IGF3YWl0IGZzLnByb21pc2VzLm1rZHRlbXAoYCR7YmFja3VwUm9vdERpclBhdGh9LWApO1xuICAvLyBSZWNvcmRlZCBCRUZPUkUgdGhlIHN0YWdlZCB0cmVlIGlzIHJlbmFtZWQgaW46IGJldHdlZW4gc2V0dGluZyB0aGUgbGl2ZSB0cmVlIGFzaWRlIGFuZFxuICAvLyBpbnN0YWxsaW5nIGl0cyByZXBsYWNlbWVudCB0aGUgcHJldmlvdXMgbWF0ZXJpYWxpemF0aW9uIGV4aXN0cyBvbmx5IGluIHRoZSBiYWNrdXAsIGFuZCBhIHJlY29yZFxuICAvLyBhZGRlZCBhZnRlciB0aGUgcmVuYW1lIHdvdWxkIGxlYXZlIHRoYXQgd2luZG93IHVucmVjb3ZlcmFibGUuXG4gIGNvbnN0IHN3YXBwZWREaXJzOiB7IG91dERpclBhdGg6IHN0cmluZzsgYmFja3VwRGlyUGF0aDogc3RyaW5nOyBoYWRQcmV2aW91c1RyZWU6IGJvb2xlYW4gfVtdID0gW107XG4gIGxldCByZXN0b3JlRmFpbGVkID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIG91dERpclBhdGhdIG9mIG91dERpclBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgLy8gSW5kZXhlZCAobm90IG5hbWVkIGFmdGVyIHRoZSBkaXJlY3RvcnkpIHNvIHR3byBvdXRwdXQgdHJlZXMgc2hhcmluZyBhIGJhc2VuYW1lIGNhbm5vdFxuICAgICAgLy8gb3ZlcndyaXRlIGVhY2ggb3RoZXIncyBiYWNrdXAuXG4gICAgICBjb25zdCBiYWNrdXBEaXJQYXRoID0gcGF0aC5qb2luKGJhY2t1cERpclJvb3QsIFN0cmluZyhpbmRleCkpO1xuICAgICAgY29uc3QgaGFkUHJldmlvdXNUcmVlID0gZnMuZXhpc3RzU3luYyhvdXREaXJQYXRoKTtcbiAgICAgIGlmIChoYWRQcmV2aW91c1RyZWUpIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvdXREaXJQYXRoLCBiYWNrdXBEaXJQYXRoKTtcbiAgICAgIHN3YXBwZWREaXJzLnB1c2goeyBvdXREaXJQYXRoLCBiYWNrdXBEaXJQYXRoLCBoYWRQcmV2aW91c1RyZWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUob3V0RGlyUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKHRvU3RhZ2VkUGF0aChvdXREaXJQYXRoKSwgb3V0RGlyUGF0aCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFJldmVyc2Ugb3JkZXI6IHVuZG8gdGhlIG1vc3QgcmVjZW50IHN3YXAgZmlyc3QuXG4gICAgZm9yIChjb25zdCBzd2FwcGVkIG9mIHN3YXBwZWREaXJzLnRvUmV2ZXJzZWQoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oc3dhcHBlZC5vdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIGlmIChzd2FwcGVkLmhhZFByZXZpb3VzVHJlZSkgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKHN3YXBwZWQuYmFja3VwRGlyUGF0aCwgc3dhcHBlZC5vdXREaXJQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKHJvbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgLy8gUmVwb3J0aW5nIHRoZSBvcmlnaW5hbCBmYWlsdXJlIG1hdHRlcnMgbW9yZSwgYnV0IGEgZmFpbGVkIHJvbGxiYWNrIGxlYXZlcyB0aGUgdHJlZVxuICAgICAgICAvLyBtaXNzaW5nLCBzbyBpdCBtdXN0IG5vdCBwYXNzIHNpbGVudGx5IOKAlCBhbmQgaXRzIGJhY2t1cCBpcyB0aGVuIHRoZSBPTkxZIHJlbWFpbmluZyBjb3B5LlxuICAgICAgICByZXN0b3JlRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlc3RvcmUgJHtzd2FwcGVkLm91dERpclBhdGh9OiAke1N0cmluZyhyb2xsYmFja0Vycm9yKX1cXG5gICtcbiAgICAgICAgICAgICAgYFRoZSBwcmV2aW91cyBtYXRlcmlhbGl6YXRpb24gaXMga2VwdCBhdCAke3N3YXBwZWQuYmFja3VwRGlyUGF0aH07IG1vdmUgaXQgYmFjayBieSBoYW5kLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIE9ubHkgd2hlbiBub3RoaW5nIGlzIGxlZnQgdG8gcmVjb3ZlcjogZGVsZXRpbmcgdGhlIGJhY2t1cHMgYWZ0ZXIgYSBmYWlsZWQgcmVzdG9yZSB3b3VsZFxuICAgIC8vIGRlc3Ryb3kgdGhlIGxhc3QgY29weSBvZiB0aGUgcHJldmlvdXMgbWF0ZXJpYWxpemF0aW9uLiBBbmQgYnkgdGhpcyBwb2ludCBib3RoIHRyZWVzIGFyZVxuICAgIC8vIGFscmVhZHkgY29tbWl0dGVkLCBzbyBhIGNsZWFudXAgZmFpbHVyZSAoZS5nLiBhIHJlYWQtb25seSBkaXJlY3RvcnkgYGZzLmNwYCBwcmVzZXJ2ZWQpIG11c3RcbiAgICAvLyBub3QgdHVybiBhIHN1Y2Nlc3NmdWwgbWF0ZXJpYWxpemF0aW9uIGludG8gYSByZXBvcnRlZCBmYWlsdXJlLlxuICAgIGlmICghcmVzdG9yZUZhaWxlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oYmFja3VwRGlyUm9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCAoY2xlYW51cEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coYEZhaWxlZCB0byByZW1vdmUgJHtiYWNrdXBEaXJSb290fTogJHtTdHJpbmcoY2xlYW51cEVycm9yKX1gKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblBhdGhzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRpclBhdGgpKSByZXR1cm4gW107XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoZGlyZW50Lm5hbWUgPT09ICdub2RlX21vZHVsZXMnIHx8IGRpcmVudC5uYW1lID09PSAnLmdpdCcpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHBhY2thZ2VKc29uUGF0aHMucHVzaCguLi4oYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoY2hpbGRQYXRoKSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUgPT09ICdwYWNrYWdlLmpzb24nKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goY2hpbGRQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IFByb21pc2U8UGFja2FnZUpzb24+IHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbn1cblxuZnVuY3Rpb24gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgvXkB3aWxsYm9vc3Rlcig/Oi1wcml2YXRlKT9cXC8vLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4pOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKGBbZHJ5LXJ1bl0gV291bGQgcmVjcmVhdGUgJHtvdXREaXJQYXRofWApO1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGhcbiAgICAgICAgPyBgW2RyeS1ydW5dIFdvdWxkIGNvcHkgJHtwcml2YXRlUGFja2FnZS5uYW1lfTogJHtwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRofWBcbiAgICAgICAgOiBwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0J1xuICAgICAgICAgID8gYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06IChpbnN0YWxsZWQgdW5kZXIgbm9kZV9tb2R1bGVzKWBcbiAgICAgICAgICA6IGBbZHJ5LXJ1bl0gV291bGQgZG93bmxvYWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfUAke3ByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXJ9IHRvICR7cHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aH1gXG4gICAgKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZXdyaXRlIGNvcGllZCBwcml2YXRlIGRlcGVuZGVuY2llcyB0byBmaWxlOi4uLzxuYW1lPmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQge1xuICBmaW5kRGVzY2VuZGFudFByb2plY3RzLFxuICBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIGdldEZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIHR5cGUgUHJvamVjdCxcbn0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyxcbn0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuaW1wb3J0IHsgY29sbGVjdE1hbmlmZXN0cywgbWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuL3NldHVwUHJpdmF0ZVBhY2thZ2VzLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IHNxbGl0ZUZpbGVQYXR0ZXJuID0gL1xcLig/OnNxbGl0ZTM/fGRiKSg/OlstLl0oPzpqb3VybmFsfHNobXx3YWwpKT8kL2k7XG5jb25zdCBkb2NrZXJCdWlsZENhY2hlUGF0aHMgPSBbXG4gICcuY2FjaGUnLFxuICAnLm15cHlfY2FjaGUnLFxuICAnLm5leHQvY2FjaGUnLFxuICAnLnBhcmNlbC1jYWNoZScsXG4gICcucHl0ZXN0X2NhY2hlJyxcbiAgJy5ydWZmX2NhY2hlJyxcbiAgJy50b3gnLFxuICAnLnR1cmJvJyxcbiAgJy52ZW52JyxcbiAgJy55YXJuL2NhY2hlJyxcbiAgJy55YXJuL2luc3RhbGwtc3RhdGUuZ3onLFxuICAnX19weWNhY2hlX18nLFxuICAnY292ZXJhZ2UnLFxuICAnbm9kZV9tb2R1bGVzLy5jYWNoZScsXG4gICdwbGF5d3JpZ2h0LXJlcG9ydCcsXG4gICdzdG9yeWJvb2stc3RhdGljJyxcbiAgJ3RhcmdldCcsXG4gICd0ZXN0LXJlc3VsdHMnLFxuXTtcbmNvbnN0IGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyA9IFsnKiovKi5weWMnLCAnKiovKi50c2J1aWxkaW5mbycsICcqKi9fX3B5Y2FjaGVfXyddO1xuY29uc3QgZ2VuZXJhdGVkU3FsaXRlRGlyTmFtZXMgPSBbJ3ByaXNtYScsICdkYicsICdkcml6emxlJ10gYXMgY29uc3Q7XG5jb25zdCBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMgPSBbJy9kYXRhJ10gYXMgY29uc3Q7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gTWF0ZXJpYWxpemUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgb24gdGhlIGhvc3QgZmlyc3Qgc28gdGhlIHBlci1wcm9qZWN0IHJld3JpdGUgYmVsb3cgcmVzb2x2ZXNcbiAgICAvLyB0aGVtIHRvIGZpbGU6IHBhdGhzIGFuZCB0aGUgRG9ja2VyIGJ1aWxkIG5lZWRzIG5vIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLiBPbmx5IGluIC0tb3V0c2lkZVxuICAgIC8vIG1vZGUgKHRoZSBpbi1pbWFnZSBzZWNvbmQgcGFzcyBoYXMgbm8gbm9kZV9tb2R1bGVzL3JlZ2lzdHJ5IHRvIG1hdGVyaWFsaXplIGZyb20pIGFuZCBvbmx5XG4gICAgLy8gd2hlbiBhIHByaXZhdGUgZGVwZW5kZW5jeSBpcyBhY3R1YWxseSBkZWNsYXJlZCwgc28gcmVwb3Mgd2l0aG91dCBvbmUgYXJlIHVudG91Y2hlZCDigJQgbm8gZW1wdHlcbiAgICAvLyBvdXRwdXQgZGlyZWN0b3JpZXMsIG5vIHNwdXJpb3VzIFwiQ09QWVwiIGhpbnQuIEZhaWx1cmVzIGFyZSBub24tZmF0YWwgYW5kIG5vbi1kZXN0cnVjdGl2ZTpcbiAgICAvLyBtYXRlcmlhbGl6ZSB0aHJvd3MgYmVmb3JlIGRlbGV0aW5nIGFueSBleGlzdGluZyBvdXRwdXQgKGFuZCBjbGVhbnMgdXAgaXRzIHN0YWdpbmcgb24gYSBmYWlsZWRcbiAgICAvLyBkb3dubG9hZCksIHNvIGEgcmVwbyBsYWNraW5nIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIGtlZXBzIGJ1aWxkaW5nIGV4YWN0bHkgYXMgYmVmb3JlLCB3aXRoIHRoZVxuICAgIC8vIHBlci1wcm9qZWN0IHJld3JpdGUgYmVsb3cgZW1pdHRpbmcgdGhlIGV4aXN0aW5nIFwicnVuIHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNcIiBoaW50LiBUaGlzXG4gICAgLy8ga2VlcHMgdGhlIHN0ZXAgYSBwdXJlIGNvbnZlbmllbmNlIHRoYXQgbGV0cyByZXBvc2l0b3JpZXMgZHJvcCB0aGUgZXhwbGljaXQgY29tbWFuZC5cbiAgICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHdvcmtzcGFjZSBzZXQgZnJvbSB0aGUgcmVwb3NpdG9yeSByb290IHNvIGEgcHJpdmF0ZSBkZXBlbmRlbmN5IGRlY2xhcmVkIGluXG4gICAgICAvLyBhbnkgc2libGluZyB3b3Jrc3BhY2UgaXMgbWF0ZXJpYWxpemVkIGV2ZW4gd2hlbiBvcHRpbWl6ZSBydW5zIGZyb20gYSBzdWJwYWNrYWdlIGRpcmVjdG9yeS5cbiAgICAgIGNvbnN0IHJvb3RQcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RzLnJvb3QuZGlyUGF0aCk7XG4gICAgICBjb25zdCBtYW5pZmVzdHMgPSBjb2xsZWN0TWFuaWZlc3RzKHJvb3RQcm9qZWN0cyA/PyBwcm9qZWN0cyk7XG4gICAgICBpZiAobWFuaWZlc3RzLnNvbWUoZGVjbGFyZXNQcml2YXRlRGVwZW5kZW5jeSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyhwcm9qZWN0cy5yb290LmRpclBhdGgsIG1hbmlmZXN0cywgeyBkcnlSdW46IEJvb2xlYW4oYXJndi5kcnlSdW4pIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBhdXRvLW1hdGVyaWFsaXplIHByaXZhdGUgcGFja2FnZXMgKCR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfSk7IGAgK1xuICAgICAgICAgICAgICAgICdydW4gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIGlmIHRoZSBEb2NrZXIgYnVpbGQgbmVlZHMgdGhlbS4gQ29udGludWluZy4nXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9wdGltaXplZFByb2plY3RzOiBQcm9qZWN0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdCwgcGFja2FnZUpzb24pO1xuICAgICAgY29uc3QgcmVtb3ZlZERldkRlcGVuZGVuY2llcyA9IG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uLCB7XG4gICAgICAgIHJlbW92ZVdiUG9zdGluc3RhbGw6ICFhcmd2Lm91dHNpZGUgJiYgcmVtb3ZlZERldkRlcGVuZGVuY2llcy5pbmNsdWRlcygnQHdpbGxib29zdGVyL3diJyksXG4gICAgICB9KTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgICAgYXdhaXQgd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMocGF0aC5qb2luKGRpc3REaXJQYXRoLCAnYmFzaCcpKTtcbiAgICAgIH1cbiAgICAgIG9wdGltaXplZFByb2plY3RzLnB1c2gocHJvamVjdCk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocHJvamVjdHMucm9vdC5wYWNrYWdlTWFuYWdlckNvbW1hbmQsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICAgIGF3YWl0IGNsZWFudXBEb2NrZXJCdWlsZEFydGlmYWN0cyhvcHRpbWl6ZWRQcm9qZWN0cyk7XG4gICAgfVxuICB9LFxufTtcblxuLyoqIFdoZXRoZXIgYW55IGRlcGVuZGVuY3kgc2VjdGlvbiBkZWNsYXJlcyBhIHByaXZhdGUgZ2l0IG9yIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCByZWdpc3RyeSBkZXBlbmRlbmN5LiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNQcml2YXRlRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5cy5zb21lKChrZXkpID0+IHtcbiAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XTtcbiAgICByZXR1cm4gKFxuICAgICAgZGVwcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBPYmplY3QuZW50cmllcyhkZXBzKS5zb21lKFxuICAgICAgICAoW25hbWUsIHZhbHVlXSkgPT4gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkgfHwgaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llcyhwcm9qZWN0OiBQcm9qZWN0LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llc0ZvckRpcihwcm9qZWN0LnJvb3REaXJQYXRoLCBwcm9qZWN0LmRpclBhdGgsIHBhY2thZ2VKc29uKTtcbn1cblxuZnVuY3Rpb24gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXNGb3JEaXIoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICBjb25zdCByZXdyaXR0ZW5EZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgaWYgKGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpKSB7XG4gICAgICAgIC8vIERvY2tlciBidWlsZHMgY2Fubm90IGFjY2VzcyBwcml2YXRlIFNTSCBVUkxzIHVubGVzcyBjcmVkZW50aWFscyBhcmUgZm9yd2FyZGVkLlxuICAgICAgICAvLyBUaGUgRG9ja2VyZmlsZSBjb3BpZXMgdGhvc2Ugd29ya3NwYWNlIHBhY2thZ2VzIGludG8gdGhlIGltYWdlIGluc3RlYWQuIE9ubHkgdGhlIG9yZydzXG4gICAgICAgIC8vIG93biBnaXQgZGVwZW5kZW5jaWVzIGFyZSByZXdyaXR0ZW4g4oCUIHRoZSBzaGFyZWQgcHJlZGljYXRlIG1hdGNoZXMgZXhhY3RseSB3aGF0XG4gICAgICAgIC8vIGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCBtYXRlcmlhbGl6ZXMsIHNvIG90aGVyIFNTSCBVUkxzIGFyZSBsZWZ0IHVuY2hhbmdlZCBpbnN0ZWFkXG4gICAgICAgIC8vIG9mIGJlaW5nIHBvaW50ZWQgYXQgbmV2ZXItbWF0ZXJpYWxpemVkIGxvY2FsIHBhdGhzLlxuICAgICAgICBkZXBzW25hbWVdID0gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIocm9vdERpclBhdGgsIHBhY2thZ2VEaXJQYXRoLCAnQHdpbGxib29zdGVyJywgbmFtZSk7XG4gICAgICAgIHJld3JpdHRlbkRlcGVuZGVuY2llcy5wdXNoKGAke2tleX0uJHtuYW1lfWApO1xuICAgICAgfSBlbHNlIGlmIChpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IG1hdGVyaWFsaXplZFZlcnNpb24gPSByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGgsIG5hbWUpO1xuICAgICAgICBpZiAobWF0ZXJpYWxpemVkVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gTGVhdmluZyB0aGUgcmVnaXN0cnkgc3BlY2lmaWVyIG1lYW5zIHRoZSBpbi1pbWFnZSBpbnN0YWxsIG5lZWRzIFZlcmRhY2Npb1xuICAgICAgICAgIC8vIGNyZWRlbnRpYWxzIOKAlCB0aGUgZmFpbHVyZSB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIGF2b2lkIOKAlCBzbyBzYXkgc28gb3V0IGxvdWQuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgJHtuYW1lfSBpcyBub3QgbWF0ZXJpYWxpemVkIHVuZGVyICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0vOyBydW4gXFxgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1xcYCBzbyB0aGUgRG9ja2VyIGJ1aWxkIGRvZXMgbm90IG5lZWQgcmVnaXN0cnkgY3JlZGVudGlhbHMuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIG1hdGVyaWFsaXplZCB2ZXJzaW9uIGlzIHN0YWxlIHdoZW4gdGhlIHNwZWNpZmllciAoYW4gZXhhY3QgdmVyc2lvbiBvciBhbnkgc2VtdmVyXG4gICAgICAgIC8vIHJhbmdlIGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCByZXNvbHZlcyBtYXgtc2F0aXNmeWluZyBhZ2FpbnN0IHRoZSByZWdpc3RyeSkgZG9lc1xuICAgICAgICAvLyBub3QgYWRtaXQgaXQuIERpc3QtdGFnIHNwZWNpZmllcnMgKGUuZy4gYDIwMjYtc3RhYmxlYCkgc2tpcCB0aGUgc3RhbGVuZXNzIGNoZWNrLlxuICAgICAgICBpZiAoIW1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXModmFsdWUsIG1hdGVyaWFsaXplZFZlcnNpb24pKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAgICAgYE1hdGVyaWFsaXplZCAke25hbWV9IGlzICR7bWF0ZXJpYWxpemVkVmVyc2lvbn0gYnV0IHBhY2thZ2UuanNvbiByZXF1aXJlcyAke3ZhbHVlfTsgcmVydW4gXFxgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1xcYC5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVnaXN0cnkgcGFja2FnZXMgdGhhdCBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgbWF0ZXJpYWxpemVkIG9uIHRoZSBob3N0IGFyZSB1c2VkIGFzXG4gICAgICAgIC8vIGxvY2FsIHBhdGhzIHNvIGltYWdlIGJ1aWxkcyBuZWVkIG5vIFZlcmRhY2NpbyBjcmVkZW50aWFsczsgdGhlIENPTU1JVFRFRCBwYWNrYWdlLmpzb25cbiAgICAgICAgLy8ga2VlcHMgdGhlIHJlZ2lzdHJ5IHNwZWNpZmllciDigJQgb25seSB0aGUgZ2VuZXJhdGVkIChkaXN0LylwYWNrYWdlLmpzb24gaXMgcmV3cml0dGVuXG4gICAgICAgIC8vIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NjQpLlxuICAgICAgICBkZXBzW25hbWVdID0gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIocm9vdERpclBhdGgsIHBhY2thZ2VEaXJQYXRoLCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLCBuYW1lKTtcbiAgICAgICAgcmV3cml0dGVuRGVwZW5kZW5jaWVzLnB1c2goYCR7a2V5fS4ke25hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmV3cm90ZSBwcml2YXRlIGRlcGVuZGVuY2llczonLCByZXdyaXR0ZW5EZXBlbmRlbmNpZXMuam9pbignLCAnKSB8fCAnbm9uZScpO1xuICByZXR1cm4gcmV3cml0dGVuRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgc2NvcGVEaXJOYW1lOiBzdHJpbmcsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgc2NvcGVEaXJOYW1lLCB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VEaXJQYXRoKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuXG5mdW5jdGlvbiB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYWNrYWdlTmFtZS5yZXBsYWNlKC9eQHdpbGxib29zdGVyKD86LXByaXZhdGUpP1xcLy8sICcnKTtcbn1cblxuLyoqIFVuZGVmaW5lZCB3aGVuIHRoZSBwYWNrYWdlIGlzIG5vdCBtYXRlcmlhbGl6ZWQgKG9yIGl0cyBtYW5pZmVzdCBpcyB1bnJlYWRhYmxlL3ZlcnNpb25sZXNzKS4gKi9cbmZ1bmN0aW9uIHJlYWRNYXRlcmlhbGl6ZWRQYWNrYWdlVmVyc2lvbihyb290RGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgIHJvb3REaXJQYXRoLFxuICAgIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gICAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKSxcbiAgICAncGFja2FnZS5qc29uJ1xuICApO1xuICB0cnkge1xuICAgIHJldHVybiAoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbikudmVyc2lvbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc291cmNlRGlyUGF0aCA9IGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHNvdXJjZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRmlsZSgpIHx8ICFkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnNoJykpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0RmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLmNvcHlGaWxlKHBhdGguam9pbihzb3VyY2VEaXJQYXRoLCBkaXJlbnQubmFtZSksIHRhcmdldEZpbGVQYXRoKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jaG1vZCh0YXJnZXRGaWxlUGF0aCwgMG83NTUpO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhgR2VuZXJhdGVkIERvY2tlciBzaGVsbCBzY3JpcHRzOiAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZGlyUGF0aCkgfHwgZGlyUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gZmluZERvY2tlclNoZWxsU2NyaXB0c0RpclBhdGgoKTogc3RyaW5nIHtcbiAgbGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICdkb2NrZXInLCAnYmFzaCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG9ja2VyIHNoZWxsIHNjcmlwdHMgZGlyZWN0b3J5IG5vdCBmb3VuZC4nKTtcbiAgICB9XG4gICAgY3VycmVudERpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAvLyBPdXRzaWRlIG9wdGltaXphdGlvbiB3cml0ZXMgZGlzdC9wYWNrYWdlLmpzb24gYmVmb3JlIERvY2tlciBidWlsZHMgdGhlIGFwcC5cbiAgICAvLyBLZWVwIGJ1aWxkLXRpbWUgZGVwZW5kZW5jaWVzIGFuZCByZW1vdmUgb25seSBrbm93biBub24tYnVpbGQgdG9vbGluZy5cbiAgICByZXR1cm4gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb24pO1xuICB9XG5cbiAgLy8gSW5zaWRlIERvY2tlciwgY29kZWdlbi9idWlsZCBoYXMgYWxyZWFkeSBmaW5pc2hlZCwgc28gcHJvZHVjdGlvbiBpbnN0YWxsIHNob3VsZCBub3Qgc2VlIGRldiB0b29saW5nLlxuICBjb25zdCByZW1vdmVkRGVwZW5kZW5jaWVzID0gT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9KTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gIHJldHVybiByZW1vdmVkRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVVbm5lY2Vzc2FyeURldkRlcGVuZGVuY2llc0Zvck91dHNpZGVEb2NrZXJCdWlsZChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIC8vIEluIC0tb3V0c2lkZSBtb2RlLCBEb2NrZXIgc3RpbGwgcnVucyBjb2RlZ2VuL2J1aWxkIGJlZm9yZSBhIHNlY29uZCBpbi1pbWFnZSBvcHRpbWl6YXRpb24uXG4gIC8vIFJlbW92ZSBvbmx5IHRvb2xpbmcgdGhhdCBpcyBub3QgbmVlZGVkIGZvciB0aGF0IGJ1aWxkIHBoYXNlLlxuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnYmlvbWUnLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdveGZtdCcsXG4gICAgJ294bGludCcsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFNoYXJlZCBjb25maWcgcGFja2FnZXMgYXJlIG5lZWRlZCBvbmx5IGZvciBsaW50L2Zvcm1hdC90ZXN0IGNvbW1hbmRzLCBub3QgRG9ja2VyIGJ1aWxkcy5cbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbiAgcmV0dXJuIHJlbW92ZWREZXBzO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uLCBvcHRpb25zOiB7IHJlbW92ZVdiUG9zdGluc3RhbGw6IGJvb2xlYW4gfSk6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICAob3B0aW9ucy5yZW1vdmVXYlBvc3RpbnN0YWxsICYmIG5hbWUgPT09ICdwb3N0aW5zdGFsbCcgJiYgY29udGVudC50cmltKCkgPT09ICd3YiBnZW4tY29kZScpIHx8XG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBEb2NrZXJCdWlsZEFydGlmYWN0cyhwcm9qZWN0czogUHJvamVjdFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGF3YWl0IHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdCk7XG4gICAgYXdhaXQgcmVtb3ZlR2VuZXJhdGVkTG9jYWxEYXRhKHByb2plY3QpO1xuICAgIHJ1bkRvY2tlckNsZWFudXBTY3JpcHQocHJvamVjdCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUHJvamVjdENhY2hlcyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBbXG4gICAgLi4uKGF3YWl0IHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXRocyhwcm9qZWN0KSksXG4gICAgLi4uKGF3YWl0IHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0KSksXG4gIF07XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBEb2NrZXIgYnVpbGQgY2FjaGVzOicsIHJlbGF0aXZlUGF0aHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiBkb2NrZXJCdWlsZENhY2hlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBhd2FpdCBnbG9iYnkoZG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMnLCAnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqLy55YXJuJywgJyoqLy55YXJuLyoqJywgJyoqLy5naXQnLCAnKiovLmdpdC8qKiddLFxuICAgIG9ubHlGaWxlczogZmFsc2UsXG4gIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByZWxhdGl2ZVBhdGhzLm1hcCgocmVsYXRpdmVQYXRoKSA9PlxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgKVxuICApO1xuICByZXR1cm4gcmVsYXRpdmVQYXRocztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTG9jYWxEYXRhKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVtb3ZlZFBhdGhHcm91cHMgPSBhd2FpdCBQcm9taXNlLmFsbChbcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3QpLCByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0KV0pO1xuICBjb25zdCByZW1vdmVkUGF0aHMgPSByZW1vdmVkUGF0aEdyb3Vwcy5mbGF0KCk7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBnZW5lcmF0ZWQgbG9jYWwgZGF0YTonLCByZW1vdmVkUGF0aHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRNb3VudERpcnMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRocyA9IGdldEdlbmVyYXRlZE1vdW50RGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgcmVsYXRpdmVQYXRocykge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXRQYXRoKSkgY29udGludWU7XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0YXJnZXRQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmVtb3ZlZFBhdGhzLnB1c2gocmVsYXRpdmVQYXRoKTtcbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlZmF1bHRQYXRocyA9IGdlbmVyYXRlZFNxbGl0ZURpck5hbWVzLm1hcCgoZGlyTmFtZSkgPT4gcGF0aC5qb2luKGRpck5hbWUsICdtb3VudCcpKTtcbiAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuIGRlZmF1bHRQYXRocztcblxuICBjb25zdCBhYnNvbHV0ZURpclBhdGggPSBwYXRoLmRpcm5hbWUoZGJQYXRoKTtcbiAgaWYgKHBhdGguYmFzZW5hbWUoYWJzb2x1dGVEaXJQYXRoKSAhPT0gJ21vdW50JyB8fCAhaXNQYXRoSW5zaWRlUHJvamVjdChwcm9qZWN0LCBhYnNvbHV0ZURpclBhdGgpKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRQYXRocztcbiAgfVxuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgYWJzb2x1dGVEaXJQYXRoKTtcbiAgaWYgKCFyZWxhdGl2ZVBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kZWZhdWx0UGF0aHMsIHJlbGF0aXZlUGF0aF0pXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzSW5EZWZhdWx0RGlycyhwcm9qZWN0KSxcbiAgICByZW1vdmVFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0KSxcbiAgXSk7XG4gIHJldHVybiByZW1vdmVkUGF0aHMuZmxhdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBhd2FpdCBnZXRHZW5lcmF0ZWRTcWxpdGVEaXJQYXRocyhwcm9qZWN0KTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gYXdhaXQgUHJvbWlzZS5hbGwoZGlyUGF0aHMubWFwKChkaXJQYXRoKSA9PiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGlyKHByb2plY3QsIGRpclBhdGgpKSk7XG4gIHJldHVybiByZW1vdmVkUGF0aHMuZmxhdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRHZW5lcmF0ZWRTcWxpdGVEaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkaXJQYXRocyA9IGdlbmVyYXRlZFNxbGl0ZURpck5hbWVzLm1hcCgoZGlyTmFtZSkgPT4gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZGlyTmFtZSkpO1xuICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoZGlyUGF0aHMubWFwKChkaXJQYXRoKSA9PiBpc0RpcmVjdG9yeShkaXJQYXRoKSkpO1xuICByZXR1cm4gZGlyUGF0aHMuZmlsdGVyKChfLCBpbmRleCkgPT4gcmVzdWx0c1tpbmRleF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkYkZpbGVQYXRocyA9IGdldEVudkdlbmVyYXRlZFNxbGl0ZUZpbGVQYXRocyhwcm9qZWN0KTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRiRmlsZVBhdGggb2YgZGJGaWxlUGF0aHMpIHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldFBhdGggb2YgZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGgpKSB7XG4gICAgICBpZiAoIShhd2FpdCBpc0ZpbGUodGFyZ2V0UGF0aCkpKSBjb250aW51ZTtcblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHJlbW92ZWRQYXRocy5wdXNoKHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmZ1bmN0aW9uIGdldEVudkdlbmVyYXRlZFNxbGl0ZUZpbGVQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZURiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGggfHwgIWFic29sdXRlRGJQYXRoKSByZXR1cm4gW107XG5cbiAgY29uc3QgZmlsZVBhdGhzID0gcGF0aC5pc0Fic29sdXRlKGRiUGF0aClcbiAgICA/IFtkYlBhdGhdXG4gICAgOiBbYWJzb2x1dGVEYlBhdGgsIC4uLmdlbmVyYXRlZFNxbGl0ZURpck5hbWVzLm1hcCgoZGlyTmFtZSkgPT4gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGlyTmFtZSwgZGJQYXRoKSldO1xuICByZXR1cm4gWy4uLm5ldyBTZXQoZmlsZVBhdGhzKV0uZmlsdGVyKChmaWxlUGF0aCkgPT4gaXNHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aFNhZmUocHJvamVjdCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aFNhZmUocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQYXRoSW5zaWRlUHJvamVjdChwcm9qZWN0LCBmaWxlUGF0aCkgfHwgaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdCwgZmlsZVBhdGgpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckdlbmVyYXRlZERhdGFGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghaXNEb2NrZXJFbmFibGVkKHByb2plY3QpKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRvY2tlckdlbmVyYXRlZERhdGFEaXJQYXRocy5zb21lKChkaXJQYXRoKSA9PiB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJycgJiYgcmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVGaWxlRmFtaWx5UGF0aHMoZGJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGRiRmlsZVBhdGgsXG4gICAgYCR7ZGJGaWxlUGF0aH0tam91cm5hbGAsXG4gICAgYCR7ZGJGaWxlUGF0aH0tc2htYCxcbiAgICBgJHtkYkZpbGVQYXRofS13YWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LmpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LnNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0ud2FsYCxcbiAgXTtcbn1cblxuZnVuY3Rpb24gaXNQYXRoSW5zaWRlUHJvamVjdChwcm9qZWN0OiBQcm9qZWN0LCB0YXJnZXRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHRhcmdldFBhdGgpO1xuICAvLyBgc3RhcnRzV2l0aCgnLi4nKWAgd291bGQgcmVqZWN0IHByb2plY3QtbG9jYWwgbmFtZXMgc3VjaCBhcyBgLi5jYWNoZWAuXG4gIHJldHVybiByZWxhdGl2ZVBhdGggPT09ICcnIHx8IChyZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKGAuLiR7cGF0aC5zZXB9YCkpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9qZWN0LmVudi5XQl9ET0NLRVIgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnMCcgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnZmFsc2UnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpc0ZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0ZpbGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGRpclBhdGgpO1xuICAgIHJldHVybiBzdGF0LmlzRGlyZWN0b3J5KCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGlyKHByb2plY3Q6IFByb2plY3QsIGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBzcWxpdGVGaWxlTmFtZXMgPSBkaXJlbnRzXG4gICAgLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgc3FsaXRlRmlsZVBhdHRlcm4udGVzdChkaXJlbnQubmFtZSkpXG4gICAgLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG5cbiAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGRpclBhdGgpO1xuICByZXR1cm4gc3FsaXRlRmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGguam9pbihyZWxhdGl2ZURpclBhdGgsIGZpbGVOYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRvY2tlckNsZWFudXBTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNjcmlwdFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnYmFzaCcsICdjbGVhbnVwLnNoJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzY3JpcHRQYXRoKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdiYXNoJywgW3NjcmlwdFBhdGgsICctLWtlZXAtc2NyaXB0cyddLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHNjcmlwdFBhdGgpfWApO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VPcm0sIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMsIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCwgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQsIGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgYWxpYXNlczogWydkYiddLFxuICBkZXNjcmliZTpcbiAgICBcIlJ1biBkYXRhYmFzZSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIERyaXp6bGUgcHJvamVjdHMgdXNlIGRyaXp6bGUta2l0LiBFeGFtcGxlOiB3YiBwcmlzbWEgbWlncmF0ZS1kZXYgLS0gLS1uYW1lIGluaXRcIixcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLmNvbW1hbmQoY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZ2VuZXJhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGlzdEJhY2t1cHNDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NsZWFudXAtbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnQ2xlYW4gdXAgdGVtcG9yYWwgTGl0ZXN0cmVhbSBmaWxlcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBjbGVhbnVwLWxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5jbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy9ldGMvbGl0ZXN0cmVhbS55bWwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcjogY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgaWYgKGFsbFByb2plY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NyZWF0aW5nIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmb3IgbXVsdGlwbGUgcHJvamVjdHMgYXQgb25jZSBpcyBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgdGhleSB3b3VsZCBvdmVyd3JpdGUgZWFjaCBvdGhlci4nXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0LCBvcm0sIGFyZ3Yub3V0cHV0KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95Rm9yY2UocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGdlbmVyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdnZW5lcmF0ZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgT1JNIGNsaWVudCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGdlbmVyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZ2VuZXJhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgY29uZmlnOiB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGxpdGVzdHJlYW1Db25maWdCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXN0LWJhY2t1cHMnLFxuICBkZXNjcmliZTogJ0xpc3QgTGl0ZXN0cmVhbSBiYWNrdXBzJyxcbiAgYnVpbGRlcjogbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBsaXN0LWJhY2t1cHMnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5saXN0QmFja3Vwcyhwcm9qZWN0LCBhcmd2LmNvbmZpZyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnY2hlY2staWRlbXBvdGVuY3knOiB7XG4gICAgZGVzY3JpcHRpb246ICdSdW4gdGhlIG1pZ3JhdGlvbiBjb21tYW5kIHR3aWNlIHRvIGNvbmZpcm0gaXQgaXMgaWRlbXBvdGVudC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIG1pZ3JhdGVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyOiBtaWdyYXRlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2NoZWNrLWlkZW1wb3RlbmN5J10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3JtU2NyaXB0cyA9IGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBvcm1TY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0LCBhcmd2LmNoZWNrSWRlbXBvdGVuY3kpKSB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0KSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFNraXBwaW5nIGlkZW1wb3RlbmN5IGNoZWNrIGZvciAke3Byb2plY3QubmFtZX0gaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIG9ybVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3Q6IFByb2plY3QsIGNoZWNrSWRlbXBvdGVuY3k6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrSWRlbXBvdGVuY3kgPz8gaXNEb2NrZXJFbmFibGVkKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9qZWN0LmVudi5XQl9ET0NLRVIgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnMCcgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnZmFsc2UnO1xufVxuXG5mdW5jdGlvbiBpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAncHJvZHVjdGlvbicpO1xufVxuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gRm9yY2UgdG8gcmVzZXQgdGVzdCBkYXRhYmFzZVxuICAgIGlmIChwcm9jZXNzLmVudi5XQl9FTlYgIT09ICd0ZXN0Jykge1xuICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WID0gJ3Rlc3QnO1xuICAgICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKFxuICAgICAgICAnV0JfRU5WPXRlc3QgZGIgcmVzZXQnLFxuICAgICAgICBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KVxuICAgICAgKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8ZHJpenpsZXxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGFyZ3Yub3V0cHV0ID8/IGdldERlZmF1bHRSZXN0b3JlT3V0cHV0KHByb2plY3QsIG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzdG9yZShwcm9qZWN0LCBvdXRwdXQsIGFyZ3YuY29uZmlnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gZGF0YWJhc2Ugc3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydkYi11cmwtb3ItcGF0aCcsICdyZXN0b3JlZCddKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkID8gJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6XG4gICAgXCJQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gdGhlIGRldGVjdGVkIE9STSBhcyBpcy4gQWRkaXRpb25hbCBQcmlzbWEgZmxhZ3MgY2FuIGFsc28gYmUgZm9yd2FyZGVkIGFmdGVyICctLScuXCIsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoYGRiICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBjb21tYW5kID0gb3JtID09PSAncHJpc21hJyA/IGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gIDogYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBmdWxsQ29tbWFuZCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24od2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGNvbW1hbmQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIE1ha2UgRHJpenpsZSBjb21tYW5kcyB3b3JrIG9uIENsb3VkZmxhcmUgRDEgcHJvamVjdHMgYnkgcG9pbnRpbmcgREFUQUJBU0VfVVJMXG4gKiBhdCB0aGUgbG9jYWwgbWluaWZsYXJlIEQxIFNRTGl0ZSBmaWxlLlxuICovXG5mdW5jdGlvbiB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybTogRGF0YWJhc2VPcm0sIHByb2plY3Q6IFByb2plY3QsIHNjcmlwdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ2RyaXp6bGUnID8gd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdCwgc2NyaXB0KSA6IHNjcmlwdDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0OiBQcm9qZWN0LCBvcm06IERhdGFiYXNlT3JtLCBjb25maWdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0TGl0ZXN0cmVhbURiUGF0aChwcm9qZWN0LCBvcm0pO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZyA9IGBzbmFwc2hvdDpcbiAgaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICByZXRlbnRpb246IDcyaCAjIEtlZXAgYmFja3VwcyBmb3IgMyBkYXlzXG5kYnM6XG4gIC0gcGF0aDogJHtkYlBhdGh9XG4gICAgYnVzeS10aW1lb3V0OiA1c1xuICAgIGNoZWNrcG9pbnQtaW50ZXJ2YWw6IDFtXG4gICAgcmVwbGljYTpcbiAgICAgIHR5cGU6IHMzXG4gICAgICBlbmRwb2ludDogaHR0cHM6Ly8ke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRH0ucjIuY2xvdWRmbGFyZXN0b3JhZ2UuY29tXG4gICAgICBidWNrZXQ6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRX1cbiAgICAgIGFjY2Vzcy1rZXktaWQ6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEfVxuICAgICAgc2VjcmV0LWFjY2Vzcy1rZXk6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWX1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDFtXG5gO1xuXG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBsaXRlc3RyZWFtQ29uZmlnKTtcbiAgICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCAke2NvbmZpZ1BhdGh9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlICR7Y29uZmlnUGF0aH06ICR7cmVhc29ufWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0UmVzdG9yZU91dHB1dChwcm9qZWN0OiBQcm9qZWN0LCBvcm06IERhdGFiYXNlT3JtKTogc3RyaW5nIHtcbiAgaWYgKG9ybSA9PT0gJ3ByaXNtYScpIHJldHVybiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnO1xuICByZXR1cm4gJ2RyaXp6bGUvcmVzdG9yZWQuc3FsaXRlMyc7XG59XG5cbmZ1bmN0aW9uIGdldExpdGVzdHJlYW1EYlBhdGgocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSk6IHN0cmluZyB7XG4gIGlmIChvcm0gPT09ICdwcmlzbWEnKSB7XG4gICAgY29uc3QgZGlyTmFtZSA9ICdwcmlzbWEnO1xuICAgIHJldHVybiBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGIgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnIGZvciBEcml6emxlIHJlcXVpcmVzIGZpbGU6IERBVEFCQVNFX1VSTC4nKTtcbiAgfVxuICByZXR1cm4gZGJQYXRoO1xufVxuXG5pbnRlcmZhY2UgRGF0YWJhc2VPcm1Qcm9qZWN0IHtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAgb3JtOiBEYXRhYmFzZU9ybTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3JtPzogRGF0YWJhc2VPcm0pOiBQcm9taXNlPERhdGFiYXNlT3JtUHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgLm1hcCgocHJvamVjdCkgPT4gKHByb2plY3QuZGF0YWJhc2VPcm0gPyB7IHByb2plY3QsIG9ybTogcHJvamVjdC5kYXRhYmFzZU9ybSB9IDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKChwcm9qZWN0KTogcHJvamVjdCBpcyBEYXRhYmFzZU9ybVByb2plY3QgPT4gISFwcm9qZWN0ICYmICghb3JtIHx8IHByb2plY3Qub3JtID09PSBvcm0pKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKG9ybSA/IGBObyAke29ybX0gcHJvamVjdCBmb3VuZC5gIDogJ05vIHN1cHBvcnRlZCBkYXRhYmFzZSBPUk0gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybTogRGF0YWJhc2VPcm0pOiB0eXBlb2YgcHJpc21hU2NyaXB0cyB8IHR5cGVvZiBkcml6emxlU2NyaXB0cyB7XG4gIHJldHVybiBvcm0gPT09ICdwcmlzbWEnID8gcHJpc21hU2NyaXB0cyA6IGRyaXp6bGVTY3JpcHRzO1xufVxuXG5mdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIHByb2plY3RzOiBEYXRhYmFzZU9ybVByb2plY3RbXVxuKTogR2VuZXJhdG9yPERhdGFiYXNlT3JtUHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBjb25zdCBvcm1Qcm9qZWN0QnlQcm9qZWN0ID0gbmV3IE1hcChwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IFtwcm9qZWN0LnByb2plY3QsIHByb2plY3RdKSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoXG4gICAgY29tbWFuZE5hbWUsXG4gICAgcHJvamVjdHMubWFwKCh7IHByb2plY3QgfSkgPT4gcHJvamVjdClcbiAgKSkge1xuICAgIGNvbnN0IG9ybVByb2plY3QgPSBvcm1Qcm9qZWN0QnlQcm9qZWN0LmdldChwcm9qZWN0KTtcbiAgICBpZiAoIW9ybVByb2plY3QpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRldGVjdCBkYXRhYmFzZSBPUk0gZm9yICR7cHJvamVjdC5uYW1lfS5gKTtcblxuICAgIHlpZWxkIG9ybVByb2plY3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBPUk0gY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJy0tJyxcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IEFycmF5LmlzQXJyYXkoYXJndlsnLS0nXSkgPyBhcmd2WyctLSddLm1hcChTdHJpbmcpIDogW107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4udW5rbm93bk9wdGlvbnMsIC4uLnBhc3N0aHJvdWdoQXJnc10pO1xufVxuIiwiaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IHJlYWRFbnZFeGFtcGxlS2V5cyB9IGZyb20gJy4vZ2VuRGV2VmFycy5qcyc7XG5cbi8vIFJhaWx3YXkgaW5qZWN0cyBpdHMgb3duIHN5c3RlbSB2YXJpYWJsZXMgYW5kIHBsYXRmb3JtLW1hbmFnZWQgdmFsdWVzOyBuZXZlciBtaXJyb3IgdGhvc2UgYmFjayxcbi8vIGFuZCBza2lwIGxvY2FsLW9ubHkga2V5cy4gQXBwIHZhcmlhYmxlcyAoaW5jbHVkaW5nIERBVEFCQVNFX1VSTCwgUE9SVCkgc3RheSBlbGlnaWJsZSBiZWNhdXNlXG4vLyBmbm94IGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGgg4oCUIGEgcmVwbyB0aGF0IG11c3QgTk9UIG93biBhIHZhbHVlIChlLmcuIGEgUmFpbHdheSByZWZlcmVuY2Vcbi8vIHZhcmlhYmxlIHBvaW50aW5nIGF0IGEgbGlua2VkIGRhdGFiYXNlIHNlcnZpY2UpIHNpbXBseSBrZWVwcyBpdCBvdXQgb2YgZm5veC8uZW52LmV4YW1wbGUuXG5jb25zdCBOT05fUkFJTFdBWV9LRVlTID0gbmV3IFNldChbJ0NJJ10pO1xuY29uc3QgTk9OX1JBSUxXQVlfS0VZX1BSRUZJWEVTID0gWydSQUlMV0FZXycsICdOSVhQQUNLU18nXTtcblxuZnVuY3Rpb24gaXNOb25SYWlsd2F5S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fUkFJTFdBWV9LRVlTLmhhcyhrZXkpIHx8IE5PTl9SQUlMV0FZX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG4vKipcbiAqIFRoZSBrZXlzIGFjdHVhbGx5IGRlY2xhcmVkIGluIHRoZSBwcm9qZWN0J3MgZm5veC8uZW52IHNvdXJjZXMuIGBtaXNlIGVudmAgaXMgcmVwb3J0ZWQgYXMgYVxuICogcHNldWRvLXNvdXJjZSB0aGF0IG1peGVzIGluIGhvc3QvdG9vbCB2YXJpYWJsZXMgKFBBVEgsIENBUkdPX0hPTUUsIFJVU1RVUF8qLCAuLi4pOyB0aG9zZSBtdXN0XG4gKiBuZXZlciBiZSBwdXNoZWQgdG8gUmFpbHdheSwgc28gdGhleSBhcmUgZXhjbHVkZWQgaGVyZSAobWlycm9ycyB3YiBkZXBsb3kpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RG90ZW52U291cmNlZEtleXMoZW52U291cmNlczogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCByZWFkb25seSBzdHJpbmdbXV0+KTogU2V0PHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFNldChlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpKTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSB2YXJpYWJsZXMgdG8gcHVzaCB0byBSYWlsd2F5IGZyb20gYSByZXNvbHZlZCBlbnZpcm9ubWVudDogZHJvcCBlbXB0eS91bmRlZmluZWQgdmFsdWVzXG4gKiAoc28gYSBgS0VZPWAgcGxhY2Vob2xkZXIgbmV2ZXIgYmxhbmtzIGEgcmVhbCBSYWlsd2F5IHZhcmlhYmxlKSBhbmQgUmFpbHdheS1tYW5hZ2VkIGtleXMsIHNvcnRlZFxuICogZm9yIGEgc3RhYmxlIGNvbW1hbmQgYW5kIGxvZyBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0UmFpbHdheVZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogW3N0cmluZywgc3RyaW5nXVtdIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpXG4gICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBbc3RyaW5nLCBzdHJpbmddID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICcnICYmICFpc05vblJhaWx3YXlLZXkoa2V5KTtcbiAgICB9KVxuICAgIC50b1NvcnRlZCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBSYWlsd2F5RW52Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgUmFpbHdheUVudkNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCByYWlsd2F5RW52Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBSYWlsd2F5RW52Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAncmFpbHdheS1lbnYnLFxuICBkZXNjcmliZTpcbiAgICAnU3luYyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGRlY2xhcmVkIGZvciB0aGUgY3VycmVudCBXQl9FTlYgKHJlc29sdmVkIGZyb20gZm5veC8uZW52KSB0byB0aGUgUmFpbHdheSBzZXJ2aWNlLCBrZWVwaW5nIGZub3ggdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguIFJhaWx3YXktbWFuYWdlZCBrZXlzIChSQUlMV0FZXyosIE5JWFBBQ0tTXyosIENJKSBhcmUgbmV2ZXIgcHVzaGVkLicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogUmFpbHdheUVudkNvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0cmljdCB0byB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHByb2plY3QncyBmbm94Ly5lbnYgc291cmNlczsgaWdub3JlIHByb2Nlc3MuZW52IHNvXG4gICAgLy8gUmFpbHdheSdzIG93biBpbmplY3RlZCB2YXJpYWJsZXMgbmV2ZXIgbGVhayBpbi4gVGhlIGVmZmVjdGl2ZSB2YWx1ZXMgY29tZSBmcm9tIHByb2plY3QuZW52XG4gICAgLy8gKGZub3gtcmVzb2x2ZWQgZm9yIFdCX0VOVikuIE1pcnJvcnMgd2IgZGVwbG95LlxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZTb3VyY2VzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBwcm9qZWN0LmRpclBhdGgsIHsgaWdub3JlUHJvY2Vzc0VudjogdHJ1ZSB9KTtcbiAgICAvLyBgbWlzZSBlbnZgIGlzIHJlcG9ydGVkIGFzIGEgcHNldWRvLXNvdXJjZSB0aGF0IG1peGVzIGluIGhvc3QvdG9vbCB2YXJpYWJsZXMgc3VjaCBhcyBQQVRIIGFuZFxuICAgIC8vIENBUkdPX0hPTUU7IHRob3NlIG11c3QgbmV2ZXIgYmUgcHVzaGVkIHRvIFJhaWx3YXksIHNvIGtlZXAgb25seSBmbm94Ly5lbnYtZGVjbGFyZWQga2V5cy5cbiAgICBjb25zdCBkb3RlbnZLZXlzID0gc2VsZWN0RG90ZW52U291cmNlZEtleXMoZW52U291cmNlcyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGlmICghZG90ZW52S2V5cy5oYXMoa2V5KSkgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gICAgLy8gZm5veCByZXBvcyBrZWVwIHZhbHVlcyBvdXQgb2YgY29tbWl0dGVkIGZpbGVzLCBzbyB0aGUgZGVjbGFyZWQga2V5IGxpc3QgbGl2ZXMgaW5cbiAgICAvLyAuZW52LmV4YW1wbGU7IENJIGFsc28gc3VwcGxpZXMgdGhlc2UgYXMgd29ya2Zsb3cgZW52LiBwcm9qZWN0LmVudiBjYXJyaWVzIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ucmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3QpLCAnV0JfRU5WJywgJ05FWFRfUFVCTElDX1dCX0VOViddKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZW52VmFyc1trZXldID09PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuICAgIC8vIEV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aW4gb3ZlciBmaWxlIHZhbHVlcyAobWF0Y2hlcyB3YiBkZXBsb3kgLyBnZW4tZGV2LXZhcnMpLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZWZmZWN0aXZlVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllcyA9IHNlbGVjdFJhaWx3YXlWYXJpYWJsZXMoZW52VmFycyk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdObyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc3luYyB0byBSYWlsd2F5LicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlOYW1lcyA9IGVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihgV291bGQgc3luYyAke2VudHJpZXMubGVuZ3RofSB2YXJpYWJsZShzKSB0byBSYWlsd2F5ICgke2Vudk5hbWV9KTogJHtrZXlOYW1lcy5qb2luKCcsICcpfWApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBSYWlsd2F5IENMSSByZWFkcyBhdXRoIChSQUlMV0FZX0FQSV9UT0tFTikgYW5kIGRlZmF1bHRzIGZyb20gdGhlIGVudmlyb25tZW50OyBwYXNzIHRoZVxuICAgIC8vIHByb2plY3Qvc2VydmljZS9lbnZpcm9ubWVudCBleHBsaWNpdGx5IHdoZW4gYXZhaWxhYmxlIHNvIHRoZSBjb21tYW5kIHdvcmtzIHVuYXR0ZW5kZWQgaW4gQ0kuXG4gICAgY29uc3QgY29udGV4dEFyZ3M6IHN0cmluZ1tdID0gWyctLXNraXAtZGVwbG95cyddO1xuICAgIGlmIChwcm9jZXNzLmVudi5SQUlMV0FZX1BST0pFQ1RfSUQpIGNvbnRleHRBcmdzLnB1c2goYC0tcHJvamVjdD0ke3Byb2Nlc3MuZW52LlJBSUxXQVlfUFJPSkVDVF9JRH1gKTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuUkFJTFdBWV9TRVJWSUNFX0lEKSBjb250ZXh0QXJncy5wdXNoKGAtLXNlcnZpY2U9JHtwcm9jZXNzLmVudi5SQUlMV0FZX1NFUlZJQ0VfSUR9YCk7XG4gICAgY29udGV4dEFyZ3MucHVzaChgLS1lbnZpcm9ubWVudD0ke2Vudk5hbWV9YCk7XG4gICAgY29uc3Qgc2V0QXJncyA9IGVudHJpZXMuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PiBbJy0tc2V0JywgYCR7a2V5fT0ke3ZhbHVlfWBdKTtcblxuICAgIC8vIHN0ZGlvOiAncGlwZScga2VlcHMgdGhlIFJhaWx3YXkgQ0xJJ3MgdmFyaWFibGUgbGlzdGluZyAod2hpY2ggZWNob2VzIHZhbHVlcykgb3V0IG9mIENJIGxvZ3M7XG4gICAgLy8gdGhpcyBjb21tYW5kIG9ubHkgZXZlciBwcmludHMga2V5IG5hbWVzLCBuZXZlciB2YWx1ZXMuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYygnYnVueCcsIFsnQHJhaWx3YXkvY2xpJywgJ3ZhcmlhYmxlcycsIC4uLmNvbnRleHRBcmdzLCAuLi5zZXRBcmdzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgRmFpbGVkIHRvIHN5bmMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIFJhaWx3YXkgKGV4aXQgJHtyZXQuc3RhdHVzfSkuIEtleXM6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdChyZXQuc3RhdHVzID8/IDEpO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFN5bmNlZCAke2VudHJpZXMubGVuZ3RofSB2YXJpYWJsZShzKSB0byBSYWlsd2F5ICgke2Vudk5hbWV9KTogJHtrZXlOYW1lcy5qb2luKCcsICcpfWApKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzLCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbnR5cGUgUmVsZWFzZUFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgYXJncz86IHVua25vd25bXTtcbiAgJy0tJz86IHVua25vd25bXTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWxlYXNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3JlbGVhc2UgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICAnUnVuIHNlbWFudGljLXJlbGVhc2UgKG9yIG11bHRpLXNlbWFudGljLXJlbGVhc2UpIHNvIHRoYXQgcmVwb3NpdG9yaWVzIHVzaW5nIEJ1biBpc29sYXRlZCBpbnN0YWxscyBjYW4gcHVibGlzaCB0byBucG06ICcgK1xuICAgIFwicmVpbnN0YWxsIHdpdGggdGhlIGhvaXN0ZWQgbGlua2VyIChucG0gY2Fubm90IHdhbGsgQnVuJ3MgaXNvbGF0ZWQgbm9kZV9tb2R1bGVzIGxheW91dCksIFwiICtcbiAgICAncmV3cml0ZSBgd29ya3NwYWNlOmAgcmFuZ2VzIG5wbSBjYW5ub3QgcGFyc2UsIHJ1biB0aGUgcmVsZWFzZSwgdGhlbiByZXN0b3JlIHRoZSBtb2RpZmllZCBmaWxlcy4gJyArXG4gICAgJ0V4dHJhIGFyZ3VtZW50cyAoZS5nLiBgLS1kZWJ1Z2AsIGFmdGVyIGAtLWApIGFyZSBmb3J3YXJkZWQgdG8gdGhlIHJlbGVhc2UgY29tbWFuZC4nLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+IHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHJlbGVhc2UoYXJndiBhcyBSZWxlYXNlQXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVsZWFzZShhcmd2OiBSZWxlYXNlQXJndiwgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIC8vIHNlbWFudGljLXJlbGVhc2UgbXVzdCBydW4gYXQgdGhlIHJlcG9zaXRvcnkgcm9vdDogaXQgcmVhZHMgdGhlIGdpdCByZXBvIGFuZCwgZm9yIG1vbm9yZXBvcyxcbiAgLy8gbXVsdGktc2VtYW50aWMtcmVsZWFzZSB3YWxrcyB0aGUgd29ya3NwYWNlcyBpdHNlbGYuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5yb290O1xuXG4gIC8vIE1hcHMgYSBtdXRhdGVkIGZpbGUgdG8gaXRzIHByZS1yZWxlYXNlIGNvbnRlbnQgKHJhdyBieXRlcyDigJQgYnVuLmxvY2tiIGlzIGJpbmFyeSk7IGB1bmRlZmluZWRgXG4gIC8vIG1hcmtzIGEgZmlsZSB0aGF0IGRpZCBub3QgZXhpc3QgYW5kIG11c3QgYmUgZGVsZXRlZCBvbiByZXN0b3JlIChlLmcuIGEgY3JlYXRlZCBsb2NrZmlsZSkuXG4gIGNvbnN0IG1vZGlmaWVkRmlsZXMgPSBuZXcgTWFwPHN0cmluZywgQnVmZmVyIHwgdW5kZWZpbmVkPigpO1xuICAvLyBXaXRoIGEgaGFuZGxlciBpbnN0YWxsZWQsIFNJR0lOVC9TSUdURVJNIG5vIGxvbmdlciB0ZXJtaW5hdGUgdGhpcyBwcm9jZXNzLCBzbyB0aGVcbiAgLy8gZmluYWxseS1yZXN0b3JlIGFsd2F5cyBleGVjdXRlcyBhbmQgdGhlIHNpZ25hbCBpcyByZS1yYWlzZWQgYWZ0ZXJ3YXJkcy4gVGhlIGhhbmRsZXIgYWxzb1xuICAvLyBGT1JXQVJEUyB0aGUgc2lnbmFsIHRvIHRoZSBydW5uaW5nIGNoaWxkOiBjaGlsZHJlbiBhcmUgc3Bhd25lZCBhc3luY2hyb25vdXNseSAobmV2ZXJcbiAgLy8gc3Bhd25TeW5jLCB3aGljaCB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCBhbmQgZGVmZXIgdGhlIGhhbmRsZXIgdW50aWwgYWZ0ZXIgdGhlIGNoaWxkIOKAlFxuICAvLyBhbmQgYSBwdWJsaXNoIOKAlCBjb21wbGV0ZWQpLCBzbyBhIHNpZ25hbCB0YXJnZXRlZCBhdCB0aGlzIHByb2Nlc3MgYWxvbmUgc3RpbGwgY2FuY2VscyB0aGVcbiAgLy8gY2hpbGQgcHJvbXB0bHkuXG4gIGxldCByZWNlaXZlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZiA9IHsgY3VycmVudDogdW5kZWZpbmVkIH07XG4gIGNvbnN0IHNpZ25hbEhhbmRsZXIgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIHJlY2VpdmVkU2lnbmFsID0gc2lnbmFsO1xuICAgIC8vIHRyZWVLaWxsIChub3QgY2hpbGQua2lsbCk6IHNlbWFudGljLXJlbGVhc2UgYW5kIGJ1biBpbnN0YWxsIHNwYXduIHRoZWlyIG93biBzdWJwcm9jZXNzZXNcbiAgICAvLyAobnBtIHB1Ymxpc2gsIGdpdCBwdXNoLCAuLi4pLCB3aGljaCBtdXN0IG5vdCBrZWVwIHB1Ymxpc2hpbmcgYWZ0ZXIgd2IgcmVwb3J0cyBjYW5jZWxsYXRpb24uXG4gICAgLy8gdHJlZUtpbGwgVEhST1dTIChtaXNzaW5nL3RpbWluZy1vdXQgYHBzYCwgRVBFUk0pLCBhbmQgYW4gZXhjZXB0aW9uIGVzY2FwaW5nIGEgc2lnbmFsXG4gICAgLy8gbGlzdGVuZXIgd291bGQgdGVybWluYXRlIHRoZSBwcm9jZXNzIGFuZCBza2lwIHRoZSByZXN0b3JpbmcgZmluYWxseSDigJQgc28gZGVncmFkZSB0b1xuICAgIC8vIGtpbGxpbmcgdGhlIGRpcmVjdCBjaGlsZCBpbnN0ZWFkLlxuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0aXZlQ2hpbGQuY3VycmVudD8ucGlkKSB0cmVlS2lsbChhY3RpdmVDaGlsZC5jdXJyZW50LnBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYEZhaWxlZCB0byB0ZXJtaW5hdGUgdGhlIHJlbGVhc2UgY2hpbGQgcHJvY2VzcyB0cmVlOiAke1N0cmluZyhlcnJvcil9YCkpO1xuICAgICAgYWN0aXZlQ2hpbGQuY3VycmVudD8ua2lsbChzaWduYWwpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ3VhcmRlZFNpZ25hbHM6IE5vZGVKUy5TaWduYWxzW10gPSBbJ1NJR0lOVCcsICdTSUdURVJNJ107XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIGd1YXJkZWRTaWduYWxzKSBwcm9jZXNzLm9uKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG5cbiAgbGV0IGV4aXRDb2RlID0gMDtcbiAgbGV0IHJlbGVhc2VSYW5TdWNjZXNzZnVsbHkgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgcmVsZWFzZVB1Ymxpc2hlc1RvTnBtKHByb2plY3QpKSB7XG4gICAgICBhd2FpdCBwcmVwYXJlTnBtQ29tcGF0aWJsZUxheW91dChwcm9qZWN0LCBhcmd2LCBtb2RpZmllZEZpbGVzLCBhY3RpdmVDaGlsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBob2lzdGVkIHJlaW5zdGFsbCBhbmQgd29ya3NwYWNlLXJhbmdlIHJld3JpdGUgZXhpc3Qgc29sZWx5IHNvIG5wbSAod2hpY2ggdGhlXG4gICAgICAvLyBAc2VtYW50aWMtcmVsZWFzZS9ucG0gcGx1Z2luIHNoZWxscyBvdXQgdG8pIGNhbiBkaWdlc3QgdGhlIGNoZWNrb3V0OyB3aXRob3V0IHRoYXQgcGx1Z2luXG4gICAgICAvLyB0aGUgcmVsZWFzZSBydW5zIGRpcmVjdGx5IG9uIHRoZSBpc29sYXRlZCBsYXlvdXQgKGlzc3VlICMxMDAwKS5cbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICAnU2tpcHBpbmcgdGhlIGhvaXN0ZWQgcmVpbnN0YWxsIGJlY2F1c2UgdGhlIHNlbWFudGljLXJlbGVhc2UgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBpbmNsdWRlIEBzZW1hbnRpYy1yZWxlYXNlL25wbS4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEEgc2lnbmFsIG1heSBoYXZlIGFycml2ZWQgYmV0d2VlbiBjaGlsZHJlbiAobm90aGluZyB0byBmb3J3YXJkIHRvIGF0IHRoYXQgaW5zdGFudCksIHNvIGl0XG4gICAgLy8gbXVzdCBiZSBjaGVja2VkIGV4cGxpY2l0bHkgYmVmb3JlIGFueXRoaW5nIHB1Ymxpc2hlcy5cbiAgICBpZiAocmVjZWl2ZWRTaWduYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWJvcnRlZCBieSAke3JlY2VpdmVkU2lnbmFsfSBiZWZvcmUgcnVubmluZyB0aGUgcmVsZWFzZS5gKTtcbiAgICB9XG4gICAgZXhpdENvZGUgPSBhd2FpdCBydW5TZW1hbnRpY1JlbGVhc2UocHJvamVjdCwgYXJndiwgYWN0aXZlQ2hpbGQpO1xuICAgIC8vIFJlY29yZGVkIHNlcGFyYXRlbHkgZnJvbSByZWNlaXZlZFNpZ25hbDogYSBzaWduYWwgYXJyaXZpbmcgQUZURVIgYSBzdWNjZXNzZnVsIHB1Ymxpc2ggbXVzdFxuICAgIC8vIG5vdCBkZW1vdGUgdGhlIHJlc3RvcmUgdG8gYnl0ZS1mb3ItYnl0ZSAodGhhdCB3b3VsZCByZXZlcnQgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIGJ1bXBzKS5cbiAgICByZWxlYXNlUmFuU3VjY2Vzc2Z1bGx5ID0gZXhpdENvZGUgPT09IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRXJyb3JzIG11c3QgdW53aW5kIHRocm91Z2ggdGhpcyB0cnkgKG5ldmVyIGBwcm9jZXNzLmV4aXRgIGluc2lkZSBpdCk6IHRoZSByZXN0b3JlIGJlbG93IGlzXG4gICAgLy8gdGhlIG9ubHkgdGhpbmcgdGhhdCB1bmRvZXMgdGhlIGJ1bmZpZy9wYWNrYWdlLmpzb24gbXV0YXRpb25zLlxuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKSkpO1xuICAgIGV4aXRDb2RlID0gMTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBPbiBmYWlsdXJlIG9yIGludGVycnVwdGlvbiwgcmVzdG9yZSBieXRlLWZvci1ieXRlOiBzZW1hbnRpYy1yZWxlYXNlIG1heSBoYXZlIGxlZnQgUEFSVElBTFxuICAgIC8vIGVkaXRzIChlLmcuIGEgdmVyc2lvbiBidW1wIHdpdGhvdXQgYSBwdWJsaXNoKSwgd2hpY2ggbXVzdCBub3Qgc3Vydml2ZS4gVGhlIHNlbWFudGljXG4gICAgLy8gd29ya3NwYWNlLXJhbmdlIHJlc3RvcmUgaXMgcmVzZXJ2ZWQgZm9yIGEgc3VjY2Vzc2Z1bCByZWxlYXNlLlxuICAgIGNvbnN0IHJlc3RvcmVkRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBtb2RpZmllZEZpbGVzKSB7XG4gICAgICBpZiAocmVzdG9yZU1vZGlmaWVkRmlsZShmaWxlUGF0aCwgY29udGVudCwgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSkpIHJlc3RvcmVkRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgIH1cbiAgICBpZiAocmVzdG9yZWRGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5jeWFuKGBSZXN0b3JlZCAke3Jlc3RvcmVkRmlsZVBhdGhzLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHApKS5qb2luKCcsICcpfS5gKVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVGhlIGhpbnQgYXBwbGllcyBvbmx5IHdoZW4gdGhlIGhvaXN0ZWQgcmVpbnN0YWxsIGFjdHVhbGx5IHJhbjsgYnVuZmlnLnRvbWwgaXMgc25hcHNob3R0ZWRcbiAgICAvLyBleGFjdGx5IGluIHRoYXQgYnJhbmNoLlxuICAgIGNvbnN0IHJlaW5zdGFsbGVkV2l0aEhvaXN0ZWRMaW5rZXIgPSBbLi4ubW9kaWZpZWRGaWxlcy5rZXlzKCldLnNvbWUoXG4gICAgICAoZmlsZVBhdGgpID0+IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpID09PSAnYnVuZmlnLnRvbWwnXG4gICAgKTtcbiAgICBpZiAocmVpbnN0YWxsZWRXaXRoSG9pc3RlZExpbmtlciAmJiAhaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICdub2RlX21vZHVsZXMgbm93IHVzZXMgdGhlIGhvaXN0ZWQgbGF5b3V0OyBydW4gYSBjbGVhbiByZWluc3RhbGwgKGBybSAtcmYgbm9kZV9tb2R1bGVzIHBhY2thZ2VzLyovbm9kZV9tb2R1bGVzICYmIGJ1biBpbnN0YWxsYCkgdG8gcmVzdG9yZSB0aGUgaXNvbGF0ZWQgbGF5b3V0LidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzaWduYWwgb2YgZ3VhcmRlZFNpZ25hbHMpIHByb2Nlc3Mub2ZmKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gIH1cbiAgaWYgKHJlY2VpdmVkU2lnbmFsKSB7XG4gICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNpZ25hbCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEFjdGl2ZUNoaWxkUmVmIHtcbiAgY3VycmVudDogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3Bhd24gYXN5bmNocm9ub3VzbHkgYW5kIGF3YWl0IHRoZSBleGl0IHN0YXR1cy4gVGhlIGV2ZW50IGxvb3Agc3RheXMgZnJlZSwgc28gcGFyZW50LW9ubHlcbiAqIHNpZ25hbHMgYXJlIGhhbmRsZWQgcHJvbXB0bHkgYW5kIGZvcndhcmRlZCB0byB0aGUgY2hpbGQgYnkgcmVsZWFzZSgpJ3Mgc2lnbmFsIGhhbmRsZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNwYXduQW5kV2FpdChcbiAgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmLFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBvcHRpb25zOiBjaGlsZF9wcm9jZXNzLlNwYXduT3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPG51bWJlcj4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oY29tbWFuZCwgYXJncywgb3B0aW9ucyk7XG4gICAgYWN0aXZlQ2hpbGQuY3VycmVudCA9IGNoaWxkO1xuICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgYWN0aXZlQ2hpbGQuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHJlc29sdmUoMSk7XG4gICAgfSk7XG4gICAgY2hpbGQub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgYWN0aXZlQ2hpbGQuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIHJlc29sdmUoY29kZSA/PyAxKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVsZWFzZSBjYW4gcHVibGlzaCB0byBucG0uIFRydWUgdW5sZXNzIGEgcGx1Z2luIGxpc3QgaXMgZXhwbGljaXRseSBjb25maWd1cmVkXG4gKiAoaW4gYSBKU09OLXBhcnNlYWJsZSBzb3VyY2UpIGFuZCBvbWl0cyBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCBldmVyeXdoZXJlIGluIHNjb3BlIOKAlCB0aGUgcm9vdFxuICogYW5kLCBmb3IgbXVsdGktc2VtYW50aWMtcmVsZWFzZSBtb25vcmVwb3MsIGVhY2ggd29ya3NwYWNlIHBhY2thZ2UgKGEgcGFja2FnZS1sZXZlbCBwbHVnaW4gbGlzdFxuICogb3ZlcnJpZGVzIHRoZSByb290J3MpLiBzZW1hbnRpYy1yZWxlYXNlJ3MgREVGQVVMVCBwbHVnaW4gbGlzdCBpbmNsdWRlcyB0aGUgbnBtIHBsdWdpbiwgc28gYVxuICogbWlzc2luZyBwbHVnaW4gbGlzdCwgYSBub24tSlNPTiBjb25maWcgZmlsZSwgb3IgYW4gYGV4dGVuZHNgIHByZXNldCBjb25zZXJ2YXRpdmVseSBrZWVwcyB0aGVcbiAqIG5wbSBwcmVwYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VQdWJsaXNoZXNUb05wbShcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb24nIHwgJ3VzZXNCdW5QYWNrYWdlTWFuYWdlcic+XG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgcm9vdFBsdWdpbnMgPSByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zKHByb2plY3QuZGlyUGF0aCwgcHJvamVjdC5wYWNrYWdlSnNvbik7XG4gIC8vIFdpdGhvdXQgYW4gZXhwbGljaXQgcm9vdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCAobnBtIGluY2x1ZGVkKSBhcHBsaWVzLlxuICBpZiAoIUFycmF5LmlzQXJyYXkocm9vdFBsdWdpbnMpIHx8IHBsdWdpbnNJbmNsdWRlTnBtKHJvb3RQbHVnaW5zKSkgcmV0dXJuIHRydWU7XG5cbiAgZm9yIChjb25zdCBwYWNrYWdlRGlyUGF0aCBvZiBhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocHJvamVjdCkpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyhwYWNrYWdlRGlyUGF0aCwgdW5kZWZpbmVkKTtcbiAgICAvLyBBIHdvcmtzcGFjZSBwYWNrYWdlIHdpdGhvdXQgaXRzIG93biBwbHVnaW4gbGlzdCBpbmhlcml0cyB0aGUgcm9vdCdzIChucG0tZnJlZSkgZGVjaXNpb24uXG4gICAgaWYgKHBsdWdpbnMgPT09ICd1bmtub3duJyB8fCAoQXJyYXkuaXNBcnJheShwbHVnaW5zKSAmJiBwbHVnaW5zSW5jbHVkZU5wbShwbHVnaW5zKSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGx1Z2luc0luY2x1ZGVOcG0ocGx1Z2luczogcmVhZG9ubHkgdW5rbm93bltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBwbHVnaW5zLnNvbWUoKHBsdWdpbikgPT4gKEFycmF5LmlzQXJyYXkocGx1Z2luKSA/IHBsdWdpblswXSA6IHBsdWdpbikgPT09ICdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKTtcbn1cblxuLyoqXG4gKiBjb3NtaWNvbmZpZyA5J3MgZGVmYXVsdCBzZWFyY2hQbGFjZXMgb3JkZXIgZm9yIG1vZHVsZSBcInJlbGVhc2VcIiAod2hhdCBzZW1hbnRpYy1yZWxlYXNlIDI1XG4gKiBkZWxlZ2F0ZXMgdG8pLCBtaW51cyB0aGUgbGVhZGluZyBwYWNrYWdlLmpzb24gZW50cnksIHdoaWNoIHRoZSBjYWxsZXIgY2hlY2tzIGZpcnN0LiBUaGUgRklSU1RcbiAqIGV4aXN0aW5nIHBsYWNlIHdpbnM7IHBsYWNlcyB3aG9zZSBmb3JtYXQgSlNPTi5wYXJzZSBjYW5ub3QgcmVhZCBtYWtlIHRoZSBlZmZlY3RpdmUgcGx1Z2luXG4gKiBsaXN0ICd1bmtub3duJy5cbiAqL1xuY29uc3Qgc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzOiB7IGZpbGVOYW1lOiBzdHJpbmc7IGpzb25QYXJzZWFibGU6IGJvb2xlYW4gfVtdID0gW1xuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYycsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnltbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5tanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5janMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy5qc29uJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLmNqcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy50cycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5tanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcuY2pzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbl07XG5cbmZ1bmN0aW9uIHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkXG4pOiByZWFkb25seSB1bmtub3duW10gfCB1bmRlZmluZWQgfCAndW5rbm93bicge1xuICAvLyBjb3NtaWNvbmZpZyBzZWFyY2hlcyBwYWNrYWdlLmpzb24ncyBgcmVsZWFzZWAga2V5IEJFRk9SRSBhbnkgcmMvY29uZmlnIGZpbGU7IGEgbWlzc2luZyBvclxuICAvLyB1bnJlYWRhYmxlIHBhY2thZ2UuanNvbiBqdXN0IGZhbGxzIHRocm91Z2ggdG8gdGhlIGZpbGUgc2VhcmNoIHBsYWNlcy5cbiAgaWYgKHBhY2thZ2VKc29uID09PSB1bmRlZmluZWQpIHtcbiAgICB0cnkge1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHBhY2thZ2VKc29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICBsZXQgY29uZmlnID0gKHBhY2thZ2VKc29uIGFzIHsgcmVsZWFzZT86IHsgcGx1Z2lucz86IHVua25vd247IGV4dGVuZHM/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlbGVhc2U7XG4gIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgeyBmaWxlTmFtZSwganNvblBhcnNlYWJsZSB9IG9mIHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlcykge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFqc29uUGFyc2VhYmxlKSByZXR1cm4gJ3Vua25vd24nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSkgYXMgdHlwZW9mIGNvbmZpZztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcucGx1Z2lucykpIHJldHVybiBjb25maWcucGx1Z2lucztcbiAgLy8gQW4gYGV4dGVuZHNgIHByZXNldCBtYXkgY29udHJpYnV0ZSBpdHMgb3duIHBsdWdpbiBsaXN0LCB3aGljaCBjYW5ub3QgYmUgcmVzb2x2ZWQgc3RhdGljYWxseS5cbiAgcmV0dXJuIGNvbmZpZy5leHRlbmRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAndW5rbm93bic7XG59XG5cbi8qKlxuICogTWFrZSB0aGUgY2hlY2tvdXQgZGlnZXN0aWJsZSBmb3IgbnBtLCB3aGljaCBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvIGZvclxuICogYG5wbSB2ZXJzaW9uYCAvIGBucG0gcHVibGlzaGA6XG4gKiAxLiBucG0ncyBhcmJvcmlzdCBjYW5ub3Qgd2FsayBCdW4ncyBJU09MQVRFRCBub2RlX21vZHVsZXMgbGF5b3V0ICh0aGUgYC5idW5gIHN5bWxpbmsgZmFybSksIHNvXG4gKiAgICBjbGVhbi1yZWluc3RhbGwgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgZmlyc3QuIEEgbm9uLWNsZWFuIGxpbmtlciBzd2l0Y2ggd291bGQgbGVhdmUgc3RhbGVcbiAqICAgIGdsb2JhbC1zdG9yZSBzeW1saW5rcyBiZWhpbmQgKHBhY2thZ2VzIHRoZW4gcmVzb2x2ZSBmcm9tIH4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzIHdoZXJlXG4gKiAgICBwaGFudG9tIGRlcGVuZGVuY2llcyBhcmUgdW5yZWFjaGFibGUpLCBzbyBldmVyeSBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGlzIHdpcGVkIGZpcnN0LlxuICogMi4gbnBtIGNhbm5vdCBwYXJzZSBgd29ya3NwYWNlOmAgc3BlY2lmaWVycywgd2hpbGUgQnVuIFJFUVVJUkVTIHRoZSBwcm90b2NvbCBzbyBhIGNvbGQgaW5zdGFsbFxuICogICAgbGlua3MgdGhlIHdvcmtzcGFjZSDigJQgc28gcmV3cml0ZSB0aGUgcmFuZ2VzIHRvIGAqYCBBRlRFUiB0aGUgcmVpbnN0YWxsIChCdW4gbXVzdCBzdGlsbCBzZWVcbiAqICAgIHRoZSBwcm90b2NvbCB3aGlsZSBpbnN0YWxsaW5nOyBucG0gb25seSBuZWVkcyB0aGUgbWFuaWZlc3QgVEVYVCB0byBiZSBwYXJzZWFibGUpLiBUaGVcbiAqICAgIGFmZmVjdGVkIG1hbmlmZXN0cyBhcmUgcHJpdmF0ZS91bnB1Ymxpc2hlZCBvciByZXdyaXR0ZW4gYnkgdGhlIG5wbSBwbHVnaW4gb24gcHVibGlzaC5cbiAqIEFsbCBtdXRhdGlvbnMgYXJlIHJlc3RvcmVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdGhlIHJlbGVhc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVOcG1Db21wYXRpYmxlTGF5b3V0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBSZWxlYXNlQXJndixcbiAgbW9kaWZpZWRGaWxlczogTWFwPHN0cmluZywgQnVmZmVyIHwgdW5kZWZpbmVkPixcbiAgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYnVuZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICBjb25zdCBidW5maWcgPSBmcy5leGlzdHNTeW5jKGJ1bmZpZ1BhdGgpID8gZnMucmVhZEZpbGVTeW5jKGJ1bmZpZ1BhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhvaXN0ZWRCdW5maWcgPSBidW5maWcgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJ1aWxkSG9pc3RlZEJ1bmZpZyhidW5maWcpO1xuICBpZiAoYnVuZmlnICE9PSB1bmRlZmluZWQgJiYgaG9pc3RlZEJ1bmZpZyAhPT0gYnVuZmlnKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oJ0NsZWFuLXJlaW5zdGFsbGluZyB3aXRoIHRoZSBob2lzdGVkIGxpbmtlciBzbyBucG0gY2FuIHdhbGsgbm9kZV9tb2R1bGVzLi4uJykpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KGJ1bmZpZ1BhdGgsIEJ1ZmZlci5mcm9tKGJ1bmZpZywgJ3V0ZjgnKSk7XG4gICAgICAvLyBUaGUgaG9pc3RlZCByZWluc3RhbGwgbWF5IHJld3JpdGUgKG9yIGNyZWF0ZSkgdGhlIGxvY2tmaWxlOyBzbmFwc2hvdCB0aGUgcmF3IGJ5dGVzIHNvIGFcbiAgICAgIC8vIHN1Y2Nlc3NmdWwgcmVsZWFzZSBsZWF2ZXMgbm8gdHJhY2tlZCBvciB1bnRyYWNrZWQgbG9ja2ZpbGUgY2hhbmdlcyBiZWhpbmQuXG4gICAgICBmb3IgKGNvbnN0IGxvY2tGaWxlTmFtZSBvZiBbJ2J1bi5sb2NrJywgJ2J1bi5sb2NrYiddKSB7XG4gICAgICAgIGNvbnN0IGxvY2tGaWxlUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGxvY2tGaWxlTmFtZSk7XG4gICAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KGxvY2tGaWxlUGF0aCwgZnMuZXhpc3RzU3luYyhsb2NrRmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGxvY2tGaWxlUGF0aCkgOiB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhidW5maWdQYXRoLCBob2lzdGVkQnVuZmlnID8/ICcnLCAndXRmOCcpO1xuICAgICAgY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRocyA9IFtwcm9qZWN0LmRpclBhdGgsIC4uLihhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocHJvamVjdCkpXS5tYXAoKGRpclBhdGgpID0+XG4gICAgICAgIHBhdGguam9pbihkaXJQYXRoLCAnbm9kZV9tb2R1bGVzJylcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aCBvZiBub2RlTW9kdWxlc0RpclBhdGhzKSB7XG4gICAgICAgIGZzLnJtU3luYyhub2RlTW9kdWxlc0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFJlc29sdmUgYW5kIGRvd25sb2FkIHdpdGggbGlmZWN5Y2xlIHNjcmlwdHMgRElTQUJMRUQgd2hpbGUgdGhlIHJlbGVhc2UgY3JlZGVudGlhbHNcbiAgICAgIC8vIChWRVJEQUNDSU9fVE9LRU4sIE5QTV9UT0tFTiwgR0lUSFVCX1RPS0VOLCBGTk9YX0FHRV9LRVksIC4uLikgYXJlIGluIHRoZSBlbnZpcm9ubWVudCxcbiAgICAgIC8vIHNvIHJlcG9zaXRvcnktIG9yIGRlcGVuZGVuY3ktZGVmaW5lZCBwcmVpbnN0YWxsL3Bvc3RpbnN0YWxsIGNhbiBuZXZlciByZWFkIHRoZW0g4oCUXG4gICAgICAvLyBtaXJyb3JpbmcgcmV1c2FibGUtd29ya2Zsb3dzJyB0d28tc3RlcCByZWxlYXNlIGluc3RhbGwgKGlzc3VlICMxMDAzKS5cbiAgICAgIGNvbnN0IGluc3RhbGxTdGF0dXMgPSBhd2FpdCBzcGF3bkFuZFdhaXQoYWN0aXZlQ2hpbGQsICdidW4nLCBbJ2luc3RhbGwnLCAnLS1pZ25vcmUtc2NyaXB0cyddLCB7XG4gICAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBpZiAoaW5zdGFsbFN0YXR1cyAhPT0gMCkge1xuICAgICAgICAvLyBUaHJvd2luZyAoaW5zdGVhZCBvZiBwcm9jZXNzLmV4aXQsIHdoaWNoIHdvdWxkIHNraXAgdGhlIGNhbGxlcidzIGZpbmFsbHkpIGxldHMgdGhlXG4gICAgICAgIC8vIHJlc3RvcmUgcnVuIGJlZm9yZSB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1biBpbnN0YWxsIGZhaWxlZCB3aGlsZSBwcmVwYXJpbmcgdGhlIHJlbGVhc2UuJyk7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYXkgdGhlIHNraXBwZWQgbGlmZWN5Y2xlIHNjcmlwdHMgaW4gYSBjcmVkZW50aWFsLXNjcnViYmVkIGVudmlyb25tZW50LiBBIHJlcGVhdGVkXG4gICAgICAvLyBgYnVuIGluc3RhbGxgIGlzIGEgbm8tb3AgdGhhdCBkb2VzIG5vdCByZXBsYXkgdGhlbSwgc28gbm9kZV9tb2R1bGVzIGlzIHdpcGVkIGFnYWluO1xuICAgICAgLy8gZXZlcnkgcGFja2FnZSBpcyBhbHJlYWR5IGluIGJ1bidzIGNhY2hlIGZyb20gdGhlIGNyZWRlbnRpYWxlZCBzdGVwLCBzbyB0aGlzIHJlLWxpbmtcbiAgICAgIC8vIG5lZWRzIG5vIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLlxuICAgICAgZm9yIChjb25zdCBub2RlTW9kdWxlc0RpclBhdGggb2Ygbm9kZU1vZHVsZXNEaXJQYXRocykge1xuICAgICAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXBsYXlTdGF0dXMgPSBhd2FpdCBzcGF3bkFuZFdhaXQoYWN0aXZlQ2hpbGQsICdidW4nLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgZW52OiBidWlsZENyZWRlbnRpYWxGcmVlRW52KHByb2plY3QuZW52KSxcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcGxheVN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1biBpbnN0YWxsIGZhaWxlZCB3aGlsZSByZXBsYXlpbmcgbGlmZWN5Y2xlIHNjcmlwdHMgZm9yIHRoZSByZWxlYXNlLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZVBhY2thZ2VEaXJzID0gYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBbXG4gICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGgsXG4gICAgLi4ud29ya3NwYWNlUGFja2FnZURpcnMubWFwKChkaXJQYXRoKSA9PiBwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgXSkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG9yaWdpbmFsID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBTbmFwc2hvdCBFVkVSWSBtYW5pZmVzdCAobm90IG9ubHkgcmV3cml0dGVuIG9uZXMpOiBzZW1hbnRpYy1yZWxlYXNlIGFsc28gZWRpdHMgbWFuaWZlc3RzXG4gICAgLy8gd2l0aG91dCB3b3Jrc3BhY2U6IHJhbmdlcyAodmVyc2lvbiBidW1wcyksIGFuZCBhIGZhaWxlZCByZWxlYXNlIG11c3QgcmVzdG9yZSB0aG9zZSB0b28uXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgbW9kaWZpZWRGaWxlcy5zZXQocGFja2FnZUpzb25QYXRoLCBCdWZmZXIuZnJvbShvcmlnaW5hbCwgJ3V0ZjgnKSk7XG4gICAgfVxuICAgIGNvbnN0IHJld3JpdHRlbiA9IHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMob3JpZ2luYWwpO1xuICAgIGlmIChyZXdyaXR0ZW4gPT09IG9yaWdpbmFsKSBjb250aW51ZTtcblxuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSZXdyaXRpbmcgd29ya3NwYWNlOiByYW5nZXMgaW4gJHtwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKX0uLi5gKSk7XG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIHJld3JpdHRlbiwgJ3V0ZjgnKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIGNyZWRlbnRpYWxzIHRoZSByZWxlYXNlIHdvcmtmbG93IGluamVjdHMgKGNmLiByZXVzYWJsZS13b3JrZmxvd3MnIHJlbGVhc2UueW1sIHNlY3JldHMgYW5kXG4vLyBucG0ncyBvd24gdG9rZW4gdmFyaWFibGVzKS4gVGhlIHJlbGVhc2UgY29tbWFuZCBsb2FkcyB0aGUgcHJvamVjdCB3aXRoIGxvYWRFbnY6IGZhbHNlLCBzbyBub1xuLy8gd2ItbG9hZGVyLWluamVjdGVkIGtleXMgZXhpc3QgdG8gc2NydWIgYmV5b25kIHRoZXNlLiBBIGRlbnlsaXN0IChub3QgYW4gYWxsb3dsaXN0KSBpc1xuLy8gZGVsaWJlcmF0ZTogaW4gdGhlIHN1cHBvcnRlZCBlbnRyeSBwb2ludCDigJQgcmV1c2FibGUtd29ya2Zsb3dzJyByZWxlYXNlIGpvYiDigJQgdGhlc2UgZW51bWVyYXRlZFxuLy8gdmFyaWFibGVzIGFyZSB0aGUgT05MWSBzZWNyZXRzIGluIHRoZSBhbWJpZW50IGVudmlyb25tZW50IChmbm94IHNlY3JldHMgc3RheSBlbmNyeXB0ZWQgYmVjYXVzZVxuLy8gRk5PWF9BR0VfS0VZIGlzIHNjcnViYmVkIGFuZCBuZXZlciBleHBvcnRlZCBhcyBwbGFpbnRleHQgdGhlcmUpLCB3aGlsZSBhbiBhbGxvd2xpc3Qgd291bGRcbi8vIGJyZWFrIGxpZmVjeWNsZSBzY3JpcHRzIHRoYXQgbGVnaXRpbWF0ZWx5IHJlYWQgb3BlcmF0aW9uYWwgdmFyaWFibGVzIChQQVRILCBIT01FLCBDSSwgLi4uKS5cbi8vIEEgbG9jYWwgYHdiIHJlbGVhc2VgIGluaGVyaXRzIHdoYXRldmVyIHRoZSBkZXZlbG9wZXIncyBzaGVsbCBhbHJlYWR5IGV4cG9zZXMgdG8gZXZlcnlcbi8vIGBidW4gaW5zdGFsbGAsIHdoaWNoIHRoaXMgcmVwbGF5IGRvZXMgbm90IHdpZGVuLlxuY29uc3QgY3JlZGVudGlhbEVudlZhck5hbWVzID0gW1xuICAnVkVSREFDQ0lPX1RPS0VOJyxcbiAgJ05QTV9UT0tFTicsXG4gICdOT0RFX0FVVEhfVE9LRU4nLFxuICAnR0lUSFVCX1RPS0VOJyxcbiAgJ0dIX1RPS0VOJyxcbiAgJ0dIX1BBQ0tBR0VTX1RPS0VOJyxcbiAgJ0dIX1BLR19SRUFEX1RPS0VOJyxcbiAgJ0ZOT1hfQUdFX0tFWScsXG5dO1xuXG4vKipcbiAqIEEgY29weSBvZiBgZW52YCBzYWZlIHRvIGV4cG9zZSB0byBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzLiBDcmVkZW50aWFsIHZhcmlhYmxlcyBhcmVcbiAqIEVNUFRJRUQgcmF0aGVyIHRoYW4gZGVsZXRlZCBzbyBgJHtWRVJEQUNDSU9fVE9LRU59YC1zdHlsZSByZWZlcmVuY2VzIGluIC5ucG1yYyBrZWVwIGV4cGFuZGluZ1xuICogdG8gJycgaW5zdGVhZCBvZiBjcmFzaGluZyB0aGUgaW5zdGFsbCAodGhlIHBhdHRlcm4gcmV1c2FibGUtd29ya2Zsb3dzIHJlbGllcyBvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENyZWRlbnRpYWxGcmVlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzY3J1YmJlZEVudiA9IHsgLi4uZW52IH07XG4gIGZvciAoY29uc3QgbmFtZSBvZiBjcmVkZW50aWFsRW52VmFyTmFtZXMpIHtcbiAgICBpZiAobmFtZSBpbiBzY3J1YmJlZEVudikgc2NydWJiZWRFbnZbbmFtZV0gPSAnJztcbiAgfVxuICByZXR1cm4gc2NydWJiZWRFbnY7XG59XG5cbi8qKlxuICogVW5kbyB0aGUgdGVtcG9yYXJ5IHJlbGVhc2UtdGltZSBtdXRhdGlvbnMgb2Ygb25lIGZpbGUuIGBwYWNrYWdlLmpzb25gIGZpbGVzIGFyZSByZXN0b3JlZFxuICogc2VtYW50aWNhbGx5IGluc3RlYWQgb2YgYnl0ZS1mb3ItYnl0ZTogc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gd3JpdGVzIHRoZSByZWxlYXNlZFxuICogdmVyc2lvbiBpbnRvIG1hbmlmZXN0cyB3aGlsZSB0aGV5IGhvbGQgdGhlIHJld3JpdHRlbiByYW5nZXMsIGFuZCBhIGJ5dGUgcmVzdG9yZSB3b3VsZCBzaWxlbnRseVxuICogcmV2ZXJ0IHRoYXQgYnVtcCDigJQgc28gd2hlbiB0aGUgZmlsZSBjaGFuZ2VkIGR1cmluZyB0aGUgcmVsZWFzZSwgb25seSB0aGUgYHdvcmtzcGFjZTpgXG4gKiBzcGVjaWZpZXJzIGFyZSB3cml0dGVuIGJhY2sgaW50byB0aGUgQ1VSUkVOVCBjb250ZW50LlxuICovXG4vKiogUmV0dXJucyB3aGV0aGVyIHRoZSBvbi1kaXNrIGNvbnRlbnQgYWN0dWFsbHkgY2hhbmdlZCAoZHJpdmVzIHRoZSBcIlJlc3RvcmVkIC4uLlwiIG1lc3NhZ2UpLiAqL1xuZnVuY3Rpb24gcmVzdG9yZU1vZGlmaWVkRmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgb3JpZ2luYWxDb250ZW50OiBCdWZmZXIgfCB1bmRlZmluZWQsXG4gIHJlbGVhc2VTdWNjZWVkZWQ6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICBpZiAob3JpZ2luYWxDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBleGlzdGVkID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIHJldHVybiBleGlzdGVkO1xuICB9XG4gIGlmIChyZWxlYXNlU3VjY2VlZGVkICYmIHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpID09PSAncGFja2FnZS5qc29uJyAmJiBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IG9yaWdpbmFsQ29udGVudC50b1N0cmluZygndXRmOCcpO1xuICAgIGlmIChjdXJyZW50Q29udGVudCAhPT0gcmV3cml0ZVdvcmtzcGFjZVJhbmdlcyhvcmlnaW5hbFRleHQpKSB7XG4gICAgICBjb25zdCByZXN0b3JlZENvbnRlbnQgPSByZXN0b3JlV29ya3NwYWNlUmFuZ2VzKGN1cnJlbnRDb250ZW50LCBvcmlnaW5hbFRleHQpO1xuICAgICAgaWYgKHJlc3RvcmVkQ29udGVudCA9PT0gY3VycmVudENvbnRlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIHJlc3RvcmVkQ29udGVudCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBjdXJyZW50QnVmZmVyID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgpIDogdW5kZWZpbmVkO1xuICBpZiAoY3VycmVudEJ1ZmZlcj8uZXF1YWxzKG9yaWdpbmFsQ29udGVudCkpIHJldHVybiBmYWxzZTtcbiAgLy8gV3JpdGUgdGhlIHNuYXBzaG90IGJ5dGVzIHZlcmJhdGltOiBidW4ubG9ja2IgaXMgYmluYXJ5LCBzbyBhbnkgdGV4dCBkZWNvZGUvZW5jb2RlIHJvdW5kIHRyaXBcbiAgLy8gd291bGQgY29ycnVwdCBpdC5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgb3JpZ2luYWxDb250ZW50KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEhvaXN0ZWRCdW5maWcoYnVuZmlnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVuZmlnXG4gICAgLnJlcGxhY2UoL14oXFxzKmxpbmtlclxccyo9XFxzKilbXCInXWlzb2xhdGVkW1wiJ10vbXUsICckMVwiaG9pc3RlZFwiJylcbiAgICAucmVwbGFjZSgvXlxccypnbG9iYWxTdG9yZVxccyo9XFxzKnRydWVbXlxcbl0qXFxuPy9tdSwgJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV3cml0ZVdvcmtzcGFjZVJhbmdlcyhwYWNrYWdlSnNvbkNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE9wZXJhdGUgb25seSBpbnNpZGUgdGhlIGRlcGVuZGVuY3kgc2VjdGlvbnM6IGEgYmxhbmtldCBgXCJ3b3Jrc3BhY2U6Li4uXCJgIHJlcGxhY2VtZW50IHdvdWxkXG4gIC8vIGFsc28gY29ycnVwdCB1bnJlbGF0ZWQgc3RyaW5nIHZhbHVlcyAoZS5nLiBhIGRlc2NyaXB0aW9uIHN0YXJ0aW5nIHdpdGggYHdvcmtzcGFjZTpgKSwgYW5kIGFcbiAgLy8gbmFtZS1rZXllZCBnbG9iYWwgcmVwbGFjZW1lbnQgd291bGQgdG91Y2ggc2FtZS1uYW1lZCBrZXlzIGluIG90aGVyIHNlY3Rpb25zIChlLmcuIG92ZXJyaWRlcykuXG4gIHJldHVybiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMocGFja2FnZUpzb25Db250ZW50LCAoc2VjdGlvbikgPT5cbiAgICBzZWN0aW9uLnJlcGxhY2VBbGwoLyhcIlteXCJcXG5dK1wiXFxzKjpcXHMqKVwid29ya3NwYWNlOlteXCJdKlwiL2d1LCAnJDFcIipcIicpXG4gICk7XG59XG5cbi8qKlxuICogUmUtYXBwbHkgdGhlIG9yaWdpbmFsIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXJzIHRvIHRoZSBDVVJSRU5UIG1hbmlmZXN0IGNvbnRlbnQuIE1hdGNoaW5nIGtleXNcbiAqIG9mZiB0aGUgZGVwZW5kZW5jeSBOQU1FIChub3QgdGhlIGBcIipcImAgcGxhY2Vob2xkZXIpIGlzIGRlbGliZXJhdGU6IG11bHRpLXNlbWFudGljLXJlbGVhc2Unc1xuICogcHJlcGFyZSBzdGVwIG92ZXJ3cml0ZXMgbG9jYWwgZGVwZW5kZW5jeSBzcGVjaWZpZXJzIHdpdGggY29uY3JldGUgcmVsZWFzZWQgdmVyc2lvbnMsIGFuZCB0aGVcbiAqIGNvbW1pdHRlZCBtYW5pZmVzdCBtdXN0IGdldCBpdHMgYHdvcmtzcGFjZTpgIHByb3RvY29sIGJhY2sgcmVnYXJkbGVzcyDigJQgQnVuIHJlcXVpcmVzIHRoZVxuICogcHJvdG9jb2wgc28gYSBjb2xkIGluc3RhbGwgbGlua3MgdGhlIHdvcmtzcGFjZSBpbnN0ZWFkIG9mIHJlc29sdmluZyBhIHJlZ2lzdHJ5IGNvcHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlV29ya3NwYWNlUmFuZ2VzKGN1cnJlbnRDb250ZW50OiBzdHJpbmcsIG9yaWdpbmFsQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29ya3NwYWNlRGVwZW5kZW5jaWVzID0gY29sbGVjdFdvcmtzcGFjZURlcGVuZGVuY2llcyhvcmlnaW5hbENvbnRlbnQpO1xuICAvLyBSZXN0b3JlIHBlciAoc2VjdGlvbiwgbmFtZSk6IGEgc2FtZS1uYW1lZCBkZXBlbmRlbmN5IGluIGFub3RoZXIgc2VjdGlvbiBtYXkgbGVnaXRpbWF0ZWx5XG4gIC8vIGhvbGQgYSBub24td29ya3NwYWNlIHJhbmdlIChlLmcuIGEgcGVlckRlcGVuZGVuY2llcyBgPj0xLjAuMGAgbmV4dCB0byBhIGRldkRlcGVuZGVuY2llc1xuICAvLyBgd29ya3NwYWNlOipgKSBvciBhIGRpZmZlcmVudCB3b3Jrc3BhY2UgcmFuZ2UsIGFuZCBtdXN0IGtlZXAgaXRzIG93biB2YWx1ZS5cbiAgcmV0dXJuIHJlcGxhY2VJbkRlcGVuZGVuY3lTZWN0aW9ucyhjdXJyZW50Q29udGVudCwgKHNlY3Rpb24sIHNlY3Rpb25LZXkpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gc2VjdGlvbjtcbiAgICBmb3IgKGNvbnN0IHsgc2VjdGlvbjogZGVwZW5kZW5jeVNlY3Rpb24sIG5hbWUsIHNwZWNpZmllciB9IG9mIHdvcmtzcGFjZURlcGVuZGVuY2llcykge1xuICAgICAgaWYgKGRlcGVuZGVuY3lTZWN0aW9uICE9PSBzZWN0aW9uS2V5KSBjb250aW51ZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlQWxsKFxuICAgICAgICBuZXcgUmVnRXhwKGAoXCIke2VzY2FwZVJlZ0V4cChuYW1lKX1cIlxcXFxzKjpcXFxccyopXCJbXlwiXSpcImAsICdndScpLFxuICAgICAgICAvLyBBIHJlcGxhY2VyIGZ1bmN0aW9uLCBub3QgYSByZXBsYWNlbWVudCBzdHJpbmc6IHNwZWNpZmllcnMgY29udGFpbmluZyBgJGAgbXVzdCBiZVxuICAgICAgICAvLyBpbnNlcnRlZCBsaXRlcmFsbHkgaW5zdGVhZCBvZiBiZWluZyBpbnRlcnByZXRlZCBhcyBzdWJzdGl0dXRpb24gcGF0dGVybnMuXG4gICAgICAgIChfbWF0Y2gsIHByZWZpeDogc3RyaW5nKSA9PiBgJHtwcmVmaXh9JHtKU09OLnN0cmluZ2lmeShzcGVjaWZpZXIpfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG4vKiogRGVwZW5kZW5jeSBzZWN0aW9ucyBjb250YWluIG9ubHkgYFwibmFtZVwiOiBcInNwZWNpZmllclwiYCBzdHJpbmcgcGFpcnMsIHNvIGBbXnt9XSpgIHNwYW5zIHRoZW0uICovXG5mdW5jdGlvbiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgcmVwbGFjZVNlY3Rpb246IChzZWN0aW9uOiBzdHJpbmcsIHNlY3Rpb25LZXk6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKFxuICAgIC8oXCIoZGVwZW5kZW5jaWVzfGRldkRlcGVuZGVuY2llc3xvcHRpb25hbERlcGVuZGVuY2llc3xwZWVyRGVwZW5kZW5jaWVzKVwiXFxzKjpcXHMqXFx7KShbXnt9XSopKFxcfSkvZ3UsXG4gICAgKF9tYXRjaCwgcHJlZml4OiBzdHJpbmcsIHNlY3Rpb25LZXk6IHN0cmluZywgYm9keTogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykgPT5cbiAgICAgIGAke3ByZWZpeH0ke3JlcGxhY2VTZWN0aW9uKGJvZHksIHNlY3Rpb25LZXkpfSR7c3VmZml4fWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFdvcmtzcGFjZURlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25Db250ZW50OiBzdHJpbmdcbik6IHsgc2VjdGlvbjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNwZWNpZmllcjogc3RyaW5nIH1bXSB7XG4gIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb247XG4gIHRyeSB7XG4gICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudCkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmNpZXM6IHsgc2VjdGlvbjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNwZWNpZmllcjogc3RyaW5nIH1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0KSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VKc29uW2tleV0gPz8ge30pKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goeyBzZWN0aW9uOiBrZXksIG5hbWUsIHNwZWNpZmllcjogdmFsdWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bJCgpKisuP1tcXFxcXFxdXnt8fV0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlbWFudGljUmVsZWFzZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBSZWxlYXNlQXJndiwgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgZm9yd2FyZGVkQXJncyA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXS5tYXAoU3RyaW5nKTtcbiAgLy8gVGhlIFBBQ0tBR0UgbmFtZSAoZm9yIGBidW54YC9geWFybiBkbHhgLCB3aGljaCBmZXRjaCBhIHBhY2thZ2UpIGFuZCB0aGUgQklOIG5hbWUgKGZvciB0aGVcbiAgLy8gbG9jYWwgbm9kZV9tb2R1bGVzLy5iaW4gbG9va3VwKSBkaWZmZXIgZm9yIHRoZSBzY29wZWQgZm9ya3M6IGBidW54IG11bHRpLXNlbWFudGljLXJlbGVhc2VgXG4gIC8vIHdvdWxkIGZldGNoIHRoZSB1bnJlbGF0ZWQgdW5zY29wZWQgbnBtIHBhY2thZ2UgaW5zdGVhZCBvZiBlLmcuIEBhbm9saWxhYidzIGZvcmsuXG4gIGNvbnN0IHJlbGVhc2VQYWNrYWdlTmFtZSA9IChcbiAgICBbJ0Bhbm9saWxhYi9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJywgJ211bHRpLXNlbWFudGljLXJlbGVhc2UnLCAnQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddIGFzIGNvbnN0XG4gICkuZmluZCgocGFja2FnZU5hbWUpID0+IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdKTtcbiAgY29uc3QgcmVsZWFzZUJpbiA9IHJlbGVhc2VQYWNrYWdlTmFtZSA/ICdtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJyA6ICdzZW1hbnRpYy1yZWxlYXNlJztcblxuICAvLyBUaGUgcHJvamVjdCBpcyBsb2FkZWQgd2l0aCBsb2FkRW52OiBmYWxzZSAoc2VtYW50aWMtcmVsZWFzZSBydW5zIHdpdGggdGhlIGFtYmllbnQvQ0lcbiAgLy8gZW52aXJvbm1lbnQgYnkgZGVzaWduKSwgc28gcHJvamVjdC5lbnYgYWxpYXNlcyBwcm9jZXNzLmVudiBoZXJlOyB1c2luZyBpdCBrZWVwcyB0aGVcbiAgLy8gcHJvamVjdC5lbnYgY29udmVudGlvbiBhbmQgcGlja3MgdXAgZW52IGxvYWRpbmcgaWYgdGhhdCBkZXNpZ24gZXZlciBjaGFuZ2VzLlxuICBjb25zdCBlbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChwcm9qZWN0LmRpclBhdGgsIGVudik7XG4gIGNvbnN0IGhhc0xvY2FsQmluID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nLCByZWxlYXNlQmluKSk7XG4gIGNvbnN0IGZhbGxiYWNrUGFja2FnZU5hbWUgPSByZWxlYXNlUGFja2FnZU5hbWUgPz8gJ3NlbWFudGljLXJlbGVhc2UnO1xuICBjb25zdCBjb21tYW5kID0gaGFzTG9jYWxCaW5cbiAgICA/IFtyZWxlYXNlQmluLCAuLi5mb3J3YXJkZWRBcmdzXVxuICAgIDogcHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmQgPT09ICdidW4nXG4gICAgICA/IFsnYnVueCcsIGZhbGxiYWNrUGFja2FnZU5hbWUsIC4uLmZvcndhcmRlZEFyZ3NdXG4gICAgICA6IFsneWFybicsICdkbHgnLCBmYWxsYmFja1BhY2thZ2VOYW1lLCAuLi5mb3J3YXJkZWRBcmdzXTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFJ1bm5pbmc6ICR7Y29tbWFuZC5qb2luKCcgJyl9YCkpO1xuICBpZiAoYXJndi5kcnlSdW4pIHJldHVybiAwO1xuXG4gIHJldHVybiBhd2FpdCBzcGF3bkFuZFdhaXQoYWN0aXZlQ2hpbGQsIGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52LFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIG9uU2lnbmFsOiAoc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiAoZC5uYW1lID09PSAnbWlzZS50b21sJyB8fCBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ21pc2UgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICAvLyBgbWlzZSB3aGljaCBweXRob25gIHJlc29sdmVzIHRoZSBwcm9qZWN0J3MgQUNUSVZFIGludGVycHJldGVyIHRvIGEgc2luZ2xlIGFic29sdXRlIHBhdGgsXG4gICAgICAvLyB1bmxpa2UgYG1pc2UgY3VycmVudCBweXRob25gLCB3aGljaCBwcmludHMgZXZlcnkgY29uZmlndXJlZCB2ZXJzaW9uIChtaXNlIHN1cHBvcnRzXG4gICAgICAvLyBtdWx0aS12ZXJzaW9uIHBpbnMpIGFuZCB3b3VsZCBwYXNzIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRvIGBwb2V0cnkgZW52IHVzZWAuXG4gICAgICBsZXQgcHl0aG9uUGF0aCA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHl0aG9uUGF0aCA9IGNoaWxkX3Byb2Nlc3NcbiAgICAgICAgICAuZXhlY1N5bmMoJ21pc2Ugd2hpY2ggcHl0aG9uJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10gfSlcbiAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbWlzZSBtaXNzaW5nIG9yIHB5dGhvbiB1bmNvbmZpZ3VyZWQ7IGxldCBwb2V0cnkgcGljayBpdHMgZGVmYXVsdCBpbnRlcnByZXRlci5cbiAgICAgIH1cbiAgICAgIGlmIChweXRob25QYXRoKSB7XG4gICAgICAgIC8vIFRoZSBjb21tYW5kIHJ1bnMgdGhyb3VnaCBhIHNoZWxsOyBQT1NJWCBzaW5nbGUgcXVvdGVzIGtlZXAgdGhlIHBhdGggb25lIGxpdGVyYWwgYXJndW1lbnRcbiAgICAgICAgLy8gZXZlbiB3aGVuIGEgcmVsb2NhdGVkIG1pc2UgZGF0YSBkaXIgcHV0cyBtZXRhY2hhcmFjdGVycyBpbnRvIGl0LlxuICAgICAgICBjb25zdCBxdW90ZWRQeXRob25QYXRoID0gYCcke3B5dGhvblBhdGgucmVwbGFjZUFsbChcIidcIiwgU3RyaW5nLnJhd2AnXFwnJ2ApfSdgO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3F1b3RlZFB5dGhvblBhdGh9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgJy0tJz86IHN0cmluZ1tdO1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbiAgc2lsZW50PzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7ICctLSc/OiBzdHJpbmdbXSB9XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZXZOdWxsKGFyZ3Y6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKGFyZ3YgYXMgeyBzaWxlbnQ6IGJvb2xlYW4gfSkuc2lsZW50ID8gYCA+IC9kZXYvbnVsbGAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZEltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICdZQVJOIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IG1pc2VBZ2VLZXlTZWNyZXRPcHRpb24gPSBwcm9qZWN0LmVudi5NSVNFX0FHRV9LRVlcbiAgICAgID8gJ1xcbiAgICAgICAgLS1zZWNyZXQgaWQ9bWlzZV9hZ2Vfa2V5LGVudj1NSVNFX0FHRV9LRVknXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIHg4Nl82NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0ke21pc2VBZ2VLZXlTZWNyZXRPcHRpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICBjb25zdCBtaXNlQWdlS2V5RW52T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZID8gJy0tZW52IE1JU0VfQUdFX0tFWSAnIDogJyc7XG4gICAgcmV0dXJuIGBkb2NrZXIgcnVuIC0tcm0gJHthbGxvY2F0ZVR0eSA/ICctaXQgJyA6ICcnfSR7bWlzZUFnZUtleUVudk9wdGlvbn0tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZG9ja2VyIHJtIC1mICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ID4gL2Rldi9udWxsIDI+JjEgfHwgdHJ1ZWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQge1xuICBmaW5kRDFNaWdyYXRpb25zRGlyUGF0aCxcbiAgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxuICB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXN0b21TdGFydFNjcmlwdFBhdGggPSBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0KTtcbiAgICBpZiAoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSB7XG4gICAgICBjb25zdCBzdGFydENvbW1hbmQgPVxuICAgICAgICBgJHtidWlsZFNoZWxsQ29tbWFuZChbJ2Jhc2gnLCBjdXN0b21TdGFydFNjcmlwdFBhdGhdKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAgIC8vIEEgc3RhcnQgc2NyaXB0IGZvdW5kIGF0IHRoZSBtb25vcmVwbyByb290IChjZi4gUHJvamVjdC5maW5kRmlsZSkgaXMgd3JpdHRlbiB0byBydW4gZnJvbVxuICAgICAgLy8gdGhlIHJvb3QsIGxpa2UgRG9ja2VyJ3MgV09SS0RJUiwgc28gaXRzIGN3ZCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBzY3JpcHRzLy5cbiAgICAgIGNvbnN0IHNjcmlwdFJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShjdXN0b21TdGFydFNjcmlwdFBhdGgpKTtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgc2NyaXB0Um9vdERpclBhdGggPT09IHByb2plY3QuZGlyUGF0aFxuICAgICAgICAgID8gc3RhcnRDb21tYW5kXG4gICAgICAgICAgOiBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIHNjcmlwdFJvb3REaXJQYXRoXSl9ICYmICR7c3RhcnRDb21tYW5kfSlgLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZWNvc3lzdGVtQ29uZmlnUGF0aCA9IGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gZWNvc3lzdGVtQ29uZmlnUGF0aFxuICAgICAgPyBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXVxuICAgICAgOiB0aGlzLmJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBjb21tYW5kcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAvLyBUZXN0LWVudmlyb25tZW50IHdyYW5nbGVyIHN0YXRlIGlzIGRpc3Bvc2FibGU7IHdpcGUgaXQgZW50aXJlbHkgKG5vdCBqdXN0IEQxKSBiZWZvcmVcbiAgICAvLyBtaWdyYXRpbmcsIHNpbmNlIHN0YWxlIEtWIGNhY2hlIGVudHJpZXMgb3IgRHVyYWJsZSBPYmplY3Qgc3RvcmFnZSBjYW4gYnJlYWsgZTJlIHRlc3RzLlxuICAgIGNvbnN0IHdyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMgPVxuICAgICAgaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpXG4gICAgICAgID8gW2BybSAtUmYgXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImBdXG4gICAgICAgIDogW107XG4gICAgLy8gQSBwcm9qZWN0IHdob3NlIEQxIGJpbmRpbmdzIGNhcnJ5IHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGFwcGxpZXMgdGhlbSB3aXRoIHdyYW5nbGVyXG4gICAgLy8gKHNlZSBXb3JrZXJzU2NyaXB0cyAvIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKS4gUnVubmluZyBkcml6emxlLWtpdCBtaWdyYXRlIGFnYWluc3RcbiAgICAvLyB0aGUgc2FtZSBsb2NhbCBEMSB3b3VsZCBhcHBseSB0aGUgc2FtZSBTUUwgdHdpY2Ug4oCUIGRyaXp6bGUncyBnZW5lcmF0ZWQgc3RhdGVtZW50cyBhcmUgbm90XG4gICAgLy8gaWRlbXBvdGVudCAoYENSRUFURSBJTkRFWGAgd2l0aG91dCBJRiBOT1QgRVhJU1RTKSDigJQgc28gZHJpenpsZSBzdGF5cyBPUk0tb25seSB0aGVyZS5cbiAgICBjb25zdCBtaWdyYXRlc0QxV2l0aFdyYW5nbGVyID0gISFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kcyA9IFtcbiAgICAgIC4uLndyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMsXG4gICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc0RyaXp6bGUgJiYgIW1pZ3JhdGVzRDFXaXRoV3JhbmdsZXJcbiAgICAgICAgPyBbd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdCwgZHJpenpsZVNjcmlwdHMubWlncmF0ZUZvclN0YXJ0KHByb2plY3QpKV1cbiAgICAgICAgOiBbXSksXG4gICAgXTtcbiAgICAvLyBTcGxpdHRpbmcgbWF5IGN1dCB0aHJvdWdoIGEgYChjZCDigKYgJiYg4oCmKWAgc3Vic2hlbGwsIGJ1dCByZWpvaW5pbmcgd2l0aCAnICYmICcgYW5kIHBlci1waWVjZVxuICAgIC8vIHJlZGlyZWN0cyBrZWVwcyB0aGUgc2NyaXB0IHZhbGlkLCBhbmQgd2ItZ2VuZXJhdGVkIHBhdGhzIG5ldmVyIGNvbnRhaW4gJyYmJy5cbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLmZsYXRNYXAoKGNtZCkgPT4gY21kLnNwbGl0KCcmJicpKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MuXG4gICAgcmV0dXJuIGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ05PREVfRU5WJywgJycpfSAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBcHAocHJvamVjdCksXG4gICAgXSl9YDtcbiAgfVxuXG4gIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSB0aGlzLmJ1aWxkUGxheXdyaWdodE9ubHlDb21tYW5kKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gcGxheXdyaWdodENvbW1hbmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA2MDAwMDAgLWkgMjAwMCcpfVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfWAsXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogSnVzdCBydW5zIFBsYXl3cmlnaHQgKHBsdXMgdGhlIG9wdGlvbmFsIGB0ZXN0L2UyZS1hZGRpdGlvbmFsYCBzY3JpcHQpLCB3aXRob3V0IGxhdW5jaGluZyB0aGUgYXBwLlxuICAgKiBVc2Ugd2hlbiBQbGF5d3JpZ2h0J3Mgb3duIGB3ZWJTZXJ2ZXJgIGNvbmZpZyBidWlsZHMgYW5kIHN0YXJ0cyB0aGUgYXBwIHVuZGVyIHRlc3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gW10sIHBsYXl3cmlnaHRBcmdzID0gWyd0ZXN0JywgJ3Rlc3QvZTJlLyddIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIHJldHVybiBgJHtidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMsIGFyZ3YuYmFpbCwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpfSR7c3VmZml4fWA7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICdydW4nLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDUwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDEwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCAtaSAyMDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMjAwMDAgLWkgNDAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwIC1pIDUwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA5MDAwMCAtaSAxMDAwMCcpfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3RcbiAgICApfSB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQpfSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB3YWl0LW9uIGJvb3QgY2hlY2sgcG9sbGluZyBgaHR0cC1nZXQ6Ly9sb2NhbGhvc3Q6PHBvcnQ+YC4gYGxvY2FsaG9zdGAgKG5vdCBgMTI3LjAuMC4xYClcbiAqIGxldHMgTm9kZSdzIEhhcHB5IEV5ZWJhbGxzIHRyeSBib3RoIGFkZHJlc3MgZmFtaWxpZXM6IG9uIG1hY09TLCBkZXYgc2VydmVycyB3aXRob3V0IGFuIGV4cGxpY2l0XG4gKiBob3N0IChlLmcuIHZpbmV4dC9WaXRlKSBjYW4gYmluZCBJUHY2LW9ubHkgKGA6OjFgKSwgc28gYW4gSVB2NC1vbmx5IHBvbGwgd291bGQgaGFuZyB1bnRpbCB0aW1lb3V0XG4gKiBldmVuIHRob3VnaCB0aGUgc2VydmVyIGlzIHVwLiBUaGUgYE5PX1BST1hZYC9gbm9fcHJveHlgIHByZWZpeCBrZWVwcyB0aGUgbG9vcGJhY2sgcG9sbCBvZmYgSFRUUFxuICogcHJveGllczogd2FpdC1vbidzIGF4aW9zIGFwcGxpZXMgYEhUVFAoUylfUFJPWFlgIGVudiB2YXJzIHVubGVzcyBgTk9fUFJPWFlgIG1hdGNoZXMgdGhlIHBvbGxlZFxuICogaG9zdCwgYW5kIGV4aXN0aW5nIGBOT19QUk9YWWAgY29udmVudGlvbnMgbWF5IGxpc3QgYDEyNy4wLjAuMWAgd2l0aG91dCBgbG9jYWxob3N0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgd2FpdE9uQXJncz86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgTk9fUFJPWFk9bG9jYWxob3N0IG5vX3Byb3h5PWxvY2FsaG9zdCB3YWl0LW9uICR7d2FpdE9uQXJncyA/IGAke3dhaXRPbkFyZ3N9IGAgOiAnJ31odHRwLWdldDovL2xvY2FsaG9zdDoke3BvcnR9YDtcbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ3NjcmlwdHMvc3RhcnQtcHJvZHVjdGlvbi5zaCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKFxuICBwbGF5d3JpZ2h0QXJnczogc3RyaW5nW10sXG4gIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sXG4gIGJhaWw/OiBib29sZWFuLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IFsnQlVOJywgJ3BsYXl3cmlnaHQnXTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgaWYgKHBsYXl3cmlnaHRBcmdzWzBdICE9PSAndGVzdCcgfHwgIW5vcm1hbGl6ZWRUYXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oWy4uLmJhc2UsIC4uLnBsYXl3cmlnaHRBcmdzLCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sIGJhaWwpO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKDEpO1xuICBjb25zdCBleHBsaWNpdFRhcmdldEluZGV4ZXMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhyZXN0KTtcbiAgY29uc3QgcmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCA9XG4gICAgZXhwbGljaXRUYXJnZXRJbmRleGVzLmxlbmd0aCA9PT0gMCA/IHJlc3QgOiByZXN0LmZpbHRlcigoXywgaW5kZXgpID0+ICFleHBsaWNpdFRhcmdldEluZGV4ZXMuaW5jbHVkZXMoaW5kZXgpKTtcbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFxuICAgIFsuLi5iYXNlLCAndGVzdCcsIC4uLm5vcm1hbGl6ZWRUYXJnZXRzLCAuLi5yZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0LCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sXG4gICAgYmFpbFxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoYXJnczogc3RyaW5nW10pOiBudW1iZXJbXSB7XG4gIGxldCBwZW5kaW5nVmFsdWVNb2RlOiAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgYXJnXSBvZiBhcmdzLmVudHJpZXMoKSkge1xuICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlKSB7XG4gICAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSA9PT0gJ3JlcXVpcmVkJyB8fCAhYXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgcmV0dXJuIFsuLi50YXJnZXRJbmRleGVzLCAuLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkubWFwKChfLCBvZmZzZXQpID0+IGluZGV4ICsgMSArIG9mZnNldCldO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIGlmIChhcmcuaW5jbHVkZXMoJz0nKSkgY29udGludWU7XG4gICAgICBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9IGVsc2UgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAnb3B0aW9uYWwnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICBjb25zdCBzaG9ydE9wdGlvbiA9IGFyZy5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID09PSAyICYmIFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhzaG9ydE9wdGlvbikpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRJbmRleGVzO1xufVxuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1icm93c2VyJyxcbiAgJy0tY29uZmlnJyxcbiAgJy0tZ3JlcCcsXG4gICctLWdyZXAtaW52ZXJ0JyxcbiAgJy0tZ2xvYmFsLXRpbWVvdXQnLFxuICAnLS1tYXgtZmFpbHVyZXMnLFxuICAnLS1vdXRwdXQnLFxuICAnLS1wcm9qZWN0JyxcbiAgJy0tcmVwZWF0LWVhY2gnLFxuICAnLS1yZXBvcnRlcicsXG4gICctLXJldHJpZXMnLFxuICAnLS1zaGFyZCcsXG4gICctLXRlc3QtbGlzdCcsXG4gICctLXRlc3QtbGlzdC1pbnZlcnQnLFxuICAnLS10aW1lb3V0JyxcbiAgJy0tdHJhY2UnLFxuICAnLS10c2NvbmZpZycsXG4gICctLXVpLWhvc3QnLFxuICAnLS11aS1wb3J0JyxcbiAgJy0tdWktdGl0bGUnLFxuICAnLS13b3JrZXJzJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1vbmx5LWNoYW5nZWQnLFxuICAnLS11cGRhdGUtc25hcHNob3RzJyxcbiAgJy0tdXBkYXRlLXNvdXJjZS1tZXRob2QnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbJy1jJywgJy1nJywgJy1qJ10pO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMsIGJ1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kLCB0eXBlIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBjbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXTtcbiAgICBjb25zdCB0ZXN0Q29tbWFuZCA9IHRoaXMudGVzdFVuaXQocHJvamVjdCwgeyAuLi5hcmd2LCB0YXJnZXRzOiBub3JtYWxpemVkVGFyZ2V0cyB9KTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwMCAtaSAyMDAwJyl9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBZQVJOIG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgU0VSVkVSX0xPR19GSUxFID0gJ3NlcnZlci5sb2cnO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBTRVJWRVJfTE9HX0ZJTEUgfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVXaXRoUGxheXdyaWdodE1hbmFnZWRTZXJ2ZXIocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFV2l0aFBsYXl3cmlnaHRNYW5hZ2VkU2VydmVyKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVEb2NrZXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGxpYnJhcnkgaGFzIG5vIHNlcnZlciBvZiBpdHMgb3duLCBidXQgaXQgbWF5IHNoaXAgYSBzZWxmLWNvbnRhaW5lZCBQbGF5d3JpZ2h0IGZpeHR1cmUgd2hvc2VcbiAgICogY29uZmlnIGJ1aWxkcyBhbmQgc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdCB2aWEgYSBgd2ViU2VydmVyYCBibG9jayAoZS5nLiBhIE5leHQuanMgZml4dHVyZSB0aGF0XG4gICAqIHZlcmlmaWVzIHRoZSBwdWJsaXNoZWQgcGFja2FnZSBpbXBvcnRzIGNsZWFubHkpLiBSdW4gUGxheXdyaWdodCBkaXJlY3RseSBpbiB0aGF0IGNhc2Ug4oCUIGluY2x1ZGluZ1xuICAgKiBvbiBDSSwgd2hlcmUgUGxheXdyaWdodCdzIG93biBgd2ViU2VydmVyYCBzdGFydHMgdGhlIGZpeHR1cmUg4oCUIG90aGVyd2lzZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgdGVzdEUyRVdpdGhQbGF5d3JpZ2h0TWFuYWdlZFNlcnZlcihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIHByb2plY3QuaGFzUGxheXdyaWdodFdlYlNlcnZlckNvbmZpZ1xuICAgICAgICA/IHRoaXMuYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQocHJvamVjdCwgYXJndiwgb3B0aW9ucylcbiAgICAgICAgOiBgZWNobyAnZG8gbm90aGluZy4nYFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHZpbmV4dCAoTmV4dC5qcyBvbiBWaXRlKSBhcHBzIHRhcmdldGluZyBDbG91ZGZsYXJlIFdvcmtlcnMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpbmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICAvLyBVbmxpa2UgYG5leHQgZGV2YCwgVml0ZS1iYXNlZCB2aW5leHQgZG9lcyBub3QgcmVhZCB0aGUgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICBjb25zdCBkZXZDb21tYW5kID0gYFlBUk4gdmluZXh0IGRldiAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICAgIC8vIFRoZSBDbG91ZGZsYXJlIHZpdGUgcGx1Z2luIChtaW5pZmxhcmUpIHJlYWRzIHJ1bnRpbWUgdmFycyBvbmx5IGZyb20gYSAuZGV2LnZhcnMgZmlsZSxcbiAgICAvLyBzbyBpdCBtdXN0IGJlIHJlZ2VuZXJhdGVkIGZyb20gdGhlIHdiLW1hbmFnZWQgLmVudiBmaWxlcyBiZWZvcmUgc2VydmluZy5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICcuZGV2LnZhcnMnKV07XG4gICAgLy8gYHZpbmV4dCBkZXZgIChtaW5pZmxhcmUpIHN0YXJ0cyB3aXRoIGFuIGVtcHR5IGxvY2FsIEQxIGFuZCBhcHBsaWVzIG5vIG1pZ3JhdGlvbnMgaXRzZWxmO1xuICAgIC8vIHRoZSB0ZXN0IGVudmlyb25tZW50IHdpcGVzIGl0cyBzdGF0ZSBkaXJlY3RvcnksIHNvIGV2ZXJ5IHBhZ2Ugd291bGQgNTAwIHdpdGhvdXQgdGhpcy5cbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kID0gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSA/IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtaWdyYXRpb25Db21tYW5kKSBjb21tYW5kcy5wdXNoKG1pZ3JhdGlvbkNvbW1hbmQpO1xuICAgIHJldHVybiBbLi4uY29tbWFuZHMsIGRldkNvbW1hbmRdLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICAvLyBTZXJ2aW5nIHRoZSBidWlsdCB3b3JrZXIgc3RhcnRzIGZyb20gYW4gZW1wdHkgKG9yIHdpcGVkKSBsb2NhbCBEMSwgc28gd3JhbmdsZXItbmF0aXZlXG4gICAgLy8gbWlncmF0aW9ucyAoaWYgYW55KSBtdXN0IGJlIGFwcGxpZWQgZmlyc3Q7IGRyaXp6bGUvcHJpc21hIG1pZ3JhdGlvbnMgYXJlIGhhbmRsZWQgYnlcbiAgICAvLyBidWlsZFByb2R1Y3Rpb25Db21tYW5kLlxuICAgIGNvbnN0IGQxTWlncmF0aW9uc0NvbW1hbmQgPSBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KTtcbiAgICAvLyBgdmluZXh0IGJ1aWxkYCBlbWl0cyBhIHdvcmtlciBidW5kbGUgYW5kIGl0cyB3cmFuZ2xlciBjb25maWcgdW5kZXIgZGlzdC9zZXJ2ZXIsIHNvIHRoZVxuICAgIC8vIC5kZXYudmFycyBmaWxlIGV4cG9zaW5nIHdiLW1hbmFnZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3QgYmUgZ2VuZXJhdGVkIGFmdGVyIGJ1aWxkaW5nLlxuICAgIC8vIGAtLWxvY2FsLXVwc3RyZWFtYCBrZWVwcyByZXF1ZXN0IFVSTHMgb24gdGhlIGxvY2FsIGhvc3Q7IG90aGVyd2lzZSwgd3JhbmdsZXIgZGV2IHNpbXVsYXRlc1xuICAgIC8vIHRoZSBwcm9kdWN0aW9uIGN1c3RvbSBkb21haW4gZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyByb3V0ZXMuXG4gICAgcmV0dXJuIFtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnZGlzdC9zZXJ2ZXIvLmRldi52YXJzJyksXG4gICAgICAuLi4oZDFNaWdyYXRpb25zQ29tbWFuZCA/IFtkMU1pZ3JhdGlvbnNDb21tYW5kXSA6IFtdKSxcbiAgICAgIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKFxuICAgICAgICBgZGV2IC0tY29uZmlnIGRpc3Qvc2VydmVyL3dyYW5nbGVyLmpzb24gLS1pcCAxMjcuMC4wLjEgLS1wb3J0ICR7cG9ydH0gLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1sb2NhbC11cHN0cmVhbSBsb2NhbGhvc3Q6JHtwb3J0fSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXG4gICAgICApLFxuICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpbmV4dFNjcmlwdHMgPSBuZXcgVmluZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFZpdGUtYmFzZWQgYXBwcyB3aXRoIFBsYXl3cmlnaHQgZTJlIHRlc3RzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaXRlU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIHZpdGUgZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgWUFSTiB2aXRlIHByZXZpZXcgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgdml0ZVNjcmlwdHMgPSBuZXcgVml0ZVNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQsXG4gIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQsXG4gIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kLFxuICBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIsXG59IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBIdHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgcGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcHMgKGRldGVjdGVkIHZpYSBhIHdyYW5nbGVyXG4gKiBjb25maWcgZmlsZSB3aGVuIG5vIG90aGVyIGZyYW1ld29yayBtYXRjaGVzOyB2aW5leHQgYXBwcyBoYXZlIHRoZWlyIG93biBzY3JpcHRzKS5cbiAqIEV4dGVuZHMgSHR0cFNlcnZlclNjcmlwdHMgc28gdGhhdCBlMmUgdGVzdHMgcnVuIHZpYSB0aGUgdW5pdC10ZXN0IHJ1bm5lciBhZ2FpbnN0IHRoZSBydW5uaW5nXG4gKiB3b3JrZXIgd2hlbiB0aGUgcHJvamVjdCBoYXMgbm8gUGxheXdyaWdodCBjb25maWcuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFdvcmtlcnNTY3JpcHRzIGV4dGVuZHMgSHR0cFNlcnZlclNjcmlwdHMge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3QsIGFyZ3YpLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIC8vIHdyYW5nbGVyIGRldiBidW5kbGVzIHRoZSB3b3JrZXIgaXRzZWxmLCBzbyBubyBzZXBhcmF0ZSBidWlsZCBzdGVwIGlzIG5lZWRlZC5cbiAgICByZXR1cm4gdGhpcy5idWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICc4Nzg3JztcbiAgICBjb25zdCBzdGF0ZURpciA9IGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KTtcblxuICAgIC8vIFRoZXNlIGhlbHBlcnMgcmVhZCB0aGUgZGVmYXVsdC1uYW1lZCB3cmFuZ2xlciBjb25maWc7IHRoYXQgaXMgc2FmZSBiZWNhdXNlIHdvcmtlcnNTY3JpcHRzXG4gICAgLy8gaXRzZWxmIGlzIG9ubHkgc2VsZWN0ZWQgd2hlbiBzdWNoIGEgY29uZmlnIGZpbGUgZXhpc3RzIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICcuZGV2LnZhcnMnKV07XG4gICAgLy8gQXBwbHkgd3JhbmdsZXItbmF0aXZlIEQxIG1pZ3JhdGlvbnMgKGlmIGFueSkgc28gdGhlIGxvY2FsIGRhdGFiYXNlIG1hdGNoZXMgdGhlIGRlcGxveWVkIG9uZS5cbiAgICBjb25zdCBkMU1pZ3JhdGlvbnNDb21tYW5kID0gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKGQxTWlncmF0aW9uc0NvbW1hbmQpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goZDFNaWdyYXRpb25zQ29tbWFuZCk7XG4gICAgfVxuICAgIGNvbW1hbmRzLnB1c2goXG4gICAgICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChcbiAgICAgICAgYGRldiAtLWlwIDEyNy4wLjAuMSAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAtLXBlcnNpc3QtdG8gXCIke3N0YXRlRGlyfVwiICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBjb21tYW5kcztcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd29ya2Vyc1NjcmlwdHMgPSBuZXcgV29ya2Vyc1NjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnLCAnaG9ubyddO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiU3RhcnQgYXBwLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGFwcCBjb21tYW5kLiBFeGFtcGxlOiB3YiBzdGFydCAtLSAtLWhvc3QgMC4wLjAuMFwiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KS5vcHRpb25zKGJ1aWxkZXIpIGFzIEFyZ3Y8XG4gICAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuICAgID4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSB7XG4gICAgICAgIC8vIHZpbmV4dCBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIHRoaXMgY2hlY2sgbXVzdCBjb21lIGZpcnN0LlxuICAgICAgICBzY3JpcHRzID0gdmluZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkge1xuICAgICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICAgIHNjcmlwdHMgPSB3b3JrZXJzU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQgPSAyMDA7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPID0gMC4wNTtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246ICdIb3cgdG8gcnVuIEUyRSB0ZXN0cycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYmFpbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RvcCB0ZXN0cyBhZnRlciB0aGUgZmlyc3QgZmFpbHVyZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgYXJyYXk6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdVbml0IG9yIEUyRSB0ZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFRlc3RDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj47XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VGVzdENvbW1hbmRPcHRpb25zPiAmIHsgJy0tJz86IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdFJ1bk9wdGlvbnMge1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVGVzdENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgZmxhZ3MgdG8gUGxheXdyaWdodC4gRXhhbXBsZTogd2IgdGVzdCAtLSAtLWdyZXAgJ3VwbG9hZGVkIGltYWdlIGFzc2V0J1wiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pOiBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4gPT5cbiAgICB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpXG4gICAgICAucG9zaXRpb25hbCgndGFyZ2V0cycsIGFyZ3VtZW50c0J1aWxkZXIudGFyZ2V0cykgYXMgQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoYXJndjogVGVzdENvbW1hbmRBcmd2LCBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3YpO1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHModGVzdEFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKHRlc3RBcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IHRlc3RBcmd2WyctLSddID8/IFtdO1xuICBjb25zdCB7IHNob3VsZFJ1bkUyZSwgc2hvdWxkUnVuVW5pdCB9ID0gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKHRlc3RUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgZW52aXJvbm1lbnQgZWFnZXJseTogd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudiBmb3JjZXMgdGhlIHRlc3QgY2FzY2FkZSBhbmRcbiAgICAvLyBQcm9qZWN0LmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudiBmYWxscyBiYWNrIFdCX0VOViB0byB0aGF0IG1vZGUg4oCUIGJ1dCB0aGUgZW52IGdldHRlciBpc1xuICAgIC8vIGxhenksIHNvIGEgcHJvamVjdCB3aXRoIG5vIHJ1bm5hYmxlIHRlc3RzIHdvdWxkIG90aGVyd2lzZSBza2lwIHRoZSB2YWxpZGF0aW9uIGVudGlyZWx5LlxuICAgIHZvaWQgcHJvamVjdC5lbnY7XG5cbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy52aW5leHQgfHwgZGV2RGVwcy52aW5leHQpIHtcbiAgICAgIC8vIHZpbmV4dCBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIHRoaXMgY2hlY2sgbXVzdCBjb21lIGZpcnN0LlxuICAgICAgc2NyaXB0cyA9IHZpbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkge1xuICAgICAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICAgICAgc2NyaXB0cyA9IHdvcmtlcnNTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgY29uc3QgZGVmYXVsdFVuaXRUYXJnZXRzID0gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3QpO1xuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGRlZmF1bHRVbml0VGFyZ2V0cyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB0YXJnZXRzID1cbiAgICAgICAgdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogZGVmYXVsdFVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBkZWZhdWx0VW5pdFRhcmdldHMgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHMgfTtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVW5pdFRlc3RDb21tYW5kKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICAgICAgICB0aW1lb3V0OiB0ZXN0QXJndi51bml0VGltZW91dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgaWYgKHNob3VsZFJ1bkUyZSkgd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUocHJvamVjdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLm5leHQgfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgICAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vKipcbiAqIFdhcm4gd2hlbiBhIHByb2plY3QgaGFzIGEgUGxheXdyaWdodCBjb25maWcgYnV0IG5vIHRlc3QvZTJlIGRpcmVjdG9yeS5cbiAqIHdiIGRpc2NvdmVycyBlMmUgdGVzdHMgb25seSB1bmRlciB0ZXN0L2UyZS8sIHNvIHN1Y2ggcHJvamVjdHMgd291bGQgb3RoZXJ3aXNlIGhhdmUgdGhlaXJcbiAqIFBsYXl3cmlnaHQgc3BlY3Mgc2lsZW50bHkgc2tpcHBlZCBhbmQgYHdiIHRlc3RgIC8gYHdiIHZlcmlmeSAtLWZ1bGxgIHdvdWxkIHJlcG9ydCBzdWNjZXNzXG4gKiB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ25hbWUnIHwgJ3BhY2thZ2VKc29uJz5cbik6IHZvaWQge1xuICAvLyBDYWxsZXJzIGludm9rZSB0aGlzIG9ubHkgYWZ0ZXIgZXN0YWJsaXNoaW5nIHRoYXQgdGVzdC9lMmUgaXMgbWlzc2luZywgc28gaXQgaXMgbm90IHJlLWNoZWNrZWRcbiAgLy8gaGVyZS4gQSB3b3Jrc3BhY2Ugcm9vdCBkZWxlZ2F0ZXMgZTJlIHRvIGl0cyBwYWNrYWdlcywgc28gaXQgbmV2ZXIgd2FybnMgKGNoZWNrZWQgZmlyc3QgdG8gc2tpcFxuICAvLyB0aGUgZmlsZXN5c3RlbSBsb29rdXAgYmVsb3cpLiBPbmx5IGEgcHJvamVjdCdzIE9XTiBQbGF5d3JpZ2h0IGNvbmZpZyBjb3VudHM6IGBoYXNQbGF5d3JpZ2h0Q29uZmlnYFxuICAvLyB3YWxrcyB1cCB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc28gcmV1c2luZyBpdCB3b3VsZCBmYWxzZS1wb3NpdGl2ZSBvbiBsaWJyYXJ5IHBhY2thZ2VzIGFuZCB0aGVcbiAgLy8gcm9vdCBpdHNlbGYsIHdoaWNoIGxlZ2l0aW1hdGVseSBzaGFyZSBhIHJvb3QtbGV2ZWwgcGxheXdyaWdodC5jb25maWcudHMgYnV0IGtlZXAgZTJlIHNwZWNzIGluIGFcbiAgLy8gc2luZ2xlIGFwcCBwYWNrYWdlLlxuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSByZXR1cm47XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKSkpIHJldHVybjtcblxuICBjb25zb2xlLndhcm4oXG4gICAgY2hhbGsueWVsbG93KFxuICAgICAgYFNraXBwaW5nIGUyZSB0ZXN0cyBmb3IgJHtwcm9qZWN0Lm5hbWV9OiBhIFBsYXl3cmlnaHQgY29uZmlnIGV4aXN0cyBidXQgdGhlIHRlc3QvZTJlIGRpcmVjdG9yeSBpcyBtaXNzaW5nLiB3YiBvbmx5IGRpc2NvdmVycyBQbGF5d3JpZ2h0IHNwZWNzIHVuZGVyIHRlc3QvZTJlLywgc28gbW92ZSB0aGVtIHRoZXJlIHRvIHJ1biBlMmUgdGVzdHMuYFxuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndjogVGVzdENvbW1hbmRBcmd2KTogVGVzdENvbW1hbmRBcmd2IHtcbiAgaWYgKGFyZ3YuZW52Py5sZW5ndGggfHwgYXJndi5jYXNjYWRlRW52IHx8IGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiA9PT0gZmFsc2UpIHtcbiAgICAvLyBFeHBsaWNpdCBlbnYgZmxhZ3Mga2VlcCB0aGVpciBmaWxlLXNlbGVjdGlvbiBzZW1hbnRpY3MsIGJ1dCB0aGUgc3Bhd25lZCB0ZXN0cyBtdXN0IHN0aWxsXG4gICAgLy8gcnVuIGFzIGB0ZXN0YCB3aGVuIHRob3NlIGZpbGVzIGRlZmluZSBubyBXQl9FTlYgKHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKS5cbiAgICByZXR1cm4geyAuLi5hcmd2LCBjb21tYW5kRGVmYXVsdFdiRW52OiAndGVzdCcgfTtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSA/IFsndGVzdCcsICctLWV4Y2x1ZGUnLCAndGVzdC9lMmUvKionXSA6IFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aW5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHdvcmtlcnNTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vd29ya2Vyc1NjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUgfSBmcm9tICcuL3Rlc3QuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gU3Bhd25lZCBjb21tYW5kcyByZS1kZXJpdmUgdGhlaXIgZG90ZW52IGNhc2NhZGUgZnJvbSB0aGUgZXhwb3J0ZWQgV0JfRU5WLCBzbyBhbiB1bmV4cG9ydGVkXG4gIC8vIFdCX0VOViB3b3VsZCBsZXQgYSBjb21taXR0ZWQgYC5lbnZgIChlLmcuIFdCX0VOVj1kZXZlbG9wbWVudCkgc2VsZWN0IHRoZSBkZXZlbG9wbWVudFxuICAvLyBlbnZpcm9ubWVudCDigJQgcnVubmluZyB0aGUgZGVzdHJ1Y3RpdmUgZTJlIHN1aXRlIGFnYWluc3QgdGhlIGRldmVsb3BlcidzIG93biBkYXRhYmFzZS5cbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIHByb2plY3QuZW52LkNJIHx8PSAnMSc7XG4gICAgLy8gT3ZlcndyaXRlLCBub3QgfHw9OiBwcm9qZWN0LmVudiBhbHJlYWR5IGNhcnJpZXMgdGhlIGRvdGVudi1kZXJpdmVkIHZhbHVlLlxuICAgIHByb2plY3QuZW52LldCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLnZpbmV4dCB8fCBkZXZEZXBzLnZpbmV4dCkge1xuICAgICAgLy8gdmluZXh0IGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gdGhpcyBjaGVjayBtdXN0IGNvbWUgZmlyc3QuXG4gICAgICBzY3JpcHRzID0gdmluZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpKSB7XG4gICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICBzY3JpcHRzID0gd29ya2Vyc1NjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZShwcm9qZWN0KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFRyZWVLaWxsQ29tbWFuZEFyZ3Mge1xuICBwaWQ6IG51bWJlcjtcbiAgc2lnbmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSAoeWFyZ3M6IEFyZ3YpOiBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0+XG4gIHlhcmdzXG4gICAgLnBvc2l0aW9uYWwoJ3BpZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByb2Nlc3MgSUQgdG8ga2lsbC4nLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdzaWduYWwnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpZ25hbCB0byBzZW5kIHRvIHRoZSBwcm9jZXNzIHRyZWUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJ1NJR1RFUk0nLFxuICAgIH0pIGFzIEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz47XG5cbmV4cG9ydCBjb25zdCB0cmVlS2lsbENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8b2JqZWN0LCBUcmVlS2lsbENvbW1hbmRBcmdzPiA9IHtcbiAgY29tbWFuZDogJ3RyZWUta2lsbCA8cGlkPiBbc2lnbmFsXScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgYWxsIGRlc2NlbmRhbnRzJyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGFyZ3Yuc2lnbmFsIGFzIE5vZGVKUy5TaWduYWxzO1xuICAgICAgaWYgKCEoc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgIH1cbiAgICAgIHRyZWVLaWxsKGFyZ3YucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG5leHBvcnQgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHR5cGVDaGVjayhhcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZUNoZWNrKGFyZ3Y6IFR5cGVDaGVja0NvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKC4uLmJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpKTtcbiAgICB9XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdweXJpZ2h0JykpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgIH1cbiAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIHByZXNlcnZlQ29sb3I6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gIGZvciAoY29uc3QgZXhpdENvZGUgb2YgZXhpdENvZGVzKSB7XG4gICAgaWYgKGV4aXRDb2RlKSBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgYHR5cGVzY3JpcHRgIChgdHNjYCk7IHdiZnkgcmVtb3ZlcyB0aGVcbiAgLy8gYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgcHJldmlldyBmcm9tIG5vbi1OZXh0LmpzIHJlcG9zIChOZXh0LmpzLWZhbWlseVxuICAvLyByZXBvcyBrZWVwIGl0IGZvciBgbmV4dCBidWlsZGApLCBzbyByZXBvcyBzdGlsbCBvbiB0aGUgcHJldmlldyBzaG91bGQgcnVuIHdiZnlcbiAgLy8gaW5zdGVhZCBvZiByZWx5aW5nIG9uIGEgdHNnbyBmYWxsYmFjayBoZXJlLlxuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCd0eXBlc2NyaXB0JykpIHtcbiAgICByZXR1cm4gWydCVU4gdHNjIC0tbm9FbWl0J107XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzLCBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2LCB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52IH0gZnJvbSAnLi90ZXN0LmpzJztcbmltcG9ydCB7IHR5cGVDaGVjaywgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiB9IGZyb20gJy4vdHlwZWNoZWNrLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xudHlwZSBQYWNrYWdlQ29tbWFuZEFyZ3YgPSBQaWNrPFZlcmlmeUNvZGVDb21tYW5kQXJndiwgJ2RyeVJ1bicgfCAndmVyYm9zZSc+O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCAoYXJndi5mdWxsID8gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YpIDogdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2KTtcbiAgICBhd2FpdCBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGluc3RhbGxgLCBwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAnY2xlYW51cCcsXG4gICAgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBMaW50Q29tbWFuZEFyZ3YpLFxuICAgIHsgc2lsZW50OiB0cnVlIH1cbiAgKTtcbiAgLy8gVHlwZS1hd2FyZSBsaW50IHJlcG9ydHMgVHlwZVNjcmlwdCBkaWFnbm9zdGljcyBvbmx5IGZvciB0aGUgZmlsZXMgb3hsaW50IGFjdHVhbGx5IGxpbnRzLCBhbmRcbiAgLy8gdGhlIHNoYXJlZCBjb25maWcgaWdub3JlcyBkaXJlY3RvcmllcyB0c2Mgc3RpbGwgY29tcGlsZXMgKGUuZy4gYF9fZ2VuZXJhdGVkX19gLCBgQHR5cGVzYCxcbiAgLy8gYGRpc3RgKS4gS2VlcCB0aGUgdHlwZWNoZWNrIGNvbW1hbmQgc28gYHZlcmlmeWAgc3RheXMgZXF1aXZhbGVudCB0byBcInRoZSByZXBvc2l0b3J5IGNvbXBpbGVzXCIuXG4gIC8vIFRoZSBvdmVybGFwIHdpdGggbGludCBpcyBkZWxpYmVyYXRlOiBgLS10eXBlLWF3YXJlYCBhbHNvIHBvd2VycyB0eXBlLWF3YXJlIGxpbnQgcnVsZXMsIGFuZFxuICAvLyBkcm9wcGluZyBvbmx5IGAtLXR5cGUtY2hlY2tgIGZyb20gbGludCBzYXZlcyB+MC4xcywgZmFyIGxlc3MgdGhhbiB0aGUgY292ZXJhZ2UgaXQgd291bGQgY29zdC5cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAndHlwZWNoZWNrJyxcbiAgICAoKSA9PiB0eXBlQ2hlY2soeyAuLi5hcmd2LCBfOiBbJ3R5cGVjaGVjayddIH0gYXMgdW5rbm93biBhcyBUeXBlQ2hlY2tDb21tYW5kQXJndiksXG4gICAgeyBzaWxlbnQ6IHRydWUgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KHtcbiAgICAuLi5hcmd2LFxuICAgIF86IFsndGVzdCddLFxuICAgIGUyZTogJ2hlYWRsZXNzJyxcbiAgICBzaWxlbnQ6IHRydWUsXG4gIH0gYXMgdW5rbm93biBhcyBUZXN0Q29tbWFuZEFyZ3YpO1xuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSByZXR1cm47XG5cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGItcmVzZXQnXSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCAndGVzdCcpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKFxuICAgIGNoYWxrLnllbGxvdygnVGVzdHMgZmFpbGVkLiBUaGlzIHByb2plY3QgZGVmaW5lcyBcImRiLXJlc2V0XCIsIHNvIHdiIHdpbGwgcmVzZXQgdGhlIGRhdGFiYXNlIG9uY2UgYW5kIHJldHJ5IHRlc3RzLicpXG4gICk7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBkYi1yZXNldGAsIGZpbmRUZXN0UHJvamVjdChwcm9qZWN0LCB0ZXN0QXJndiksIHRlc3RBcmd2LCB7XG4gICAgcHJpbnRSYXdPdXRwdXQ6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IHJldHJ5RXhpdENvZGUgPSBhd2FpdCB0ZXN0KHRlc3RBcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gIGlmIChyZXRyeUV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke3JldHJ5RXhpdENvZGV9KTpgKSwgJ3Rlc3QgYWZ0ZXIgZGItcmVzZXQgcmV0cnknKSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldHJ5RXhpdENvZGUpO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignVGVzdHMgcGFzc2VkIGFmdGVyIGRiLXJlc2V0IHJldHJ5LicpKTtcbn1cblxuZnVuY3Rpb24gZmluZFRlc3RQcm9qZWN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFByb2plY3Qge1xuICBjb25zdCB0ZXN0UHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoIXRlc3RQcm9qZWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0IG5vdCBmb3VuZDogJHtwcm9qZWN0LmRpclBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHRlc3RQcm9qZWN0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5JblByb2Nlc3NDb21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBjb21tYW5kOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkpO1xuICB9XG4gIGNvbnN0IGV4aXRDb2RlID0gKGF3YWl0IGNvbW1hbmQoKSkgPz8gMDtcbiAgaWYgKGV4aXRDb2RlID09PSAwIHx8IG9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBjb21tYW5kTmFtZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFja2FnZUNvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHByaW50UmF3T3V0cHV0PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgcHJlc2VydmVDb2xvcjogZmFsc2UgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICghb3B0aW9ucy5wcmludFJhd091dHB1dCkge1xuICAgIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZCwgZXhpdENvZGUsIHJldC5zdGRvdXQpO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUHJpbnRzIHBhY2thZ2UgY29tbWFuZCBvdXRwdXQgZm9yIGB3YiB2ZXJpZnlgLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBzbyBzdWNjZXNzZnVsIG5vaXN5XG4gKiBjb21tYW5kcyBhcmUgc3VtbWFyaXplZCB3aGlsZSBmYWlsdXJlIG91dHB1dCByZW1haW5zIGF2YWlsYWJsZSBmb3IgZGlhZ25vc2lzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIFRoZSBleGVjdXRlZCBjb21tYW5kLlxuICogQHBhcmFtIGV4aXRDb2RlIFRoZSBjb21tYW5kIGV4aXQgY29kZS5cbiAqIEBwYXJhbSBvdXRwdXQgVGhlIG1lcmdlZCBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kOiBzdHJpbmcsIGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCAmJiAvXig/OmJ1bnx5YXJuKSAoPzppbnN0YWxsfGdlbi1jb2RlKSQvdS50ZXN0KGNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWRPdXRwdXQgPSBvdXRwdXQudHJpbSgpO1xuICBpZiAodHJpbW1lZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHRyaW1tZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdDogUHJvamVjdCk6IHtcbiAgZmFpbDogKGVycm9yPzogdW5rbm93bikgPT4gdm9pZDtcbiAgZmluaXNoOiAoKSA9PiB2b2lkO1xuICBzdWNjZWVkOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHdiRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcud2InKTtcbiAgZnMubWtkaXJTeW5jKHdiRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4od2JEaXJQYXRoLCAndmVyaWZ5LWZ1bGwubG9nJyk7XG4gIGNvbnN0IGxvZ0ZpbGUgPSBmcy5vcGVuU3luYyhsb2dGaWxlUGF0aCwgJ3cnKTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRvdXRXcml0ZSA9IHByb2Nlc3Muc3Rkb3V0LndyaXRlLmJpbmQocHJvY2Vzcy5zdGRvdXQpO1xuICBjb25zdCBvcmlnaW5hbFN0ZGVycldyaXRlID0gcHJvY2Vzcy5zdGRlcnIud3JpdGUuYmluZChwcm9jZXNzLnN0ZGVycik7XG4gIGxldCBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZG91dFdyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUob3JpZ2luYWxTdGRlcnJXcml0ZSwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihjaGFsay5ib2xkKCdGdWxsIGxvZzonKSwgbG9nRmlsZVBhdGgpKTtcblxuICBjb25zdCBmaW5pc2ggPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSBvcmlnaW5hbFN0ZG91dFdyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IG9yaWdpbmFsU3RkZXJyV3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuXG4gICAgY29uc3QgZWxhcHNlZFRpbWUgPSBmb3JtYXRFbGFwc2VkVGltZShEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBzdGF0dXMgPSBzdWNjZWVkZWQgPyAnU3VjY2VlZGVkJyA6ICdGYWlsZWQnO1xuICAgIGNvbnN0IHN1bW1hcnkgPSBgJHtzdGF0dXN9IGluICR7ZWxhcHNlZFRpbWV9LiBGdWxsIGxvZzogJHtsb2dGaWxlUGF0aH1cXG5gO1xuICAgIGNvbnN0IGNvbG9yZWRTdW1tYXJ5ID0gc3VjY2VlZGVkID8gY2hhbGsuZ3JlZW4oc3VtbWFyeSkgOiBjaGFsay5yZWQoc3VtbWFyeSk7XG4gICAgb3JpZ2luYWxTdGRvdXRXcml0ZShjb2xvcmVkU3VtbWFyeSk7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIHN1bW1hcnkpO1xuICAgIGZzLmNsb3NlU3luYyhsb2dGaWxlKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCBmaW5pc2gpO1xuXG4gIHJldHVybiB7XG4gICAgZmFpbDogKGVycm9yKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbmlzaDogKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignZXhpdCcsIGZpbmlzaCk7XG4gICAgICBmaW5pc2goKTtcbiAgICB9LFxuICAgIHN1Y2NlZWQ6ICgpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGVlV3JpdGUob3JpZ2luYWxXcml0ZTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlLCBsb2dGaWxlOiBudW1iZXIpOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUge1xuICByZXR1cm4gKChcbiAgICBjaHVuazogVWludDhBcnJheSB8IHN0cmluZyxcbiAgICBlbmNvZGluZ09yQ2FsbGJhY2s/OiBCdWZmZXJFbmNvZGluZyB8ICgoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpLFxuICAgIGNhbGxiYWNrPzogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkXG4gICkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9XG4gICAgICB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnXG4gICAgICAgID8gQnVmZmVyLmZyb20oY2h1bmssIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdzdHJpbmcnID8gZW5jb2RpbmdPckNhbGxiYWNrIDogJ3V0ZjgnKVxuICAgICAgICA6IGNodW5rO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBidWZmZXIpO1xuICAgIC8vIFdyaXRlIHRvIHRoZSB0ZXJtaW5hbCB2aWEgdGhlIG9yaWdpbmFsIHN0cmVhbSBtZXRob2Q6IGEgc3luY2hyb25vdXMgZnMud3JpdGVTeW5jIG9uIHRoZVxuICAgIC8vIHN0ZG91dC9zdGRlcnIgZmQgdGhyb3dzIEVBR0FJTiBvbiBDSSdzIG5vbi1ibG9ja2luZyBwaXBlcyB3aGVuIGxhcmdlIG91dHB1dCBmbHVzaGVzIGF0IG9uY2UsXG4gICAgLy8gd2hpbGUgdGhlIHN0cmVhbSBtZXRob2QgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBoYW5kbGVzIGJhY2twcmVzc3VyZS5cbiAgICByZXR1cm4gb3JpZ2luYWxXcml0ZShidWZmZXIsIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiBjYWxsYmFjayk7XG4gIH0pIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gYCR7cmVtYWluaW5nU2Vjb25kc31zYDtcbiAgfVxuICByZXR1cm4gYCR7bWludXRlc31tICR7cmVtYWluaW5nU2Vjb25kc31zYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBjb25jdXJyZW50bHlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jb25jdXJyZW50bHkuanMnO1xuaW1wb3J0IHsgZGVwbG95Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZGVwbG95LmpzJztcbmltcG9ydCB7IGRvdGVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2RvdGVudi5qcyc7XG5pbXBvcnQgeyBnZW5Db2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuQ29kZS5qcyc7XG5pbXBvcnQgeyBnZW5EZXZWYXJzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuRGV2VmFycy5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgbWFpbnRlbmFuY2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9tYWludGVuYW5jZS5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmFpbHdheUVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JhaWx3YXlFbnYuanMnO1xuaW1wb3J0IHsgcmVsZWFzZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JlbGVhc2UuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRyZWVLaWxsQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHJlZUtpbGwuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgdmVyaWZ5Q29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeUNvZGUuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52LlBBVEg/LmluY2x1ZGVzKCcvYnVuLW5vZGUtJykpIHtcbiAgICAgIC8vIE5vdCBmaXhlZCB1cCBoZXJlOiB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KSBtYXkgaGFuZyBvclxuICAgICAgLy8gY3Jhc2ggdW5kZXIgdGhlIHNoaW0sIGFuZCBzb21lICh3cmFuZ2xlciBkZXYpIGZhaWwgc2lsZW50bHksIHNvIHN1cmZhY2UgdGhlIGNhdXNlIHVwZnJvbnQuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiV2FybmluZzogUEFUSCBjb250YWlucyBhIGJ1bi1ub2RlIHNoaW0gKGZyb20gYGJ1biAtLWJ1bmAgb3IgYnVuZmlnJ3MgYHJ1bi5idW5gKTsgXCIgK1xuICAgICAgICAgICdydW4gd2Igd2l0aG91dCBgLS1idW5gIGFuZCByZW1vdmUgYFtydW5dIGJ1bmAgZnJvbSBidW5maWcudG9tbC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKHZlcmlmeUNvZGVDb21tYW5kKVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoY29uY3VycmVudGx5Q29tbWFuZClcbiAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgLmNvbW1hbmQoZG90ZW52Q29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuQ29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkRldlZhcnNDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQobWFpbnRlbmFuY2VDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmFpbHdheUVudkNvbW1hbmQpXG4gIC5jb21tYW5kKHJlbGVhc2VDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHRyZWVLaWxsQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxubGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG5cbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwcm9jZXNzLnBpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvY2Vzcy5waWR9KSBkdXJpbmcgc2h1dGRvd246YCwgZXJyb3IpO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoKTtcbiAgfSk7XG59XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzcsOCw5LDEwLDExXSwibWFwcGluZ3MiOiJ5ekJBZUEsU0FBZ0IsRUFBb0MsRUFBbUMsRUFBK0IsQ0FDcEgsT0FBTyxFQUNMLEVBQXVDLENBQVUsQ0FBQyxDQUFDLE9BQVEsR0FDekQsRUFBK0IsQ0FBZ0IsQ0FDakQsRUFDQSxDQUNGLENBQ0YsQ0E4QkEsU0FBZ0IsRUFBaUMsRUFBNkIsRUFBK0IsQ0FTM0csSUFBTSxFQUFxQixHQUE4QixDQU12RCxJQUFNLEVBQXNCLEVBQUcsaUJBQWlCLENBQU8sRUFDakQsRUFBYyxDQUFFLElBQUssRUFBYSxvQkFBcUIsR0FBTyxPQUFRLENBQUMsb0JBQW9CLENBQUUsRUFPN0YsRUFBZ0IsSUFBSSxJQUFJLEVBQUcsU0FBUyxFQUFLLE1BQU0sS0FBSyxFQUFTLGNBQWMsRUFBRyxDQUFXLENBQUMsRUFDaEcsR0FBSSxFQUFRLFNBQVMsR0FBRyxFQUN0QixJQUFL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QUFZLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxRQUFRLEVBQUUsS0FBSyxXQUFXLEVBQUUsS0FBSyxXQUFXLE1BQU0sR0FBRyxJQUFJLEVBQUUsS0FBSyxVQUFVLEtBQUssWUFBWSxFQUFFLEtBQUssYUFBYSxHQUFHLEVBQUUsS0FBSyxZQUFZLEdBQUcsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxLQUFLLFVBQVUsTUFBVSxNQUFNLHlCQUF5QixFQUFFLElBQU0sRUFBRSxLQUFLLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLEVBQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNLElBQUksS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBR0YsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEdBQUcsT0FBTyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBS0EsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUlBLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxLQUFLLElBQUksR0FBRyxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsR0FBRyxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLE1BQU0sR0FBRyxLQUFLLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLEVBQUUsS0FBSyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUUsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBTSxNQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxDQUFDLEVBQUUsSUFBTSxFQUFFLEtBQUssT0FBVyxFQUFFLEtBQUssY0FBb0IsRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxLQUFLLFFBQVEsRUFBRSxHQUFHLEtBQUssZ0JBQWdCLEtBQUssVUFBVSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsRUFBRSxJQUFNLEVBQUUsS0FBSyxXQUFlLEVBQUUsS0FBSyxFQUFRLEVBQUUsS0FBSyxhQUFhLEVBQUUsS0FBSyxXQUFlLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBR0QsRUFBRSxHQUFHLEVBQUUsSUFBSUEsRUFBRSxHQUFHLEdBQUdBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxFQUFFLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxJQUFJLElBQUksRUFBRUcsR0FBRSxDQUFDLEVBQUVDLEdBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHSixFQUFFLEdBQUcsRUFBRSxJQUFJQSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBR0EsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksR0FBR0EsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBQyxNQUFNSSxHQUFFLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEdBQUcsR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRyxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxJQUFJLEVBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFHLEdBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFH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T0FBTyxHQUFqQixTQUFtQixDQUFDLEdBQUcsT0FBTyxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFFLENBQUMsRUFBRSxTQUFTLEdBQUUsRUFBRSxFQUFFLEdBQUUsQ0FBQyxJQUFNLEVBQUUsR0FBRSxDQUFDLEVBQUUsR0FBVSxJQUFQLEtBQVMsT0FBTyxFQUFFLElBQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLElBQUksT0FBTyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQU0sRUFBRSxHQUFFLENBQUMsRUFBRSxHQUFVLElBQVAsS0FBUyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBWSxJQUFULElBQUssR0FBTSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxPQUFPLEVBQXpCLENBQTRCLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsR0FBVSxJQUFQLEtBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDLElBQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUUsT0FBTyxFQUFFLENBQUMsSUFBTSxFQUFFLEdBQUUsT0FBTyxHQUFFLE9BQU8sRUFBRSxHQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUssQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFNLEVBQUUsRUFBRSxZQUFZLEdBQWUsT0FBTyxHQUFuQixXQUFxQixDQUFDLElBQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQVksSUFBVCxJQUFLLEdBQU0sTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBTSxFQUFFLE9BQU8sUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQ0F2cEMsU0FBUyxHQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU9FLEdBQUVDLEdBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBaUMsU0FBUyxJQUFHLENBQUMsTUFBTSxFQUFFLENDQTFGLE1BQU0sRUFBRSxHQUFFLENBQUMsWUFB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
|