@willbooster/wb 15.0.1 → 15.0.3
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 +39 -39
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import n,{execFileSync as
|
|
2
|
-
`)){let e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;let r=Number(e[1]),i=Number(e[2]),a=t.get(i);a?a.push(r):t.set(i,[r])}return t}function
|
|
1
|
+
import e from"node:fs";import t from"node:path";import n from"fast-glob";import r,{execFileSync as i,spawn as a,spawnSync as o}from"node:child_process";import{config as s,parse as c}from"dotenv";import{expand as l}from"dotenv-expand";import{createHash as u}from"node:crypto";import d from"yargs";import{hideBin as f}from"yargs/helpers";import p from"chalk";import{globby as m}from"globby";import h,{constants as g}from"node:os";import{PromisePool as _}from"minimal-promise-pool";import{parse as v}from"jsonc-parser";import y from"kill-port";import b from"node:fs/promises";import x from"node:assert";import S from"node:http";import{setTimeout as C}from"node:timers/promises";import{createServer as w}from"node:net";import{fileURLToPath as T}from"node:url";import E from"semver";import{distance as D}from"fastest-levenshtein";function O(e,t){return k(A(e).filter(e=>P(e)),t)}function k(r,i){let a=r=>{let a=n.isDynamicPattern(r),o={cwd:i,followSymbolicLinks:!1,ignore:[`**/node_modules/**`]},c=new Set(n.globSync(t.posix.join(r,`package.json`),o));if(r.includes(`?`))for(let a of n.globSync(r,{...o,onlyDirectories:!0})){let n=t.posix.join(a,`package.json`);e.existsSync(t.join(i,n))&&c.add(n)}return[...c].filter(e=>e!==`package.json`&&(!a||!e.split(`/`).some(e=>e.startsWith(`.`)))&&s(e))},o,s=n=>{try{o??=e.realpathSync(i);let r=t.relative(o,e.realpathSync(t.join(i,n)));return r!==`..`&&!r.startsWith(`../`)&&!t.isAbsolute(r)}catch{return!1}},c=new Set,l=new Set;for(let e of r){let t=e.startsWith(`!`),r=j(t?e.slice(1):e);if(t){let e=M(r);if(e!==void 0)for(let t of a(e))c.add(t);for(let e of a(r))c.delete(e)}else{let e=n.isDynamicPattern(r)?c:l;for(let t of a(r))e.add(t)}}return[...new Set([...c,...l])].toSorted()}function A(e){return N(e).map(e=>{let t=/^!*/u.exec(e)[0].length,n=e.slice(t);return t%2==1?`!${n}`:n}).filter(e=>j(e.startsWith(`!`)?e.slice(1):e)!==`.`)}function j(e){return t.posix.normalize(e).replace(/\/+$/u,``).split(`/`).map(e=>/^\*{3,}$/u.test(e)?`*`:e).join(`/`)}function M(e){let t=e.split(`/`);if(t.length!==2)return;let[n,r]=t;if(!(!/^\*+$/u.test(r)||/^\*+$/u.test(n)))return r===`**`?`**`:`*/*`}function N(e){return Array.isArray(e)?e:Array.isArray(e?.packages)?e.packages:[]}function P(e){let n=e.startsWith(`!`)?e.slice(1):e;return!t.posix.isAbsolute(n)&&!n.split(`/`).includes(`..`)}const ee={env:{description:`.env files to be loaded.`,nargs:1,type:`array`},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:`string`},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:`boolean`},"auto-cascade-env":{description:`Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.`,type:`boolean`,default:!0},"include-root-env":{description:`Include .env files in root directory if the project is in a monorepo and --env option is not used.`,type:`boolean`,default:!0},"check-env":{description:`Check whether the keys of the loaded .env files are same with the given .env file.`,type:`string`,default:`.env.example`},"quiet-env":{description:`Suppress .env file loading information.`,type:`boolean`},verbose:{description:`Whether to show verbose information`,type:`boolean`,alias:`v`}},te=new Set([`development`,`test`,`staging`,`production`]);function ne(e){if(e.commandDefaultWbEnv)return e.commandDefaultWbEnv;if(e.cascadeEnv)return e.cascadeEnv;let t=process.env,n=(e.cascadeNodeEnv||e.autoCascadeEnv!==!1)&&t.NODE_ENV||`development`;return te.has(n)?n:`development`}function re(n,r,i){let a=(n.env??[]).map(e=>t.resolve(r,e.toString())),o=process.env,s=n.cascadeEnv??(n.cascadeNodeEnv?o.NODE_ENV||`development`:n.autoCascadeEnv?o.WB_ENV||o.NODE_ENV||`development`:void 0);if(typeof s==`string`){if(a.length===0&&(a.push(t.join(r,`.env`)),n.includeRootEnv)){let n=t.resolve(r,`..`,`..`);e.existsSync(t.join(n,`package.json`))&&a.push(t.join(n,`.env`))}a=a.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}a=a.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e));let c=fe(n);n.verbose&&!c&&(console.info(`WB_ENV: ${o.WB_ENV}, NODE_ENV: ${o.NODE_ENV}`),console.info(`Reading env files:`,a.join(`, `)));let u=!!(n.cascadeEnv??(n.cascadeNodeEnv?o.NODE_ENV||`development`:n.autoCascadeEnv?o.WB_ENV:void 0))&&!de(o.CI),d=new Set;if(u&&typeof s==`string`&&s.length>0){for(let e of a)if(e.endsWith(`.${s}`)||e.endsWith(`.${s}.local`))for(let n of Object.keys(me(t.join(r,e))))d.add(n)}let f=[],p={};for(let e of a){let a=[];for(let[n,o]of Object.entries(me(t.join(r,e)))){if(n in p)continue;let t=process.env[n],r=!i?.ignoreProcessEnv&&n in process.env;r&&!(u&&d.has(n))||(r&&t!==o&&!c&&console.warn(`Warning: ${n} in ${e} overrides the value inherited from the parent environment because the ${s} environment is explicitly forced.`),p[n]=o,a.push(n))}f.push([e,a]),n.verbose&&!c&&a.length>0&&console.info(`Read ${a.length} environment variables from ${e}`)}let[m,h]=ie(r,s,p,{...i,modeFileOverridesProcessEnv:u});Object.assign(p,m),(h.length>0||oe(r))&&(f.push([se(s),h]),n.verbose&&!c&&console.info(`Read ${h.length} environment variables from ${se(s)}`));let[g,_]=ce(r,s,p,i);if(Object.assign(p,g),_.length>0&&(f.push([ue(s),_]),n.verbose&&!c&&console.info(`Read ${_.length} environment variables from ${ue(s)}`)),!n.verbose&&!c&&console.info(`Read env files: ${f.map(([e,t])=>t.length>0?`${e} (${t.join(`, `)})`:e).join(`, `)||`nothing`}`),n.checkEnv){let e=Object.keys(me(t.join(r,n.checkEnv))).filter(e=>!(e in p)&&!(e in process.env));if(e.length>0)throw Error(`Missing environment variables in [${a.join(`, `)}]: [${e.join(`, `)}]`)}let v={};for(let[e,t]of Object.entries(process.env))t!==void 0&&!(e in p)&&(v[e]=t.replaceAll(`$`,String.raw`\$`));let y={};for(let e of[..._,...h])y[e]=p[e];Object.assign(y,p);let b={...y},x={...v},S=l({parsed:y,processEnv:v}).parsed??y,C=S.WB_ENV??o.WB_ENV;if(i?.expandFallbackWbEnv&&!C){let e={...b};delete e.WB_ENV,S=l({parsed:e,processEnv:{...x,WB_ENV:o.WB_ENV||ne(n)}}).parsed??e}return[S,f]}function ie(e,t,n,r){if(!oe(e))return[{},[]];let i=ae(e,t,{quiet:!1});if(!i)return[{},[]];let a=!1,o=()=>(a===!1&&(a=ae(e,void 0,{quiet:!0,ignoreProfileEnvVar:!0})),a),s={},c=[];for(let[e,a]of Object.entries(i))if(!(typeof a!=`string`||e in n)){if(!r?.ignoreProcessEnv&&e in process.env){let n=r?.modeFileOverridesProcessEnv&&t?o():void 0;if(!(n!==void 0&&n[e]!==a))continue}s[e]=a,c.push(e)}return[s,c]}function ae(e,t,n){let i=[`export`,`--format`,`json`,`--no-color`,`--if-missing`,`error`,`--non-interactive`],a={...process.env};t&&i.push(`--profile`,t),n.ignoreProfileEnvVar&&delete a.FNOX_PROFILE;let o=r.spawnSync(`fnox`,i,{cwd:e,env:a,encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`]});if(o.error||o.status!==0||!o.stdout?.trim()){n.quiet||console.warn(`Failed to read fnox secrets: ${o.error?.message||o.stderr?.trim()||`fnox exited with status ${o.status}`}`);return}let s;try{s=JSON.parse(o.stdout)}catch{return}let c=s?.secrets;if(!(!c||typeof c!=`object`||Array.isArray(c)))return c}function oe(n){for(let r=t.resolve(n);;r=t.dirname(r)){if(e.existsSync(t.join(r,`fnox.toml`)))return!0;if(t.dirname(r)===r)return!1}}function se(e){return e?`fnox export --profile ${e}`:`fnox export`}function ce(e,t,n,i){if(!le(e))return[{},[]];let a=[`env`,`--json`,`--cd`,e];t&&a.push(`--env`,t);let o=r.spawnSync(`mise`,a,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`]});if(o.error||o.status!==0||!o.stdout?.trim())return[{},[]];let s;try{s=JSON.parse(o.stdout)}catch{return[{},[]]}if(!s||typeof s!=`object`||Array.isArray(s))return[{},[]];let c={},l=[];for(let[e,t]of Object.entries(s))if(!(typeof t!=`string`||e in n)){if(i?.ignoreProcessEnv){if(e===`PATH`)continue}else if(process.env[e]===t)continue;c[e]=t,l.push(e)}return[c,l]}function le(n){for(let r=t.resolve(n);;r=t.dirname(r)){if(e.existsSync(t.join(r,`mise.toml`))||e.existsSync(t.join(r,`.mise.toml`)))return!0;if(t.dirname(r)===r)return!1}}function ue(e){return e?`mise env --env ${e}`:`mise env`}function de(e){return!!e&&e!==`0`&&e!==`false`}function fe(e){let t=e;return t.quietEnv===!0||t.quietEnv!==!1&&t.silent===!0}const pe=new Map;function me(e){let n=pe.get(e);if(n)return n;let r=s({path:t.resolve(e),processEnv:{},quiet:!0}).parsed??{};return pe.set(e,r),r}function he(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,``).replaceAll(/\/private\/var\/folders\/[^:]+:/g,``).replaceAll(/\/var\/tmp\/[^:]+:/g,``).replaceAll(/\/tmp\/[^:]+:/g,``));for(let t of Object.keys(e)){let n=t.toUpperCase();(n.startsWith(`NPM_`)||n.startsWith(`YARN_`)||n.startsWith(`BERRY_`)||n===`PROJECT_CWD`||n===`INIT_CWD`)&&delete e[t]}}function ge(e){return e instanceof Error&&`code`in e}function _e(e){let t=new Map;for(let n of e.split(`
|
|
2
|
+
`)){let e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;let r=Number(e[1]),i=Number(e[2]),a=t.get(i);a?a.push(r):t.set(i,[r])}return t}function ve(e,t){let n=[],r=[...t.get(e)??[]],i=0;for(;i<r.length;){let e=r[i];i+=1,n.push(e),r.push(...t.get(e)??[])}return n}function F(e,t=`SIGTERM`){if(!Number.isInteger(e)||e<=0)throw Error(`Invalid pid: ${e}`);if(process.platform===`win32`){be(e);return}let n=Se(e,xe(e));for(let e of n)ye(e,t)}function ye(e,t){try{process.kill(e,t)}catch(e){if(we(e))return;throw e}}function be(e){try{Ce(`taskkill`,[`/PID`,String(e),`/T`,`/F`],{maxBuffer:1024*1024,timeout:2e3})}catch(e){if(we(e))return;throw e}}function xe(e){let{stdout:t}=Ce(`ps`,[`-Ao`,`pid=,ppid=`],{maxBuffer:1024*1024,timeout:2e3});return ve(e,_e(t))}function Se(e,t){let n=t.toReversed();return n.push(e),n}function Ce(e,t,n){try{return{stdout:i(e,[...t],{encoding:`utf8`,maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:[`ignore`,`pipe`,`pipe`]}),stderr:``}}catch(n){throw new De(e,t,Ee(n),Te(n))}}function we(e){return ge(e)&&e.code===`ESRCH`?!0:e instanceof De&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}function Te(e){if(ge(e))return e.code;if(typeof e==`object`&&e&&`status`in e){let t=e.status;if(typeof t==`number`)return t}}function Ee(e){if(typeof e!=`object`||!e||!(`stderr`in e))return``;let t=e.stderr;return typeof t==`string`?t:Buffer.isBuffer(t)?t.toString(`utf8`):``}var De=class extends Error{stderr;code;constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(` `)}`),this.name=`CommandExecutionError`,this.stderr=n,this.code=r}};async function Oe(e,t,n){return new Promise((r,i)=>{try{let o=a(e,t??[],n??{});o.stdout?.setEncoding?.(`utf8`),o.stderr?.setEncoding?.(`utf8`);let s=``,c=``,l=Ae(process.stdout,n?.omitBlankLinesWhilePrinting),u=Ae(process.stderr,n?.omitBlankLinesWhilePrinting);o.stdout?.on(`data`,e=>{s+=e,n?.printingStdout&&l.write(e)}),o.stderr?.on(`data`,e=>{n?.mergeOutAndError?s+=e:c+=e,n?.printingStderr&&u.write(e)});let d=!1,f=()=>{if(!(d||!o.pid)){d=!0,n?.verbose&&console.info(`treeKill(${o.pid})`);try{F(o.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${o.pid})`,e)}}},p=process.platform===`win32`?[`SIGINT`,`SIGTERM`]:[`SIGINT`,`SIGTERM`,`SIGQUIT`],m=new Map,h=()=>{process.removeListener(`beforeExit`,f);for(let[e,t]of m)process.removeListener(e,t);m.clear()};if(n?.killOnExit){process.on(`beforeExit`,f);for(let e of p){let t=()=>{f(),h(),process.listenerCount(e)===0&&process.kill(process.pid,e)};m.set(e,t),process.on(e,t)}}o.on(`error`,e=>{h(),o.removeAllListeners(`close`),i(e)}),o.on(`close`,(e,t)=>{h(),l.flush(),u.flush(),o.pid===void 0?i(Error(`Process has no pid.`)):r({pid:o.pid,stdout:s,stderr:c,status:e,signal:t})}),n?.input&&(o.stdin?.write(n.input),o.stdin?.end())}catch(e){i(e)}})}const ke=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`);function Ae(e,t=!1){if(!t)return{write:t=>e.write(t),flush:()=>{}};let n=``;return{write:t=>{n+=t;let r=n.split(/\r?\n/);n=r.pop()??``;for(let t of r)je(t)||e.write(`${t}\n`)},flush:()=>{je(n)||e.write(n),n=``}}}function je(e){return e.replaceAll(ke,``).trim().length===0}async function Me(e){try{return await e()}catch(e){if(typeof e==`object`&&e&&`code`in e&&e.code===`ENOENT`)return;throw e}}
|
|
3
3
|
/**
|
|
4
4
|
* [js-sha3]{@link https://github.com/emn178/js-sha3}
|
|
5
5
|
*
|
|
@@ -8,29 +8,29 @@ import e from"node:fs";import t from"node:path";import n,{execFileSync as r,spaw
|
|
|
8
8
|
* @copyright Chen, Yi-Cyuan 2015-2023
|
|
9
9
|
* @license MIT
|
|
10
10
|
*/
|
|
11
|
-
const z=[...`0123456789abcdef`],Se=[6,1536,393216,100663296],B=[0,8,16,24],Ce=[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 we(e){return new Ee(512,Se,512).update(e).hex()}const Te=e=>{let t=[];for(let[n,r]of e.entries())t[n]=r;return t};var Ee=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<<B[3&o++]:s<2048?(t[o>>2]|=(192|s>>6)<<B[3&o++],t[o>>2]|=(128|63&s)<<B[3&o++]):s<55296||s>=57344?(t[o>>2]|=(224|s>>12)<<B[3&o++],t[o>>2]|=(128|s>>6&63)<<B[3&o++],t[o>>2]|=(128|63&s)<<B[3&o++]):(s=65536+((1023&s)<<10|1023&(e.codePointAt(++c)||0)),t[o>>2]|=(240|s>>18)<<B[3&o++],t[o>>2]|=(128|s>>12&63)<<B[3&o++],t[o>>2]|=(128|s>>6&63)<<B[3&o++],t[o>>2]|=(128|63&s)<<B[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];De(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];De(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+=z[i>>4&15]+z[15&i]+z[i>>12&15]+z[i>>8&15]+z[i>>20&15]+z[i>>16&15]+z[i>>28&15]+z[i>>24&15];o%e===0&&(t=Te(t),De(t),a=0)}return r&&(i=t[a],s+=z[i>>4&15]+z[15&i],r>1&&(s+=z[i>>12&15]+z[i>>8&15]),r>2&&(s+=z[i>>20&15]+z[i>>16&15])),s}};const De=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,F,ne,I,re,ie,ae,oe,se,ce,L,le,ue,de,fe,pe,me,he,ge,_e,R,ve,ye,be,xe,z,Se,B;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],L=e[11]<<4|e[10]>>>28,le=e[10]<<4|e[11]>>>28,O=e[20]<<3|e[21]>>>29,k=e[21]<<3|e[20]>>>29,xe=e[31]<<9|e[30]>>>23,z=e[30]<<9|e[31]>>>23,ae=e[40]<<18|e[41]>>>14,oe=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,ue=e[22]<<10|e[23]>>>22,de=e[23]<<10|e[22]>>>22,A=e[33]<<13|e[32]>>>19,j=e[32]<<13|e[33]>>>19,Se=e[42]<<2|e[43]>>>30,B=e[43]<<2|e[42]>>>30,ge=e[5]<<30|e[4]>>>2,_e=e[4]<<30|e[5]>>>2,te=e[14]<<6|e[15]>>>26,F=e[15]<<6|e[14]>>>26,v=e[25]<<11|e[24]>>>21,y=e[24]<<11|e[25]>>>21,fe=e[34]<<15|e[35]>>>17,pe=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,R=e[17]<<23|e[16]>>>9,ve=e[16]<<23|e[17]>>>9,ne=e[26]<<25|e[27]>>>7,I=e[27]<<25|e[26]>>>7,b=e[36]<<21|e[37]>>>11,x=e[37]<<21|e[36]>>>11,me=e[47]<<24|e[46]>>>8,he=e[46]<<24|e[47]>>>8,se=e[8]<<27|e[9]>>>5,ce=e[9]<<27|e[8]>>>5,E=e[18]<<20|e[19]>>>12,D=e[19]<<20|e[18]>>>12,ye=e[29]<<7|e[28]>>>25,be=e[28]<<7|e[29]>>>25,re=e[38]<<8|e[39]>>>24,ie=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&ne,e[21]=ee^~F&I,e[30]=se^~L&ue,e[31]=ce^~le&de,e[40]=ge^~R&ye,e[41]=_e^~ve&be,e[2]=g^~v&b,e[3]=_^~y&x,e[12]=E^~O&A,e[13]=D^~k&j,e[22]=te^~ne&re,e[23]=F^~I&ie,e[32]=L^~ue&fe,e[33]=le^~de&pe,e[42]=R^~ye&xe,e[43]=ve^~be&z,e[4]=v^~b&S,e[5]=y^~x&C,e[14]=O^~A&M,e[15]=k^~j&N,e[24]=ne^~re&ae,e[25]=I^~ie&oe,e[34]=ue^~fe&me,e[35]=de^~pe&he,e[44]=ye^~xe&Se,e[45]=be^~z&B,e[6]=b^~S&m,e[7]=x^~C&h,e[16]=A^~M&w,e[17]=j^~N&T,e[26]=re^~ae&P,e[27]=ie^~oe&ee,e[36]=fe^~me&se,e[37]=pe^~he&ce,e[46]=xe^~Se&ge,e[47]=z^~B&_e,e[8]=S^~m&g,e[9]=C^~h&_,e[18]=M^~w&E,e[19]=N^~T&D,e[28]=ae^~P&te,e[29]=oe^~ee&F,e[38]=me^~se&L,e[39]=he^~ce&le,e[48]=Se^~ge&R,e[49]=B^~_e&ve,e[0]^=Ce[r],e[1]^=Ce[r+1]},Oe=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(Ae.decode(e))],create:([e])=>ke.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]))}(),ke=new TextEncoder,Ae=new TextDecoder(`utf-8`);function je(e,t=Oe){return JSON.stringify(Pe(e,t))}function Me(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 Ne=[];function Pe(e,t=Oe){let n=Me(e);if(n!==null)return n;let r=[],i=new Map;return function e(n){let a=Me(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(Ne.length<e){let t=Ne.length;Ne.length=e,Ne.fill(-2,t,e)}return Ne.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 Fe(e,t){return we(je([e,t]))}function Ie(){return``}const V=Le({getCacheKey:Fe});Le({getCacheKey:Ie});function Le({cacheDuration:e=1/0,getCacheKey:t=Fe}={}){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 Re(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 ze(e){return!!e&&e!==`0`&&e!==`false`}let Be;function Ve(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:We(function(){return _(this)},r,`get`),set:function(e){t[4](this,e)}}:E[O]=_,d||We(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:He(f),d,d<2?[]:t?l||=[]:c||=[],u,!!t,p,r,t&&p?function(t){return Ge(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 He(e){var t=Ue(e,`string`);return typeof t==`symbol`?t:t+``}function Ue(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 We(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 Ge(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 Ke=`file:`;var qe=class n{static{[Be]=Ve(this,[],[[V,3,`isBunAvailable`],[V,3,`usesBunPackageManager`],[V,3,`buildCommand`],[V,3,`rootDirPath`],[V,3,`dockerfile`],[V,3,`hasDockerfile`],[V,3,`hasSourceCode`],[V,3,`name`],[V,3,`dockerImageName`],[V,3,`requiresNextPublicWbEnv`],[V,3,`packageJson`],[V,3,`packageJsonPath`],[V,3,`hasPrisma`],[V,3,`hasDrizzle`],[V,3,`databaseOrm`],[V,3,`hasVitest`],[V,3,`hasOxlint`],[V,3,`hasTypeAwareOxlint`],[V,3,`hasOxfmt`],[V,3,`hasPrettier`],[V,3,`hasPoetryLock`],[V,3,`hasPubspecYaml`],[V,3,`hasCargoToml`],[V,3,`preferredLinter`],[V,3,`hasPlaywrightConfig`],[V,3,`skipLaunchingServerForPlaywright`],[V,3,`dockerPackageJson`],[V,3,`binExists`],[V,3,`rootPackageJson`]]).e}argv=void Be(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 Qe(t.join(this.rootDirPath,`.tool-versions`),/(^|\n)bun\s/)?!0:[`mise.toml`,`.mise.toml`].some(e=>Qe(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]=A(this.argv,this.dirPath,{expandFallbackWbEnv:!0});if(!I(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(ze(t.CI)&&!process.env.WB_ENV&&e&&(console.error(f.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=k(this.argv);t.WB_ENV=n,e&&!I(this.argv)&&console.info(`WB_ENV is not defined; defaulting to "${n}".`)}n.standardWbEnvModes.has(t.WB_ENV)||(console.error(f.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:k(this.argv));r&&n.standardWbEnvModes.has(r)&&t.WB_ENV!==r&&t.WB_ENV!==this.argv.commandDefaultWbEnv&&(console.error(f.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&&!I(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 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 skipLaunchingServerForPlaywright(){if(ze(this.env.CI))return!1;try{let t=this.findFile(`playwright.config.ts`);return/\bwebServer\b/.test(e.readFileSync(t,`utf8`))}catch{return!1}}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 Re(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 Je(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 Ye(e){let n=Je(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 H(n,r=!0,i){if(i??=process.cwd(),e.existsSync(t.join(i,`package.json`)))return new qe(i,n,r)}function Xe(e,t){return e.env.WB_ENV===t||e.env.MISE_ENV===t}async function U(e,t=!0,n){let r=Ze(e,t,n);if(r)return{...r,descendants:r.root===r.self?await $e(e,r.root,t):[r.self]}}function Ze(n,r=!0,i){if(i??=process.cwd(),!e.existsSync(t.join(i,`package.json`)))return;let a=new qe(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 qe(a,n,r))}return{root:o,self:a}}function Qe(t,n){try{return n.test(e.readFileSync(t,`utf8`))}catch{return!1}}async function $e(n,r,i){let a=[r],o=r.packageJson.workspaces;if(!Array.isArray(o))return a;let s=[],c=[];for(let n of o.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):s.push(n);c.push(...await p(s,{dot:!0,onlyDirectories:!0}));for(let r of c)e.existsSync(t.join(r,`package.json`))&&a.push(new qe(r,n,i));return a}const et={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 tt(e)}};async function tt(n,r){let i=H(n,!0,r);if(!i)return console.error(f.red(`No project found.`)),!0;let a=n.command??(i.packageJson.scripts?.build?`${i.packageManagerRunCommand} build`:void 0);if(!a)return console.info(f.green(`Skip to build because no build command is defined.`)),!1;if(n={...n,command:a},!e.existsSync(t.join(i.rootDirPath,`.git`))||!ot(i))return st(i,n),!0;let[o,s,c]=await lt(i,n);if(o)return console.info(f.green(`Skip to run '${n.command}' 💫`)),!1;if(st(i,n)){if(!n.dryRun){let t=rt(n)??it(i);t.length===0&&console.info(f.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 nt=[`dist`,`build`,`.next`,`out`];function rt(e){return e.output?.length?e.output.map(String):void 0}function it(n){return nt.filter(r=>e.existsSync(t.join(n.dirPath,r)))}function at(e,t){return e.some(e=>t===e||t.startsWith(`${e}/`))}function ot(e){return n.spawnSync(`git`,[`rev-parse`,`--verify`,`HEAD`],{cwd:e.dirPath,stdio:`ignore`}).status===0}function st(e,t){if(console.info(f.green(`Run '${t.command}'`)),!t.dryRun){let r=n.spawnSync(t.command??``,{cwd:e.dirPath,env:e.env,shell:!0,stdio:`inherit`});if(r.status!==0)return process.exitCode=r.status??1,!1}return!0}const ct=new Set([`CI`,`PWDEBUG`,`TMPDIR`]);async function lt(r,i){let a=t.resolve(r.dirPath,`node_modules`,`.cache`,`build`),o=t.resolve(a,`last-build`);await e.promises.mkdir(a,{recursive:!0});let s=l(`sha256`),c=n.execSync(`git rev-parse HEAD`,{cwd:r.dirPath}).toString().trim();s.update(c),s.update(i.command??``);let u=JSON.stringify(Object.entries(r.env).filter(([e])=>!ct.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));s.update(u),await mt(r,i,s);let d=s.digest(`hex`),p=ut(await xe(()=>e.promises.readFile(o,`utf8`)));if(p?.hash!==d)return[!1,o,d];let m=(rt(i)??p.outputPaths).filter(n=>!e.existsSync(t.resolve(r.dirPath,n)));return m.length>0?(console.info(f.yellow(`Rebuilding because build outputs are missing: ${m.join(`, `)}`)),[!1,o,d]):[!0,o,d]}function ut(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 dt=new Set([`src`,`public`]),ft=[`.js`,`.cjs`,`.mjs`,`.jsx`,`.ts`,`.cts`,`.mts`,`.tsx`,`.json`,`.browserslistrc`,`package.json`,`yarn.lock`,`bun.lock`,`bun.lockb`],pt=new Set([`test`,`tests`,`__tests__`,`test-fixtures`]);async function mt(r,i,a){return new Promise(o=>{let s=n.spawnSync(`git`,[`status`,`--porcelain`,`-uall`,`-z`],{cwd:r.dirPath,env:r.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:r.env.WB_ENV===`test`?e.filePath.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,``):e.filePath})),u=t.relative(r.rootDirPath,r.dirPath),d=(rt(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=>dt.has(e))||ft.some(e=>t.endsWith(e)))&&!n.some(e=>pt.has(e))&&!at(d,e)});i.verbose&&console.info(`Changed files: ${f.map(e=>e.hashPath).join(`, `)}`);for(let n of f.filter(e=>e.untracked))try{a.update(n.hashPath),a.update(e.readFileSync(t.join(r.rootDirPath,n.filePath)))}catch{}let p=f.filter(e=>!e.untracked).map(e=>e.hashPath);if(p.length===0){o();return}let m=n.spawn(`git`,[`diff`,`HEAD`,`--`,...p],{cwd:r.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 ht=new g,gt={exitIfFailed:!0};async function W(e,t,n,r=gt){let i=vt(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||K(i.printable,t,n.silent?`Command`:`Start`),n.verbose&&K(i.runnable,t,`Start (raw)`,!0),n.dryRun)return yt(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 R(i.runnable,void 0,{cwd:t.dirPath,env:bt(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(`
|
|
11
|
+
const I=[...`0123456789abcdef`],Ne=[6,1536,393216,100663296],L=[0,8,16,24],Pe=[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 Fe(e){return new Le(512,Ne,512).update(e).hex()}const Ie=e=>{let t=[];for(let[n,r]of e.entries())t[n]=r;return t};var Le=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<<L[3&o++]:s<2048?(t[o>>2]|=(192|s>>6)<<L[3&o++],t[o>>2]|=(128|63&s)<<L[3&o++]):s<55296||s>=57344?(t[o>>2]|=(224|s>>12)<<L[3&o++],t[o>>2]|=(128|s>>6&63)<<L[3&o++],t[o>>2]|=(128|63&s)<<L[3&o++]):(s=65536+((1023&s)<<10|1023&(e.codePointAt(++c)||0)),t[o>>2]|=(240|s>>18)<<L[3&o++],t[o>>2]|=(128|s>>12&63)<<L[3&o++],t[o>>2]|=(128|s>>6&63)<<L[3&o++],t[o>>2]|=(128|63&s)<<L[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];Re(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];Re(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+=I[i>>4&15]+I[15&i]+I[i>>12&15]+I[i>>8&15]+I[i>>20&15]+I[i>>16&15]+I[i>>28&15]+I[i>>24&15];o%e===0&&(t=Ie(t),Re(t),a=0)}return r&&(i=t[a],s+=I[i>>4&15]+I[15&i],r>1&&(s+=I[i>>12&15]+I[i>>8&15]),r>2&&(s+=I[i>>20&15]+I[i>>16&15])),s}};const Re=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,fe,pe,me,he,ge,_e,ve,F,ye,be,xe,Se,Ce,we,Te,Ee,De;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,fe=e[10]<<4|e[11]>>>28,O=e[20]<<3|e[21]>>>29,k=e[21]<<3|e[20]>>>29,we=e[31]<<9|e[30]>>>23,Te=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,pe=e[22]<<10|e[23]>>>22,me=e[23]<<10|e[22]>>>22,A=e[33]<<13|e[32]>>>19,j=e[32]<<13|e[33]>>>19,Ee=e[42]<<2|e[43]>>>30,De=e[43]<<2|e[42]>>>30,F=e[5]<<30|e[4]>>>2,ye=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,he=e[34]<<15|e[35]>>>17,ge=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,be=e[17]<<23|e[16]>>>9,xe=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,_e=e[47]<<24|e[46]>>>8,ve=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,Se=e[29]<<7|e[28]>>>25,Ce=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&pe,e[31]=ue^~fe&me,e[40]=F^~be&Se,e[41]=ye^~xe&Ce,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^~pe&he,e[33]=fe^~me&ge,e[42]=be^~Se&we,e[43]=xe^~Ce&Te,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]=pe^~he&_e,e[35]=me^~ge&ve,e[44]=Se^~we&Ee,e[45]=Ce^~Te&De,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]=he^~_e&le,e[37]=ge^~ve&ue,e[46]=we^~Ee&F,e[47]=Te^~De&ye,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]=_e^~le&de,e[39]=ve^~ue&fe,e[48]=Ee^~F&be,e[49]=De^~ye&xe,e[0]^=Pe[r],e[1]^=Pe[r+1]},ze=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(Ve.decode(e))],create:([e])=>Be.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]))}(),Be=new TextEncoder,Ve=new TextDecoder(`utf-8`);function He(e,t=ze){return JSON.stringify(Ge(e,t))}function Ue(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 We=[];function Ge(e,t=ze){let n=Ue(e);if(n!==null)return n;let r=[],i=new Map;return function e(n){let a=Ue(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(We.length<e){let t=We.length;We.length=e,We.fill(-2,t,e)}return We.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 Ke(e,t){return Fe(He([e,t]))}function qe(){return``}const R=Je({getCacheKey:Ke});Je({getCacheKey:qe});function Je({cacheDuration:e=1/0,getCacheKey:t=Ke}={}){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 Ye(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 Xe(e){return!!e&&e!==`0`&&e!==`false`}let Ze;function Qe(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:tt(function(){return _(this)},r,`get`),set:function(e){t[4](this,e)}}:E[O]=_,d||tt(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:$e(f),d,d<2?[]:t?l||=[]:c||=[],u,!!t,p,r,t&&p?function(t){return nt(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 $e(e){var t=et(e,`string`);return typeof t==`symbol`?t:t+``}function et(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 tt(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 nt(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 rt=`file:`;var it=class n{static{[Ze]=Qe(this,[],[[R,3,`isBunAvailable`],[R,3,`usesBunPackageManager`],[R,3,`buildCommand`],[R,3,`rootDirPath`],[R,3,`dockerfile`],[R,3,`hasDockerfile`],[R,3,`hasSourceCode`],[R,3,`name`],[R,3,`dockerImageName`],[R,3,`requiresNextPublicWbEnv`],[R,3,`packageJson`],[R,3,`packageJsonPath`],[R,3,`hasPrisma`],[R,3,`hasDrizzle`],[R,3,`databaseOrm`],[R,3,`hasVitest`],[R,3,`hasOxlint`],[R,3,`hasTypeAwareOxlint`],[R,3,`hasOxfmt`],[R,3,`hasPrettier`],[R,3,`hasPoetryLock`],[R,3,`hasPubspecYaml`],[R,3,`hasCargoToml`],[R,3,`preferredLinter`],[R,3,`hasPlaywrightConfig`],[R,3,`skipLaunchingServerForPlaywright`],[R,3,`dockerPackageJson`],[R,3,`binExists`],[R,3,`rootPackageJson`]]).e}argv=void Ze(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 lt(t.join(this.rootDirPath,`.tool-versions`),/(^|\n)bun\s/)?!0:[`mise.toml`,`.mise.toml`].some(e=>lt(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(!fe(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(Xe(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&&!fe(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&&!fe(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 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 skipLaunchingServerForPlaywright(){if(Xe(this.env.CI))return!1;try{let t=this.findFile(`playwright.config.ts`);return/\bwebServer\b/.test(e.readFileSync(t,`utf8`))}catch{return!1}}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 Ye(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 at(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 ot(e){let n=at(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 z(n,r=!0,i){if(i??=process.cwd(),e.existsSync(t.join(i,`package.json`)))return new it(i,n,r)}function st(e,t){return e.env.WB_ENV===t||e.env.MISE_ENV===t}async function B(e,t=!0,n){let r=ct(e,t,n);if(r)return{...r,descendants:r.root===r.self?await ut(e,r.root,t):[r.self]}}function ct(n,r=!0,i){if(i??=process.cwd(),!e.existsSync(t.join(i,`package.json`)))return;let a=new it(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 it(a,n,r))}return{root:o,self:a}}function lt(t,n){try{return n.test(e.readFileSync(t,`utf8`))}catch{return!1}}async function ut(e,t,n){return[t,...(await dt(t)).map(t=>new it(t,e,n))]}async function dt(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()}const ft={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 pt(e)}};async function pt(n,r){let i=z(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`))||!vt(i))return yt(i,n),!0;let[o,s,c]=await xt(i,n);if(o)return console.info(p.green(`Skip to run '${n.command}' 💫`)),!1;if(yt(i,n)){if(!n.dryRun){let t=ht(n)??gt(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 mt=[`dist`,`build`,`.next`,`out`];function ht(e){return e.output?.length?e.output.map(String):void 0}function gt(n){return mt.filter(r=>e.existsSync(t.join(n.dirPath,r)))}function _t(e,t){return e.some(e=>t===e||t.startsWith(`${e}/`))}function vt(e){return r.spawnSync(`git`,[`rev-parse`,`--verify`,`HEAD`],{cwd:e.dirPath,stdio:`ignore`}).status===0}function yt(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 bt=new Set([`CI`,`PWDEBUG`,`TMPDIR`]);async function xt(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])=>!bt.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));s.update(l),await Et(n,i,s);let d=s.digest(`hex`),f=St(await Me(()=>e.promises.readFile(o,`utf8`)));if(f?.hash!==d)return[!1,o,d];let m=(ht(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 St(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 Ct=new Set([`src`,`public`]),wt=[`.js`,`.cjs`,`.mjs`,`.jsx`,`.ts`,`.cts`,`.mts`,`.tsx`,`.json`,`.browserslistrc`,`package.json`,`yarn.lock`,`bun.lock`,`bun.lockb`],Tt=new Set([`test`,`tests`,`__tests__`,`test-fixtures`]);async function Et(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=(ht(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=>Ct.has(e))||wt.some(e=>t.endsWith(e)))&&!n.some(e=>Tt.has(e))&&!_t(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 Dt=new _,Ot={exitIfFailed:!0};async function V(e,t,n,r=Ot){let i=At(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||U(i.printable,t,n.silent?`Command`:`Start`),n.verbose&&U(i.runnable,t,`Start (raw)`,!0),n.dryRun)return jt(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 Oe(i.runnable,void 0,{cwd:t.dirPath,env:Mt(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(`
|
|
12
12
|
`),a&&(!r.printSilentOutputOnFailureOnly||l!==0)){let e=(r.processSilentOutput?r.processSilentOutput(c.stdout):c.stdout).trim();e&&(process.stdout.write(e),process.stdout.write(`
|
|
13
|
-
`))}return n.silent&&l===0&&r.silentSuccessMessage&&console.info(
|
|
14
|
-
`)),
|
|
15
|
-
`,``).replaceAll(/\s\s+/g,` `).replaceAll(/PRISMA generate(?!\s+--no-hints)(?=\s|$)/gu,t.packageJson.dependencies?.blitz?`PRISMA generate`:`PRISMA generate --no-hints`).replaceAll(`PRISMA `,t.packageJson.dependencies?.blitz?`YARN blitz 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
|
|
16
|
-
`+(r?
|
|
17
|
-
`)){if(/^\s*(?:#|\/\/)/u.test(t))continue;let e=/(?:^|[,{])\s*["']?database_name["']?\s*[:=]\s*["']([^"']+)["']/u.exec(t);if(e)return e[1]}}function
|
|
18
|
-
`)){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
|
|
19
|
-
&& litestream restore ${r} -o "${t}" "${t}" && ls -ahl "${t}" && ${i}`}listBackups(e,t){let n=
|
|
13
|
+
`))}return n.silent&&l===0&&r.silentSuccessMessage&&console.info(p.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),jt(i.printable,l,r,{silentSuccess:n.silent}),l}function H(e,t,n,r=Ot){return Dt.runAndWaitForReturnValue(async()=>{let i=At(e,t);if(U(i.printable,t,`Start (parallel)`,!0),n.dryRun)return U(i.printable,t,`Started (log)`),n.verbose&&U(i.runnable,t,`Started (raw)`,!0),jt(i.printable,0,r),0;let a=await Oe(i.runnable,void 0,{cwd:t.dirPath,env:Mt(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),U(i.printable,t,`Started (log)`),n.verbose&&U(i.runnable,t,`Started (raw)`,!0);let o=a.stdout.trim();return o&&!r.printRawOutput&&(process.stdout.write(o),process.stdout.write(`
|
|
14
|
+
`)),jt(i.printable,a.status,r),a.status??1})}function kt(e,t,n,r=Ot){return Dt.runAndWaitForReturnValue(async()=>{let i=At(e,t);if(n.dryRun)return{exitCode:0,output:``};let a=await Oe(i.runnable,void 0,{cwd:t.dirPath,env:Mt(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 At(e,t){let n=t.usesBunPackageManager?`bun run`:`yarn`,r=e.replaceAll(`
|
|
15
|
+
`,``).replaceAll(/\s\s+/g,` `).replaceAll(/PRISMA generate(?!\s+--no-hints)(?=\s|$)/gu,t.packageJson.dependencies?.blitz?`PRISMA generate`:`PRISMA generate --no-hints`).replaceAll(`PRISMA `,t.packageJson.dependencies?.blitz?`YARN blitz 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 U(e,t,n=`Start`,r=!1){console.info(`
|
|
16
|
+
`+(r?p.gray:p.cyan)(p.bold(`${n}:`),e)+p.gray(` at ${t.dirPath}`))}function jt(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 Mt(e,t){let n={...e};return t.ci&&(n.CI=`1`),Nt(n,t.preserveColor),n}function Nt(e,t){e.NO_COLOR!==void 0||t===!1?delete e.FORCE_COLOR:t&&process.stdout.isTTY&&(e.FORCE_COLOR||=`3`)}const Pt={...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 Ft(e){let t=[];for(let n of Object.keys(ee)){let r=It(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&&It(e,`quiet-env`)===void 0&&t.push(`--quiet-env`),t}function It(e,t){let n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Lt={"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`}},Rt={commands:{description:`Commands to run concurrently`,type:`array`}},zt={command:`concurrently <commands...>`,describe:`Run commands concurrently`,builder:{...Pt,...Lt,...Rt},async handler(e){process.platform===`win32`&&(console.error(p.red(`This command is not supported on Windows.`)),process.exit(1));let t=z(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 Bt({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 Bt(e){let t=e.commands.map(t=>r.spawn(At(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:Mt(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&&Ht(r,e)&&(o=r,n=!0,s.push(Ut(t,`SIGTERM`))),l())};r.once(`error`,e=>{console.error(`Failed to start child process:`,e),d(1)}),r.once(`exit`,(e,t)=>{d(Vt(e??void 0,t??void 0))})})),u=e=>{i??=e,!n&&(n=!0,s.push(Ut(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 Vt(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 Vt(e,t){return e===void 0?t&&t in g.signals?128+g.signals[t]:1:e}function Ht(e,t){return t.success===`first`||t.killOthers||t.killOthersOnFail&&e!==0}async function Ut(e,t){let n=Gt(Wt(e),t);n.length!==0&&await Kt(n)&&Gt(n,`SIGKILL`)}function Wt(e){return e.flatMap(e=>e.pid===void 0?[]:[e.pid])}function Gt(e,t){let n=[];for(let r of e)try{if(!Yt(r,t))continue;n.push(r),F(r,t)}catch(e){console.warn(`Failed to kill child process:`,e)}return n}async function Kt(e){let t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(qt))return!1;await Jt(Math.min(100,t-Date.now()))}return!0}function qt(e){try{return process.kill(-e,0),!1}catch(e){return!!Xt(e)}}async function Jt(e){await new Promise(t=>setTimeout(t,e))}function Yt(e,t){try{return process.kill(-e,t),!0}catch(e){if(Xt(e))return!1;throw e}}function Xt(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ESRCH`}function W(e){return e.map(e=>G(e)).join(` `)}function Zt(e,t){return`${e}=${G(t)}`}function G(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll(`'`,`'"'"'`)}'`}const Qt=[`wrangler.jsonc`,`wrangler.json`,`wrangler.toml`];function $t(e,t){return W([`YARN`,`wb`,`gen-dev-vars`,...Ft(e),t])}function en(e){return`env -u CLOUDFLARE_ENV YARN wrangler ${e}`.trim()}function tn(e){let t=rn(e);if(!(!t||!an(e)))return`CI=true YARN wrangler d1 migrations apply ${t} --local --persist-to "${sn(e)}"`}function nn(e,n){let r=rn(e);if(!r)return n;let i=`export DATABASE_URL="file:$(ls "${t.resolve(e.dirPath,sn(e))}"/v3/d1/miniflare-D1DatabaseObject/*.sqlite | grep -v metadata | head -1)"`;return`${on(e,r)} && ${i} && ${n}`}function rn(t){let n=K(t);if(n)for(let t of e.readFileSync(n,`utf8`).split(`
|
|
17
|
+
`)){if(/^\s*(?:#|\/\/)/u.test(t))continue;let e=/(?:^|[,{])\s*["']?database_name["']?\s*[:=]\s*["']([^"']+)["']/u.exec(t);if(e)return e[1]}}function K(n){if(n.dirPath)for(let r of Qt){let i=t.join(n.dirPath,r);if(e.existsSync(i))return i}}function an(n){let r=K(n);if(!r)return;let i=`migrations`;for(let t of e.readFileSync(r,`utf8`).split(`
|
|
18
|
+
`)){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 on(e,t){return`YARN wrangler d1 execute ${t} --local --persist-to "${sn(e)}" --command "SELECT 1" > /dev/null`}function sn(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}`}const cn=`litestream.yml`,ln=`/etc/litestream.yml`;var un=class{cleanUpLitestream(e){let n=En(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=rn(e);if(n)return`rm -Rf "${sn(e)}/v3/d1" && ${on(e,n)} && ${this.migrate(e,t)}`;let r=Sn(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 st(e,`test`)&&(Sn(e)||rn(e))?this.reset(e,t):this.migrate(e,t)}deploy(e,t=``){return dn(e,`migrate ${t}`.trim())}deployForce(e){let t=En(e,`deploy-force`),n=wn(t),r=On(e),i=dn(e,`migrate`,`ALLOW_TO_SKIP_SEED=0`);return`${n}; ${this.deploy(e)} && ${n}
|
|
19
|
+
&& litestream restore ${r} -o "${t}" "${t}" && ls -ahl "${t}" && ${i}`}listBackups(e,t){let n=En(e,`list-backups`);return`litestream ltx ${On(e,t)} "${n}"`}restore(e,t,n){let r=En(e,`restore`);return`${Cn(t)}; litestream restore ${On(e,n)} -o "${t}" "${r}"`}generate(e,t=``){return dn(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`:dn(e,`studio ${n}`.trim())}};function dn(e,t,n=``){let r=`${n&&`${n} `}YARN drizzle-kit ${t}`;return t.includes(`--config`)?r:fn(e,r)}function fn(e,t){let n=xn(e);return n&&n.dirPath!==e.dirPath?`(${W([`cd`,n.dirPath])} && ${t})`:t}function pn(n){if(!n.hasDrizzle)return!1;let r=xn(n);if(!r)return!1;try{let n=bn(e.readFileSync(t.join(r.dirPath,r.fileName),`utf8`)),i=gn(n),a=[`export default`,`module.exports`].map(e=>i.indexOf(e)).filter(e=>e!==-1),o=mn(n,i,a.length>0?Math.min(...a):0);return o!==void 0&&_n(o)}catch{return!1}}function mn(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:yn(e.slice(n+r))}let a=hn(t,i[1].replaceAll(`$`,String.raw`\$`));if(a===void 0)return;let o=/^\s*(?::[^=;\n]*)?=/.exec(t.slice(a));if(o)return yn(e.slice(a+o[0].length))}function hn(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 gn(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===`
|
|
20
20
|
`){n=void 0,t+=i;continue}t+=i===`
|
|
21
21
|
`?`
|
|
22
|
-
`:` `;continue}(i===`'`||i===`"`||i==="`")&&(n=i),t+=i}return t}function
|
|
23
|
-
`)&&(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
|
|
22
|
+
`:` `;continue}(i===`'`||i===`"`||i==="`")&&(n=i),t+=i}return t}function _n(e){let t=vn(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 vn(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 yn(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===`
|
|
23
|
+
`)&&(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 bn(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===`
|
|
24
24
|
`)&&(n=void 0),t+=i;continue}if(i===`'`||i===`"`||i==="`"){n=i,t+=i;continue}if(i===`/`&&a===`/`){for(;r<e.length&&e[r]!==`
|
|
25
25
|
`;)r++;t+=`
|
|
26
|
-
`;continue}if(i===`/`&&a===`*`){for(r+=2;r<e.length&&!(e[r]===`*`&&e[r+1]===`/`);)r++;r++;continue}t+=i}return t}function
|
|
26
|
+
`;continue}if(i===`/`&&a===`*`){for(r+=2;r<e.length&&!(e[r]===`*`&&e[r+1]===`/`);)r++;r++;continue}t+=i}return t}function xn(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 Sn(e){let n=Dn(e);if(n)return Cn(t.isAbsolute(n)?n:t.resolve(e.dirPath,n))}function Cn(e){return`rm -f "${e}" "${e}-wal" "${e}-shm"`}function wn(e){return`rm -Rf "${e}"*`}function Tn(e,t){let n=Dn(e);if(!n)throw Error(`wb db ${t} supports Drizzle only when file: DATABASE_URL is set.`);return n}function En(e,n){let r=Tn(e,n);return t.isAbsolute(r)?r:t.resolve(e.dirPath,r)}function Dn(e){return ot(e)}function On(n,r){if(r)return`-config "${r}"`;let i=t.join(n.dirPath,cn);return e.existsSync(i)?`-config ./${cn}`:e.existsSync(ln)?`-config ${ln}`:`-config ./${cn}`}const kn=new un;function An(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 jn=new Set([`bindings`,`send_email`,`ratelimits`]),Mn=new Set([`wasm_modules`,`text_blobs`,`data_blobs`]);function Nn(e,t=new Set,n=``){if(Array.isArray(e)){for(let r of e)Nn(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`&&jn.has(n))t.add(i);else if(Mn.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`&&Nn(i,t,r);return t}function Pn(e,t){return t?.site??e.site?[`__STATIC_CONTENT`]:[]}function Fn(n,r){let i=K(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:[...Nn({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},Nn(s)),...Pn(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:[...Nn(o),...Pn(o)],d1Databases:o.d1_databases??[],requiredSecretNames:o.secrets?.required??[],usesEnvSection:!1}}const In={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=z(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[...Ln(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}=${Rn(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(`
|
|
27
27
|
`)+`
|
|
28
|
-
`),console.info(
|
|
29
|
-
`,String.raw`\n`).replaceAll(`\r`,String.raw`\r`),r=[`'${t}'`,`\`${t}\``,`"${n}"`];for(let n of r)if(s(`${e}=${n}`)[e]===t)return n;throw Error(`The value of ${e} cannot be losslessly serialized into .dev.vars; simplify its quoting.`)}const On=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(`.`)),kn=[`WRANGLER_`,`CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_`,`CLOUDFLARE_CF_FETCH_`];function An(e){return On.has(e)||kn.some(t=>e.startsWith(t))}const jn={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=H(n);r||(console.error(f.red(`No project found.`)),process.exit(1));let a=Kt(r);a||(console.error(f.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(f.red(`WB_ENV must name a deploy environment (e.g. staging or production), but is ${o}.`)),process.exit(1));let s=Mn(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=wn(r,o)}catch(e){console.error(f.red(String(e instanceof Error?e.message:e))),process.exit(1)}c||(console.error(f.red(`Failed to parse ${a}.`)),process.exit(1));let l=c.accountId??r.env.CLOUDFLARE_ACCOUNT_ID,u=c.d1Databases.filter(e=>yn(r,e)),d=tn(r);d&&u.length>0&&u.length<c.d1Databases.length&&(console.error(f.red(`wb deploy does not support mixing wrangler-native and non-native D1 migration layouts.`)),process.exit(1));let p=u.length===0&&d?c.d1Databases[0]:void 0;u.length===0&&d&&c.d1Databases.length>1&&(console.error(f.red(`wb deploy supports drizzle-kit migrations only for a single D1 binding; found multiple.`)),process.exit(1));let h=new Set(u);p&&h.add(p);let g=c.d1Databases.filter(e=>!h.has(e));if(g.length>0&&console.warn(f.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){p&&!r.env.CLOUDFLARE_API_TOKEN&&(console.error(f.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);ze(r.env.CI)&&!e&&(console.error(f.red(`Wrangler authentication (e.g. CLOUDFLARE_API_TOKEN) is required to deploy on CI.`)),process.exit(1))}!ze(r.env.CI)&&r.packageJson.scripts?.[`deploy/ci-setup`]&&await W(`YARN run deploy/ci-setup`,r,n);let[_,v]=A(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=En(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}=Nn(_,[...c.varKeys,...c.bindingNames],b);r.env.WB_VERSION&&c.bindingNames.includes(`WB_VERSION`)&&(console.error(f.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(f.yellow(`Skipping env keys that collide with Worker binding names: ${C.join(`, `)}`)),x.length>0&&(console.error(f.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(f.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(f.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(f.red(`Variable or secret values exceed Cloudflare's 5 KB limit: ${O.join(`, `)}`)),process.exit(1));let k=Fn((n.dryRun?[]:await Pn(r,n,a,c,o))??[],S,D.map(([e])=>e),c.bindingNames),j=new Set([...T,...D.map(([e])=>e)]).size+k.length,M=k.length>0?` (including ${k.length} remote secrets kept from the previous version: ${k.join(`, `)})`:``;j>128&&(console.error(f.red(`Cloudflare allows at most 128 variables and secrets combined, but ${j} were selected${M}.`)),process.exit(1)),j>64&&console.warn(f.yellow(`${j} variables and secrets${M} exceed the Free plan's limit of 64.`)),console.info(f.cyan(`Deploying ${c.workerName??r.name} (${o}) with ${T.length} secrets: ${T.join(`, `)}`));let N=!!(r.packageJson.dependencies?.vinext??r.packageJson.devDependencies?.vinext),P=N?t.join(`dist`,`server`,`wrangler.json`):a,ee=c.usesEnvSection?`${zt(`CLOUDFLARE_ENV`,o)} `:``;N?(r.env.WB_VERSION&&(r.env.NEXT_PUBLIC_WB_VERSION||=r.env.WB_VERSION),r.packageJson.scripts?.[`gen-code`]&&await W(`YARN run gen-code`,r,n),await W(`${ee}YARN vinext build`,r,n),!n.dryRun&&!e.existsSync(t.resolve(r.dirPath,P))&&(console.error(f.red(`${P} not found; the vinext build did not produce a deploy config.`)),process.exit(1)),await W(`YARN wrangler deploy --dry-run --config ${J(P)}`,r,n)):await W(`YARN wrangler deploy --dry-run --config ${J(a)}${c.usesEnvSection?` --env ${J(o)}`:``}`,r,n);let te=c.usesEnvSection?` --env ${J(o)}`:``;for(let e of u){let t=e.database_name??e.binding;t&&await W(`CI=true YARN wrangler d1 migrations apply ${J(t)} --remote --config ${J(a)}${te}`,r,n)}p&&(p.database_id||(console.error(f.red(`The ${o} D1 binding has no database_id in the wrangler config.`)),process.exit(1)),l||(console.error(f.red(`CLOUDFLARE_ACCOUNT_ID (or account_id in the wrangler config) is required for remote drizzle-kit migrations.`)),process.exit(1)),await W($t(r,`migrate`,`CLOUDFLARE_D1_DATABASE_ID=${p.database_id} CLOUDFLARE_ACCOUNT_ID=${l}`),r,n));let F=[`deploy`,`--config`,P,...!N&&c.usesEnvSection?[`--env`,o]:[],...r.env.WB_VERSION?[`--var`,`WB_VERSION:${r.env.WB_VERSION}`]:[],`--secrets-file`];if(console.info(f.cyan(`Running: wrangler ${F.join(` `)} <temporary secrets file>`)),!n.dryRun){In(r);let n={...r.env};delete n.CLOUDFLARE_ENV;let a=e.mkdtempSync(t.join(m.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(a,{force:!0,recursive:!0}),process.kill(process.pid,t)}};s.set(t,n),process.on(t,n)}let u;try{let o=t.join(a,`secrets.json`);e.writeFileSync(o,JSON.stringify(S),{mode:384}),u=await new Promise(e=>{c=i(`wrangler`,[...F,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(a,{force:!0,recursive:!0})}if(l){process.kill(process.pid,l);return}u!==0&&(console.error(f.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(f.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 W(`YARN run deploy/post`,r,n)}}};function Mn(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=o({path:n,processEnv:{},quiet:!0}).parsed??{};for(let[e,t]of Object.entries(r))e!==`CLOUDFLARE_ENV`&&(i[e]??=t)}return i}function Nn(e,t,n){let r=new Set(t),i={};for(let[t,n]of Object.entries(e))r.has(t)||An(t)||t===`DATABASE_URL`&&n.startsWith(`file:`)||(i[t]=n);return{missingKeys:n.filter(t=>!r.has(t)&&!An(t)&&!e[t]),secrets:i}}async function Pn(e,t,n,r,i){In(e);let a=[`secret`,`list`,`--format`,`json`,`--config`,n,...r.usesEnvSection?[`--env`,i]:[]];console.info(f.cyan(`Running: wrangler ${a.join(` `)}`));let o;try{o=await R(`wrangler`,a,{cwd:e.dirPath,env:e.env,stdio:`pipe`,killOnExit:!0,verbose:t.verbose})}catch(e){console.warn(f.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(f.yellow(`Failed to list the remote Worker secrets; checking only the local payload against Cloudflare's limits.\n${(o.stderr||o.stdout).trim()}`))}function Fn(e,t,n,r){let i=new Set([...n,...r]);return e.filter(e=>!Object.hasOwn(t,e)&&!i.has(e))}function In(e){e.binExists||console.warn(f.yellow(`node_modules/.bin not found; relying on PATH to resolve wrangler.`))}const Ln=new Set([`SIGINT`,`SIGTERM`,`SIGQUIT`]),Rn={command:`dotenv [args..]`,describe:`Load .env files and run a command.`,builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await zn(Bn(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());Hn(n);let r=process.env.BERRY_BIN_FOLDER;ae(process.env),!Re(n,process.env)&&r&&(process.env.PATH=process.env.PATH?`${r}:${process.env.PATH}`:r);let a=i(e[0],e.slice(1),{cwd:n,env:process.env,stdio:`inherit`}),o=new Map;a.on(`error`,e=>{console.error(e),process.exit(1)});for(let e of Ln){let t=()=>{a.kill(e)};o.set(e,t),process.once(e,t)}a.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 Bn(e){return{command:[...(e.args??[]).map(String),...(e[`--`]??[]).map(String)]}}function Vn(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 Hn(e){let n=process.env.WB_ENV,r=n=>o({path:t.join(e,n),processEnv:{},quiet:!0}).parsed??{},i=n?{...r(`.env.${n}`),...r(`.env.${n}.local`)}:{},a={...r(`.env`),...n?r(`.env.${n}`):{},...r(`.env.local`),...n?r(`.env.${n}.local`):{}},s=!!n&&!ze(process.env.CI),[l]=j(e,n,a,{modeFileOverridesProcessEnv:s}),u={...l,...a},d=e=>!(e in process.env)||s&&(e in i||e in l),f={};for(let[e,t]of Object.entries(process.env))t!==void 0&&!(e in u&&d(e))&&(f[e]=t.replaceAll(`$`,String.raw`\$`));let p=c({parsed:u,processEnv:f}).parsed??u;for(let[e,t]of Object.entries(p)){if(!(e in process.env)){process.env[e]=t;continue}!(e in i||e in l)||process.env[e]===t||s&&(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)}Vn(n,`the exported variable`),Vn(process.env.WB_ENV,`the env source or the exported variable`),n&&process.env.WB_ENV&&process.env.WB_ENV!==n&&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 "${n}" environment was selected. Fix the WB_ENV defined in the mode's env sources, or set WB_SKIP_ENV_CHECK=1 to skip this check.`),process.exit(1))}const Un=`litestream.yml`,Wn=`/etc/litestream.yml`,Gn=[{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 Kn=class{cleanUpLitestream(e){let t=qn(e);return`${Zn(`${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=qn(e),n=Xn(`${t}/prod.sqlite3`);return`${n}; PRISMA migrate reset --force --skip-seed && ${n}
|
|
30
|
-
&& litestream restore ${
|
|
31
|
-
`))}function
|
|
32
|
-
`))}function
|
|
33
|
-
`+
|
|
28
|
+
`),console.info(p.green(`Generated ${s} with ${o.length} environment variables.`))}};function Ln(t){let n;try{n=t.findFile(`.env.example`)}catch{return[]}return Object.keys(c(e.readFileSync(n,`utf8`)))}function Rn(e,t){let n=t.replaceAll(`
|
|
29
|
+
`,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 zn=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(`.`)),Bn=[`WRANGLER_`,`CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_`,`CLOUDFLARE_CF_FETCH_`];function Vn(e){return zn.has(e)||Bn.some(t=>e.startsWith(t))}const Hn={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=z(n);r||(console.error(p.red(`No project found.`)),process.exit(1));let i=K(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=Un(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=Fn(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=>An(r,e)),d=pn(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);Xe(r.env.CI)&&!e&&(console.error(p.red(`Wrangler authentication (e.g. CLOUDFLARE_API_TOKEN) is required to deploy on CI.`)),process.exit(1))}!Xe(r.env.CI)&&r.packageJson.scripts?.[`deploy/ci-setup`]&&await V(`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=Ln(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}=Wn(_,[...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=Kn((n.dryRun?[]:await Gn(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?`${Zt(`CLOUDFLARE_ENV`,o)} `:``;M?(r.env.WB_VERSION&&(r.env.NEXT_PUBLIC_WB_VERSION||=r.env.WB_VERSION),r.packageJson.scripts?.[`gen-code`]&&await V(`YARN run gen-code`,r,n),await V(`${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 V(`YARN wrangler deploy --dry-run --config ${G(N)}`,r,n)):await V(`YARN wrangler deploy --dry-run --config ${G(i)}${c.usesEnvSection?` --env ${G(o)}`:``}`,r,n);let ee=c.usesEnvSection?` --env ${G(o)}`:``;for(let e of u){let t=e.database_name??e.binding;t&&await V(`CI=true YARN wrangler d1 migrations apply ${G(t)} --remote --config ${G(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 V(dn(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){qn(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 V(`YARN run deploy/post`,r,n)}}};function Un(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 Wn(e,t,n){let r=new Set(t),i={};for(let[t,n]of Object.entries(e))r.has(t)||Vn(t)||t===`DATABASE_URL`&&n.startsWith(`file:`)||(i[t]=n);return{missingKeys:n.filter(t=>!r.has(t)&&!Vn(t)&&!e[t]),secrets:i}}async function Gn(e,t,n,r,i){qn(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 Oe(`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 Kn(e,t,n,r){let i=new Set([...n,...r]);return e.filter(e=>!Object.hasOwn(t,e)&&!i.has(e))}function qn(e){e.binExists||console.warn(p.yellow(`node_modules/.bin not found; relying on PATH to resolve wrangler.`))}const Jn=new Set([`SIGINT`,`SIGTERM`,`SIGQUIT`]),Yn={command:`dotenv [args..]`,describe:`Load .env files and run a command.`,builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await Xn(Zn(e))}};async function Xn({command:e}){e.length===0&&(console.error(`Usage: wb dotenv -- <command> [args...]`),process.exit(1));let n=t.resolve(process.cwd());$n(n);let r=process.env.BERRY_BIN_FOLDER;he(process.env),!Ye(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 Jn){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 Zn(e){return{command:[...(e.args??[]).map(String),...(e[`--`]??[]).map(String)]}}function Qn(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 $n(e){let n=process.env.WB_ENV,r=n=>s({path:t.join(e,n),processEnv:{},quiet:!0}).parsed??{},i=n?{...r(`.env.${n}`),...r(`.env.${n}.local`)}:{},a={...r(`.env`),...n?r(`.env.${n}`):{},...r(`.env.local`),...n?r(`.env.${n}.local`):{}},o=!!n&&!Xe(process.env.CI),[c]=ie(e,n,a,{modeFileOverridesProcessEnv:o}),u={...c,...a},d=e=>!(e in process.env)||o&&(e in i||e in c),f={};for(let[e,t]of Object.entries(process.env))t!==void 0&&!(e in u&&d(e))&&(f[e]=t.replaceAll(`$`,String.raw`\$`));let p=l({parsed:u,processEnv:f}).parsed??u;for(let[e,t]of Object.entries(p)){if(!(e in process.env)){process.env[e]=t;continue}!(e in i||e in c)||process.env[e]===t||o&&(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)}Qn(n,`the exported variable`),Qn(process.env.WB_ENV,`the env source or the exported variable`),n&&process.env.WB_ENV&&process.env.WB_ENV!==n&&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 "${n}" environment was selected. Fix the WB_ENV defined in the mode's env sources, or set WB_SKIP_ENV_CHECK=1 to skip this check.`),process.exit(1))}const er=`litestream.yml`,tr=`/etc/litestream.yml`,nr=[{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 rr=class{cleanUpLitestream(e){let t=ir(e);return`${cr(`${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=ir(e),n=sr(`${t}/prod.sqlite3`);return`${n}; PRISMA migrate reset --force --skip-seed && ${n}
|
|
30
|
+
&& litestream restore ${or(e)} -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e,t){let n=ir(e);return`litestream ltx ${or(e,t)} ${n}/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=lr(e);r&&n.push(r);let i=[`PRISMA migrate reset --force`,t].filter(Boolean).join(` `);return n.push(i),e.packageJson.dependencies?.blitz&&n.push(this.seed(e)),n.filter(Boolean).join(` && `)}restore(e,t,n){let r=ir(e);return`rm -Rf ${t}*; litestream restore ${or(e,n)} -o ${t} ${r}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?`YARN blitz db seed${t?` -f ${t}`:``}`: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=${rt}${t.resolve(n)} `}else if(e.env.DATABASE_URL?.startsWith(`file:`)){let n=ar(e);n&&(i=`DATABASE_URL=${rt}${t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5))} `)}return`${i}PRISMA studio ${r}`}};function ir(e){return e.packageJson.dependencies?.blitz?`db/mount`:`prisma/mount`}function ar(n){return nr.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}function or(n,r){if(r)return`-config "${r}"`;let i=t.join(n.dirPath,er);return e.existsSync(i)?`-config ./${er}`:e.existsSync(tr)?`-config ${tr}`:`-config ./${er}`}function sr(e){return`rm -Rf "${e}"*`}function cr(e){return`if [ -f "${e}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${rt}${e}"; fi && rm -f "${e}".* "${e}"-*`}function lr(e){let n=at(e);if(!n)return;let r=ar(e),i=t.isAbsolute(n)?n:t.resolve(e.dirPath,r??`.`,n);return`rm -f "${i}" "${i}-wal" "${i}-shm"`}const ur=new rr,dr={command:`gen-code`,describe:`Generate code for the current project`,builder:{},async handler(e){let t=await B(e);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=t.descendants.map(e=>({project:e,scripts:fr(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 V(n,t,e)}}};function fr(e){let t=[],n=mr(e);e.hasOwnDependency(`blitz`)&&e.hasSourceCode&&t.push(`YARN blitz codegen`),n&&t.push(n);let r=hr(e);r&&t.push(r);let i=t.length===0?gr(e):void 0;i&&t.push(i);let a=pr(e);return a&&t.push(a),t}function pr(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 mr(e){if(e.hasPrisma&&yr(e))return ur.generate(e)}function hr(e){if(e.hasOwnDependency(`@chakra-ui/cli`)){if(_r(e,`@chakra-ui/cli`)===2)return`YARN chakra-cli tokens src/core/theme.ts`;if(vr(e,`src/theme.ts`))return`YARN chakra typegen src/theme.ts --strict`}}function gr(e){if(!e.hasDrizzle)return;let t=xn(e);if(t)return`${fn(e,`YARN drizzle-kit check --config ${t.fileName}`)} || true`}function _r(e,t){let n=e.packageJson,r=(n.dependencies?.[t]??n.devDependencies?.[t]??n.optionalDependencies?.[t]??n.peerDependencies?.[t])?.match(/\d+/u)?.[0];return r===void 0?void 0:Number(r)}function vr(n,r){return e.existsSync(t.join(n.dirPath,r))}function yr(e){return[`prisma/schema.prisma`,`prisma/schema`,`db/schema.prisma`].some(t=>vr(e,t))}const br={command:`kill-port-if-non-ci`,describe:`Kill the port specified by PORT environment variable if non-CI.`,builder:{},async handler(e){await xr(e)}};async function xr(e){let t=z(e);if(t||(console.error(p.red(`No project found.`)),process.exit(1)),Xe(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 Sr(e,t){if(!Cr(e,t))return;let n=wr(t);n&&(process.stdout.write(n),process.stdout.write(`
|
|
31
|
+
`))}function Cr(e,t){return e!==0||Tr(t)}function wr(e){return e.trim()}function Tr(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,``))}const Er={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`}},Dr=new Set([`astro`,`cjs`,`cts`,`js`,`jsx`,`mjs`,`mts`,`svelte`,`ts`,`tsx`,`vue`]),Or=new Set([`py`]),kr=new Set([`dart`]),Ar=new Set([`rs`]),jr=new Set([...Dr,`css`,`gql`,`graphql`,`hbs`,`htm`,`html`,`json`,`json5`,`jsonc`,`less`,`md`,`mdx`,`scss`,`toml`,`yaml`,`yml`]),Mr=new Set([`cjs`,`css`,`cts`,`htm`,`html`,`java`,`js`,`json`,`json5`,`jsonc`,`jsx`,`md`,`mjs`,`mts`,`scss`,`ts`,`tsx`,`vue`,`yaml`,`yml`]),Nr=new Set([...Mr].filter(e=>!jr.has(e))),Pr=`!**/test{-,/}fixtures/**`,Fr={command:`lint [files...]`,describe:`Lint code`,builder:Er,async handler(e){let t=await Ir(e);t&&process.exit(t)}};async function Ir(e){if(process.platform===`win32`)return console.error(p.red(`This command is not supported on Windows.`)),1;let n=await B(e,!1);if(!n)return console.error(p.red(`No project found.`)),1;let r=Qr(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 $r(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(...ri(n.descendants,f,r));for(let{lintPath:t,project:u}of ii(n.descendants,f,r)){if(u.hasPoetryLock&&(r===`directory`||Or.has(m))){let e=o.get(u)??[];if(e.push(t),o.set(u,e),r!==`directory`)continue}if(u.hasPubspecYaml&&(r===`directory`||kr.has(m))){let e=s.get(u)??[];if(e.push(t),s.set(u,e),r!==`directory`)continue}if(!(u.hasCargoToml&&(r===`directory`||Ar.has(m))&&(c.add(u),r!==`directory`)))if(r===`directory`||oi(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(ni(t),Pr)}else for(let e of ti(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&&(Mr.has(m)||jr.has(m)))if(u.hasOxfmt&&jr.has(m)){let e=a.get(u)??[];e.push(t),a.set(u,e)}else Mr.has(m)&&l.push(t);else ai(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=Xr(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=Ur(t,e,n);r&&g.push({command:r,project:t})}for(let[t,n]of o)y&&g.push({command:Kr(e,n),project:t}),v&&h.push({command:Gr(n),project:t});for(let[e,t]of s)y&&g.push({command:Yr(t),project:e}),v&&h.push({command:Jr(t),project:e});if(v){for(let e of c)h.push({command:qr(),project:e});for(let[e,t]of a)h.push({command:Wr(t),project:e})}}else for(let t of n.descendants){if(y){if(!t.packageJson.workspaces||t.hasSourceCode){let n=Ur(t,e);n&&g.push({command:n,project:t})}t.hasPoetryLock&&g.push({command:Kr(e),project:t}),t.hasPubspecYaml&&g.push({command:Yr(),project:t})}v&&(t.hasOxfmt&&h.push({command:Wr(),project:t}),t.hasPoetryLock&&h.push({command:Gr(),project:t}),t.hasPubspecYaml&&h.push({command:Jr(),project:t}),t.hasCargoToml&&h.push({command:qr(),project:t}))}let b=[];if(v){let t=await Lr(h,e,_);if(zr(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 Rr(W([`YARN`,`prettier`,`--cache`,`--no-error-on-unmatched-pattern`,`--write`,`--`,...f]),n.self,e,_);zr([t],e),b.push(t.exitCode)}if(m.length>0){let t=await Rr(W([`YARN`,`sort-package-json`,`--`,...m]),n.self,e,_);zr([t],e),b.push(t.exitCode)}if(b.some(e=>e!==0))return 1}if(y){let t=await Lr(g,e,_);zr(t,e),b.push(...t.map(e=>e.exitCode))}return+!!b.some(e=>e!==0)}function Lr(e,t,n){return Promise.all(e.map(({command:e,project:r})=>Rr(e,r,t,n)))}function Rr(e,t,n,r){if(n.silent){let i=At(e,t);return kt(e,t,n,r).then(e=>({...e,command:i.printable,cwd:t.dirPath}))}return H(e,t,n,r).then(e=>({exitCode:e}))}function zr(e,t){let n=t.silent&&!t.printAllOutput?e.filter(e=>`output`in e&&Cr(e.exitCode,e.output)):e;if(n.length!==0)for(let e of n)`output`in e&&(t.printAllOutput?Br(e):(t.silent&&Vr(e.command,e.cwd),Sr(e.exitCode,e.output)))}function Br(e){if(Vr(e.command,e.cwd),e.exitCode===0&&Hr(e.command)){console.info(p.green(`Succeeded.`));return}let t=e.output.trim();t&&(process.stdout.write(t),process.stdout.write(`
|
|
32
|
+
`))}function Vr(e,t){console.info(`
|
|
33
|
+
`+p.cyan(p.bold(`Command:`),e)+p.gray(` at ${t}`))}function Hr(e){return e.includes(` oxfmt `)||e.includes(` sort-package-json `)}function Ur(e,t,n){if(e.preferredLinter===`oxlint`)return W([`YARN`,`oxlint`,`--no-error-on-unmatched-pattern`,...e.hasTypeAwareOxlint?[`--type-aware`,`--type-check`]:[],...t.quiet?[`--quiet`]:[],...t.fix?[`--fix`]:[],...n??[`.`]])}function Wr(e){return W([`YARN`,`oxfmt`,`--write`,`--no-error-on-unmatched-pattern`,...e??[`.`],`!**/package.json`])}function Gr(e){let t=e&&e.length>0?e:[`.`];return[W([`poetry`,`run`,`isort`,`--profile`,`black`,`--filter-files`,...t]),W([`poetry`,`run`,`black`,...t])].join(` && `)}function Kr(e,t){let n=t&&t.length>0?t:[`.`];return W([`poetry`,`run`,`flake8`,...e.quiet?[`-q`]:[],...n])}function qr(){return W([`cargo`,`fmt`,`--all`])}function Jr(e){return W([`dart`,`format`,...e&&e.length>0?e:[`.`]])}function Yr(e){return W([`dart`,`analyze`,...e&&e.length>0?e:[`.`]])}function Xr(e,n){let r=new Set([`**/{.*/,}*.{${[...Nr].join(`,`)}}`,Pr]);for(let i of n){if(!si(i))continue;let n=t.join(i.dirPath,`**/{.*/,}*.{`+[...Mr].join(`,`)+`}`);r.add(t.relative(e,n)||n)}return[...r]}function Zr(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 Qr(e){let t=new Set;for(let n of[...e.files??[],...e._.slice(1),...e[`--`]??[]])t.add(String(n));return[...t]}async function $r(e){try{if((await b.stat(e)).isDirectory())return`directory`}catch{}return`other`}function ei(e,t){return e.hasOxfmt?jr.has(t):si(e)?!0:Nr.has(t)}function ti(e,t,n,r){return n===`directory`&&e.hasOxfmt?[t]:n===`directory`&&si(e)?[t,Pr]:ei(e,r)?[t]:[]}function ni(e){return t.join(e,`**/{.*/,}*.{${[...Nr].join(`,`)}}`)}function ri(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 ii(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=Zr(e,t);return r?[{lintPath:t,project:r}]:[]}function ai(e){return Dr.has(e)||Or.has(e)||kr.has(e)}function oi(e,t){return e.preferredLinter===`oxlint`&&Dr.has(t)}function si(e){return!e.hasOxfmt&&e.preferredLinter===`oxlint`}async function ci(e,t){let n=Number(e);if(!n)throw Error(`The given port (${n}) is invalid.`);return await fi(n,t),n}async function li(e){for(let t of[`127.0.0.1`,`::`])if(!await ui(t,e))return!1;return!0}async function ui(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 di=new Set;async function fi(e,t){await li(e)||await pi(e,t);let n=async()=>{di.has(e)||(di.add(e),await pi(e,t))};for(let e of[`beforeExit`,`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,n)}async function pi(e,t){await _i(e,t),mi(e)}function mi(e){for(let t of hi(e))try{process.kill(t,`SIGKILL`)}catch{}}function hi(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 gi(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 _i(e,t){await vi([`--filter`,`publish=${e}`],t)}async function vi(e,t){try{let n=await yi(e,t);if(n.length===0)return;await Oe(`docker`,[`rm`,`-f`,...n],{cwd:t.dirPath,env:t.env})}catch{}}async function yi(e,t){let{stdout:n}=await Oe(`docker`,[`ps`,`-q`,...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}function bi(e,t){let n=()=>{if(di.has(e))return;di.add(e),U(e,t);let{status:n}=o(e,{cwd:t.dirPath,shell:!0,stdio:`inherit`});jt(e,n,{})};for(let e of[`beforeExit`,`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,n)}const xi={"delay-ms":{default:5e3,describe:`Delay before starting the maintenance page server.`,type:`number`}},Si=2147483647,Ci={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(xi),async handler(e){let t=z(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=wi(t.env.PORT);if(n===`start`){await Ti(t,r,e.delayMs);return}if(n===`stop`){await ki(t,r);return}throw Error(`Unknown maintenance action: ${n}`)}};function wi(e){let t=Number(e);return x.ok(Number.isInteger(t)&&t>0,`PORT environment variable is invalid: ${e}`),t}async function Ti(e,t,n){x.ok(Number.isFinite(n)&&n>=0&&n<=Si,`delay-ms must be between 0 and ${Si}: ${n}`);let r=await Pi(e,t),i=new AbortController,a=async()=>{await Ii(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 Ei(t);if(!e)return;console.info(`Started maintenance server on port ${t}.`),await Mi(e)}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;throw e}finally{s(),await a()}}async function Ei(e){for(let t=1;t<=5;t++){let n=Ai();try{return await ji(n,e,Oi),n}catch(r){await Ni(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}Di(e,i)}}throw Error(`Unreachable maintenance server startup state.`)}function Di(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 Oi(e){console.error(p.red(`Maintenance server error: ${e.message}`)),process.exit(1)}async function ki(e,t){await Fi(e,t),await pi(t,e),console.info(`Stopped maintenance server on port ${t}.`)}function Ai(){return S.createServer((e,t)=>{t.writeHead(503,{"cache-control":`no-store`,"content-type":`text/html; charset=utf-8`}),t.end(`<!doctype html>
|
|
34
34
|
<html lang="ja">
|
|
35
35
|
<head>
|
|
36
36
|
<meta charset="utf-8">
|
|
@@ -72,8 +72,8 @@ const z=[...`0123456789abcdef`],Se=[6,1536,393216,100663296],B=[0,8,16,24],Ce=[1
|
|
|
72
72
|
<p>皆様にはご不便をおかけしますが、メンテナンス終了までしばらくお待ちください。</p>
|
|
73
73
|
</main>
|
|
74
74
|
</body>
|
|
75
|
-
</html>`)})}async function
|
|
76
|
-
`)){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 Fi(r,i,a,o){let s=await Ii(r,i,a),c=(await Ri(r,`${r.registryUrl}/${Vi(i)}/${s}`)).dist?.tarball;if(!c)throw Error(`No tarball URL for ${i}@${s} in ${r.registryUrl}.`);let l=await zi(r,c),u=t.join(await e.promises.mkdtemp(t.join(m.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}),n.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 Ii(e,t,n){if(Ui(n))return n;let r=Li(n,await Ri(e,`${e.registryUrl}/${Vi(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 Li(e,t){return e!==`*`&&T.validRange(e)?T.maxSatisfying(Object.keys(t.versions??{}),e)??void 0:t[`dist-tags`]?.[e===`*`?`latest`:e]}async function Ri(e,t){return await(await zi(e,t)).json()}async function zi(e,t){let n=!!e.authToken&&Bi(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 Bi(e,t){try{return new URL(e).origin===new URL(t).origin}catch{return!1}}function Vi(e){return e.replace(`/`,`%2F`)}const Hi=/^(?: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 Ui(e){return!!e&&Hi.test(e)}function Wi(e,t){return e===void 0||t===void 0||!T.validRange(e)||!T.validRange(t)?!1:T.subset(e,t)}function Gi(e,t){return!T.validRange(e)||T.satisfies(t,e)}function*Ki(e,t){for(let n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const qi=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Ji=/\.(?:sqlite3?|db)(?:[-.](?:journal|shm|wal))?$/i,Yi=[`.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`],Xi=[`**/*.pyc`,`**/*.tsbuildinfo`,`**/__pycache__`],Zi=[`prisma`,`db`,`drizzle`],Qi=[`/data`],$i={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(r){let i=await U(r);i||(console.error(f.red(`No project found.`)),process.exit(1));let a=[];for(let n of Ki(`optimizeForDockerBuild`,i.descendants)){let i=n.packageJson;ea(n,i);let o=sa(r,i);if(la(i,{removeWbPostinstall:!r.outside&&o.includes(`@willbooster/wb`)}),ua(i),r.dryRun)continue;let s=r.outside?t.join(n.dirPath,`dist`):n.dirPath;await e.promises.mkdir(s,{recursive:!0}),await e.promises.writeFile(t.join(s,`package.json`),JSON.stringify(i),`utf8`),r.outside&&await aa(t.join(s,`bash`)),a.push(n)}!r.dryRun&&!r.outside&&(n.spawnSync(i.root.packageManagerCommand,[`install`],{stdio:`inherit`}),console.info(`Installed dependencies.`),await da(a))}};function ea(e,t){return ta(e.rootDirPath,e.dirPath,t)}function ta(e,t,n){let r=[];for(let i of qi){let a=n[i]??{};for(let[n,o]of Object.entries(a))if(ji(o))a[n]=na(e,t,`@willbooster`,n),r.push(`${i}.${n}`);else if(Mi(n,o)){let s=ia(e,n);if(s===void 0){console.warn(f.yellow(`${n} is not materialized under ${Y}/; run \`wb setup-private-packages\` so the Docker build does not need registry credentials.`));continue}Gi(o,s)||(console.error(f.red(`Materialized ${n} is ${s} but package.json requires ${o}; rerun \`wb setup-private-packages\`.`)),process.exit(1)),a[n]=na(e,t,Y,n),r.push(`${i}.${n}`)}}return console.info(`Rewrote private dependencies:`,r.join(`, `)||`none`),r}function na(e,n,r,i){let a=t.join(e,r,ra(i)),o=t.relative(n,a);return o.startsWith(`.`)?o:`./${o}`}function ra(e){return e.replace(/^@willbooster(?:-private)?\//,``)}function ia(n,r){let i=t.join(n,Y,ra(r),`package.json`);try{return JSON.parse(e.readFileSync(i,`utf8`)).version}catch{return}}async function aa(n){let r=oa();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 oa(){let n=t.dirname(w(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 sa(e,t){if(e.outside)return ca(t);let n=Object.keys(t.devDependencies??{});return delete t.devDependencies,console.info(`Removed all devDependencies.`),n}function ca(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 la(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 ua(e){delete e.private,delete e.publishConfig,delete e.prettier}async function da(e){for(let t of e)await fa(t),await ha(t),ja(t)}async function fa(e){let t=[...await pa(e),...await ma(e)];console.info(`Removed Docker build caches:`,t.join(`, `)||`none`)}async function pa(n){let r=[];for(let i of Yi){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 ma(n){let r=await p(Xi,{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 ha(e){let t=(await Promise.all([ga(e),va(e)])).flat();console.info(`Removed generated local data:`,t.join(`, `)||`none`)}async function ga(n){let r=_a(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 _a(e){let n=Zi.map(e=>t.join(e,`mount`)),r=Ye(e);if(!r)return n;let i=t.dirname(r);if(t.basename(i)!==`mount`||!Ea(e,i))return n;let a=t.relative(e.dirPath,i);return a?[...new Set([...n,a])]:n}async function va(e){return(await Promise.all([ya(e),xa(e)])).flat()}async function ya(e){let t=await ba(e);return(await Promise.all(t.map(t=>Aa(e,t)))).flat()}async function ba(e){let n=Zi.map(n=>t.join(e.dirPath,n)),r=await Promise.all(n.map(e=>ka(e)));return n.filter((e,t)=>r[t])}async function xa(n){let r=Sa(n),i=[];for(let a of r)for(let r of Ta(a))await Oa(r)&&(await e.promises.rm(r,{force:!0}),i.push(t.relative(n.dirPath,r)));return i}function Sa(e){let n=Je(e),r=Ye(e);if(!n||!r)return[];let i=t.isAbsolute(n)?[n]:[r,...Zi.map(r=>t.resolve(e.dirPath,r,n))];return[...new Set(i)].filter(t=>Ca(e,t))}function Ca(e,t){return Ea(e,t)||wa(e,t)}function wa(e,n){return Da(e)?Qi.some(e=>{let r=t.relative(e,n);return r!==``&&r!==`..`&&!r.startsWith(`../`)}):!1}function Ta(e){return[e,`${e}-journal`,`${e}-shm`,`${e}-wal`,`${e}.journal`,`${e}.shm`,`${e}.wal`]}function Ea(e,n){let r=t.relative(e.dirPath,n);return r===``||r!==`..`&&!r.startsWith(`..${t.sep}`)}function Da(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}async function Oa(t){try{return(await e.promises.stat(t)).isFile()}catch{return!1}}async function ka(t){try{return(await e.promises.stat(t)).isDirectory()}catch{return!1}}async function Aa(n,r){let i=(await e.promises.readdir(r,{withFileTypes:!0})).filter(e=>e.isFile()&&Ji.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 ja(r){if(!Da(r))return;let i=t.join(r.dirPath,`bash`,`cleanup.sh`);if(e.existsSync(i)&&n.spawnSync(`bash`,[i,`--keep-scripts`],{cwd:r.dirPath,stdio:`inherit`}).status!==0)throw Error(`Failed to run ${t.relative(r.dirPath,i)}`)}const X={},Ma={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(Na).command(Pa).command(Fa).command(Ia).command(La).command(za).command(Ba).command(Wa).command(Ga).command(Ka).command(qa).command(Ja).command(Ya).demandCommand().strict(!1),handler(){}},Na={command:`cleanup-litestream`,describe:`Clean up temporal Litestream files`,builder:X,async handler(e){let t=await Z(e);for(let{orm:n,project:r}of $(`db cleanup-litestream`,t))await W(Q(n).cleanUpLitestream(r),r,e)}},Pa={command:`create-litestream-config`,describe:`Create Litestream configuration file`,builder:{...X,output:{description:`Output path of the Litestream configuration file.`,type:`string`,default:`/etc/litestream.yml`}},async handler(e){let t=await Z(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 $(`db create-litestream-config`,t))Za(r,n,e.output)}},Fa={command:`deploy`,describe:`Apply migration to DB without initializing it`,builder:X,async handler(e){let t=await Z(e),n=eo(e);for(let{orm:r,project:i}of $(`db deploy`,t))await W(Xa(r,i,Q(r).deploy(i,n)),i,e)}},Ia={command:`deploy-force`,describe:`Force to apply migration to DB utilizing Litestream's backup without initializing it`,builder:X,async handler(e){let t=await Z(e);for(let{orm:n,project:r}of $(`db deploy-force`,t))await W(Q(n).deployForce(r),r,e)}},La={command:`generate`,describe:`Generate ORM client code`,builder:X,async handler(e){let t=await Z(e),n=eo(e);for(let{orm:r,project:i}of $(`db generate`,t))await W(Q(r).generate(i,n),i,e)}},Ra={...X,config:{description:`Path of the Litestream configuration file.`,type:`string`}},za={command:`list-backups`,describe:`List Litestream backups`,builder:Ra,async handler(e){let t=await Z(e);for(let{orm:n,project:r}of $(`db list-backups`,t))await W(Q(n).listBackups(r,e.config),r,e)}},Ba={command:`migrate`,describe:`Apply migration to DB with initializing it`,builder:{...X,"check-idempotency":{description:`Run the migration command twice to confirm it is idempotent.`,type:`boolean`}},async handler(e){let t=await Z(e),n=eo(e,[`check-idempotency`]);for(let{orm:r,project:i}of $(`db migrate`,t)){let t=Q(r);await W(Xa(r,i,t.migrate(i,n)),i,e),Va(i,e.checkIdempotency)&&(Ua(i)?console.info(f.yellow(`Skipping idempotency check for ${i.name} in production environment.`)):await W(Xa(r,i,t.deploy(i,n)),i,e))}}};function Va(e,t){return t??Ha(e)}function Ha(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}function Ua(e){return Xe(e,`production`)}const Wa={command:`migrate-dev`,describe:`Create a migration file`,builder:X,async handler(e){let t=await Z(e),n=eo(e);for(let{orm:r,project:i}of $(`db migrate-dev`,t))await W(Q(r).migrateDev(i,n),i,e)}},Ga={command:`reset`,describe:`Reset DB`,builder:X,async handler(e){let t=await Z(e),n=eo(e);for(let{orm:r,project:i}of $(`db reset`,t))await W(Xa(r,i,Q(r).reset(i,n)),i,e);if(process.env.WB_ENV!==`test`){process.env.WB_ENV=`test`;for(let{orm:t,project:r}of $(`WB_ENV=test db reset`,await Z(e)))await W(Xa(t,r,Q(t).reset(r,n)),r,e)}}},Ka={command:`restore`,describe:`Restore DB from Litestream's backup`,builder:{...Ra,output:{description:`Output path of the restored database. Defaults to "<db|drizzle|prisma>/restored.sqlite3".`,type:`string`}},async handler(e){let t=await Z(e);for(let{orm:n,project:r}of $(`db restore`,t)){let t=e.output??Qa(r,n);await W(Q(n).restore(r,t,e.config),r,e)}}},qa={command:`seed`,describe:`Populate DB with seed data`,builder:{...X,file:{alias:`f`,description:`Path of the seed script.`,type:`string`}},async handler(e){let t=await Z(e);for(let{orm:n,project:r}of $(`db seed`,t))await W(Xa(n,r,Q(n).seed(r,e.file)),r,e)}},Ja={command:`studio [db-url-or-path]`,describe:`Open database studio`,builder:{...X,"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 Z(e),n=eo(e,[`db-url-or-path`,`restored`]);for(let{orm:r,project:i}of $(`db studio`,t)){let t=e.restored?i.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:e.dbUrlOrPath?.toString();await W(Xa(r,i,Q(r).studio(i,t,n)),i,e)}}},Ya={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 Z(e),n=[(e.args?.join(` `)??``).trimEnd(),eo(e,[`args`])].filter(Boolean).join(` `);for(let{orm:r,project:i}of $(`db ${n}`,t))await W(Xa(r,i,r===`prisma`?`PRISMA ${n}`:$t(i,n)),i,e)}};function Xa(e,t,n){return e===`drizzle`?Wt(t,n):n}function Za(t,n,r){let i=$a(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:
|
|
75
|
+
</html>`)})}async function ji(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 Mi(e){await new Promise(t=>{let n=()=>{process.off(`SIGINT`,n),process.off(`SIGTERM`,n),process.off(`SIGQUIT`,n),(async()=>{try{await Ni(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 Ni(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 Pi(e,n){let r=Ri(e,n);return await b.mkdir(t.dirname(r),{recursive:!0}),await b.writeFile(r,`${process.pid}\n`,`utf8`),r}async function Fi(e,t){let n=Ri(e,t),r=await Li(n);if(r!==void 0&&r!==process.pid){try{F(r,`SIGTERM`)}catch{}await gi(r)}await Ii(n,r)}async function Ii(e,t){t!==void 0&&await Li(e)!==t||await b.rm(e,{force:!0})}async function Li(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 Ri(e,t){return zi(e.rootDirPath,t)}function zi(e,n){return t.join(e,`.wb`,`maintenance-${n}.pid`)}const q=`@willbooster-private`,Bi=[`git:`,`git+`,`git@`,`file:`,`link:`,`workspace:`,`http:`,`https:`,`portal:`,`patch:`],Vi=/^git@github\.com:(?:WillBooster|WillBoosterLab)\/[^/#]+(?:\.git)?(?:#.*)?$/;function Hi(e){return typeof e==`string`&&Vi.test(e)}function Ui(e,t){return e.startsWith(`@willbooster-private/`)&&typeof t==`string`&&!Bi.some(e=>t.startsWith(e))}function Wi(n){let r={};for(let i of[t.join(h.homedir(),`.npmrc`),t.join(n,`.npmrc`)])try{Object.assign(r,Gi(e.readFileSync(i,`utf8`)))}catch{}let i=r[`${q}: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 Gi(e){let t={};for(let n of e.split(`
|
|
76
|
+
`)){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 Ki(n,i,a,o){let s=await qi(n,i,a),c=(await Yi(n,`${n.registryUrl}/${Qi(i)}/${s}`)).dist?.tarball;if(!c)throw Error(`No tarball URL for ${i}@${s} in ${n.registryUrl}.`);let l=await Xi(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 qi(e,t,n){if(ea(n))return n;let r=Ji(n,await Yi(e,`${e.registryUrl}/${Qi(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 Ji(e,t){return e!==`*`&&E.validRange(e)?E.maxSatisfying(Object.keys(t.versions??{}),e)??void 0:t[`dist-tags`]?.[e===`*`?`latest`:e]}async function Yi(e,t){return await(await Xi(e,t)).json()}async function Xi(e,t){let n=!!e.authToken&&Zi(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 Zi(e,t){try{return new URL(e).origin===new URL(t).origin}catch{return!1}}function Qi(e){return e.replace(`/`,`%2F`)}const $i=/^(?: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 ea(e){return!!e&&$i.test(e)}function ta(e,t){return e===void 0||t===void 0||!E.validRange(e)||!E.validRange(t)?!1:E.subset(e,t)}function na(e,t){return!E.validRange(e)||E.satisfies(t,e)}function*ra(e,t){for(let n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ia=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],aa=/\.(?:sqlite3?|db)(?:[-.](?:journal|shm|wal))?$/i,oa=[`.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`],sa=[`**/*.pyc`,`**/*.tsbuildinfo`,`**/__pycache__`],ca=[`prisma`,`db`,`drizzle`],la=[`/data`],ua={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 B(n);i||(console.error(p.red(`No project found.`)),process.exit(1));let a=[];for(let r of ra(`optimizeForDockerBuild`,i.descendants)){let i=r.packageJson;da(r,i);let o=va(n,i);if(ba(i,{removeWbPostinstall:!n.outside&&o.includes(`@willbooster/wb`)}),xa(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 ga(t.join(s,`bash`)),a.push(r)}!n.dryRun&&!n.outside&&(r.spawnSync(i.root.packageManagerCommand,[`install`],{stdio:`inherit`}),console.info(`Installed dependencies.`),await Sa(a))}};function da(e,t){return fa(e.rootDirPath,e.dirPath,t)}function fa(e,t,n){let r=[];for(let i of ia){let a=n[i]??{};for(let[n,o]of Object.entries(a))if(Hi(o))a[n]=pa(e,t,`@willbooster`,n),r.push(`${i}.${n}`);else if(Ui(n,o)){let s=ha(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}na(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]=pa(e,t,q,n),r.push(`${i}.${n}`)}}return console.info(`Rewrote private dependencies:`,r.join(`, `)||`none`),r}function pa(e,n,r,i){let a=t.join(e,r,ma(i)),o=t.relative(n,a);return o.startsWith(`.`)?o:`./${o}`}function ma(e){return e.replace(/^@willbooster(?:-private)?\//,``)}function ha(n,r){let i=t.join(n,q,ma(r),`package.json`);try{return JSON.parse(e.readFileSync(i,`utf8`)).version}catch{return}}async function ga(n){let r=_a();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 _a(){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 va(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 ba(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 xa(e){delete e.private,delete e.publishConfig,delete e.prettier}async function Sa(e){for(let t of e)await Ca(t),await Ea(t),Ha(t)}async function Ca(e){let t=[...await wa(e),...await Ta(e)];console.info(`Removed Docker build caches:`,t.join(`, `)||`none`)}async function wa(n){let r=[];for(let i of oa){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 Ta(n){let r=await m(sa,{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 Ea(e){let t=(await Promise.all([Da(e),ka(e)])).flat();console.info(`Removed generated local data:`,t.join(`, `)||`none`)}async function Da(n){let r=Oa(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 Oa(e){let n=ca.map(e=>t.join(e,`mount`)),r=ot(e);if(!r)return n;let i=t.dirname(r);if(t.basename(i)!==`mount`||!La(e,i))return n;let a=t.relative(e.dirPath,i);return a?[...new Set([...n,a])]:n}async function ka(e){return(await Promise.all([Aa(e),Ma(e)])).flat()}async function Aa(e){let t=await ja(e);return(await Promise.all(t.map(t=>Va(e,t)))).flat()}async function ja(e){let n=ca.map(n=>t.join(e.dirPath,n)),r=await Promise.all(n.map(e=>Ba(e)));return n.filter((e,t)=>r[t])}async function Ma(n){let r=Na(n),i=[];for(let a of r)for(let r of Ia(a))await za(r)&&(await e.promises.rm(r,{force:!0}),i.push(t.relative(n.dirPath,r)));return i}function Na(e){let n=at(e),r=ot(e);if(!n||!r)return[];let i=t.isAbsolute(n)?[n]:[r,...ca.map(r=>t.resolve(e.dirPath,r,n))];return[...new Set(i)].filter(t=>Pa(e,t))}function Pa(e,t){return La(e,t)||Fa(e,t)}function Fa(e,n){return Ra(e)?la.some(e=>{let r=t.relative(e,n);return r!==``&&r!==`..`&&!r.startsWith(`../`)}):!1}function Ia(e){return[e,`${e}-journal`,`${e}-shm`,`${e}-wal`,`${e}.journal`,`${e}.shm`,`${e}.wal`]}function La(e,n){let r=t.relative(e.dirPath,n);return r===``||r!==`..`&&!r.startsWith(`..${t.sep}`)}function Ra(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}async function za(t){try{return(await e.promises.stat(t)).isFile()}catch{return!1}}async function Ba(t){try{return(await e.promises.stat(t)).isDirectory()}catch{return!1}}async function Va(n,r){let i=(await e.promises.readdir(r,{withFileTypes:!0})).filter(e=>e.isFile()&&aa.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 Ha(n){if(!Ra(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={},Ua={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(Wa).command(Ga).command(Ka).command(qa).command(Ja).command(Xa).command(Za).command(to).command(no).command(ro).command(io).command(ao).command(oo).demandCommand().strict(!1),handler(){}},Wa={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 V(X(n).cleanUpLitestream(r),r,e)}},Ga={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))co(r,n,e.output)}},Ka={command:`deploy`,describe:`Apply migration to DB without initializing it`,builder:J,async handler(e){let t=await Y(e),n=fo(e);for(let{orm:r,project:i}of Z(`db deploy`,t))await V(so(r,i,X(r).deploy(i,n)),i,e)}},qa={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 V(X(n).deployForce(r),r,e)}},Ja={command:`generate`,describe:`Generate ORM client code`,builder:J,async handler(e){let t=await Y(e),n=fo(e);for(let{orm:r,project:i}of Z(`db generate`,t))await V(X(r).generate(i,n),i,e)}},Ya={...J,config:{description:`Path of the Litestream configuration file.`,type:`string`}},Xa={command:`list-backups`,describe:`List Litestream backups`,builder:Ya,async handler(e){let t=await Y(e);for(let{orm:n,project:r}of Z(`db list-backups`,t))await V(X(n).listBackups(r,e.config),r,e)}},Za={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=fo(e,[`check-idempotency`]);for(let{orm:r,project:i}of Z(`db migrate`,t)){let t=X(r);await V(so(r,i,t.migrate(i,n)),i,e),Qa(i,e.checkIdempotency)&&(eo(i)?console.info(p.yellow(`Skipping idempotency check for ${i.name} in production environment.`)):await V(so(r,i,t.deploy(i,n)),i,e))}}};function Qa(e,t){return t??$a(e)}function $a(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}function eo(e){return st(e,`production`)}const to={command:`migrate-dev`,describe:`Create a migration file`,builder:J,async handler(e){let t=await Y(e),n=fo(e);for(let{orm:r,project:i}of Z(`db migrate-dev`,t))await V(X(r).migrateDev(i,n),i,e)}},no={command:`reset`,describe:`Reset DB`,builder:J,async handler(e){let t=await Y(e),n=fo(e);for(let{orm:r,project:i}of Z(`db reset`,t))await V(so(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 V(so(t,r,X(t).reset(r,n)),r,e)}}},ro={command:`restore`,describe:`Restore DB from Litestream's backup`,builder:{...Ya,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??lo(r,n);await V(X(n).restore(r,t,e.config),r,e)}}},io={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 V(so(n,r,X(n).seed(r,e.file)),r,e)}},ao={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=fo(e,[`db-url-or-path`,`restored`]);for(let{orm:r,project:i}of Z(`db studio`,t)){let t=e.restored?i.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:e.dbUrlOrPath?.toString();await V(so(r,i,X(r).studio(i,t,n)),i,e)}}},oo={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(),fo(e,[`args`])].filter(Boolean).join(` `);for(let{orm:r,project:i}of Z(`db ${n}`,t))await V(so(r,i,r===`prisma`?`PRISMA ${n}`:dn(i,n)),i,e)}};function so(e,t,n){return e===`drizzle`?nn(t,n):n}function co(t,n,r){let i=uo(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:
|
|
77
77
|
interval: 24h # Create a backup per day
|
|
78
78
|
retention: 72h # Keep backups for 3 days
|
|
79
79
|
dbs:
|
|
@@ -87,26 +87,26 @@ dbs:
|
|
|
87
87
|
access-key-id: ${a.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}
|
|
88
88
|
secret-access-key: ${a.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}
|
|
89
89
|
sync-interval: 1m
|
|
90
|
-
`;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 Qa(e,t){return t===`prisma`?e.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:`drizzle/restored.sqlite3`}function $a(e,t){if(t===`prisma`)return`${e.packageJson.dependencies?.blitz?`db`:`prisma`}/mount/prod.sqlite3`;let n=Ye(e);if(!n)throw Error(`wb db create-litestream-config for Drizzle requires file: DATABASE_URL.`);return n}async function Z(e,t){let n=await U(e);n||(console.error(f.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(f.red(t?`No ${t} project found.`:`No supported database ORM project found.`)),process.exit(1)),r}function Q(e){return e===`prisma`?$n:vn}function*$(e,t){let n=new Map(t.map(e=>[e.project,e]));for(let r of Ki(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 eo(e,t=[]){let n=[],r=Object.keys(St),i=Object.values(St).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 q([...n,...o])}const to={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 no(e)}};async function no(e,n){let r=Ze(e,!1,n);r||(console.error(f.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&&L(s.current.pid,e)}catch(t){console.error(f.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 io(i)?await co(i,e,a,s):console.info(f.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 yo(i,e,s),d=u===0}catch(e){console.error(f.red(String(e instanceof Error?e.message:e))),u=1}finally{let e=[];for(let[t,n]of a)fo(t,n,d)&&e.push(t);e.length>0&&console.info(f.cyan(`Restored ${e.map(e=>t.relative(i.dirPath,e)).join(`, `)}.`)),[...a.keys()].some(e=>t.basename(e)===`bunfig.toml`)&&!ze(i.env.CI)&&console.info(f.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 ro(e,t,r,i){return await new Promise(a=>{let o=n.spawn(t,r,i);e.current=o,o.on(`error`,t=>{e.current=void 0,console.error(f.red(String(t))),a(1)}),o.on(`exit`,t=>{e.current=void 0,a(t??1)})})}async function io(e){let t=so(e.dirPath,e.packageJson);if(!Array.isArray(t)||ao(t))return!0;for(let t of await bo(e)){let e=so(t,void 0);if(e===`unknown`||Array.isArray(e)&&ao(e))return!0}return!1}function ao(e){return e.some(e=>(Array.isArray(e)?e[0]:e)===`@semantic-release/npm`)}const oo=[{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 so(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 oo){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 co(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:po(s);if(s!==void 0&&c!==s&&(console.info(f.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 bo(n)].map(e=>t.join(e,`node_modules`));for(let t of r)e.rmSync(t,{force:!0,recursive:!0});if(await ro(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 ro(a,`bun`,[`install`],{cwd:n.dirPath,env:uo(n.env),stdio:`inherit`})!==0)throw Error(`bun install failed while replaying lifecycle scripts for the release.`)}let l=await bo(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=mo(o);s!==o&&(console.info(f.cyan(`Rewriting workspace: ranges in ${t.relative(n.dirPath,a)}...`)),r.dryRun||e.writeFileSync(a,s,`utf8`))}}const lo=[`VERDACCIO_TOKEN`,`NPM_TOKEN`,`NODE_AUTH_TOKEN`,`GITHUB_TOKEN`,`GH_TOKEN`,`GH_PACKAGES_TOKEN`,`GH_PKG_READ_TOKEN`,`FNOX_AGE_KEY`];function uo(e){let t={...e};for(let e of lo)e in t&&(t[e]=``);return t}function fo(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!==mo(i)){let r=ho(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 po(e){return e.replace(/^(\s*linker\s*=\s*)["']isolated["']/mu,`$1"hoisted"`).replace(/^\s*globalStore\s*=\s*true[^\n]*\n?/mu,``)}function mo(e){return go(e,e=>e.replaceAll(/("[^"\n]+"\s*:\s*)"workspace:[^"]*"/gu,`$1"*"`))}function ho(e,t){let n=_o(t);return go(e,(e,t)=>{let r=e;for(let{section:e,name:i,specifier:a}of n)e===t&&(r=r.replaceAll(RegExp(`("${vo(i)}"\\s*:\\s*)"[^"]*"`,`gu`),(e,t)=>`${t}${JSON.stringify(a)}`));return r})}function go(e,t){return e.replaceAll(/("(dependencies|devDependencies|optionalDependencies|peerDependencies)"\s*:\s*\{)([^{}]*)(\})/gu,(e,n,r,i,a)=>`${n}${t(i,r)}${a}`)}function _o(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 vo(e){return e.replaceAll(/[$()*+.?[\\\]^{|}]/g,String.raw`\$&`)}async function yo(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};Re(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(f.cyan(`Running: ${d.join(` `)}`)),r.dryRun?0:await ro(i,d[0],d.slice(1),{cwd:n.dirPath,env:c,stdio:`inherit`})}async function bo(e){let n=e.packageJson.workspaces,r=Array.isArray(n)?n:n?.packages??[];return r.length===0?[]:(await p(r,{cwd:e.dirPath,onlyDirectories:!0})).map(n=>t.join(e.dirPath,n))}const xo={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=H(e);t||(console.error(f.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${f.yellow(`#${i} Retrying: ${n.join(` `)}`)}`),r=await W(n.join(` `),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),r===0)return;process.exit(r)}},So={command:`setup`,describe:`Setup development environment. .env files are ignored.`,builder:{},async handler(e){await Co(e)}};async function Co(e,t){let r=await U(e,!1,t);r||(console.error(f.red(`No project found.`)),process.exit(1));for(let t of Ki(`setup`,r.descendants)){let i=await y.readdir(t.dirPath,{withFileTypes:!0});if(t===r.root&&(m.platform()===`darwin`&&await G(`brew install ${[`pstree`].join(` `)}`,t,e),i.some(e=>e.isFile()&&e.name.includes(`-version`))&&await W(`asdf install`,t,e,{exitIfFailed:!1})),i.some(e=>e.isFile()&&e.name===`pyproject.toml`)){await G(`poetry config virtualenvs.in-project true`,t,e);let[,r]=n.execSync(`asdf current python`).toString().trim().split(/\s+/);await G(`poetry env use ${r}`,t,e),await ht.promiseAll(),await W(`poetry run pip install --upgrade pip`,t,e),await W(`poetry install --ansi`,t,e)}(t===r.root||!r.root.packageJson.scripts?.[`gen-code`])&&t.packageJson.scripts?.[`gen-code`]&&await W(`${t.packageManagerRunCommand} gen-code`,t,e)}let i=r.descendants.find(e=>e.packageJson.devDependencies?.playwright);i&&await W(`${i.packageManagerRunCommand} playwright install --with-deps`,i,e)}const wo=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],To={command:`setup-private-packages`,describe:"Materialize private dependencies for Docker builds: copy git dependencies and download @willbooster-private/* registry packages (auth via .npmrc / ~/.npmrc locally, or VERDACCIO_TOKEN on CI). 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(n){let r=Ze(n,!1);r||(console.error(f.red(`No project found.`)),process.exit(1));let i=t.resolve(r.root.dirPath,n.outDir);Mo(r.root.dirPath,i);let a=t.join(r.root.dirPath,Y);Ao(i,a)&&(console.error(f.red(`--out-dir must not overlap the ${Y} registry output directory.`)),process.exit(1)),t.relative(r.root.dirPath,i)!==`@willbooster`&&console.warn(f.yellow(`Note: wb optimizeForDockerBuild rewrites git dependencies to <root>/@willbooster; a custom --out-dir requires a matching Dockerfile layout.`));let o=await Eo(r.root.dirPath,r.root.packageJson,i,a);if(n.dryRun){Vo(i,o);return}let s=[...o.values()].filter(e=>e.kind===`git`),c=[...o.values()].filter(e=>e.kind===`registry`),l=c.length>0?Ni(r.root.dirPath):void 0;c.length>0&&!l&&(console.error(f.red(`No registry configured for the ${Y} scope; add "${Y}:registry=..." to .npmrc or ~/.npmrc.`)),process.exit(1)),await e.promises.rm(i,{recursive:!0,force:!0}),await e.promises.mkdir(i,{recursive:!0});for(let e of s)await Oo(r.root.dirPath,e);if(l){let n=t.join(r.root.dirPath,`.tmp`,`wb-private-registry-staging`),s=e=>t.join(n,t.relative(a,e));await e.promises.rm(n,{recursive:!0,force:!0}),await e.promises.mkdir(n,{recursive:!0});try{for(let e of c)await Fi(l,e.name,e.versionSpecifier??`latest`,s(e.targetDirPath)),console.info(`Downloaded ${e.name} to ${t.relative(r.root.dirPath,e.targetDirPath)}`),await Do(r.root.dirPath,l,e,o,i,a,s);await e.promises.rm(a,{recursive:!0,force:!0}),await e.promises.rename(n,a)}catch(t){throw await e.promises.rm(n,{recursive:!0,force:!0}),t}}else await e.promises.rm(a,{recursive:!0,force:!0}),await e.promises.mkdir(a,{recursive:!0});await Io(r.root.dirPath,o),console.info(`Ensure the Dockerfile COPYs ${t.relative(r.root.dirPath,i)}/ and ${Y}/ into the image before installing dependencies.`)}};async function Eo(e,t,n,r){let i=new Map,a=Po(t,n,r),o=new Map(a.map(e=>[e.name,e]));for(let t=0;t<a.length;t++){let s=a[t];if(s&&!i.has(s.name)){if(s.kind===`git`){s.sourceDirPath=No(e,s.name);for(let e of await Ro(s.sourceDirPath)){let t=await zo(e);for(let e of Po(t,n,r)){let t=o.get(e.name);t?ko(t,e,s.name):(o.set(e.name,e),a.push(e))}}}i.set(s.name,s)}}return i}async function Do(e,t,n,r,i,a,o){let s=n.kind===`registry`?o(n.targetDirPath):n.targetDirPath;for(let c of await Ro(s))for(let s of Po(await zo(c),i,a)){let c=r.get(s.name);if(c){ko(c,s,n.name);continue}s.kind===`git`?(s.sourceDirPath=No(e,s.name),await Oo(e,s)):(await Fi(t,s.name,s.versionSpecifier??`latest`,o(s.targetDirPath)),console.info(`Downloaded ${s.name} (nested dependency) to ${s.targetDirPath}`)),r.set(s.name,s),await Do(e,t,s,r,i,a,o)}}async function Oo(n,r){await e.promises.cp(r.sourceDirPath,r.targetDirPath,{recursive:!0,force:!0,dereference:!0,filter:e=>{let n=t.relative(r.sourceDirPath,e).split(t.sep);return!n.includes(`node_modules`)&&!n.includes(`.git`)}}),console.info(`Copied ${r.name} to ${t.relative(n,r.targetDirPath)}`)}function ko(e,t,n){if(!(e.kind===t.kind&&(e.versionSpecifier===t.versionSpecifier||Wi(e.versionSpecifier,t.versionSpecifier))))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 Ao(e,t){return jo(e,t)||jo(t,e)}function jo(e,n){let r=t.relative(e,n);return r===``||!r.startsWith(`..`)&&!t.isAbsolute(r)}function Mo(e,n){let r=t.relative(e,n);r&&!r.startsWith(`..`)&&!t.isAbsolute(r)||(console.error(f.red(`Output directory must be a subdirectory of the project root: ${n}`)),process.exit(1))}function No(n,r){let i=Bo(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 Po(e,n,r){let i=new Map;for(let a of wo){let o=e[a];if(o)for(let[e,a]of Object.entries(o)){let o=ji(a);if(!o&&!Mi(e,a))continue;if(o&&!e.startsWith(`@willbooster/`))throw Error(`Private git dependency must be an @willbooster package: ${e}`);let s=Bo(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,targetDirPath:t.join(o?n:r,s),versionSpecifier:a},l=i.get(e);i.set(e,l?Fo(l,c):c)}}return[...i.values()]}function Fo(e,t){if(e.kind===t.kind){if(e.versionSpecifier===t.versionSpecifier||Wi(e.versionSpecifier,t.versionSpecifier))return e;if(Wi(t.versionSpecifier,e.versionSpecifier))return t}throw Error(`Conflicting requirements for ${e.name} within one manifest: ${e.versionSpecifier??e.kind} vs ${t.versionSpecifier??t.kind}.`)}async function Io(n,r){for(let i of r.values())for(let a of await Ro(i.targetDirPath)){let i=await zo(a);Lo(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 Lo(e,n,r){let i=!1;for(let a of wo){let o=n[a];if(o)for(let[n,a]of Object.entries(o)){if(!ji(a)&&!Mi(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 Ro(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 Ro(e));continue}i.isFile()&&i.name===`package.json`&&r.push(e)}return r}async function zo(t){return JSON.parse(await e.promises.readFile(t,`utf8`))}function Bo(e){return e.replace(/^@willbooster(?:-private)?\//,``)}function Vo(e,t){console.info(`[dry-run] Would recreate ${e}`);for(let e of t.values())console.info(e.kind===`git`?`[dry-run] Would copy ${e.name}: ${e.sourceDirPath??`(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 Ho={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 Uo(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e[`--`]??[]].map(e=>J(String(e))).join(` `),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>J(String(e))).join(` `)}function Wo(e){return e.silent?` > /dev/null`:``}const Go=new class{buildImage(e,n){let r=e.dockerPackageJson.scripts?.[`docker/build/prepare`]?`YARN run docker/build/prepare && `:``,i=e.env.MISE_AGE_KEY?`
|
|
90
|
+
`;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 lo(e,t){return t===`prisma`?e.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:`drizzle/restored.sqlite3`}function uo(e,t){if(t===`prisma`)return`${e.packageJson.dependencies?.blitz?`db`:`prisma`}/mount/prod.sqlite3`;let n=ot(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 B(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`?ur:kn}function*Z(e,t){let n=new Map(t.map(e=>[e.project,e]));for(let r of ra(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 fo(e,t=[]){let n=[],r=Object.keys(Pt),i=Object.values(Pt).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 W([...n,...o])}const po={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 mo(e)}};async function mo(e,n){let r=ct(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&&F(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 go(i)?await bo(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 Ao(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)Co(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`)&&!Xe(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 ho(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 go(e){let t=yo(e.dirPath,e.packageJson);if(!Array.isArray(t)||_o(t))return!0;for(let t of await dt(e)){let e=yo(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 vo=[{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 yo(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 vo){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 bo(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:wo(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 dt(n)].map(e=>t.join(e,`node_modules`));for(let t of r)e.rmSync(t,{force:!0,recursive:!0});if(await ho(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 ho(a,`bun`,[`install`],{cwd:n.dirPath,env:So(n.env),stdio:`inherit`})!==0)throw Error(`bun install failed while replaying lifecycle scripts for the release.`)}let l=await dt(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=To(o);s!==o&&(console.info(p.cyan(`Rewriting workspace: ranges in ${t.relative(n.dirPath,a)}...`)),r.dryRun||e.writeFileSync(a,s,`utf8`))}}const xo=[`VERDACCIO_TOKEN`,`NPM_TOKEN`,`NODE_AUTH_TOKEN`,`GITHUB_TOKEN`,`GH_TOKEN`,`GH_PACKAGES_TOKEN`,`GH_PKG_READ_TOKEN`,`FNOX_AGE_KEY`];function So(e){let t={...e};for(let e of xo)e in t&&(t[e]=``);return t}function Co(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!==To(i)){let r=Eo(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 wo(e){return e.replace(/^(\s*linker\s*=\s*)["']isolated["']/mu,`$1"hoisted"`).replace(/^\s*globalStore\s*=\s*true[^\n]*\n?/mu,``)}function To(e){return Do(e,e=>e.replaceAll(/("[^"\n]+"\s*:\s*)"workspace:[^"]*"/gu,`$1"*"`))}function Eo(e,t){let n=Oo(t);return Do(e,(e,t)=>{let r=e;for(let{section:e,name:i,specifier:a}of n)e===t&&(r=r.replaceAll(RegExp(`("${ko(i)}"\\s*:\\s*)"[^"]*"`,`gu`),(e,t)=>`${t}${JSON.stringify(a)}`));return r})}function Do(e,t){return e.replaceAll(/("(dependencies|devDependencies|optionalDependencies|peerDependencies)"\s*:\s*\{)([^{}]*)(\})/gu,(e,n,r,i,a)=>`${n}${t(i,r)}${a}`)}function Oo(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 ko(e){return e.replaceAll(/[$()*+.?[\\\]^{|}]/g,String.raw`\$&`)}async function Ao(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};Ye(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 ho(i,d[0],d.slice(1),{cwd:n.dirPath,env:c,stdio:`inherit`})}const jo={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=z(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 V(n.join(` `),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),r===0)return;process.exit(r)}},Mo={command:`setup`,describe:`Setup development environment. .env files are ignored.`,builder:{},async handler(e){await No(e)}};async function No(e,t){let n=await B(e,!1,t);n||(console.error(p.red(`No project found.`)),process.exit(1));for(let t of ra(`setup`,n.descendants)){let i=await b.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root&&(h.platform()===`darwin`&&await H(`brew install ${[`pstree`].join(` `)}`,t,e),i.some(e=>e.isFile()&&e.name.includes(`-version`))&&await V(`asdf install`,t,e,{exitIfFailed:!1})),i.some(e=>e.isFile()&&e.name===`pyproject.toml`)){await H(`poetry config virtualenvs.in-project true`,t,e);let[,n]=r.execSync(`asdf current python`).toString().trim().split(/\s+/);await H(`poetry env use ${n}`,t,e),await Dt.promiseAll(),await V(`poetry run pip install --upgrade pip`,t,e),await V(`poetry install --ansi`,t,e)}(t===n.root||!n.root.packageJson.scripts?.[`gen-code`])&&t.packageJson.scripts?.[`gen-code`]&&await V(`${t.packageManagerRunCommand} gen-code`,t,e)}let i=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);i&&await V(`${i.packageManagerRunCommand} playwright install --with-deps`,i,e)}const Po=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Fo={command:`setup-private-packages`,describe:"Materialize private dependencies for Docker builds: copy git dependencies and download @willbooster-private/* registry packages (auth via .npmrc / ~/.npmrc locally, or VERDACCIO_TOKEN on CI). 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(n){let r=ct(n,!1);r||(console.error(p.red(`No project found.`)),process.exit(1));let i=t.resolve(r.root.dirPath,n.outDir);Ho(r.root.dirPath,i);let a=t.join(r.root.dirPath,q);Bo(i,a)&&(console.error(p.red(`--out-dir must not overlap the ${q} registry output directory.`)),process.exit(1)),t.relative(r.root.dirPath,i)!==`@willbooster`&&console.warn(p.yellow(`Note: wb optimizeForDockerBuild rewrites git dependencies to <root>/@willbooster; a custom --out-dir requires a matching Dockerfile layout.`));let o=await Io(r.root.dirPath,r.root.packageJson,i,a);if(n.dryRun){Zo(i,o);return}let s=[...o.values()].filter(e=>e.kind===`git`),c=[...o.values()].filter(e=>e.kind===`registry`),l=c.length>0?Wi(r.root.dirPath):void 0;c.length>0&&!l&&(console.error(p.red(`No registry configured for the ${q} scope; add "${q}:registry=..." to .npmrc or ~/.npmrc.`)),process.exit(1)),await e.promises.rm(i,{recursive:!0,force:!0}),await e.promises.mkdir(i,{recursive:!0});for(let e of s)await Ro(r.root.dirPath,e);if(l){let n=t.join(r.root.dirPath,`.tmp`,`wb-private-registry-staging`),s=e=>t.join(n,t.relative(a,e));await e.promises.rm(n,{recursive:!0,force:!0}),await e.promises.mkdir(n,{recursive:!0});try{for(let e of c)await Ki(l,e.name,e.versionSpecifier??`latest`,s(e.targetDirPath)),console.info(`Downloaded ${e.name} to ${t.relative(r.root.dirPath,e.targetDirPath)}`),await Lo(r.root.dirPath,l,e,o,i,a,s);await e.promises.rm(a,{recursive:!0,force:!0}),await e.promises.rename(n,a)}catch(t){throw await e.promises.rm(n,{recursive:!0,force:!0}),t}}else await e.promises.rm(a,{recursive:!0,force:!0}),await e.promises.mkdir(a,{recursive:!0});await Ko(r.root.dirPath,o),console.info(`Ensure the Dockerfile COPYs ${t.relative(r.root.dirPath,i)}/ and ${q}/ into the image before installing dependencies.`)}};async function Io(e,t,n,r){let i=new Map,a=Wo(t,n,r),o=new Map(a.map(e=>[e.name,e]));for(let t=0;t<a.length;t++){let s=a[t];if(s&&!i.has(s.name)){if(s.kind===`git`){s.sourceDirPath=Uo(e,s.name);for(let e of await Jo(s.sourceDirPath)){let t=await Yo(e);for(let e of Wo(t,n,r)){let t=o.get(e.name);t?zo(t,e,s.name):(o.set(e.name,e),a.push(e))}}}i.set(s.name,s)}}return i}async function Lo(e,t,n,r,i,a,o){let s=n.kind===`registry`?o(n.targetDirPath):n.targetDirPath;for(let c of await Jo(s))for(let s of Wo(await Yo(c),i,a)){let c=r.get(s.name);if(c){zo(c,s,n.name);continue}s.kind===`git`?(s.sourceDirPath=Uo(e,s.name),await Ro(e,s)):(await Ki(t,s.name,s.versionSpecifier??`latest`,o(s.targetDirPath)),console.info(`Downloaded ${s.name} (nested dependency) to ${s.targetDirPath}`)),r.set(s.name,s),await Lo(e,t,s,r,i,a,o)}}async function Ro(n,r){await e.promises.cp(r.sourceDirPath,r.targetDirPath,{recursive:!0,force:!0,dereference:!0,filter:e=>{let n=t.relative(r.sourceDirPath,e).split(t.sep);return!n.includes(`node_modules`)&&!n.includes(`.git`)}}),console.info(`Copied ${r.name} to ${t.relative(n,r.targetDirPath)}`)}function zo(e,t,n){if(!(e.kind===t.kind&&(e.versionSpecifier===t.versionSpecifier||ta(e.versionSpecifier,t.versionSpecifier))))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 Bo(e,t){return Vo(e,t)||Vo(t,e)}function Vo(e,n){let r=t.relative(e,n);return r===``||!r.startsWith(`..`)&&!t.isAbsolute(r)}function Ho(e,n){let r=t.relative(e,n);r&&!r.startsWith(`..`)&&!t.isAbsolute(r)||(console.error(p.red(`Output directory must be a subdirectory of the project root: ${n}`)),process.exit(1))}function Uo(n,r){let i=Xo(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 Wo(e,n,r){let i=new Map;for(let a of Po){let o=e[a];if(o)for(let[e,a]of Object.entries(o)){let o=Hi(a);if(!o&&!Ui(e,a))continue;if(o&&!e.startsWith(`@willbooster/`))throw Error(`Private git dependency must be an @willbooster package: ${e}`);let s=Xo(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,targetDirPath:t.join(o?n:r,s),versionSpecifier:a},l=i.get(e);i.set(e,l?Go(l,c):c)}}return[...i.values()]}function Go(e,t){if(e.kind===t.kind){if(e.versionSpecifier===t.versionSpecifier||ta(e.versionSpecifier,t.versionSpecifier))return e;if(ta(t.versionSpecifier,e.versionSpecifier))return t}throw Error(`Conflicting requirements for ${e.name} within one manifest: ${e.versionSpecifier??e.kind} vs ${t.versionSpecifier??t.kind}.`)}async function Ko(n,r){for(let i of r.values())for(let a of await Jo(i.targetDirPath)){let i=await Yo(a);qo(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 qo(e,n,r){let i=!1;for(let a of Po){let o=n[a];if(o)for(let[n,a]of Object.entries(o)){if(!Hi(a)&&!Ui(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 Jo(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 Jo(e));continue}i.isFile()&&i.name===`package.json`&&r.push(e)}return r}async function Yo(t){return JSON.parse(await e.promises.readFile(t,`utf8`))}function Xo(e){return e.replace(/^@willbooster(?:-private)?\//,``)}function Zo(e,t){console.info(`[dry-run] Would recreate ${e}`);for(let e of t.values())console.info(e.kind===`git`?`[dry-run] Would copy ${e.name}: ${e.sourceDirPath??`(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 Qo={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 $o(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e[`--`]??[]].map(e=>G(String(e))).join(` `),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>G(String(e))).join(` `)}function es(e){return e.silent?` > /dev/null`:``}const Q=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
91
|
--secret id=mise_age_key,env=MISE_AGE_KEY`:``;return`cd ${t.dirname(e.findFile(`Dockerfile`))}
|
|
92
92
|
&& ${r}YARN wb optimizeForDockerBuild --outside
|
|
93
93
|
&& YARN wb retry -- docker build -t ${e.dockerImageName}
|
|
94
94
|
--build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)
|
|
95
95
|
--build-arg WB_ENV=${e.env.WB_ENV}
|
|
96
|
-
--build-arg WB_VERSION=${n}${i} .`}stopAndStart(e,t=``,n=``){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t=``,n=``){
|
|
97
|
-
&& ${
|
|
98
|
-
&& ${
|
|
99
|
-
&& ${s}${o}`])}testUnit(e,t){let n=t.targets?.map(String);return e.hasVitest?
|
|
100
|
-
||
|
|
101
|
-
||
|
|
102
|
-
||
|
|
103
|
-
||
|
|
104
|
-
||
|
|
105
|
-
|| wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}};function qo(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function Jo(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function Yo(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return Xo([...i,...e,...r],n);let o=e.slice(1),s=Zo(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return Xo([...i,`test`,...a,...c,...r],n)}function Xo(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=`))?q(e):q([...e,`--max-failures=1`])}function Zo(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;Qo.has(i)?t=`required`:$o.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&es.has(e)&&(t=`required`);continue}n.push(r)}return n}const Qo=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`]),$o=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),es=new Set([`-c`,`-g`,`-j`]),ts=new class extends Ko{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??``}`}};var ns=class extends Ko{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 Zr(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 q([`YARN`,`wb`,`concurrently`,...Ct(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${i} && ${c}${a}`])}};const rs=new ns,is=new class extends Ko{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()]}},as=new class extends Ko{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`)} && ${Go.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(){return Promise.resolve(`echo 'do nothing.'`)}testE2EProduction(){return Promise.resolve(`echo 'do nothing.'`)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},os=new class extends Ko{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??``}`}},ss=new class extends Ko{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[Vt(t,`.dev.vars`)],i=Xe(e,`test`)?Ut(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=Ut(e);return[e.buildCommand,Vt(t,`dist/server/.dev.vars`),...r?[r]:[],Ht(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${Yt(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},cs=new class extends Ko{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()}},ls=new class extends ns{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=Yt(e),r=[Vt(t,`.dev.vars`)],i=Ut(e);return i&&r.push(i),r.push(Ht(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}},us=[`express`,`fastify`,`elysia`,`hono`],ds={...Ho,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},fs={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(ds),async handler(e){Uo(e);let t=await U(e);t||(console.error(f.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.blitz)i=ts;else if(t.vinext||r.vinext)i=ss;else if(t.next)i=is;else if(r[`@remix-run/dev`])i=os;else if(r.vite)i=cs;else if(Kt(n))i=ls;else if(us.some(e=>t[e])&&!t[`firebase-functions`]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=rs;else if(t[`build-ts`]||r[`build-ts`])i=as;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await W(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await W(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await W(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await W(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await W(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},ps=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),ms=.05,hs={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`}},gs={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},_s={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(hs).positional(`targets`,gs.targets),async handler(e){process.exit(await vs(e))}};async function vs(n,r={}){let i=bs(n),a=await U(i);if(!a)return console.error(f.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=js(o,s);for(let n of a.descendants){n.env;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d;d=a.blitz?ts:a.vinext||u.vinext?ss:a.next?is:u[`@remix-run/dev`]?os:u.vite?cs:Kt(n)?ls:us.some(e=>a[e])&&!a[`firebase-functions`]?rs:as,console.info(`Running "test" for ${n.name} ...`);let f=xs(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 ws(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&&ys(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 Cs(await d.testE2EProduction(n,m,{playwrightArgs:As(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await Cs(await d.testE2EDev(n,m,{playwrightArgs:As(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await Ss(n,m,d,As(p,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await Ss(n,m,d,As(p,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.blitz||a.next||u[`@remix-run/dev`]||u.vite)switch(i.e2e){case`headed`:{let e=await Cs(await d.testE2EProduction(n,m,{playwrightArgs:As(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await Cs(await d.testE2EDev(n,m,{playwrightArgs:As(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await Cs(await d.testE2EProduction(n,m,{playwrightArgs:As(p,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await Cs(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 Cs(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function ys(n){n.packageJson.workspaces||e.existsSync(t.join(n.dirPath,`playwright.config.ts`))&&console.warn(f.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 bs(e){return e.env?.length||e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?{...e,commandDefaultWbEnv:`test`}:{...e,cascadeEnv:`test`}}function xs(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 Ss(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await W(`${n.buildDocker(e,`test`)}${Wo(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await Cs(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await W(Go.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function Cs(e,t,n,r={}){return W(e,t,n,{...r,processSilentOutput:Ts})}function ws(e,t,n,r={}){return W(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function Ts(e){let t=[],n=new Set,r=[];for(let i of Es(e)){let e=Os(i);n.has(e)||t.some(t=>ks(t,e))||(Ds(t,n,e),r.push(i))}return r.join(`
|
|
106
|
-
`)}function*
|
|
107
|
-
`,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function
|
|
108
|
-
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
|
|
109
|
-
`+
|
|
110
|
-
`))}function
|
|
111
|
-
`+
|
|
112
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsInQiLCJpIiwibyIsIm4iLCJyIiwiYSIsIm4iLCJyIiwibiIsInQiLCJlIiwiYnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYXJndW1lbnRzQnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUiLCJERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgiLCJidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZCIsImdldExpdGVzdHJlYW1Db25maWdPcHRpb24iLCJwYXJzZSIsInBhcnNlRG90ZW52IiwiZGVwbG95Q29tbWFuZCIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZnMiLCJzZXRUaW1lb3V0IiwiYnVpbGRlciIsInNldFRpbWVvdXQiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwidG9VbnNjb3BlZFBhY2thZ2VOYW1lIiwiaXNEb2NrZXJFbmFibGVkIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiYnVpbGRlciIsImRlcGxveUNvbW1hbmQiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9iaW5QYXRoLnRzIiwiLi4vc3JjL3V0aWxzL2NpLnRzIiwiLi4vc3JjL3Byb2plY3QudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy9zY3JpcHRzL3J1bi50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9jb25jdXJyZW50bHkudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXIudHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5EZXZWYXJzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2RlcGxveS50cyIsIi4uL3NyYy9jb21tYW5kcy9kb3RlbnYudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkNvZGUudHMiLCIuLi9zcmMvY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLnRzIiwiLi4vc3JjL3V0aWxzL291dHB1dC50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy9jb21tYW5kcy9tYWludGVuYW5jZS50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUmVnaXN0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JlbGVhc2UudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXBQcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMudHMiLCIuLi9zcmMvdXRpbHMvbG9nLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9odHRwU2VydmVyUGFja2FnZXMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0T25DaS50cyIsIi4uL3NyYy9jb21tYW5kcy90cmVlS2lsbC50cyIsIi4uL3NyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyaWZ5Q29kZS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHsgZXhwYW5kIH0gZnJvbSAnZG90ZW52LWV4cGFuZCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICBuYXJnczogMSxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgJ3F1aWV0LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N1cHByZXNzIC5lbnYgZmlsZSBsb2FkaW5nIGluZm9ybWF0aW9uLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PiAmIHtcbiAgLyoqXG4gICAqIENvbW1hbmQtbGV2ZWwgZmFsbGJhY2sgZm9yIGFuIHVuc2V0IFdCX0VOViAoZS5nLiBgd2IgdGVzdGAgc3VwcGxpZXMgJ3Rlc3QnIHdoZW4gZXhwbGljaXQgZW52XG4gICAqIGZsYWdzIHN1cHByZXNzIGl0cyBkZWZhdWx0IHRlc3QgY2FzY2FkZSkuIE5vdCBhIENMSSBmbGFnLlxuICAgKi9cbiAgY29tbWFuZERlZmF1bHRXYkVudj86IHN0cmluZztcbn07XG5cbmNvbnN0IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgV0JfRU5WIHZhbHVlIHdiIGZhbGxzIGJhY2sgdG8gd2hlbiBubyBlbnYgc291cmNlIGFuZCBubyBleHBvcnRlZCB2YXJpYWJsZSBkZWZpbmVzXG4gKiBpdDogdGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCBmaXJzdCAoYHdiIHRlc3QgLS1jYXNjYWRlLWVudj1zdGFnaW5nYCBsb2FkcyB0aGUgc3RhZ2luZyBmaWxlc1xuICogYnV0IGl0cyB0ZXN0cyBtdXN0IHN0aWxsIHJ1biBhcyBgdGVzdGAsIG1pcnJvcmluZyB0aGUgcHJlLTE1IGB8fD0gJ3Rlc3QnYCBiZWhhdmlvciksIHRoZW4gdGhlXG4gKiBmb3JjZWQgY2FzY2FkZSwgdGhlbiB0aGUgYW1iaWVudC1OT0RFX0VOVi1kcml2ZW4gYXV0byBjYXNjYWRlIGNsYW1wZWQgdG8gYSBzdGFuZGFyZCBtb2RlIChhXG4gKiBub24tc3RhbmRhcmQgTk9ERV9FTlYgc3VjaCBhcyBgcWFgIHN0aWxsIHNlbGVjdHMgdGhlIGNhc2NhZGUgc3VmZml4LCBidXQgbXVzdCBub3QgcHJvZHVjZSBhXG4gKiBub24tc3RhbmRhcmQgV0JfRU5WKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGYWxsYmFja1diRW52KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoYXJndi5jb21tYW5kRGVmYXVsdFdiRW52KSByZXR1cm4gYXJndi5jb21tYW5kRGVmYXVsdFdiRW52O1xuICBpZiAoYXJndi5jYXNjYWRlRW52KSByZXR1cm4gYXJndi5jYXNjYWRlRW52O1xuICAvLyBSZWFkIE5PREVfRU5WIHRocm91Z2ggdGhlIGFsaWFzIGZvciB0aGUgc2FtZSBidW5kbGVyLWlubGluaW5nIHJlYXNvbiBhcyBpblxuICAvLyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIGFuZCBmcm9tIHRoZSBBTUJJRU5UIGVudmlyb25tZW50IChub3QgbG9hZGVkIGZpbGVzKSBiZWNhdXNlIHRoZVxuICAvLyBjYXNjYWRlIHNlbGVjdGlvbiBiZWxvdyB1c2VzIHRoZSBhbWJpZW50IHZhbHVlIGFzIHdlbGwuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgZGVyaXZlZCA9XG4gICAgYXJndi5jYXNjYWRlTm9kZUVudiB8fCBhcmd2LmF1dG9DYXNjYWRlRW52ICE9PSBmYWxzZSA/IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JyA6ICdkZXZlbG9wbWVudCc7XG4gIHJldHVybiBzdGFuZGFyZFdiRW52TW9kZXMuaGFzKGRlcml2ZWQpID8gZGVyaXZlZCA6ICdkZXZlbG9wbWVudCc7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nLFxuICBvcHRpb25zPzoge1xuICAgIC8qKlxuICAgICAqIExvYWQgdmFyaWFibGVzIGV2ZW4gaWYgdGhleSBhbHJlYWR5IGV4aXN0IGluIHByb2Nlc3MuZW52LlxuICAgICAqIFVzZWZ1bCB3aGVuIGEgcGFyZW50IHByb2Nlc3MgaGFzIGFscmVhZHkgaW5qZWN0ZWQgdGhlIC5lbnYgdmFsdWVzIGludG8gdGhlIGVudmlyb25tZW50XG4gICAgICogYW5kIHRoZSBmaWxlLWRlZmluZWQgdmFyaWFibGVzIHRoZW1zZWx2ZXMgYXJlIG5lZWRlZCAoZS5nLiBgd2IgZ2VuLWRldi12YXJzYCkuXG4gICAgICovXG4gICAgaWdub3JlUHJvY2Vzc0Vudj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogRXhwYW5kIGAke1dCX0VOVn1gIHJlZmVyZW5jZXMgYWdhaW5zdCB0aGUgZmFsbGJhY2sgbW9kZSB3aGVuIG5vdGhpbmcgZGVmaW5lcyBXQl9FTlYuXG4gICAgICogT25seSBmb3IgY2FsbGVycyB0aGF0IHN1YnNlcXVlbnRseSBDT01QTEVURSBXQl9FTlYgd2l0aCB0aGF0IGZhbGxiYWNrICh3YidzIFByb2plY3QuZW52KS5cbiAgICAgKi9cbiAgICBleHBhbmRGYWxsYmFja1diRW52PzogYm9vbGVhbjtcbiAgfVxuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIHN0cmluZ1tdXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgLy8gUmVhZCBOT0RFX0VOViB0aHJvdWdoIGFuIGFsaWFzLCBuZXZlciBhcyB0aGUgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCBtZW1iZXIgZXhwcmVzc2lvbjpcbiAgLy8gYnVuZGxlcnMgcmVwbGFjZSB0aGF0IGV4YWN0IGV4cHJlc3Npb24gYXQgYnVpbGQgdGltZSAocm9sbGRvd24vYnVpbGQtdHMgaW5saW5lIGl0IGFzXG4gIC8vICdwcm9kdWN0aW9uJyksIHdoaWNoIGNvbnN0YW50LWZvbGRzIHRoZSBmYWxsYmFjayBiZWxvdyBhbmQgbWFkZSB0aGUgcHVibGlzaGVkIHdiIHNlbGVjdFxuICAvLyB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIHdoZW5ldmVyIFdCX0VOViB3YXMgdW5zZXQuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBydW50aW1lRW52LldCX0VOViB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBjb25zdCBzaG91bGRTdXBwcmVzc091dHB1dCA9IHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndik7XG4gIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cnVudGltZUVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtydW50aW1lRW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICAvLyBXaGVuIHRoZSBjYWxsZXIgZXhwbGljaXRseSBmb3JjZXMgYSBtb2RlICgtLWNhc2NhZGUtZW52IC8gLS1jYXNjYWRlLW5vZGUtZW52IC8gYW4gZXhwb3J0ZWRcbiAgLy8gV0JfRU5WKSwgdmFsdWVzIHRoYXQgdGhlIG1vZGUncyBvd24gZW52IGZpbGVzIGRlZmluZSBtdXN0IHdpbiBvdmVyIHZhcmlhYmxlcyBpbmhlcml0ZWQgZnJvbVxuICAvLyB0aGUgcGFyZW50IHNoZWxsOiBhIHN0YWxlIGBleHBvcnQgREFUQUJBU0VfVVJMPS4uLmAgZnJvbSBhIGRldmVsb3BtZW50IHNoZWxsIG11c3Qgbm90IGxlYWtcbiAgLy8gaW50byBgd2IgdGVzdGAncyB0ZXN0IG1vZGUgKGNmLiBodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85MzApLiBPbiBDSSB0aGVcbiAgLy8gaW5oZXJpdGVkIHZhcmlhYmxlcyBrZWVwIHdpbm5pbmcg4oCUIHdvcmtmbG93cyBkZWxpYmVyYXRlbHkgaW5qZWN0IGVudiB2YXJzIHRoYXQgb3ZlcnJpZGUgdGhlXG4gIC8vIGNvbW1pdHRlZCBmaWxlcyDigJQgYW5kIHRoYXQgc2hhZG93aW5nIGlzIHRoZSBkZXNpZ25lZCBiZWhhdmlvciwgc28gbm8gd2FybmluZyBpcyBlbWl0dGVkLlxuICBjb25zdCBtb2RlSXNGb3JjZWQgPSBCb29sZWFuKFxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52ID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogYXJndi5hdXRvQ2FzY2FkZUVudiA/IHJ1bnRpbWVFbnYuV0JfRU5WIDogdW5kZWZpbmVkKVxuICApO1xuICBjb25zdCBtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBtb2RlSXNGb3JjZWQgJiYgIWlzQ0lFbnZpcm9ubWVudChydW50aW1lRW52LkNJKTtcbiAgLy8gT3ZlcnJpZGUgZWxpZ2liaWxpdHkgaXMgZGVjaWRlZCBwZXIgS0VZLCBub3QgcGVyIGZpbGU6IGAuZW52LmxvY2FsYCBvdXRyYW5rcyBgLmVudi48bW9kZT5gXG4gIC8vIGluIHRoZSBjYXNjYWRlLCBzbyBvbmNlIHRoZSBtb2RlIGRlZmluZXMgYSBrZXksIHRoZSB2YWx1ZSB3aW5uaW5nIHRoZSBub3JtYWwgZmlsZSBwcmVjZWRlbmNlXG4gIC8vICh3aGljaCBtYXkgY29tZSBmcm9tIGAuZW52LmxvY2FsYCkgbXVzdCBiZSB0aGUgb25lIG92ZXJyaWRpbmcgdGhlIHNoZWxsLlxuICBjb25zdCBtb2RlU3BlY2lmaWNFbnZLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGlmIChtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgJiYgdHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnICYmIGNhc2NhZGUubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgICAgaWYgKGVudlBhdGguZW5kc1dpdGgoYC4ke2Nhc2NhZGV9YCkgfHwgZW52UGF0aC5lbmRzV2l0aChgLiR7Y2FzY2FkZX0ubG9jYWxgKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSBtb2RlU3BlY2lmaWNFbnZLZXlzLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lczogW3N0cmluZywgc3RyaW5nW11dW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmIChrZXkgaW4gZW52VmFycykgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGluaGVyaXRlZFZhbHVlID0gcHJvY2Vzcy5lbnZba2V5XTtcbiAgICAgIGNvbnN0IHNoYWRvd2VkQnlQcm9jZXNzRW52ID0gIW9wdGlvbnM/Lmlnbm9yZVByb2Nlc3NFbnYgJiYga2V5IGluIHByb2Nlc3MuZW52O1xuICAgICAgaWYgKHNoYWRvd2VkQnlQcm9jZXNzRW52ICYmICEobW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ICYmIG1vZGVTcGVjaWZpY0VudktleXMuaGFzKGtleSkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNoYWRvd2VkQnlQcm9jZXNzRW52ICYmIGluaGVyaXRlZFZhbHVlICE9PSB2YWx1ZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBXYXJuaW5nOiAke2tleX0gaW4gJHtlbnZQYXRofSBvdmVycmlkZXMgdGhlIHZhbHVlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgYmVjYXVzZSB0aGUgJHtjYXNjYWRlfSBlbnZpcm9ubWVudCBpcyBleHBsaWNpdGx5IGZvcmNlZC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZW52UGF0aCwga2V5c10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0ICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW2Zub3hFbnZWYXJzLCBmbm94RW52VmFyTmFtZXNdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIGVudlZhcnMsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudixcbiAgfSk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgZm5veEVudlZhcnMpO1xuICAvLyBSZXBvcnQgdGhlIGZub3ggc291cmNlIHdoZW5ldmVyIGZub3gudG9tbCBleGlzdHMg4oCUIGV2ZW4gd2hlbiBpdCB5aWVsZHMgbm8ga2V5cyAoYWxsIHNoYWRvd2VkLFxuICAvLyBlbXB0eSBwcm9maWxlLCBvciBhIGZhaWxpbmcgZXhwb3J0KTogY29uc3VtZXJzIHN1Y2ggYXMgd2IncyByZXF1aXJlZC1lbnZpcm9ubWVudCB2YWxpZGF0aW9uXG4gIC8vIG11c3Qgc2VlIHRoYXQgYSBkZWNsYXJlZCBlbnYgc291cmNlIGV4aXN0cyByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nIG9wZW4uXG4gIGlmIChmbm94RW52VmFyTmFtZXMubGVuZ3RoID4gMCB8fCBoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2QpKSB7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW2Zub3hFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSksIGZub3hFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtmbm94RW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2Zub3hFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSl9YCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaXNlRW52VmFycywgbWlzZUVudlZhck5hbWVzXSA9IHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkLCBjYXNjYWRlLCBlbnZWYXJzLCBvcHRpb25zKTtcbiAgT2JqZWN0LmFzc2lnbihlbnZWYXJzLCBtaXNlRW52VmFycyk7XG4gIGlmIChtaXNlRW52VmFyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFttaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGUpLCBtaXNlRW52VmFyTmFtZXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7bWlzZUVudlZhck5hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHttaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGUpfWApO1xuICAgIH1cbiAgfVxuICBpZiAoIWFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICAvLyBFeHBhbmQgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBsaXZlIGVudmlyb25tZW50IGZvciBrZXlzIE5PVCBsb2FkZWQgZnJvbSBmaWxlcywgc28gdGhhdCBhXG4gIC8vIHJlZmVyZW5jZSB0byBhbiBleHBvcnRlZCBrZXkgKGV4Y2x1ZGVkIGZyb20gZW52VmFycyBieSBwcm9jZXNzLWVudiBwcmVjZWRlbmNlKSByZXNvbHZlcyB0b1xuICAvLyB0aGUgZWZmZWN0aXZlIHZhbHVlIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nLiBMb2FkZWQga2V5cyBhcmUgZGVsaWJlcmF0ZWx5IGFic2VudCBmcm9tXG4gIC8vIHRoZSByZWZlcmVuY2Ugc2V0OiBkb3RlbnYtZXhwYW5kIHdvdWxkIG90aGVyd2lzZSByZXBsYWNlIHRoZWlyIHBhcnNlZCB2YWx1ZXMgd2l0aCB0aGVcbiAgLy8gcHJvY2VzcyB2YWx1ZXMsIGJyZWFraW5nIGNhbGxlcnMgdGhhdCBuZWVkIHRoZSBmaWxlLWRlZmluZWQgdmFsdWVzIHRoZW1zZWx2ZXMuXG4gIGNvbnN0IHJlZmVyZW5jZUVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikpIHtcbiAgICAvLyBFc2NhcGUgZG9sbGFyIHNpZ25zIHNvIGRvdGVudi1leHBhbmQgc3Vic3RpdHV0ZXMgZXhwb3J0ZWQgdmFsdWVzIGxpdGVyYWxseSBpbnN0ZWFkIG9mXG4gICAgLy8gcmVjdXJzaXZlbHkgcmUtZXhwYW5kaW5nIHRoZW0gKGFuIGV4cG9ydGVkIGBwYSR3b3JkYCBtdXN0IHN0YXkgYHBhJHdvcmRgKS5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBlbnZWYXJzKSkgcmVmZXJlbmNlRW52W2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgfVxuICAvLyBkb3RlbnYtZXhwYW5kIHJlc29sdmVzIHJlZmVyZW5jZXMgaW4ga2V5LWluc2VydGlvbiBvcmRlciwgc28gYSAuZW52IHZhbHVlIHJlZmVyZW5jaW5nIGFcbiAgLy8gZm5veC9taXNlLXByb3ZpZGVkIGtleSB3b3VsZCBzZWUgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBmbm94L21pc2UgZW50cmllcyBzdGF5ZWQgYXBwZW5kZWRcbiAgLy8gYWZ0ZXIgdGhlIC5lbnYgZW50cmllcy4gUmVidWlsZCB0aGUgZXhwYW5zaW9uIGlucHV0IHdpdGggdGhlIGxvd2VyLXByaW9yaXR5IHNvdXJjZXMgZmlyc3Q7XG4gIC8vIHRoZSB2YWx1ZXMgdGhlbXNlbHZlcyBhbHJlYWR5IHJlZmxlY3QgdGhlIGludGVuZGVkIC5lbnYtb3Zlci1mbm94LW92ZXItbWlzZSBwcmVjZWRlbmNlLlxuICBjb25zdCBvcmRlcmVkRW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ubWlzZUVudlZhck5hbWVzLCAuLi5mbm94RW52VmFyTmFtZXNdKSBvcmRlcmVkRW52VmFyc1trZXldID0gZW52VmFyc1trZXldITtcbiAgT2JqZWN0LmFzc2lnbihvcmRlcmVkRW52VmFycywgZW52VmFycyk7XG4gIC8vIGV4cGFuZCgpIG11dGF0ZXMgQk9USCBpdHMgcGFyc2VkIGlucHV0IEFORCBwcm9jZXNzRW52IChkb3RlbnYtZXhwYW5kIHdyaXRlcyBldmVyeSBwYXJzZWRcbiAgLy8gcmVzdWx0IGludG8gcHJvY2Vzc0VudiksIHNvIHNuYXBzaG90IGJvdGggZm9yIHRoZSByZS1leHBhbnNpb24gYmVsb3cg4oCUIHRoZSByZXRyeSBtdXN0IG5vdFxuICAvLyBzZWUgdGhlIGZpcnN0IHBhc3MncyBzdGFsZSBkZXBlbmRlbnQgdmFsdWVzLlxuICBjb25zdCBwcmVFeHBhbnNpb25FbnZWYXJzID0geyAuLi5vcmRlcmVkRW52VmFycyB9O1xuICBjb25zdCBwcmlzdGluZVJlZmVyZW5jZUVudiA9IHsgLi4ucmVmZXJlbmNlRW52IH07XG4gIGxldCBleHBhbmRlZEVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQ6IG9yZGVyZWRFbnZWYXJzLCBwcm9jZXNzRW52OiByZWZlcmVuY2VFbnYgfSkucGFyc2VkID8/IG9yZGVyZWRFbnZWYXJzO1xuICAvLyBBIHZhbHVlIHJlZmVyZW5jaW5nICR7V0JfRU5WfSBtdXN0IGV4cGFuZCB0byB3aGF0IHRoZSBjaGlsZCB3aWxsIGFjdHVhbGx5IHNlZTogd2hlbiB0aGVcbiAgLy8gRUZGRUNUSVZFIFdCX0VOViBlbmRzIHVwIGVtcHR5IOKAlCB3aGV0aGVyIGl0IHdhcyBuZXZlciBkZWZpbmVkLCBkZWZpbmVkIGVtcHR5LCBvciBlbXB0aWVkIGJ5XG4gIC8vIHRoZSBleHBhbnNpb24gaXRzZWxmIChlLmcuIGBXQl9FTlY9JHtNSVNTSU5HX01PREV9YCkg4oCUIHdiJ3MgUHJvamVjdC5lbnYgbGF0ZXIgZmlsbHMgaXQgd2l0aFxuICAvLyB0aGUgZmFsbGJhY2sgbW9kZSwgc28gcmUtZXhwYW5kIGZyb20gdGhlIG9yaWdpbmFsIHZhbHVlcyB3aXRoIHRoYXQgZmFsbGJhY2sgYXZhaWxhYmxlLlxuICAvLyBPcHQtaW4gdmlhIHRoZSBvcHRpb246IGEgZGlyZWN0IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcy9yZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlc1xuICAvLyBjYWxsZXIgbmV2ZXIgcmVjZWl2ZXMgdGhlIGNvbXBsZXRlZCBXQl9FTlYsIGFuZCBleHBhbmRpbmcgcmVmZXJlbmNlcyBhZ2FpbnN0IGEgdmFsdWUgdGhhdCBpc1xuICAvLyBub3QgYWN0dWFsbHkgYXBwbGllZCB3b3VsZCBtYWtlIHRoZSBwYWlyIGluY29uc2lzdGVudC5cbiAgLy8gVGhlIGxvYWRlZCBrZXkgbWFza3MgdGhlIGFtYmllbnQgdmFsdWUsIHNvIGEgbG9hZGVkLWJ1dC1lbXB0aWVkIFdCX0VOViBuZWVkcyB0aGUgcmV0cnkgZXZlblxuICAvLyB3aGVuIGFuIGV4cG9ydGVkIFdCX0VOViBleGlzdHMgKGEgZm9yY2VkIG1vZGUgZmlsZSBvdmVycmlkZXMgdGhlIGV4cG9ydCBsb2NhbGx5KTogcmV0cnkgd2l0aFxuICAvLyB0aGUgdmFsdWUgdGhlIG1lcmdlZCBlbnZpcm9ubWVudCB3aWxsIHVsdGltYXRlbHkgcmV0YWluLlxuICBjb25zdCBlZmZlY3RpdmVXYkVudiA9IGV4cGFuZGVkRW52VmFycy5XQl9FTlYgPz8gcnVudGltZUVudi5XQl9FTlY7XG4gIGlmIChvcHRpb25zPy5leHBhbmRGYWxsYmFja1diRW52ICYmICFlZmZlY3RpdmVXYkVudikge1xuICAgIGNvbnN0IHJlRXhwYW5zaW9uSW5wdXQgPSB7IC4uLnByZUV4cGFuc2lvbkVudlZhcnMgfTtcbiAgICBkZWxldGUgcmVFeHBhbnNpb25JbnB1dC5XQl9FTlY7XG4gICAgY29uc3QgcmV0cnlSZWZlcmVuY2VFbnYgPSB7IC4uLnByaXN0aW5lUmVmZXJlbmNlRW52LCBXQl9FTlY6IHJ1bnRpbWVFbnYuV0JfRU5WIHx8IHJlc29sdmVGYWxsYmFja1diRW52KGFyZ3YpIH07XG4gICAgZXhwYW5kZWRFbnZWYXJzID0gZXhwYW5kKHsgcGFyc2VkOiByZUV4cGFuc2lvbklucHV0LCBwcm9jZXNzRW52OiByZXRyeVJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gcmVFeHBhbnNpb25JbnB1dDtcbiAgfVxuICByZXR1cm4gW2V4cGFuZGVkRW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzXTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRoZSByZXBvc2l0b3J5J3MgZm5veCBjb25maWd1cmF0aW9uIChgZm5veC50b21sYCkuXG4gKiBUaGUgYmFzZSBgW3NlY3JldHNdYCB0YWJsZSBjb3JyZXNwb25kcyB0byBgLmVudmAsIGFuZCBgW3Byb2ZpbGVzLjxjYXNjYWRlPi5zZWNyZXRzXWAgY29ycmVzcG9uZHMgdG9cbiAqIGAuZW52LjxjYXNjYWRlPmA7IGFuIHVua25vd24gcHJvZmlsZSBmYWxscyBiYWNrIHRvIHRoZSBiYXNlIHNlY3JldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjdXJyZW50RW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb3B0aW9ucz86IHsgaWdub3JlUHJvY2Vzc0Vudj86IGJvb2xlYW47IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0Vudj86IGJvb2xlYW4gfVxuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIHN0cmluZ1tdXSB7XG4gIGlmICghaGFzUHJvamVjdEZub3hDb25maWcoY3dkKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGNvbnN0IHNlY3JldHMgPSBydW5Gbm94RXhwb3J0KGN3ZCwgY2FzY2FkZSwgeyBxdWlldDogZmFsc2UgfSk7XG4gIGlmICghc2VjcmV0cykgcmV0dXJuIFt7fSwgW11dO1xuICAvLyBgW3Byb2ZpbGVzLjxjYXNjYWRlPi5zZWNyZXRzXWAgaXMgdGhlIGZub3ggYW5hbG9ndWUgb2YgYC5lbnYuPGNhc2NhZGU+YDogd2hlbiB0aGUgY2FsbGVyXG4gIC8vIGZvcmNlcyBhIG1vZGUgb2ZmIENJLCBwcm9maWxlLXNwZWNpZmljIHZhbHVlcyBtdXN0IG92ZXJyaWRlIGluaGVyaXRlZCBzaGVsbCB2YXJpYWJsZXMganVzdFxuICAvLyBsaWtlIGAuZW52Ljxtb2RlPmAgdmFsdWVzIGRvLCB3aGlsZSBiYXNlIGBbc2VjcmV0c11gIHZhbHVlcyBrZWVwIGxvc2luZyB0byBwcm9jZXNzLmVudi4gQSBrZXlcbiAgLy8gaXMgcHJvZmlsZS1zcGVjaWZpYyB3aGVuIHRoZSBwcm9maWxlIGV4cG9ydCdzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSBleHBvcnQnczsgd2hlbiB0aGVcbiAgLy8gYmFzZSBleHBvcnQgZmFpbHMsIG5vIG92ZXJyaWRlIGlzIGFwcGxpZWQgKGNvbnNlcnZhdGl2ZSkuIFRoZSBiYXNlIGV4cG9ydCBydW5zIExBWklMWSwgb25seVxuICAvLyB3aGVuIGEgcHJvY2Vzcy5lbnYgY29sbGlzaW9uIGFjdHVhbGx5IG5lZWRzIGFkanVkaWNhdGluZyDigJQgaXQgd291bGQgb3RoZXJ3aXNlIGFkZCBhXG4gIC8vIHN1YnByb2Nlc3MgKGluY2x1ZGluZyBhZ2UgZGVjcnlwdGlvbikgdG8gZXZlcnkgZm9yY2VkLW1vZGUgaW52b2NhdGlvbiBmb3Igbm90aGluZy5cbiAgbGV0IGNhY2hlZEJhc2VTZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB8IGZhbHNlID0gZmFsc2U7XG4gIGNvbnN0IGdldEJhc2VTZWNyZXRzID0gKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoY2FjaGVkQmFzZVNlY3JldHMgPT09IGZhbHNlKSB7XG4gICAgICBjYWNoZWRCYXNlU2VjcmV0cyA9IHJ1bkZub3hFeHBvcnQoY3dkLCB1bmRlZmluZWQsIHsgcXVpZXQ6IHRydWUsIGlnbm9yZVByb2ZpbGVFbnZWYXI6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWRCYXNlU2VjcmV0cztcbiAgfTtcblxuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwga2V5IGluIGN1cnJlbnRFbnZWYXJzKSBjb250aW51ZTtcbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aW4gb3ZlciBmbm94IGJhc2UgdmFsdWVzLCBtaXJyb3JpbmcgdGhlIC5lbnYgcnVsZS5cbiAgICAvLyAoVGhlIG1pc2UgcmVhZGVyIGJlbG93IGludGVudGlvbmFsbHkgdXNlcyBhIHZhbHVlLWVxdWFsaXR5IGNoZWNrIGluc3RlYWQ6IGBtaXNlIGVudmAgZWNob2VzXG4gICAgLy8gYmFjayB2YXJpYWJsZXMgdGhlIGFtYmllbnQgbWlzZSBhY3RpdmF0aW9uIGFscmVhZHkgZXhwb3J0ZWQsIGFuZCBhIGRpZmZlcmluZyB2YWx1ZSBtZWFucyB0aGVcbiAgICAvLyByZXF1ZXN0ZWQgY2FzY2FkZSBwcm9maWxlIHNob3VsZCB3aW4gb3ZlciB0aGUgc3RhbGUgYWN0aXZhdGlvbi4pXG4gICAgaWYgKCFvcHRpb25zPy5pZ25vcmVQcm9jZXNzRW52ICYmIGtleSBpbiBwcm9jZXNzLmVudikge1xuICAgICAgY29uc3QgYmFzZVNlY3JldHMgPSBvcHRpb25zPy5tb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgJiYgY2FzY2FkZSA/IGdldEJhc2VTZWNyZXRzKCkgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBvdmVycmlkZXNQcm9jZXNzRW52ID0gYmFzZVNlY3JldHMgIT09IHVuZGVmaW5lZCAmJiBiYXNlU2VjcmV0c1trZXldICE9PSB2YWx1ZTtcbiAgICAgIGlmICghb3ZlcnJpZGVzUHJvY2Vzc0VudikgY29udGludWU7XG4gICAgfVxuICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBbZW52VmFycywga2V5c107XG59XG5cbmZ1bmN0aW9uIHJ1bkZub3hFeHBvcnQoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IHsgcXVpZXQ6IGJvb2xlYW47IGlnbm9yZVByb2ZpbGVFbnZWYXI/OiBib29sZWFuIH1cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgLy8gYC0taWYtbWlzc2luZyBlcnJvcmA6IGZub3ggb3RoZXJ3aXNlIGV4aXRzIDAgYW5kIHNpbGVudGx5IG9taXRzIHNlY3JldHMgaXQgZmFpbHMgdG8gcmVzb2x2ZVxuICAvLyAoZS5nLiBhIG1pc3NpbmcgYWdlIGtleSksIHdoaWNoIHdvdWxkIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdW5kZWNsYXJlZCBzZWNyZXRzLlxuICAvLyBgLS1ub24taW50ZXJhY3RpdmVgOiBwcm9tcHRzIG9yIGJyb3dzZXIgYXV0aCBmbG93cyB3b3VsZCBoYW5nIGZvcmV2ZXIgYmVjYXVzZSBzdGRpbiBpcyBpZ25vcmVkLlxuICBjb25zdCBhcmdzID0gWydleHBvcnQnLCAnLS1mb3JtYXQnLCAnanNvbicsICctLW5vLWNvbG9yJywgJy0taWYtbWlzc2luZycsICdlcnJvcicsICctLW5vbi1pbnRlcmFjdGl2ZSddO1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGlmIChjYXNjYWRlKSB7XG4gICAgYXJncy5wdXNoKCctLXByb2ZpbGUnLCBjYXNjYWRlKTtcbiAgfVxuICBpZiAob3B0aW9ucy5pZ25vcmVQcm9maWxlRW52VmFyKSB7XG4gICAgLy8gV2l0aG91dCBgLS1wcm9maWxlYCwgZm5veCBmYWxscyBiYWNrIHRvIEZOT1hfUFJPRklMRTsgdGhlIGJhc2UtYWRqdWRpY2F0aW9uIGV4cG9ydCBtdXN0XG4gICAgLy8gcmVhZCB0aGUgQkFTRSBzZWNyZXRzLCBzbyB0aGUgaW5oZXJpdGVkIHByb2ZpbGUgc2VsZWN0aW9uIGlzIGNsZWFyZWQgZm9yIGl0IOKAlCBhbmQgb25seSBmb3JcbiAgICAvLyBpdDogYSBwcm9maWxlLWxlc3MgUFJJTUFSWSBleHBvcnQgKGUuZy4gYHdiIGRvdGVudmAgd2l0aG91dCBXQl9FTlYpIGtlZXBzIGhvbm9yaW5nXG4gICAgLy8gRk5PWF9QUk9GSUxFLlxuICAgIGRlbGV0ZSBlbnYuRk5PWF9QUk9GSUxFO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoJ2Zub3gnLCBhcmdzLCB7XG4gICAgY3dkLFxuICAgIGVudixcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSB7XG4gICAgLy8gVGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMgZm5veC1tYW5hZ2VkIHNlY3JldHMgKGZub3gudG9tbCBleGlzdHMpLCBzbyBhIGZhaWxpbmcgZXhwb3J0IG11c3QgYmVcbiAgICAvLyBzdXJmYWNlZDogc3dhbGxvd2luZyBpdCB3b3VsZCBtYWtlIGRlY2xhcmVkIHNlY3JldHMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIG9uZXMuXG4gICAgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBmbm94IHNlY3JldHM6ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlIHx8IHJlc3VsdC5zdGRlcnI/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/IGAke2JpblBhdGhzLmpvaW4oJzonKX06JHtlbnYuUEFUSH1gIDogYmluUGF0aHMuam9pbignOicpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7XG4gIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyxcbiAgcmVzb2x2ZUZhbGxiYWNrV2JFbnYsXG4gIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi91dGlscy9jaS5qcyc7XG5cbmV4cG9ydCB0eXBlIERhdGFiYXNlT3JtID0gJ3ByaXNtYScgfCAnZHJpenpsZSc7XG5cbmV4cG9ydCBjb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmd2OiBFbnZSZWFkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRFbnY6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aEJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlyUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpclBhdGg6IHN0cmluZywgYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbikge1xuICAgIHRoaXMuX2RpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gICAgdGhpcy5hcmd2ID0gYXJndjtcbiAgICB0aGlzLmxvYWRFbnYgPSBsb2FkRW52O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGlzQnVuQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnVzZXNCdW5QYWNrYWdlTWFuYWdlcjtcbiAgfVxuXG4gIC8vIFRoZSBwYWNrYWdlIG1hbmFnZXIgbXVzdCBmb2xsb3cgdGhlIHRhcmdldCBwcm9qZWN0LCBub3QgdGhlIHJ1bnRpbWUgdGhhdCBsYXVuY2hlZCB3YjpcbiAgLy8gYG5vZGUgd2IgLi4uYCBhZ2FpbnN0IGEgQnVuIHJlcG8gbXVzdCBzdGlsbCBydW4gYGJ1biBpbnN0YWxsYCwgYW5kIHZpY2UgdmVyc2EuXG4gIGdldCBwYWNrYWdlTWFuYWdlckNvbW1hbmQoKTogJ2J1bicgfCAneWFybicge1xuICAgIHJldHVybiB0aGlzLmlzQnVuQXZhaWxhYmxlID8gJ2J1bicgOiAneWFybic7XG4gIH1cblxuICBnZXQgcGFja2FnZU1hbmFnZXJSdW5Db21tYW5kKCk6ICdidW4gcnVuJyB8ICd5YXJuJyB7XG4gICAgcmV0dXJuIHRoaXMuaXNCdW5BdmFpbGFibGUgPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIH1cblxuICAvLyBBIHNpbmdsZSBzaWduYWwgZGVjaWRlcyBldmVyeSBidW4tdnMteWFybiBicmFuY2ggaW4gd2IgKHNjcmlwdCBub3JtYWxpemF0aW9uIGluY2x1ZGVkKTpcbiAgLy8gc3BsaXR0aW5nIHRoZSB0b29sLW1hbmlmZXN0IHNpZ25hbCBmcm9tIHRoZSBsb2NrZmlsZSBzaWduYWwgb25jZSBwcm9kdWNlZCBjb21tYW5kcyBtaXhpbmdcbiAgLy8gYGJ1biBpbnN0YWxsYCB3aXRoIGB5YXJuIHByaXNtYSAuLi5gIGluIG1pc2UtcGlubmVkIHJlcG9zIHdob3NlIGJ1bi5sb2NrIGlzIGdpdGlnbm9yZWQuXG4gIEBtZW1vaXplT25lXG4gIGdldCB1c2VzQnVuUGFja2FnZU1hbmFnZXIoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFzQnVuVG9vbFZlcnNpb24oKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuaGFzQnVuTG9ja2ZpbGUoKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuaGFzQnVuUGFja2FnZU1hbmFnZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuVG9vbFZlcnNpb24oKTogYm9vbGVhbiB7XG4gICAgLy8gd2JmeSBtaWdyYXRlcyAudG9vbC12ZXJzaW9ucyBpbnRvIG1pc2UudG9tbCwgc28gYSBtaXNlLXBpbm5lZCBidW4gbXVzdCBjb3VudCBhcyB3ZWxsOlxuICAgIC8vIHJlcG9zIHRoYXQgZ2l0aWdub3JlIGJ1bi5sb2NrIGFuZCBoYXZlIG5vIHBhY2thZ2VNYW5hZ2VyIGZpZWxkIHJlbHkgb24gdGhlIHRvb2wgbWFuaWZlc3QuXG4gICAgaWYgKHRlc3RGaWxlQ29udGVudChwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksIC8oXnxcXG4pYnVuXFxzLykpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgICB0ZXN0RmlsZUNvbnRlbnQocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsIGZpbGVOYW1lKSwgL15cXHMqKD86XCJidW5cInxidW4pXFxzKj0vbSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Mb2NrZmlsZSgpOiBib29sZWFuIHtcbiAgICAvLyBTb21lIHJlcG9zaXRvcmllcyByZWx5IG9uIHRoZSBsb2NrZmlsZSBvciBwYWNrYWdlTWFuYWdlciBmaWVsZCBpbnN0ZWFkIG9mIG1pc2UuXG4gICAgLy8gRG9ja2VyIG9wdGltaXphdGlvbiBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiLlxuICAgIHJldHVybiBbJ2J1bi5sb2NrJywgJ2J1bi5sb2NrYiddLnNvbWUoKGZpbGVOYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCBmaWxlTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuUGFja2FnZU1hbmFnZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSB0aGlzLnJvb3RQYWNrYWdlSnNvbj8ucGFja2FnZU1hbmFnZXIgPz8gdGhpcy5wYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlcjtcbiAgICByZXR1cm4gdHlwZW9mIHBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJyAmJiBwYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCdidW5AJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgLy8gQ2FjaGVkIGluIGEgcGxhaW4gZmllbGQgcmF0aGVyIHRoYW4gd2l0aCBAbWVtb2l6ZU9uZTogdGhhdCBkZWNvcmF0b3Iga2V5cyBpdHMgY2FjaGUgb24gYSBoYXNoXG4gIC8vIG9mIHRoZSBpbnN0YW5jZSwgd2hpY2ggY2hhbmdlcyBhcyBvdGhlciBtZW1vaXplZCBnZXR0ZXJzIHBvcHVsYXRlIHRoZSBpbnN0YW5jZSwgc28gYGVudmAgY291bGRcbiAgLy8gc2lsZW50bHkgYmUgcmVjb21wdXRlZCDigJQgZHJvcHBpbmcgaW4tcGxhY2UgbXV0YXRpb25zIChlLmcuIGBwcm9qZWN0LmVudi5QT1JUIHx8PSDigKZgLCBvciB0aGVcbiAgLy8gc2VjcmV0cyBgd2IgZGVwbG95YCBtZXJnZXMgZnJvbSAuZW52LmNsb3VkZmxhcmUpIHRoYXQgY2FsbGVycyByZWx5IG9uIGZvciBzcGF3bmVkIGNvbW1hbmRzLlxuICBwcml2YXRlIGVudkNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKHRoaXMuZW52Q2FjaGUpIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICAgIGlmICghdGhpcy5sb2FkRW52KSB7XG4gICAgICB0aGlzLmVudkNhY2hlID0gcHJvY2Vzcy5lbnY7XG4gICAgICByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgICB9XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgsIHtcbiAgICAgIC8vIGNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudiBiZWxvdyBmaWxscyBhbiB1bnNldCBXQl9FTlYgd2l0aCB0aGUgc2FtZSBmYWxsYmFjaywgc28gZXhwYW5kaW5nXG4gICAgICAvLyAke1dCX0VOVn0gcmVmZXJlbmNlcyBhZ2FpbnN0IGl0IGtlZXBzIHRoZSBwYWlyIGNvbnNpc3RlbnQuXG4gICAgICBleHBhbmRGYWxsYmFja1diRW52OiB0cnVlLFxuICAgIH0pO1xuICAgIGlmICghc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCh0aGlzLmFyZ3YpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBuYW1lc10gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlycykge1xuICAgICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke25hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTcHJlYWRpbmcgZW52VmFycyBsYXN0IGlzIHNhZmUgZm9yIGV4cG9ydGVkLXZhcmlhYmxlIHByZWNlZGVuY2U6IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlc1xuICAgIC8vIGFscmVhZHkgZXhjbHVkZXMga2V5cyBwcmVzZW50IGluIHByb2Nlc3MuZW52IGZyb20gLmVudi9mbm94IHNvdXJjZXMgKHJldHVybmluZyBhIGtleSB0aGF0XG4gICAgLy8gZXhpc3RzIGluIHByb2Nlc3MuZW52IG9ubHkgZm9yIGRlbGliZXJhdGUgZm9yY2VkLW1vZGUgb3ZlcnJpZGVzKS4gTWlzZSB2YWx1ZXMgdGhhdFxuICAgIC8vIGRpZmZlciBmcm9tIHRoZSBhbWJpZW50IGFjdGl2YXRpb24gYXJlIGRlbGliZXJhdGVseSBrZXB0IHNvIHRoZSByZXF1ZXN0ZWQgY2FzY2FkZSBwcm9maWxlXG4gICAgLy8gKGUuZy4gYC0tY2FzY2FkZS1lbnY9dGVzdGApIHdpbnMgb3ZlciBhIHN0YWxlIGBtaXNlIGFjdGl2YXRlYCBlbnZpcm9ubWVudC5cbiAgICB0aGlzLmVudkNhY2hlID0geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICAgIC8vIGBtaXNlIGVudmAgaXMgZXhjbHVkZWQ6IGl0IHJlcG9ydHMgdG9vbC1hY3RpdmF0aW9uIG91dHB1dCAoZS5nLiBQQVRIKSBldmVuIGluIHJlcG9zIHRoYXRcbiAgICAvLyBkZWNsYXJlIG5vIGVudmlyb25tZW50IHZhcmlhYmxlcyBhdCBhbGwsIHdoaWNoIG11c3Qgbm90IHRyaWdnZXIgdGhlIENJIHN0cmljdG5lc3MgYmVsb3cuXG4gICAgdGhpcy5jb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYoZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlycy5zb21lKChbc291cmNlXSkgPT4gIXNvdXJjZS5zdGFydHNXaXRoKCdtaXNlIGVudicpKSk7XG4gICAgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdGFuZGFyZFdiRW52TW9kZXMgPSBuZXcgU2V0KFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXSk7XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlcyBhbmQgdmFsaWRhdGVzIHRoZSByZXNvbHZlZCBgV0JfRU5WYCBwZXIgdGhlIG9yZyBzdGFuZGFyZCAoc2VlIHRoZVxuICAgKiBndWlkZWxpbmVzLWZvci1taXNlLWZub3ggc2tpbGwpOlxuICAgKiAtIExvY2FsbHksIGFuIHVuc2V0IGBXQl9FTlZgIGZhbGxzIGJhY2sgdG8gdGhlIHNlbGVjdGVkIGNhc2NhZGUgbW9kZSAoZGV2ZWxvcG1lbnQgdW5sZXNzIGFcbiAgICogICBjb21tYW5kIGZvcmNlcyBhbm90aGVyLCBlLmcuIGB3YiB0ZXN0YCBmb3JjZXMgdGVzdCksIHNvIGNhc3VhbCBgYnVuIHdiIC4uLmAgaW52b2NhdGlvbnNcbiAgICogICB3b3JrIGluIHJlcG9zaXRvcmllcyB0aGF0IGRlZmluZSBubyBXQl9FTlYgYXQgYWxsLlxuICAgKiAtIE9uIENJLCBhbiB1bnNldCBgV0JfRU5WYCBpcyBhIGhhcmQgZXJyb3Igd2hlbiBlbnYgc291cmNlcyBleGlzdDogd29ya2Zsb3dzIG11c3QgZXhwb3J0IHRoZVxuICAgKiAgIGVudmlyb25tZW50IGV4cGxpY2l0bHkgaW5zdGVhZCBvZiBzaWxlbnRseSBydW5uaW5nIGluIGFuIGFtYmlndW91cyBtb2RlLlxuICAgKiAtIFRoZSB2YWx1ZSBtdXN0IG5hbWUgYSBzdGFuZGFyZCBtb2RlOyBhbiB1bmtub3duIHZhbHVlIChlLmcuIGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCkgd291bGRcbiAgICogICBvdGhlcndpc2Ugc2lsZW50bHkgc2VsZWN0IHRoZSBkZXZlbG9wbWVudCBjYXNjYWRlLCB3aGljaCBpcyB0aGUgZmFpbHVyZSB0aGlzIGd1YXJkcyBhZ2FpbnN0LlxuICAgKiAtIGBORVhUX1BVQkxJQ19XQl9FTlZgIGlzIGRlcml2ZWQgZnJvbSBgV0JfRU5WYCBmb3IgTmV4dC5qcy92aW5leHQgYXBwcyB3aGVuIG1pc3NpbmcsIHNvIGFcbiAgICogICBwcm9kdWN0aW9uIGJ1aWxkIGNhbiBubyBsb25nZXIgYmFrZSBhIHN0YWxlIGRldmVsb3BtZW50IHZhbHVlIGludG8gdGhlIGNsaWVudCBidW5kbGUuXG4gICAqIFNraXBwZWQgd2hlbiBgV0JfU0tJUF9FTlZfQ0hFQ0s9MWAgaXMgc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYoaGFzRW52aXJvbm1lbnRTb3VyY2VzOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgZW52ID0gdGhpcy5lbnZDYWNoZTtcbiAgICBpZiAoIWVudikgcmV0dXJuO1xuICAgIGlmIChlbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgPT09ICcxJyB8fCBlbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgPT09ICd0cnVlJykgcmV0dXJuO1xuXG4gICAgLy8gT24gQ0ksIFdCX0VOViBtdXN0IGJlIEVYUE9SVEVEIGJ5IHRoZSB3b3JrZmxvdyDigJQgY2hlY2tlZCBhZ2FpbnN0IHByb2Nlc3MuZW52LCBub3QgdGhlXG4gICAgLy8gbWVyZ2VkIGVudmlyb25tZW50OiBhIGNvbW1pdHRlZCBiYXNlIGRlZmF1bHQgKGUuZy4gZm5veCdzIGRldmVsb3BtZW50IGVudHJ5KSB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzYXRpc2Z5IHRoZSBjaGVjayBhbmQgc2lsZW50bHkgcnVuIENJIGluIGRldmVsb3BtZW50IG1vZGUuXG4gICAgaWYgKGlzQ0koZW52LkNJKSAmJiAhcHJvY2Vzcy5lbnYuV0JfRU5WICYmIGhhc0Vudmlyb25tZW50U291cmNlcykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICdXQl9FTlYgaXMgbm90IGV4cG9ydGVkIG9uIENJLiBFeHBvcnQgV0JfRU5WIGV4cGxpY2l0bHkgKHRoZSByZXVzYWJsZSB3b3JrZmxvd3MgcGFzcyBpdCB2aWEgdGhlIFwiZW52aXJvbm1lbnRcIiBpbnB1dCksICcgK1xuICAgICAgICAgICAgJ29yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICghZW52LldCX0VOVikge1xuICAgICAgLy8gVGhlIHNoYXJlZCByZXNvbHZlciBrZWVwcyB0aGlzIGZhbGxiYWNrIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2FzY2FkZSBzZWxlY3Rpb24gQU5EIHdpdGhcbiAgICAgIC8vIHRoZSAke1dCX0VOVn0gZXhwYW5zaW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyBhbHJlYWR5IHBlcmZvcm1lZDogdGhlIGZvcmNlZCBjYXNjYWRlXG4gICAgICAvLyAoZS5nLiBgd2IgdGVzdGApLCB0aGVuIHRoZSBjb21tYW5kLWxldmVsIGRlZmF1bHQsIHRoZW4gdGhlIEFNQklFTlQtTk9ERV9FTlYtZHJpdmVuIGF1dG9cbiAgICAgIC8vIGNhc2NhZGUgY2xhbXBlZCB0byBhIHN0YW5kYXJkIG1vZGUgKGFuIGV4cGxpY2l0IC0tY2FzY2FkZS1lbnYga2VlcHMgaXRzIHZhbHVlIGFuZCBpc1xuICAgICAgLy8gdmFsaWRhdGVkIGJlbG93IGxpa2UgYW55IG90aGVyIFdCX0VOVikuXG4gICAgICBjb25zdCBtb2RlID0gcmVzb2x2ZUZhbGxiYWNrV2JFbnYodGhpcy5hcmd2KTtcbiAgICAgIGVudi5XQl9FTlYgPSBtb2RlO1xuICAgICAgaWYgKGhhc0Vudmlyb25tZW50U291cmNlcyAmJiAhc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCh0aGlzLmFyZ3YpKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WIGlzIG5vdCBkZWZpbmVkOyBkZWZhdWx0aW5nIHRvIFwiJHttb2RlfVwiLmApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIVByb2plY3Quc3RhbmRhcmRXYkVudk1vZGVzLmhhcyhlbnYuV0JfRU5WKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7ZW52LldCX0VOVn1cIi4gYCArXG4gICAgICAgICAgICAnRml4IHRoZSB2YWx1ZSBpbiB0aGUgZW52IHNvdXJjZSBvciB0aGUgZXhwb3J0ZWQgdmFyaWFibGUsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIEEgZm9yY2VkIG1vZGUgKGFuIGV4cGxpY2l0L2NvbW1hbmQtZGVmYXVsdCAtLWNhc2NhZGUtZW52LCBvciBhbiBleHBvcnRlZCBXQl9FTlYgd2hvc2VcbiAgICAvLyBtb2RlLXNwZWNpZmljIGZpbGVzIG1heSBvdmVycmlkZSBpdCBsb2NhbGx5IHBlciBpc3N1ZSAjOTMwKSBtdXN0IG5vdCBiZSBzaWxlbnRseSByZXBsYWNlZFxuICAgIC8vIGJ5IGFub3RoZXIgbW9kZSBhIG1vZGUgZmlsZSBkZWZpbmVzOiBgd2IgdGVzdGAgcmVzb2x2aW5nIFdCX0VOVj1kZXZlbG9wbWVudCBmcm9tIGFcbiAgICAvLyBjb21taXR0ZWQgYC5lbnZgIHdvdWxkIHJ1biB0aGUgdGVzdHMgYWdhaW5zdCBkZXZlbG9wbWVudCB2YWx1ZXMsIGFuZCBhbiBleHBvcnRlZFxuICAgIC8vIFdCX0VOVj1wcm9kdWN0aW9uIG92ZXJyaWRkZW4gdG8gZGV2ZWxvcG1lbnQgYnkgYC5lbnYucHJvZHVjdGlvbmAgd291bGQgYnVpbGQvZGVwbG95IHRoZVxuICAgIC8vIHdyb25nIGVudmlyb25tZW50IHdoaWxlIGxvb2tpbmcgc3VjY2Vzc2Z1bC5cbiAgICAvLyAtLWNhc2NhZGUtbm9kZS1lbnYgZm9yY2VzIDxOT0RFX0VOViB8fCBkZXZlbG9wbWVudD4gKHBlciBpdHMgb3duIGRvY3VtZW50YXRpb24pLCByZWFkIGZyb21cbiAgICAvLyB0aGUgQU1CSUVOVCBlbnZpcm9ubWVudCBsaWtlIHRoZSBjYXNjYWRlIHNlbGVjdGlvbi4gT25seSBhIFNUQU5EQVJEIGZvcmNlZCBtb2RlIGlzIGVuZm9yY2VkOlxuICAgIC8vIGEgbm9uLXN0YW5kYXJkIG9uZSAoZS5nLiBOT0RFX0VOVj1xYSkgYWxyZWFkeSBoYWQgaXRzIGZhbGxiYWNrIGNsYW1wZWQgdG8gZGV2ZWxvcG1lbnQgYWJvdmUsXG4gICAgLy8gYW5kIGVycm9yaW5nIG9uIHRoYXQgY2xhbXAgd291bGQgY29udHJhZGljdCBpdC5cbiAgICBjb25zdCBmb3JjZWRNb2RlID1cbiAgICAgIHRoaXMuYXJndi5jYXNjYWRlRW52ID8/XG4gICAgICAodGhpcy5hcmd2LmNhc2NhZGVOb2RlRW52ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JyA6IHByb2Nlc3MuZW52LldCX0VOViB8fCB1bmRlZmluZWQpO1xuICAgIC8vIFRoZSBBVVRPLXNlbGVjdGVkIG1vZGUgY291bnRzIGFzIHRoZSBleHBlY3RhdGlvbiB0b286IHdpdGggbm90aGluZyBzZXQgYW55d2hlcmUsIHRoZVxuICAgIC8vIGRldmVsb3BtZW50IGNhc2NhZGUncyBmaWxlcyBhcmUgbG9hZGVkLCBzbyBhIGAuZW52LmxvY2FsYCBkZWNsYXJpbmcgV0JfRU5WPXByb2R1Y3Rpb24gd291bGRcbiAgICAvLyBvdGhlcndpc2UgcnVuIGRldmVsb3BtZW50IHNvdXJjZXMgbGFiZWxlZCBhcyBwcm9kdWN0aW9uLlxuICAgIGNvbnN0IGV4cGVjdGVkTW9kZSA9XG4gICAgICBmb3JjZWRNb2RlID8/ICh0aGlzLmFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcmVzb2x2ZUZhbGxiYWNrV2JFbnYodGhpcy5hcmd2KSA6IHVuZGVmaW5lZCk7XG4gICAgLy8gVGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCBpcyBhIGxlZ2l0aW1hdGUgc2Vjb25kIGV4cGVjdGF0aW9uOiBgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgXG4gICAgLy8gbG9hZHMgdGhlIHN0YWdpbmcgZmlsZXMgd2hpbGUgdGhlIGZhbGxiYWNrIGNvcnJlY3RseSBmaWxscyBXQl9FTlY9dGVzdC5cbiAgICBpZiAoXG4gICAgICBleHBlY3RlZE1vZGUgJiZcbiAgICAgIFByb2plY3Quc3RhbmRhcmRXYkVudk1vZGVzLmhhcyhleHBlY3RlZE1vZGUpICYmXG4gICAgICBlbnYuV0JfRU5WICE9PSBleHBlY3RlZE1vZGUgJiZcbiAgICAgIGVudi5XQl9FTlYgIT09IHRoaXMuYXJndi5jb21tYW5kRGVmYXVsdFdiRW52XG4gICAgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7ZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke2V4cGVjdGVkTW9kZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICAgICAgYEZpeCB0aGUgV0JfRU5WIGRlZmluZWQgaW4gdGhlIG1vZGUncyBlbnYgc291cmNlIChlLmcuIC5lbnYuJHtleHBlY3RlZE1vZGV9IG9yIHRoZSBmbm94IFwiJHtleHBlY3RlZE1vZGV9XCIgcHJvZmlsZSksIGAgK1xuICAgICAgICAgICAgJ29yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcXVpcmVzTmV4dFB1YmxpY1diRW52ICYmIGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgIT09IGVudi5XQl9FTlYpIHtcbiAgICAgIC8vIEFzc2lnbiB1bmNvbmRpdGlvbmFsbHksIG5vdCBgfHw9YDogdGhlIHBhaXIgbXVzdCBhZ3JlZSBieSBjb252ZW50aW9uLCBhbmQgYSBzdGFsZSB2YWx1ZVxuICAgICAgLy8gKGUuZy4gYSBiYXNlIGAuZW52YCdzIGRldmVsb3BtZW50IGRlZmF1bHQgd2hpbGUgQ0kgZXhwb3J0cyBXQl9FTlY9dGVzdCkgd291bGQgb3RoZXJ3aXNlXG4gICAgICAvLyBiZSBiYWtlZCBpbnRvIHRoZSBjbGllbnQgYnVuZGxlIGV2ZW4gdGhvdWdoIHRoZSBzZXJ2ZXIgc2lkZSBydW5zIHdpdGggdGhlIGNvcnJlY3QgV0JfRU5WLlxuICAgICAgaWYgKGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgJiYgIXNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQodGhpcy5hcmd2KSkge1xuICAgICAgICBjb25zb2xlLmluZm8oYE92ZXJyaWRpbmcgTkVYVF9QVUJMSUNfV0JfRU5WIChcIiR7ZW52Lk5FWFRfUFVCTElDX1dCX0VOVn1cIikgd2l0aCBXQl9FTlYgKFwiJHtlbnYuV0JfRU5WfVwiKS5gKTtcbiAgICAgIH1cbiAgICAgIGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgPSBlbnYuV0JfRU5WO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KCk6IGJvb2xlYW4ge1xuICAgIC8vIE9XTiBkZXBlbmRlbmNpZXMgb25seTogYSByb290LWxldmVsIG5leHQvdmluZXh0IGRldkRlcGVuZGVuY3kgaW4gYSBtaXhlZCBtb25vcmVwbyBtdXN0IG5vdFxuICAgIC8vIGZvcmNlIE5FWFRfUFVCTElDX1dCX0VOViBvbnRvIGV2ZXJ5IG5vbi1OZXh0IHdvcmtzcGFjZSBwYWNrYWdlLlxuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ25leHQnKSB8fCAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ZpbmV4dCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ByaXNtYScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCh0aGlzLmRpclBhdGgsIHRoaXMuZW52KTtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd1BhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKCcvLycpID8gcmF3UGF0aC5zbGljZSgyKSA6IHJhd1BhdGg7XG4gIHJldHVybiBub3JtYWxpemVkUGF0aCB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+ICYgUGFydGlhbDxQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdyb290RGlyUGF0aCc+PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBpZiAocGF0aC5pc0Fic29sdXRlKGRiUGF0aCkpIHJldHVybiBkYlBhdGg7XG5cbiAgY29uc3QgYmFzZURpclBhdGggPSBwcm9qZWN0LnJvb3REaXJQYXRoID8/IHByb2plY3QuZGlyUGF0aDtcbiAgcmV0dXJuIGJhc2VEaXJQYXRoID8gcGF0aC5yZXNvbHZlKGJhc2VEaXJQYXRoLCBkYlBhdGgpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBkZXNjZW5kYW50czogUHJvamVjdFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvamVjdC5lbnYuV0JfRU5WID09PSBuYW1lIHx8IHByb2plY3QuZW52Lk1JU0VfRU5WID09PSBuYW1lO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5mdW5jdGlvbiB0ZXN0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZywgcGF0dGVybjogUmVnRXhwKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhdHRlcm4udGVzdChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBbcm9vdFByb2plY3RdO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IHJvb3RQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2UpKSByZXR1cm4gcHJvamVjdHM7XG5cbiAgY29uc3QgZ2xvYlBhdHRlcm46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VEaXJzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdGggb2Ygd29ya3NwYWNlLm1hcCgod3M6IHN0cmluZykgPT4gcGF0aC5qb2luKHJvb3RQcm9qZWN0LmRpclBhdGgsIHdzKSkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3Jrc3BhY2VQYXRoKSkge1xuICAgICAgcGFja2FnZURpcnMucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYlBhdHRlcm4ucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9XG4gIH1cbiAgcGFja2FnZURpcnMucHVzaCguLi4oYXdhaXQgZ2xvYmJ5KGdsb2JQYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSk7XG4gIGZvciAoY29uc3Qgc3ViUGFja2FnZURpclBhdGggb2YgcGFja2FnZURpcnMpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YlBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcblxuICAgIHByb2plY3RzLnB1c2gobmV3IFByb2plY3Qoc3ViUGFja2FnZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpKTtcbiAgfVxuICByZXR1cm4gcHJvamVjdHM7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdCdWlsZCBvdXRwdXQgcGF0aHMgKHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSkgdGhhdCBtdXN0IGV4aXN0IGZvciB0aGUgY2FjaGUgdG8gYmUgdmFsaWQgKGRlZmF1bHQ6IGF1dG8tZGV0ZWN0ZWQgY29tbW9uIG91dHB1dCBkaXJlY3RvcmllcyknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRDb21tYW5kID1cbiAgICBhcmd2LmNvbW1hbmQgPz8gKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZH0gYnVpbGRgIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICAvLyBUaGUgY2FjaGUgcmVxdWlyZXMgdGhlIGdpdCByZXBvc2l0b3J5IHJvb3QgdG8gQkUgcm9vdERpclBhdGg6IHBvcmNlbGFpbiBwYXRocyBhbmQgZGlmZlxuICAvLyBwYXRoc3BlY3MgYmVsb3cgYXJlIGpvaW5lZC9leGVjdXRlZCBhZ2FpbnN0IHJvb3REaXJQYXRoLiBXaGVuIHRoZSByZXBvIHJvb3QgaXMgZWxzZXdoZXJlXG4gIC8vIChlLmcuIGEgc3VicHJvamVjdCBvZiBhIGxhcmdlciByZXBvc2l0b3J5KSwgYWx3YXlzIGJ1aWxkIGluc3RlYWQgb2YgbWlzLXJlc29sdmluZyBwYXRocy5cbiAgLy8gQSBmcmVzaGx5IGluaXRpYWxpemVkIHJlcG8gd2l0aG91dCBjb21taXRzICh1bmJvcm4gSEVBRCkgbGlrZXdpc2UgYnVpbGRzIHdpdGhvdXQgY2FjaGluZzpcbiAgLy8gYGdpdCByZXYtcGFyc2UgSEVBRGAgd291bGQgdGhyb3cuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkgfHwgIWhhc0dpdENvbW1pdChwcm9qZWN0KSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCBvdXRwdXRQYXRocyA9IGdldEV4cGxpY2l0T3V0cHV0UGF0aHMoYXJndikgPz8gZGV0ZWN0RXhpc3RpbmdEZWZhdWx0T3V0cHV0UGF0aHMocHJvamVjdCk7XG4gICAgaWYgKG91dHB1dFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gV2l0aCBubyByZWNvcmRlZCBvdXRwdXRzLCBhIGRlbGV0ZWQgYnVpbGQgZGlyZWN0b3J5IGNhbiBuZXZlciBpbnZhbGlkYXRlIHRoZSBjYWNoZTsgbWFrZVxuICAgICAgLy8gdGhlIGluYWN0aXZlIHByb3RlY3Rpb24gdmlzaWJsZSBpbnN0ZWFkIG9mIGZhaWxpbmcgc2lsZW50bHkgKGNmLiBpc3N1ZSAjOTgxKS5cbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsueWVsbG93KCdObyBidWlsZCBvdXRwdXQgZGlyZWN0b3J5IGRldGVjdGVkOyBwYXNzIC0tb3V0cHV0IHRvIGVuYWJsZSBtaXNzaW5nLW91dHB1dCBjYWNoZSBpbnZhbGlkYXRpb24uJylcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeSh7IGhhc2g6IGNvbnRlbnRIYXNoLCBvdXRwdXRQYXRocyB9KSwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gQ29tbW9uIGJ1aWxkIG91dHB1dCBkaXJlY3RvcmllcyB1c2VkIGFjcm9zcyBvcmcgcHJvamVjdHMgKHZpbmV4dC9idWlsZC10cyBlbWl0IGRpc3QsXG4vLyBOZXh0LmpzIGVtaXRzIC5uZXh0LCBDUkEtc3R5bGUgYXBwcyBlbWl0IGJ1aWxkLCBgbmV4dCBleHBvcnRgIGVtaXRzIG91dCkuXG5jb25zdCBkZWZhdWx0T3V0cHV0Q2FuZGlkYXRlcyA9IFsnZGlzdCcsICdidWlsZCcsICcubmV4dCcsICdvdXQnXTtcblxuZnVuY3Rpb24gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gYXJndi5vdXRwdXQ/Lmxlbmd0aCA/IGFyZ3Yub3V0cHV0Lm1hcChTdHJpbmcpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RFeGlzdGluZ0RlZmF1bHRPdXRwdXRQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICByZXR1cm4gZGVmYXVsdE91dHB1dENhbmRpZGF0ZXMuZmlsdGVyKChvdXRwdXRQYXRoKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIG91dHB1dFBhdGgpKSk7XG59XG5cbi8qKiBBbiBgLS1vdXRwdXRgIHZhbHVlIG1heSBuYW1lIGEgZmlsZSwgc28gbWF0Y2ggdGhlIGV4YWN0IHBhdGggYXMgd2VsbCBhcyBkZXNjZW5kYW50cy4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNPdXRwdXRQYXRoKG91dHB1dFBhdGhzOiBzdHJpbmdbXSwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3V0cHV0UGF0aHMuc29tZSgob3V0cHV0UGF0aCkgPT4gZmlsZVBhdGggPT09IG91dHB1dFBhdGggfHwgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtvdXRwdXRQYXRofS9gKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0dpdENvbW1pdChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgJ0hFQUQnXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgfSkuc3RhdHVzID09PSAwXG4gICk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIC8vIFRoZSBpbnZva2VkIGJ1aWxkIGNvbW1hbmQgaXMgcGFydCBvZiB0aGUgY2FjaGUgaWRlbnRpdHk6IGAtYyBjb21tYW5kQmAgbXVzdCBub3QgcmV1c2UgYVxuICAvLyBjYWNoZSByZWNvcmRlZCBmb3IgY29tbWFuZEEgd2l0aCBvdGhlcndpc2UgdW5jaGFuZ2VkIGlucHV0cy5cbiAgaGFzaC51cGRhdGUoYXJndi5jb21tYW5kID8/ICcnKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnQgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgY29uc3QgY2FjaGUgPSBwYXJzZUJ1aWxkQ2FjaGUoY2FjaGVkQ29udGVudCk7XG4gIGlmIChjYWNoZT8uaGFzaCAhPT0gY29udGVudEhhc2gpIHJldHVybiBbZmFsc2UsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcblxuICAvLyBUaGUgY2FjaGUgaXMgdmFsaWQgb25seSB3aGlsZSB0aGUgcmVjb3JkZWQgKG9yIGV4cGxpY2l0bHkgcmVxdWVzdGVkKSBidWlsZCBvdXRwdXRzIHN0aWxsXG4gIC8vIGV4aXN0OiBhIGRlbGV0ZWQgb3V0cHV0IGRpcmVjdG9yeSAoZS5nLiBgcm0gLXJmIGRpc3RgKSBtdXN0IHRyaWdnZXIgYSByZWJ1aWxkIGV2ZW4gd2hlbiB0aGVcbiAgLy8gaW5wdXRzIGFyZSB1bmNoYW5nZWQgKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk4MSkuXG4gIGNvbnN0IHJlcXVpcmVkT3V0cHV0UGF0aHMgPSBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKGFyZ3YpID8/IGNhY2hlLm91dHB1dFBhdGhzO1xuICBjb25zdCBtaXNzaW5nT3V0cHV0UGF0aHMgPSByZXF1aXJlZE91dHB1dFBhdGhzLmZpbHRlcihcbiAgICAob3V0cHV0UGF0aCkgPT4gIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpXG4gICk7XG4gIGlmIChtaXNzaW5nT3V0cHV0UGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFJlYnVpbGRpbmcgYmVjYXVzZSBidWlsZCBvdXRwdXRzIGFyZSBtaXNzaW5nOiAke21pc3NpbmdPdXRwdXRQYXRocy5qb2luKCcsICcpfWApKTtcbiAgICByZXR1cm4gW2ZhbHNlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG4gIH1cbiAgcmV0dXJuIFt0cnVlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVpbGRDYWNoZShjYWNoZWRDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB7IGhhc2g6IHN0cmluZzsgb3V0cHV0UGF0aHM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIWNhY2hlZENvbnRlbnQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNhY2hlZENvbnRlbnQpIGFzIHsgaGFzaD86IHVua25vd247IG91dHB1dFBhdGhzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgcGFyc2VkPy5oYXNoICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gQXJyYXkuaXNBcnJheShwYXJzZWQub3V0cHV0UGF0aHMpXG4gICAgICA/IHBhcnNlZC5vdXRwdXRQYXRocy5maWx0ZXIoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJylcbiAgICAgIDogW107XG4gICAgcmV0dXJuIHsgaGFzaDogcGFyc2VkLmhhc2gsIG91dHB1dFBhdGhzIH07XG4gIH0gY2F0Y2gge1xuICAgIC8vIEEgbGVnYWN5IGNhY2hlIGZpbGUgY29udGFpbnMgYSByYXcgY29udGVudCBoYXNoIHdpdGhvdXQgb3V0cHV0IHJlY29yZHMuIFRyZWF0IGl0IGFzIGEgbWlzczpcbiAgICAvLyBob25vcmluZyBpdCB3b3VsZCBsZXQgYSBtYXRjaGluZyBoYXNoIHNraXAgYSBidWlsZCB3aG9zZSBvdXRwdXRzIHdlcmUgZGVsZXRlZCwgYW5kIG9uZVxuICAgIC8vIHJlYnVpbGQgdXBncmFkZXMgdGhlIHJlY29yZCB0byB0aGUgSlNPTiBmb3JtYXQuXG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8vIE1hdGNoZWQgYXMgY29tcGxldGUgcGF0aCBTRUdNRU5UUyAobm90IHN1YnN0cmluZ3MpOiBgc3JjL2NvbnRlc3QvYCBtdXN0IG5vdCBiZSBleGNsdWRlZCBieVxuLy8gYHRlc3RgLCBhbmQgYG15c3JjL2AgbXVzdCBub3QgYmUgaW5jbHVkZWQgYnkgYHNyY2AuXG5jb25zdCBpbmNsdWRlRGlyTmFtZXMgPSBuZXcgU2V0KFsnc3JjJywgJ3B1YmxpYyddKTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbiAgJ2J1bi5sb2NrJyxcbiAgJ2J1bi5sb2NrYicsXG5dO1xuY29uc3QgZXhjbHVkZURpck5hbWVzID0gbmV3IFNldChbJ3Rlc3QnLCAndGVzdHMnLCAnX190ZXN0c19fJywgJ3Rlc3QtZml4dHVyZXMnXSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIC8vIGAtdWFsbGAgbGlzdHMgdW50cmFja2VkIGZpbGVzIGluZGl2aWR1YWxseSAobm90IGp1c3QgdGhlaXIgZGlyZWN0b3J5KSwgc28gbmV3IGZpbGVzIGluIGFcbiAgICAvLyBicmFuZC1uZXcgc291cmNlIGRpcmVjdG9yeSBwYXJ0aWNpcGF0ZSBpbiB0aGUgaGFzaCBiZWxvdy4gYC16YCB5aWVsZHMgTlVMLWRlbGltaXRlZCxcbiAgICAvLyBVTlFVT1RFRCByZWNvcmRzOiB3aXRob3V0IGl0IGdpdCBDLXF1b3RlcyBub24tQVNDSUkgcGF0aHMsIHdoaWNoIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhvc2VcbiAgICAvLyBmaWxlcyBmcm9tIGJvdGggdGhlIHVudHJhY2tlZCBoYXNoaW5nIGFuZCB0aGUgYGdpdCBkaWZmYCBwYXRoc3BlY3MuXG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJywgJy11YWxsJywgJy16J10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IHRva2VucyA9IHJldC5zdGRvdXQuc3BsaXQoJ1xcMCcpLmZpbHRlcigodG9rZW4pID0+IHRva2VuLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IHN0YXR1c0VudHJpZXM6IHsgdW50cmFja2VkOiBib29sZWFuOyBmaWxlUGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0hO1xuICAgICAgY29uc3Qgc3RhdHVzID0gdG9rZW4uc2xpY2UoMCwgMik7XG4gICAgICBzdGF0dXNFbnRyaWVzLnB1c2goeyB1bnRyYWNrZWQ6IHN0YXR1cyA9PT0gJz8/JywgZmlsZVBhdGg6IHRva2VuLnNsaWNlKDMpIH0pO1xuICAgICAgLy8gUmVuYW1lL2NvcHkgcmVjb3JkcyBjYXJyeSB0aGUgT1JJR0lOQUwgcGF0aCBhcyBhbiBleHRyYSBOVUwtZGVsaW1pdGVkIGZpZWxkOyBpbmNsdWRlIGl0XG4gICAgICAvLyBzbyBhIGZpbGUgcmVuYW1lZCBvdXQgb2YgdGhlIGJ1aWxkIGlucHV0cyBzdGlsbCBpbnZhbGlkYXRlcyB0aGUgY2FjaGUuXG4gICAgICBpZiAoc3RhdHVzLmluY2x1ZGVzKCdSJykgfHwgc3RhdHVzLmluY2x1ZGVzKCdDJykpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxQYXRoID0gdG9rZW5zWysraW5kZXhdO1xuICAgICAgICBpZiAob3JpZ2luYWxQYXRoKSBzdGF0dXNFbnRyaWVzLnB1c2goeyB1bnRyYWNrZWQ6IGZhbHNlLCBmaWxlUGF0aDogb3JpZ2luYWxQYXRoIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkRW50cmllcyA9IHN0YXR1c0VudHJpZXMubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIC4uLmVudHJ5LFxuICAgICAgaGFzaFBhdGg6XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnXG4gICAgICAgICAgPyBlbnRyeS5maWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJylcbiAgICAgICAgICA6IGVudHJ5LmZpbGVQYXRoLFxuICAgIH0pKTtcbiAgICAvLyBCdWlsZCBPVVRQVVRTIG11c3QgbmV2ZXIgY291bnQgYXMgYnVpbGQgaW5wdXRzOiBoYXNoaW5nIGUuZy4gYW4gdW50cmFja2VkIGRpc3QvIGZpbGUgd291bGRcbiAgICAvLyBjaGFuZ2UgdGhlIGhhc2ggb24gZXZlcnkgYnVpbGQgYW5kIGRpc2FibGUgdGhlIGNhY2hlIHBlcm1hbmVudGx5LlxuICAgIGNvbnN0IHByb2plY3RSZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3Qucm9vdERpclBhdGgsIHByb2plY3QuZGlyUGF0aCk7XG4gICAgY29uc3QgZXhwbGljaXRPdXRwdXRQYXRocyA9IChnZXRFeHBsaWNpdE91dHB1dFBhdGhzKGFyZ3YpID8/IFtdKS5tYXAoKG91dHB1dFBhdGgpID0+XG4gICAgICBwYXRoLmpvaW4ocHJvamVjdFJlbGF0aXZlRGlyUGF0aCwgb3V0cHV0UGF0aClcbiAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRW50cmllcyA9IG5vcm1hbGl6ZWRFbnRyaWVzLmZpbHRlcigoeyBmaWxlUGF0aCwgaGFzaFBhdGggfSkgPT4ge1xuICAgICAgY29uc3QgZGlyZWN0b3J5U2VnbWVudHMgPSBoYXNoUGF0aC5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChkaXJlY3RvcnlTZWdtZW50cy5zb21lKChzZWdtZW50KSA9PiBpbmNsdWRlRGlyTmFtZXMuaGFzKHNlZ21lbnQpKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBoYXNoUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWRpcmVjdG9yeVNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+IGV4Y2x1ZGVEaXJOYW1lcy5oYXMoc2VnbWVudCkpICYmXG4gICAgICAgIC8vIE9ubHkgRVhQTElDSVRMWSBkZWNsYXJlZCBvdXRwdXRzIGFyZSBleGNsdWRlZCBmcm9tIHRoZSBpbnB1dCBoYXNoLiBEZWZhdWx0IGNhbmRpZGF0ZXNcbiAgICAgICAgLy8gKGRpc3QvYnVpbGQvLm5leHQvb3V0KSBhcmUgTk9UOiBnaXRpZ25vcmVkIGFydGlmYWN0cyBuZXZlciBhcHBlYXIgaW4gYGdpdCBzdGF0dXNgXG4gICAgICAgIC8vIGFueXdheSwgYW5kIGEgbm9uLWlnbm9yZWQgZmlsZSB0aGVyZSBtYXkgYmUgZ2VudWluZSBzb3VyY2UgKGUuZy4gYnVpbGQvIHNjcmlwdHMpLCB3aG9zZVxuICAgICAgICAvLyBjaGFuZ2VzIG11c3QgaW52YWxpZGF0ZSB0aGUgY2FjaGUg4oCUIGNvcnJlY3RuZXNzIG92ZXIgY2FjaGUgaGl0cy4gUHJvamVjdHMga2VlcGluZ1xuICAgICAgICAvLyBub24taWdub3JlZCBhcnRpZmFjdHMgaW4gdGhvc2UgZGlyZWN0b3JpZXMgc2hvdWxkIGdpdGlnbm9yZSB0aGVtIG9yIHBhc3MgLS1vdXRwdXQuXG4gICAgICAgICFtYXRjaGVzT3V0cHV0UGF0aChleHBsaWNpdE91dHB1dFBhdGhzLCBmaWxlUGF0aClcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRW50cmllcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5oYXNoUGF0aCkuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBVbnRyYWNrZWQgZmlsZXMgbmV2ZXIgYXBwZWFyIGluIGBnaXQgZGlmZmAsIHNvIGhhc2ggdGhlaXIgY29udGVudHMgZGlyZWN0bHkuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBmaWx0ZXJlZEVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkudW50cmFja2VkKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFzaC51cGRhdGUoZW50cnkuaGFzaFBhdGgpO1xuICAgICAgICBoYXNoLnVwZGF0ZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsIGVudHJ5LmZpbGVQYXRoKSkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBmaWxlIG1heSB2YW5pc2ggY29uY3VycmVudGx5OyB0aGUgdHJhY2tlZC1zdGF0ZSBkaWZmIGJlbG93IGlzIHVuYWZmZWN0ZWQuXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tlZFBhdGhzID0gZmlsdGVyZWRFbnRyaWVzLmZpbHRlcigoZW50cnkpID0+ICFlbnRyeS51bnRyYWNrZWQpLm1hcCgoZW50cnkpID0+IGVudHJ5Lmhhc2hQYXRoKTtcbiAgICBpZiAodHJhY2tlZFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gYGdpdCBkaWZmIEhFQUQgLS1gIHdpdGggbm8gcGF0aHNwZWMgd291bGQgZGlmZiBFVkVSWSBmaWxlLCBsZXR0aW5nIGV4Y2x1ZGVkIGNoYW5nZXNcbiAgICAgIC8vIChkb2NzLCB0ZXN0cykgaW52YWxpZGF0ZSB0aGUgY2FjaGUuXG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGBnaXQgZGlmZiBIRUFEYCAobm90IHBsYWluIGBnaXQgZGlmZmApIHNvIHN0YWdlZC1vbmx5IGNoYW5nZXMgaW52YWxpZGF0ZSB0aGUgY2FjaGUgdG9vO1xuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aC5cbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJ0hFQUQnLCAnLS0nLCAuLi50cmFja2VkUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY2k/OiBib29sZWFuO1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xuICBvblNpZ25hbD86IChzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4gdm9pZDtcbiAgb21pdFNpbGVudFN0YXJ0PzogYm9vbGVhbjtcbiAgcHJlc2VydmVDb2xvcj86IGJvb2xlYW47XG4gIHByb2Nlc3NTaWxlbnRPdXRwdXQ/OiAob3V0cHV0OiBzdHJpbmcpID0+IHN0cmluZztcbiAgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuO1xuICBwcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHk/OiBib29sZWFuO1xuICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM/OiBudW1iZXI7XG4gIHNpbGVudFN1Y2Nlc3NNZXNzYWdlPzogc3RyaW5nO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBCdWZmZXJlZFJ1blJlc3VsdCB7XG4gIGV4aXRDb2RlOiBudW1iZXI7XG4gIG91dHB1dDogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4gJiB7IHNpbGVudD86IGJvb2xlYW4gfSxcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIGlmICghKGFyZ3Yuc2lsZW50ICYmIG9wdHMub21pdFNpbGVudFN0YXJ0ICYmICFhcmd2LmRyeVJ1bikpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCBhcmd2LnNpbGVudCA/ICdDb21tYW5kJyA6ICdTdGFydCcpO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0ID0gQm9vbGVhbihcbiAgICBhcmd2LnNpbGVudCAmJiAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8/IG9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5KVxuICApO1xuICBsZXQgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IGZhbHNlO1xuICBjb25zdCBwcm9ncmVzc1RpbWVyID1cbiAgICBhcmd2LnNpbGVudCAmJiBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNc1xuICAgICAgPyBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJy4nKTtcbiAgICAgICAgICB3cm90ZVNpbGVudFByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgfSwgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gKGFyZ3Yuc2lsZW50ID8gdHJ1ZSA6IHVuZGVmaW5lZCkgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86IGFyZ3Yuc2lsZW50ID8gJ3BpcGUnIDogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBtZXJnZU91dEFuZEVycm9yOiBzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIHByaW50aW5nU3RkZXJyOiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmc6IGFyZ3Yuc2lsZW50LFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgaWYgKHByb2dyZXNzVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICh3cm90ZVNpbGVudFByb2dyZXNzKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG4gIGlmIChzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0ICYmICghb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkgfHwgZXhpdENvZGUgIT09IDApKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/IG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dChyZXQuc3Rkb3V0KSA6IHJldC5zdGRvdXQpLnRyaW0oKTtcbiAgICBpZiAob3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgfVxuICBpZiAoYXJndi5zaWxlbnQgJiYgZXhpdENvZGUgPT09IDAgJiYgb3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSk7XG4gIH1cbiAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBleGl0Q29kZSwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gdHJ1ZSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQgJiYgIW9wdHMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxCdWZmZXJlZFJ1blJlc3VsdD4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgb3V0cHV0OiAnJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHJldHVybiB7XG4gICAgICBleGl0Q29kZTogcmV0LnN0YXR1cyA/PyAxLFxuICAgICAgb3V0cHV0OiByZXQuc3Rkb3V0LFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogeyBwcmludGFibGU6IHN0cmluZzsgcnVubmFibGU6IHN0cmluZyB9IHtcbiAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHMgcmVxdWlyaW5nXG4gIC8vIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCkuXG4gIGNvbnN0IHByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAvUFJJU01BIGdlbmVyYXRlKD8hXFxzKy0tbm8taGludHMpKD89XFxzfCQpL2d1LFxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1BSSVNNQSBnZW5lcmF0ZScgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiBydW4gJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1bikgcnVuYC5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ3lhcm4gcnVuICcpO1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gcnVuIGJ1biBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IG5ld1NjcmlwdFxuICAgIC8vIEtlZXAgUGxheXdyaWdodCBhcyBhIHBhY2thZ2UtbWFuYWdlciBjb21tYW5kIGluc3RlYWQgb2YgcmVzb2x2aW5nIGl0IHRocm91Z2ggbm9kZV9tb2R1bGVzLy5iaW4uXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGNvbmZpZ3VyZUNvbG9yRW52KG5ld0Vudiwgb3B0cy5wcmVzZXJ2ZUNvbG9yKTtcbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGNoaWxkLXByb2Nlc3MgY29sb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB3Yi1tYW5hZ2VkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBjaGlsZC1wcm9jZXNzIGVudmlyb25tZW50IHRvIG11dGF0ZS5cbiAqIEBwYXJhbSBwcmVzZXJ2ZUNvbG9yIFdoZXRoZXIgd2Igc2hvdWxkIHByZXNlcnZlIGNvbG9ycyBmb3Igb3V0cHV0IHRoYXQgaXQgY2FwdHVyZXMgYW5kIHJlcHJpbnRzIHRvIGFuIGludGVyYWN0aXZlIFRUWS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUNvbG9yRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgcHJlc2VydmVDb2xvcj86IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGVudi5OT19DT0xPUiAhPT0gdW5kZWZpbmVkIHx8IHByZXNlcnZlQ29sb3IgPT09IGZhbHNlKSB7XG4gICAgLy8gTk9fQ09MT1IgYW5kIHByZXNlcnZlQ29sb3I9ZmFsc2UgYXJlIGV4cGxpY2l0IG5vLWNvbG9yIGNob2ljZXMsIHNvIGluaGVyaXRlZCBGT1JDRV9DT0xPUiBtdXN0IG5vdCBsZWFrIHRocm91Z2guXG4gICAgZGVsZXRlIGVudi5GT1JDRV9DT0xPUjtcbiAgfSBlbHNlIGlmIChwcmVzZXJ2ZUNvbG9yICYmIHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIH1cbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHNpbGVudD86IGJvb2xlYW4gfSkuc2lsZW50ID09PSB0cnVlICYmXG4gICAgZ2V0T3B0aW9uVmFsdWUoYXJndiwgJ3F1aWV0LWVudicpID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgYXJncy5wdXNoKCctLXF1aWV0LWVudicpO1xuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYsIG5vcm1hbGl6ZVNjcmlwdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBGT1JDRV9LSUxMX0RFTEFZX01TID0gNTAwMDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2tpbGwtb3RoZXJzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGV4aXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdraWxsLW90aGVycy1vbi1mYWlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGZhaWxzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHN1Y2Nlc3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmluZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gY3JpdGVyaWEnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnYWxsJywgJ2ZpcnN0J10sXG4gICAgZGVmYXVsdDogJ2FsbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZHMgdG8gcnVuIGNvbmN1cnJlbnRseScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBSdW5Db25jdXJyZW50bHlPcHRpb25zIHtcbiAgY29tbWFuZHM6IHN0cmluZ1tdO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBraWxsT3RoZXJzOiBib29sZWFuO1xuICBraWxsT3RoZXJzT25GYWlsOiBib29sZWFuO1xuICBzdWNjZXNzOiAnYWxsJyB8ICdmaXJzdCc7XG4gIGNpPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbnRseUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjb25jdXJyZW50bHkgPGNvbW1hbmRzLi4uPicsXG4gIGRlc2NyaWJlOiAnUnVuIGNvbW1hbmRzIGNvbmN1cnJlbnRseScsXG4gIGJ1aWxkZXI6IHsgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsIC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gKGFyZ3YuY29tbWFuZHMgPz8gW10pLm1hcChTdHJpbmcpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29tbWFuZHMgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkNvbmN1cnJlbnRseSh7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBraWxsT3RoZXJzOiBhcmd2LmtpbGxPdGhlcnMgPz8gZmFsc2UsXG4gICAgICAgIGtpbGxPdGhlcnNPbkZhaWw6IGFyZ3Yua2lsbE90aGVyc09uRmFpbCA/PyBmYWxzZSxcbiAgICAgICAgc3VjY2VzczogYXJndi5zdWNjZXNzLFxuICAgICAgICBjaTogdHlwZW9mIGFyZ3YuY2kgPT09ICdib29sZWFuJyA/IGFyZ3YuY2kgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db25jdXJyZW50bHkob3B0aW9uczogUnVuQ29uY3VycmVudGx5T3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+XG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3bihub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgb3B0aW9ucy5wcm9qZWN0KS5ydW5uYWJsZSwge1xuICAgICAgY3dkOiBvcHRpb25zLnByb2plY3QuZGlyUGF0aCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYob3B0aW9ucy5wcm9qZWN0LmVudiwgeyBjaTogb3B0aW9ucy5jaSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZm9yY2VLaWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbTxudW1iZXIgfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiBjaGlsZHJlbi5sZW5ndGggfSk7XG4gIGNvbnN0IHdhaXRGb3JFeGl0UHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNldHRsZSA9IChleGl0Q29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZXhpdENvZGU7XG4gICAgICAgIGZpcnN0UmVzdWx0ID8/PSBleGl0Q29kZTtcblxuICAgICAgICBpZiAoIXN0b3BwaW5nICYmIHNob3VsZFN0b3BPdGhlcnMoZXhpdENvZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcFJlc3VsdCA9IGV4aXRDb2RlO1xuICAgICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCAnU0lHVEVSTScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgICAgIHNldHRsZSgxKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgc2V0dGxlKGdldEV4aXRDb2RlKGNvZGUgPz8gdW5kZWZpbmVkLCBzaWduYWwgPz8gdW5kZWZpbmVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBzaWduYWwpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lnaW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR0lOVCcpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWd0ZXJtID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1RFUk0nKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lncXVpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdRVUlUJyk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgcHJvY2Vzcy5vbignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3JFeGl0UHJvbWlzZXMpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGZvcmNlS2lsbFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUodW5kZWZpbmVkLCBpbnRlcnJ1cHRlZFNpZ25hbCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnKSB7XG4gICAgcmV0dXJuIGZpcnN0UmVzdWx0ID8/IDE7XG4gIH1cbiAgaWYgKHN0b3BSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdG9wUmVzdWx0O1xuICB9XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpdENvZGUoY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG4gIGlmIChzaWduYWwgJiYgc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSB7XG4gICAgcmV0dXJuIDEyOCArIGNvbnN0YW50cy5zaWduYWxzW3NpZ25hbF07XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3BPdGhlcnMoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFBpY2s8UnVuQ29uY3VycmVudGx5T3B0aW9ucywgJ2tpbGxPdGhlcnMnIHwgJ2tpbGxPdGhlcnNPbkZhaWwnIHwgJ3N1Y2Nlc3MnPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcgfHwgb3B0aW9ucy5raWxsT3RoZXJzIHx8IChvcHRpb25zLmtpbGxPdGhlcnNPbkZhaWwgJiYgZXhpdENvZGUgIT09IDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmb3JjZUtpbGxQaWRzID0gc2lnbmFsUGlkcyh0b0NoaWxkUGlkcyhjaGlsZHJlbiksIHNpZ25hbCk7XG4gIGlmIChmb3JjZUtpbGxQaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmIChhd2FpdCB3YWl0Rm9yRm9yY2VLaWxsKGZvcmNlS2lsbFBpZHMpKSB7XG4gICAgc2lnbmFsUGlkcyhmb3JjZUtpbGxQaWRzLCAnU0lHS0lMTCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRQaWRzKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdKTogbnVtYmVyW10ge1xuICByZXR1cm4gY2hpbGRyZW4uZmxhdE1hcCgoY2hpbGQpID0+IChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCA/IFtdIDogW2NoaWxkLnBpZF0pKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsUGlkcyhwaWRzOiByZWFkb25seSBudW1iZXJbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IG51bWJlcltdIHtcbiAgY29uc3Qgc2lnbmFsZWRQaWRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBpZCBvZiBwaWRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgha2lsbFByb2Nlc3NHcm91cChwaWQsIHNpZ25hbCkpIGNvbnRpbnVlO1xuXG4gICAgICBzaWduYWxlZFBpZHMucHVzaChwaWQpO1xuICAgICAgdHJlZUtpbGwocGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmFsZWRQaWRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRm9yY2VLaWxsKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEZPUkNFX0tJTExfREVMQVlfTVM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocGlkcy5ldmVyeShpc1Byb2Nlc3NHcm91cEdvbmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBzbGVlcChNYXRoLm1pbigxMDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1Byb2Nlc3NHcm91cEdvbmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgMCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZykpLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWV9PSR7c2hlbGxFc2NhcGVBcmd1bWVudCh2YWx1ZSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li86PSxAJSstXSskL3UudGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlQWxsKFwiJ1wiLCBgJ1wiJ1wiJ2ApfSdgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuL3NoZWxsLmpzJztcblxuY29uc3Qgd3JhbmdsZXJDb25maWdGaWxlTmFtZXMgPSBbJ3dyYW5nbGVyLmpzb25jJywgJ3dyYW5nbGVyLmpzb24nLCAnd3JhbmdsZXIudG9tbCddO1xuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBnZW5lcmF0aW5nIGEgLmRldi52YXJzIGZpbGUgKHZpYSBgd2IgZ2VuLWRldi12YXJzYCkgc28gdGhhdFxuICogYHdyYW5nbGVyIGRldmAgY2FuIHNlZSB0aGUgd2ItbWFuYWdlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3Y6IFNjcmlwdEFyZ3YsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnd2InLCAnZ2VuLWRldi12YXJzJywgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLCBvdXRwdXRQYXRoXSk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBgd3JhbmdsZXIgZGV2YC1zdHlsZSBjb21tYW5kLiBgZW52IC11IENMT1VERkxBUkVfRU5WYCBtYWtlcyB3cmFuZ2xlciBzZXJ2ZSB0aGUgdG9wLWxldmVsXG4gKiAobm9uLWRlcGxveSkgY29uZmlnLiB3cmFuZ2xlciAobGlrZSB2aW5leHQpIHJlcXVpcmVzIHJlYWwgTm9kZS5qcyDigJQgYGJ1biBydW5gIHJlc3BlY3RzIHRoZSBiaW4nc1xuICogbm9kZSBzaGViYW5nLCBhbmQgd2IgbmV2ZXIgY29tcG9zZXMgYC0tYnVuYCAod2hvc2Ugbm9kZS0+YnVuIFBBVEggc2hpbSBicmVha3MgYm90aCB0b29scykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChhcmdzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGVudiAtdSBDTE9VREZMQVJFX0VOViBZQVJOIHdyYW5nbGVyICR7YXJnc31gLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGNvbW1hbmQgYXBwbHlpbmcgd3JhbmdsZXItbmF0aXZlIEQxIG1pZ3JhdGlvbnMgdG8gdGhlIGxvY2FsIGRhdGFiYXNlLCBvciB1bmRlZmluZWRcbiAqIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBEMSBkYXRhYmFzZSBvciBubyB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyBkaXJlY3RvcnkuXG4gKiBDST10cnVlIHN1cHByZXNzZXMgd3JhbmdsZXIncyBpbnRlcmFjdGl2ZSBjb25maXJtYXRpb24gcHJvbXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnZW52Jz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgaWYgKCFkYXRhYmFzZU5hbWUgfHwgIWZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3QpKSByZXR1cm47XG5cbiAgcmV0dXJuIGBDST10cnVlIFlBUk4gd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseSAke2RhdGFiYXNlTmFtZX0gLS1sb2NhbCAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImA7XG59XG5cbi8qKlxuICogUHJlZml4IHRoZSBnaXZlbiBzY3JpcHQgd2l0aCBjb21tYW5kcyBleHBvcnRpbmcgREFUQUJBU0VfVVJMIHBvaW50aW5nIHRvIHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUsXG4gKiBzbyB0aGF0IGRyaXp6bGUta2l0IGFuZCBzZWVkIHNjcmlwdHMgY2FuIG9wZXJhdGUgb24gdGhlIHNhbWUgZGF0YWJhc2UgYXMgdGhlIGFwcC5cbiAqIERvIG5vdGhpbmcgaWYgdGhlIHByb2plY3QgaGFzIG5vIEQxIGRhdGFiYXNlIGluIGl0cyB3cmFuZ2xlciBjb25maWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdlbnYnPiwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgaWYgKCFkYXRhYmFzZU5hbWUpIHJldHVybiBzY3JpcHQ7XG5cbiAgLy8gRXhjbHVkaW5nIG1pbmlmbGFyZSdzIG1ldGFkYXRhLnNxbGl0ZSwgd2hpY2ggbGl2ZXMgbmV4dCB0byB0aGUgaGFzaC1uYW1lZCBkYXRhYmFzZSBmaWxlLlxuICAvLyBBbiB1bm1hdGNoZWQgZ2xvYiBjYW5ub3QgaGFwcGVuIGhlcmU6IHRoZSBzY3JpcHQgcnVucyB1bmRlciAvYmluL3NoICh2aWEgTm9kZSdzIGBzaGVsbDogdHJ1ZWApLFxuICAvLyBhbmQgdGhlIHByZWNlZGluZyBtYXRlcmlhbGl6YXRpb24gY29tbWFuZCBndWFyYW50ZWVzIHRoZSBTUUxpdGUgZmlsZSBleGlzdHMuXG4gIC8vIFByb2plY3RzIHdpdGggbXVsdGlwbGUgRDEgZGF0YWJhc2VzIGFyZSBub3Qgc3VwcG9ydGVkOiB0aGUgaGFzaC1uYW1lZCBmaWxlcyBjYW5ub3QgYmVcbiAgLy8gZGlzdGluZ3Vpc2hlZCBjaGVhcGx5IChtYXRlcmlhbGl6YXRpb24gZG9lcyBub3QgZXZlbiB1cGRhdGUgdGhlIHRhcmdldCBmaWxlJ3MgbXRpbWUpLlxuICAvLyBUaGUgc3RhdGUgZGlyZWN0b3J5IG11c3QgYmUgYWJzb2x1dGUgYmVjYXVzZSB0aGUgd3JhcHBlZCBzY3JpcHQgbWF5IGBjZGAgdG8gdGhlIG1vbm9yZXBvIHJvb3QuXG4gIGNvbnN0IHN0YXRlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KSk7XG4gIGNvbnN0IGV4cG9ydENvbW1hbmQgPSBgZXhwb3J0IERBVEFCQVNFX1VSTD1cImZpbGU6JChscyBcIiR7c3RhdGVEaXJQYXRofVwiL3YzL2QxL21pbmlmbGFyZS1EMURhdGFiYXNlT2JqZWN0Lyouc3FsaXRlIHwgZ3JlcCAtdiBtZXRhZGF0YSB8IGhlYWQgLTEpXCJgO1xuICByZXR1cm4gYCR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGRhdGFiYXNlTmFtZSl9ICYmICR7ZXhwb3J0Q29tbWFuZH0gJiYgJHtzY3JpcHR9YDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IEQxIGRhdGFiYXNlIGRlY2xhcmVkIGluIHRoZSB3cmFuZ2xlciBjb25maWcgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcblxuICAvLyBDb3ZlciBKU09OKEMpIChgXCJkYXRhYmFzZV9uYW1lXCI6IFwiLi4uXCJgKSBhbmQgVE9NTCwgaW5jbHVkaW5nIGl0cyBpbmxpbmUtdGFibGUgZm9ybVxuICAvLyAoYGQxX2RhdGFiYXNlcyA9IFt7IC4uLiwgZGF0YWJhc2VfbmFtZSA9IFwiLi4uXCIgfV1gKSwgd2l0aG91dCBmdWxsIHBhcnNlcnMuXG4gIC8vIENvbW1lbnRlZC1vdXQgbGluZXMgYXJlIHNraXBwZWQgc28gdGhhdCB0aGV5IGNhbm5vdCBzaGFkb3cgdGhlIGFjdGl2ZSBkYXRhYmFzZSBuYW1lLFxuICAvLyBhbmQgdGhlIGtleSBtdXN0IGZvbGxvdyBhIGxpbmUgc3RhcnQsIGB7YCBvciBgLGAgc28gdGhhdCBwcm9zZSBtZW50aW9uaW5nIGl0IGNhbm5vdCBtYXRjaC5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmICgvXlxccyooPzojfFxcL1xcLykvdS50ZXN0KGxpbmUpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58Wyx7XSlcXHMqW1wiJ10/ZGF0YWJhc2VfbmFtZVtcIiddP1xccypbOj1dXFxzKltcIiddKFteXCInXSspW1wiJ10vdS5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gVGVzdHMgbWF5IHBhc3MgcGFydGlhbCBQcm9qZWN0IG9iamVjdHMgd2l0aG91dCBkaXJQYXRoLlxuICBpZiAoIXByb2plY3QuZGlyUGF0aCkgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2Ygd3JhbmdsZXJDb25maWdGaWxlTmFtZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIG9mIHRoZSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyBkaXJlY3RvcnkgKGBtaWdyYXRpb25zX2RpcmAgaW4gdGhlIHdyYW5nbGVyXG4gKiBjb25maWcsIGRlZmF1bHRpbmcgdG8gYG1pZ3JhdGlvbnNgKSBpZiBpdCBleGlzdHMgb24gZGlzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcblxuICBsZXQgbWlncmF0aW9uc0RpciA9ICdtaWdyYXRpb25zJztcbiAgZm9yIChjb25zdCBsaW5lIG9mIGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmICgvXlxccyooPzojfFxcL1xcLykvdS50ZXN0KGxpbmUpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58Wyx7XSlcXHMqW1wiJ10/bWlncmF0aW9uc19kaXJbXCInXT9cXHMqWzo9XVxccypbXCInXShbXlwiJ10rKVtcIiddL3UuZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG1pZ3JhdGlvbnNEaXIgPSBtYXRjaFsxXSBhcyBzdHJpbmc7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgY29uc3QgbWlncmF0aW9uc0RpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBtaWdyYXRpb25zRGlyKTtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMobWlncmF0aW9uc0RpclBhdGgpID8gbWlncmF0aW9uc0RpclBhdGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIG1hdGVyaWFsaXppbmcgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqIEEgbm8tb3AgcXVlcnkgZm9yY2VzIG1pbmlmbGFyZSB0byBjcmVhdGUgdGhlIFNRTGl0ZSBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LlxuICogT25seSBzdGRvdXQgaXMgc3VwcHJlc3NlZDsgd3JhbmdsZXIgcmVwb3J0cyBlcnJvcnMgb24gc3RkZXJyLCB3aGljaCBtdXN0IHN0YXkgdmlzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPiwgZGF0YWJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFlBUk4gd3JhbmdsZXIgZDEgZXhlY3V0ZSAke2RhdGFiYXNlTmFtZX0gLS1sb2NhbCAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cIiAtLWNvbW1hbmQgXCJTRUxFQ1QgMVwiID4gL2Rldi9udWxsYDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGxvY2FsIHdyYW5nbGVyL21pbmlmbGFyZSBzdGF0ZSBkaXJlY3RvcnkuXG4gKiBEZXZlbG9wbWVudCBmb2xsb3dzIHdyYW5nbGVyJ3MgZGVmYXVsdCBkaXJlY3Rvcnkgc28gdGhhdCBwbGFpbiBgd3JhbmdsZXIgZGV2YCAvIGB2aW5leHQgZGV2YFxuICogKHdpdGhvdXQgYSBwZXJzaXN0LXBhdGggb3ZlcnJpZGUpIHNoYXJlcyB0aGUgc2FtZSBkYXRhYmFzZSBhcyB3Yi1tYW5hZ2VkIGRiIGNvbW1hbmRzLlxuICogT3RoZXIgZW52aXJvbm1lbnRzIChlLmcuIHRlc3QpIGdldCB0aGVpciBvd24gZGlyZWN0b3J5IHNvIHRoYXQgdGhleSBjYW4gYmUgcmVzZXRcbiAqIHdpdGhvdXQgZGVzdHJveWluZyBkZXZlbG9wbWVudCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB7XG4gIC8vIERlc3RydWN0aXZlIHRlc3QgcmVzZXRzIGFyZSBnYXRlZCBvbiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpLCB3aGljaCBhY2NlcHRzXG4gIC8vIGVpdGhlciBXQl9FTlYgb3IgTUlTRV9FTlY7IHJlc29sdmUgdG8gdGhlIHRlc3QgZGlyZWN0b3J5IHdoZW5ldmVyIGVpdGhlciBzYXlzICd0ZXN0JyBzb1xuICAvLyB0aGF0IHN1Y2ggcmVzZXRzIGNhbiBuZXZlciB0YXJnZXQgdGhlIGRldmVsb3BtZW50IHN0YXRlLlxuICBjb25zdCB3YkVudiA9IFtwcm9qZWN0LmVudi5XQl9FTlYsIHByb2plY3QuZW52Lk1JU0VfRU5WXS5pbmNsdWRlcygndGVzdCcpXG4gICAgPyAndGVzdCdcbiAgICA6IHByb2plY3QuZW52LldCX0VOViB8fCBwcm9qZWN0LmVudi5NSVNFX0VOVjtcbiAgcmV0dXJuICF3YkVudiB8fCB3YkVudiA9PT0gJ2RldmVsb3BtZW50JyA/ICcud3JhbmdsZXIvc3RhdGUnIDogYC53cmFuZ2xlci9zdGF0ZS0ke3diRW52fWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsIGlzUHJvamVjdEVudmlyb25tZW50LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgYnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kLCBnZXREMURhdGFiYXNlTmFtZSwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdjbGVhbnVwLWxpdGVzdHJlYW0nKTtcbiAgICBjb25zdCB3YWxDaGVja3BvaW50Q29tbWFuZCA9IGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXSAmJiBjb21tYW5kIC12IHNxbGl0ZTMgPi9kZXYvbnVsbDsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IHNxbGl0ZTMgXCIke2RiUGF0aH1cIjsgZmlgO1xuICAgIHJldHVybiBgJHt3YWxDaGVja3BvaW50Q29tbWFuZH07IHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSo7IHJtIC1SZiBcIiR7cGF0aC5kaXJuYW1lKGRiUGF0aCl9Ly4ke3BhdGguYmFzZW5hbWUoZGJQYXRoKX1cIiogfHwgdHJ1ZWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBkMURhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICAgIGlmIChkMURhdGFiYXNlTmFtZSkge1xuICAgICAgLy8gUmVtb3ZlIG9ubHkgdGhlIEQxIHN1YnRyZWUgc28gdGhhdCBvdGhlciBsb2NhbGx5LXBlcnNpc3RlZCBiaW5kaW5ncyAoS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpIHN1cnZpdmUsXG4gICAgICAvLyB0aGVuIHJlLW1hdGVyaWFsaXplIHRoZSBEMSBTUUxpdGUgZmlsZS4gSXRzIHBhdGggaXMgZGV0ZXJtaW5pc3RpYywgc28gYSBEQVRBQkFTRV9VUkwgZXhwb3J0ZWRcbiAgICAgIC8vIGJlZm9yZSB0aGUgcmVtb3ZhbCBzdGF5cyB2YWxpZC5cbiAgICAgIHJldHVybiBgcm0gLVJmIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9L3YzL2QxXCIgJiYgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZDFEYXRhYmFzZU5hbWUpfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgICB9XG5cbiAgICBjb25zdCByZW1vdmVDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKCFyZW1vdmVDb21tYW5kKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiByZXNldCBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBmaWxlOiBEQVRBQkFTRV9VUkwgaXMgc2V0LicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3JlbW92ZUNvbW1hbmR9ICYmICR7dGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKX1gO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWVkQ29tbWFuZCA9IHRoaXMuc2VlZChwcm9qZWN0KTtcbiAgICBjb25zdCBtaWdyYXRlQ29tbWFuZCA9IHRoaXMuZGVwbG95KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICByZXR1cm4gc2VlZENvbW1hbmQgPT09ICd0cnVlJyA/IG1pZ3JhdGVDb21tYW5kIDogYCR7bWlncmF0ZUNvbW1hbmR9ICYmICR7c2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIG1pZ3JhdGVGb3JTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiAoYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCkgfHwgZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNldChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgZGVwbG95KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YC50cmltKCkpO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ2RlcGxveS1mb3JjZScpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJGYW1pbHlDb21tYW5kKGRiUGF0aCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gVGhlIGVudmlyb25tZW50IGFzc2lnbm1lbnQgbXVzdCBnbyB0aHJvdWdoIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQ6IHByZWZpeGluZyBpdHNcbiAgICAvLyBwb3NzaWJseS1wYXJlbnRoZXNpemVkIHJlc3VsdCB3aXRoIGBBTExPV19UT19TS0lQX1NFRUQ9MGAgd291bGQgYmUgYSBzaGVsbCBzeW50YXggZXJyb3IuXG4gICAgY29uc3QgbWlncmF0ZVdpdGhTZWVkQ29tbWFuZCA9IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgJ21pZ3JhdGUnLCAnQUxMT1dfVE9fU0tJUF9TRUVEPTAnKTtcbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgJHt0aGlzLmRlcGxveShwcm9qZWN0KX0gJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgJHtsaXRlc3RyZWFtQ29uZmlnT3B0aW9ufSAtbyBcIiR7ZGJQYXRofVwiIFwiJHtkYlBhdGh9XCIgJiYgbHMgLWFobCBcIiR7ZGJQYXRofVwiICYmICR7bWlncmF0ZVdpdGhTZWVkQ29tbWFuZH1gO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ2xpc3QtYmFja3VwcycpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSBcIiR7ZGJQYXRofVwiYDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nLCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAncmVzdG9yZScpO1xuICAgIHJldHVybiBgJHtidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgob3V0cHV0UGF0aCl9OyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAtbyBcIiR7b3V0cHV0UGF0aH1cIiBcIiR7ZGJQYXRofVwiYDtcbiAgfVxuXG4gIGdlbmVyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgY29uc3QgZGVmYXVsdFNlZWRQYXRoID0gcGF0aC5qb2luKCdkYicsICdzZWVkLnRzJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZGVmYXVsdFNlZWRQYXRoKSkpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGBCVU4gJHtkZWZhdWx0U2VlZFBhdGh9YCA6IGBCVU4gYnVpbGQtdHMgcnVuICR7ZGVmYXVsdFNlZWRQYXRofWA7XG4gICAgfVxuICAgIHJldHVybiAndHJ1ZSc7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YC50cmltKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3Q6IFByb2plY3QsIGFyZ3M6IHN0cmluZywgZW52aXJvbm1lbnRBc3NpZ25tZW50ID0gJycpOiBzdHJpbmcge1xuICBjb25zdCBjb21tYW5kID0gYCR7ZW52aXJvbm1lbnRBc3NpZ25tZW50ICYmIGAke2Vudmlyb25tZW50QXNzaWdubWVudH0gYH1ZQVJOIGRyaXp6bGUta2l0ICR7YXJnc31gO1xuICAvLyBBIGNhbGxlci1zdXBwbGllZCAtLWNvbmZpZyByZXNvbHZlcyBhZ2FpbnN0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwgc28gdGhlIGN3ZCBtdXN0IHN0YXkgdGhlcmUuXG4gIHJldHVybiBhcmdzLmluY2x1ZGVzKCctLWNvbmZpZycpID8gY29tbWFuZCA6IHdyYXBXaXRoRHJpenpsZUNvbmZpZ0Rpcihwcm9qZWN0LCBjb21tYW5kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoRHJpenpsZUNvbmZpZ0Rpcihwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgLy8gZHJpenpsZS1raXQgcmVzb2x2ZXMgcmVsYXRpdmUgcGF0aHMgaW4gaXRzIGNvbmZpZyBhZ2FpbnN0IHRoZSBjd2QsIHNvIHRoZSBjb21tYW5kIG11c3QgcnVuXG4gIC8vIGluIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBkcml6emxlLmNvbmZpZy4qIGV2ZW4gd2hlbiBtb25vcmVwbyBwYWNrYWdlcyBzaGFyZSBpdCBhdCB0aGUgcm9vdC5cbiAgcmV0dXJuIGNvbmZpZyAmJiBjb25maWcuZGlyUGF0aCAhPT0gcHJvamVjdC5kaXJQYXRoXG4gICAgPyBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIGNvbmZpZy5kaXJQYXRoXSl9ICYmICR7Y29tbWFuZH0pYFxuICAgIDogY29tbWFuZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGRyaXp6bGUta2l0IGlzIHRoZSBwcm9qZWN0J3MgRDEgbWlncmF0aW9uIG1lY2hhbmlzbS4gQSBkcml6emxlLW9ybSBkZXBlbmRlbmN5IGFsb25lIGlzXG4gKiBub3QgYSByZWxpYWJsZSBtYXJrZXI6IGEgV29ya2VyIG1heSB1c2UgRDEgb25seSBmb3IgY2FjaGluZyB3aGlsZSBpdHMgZHJpenpsZSBjb25maWcgdGFyZ2V0cyBhblxuICogdW5yZWxhdGVkIGRhdGFiYXNlIChlLmcuIFBvc3RncmVTUUwgdmlhIEh5cGVyZHJpdmUpLCBhbmQgcnVubmluZyBgZHJpenpsZS1raXQgbWlncmF0ZWAgYWdhaW5zdFxuICogdGhhdCBkYXRhYmFzZSBkdXJpbmcgYSBEMSBkZXBsb3kgd291bGQgYmUgd3JvbmcgKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk0MikuXG4gKiBTbyByZXF1aXJlIGFuIGV4cGxpY2l0IG1hcmtlcjogYSBkcml6emxlIGNvbmZpZyB3aG9zZSBkaWFsZWN0L2RyaXZlciB0YXJnZXRzIHNxbGl0ZSwgZDEtaHR0cCwgb3JcbiAqIGR1cmFibGUtc3FsaXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlc0RyaXp6bGVLaXRGb3JEMShwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIGlmICghcHJvamVjdC5oYXNEcml6emxlKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gc3RyaXBKc0NvbW1lbnRzKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGNvbmZpZy5maWxlTmFtZSksICd1dGY4JykpO1xuICAgIC8vIFNjYW4gb25seSB0aGUgZXhwb3J0ZWQgY29uZmlnJ3Mgb2JqZWN0IGxpdGVyYWw6IGRyaXp6bGUta2l0IGNvbnN1bWVzIHRoZSBkZWZhdWx0IGV4cG9ydCxcbiAgICAvLyBhbmQgbWF0Y2hpbmcgb3RoZXIgdGV4dCAoYW4gdW51c2VkIHNxbGl0ZS1zaGFwZWQgY29uc3RhbnQgYWJvdmUgdGhlIGV4cG9ydCwgb3IgbWFya2VyLWxpa2VcbiAgICAvLyBzdHJpbmcgY29udGVudCBpbiBzdGF0ZW1lbnRzIGFmdGVyIGl0KSB3b3VsZCBzZWxlY3QgdGhlIHdyb25nIG1pZ3JhdGlvbiBtZWNoYW5pc20uXG4gICAgLy8gUE9TSVRJT05TIChleHBvcnQgbWFya2VycywgZGVjbGFyYXRpb25zKSBhcmUgbG9jYXRlZCBvbiBhIHN0cmluZy1tYXNrZWQgdmlldyBvZiB0aGUgc2FtZVxuICAgIC8vIGxlbmd0aCwgc28gYGV4cG9ydCBkZWZhdWx0YCBpbnNpZGUgYSBzdHJpbmcgbGl0ZXJhbCBjYW5ub3QgbWlzbGVhZCB0aGUgc2VhcmNoLlxuICAgIGNvbnN0IG1hc2tlZENvbnRlbnQgPSBtYXNrU3RyaW5nQ29udGVudHMoY29udGVudCk7XG4gICAgY29uc3QgZXhwb3J0SW5kaWNlcyA9IFsnZXhwb3J0IGRlZmF1bHQnLCAnbW9kdWxlLmV4cG9ydHMnXVxuICAgICAgLm1hcCgobWFya2VyKSA9PiBtYXNrZWRDb250ZW50LmluZGV4T2YobWFya2VyKSlcbiAgICAgIC5maWx0ZXIoKGluZGV4KSA9PiBpbmRleCAhPT0gLTEpO1xuICAgIGNvbnN0IGV4cG9ydFN0YXJ0SW5kZXggPSBleHBvcnRJbmRpY2VzLmxlbmd0aCA+IDAgPyBNYXRoLm1pbiguLi5leHBvcnRJbmRpY2VzKSA6IDA7XG4gICAgY29uc3Qgb2JqZWN0U3BhbiA9IGV4dHJhY3RFeHBvcnRlZENvbmZpZ09iamVjdChjb250ZW50LCBtYXNrZWRDb250ZW50LCBleHBvcnRTdGFydEluZGV4KTtcbiAgICByZXR1cm4gb2JqZWN0U3BhbiAhPT0gdW5kZWZpbmVkICYmIGRlY2xhcmVzU3FsaXRlVGFyZ2V0KG9iamVjdFNwYW4pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgb2JqZWN0IGxpdGVyYWwgdGhlIGV4cG9ydCBhY3R1YWxseSBldmFsdWF0ZXMgdG86IGZvciBgZXhwb3J0IGRlZmF1bHQgey4uLn1gIG9yXG4gKiBgZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsuLi59KWAgdGhlIGZpcnN0IGJhbGFuY2VkIG9iamVjdCBhZnRlciB0aGUgbWFya2VyLCBhbmQgZm9yXG4gKiBgZXhwb3J0IGRlZmF1bHQgY29uZmlnO2AgdGhlIGluaXRpYWxpemVyIG9mIHRoYXQgaWRlbnRpZmllcidzIGRlY2xhcmF0aW9uIOKAlCBuZXZlciB0aGUgd2hvbGVcbiAqIGZpbGUsIHNpbmNlIGFuIHVucmVsYXRlZCBvYmplY3QgKGUuZy4gYW4gdW51c2VkIHNxbGl0ZS1zaGFwZWQgY29uc3RhbnQpIG11c3Qgbm90IGJlIHNlbGVjdGVkLlxuICogVW5kZWZpbmVkIHdoZW4gdGhlIGV4cHJlc3Npb24gY2Fubm90IGJlIHJlc29sdmVkOyB3YiBkZXBsb3kncyB1bm1hbmFnZWQtRDEgd2FybmluZyBjb3ZlcnMgdGhhdC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEV4cG9ydGVkQ29uZmlnT2JqZWN0KFxuICBjb250ZW50OiBzdHJpbmcsXG4gIG1hc2tlZENvbnRlbnQ6IHN0cmluZyxcbiAgZXhwb3J0U3RhcnRJbmRleDogbnVtYmVyXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBleHBvcnRlZEV4cHJlc3Npb24gPSBtYXNrZWRDb250ZW50XG4gICAgLnNsaWNlKGV4cG9ydFN0YXJ0SW5kZXgpXG4gICAgLnJlcGxhY2UoL14oPzpleHBvcnRcXHMrZGVmYXVsdHxtb2R1bGVcXC5leHBvcnRzXFxzKj0pXFxzKi8sICcnKTtcbiAgLy8gQW4gaWRlbnRpZmllciBleHBvcnQgbWF5IGNhcnJ5IGEgVHlwZVNjcmlwdCB0eXBlIHBvc3RmaXggKGBjb25maWcgc2F0aXNmaWVzIENvbmZpZztgIC9cbiAgLy8gYGNvbmZpZyBhcyBDb25maWc7YCk7IHRoZSBpZGVudGlmaWVyIGlzIHJlY29nbml6ZWQgRklSU1Qgc28gYSBwb3N0Zml4IGNvbnRhaW5pbmcgYSBUWVBFXG4gIC8vIGxpdGVyYWwgKGBzYXRpc2ZpZXMgeyBkaWFsZWN0OiAnc3FsaXRlJyB8IC4uLiB9YCkgaXMgbmV2ZXIgbWlzdGFrZW4gZm9yIHRoZSBydW50aW1lIGNvbmZpZy5cbiAgY29uc3QgaWRlbnRpZmllck1hdGNoID0gL14oW0EtWmEtel8kXVtcXHckXSopXFxzKig/OnNhdGlzZmllc1xcYnxhc1xcYnw7fFxcbnwkKS8uZXhlYyhleHBvcnRlZEV4cHJlc3Npb24pO1xuICBpZiAoIWlkZW50aWZpZXJNYXRjaCkge1xuICAgIGNvbnN0IGJyYWNlT2Zmc2V0ID0gbWFza2VkQ29udGVudC5zbGljZShleHBvcnRTdGFydEluZGV4KS5pbmRleE9mKCd7Jyk7XG4gICAgaWYgKGJyYWNlT2Zmc2V0ID09PSAtMSkgcmV0dXJuO1xuICAgIHJldHVybiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50LnNsaWNlKGV4cG9ydFN0YXJ0SW5kZXggKyBicmFjZU9mZnNldCkpO1xuICB9XG5cbiAgLy8gYCRgIGlzIGxlZ2FsIGluIGlkZW50aWZpZXJzIGJ1dCBhIHJlZ2V4IGFuY2hvciwgc28gaXQgbXVzdCBiZSBlc2NhcGVkIGJlZm9yZSBpbnRlcnBvbGF0aW9uO1xuICAvLyBgKD8hW1xcdyRdKWAgKG5vdCBgXFxiYCkgZW5kcyB0aGUgbWF0Y2ggYmVjYXVzZSBgXFxiYCBuZXZlciBmaXJlcyBhZnRlciBhIHRyYWlsaW5nIGAkYC5cbiAgY29uc3QgZXNjYXBlZElkZW50aWZpZXIgPSBpZGVudGlmaWVyTWF0Y2hbMV0hLnJlcGxhY2VBbGwoJyQnLCBTdHJpbmcucmF3YFxcJGApO1xuICBjb25zdCBkZWNsYXJhdGlvbkVuZEluZGV4ID0gZmluZE1vZHVsZVNjb3BlRGVjbGFyYXRpb25FbmQobWFza2VkQ29udGVudCwgZXNjYXBlZElkZW50aWZpZXIpO1xuICBpZiAoZGVjbGFyYXRpb25FbmRJbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIC8vIFRoZSBpbml0aWFsaXplciBtdXN0IGJlbG9uZyB0byBUSElTIGRlY2xhcmF0aW9uIChhIHR5cGUgYW5ub3RhdGlvbiBtYXkgcHJlY2VkZSB0aGUgYD1gKTsgYW5cbiAgLy8gdW5pbml0aWFsaXplZCBgbGV0IGNvbmZpZztgIHN0YXlzIHVucmVzb2x2ZWQgaW5zdGVhZCBvZiBncmFiYmluZyBhIGxhdGVyIHN0YXRlbWVudCdzIGA9YC5cbiAgY29uc3QgYXNzaWdubWVudE1hdGNoID0gL15cXHMqKD86OltePTtcXG5dKik/PS8uZXhlYyhtYXNrZWRDb250ZW50LnNsaWNlKGRlY2xhcmF0aW9uRW5kSW5kZXgpKTtcbiAgaWYgKCFhc3NpZ25tZW50TWF0Y2gpIHJldHVybjtcbiAgcmV0dXJuIGV4dHJhY3RGaXJzdEJhbGFuY2VkT2JqZWN0KGNvbnRlbnQuc2xpY2UoZGVjbGFyYXRpb25FbmRJbmRleCArIGFzc2lnbm1lbnRNYXRjaFswXS5sZW5ndGgpKTtcbn1cblxuLyoqXG4gKiBUaGUgZW5kIGluZGV4IG9mIHRoZSBpZGVudGlmaWVyJ3MgZGVjbGFyYXRpb24gYXQgYnJhY2UgZGVwdGggWkVSTyAobW9kdWxlIHNjb3BlKTogYSBzYW1lLW5hbWVkXG4gKiBkZWNsYXJhdGlvbiBpbnNpZGUgYSBmdW5jdGlvbiBib2R5IG11c3Qgbm90IHNoYWRvdyB0aGUgYmluZGluZyB0aGUgZXhwb3J0IHJlZmVyZW5jZXMsIGFuZFxuICogaW5kZW50YXRpb24gaXMgbm8gc2NvcGUgc2lnbmFsIOKAlCBkZXB0aCBvdmVyIHRoZSBzdHJpbmctbWFza2VkIGNvbnRlbnQgaXMuXG4gKi9cbmZ1bmN0aW9uIGZpbmRNb2R1bGVTY29wZURlY2xhcmF0aW9uRW5kKG1hc2tlZENvbnRlbnQ6IHN0cmluZywgZXNjYXBlZElkZW50aWZpZXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIFN0cmluZy5yYXdgKD88IVtcXHckXSkoPzpleHBvcnRcXHMrKT8oPzpjb25zdHxsZXR8dmFyKVxccyske2VzY2FwZWRJZGVudGlmaWVyfSg/IVtcXHckXSlgLFxuICAgICdnJ1xuICApO1xuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgc2NhbkluZGV4ID0gMDtcbiAgZm9yIChsZXQgbWF0Y2ggPSBkZWNsYXJhdGlvblJlZ2V4LmV4ZWMobWFza2VkQ29udGVudCk7IG1hdGNoOyBtYXRjaCA9IGRlY2xhcmF0aW9uUmVnZXguZXhlYyhtYXNrZWRDb250ZW50KSkge1xuICAgIGZvciAoOyBzY2FuSW5kZXggPCBtYXRjaC5pbmRleDsgc2NhbkluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBtYXNrZWRDb250ZW50W3NjYW5JbmRleF07XG4gICAgICBpZiAoY2hhciA9PT0gJ3snKSBkZXB0aCsrO1xuICAgICAgZWxzZSBpZiAoY2hhciA9PT0gJ30nKSBkZXB0aC0tO1xuICAgIH1cbiAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogUmVwbGFjZSB0aGUgQ09OVEVOVFMgb2Ygc3RyaW5nIGxpdGVyYWxzIHdpdGggc3BhY2VzIChzYW1lIGxlbmd0aCwgbmV3bGluZXMga2VwdCksIHNvIHBvc2l0aW9uXG4gKiBzZWFyY2hlcyBvdmVyIHRoZSByZXN1bHQgY2Fubm90IG1hdGNoIHRleHQgaW5zaWRlIHN0cmluZ3Mgd2hpbGUgYWxsIGluZGV4ZXMgc3RpbGwgbWFwIDE6MSB0b1xuICogdGhlIG9yaWdpbmFsIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIG1hc2tTdHJpbmdDb250ZW50cyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBzdHJpbmdEZWxpbWl0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoc3RyaW5nRGVsaW1pdGVyKSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIHJlc3VsdCArPSAnICAnO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkge1xuICAgICAgICBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBjaGFyID09PSAnXFxuJyA/ICdcXG4nIDogJyAnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykgc3RyaW5nRGVsaW1pdGVyID0gY2hhcjtcbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFN0cmluZy1hd2FyZSBzY2FuIGZvciB0aGUgbWFya2VycyBpbmRpY2F0aW5nIHRoZSBjb25maWcgbWFuYWdlcyBhIChDbG91ZGZsYXJlIEQxIGNvbXBhdGlibGUpXG4gKiBTUUxpdGUgZGF0YWJhc2Ug4oCUIGEgYGRpYWxlY3Q6ICdzcWxpdGUnYCwgYGRyaXZlcjogJ2QxLWh0dHAnYCwgb3IgYGRyaXZlcjogJ2R1cmFibGUtc3FsaXRlJ2BcbiAqIFBST1BFUlRZIChwbGFpbiBvciBxdW90ZWQga2V5KS4gS2V5cyBhcmUgb25seSByZWNvZ25pemVkIGluIGNvZGUgcG9zaXRpb24sIHNvIG1hcmtlci1saWtlIHRleHRcbiAqIGVtYmVkZGVkIGluIHVucmVsYXRlZCBzdHJpbmcgdmFsdWVzIChlLmcuIGEgc2NoZW1hIHBhdGgpIGNhbm5vdCBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNTcWxpdGVUYXJnZXQoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5ncyhjb250ZW50KTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2Vucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0hO1xuICAgIGxldCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdmFsdWVUb2tlbkluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdjb2RlJykge1xuICAgICAgY29uc3QgbWF0Y2ggPSAvKD86XnxbXFxzeywoXSkoZGlhbGVjdHxkcml2ZXIpXFxzKjpcXHMqJC8uZXhlYyh0b2tlbi52YWx1ZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAga2V5ID0gbWF0Y2hbMV07XG4gICAgICAgIHZhbHVlVG9rZW5JbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnZGlhbGVjdCcgfHwgdG9rZW4udmFsdWUgPT09ICdkcml2ZXInKSB7XG4gICAgICAvLyBBIHF1b3RlZCBrZXk6IHRoZSBzdXJyb3VuZGluZyBjb2RlIHRva2VucyBtdXN0IGZvcm0gYSBwcm9wZXJ0eSBwb3NpdGlvbiAoYHtgL2AsYCBiZWZvcmUsXG4gICAgICAvLyBgOmAgYWZ0ZXIpLlxuICAgICAgY29uc3QgcHJldmlvdXNUb2tlbiA9IHRva2Vuc1tpbmRleCAtIDFdO1xuICAgICAgY29uc3QgbmV4dFRva2VuID0gdG9rZW5zW2luZGV4ICsgMV07XG4gICAgICBpZiAoXG4gICAgICAgIHByZXZpb3VzVG9rZW4/LnR5cGUgPT09ICdjb2RlJyAmJlxuICAgICAgICAvW3ssKF1cXHMqJC8udGVzdChwcmV2aW91c1Rva2VuLnZhbHVlKSAmJlxuICAgICAgICBuZXh0VG9rZW4/LnR5cGUgPT09ICdjb2RlJyAmJlxuICAgICAgICAvXlxccyo6XFxzKiQvLnRlc3QobmV4dFRva2VuLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGtleSA9IHRva2VuLnZhbHVlO1xuICAgICAgICB2YWx1ZVRva2VuSW5kZXggPSBpbmRleCArIDI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZVRva2VuSW5kZXggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBjb25zdCB2YWx1ZVRva2VuID0gdG9rZW5zW3ZhbHVlVG9rZW5JbmRleF07XG4gICAgaWYgKHZhbHVlVG9rZW4/LnR5cGUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICBpZiAoa2V5ID09PSAnZGlhbGVjdCcgJiYgdmFsdWVUb2tlbi52YWx1ZSA9PT0gJ3NxbGl0ZScpIHJldHVybiB0cnVlO1xuICAgIGlmIChrZXkgPT09ICdkcml2ZXInICYmICh2YWx1ZVRva2VuLnZhbHVlID09PSAnZDEtaHR0cCcgfHwgdmFsdWVUb2tlbi52YWx1ZSA9PT0gJ2R1cmFibGUtc3FsaXRlJykpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdCBpbnRvIGFsdGVybmF0aW5nIGNvZGUgYW5kIHN0cmluZy1saXRlcmFsLWNvbnRlbnQgdG9rZW5zIChxdW90ZXMgZXhjbHVkZWQpLiBUaGUgaW5wdXQgaXNcbiAqIGFscmVhZHkgY29tbWVudC1mcmVlIOKAlCB1c2VzRHJpenpsZUtpdEZvckQxIHJ1bnMgc3RyaXBKc0NvbW1lbnRzIGJlZm9yZSBhbnkgc2Nhbm5pbmcg4oCUIHNvXG4gKiBjb21tZW50IGRlbGltaXRlcnMgbmVlZCBubyBoYW5kbGluZyBoZXJlIChhIGNvbW1lbnRlZC1vdXQgYC8vIGRpYWxlY3Q6ICdzcWxpdGUnYCBjYW4gbmV2ZXJcbiAqIHJlYWNoIHRoaXMgdG9rZW5pemVyKS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVTdHJpbmdzKGNvbnRlbnQ6IHN0cmluZyk6IHsgdHlwZTogJ2NvZGUnIHwgJ3N0cmluZyc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgdG9rZW5zOiB7IHR5cGU6ICdjb2RlJyB8ICdzdHJpbmcnOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICBsZXQgY29kZSA9ICcnO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAnY29kZScsIHZhbHVlOiBjb2RlIH0pO1xuICAgICAgY29kZSA9ICcnO1xuICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICBpbmRleCsrO1xuICAgICAgd2hpbGUgKGluZGV4IDwgY29udGVudC5sZW5ndGggJiYgY29udGVudFtpbmRleF0gIT09IGNoYXIpIHtcbiAgICAgICAgaWYgKGNvbnRlbnRbaW5kZXhdID09PSAnXFxcXCcpIGluZGV4Kys7XG4gICAgICAgIHZhbHVlICs9IGNvbnRlbnRbaW5kZXhdID8/ICcnO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAnc3RyaW5nJywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29kZSArPSBjaGFyO1xuICB9XG4gIHRva2Vucy5wdXNoKHsgdHlwZTogJ2NvZGUnLCB2YWx1ZTogY29kZSB9KTtcbiAgcmV0dXJuIHRva2Vucztcbn1cblxuLyoqIFRoZSBmaXJzdCBgeyAuLi4gfWAgc3BhbiAoc3RyaW5nLWF3YXJlIGJyYWNlIG1hdGNoaW5nKSwgb3IgdW5kZWZpbmVkIHdoZW4gbm9uZSBleGlzdHMuICovXG5mdW5jdGlvbiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdGFydEluZGV4ID0gY29udGVudC5pbmRleE9mKCd7Jyk7XG4gIGlmIChzdGFydEluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gIGxldCBkZXB0aCA9IDA7XG4gIGxldCBzdHJpbmdEZWxpbWl0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoc3RyaW5nRGVsaW1pdGVyKSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnKSBpbmRleCsrO1xuICAgICAgZWxzZSBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHN0cmluZ0RlbGltaXRlciA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgZWxzZSBpZiAoY2hhciA9PT0gJ3snKSBkZXB0aCsrO1xuICAgIGVsc2UgaWYgKGNoYXIgPT09ICd9JyAmJiAtLWRlcHRoID09PSAwKSByZXR1cm4gY29udGVudC5zbGljZShzdGFydEluZGV4LCBpbmRleCArIDEpO1xuICB9XG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYmxvY2sgYW5kIGxpbmUgY29tbWVudHMgc28gY29tbWVudGVkLW91dCBtYXJrZXJzIChlLmcuIGAvLyBkaWFsZWN0OiAnc3FsaXRlJ2AgaW4gYVxuICogUG9zdGdyZVNRTCBjb25maWcpIGNhbm5vdCBtaXNjbGFzc2lmeSB0aGUgY29uZmlnLiBUaGUgc2Nhbm5lciB0cmFja3Mgc3RyaW5nIHN0YXRlLCBzbyBgLy9gXG4gKiBpbnNpZGUgc3RyaW5nIGxpdGVyYWxzIChVUkxzIHN1Y2ggYXMgYGh0dHBzOi8vLi4uYCBpbiBjb25uZWN0aW9uIHN0cmluZ3MpIHN1cnZpdmVzIHdoaWxlXG4gKiBjb21tZW50cyBkaXJlY3RseSBhZnRlciBhIHN0cmluZyBsaXRlcmFsIGFyZSBzdGlsbCByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdHJpcEpzQ29tbWVudHMoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgY29uc3QgbmV4dENoYXIgPSBjb250ZW50W2luZGV4ICsgMV07XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICByZXN1bHQgKz0gY2hhciArIChuZXh0Q2hhciA/PyAnJyk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSB7XG4gICAgICAgIHN0cmluZ0RlbGltaXRlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykge1xuICAgICAgc3RyaW5nRGVsaW1pdGVyID0gY2hhcjtcbiAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSAnLycgJiYgbmV4dENoYXIgPT09ICcvJykge1xuICAgICAgd2hpbGUgKGluZGV4IDwgY29udGVudC5sZW5ndGggJiYgY29udGVudFtpbmRleF0gIT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgcmVzdWx0ICs9ICdcXG4nO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSAnLycgJiYgbmV4dENoYXIgPT09ICcqJykge1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmICEoY29udGVudFtpbmRleF0gPT09ICcqJyAmJiBjb250ZW50W2luZGV4ICsgMV0gPT09ICcvJykpIGluZGV4Kys7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc3VsdCArPSBjaGFyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0OiBQcm9qZWN0KTogeyBkaXJQYXRoOiBzdHJpbmc7IGZpbGVOYW1lOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbJ2RyaXp6bGUuY29uZmlnLnRzJywgJ2RyaXp6bGUuY29uZmlnLm10cycsICdkcml6emxlLmNvbmZpZy5qcycsICdkcml6emxlLmNvbmZpZy5tanMnXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIFtwcm9qZWN0LmRpclBhdGgsIHByb2plY3Qucm9vdERpclBhdGhdKSB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBjYW5kaWRhdGVzLmZpbmQoKGZpbGVOYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSkpKTtcbiAgICBpZiAoZmlsZU5hbWUpIHJldHVybiB7IGRpclBhdGgsIGZpbGVOYW1lIH07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kRm9yUGF0aChhYnNvbHV0ZVBhdGgpO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1mIFwiJHtkYlBhdGh9XCIgXCIke2RiUGF0aH0td2FsXCIgXCIke2RiUGF0aH0tc2htXCJgO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRGJQYXRoT3JFcnJvcihwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgd2IgZGIgJHtjb21tYW5kTmFtZX0gc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC5gKTtcbiAgfVxuICByZXR1cm4gZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoT3JFcnJvcihwcm9qZWN0LCBjb21tYW5kTmFtZSk7XG4gIHJldHVybiBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZ1BhdGgpIHJldHVybiBgLWNvbmZpZyBcIiR7Y29uZmlnUGF0aH1cImA7XG5cbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxDb25maWdQYXRoKSkgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIKSkgcmV0dXJuIGAtY29uZmlnICR7REVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIfWA7XG4gIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuL3dyYW5nbGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBXcmFuZ2xlckQxRGF0YWJhc2Uge1xuICBiaW5kaW5nPzogc3RyaW5nO1xuICBkYXRhYmFzZV9uYW1lPzogc3RyaW5nO1xuICBkYXRhYmFzZV9pZD86IHN0cmluZztcbiAgbWlncmF0aW9uc19kaXI/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfcGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBEMSBiaW5kaW5nIHVzZXMgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgdGhhdCBgd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseWBcbiAqIHdvdWxkIGFjdHVhbGx5IGRpc2NvdmVyOiBhbiBleHBsaWNpdCBgbWlncmF0aW9uc19wYXR0ZXJuYCBvcHRzIGluLCBvdGhlcndpc2UgdGhlIG1pZ3JhdGlvbnNcbiAqIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gZmxhdCBgKi5zcWxgIGZpbGVzICh3cmFuZ2xlcidzIGRlZmF1bHQgcGF0dGVybikuIEEgZHJpenpsZS1raXQgYG91dGBcbiAqIGRpcmVjdG9yeSB3aXRoIG5lc3RlZCBgPG5hbWU+L21pZ3JhdGlvbi5zcWxgIGZpbGVzIGFuZCBubyBwYXR0ZXJuIHdvdWxkIG1hdGNoIG5vdGhpbmcgYW5kXG4gKiBzaWxlbnRseSBhcHBseSB6ZXJvIG1pZ3JhdGlvbnMsIHNvIGl0IG11c3QgZmFsbCB0aHJvdWdoIHRvIHRoZSBkcml6emxlLWtpdCBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPiwgZGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSk6IGJvb2xlYW4ge1xuICAvLyBBbiBleHBsaWNpdCBwYXR0ZXJuIG9wdHMgaW50byB0aGUgd3JhbmdsZXItbmF0aXZlIG1lY2hhbmlzbSBldmVuIGJlZm9yZSB0aGUgZGlyZWN0b3J5XG4gIC8vIGV4aXN0czsgd3JhbmdsZXIgdGhlbiBmYWlscyBzYWZlbHkgd2l0aCBcIk5vIG1pZ3JhdGlvbnMgZm9sZGVyIGZvdW5kXCIgaW5zdGVhZCBvZiB3YlxuICAvLyBzaWxlbnRseSBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgbWlncmF0aW9uIGVuZ2luZS5cbiAgaWYgKGRhdGFiYXNlLm1pZ3JhdGlvbnNfcGF0dGVybikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGF0YWJhc2UubWlncmF0aW9uc19kaXIgPz8gJ21pZ3JhdGlvbnMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZnMucmVhZGRpclN5bmMobWlncmF0aW9uc0RpclBhdGgpLnNvbWUoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5lbmRzV2l0aCgnLnNxbCcpKTtcbn1cblxuY29uc3QgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMgPSBuZXcgU2V0KFsnYmluZGluZ3MnLCAnc2VuZF9lbWFpbCcsICdyYXRlbGltaXRzJ10pO1xuY29uc3QgUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUyA9IG5ldyBTZXQoWyd3YXNtX21vZHVsZXMnLCAndGV4dF9ibG9icycsICdkYXRhX2Jsb2JzJ10pO1xuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgYmluZGluZyBuYW1lIGRlY2xhcmVkIGluIHRoZSAoZW52aXJvbm1lbnQtcmVzb2x2ZWQpIGNvbmZpZyBzdWJ0cmVlOiBgYmluZGluZ2BcbiAqIHByb3BlcnRpZXMgYW55d2hlcmUgKEQxLCBLViwgUjIsIHNlcnZpY2VzLCBhc3NldHMsIHF1ZXVlcywgZXRjLiksIHRoZSBgbmFtZWAta2V5ZWQgYmluZGluZ3NcbiAqIChgZHVyYWJsZV9vYmplY3RzLmJpbmRpbmdzYCwgYGxvZ2Z3ZHIuYmluZGluZ3NgLCBgc2VuZF9lbWFpbGAsIGByYXRlbGltaXRzYCksIGFuZCB0aGVcbiAqIHJlY29yZC1rZXllZCBsZWdhY3kgbW9kdWxlIGJpbmRpbmdzIChgd2FzbV9tb2R1bGVzYCwgYHRleHRfYmxvYnNgLCBgZGF0YV9ibG9ic2ApLiBBIHNlY3JldFxuICogc2hhcmluZyBhIGJpbmRpbmcncyBuYW1lIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhhdCBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcgb24gZGVwbG95LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyh2YWx1ZTogdW5rbm93biwgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKSwgcGFyZW50S2V5ID0gJycpOiBTZXQ8c3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgY29sbGVjdEJpbmRpbmdOYW1lcyhpdGVtLCBuYW1lcywgcGFyZW50S2V5KTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbmFtZXM7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChrZXkgPT09ICdiaW5kaW5nJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbmFtZScgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyAmJiBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUy5oYXMocGFyZW50S2V5KSkge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMuaGFzKGtleSkgJiYgY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmluZGluZ05hbWUgb2YgT2JqZWN0LmtleXMoY2hpbGQpKSBuYW1lcy5hZGQoYmluZGluZ05hbWUpO1xuICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnZW52JyAmJiBrZXkgIT09ICd2YXJzJyAmJiBrZXkgIT09ICdtZXRhZGF0YScgJiYga2V5ICE9PSAnb3B0aW9ucycpIHtcbiAgICAgIC8vIE5lc3RlZCBgZW52YCBzdWJ0cmVlcyBiZWxvbmcgdG8gb3RoZXIgZW52aXJvbm1lbnRzOyBgdmFyc2AgdmFsdWVzLCBgdW5zYWZlLm1ldGFkYXRhYCxcbiAgICAgIC8vIGFuZCBgdW5zYWZlLmJpbmRpbmdzW10uZGV2Lm9wdGlvbnNgIGFyZSBhcmJpdHJhcnkgSlNPTiB3aG9zZSBwcm9wZXJ0aWVzIChlLmcuIGFcbiAgICAgIC8vIFwiYmluZGluZ1wiIGZpZWxkKSBhcmUgZGF0YSwgbm90IFdvcmtlciBiaW5kaW5ncy5cbiAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoY2hpbGQsIG5hbWVzLCBrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB7XG4gIC8qKiBUaGUgV29ya2VyIG5hbWUgZm9yIHRoZSBkZXBsb3kgZW52aXJvbm1lbnQgKHdyYW5nbGVyIGFwcGVuZHMgYC08ZW52PmAgd2hlbiB0aGUgZW52IHNlY3Rpb24gaGFzIG5vIG93biBuYW1lKS4gKi9cbiAgd29ya2VyTmFtZT86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB2YXJLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBlbnZpcm9ubWVudCdzIGB2YXJzYCB2YWx1ZXMgKG5lZWRlZCBmb3IgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIGNvdW50L3NpemUgbGltaXRzKS4gKi9cbiAgdmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTZWNyZXRzIGRlY2xhcmVkIGFzIHJlcXVpcmVkIHZpYSB3cmFuZ2xlcidzIGBzZWNyZXRzLnJlcXVpcmVkYCAodmFsaWRhdGVkIGF0IGRlcGxveSB0aW1lKS4gKi9cbiAgcmVxdWlyZWRTZWNyZXROYW1lczogc3RyaW5nW107XG4gIC8qKiBOYW1lcyBvZiBhbGwgbm9uLXZhciBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzLCBzZW5kX2VtYWlsLCBzZXJ2aWNlcywgLi4uKS4gKi9cbiAgYmluZGluZ05hbWVzOiBzdHJpbmdbXTtcbiAgZDFEYXRhYmFzZXM6IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZW52aXJvbm1lbnQgY29tZXMgZnJvbSBhbiBgZW52LjxuYW1lPmAgc2VjdGlvbiAodGhlbiB3cmFuZ2xlciBjb21tYW5kcyBuZWVkXG4gICAqIGAtLWVudiA8bmFtZT5gIC8gYENMT1VERkxBUkVfRU5WPTxuYW1lPmApLiBgcHJvZHVjdGlvbmAgbWF5IGJlIGVpdGhlciB0aGUgdG9wIGxldmVsIG9yIGFcbiAgICogbmFtZWQgYGVudi5wcm9kdWN0aW9uYCBzZWN0aW9uOyB0aGUgc2VjdGlvbiB3aW5zIHdoZW4gaXQgZXhpc3RzLlxuICAgKi9cbiAgdXNlc0VudlNlY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSYXdXcmFuZ2xlckNvbmZpZyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZDFfZGF0YWJhc2VzPzogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIGFzc2V0cz86IHVua25vd247XG4gIGxvZ2Z3ZHI/OiB1bmtub3duO1xuICB3YXNtX21vZHVsZXM/OiB1bmtub3duO1xuICB0ZXh0X2Jsb2JzPzogdW5rbm93bjtcbiAgZGF0YV9ibG9icz86IHVua25vd247XG4gIHNpdGU/OiB1bmtub3duO1xuICBzZWNyZXRzPzogeyByZXF1aXJlZD86IHN0cmluZ1tdIH07XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIFJhd1dyYW5nbGVyQ29uZmlnPjtcbn1cblxuLy8gV29ya2VycyBTaXRlcyBpbXBsaWNpdGx5IGJpbmRzIGl0cyBLViBuYW1lc3BhY2UgYXMgX19TVEFUSUNfQ09OVEVOVC5cbmZ1bmN0aW9uIHNpdGVCaW5kaW5nTmFtZXMoY29uZmlnOiBSYXdXcmFuZ2xlckNvbmZpZywgZW52Q29uZmlnPzogUmF3V3JhbmdsZXJDb25maWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoZW52Q29uZmlnPy5zaXRlID8/IGNvbmZpZy5zaXRlKSA/IFsnX19TVEFUSUNfQ09OVEVOVCddIDogW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd3JhbmdsZXIgY29uZmlnIHZhbHVlcyBuZWVkZWQgZm9yIGRlcGxveWluZyB0byB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuXG4gKiBGb2xsb3dzIHdyYW5nbGVyJ3MgaW5oZXJpdGFuY2UgcnVsZXM6IGBhY2NvdW50X2lkYCBpcyBpbmhlcml0ZWQgYnkgbmFtZWQgZW52aXJvbm1lbnRzLFxuICogd2hpbGUgYHZhcnNgIGFuZCBgZDFfZGF0YWJhc2VzYCBhcmUgbm90IGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcbiAgaWYgKHBhdGguZXh0bmFtZShjb25maWdQYXRoKSA9PT0gJy50b21sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGVwbG95IHN1cHBvcnRzIHdyYW5nbGVyLmpzb25jL3dyYW5nbGVyLmpzb24gY29uZmlncyBvbmx5OyBtaWdyYXRlIHdyYW5nbGVyLnRvbWwgZmlyc3QuJyk7XG4gIH1cblxuICAvLyBqc29uYy1wYXJzZXIgaXMgZmF1bHQgdG9sZXJhbnQgYW5kIHdvdWxkIHJldHVybiBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsXG4gIC8vIHdoaWNoIGNvdWxkIG1pZ3JhdGUgYSByZW1vdGUgZGF0YWJhc2UgZnJvbSBhIGhhbGYtcmVhZCBjb25maWc7IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IuXG4gIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgY29uc3QgY29uZmlnID0gcGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JyksIHBhcnNlRXJyb3JzLCB7XG4gICAgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlLFxuICB9KSBhcyBSYXdXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2NvbmZpZ1BhdGh9OiAke3BhcnNlRXJyb3JzLmxlbmd0aH0gSlNPTkMgc3ludGF4IGVycm9yKHMpLmApO1xuICB9XG4gIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgY29uc3QgZW52Q29uZmlnID0gY29uZmlnLmVudj8uW2Vudk5hbWVdO1xuICBpZiAoIWVudkNvbmZpZyAmJiBlbnZOYW1lICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB3cmFuZ2xlciBjb25maWcgaGFzIG5vIFwiZW52XCI6IHsgXCIke2Vudk5hbWV9XCI6IC4uLiB9IHNlY3Rpb24uYCk7XG4gIH1cbiAgcmV0dXJuIGVudkNvbmZpZ1xuICAgID8ge1xuICAgICAgICB3b3JrZXJOYW1lOiBlbnZDb25maWcubmFtZSA/PyAoY29uZmlnLm5hbWUgPyBgJHtjb25maWcubmFtZX0tJHtlbnZOYW1lfWAgOiB1bmRlZmluZWQpLFxuICAgICAgICBhY2NvdW50SWQ6IGVudkNvbmZpZy5hY2NvdW50X2lkID8/IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhlbnZDb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGVudkNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICAvLyBNb3N0IGJpbmRpbmdzIGFyZSBub24taW5oZXJpdGFibGUgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQsIHNvIG9ubHkgdGhlXG4gICAgICAgIC8vIGVudmlyb25tZW50J3Mgb3duIG5hbWVzIGNvdW50IOKAlCBwbHVzIHRoZSBnZW51aW5lbHkgaW5oZXJpdGVkIHNoYXBlcyAoYXNzZXRzLCBsb2dmd2RyKSxcbiAgICAgICAgLy8gd2hpY2ggd3JhbmdsZXIgcmVzb2x2ZXMgYXMgd2hvbGUgZmllbGRzOiB0aGUgZW52aXJvbm1lbnQncyBvd24gZmllbGQgb3ZlcnJpZGVzIHRoZVxuICAgICAgICAvLyB0b3AgbGV2ZWwgZW50aXJlbHksIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSdzIG5hbWVzIGNvdW50LlxuICAgICAgICBiaW5kaW5nTmFtZXM6IFtcbiAgICAgICAgICAuLi5jb2xsZWN0QmluZGluZ05hbWVzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhc3NldHM6IGVudkNvbmZpZy5hc3NldHMgPz8gY29uZmlnLmFzc2V0cyxcbiAgICAgICAgICAgICAgbG9nZndkcjogZW52Q29uZmlnLmxvZ2Z3ZHIgPz8gY29uZmlnLmxvZ2Z3ZHIsXG4gICAgICAgICAgICAgIHdhc21fbW9kdWxlczogZW52Q29uZmlnLndhc21fbW9kdWxlcyA/PyBjb25maWcud2FzbV9tb2R1bGVzLFxuICAgICAgICAgICAgICB0ZXh0X2Jsb2JzOiBlbnZDb25maWcudGV4dF9ibG9icyA/PyBjb25maWcudGV4dF9ibG9icyxcbiAgICAgICAgICAgICAgZGF0YV9ibG9iczogZW52Q29uZmlnLmRhdGFfYmxvYnMgPz8gY29uZmlnLmRhdGFfYmxvYnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhlbnZDb25maWcpXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZywgZW52Q29uZmlnKSxcbiAgICAgICAgXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGVudkNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIC8vIGBzZWNyZXRzYCBpcyBub24taW5oZXJpdGFibGU6IGEgdG9wLWxldmVsIHJlcXVpcmVtZW50IG11c3Qgbm90IGZvcmNlIChvciB1cGxvYWQpXG4gICAgICAgIC8vIGEgc2VjcmV0IGludG8gYSBuYW1lZCBlbnZpcm9ubWVudC5cbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogZW52Q29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogdHJ1ZSxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgd29ya2VyTmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgIGFjY291bnRJZDogY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogY29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIGJpbmRpbmdOYW1lczogWy4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoY29uZmlnKSwgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcpXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IGZhbHNlLFxuICAgICAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZURvdGVudiB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbi8vIENsb3VkZmxhcmUgV29ya2VycyBkb24ndCBzZWUgdGhlIHByb2Nlc3MgZW52aXJvbm1lbnQ7IHdyYW5nbGVyIGRldiByZWFkcyB2YXJzIGZyb20gYSAuZGV2LnZhcnNcbi8vIGZpbGUgbmV4dCB0byBpdHMgY29uZmlnIGZpbGUgaW5zdGVhZC4gVGhpcyBjb21tYW5kIGJyaWRnZXMgd2ItbWFuYWdlZCAuZW52IGZpbGVzIHRvIHRoYXQgZmlsZS5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyAmIHsgcGF0aD86IHN0cmluZyB9PjtcblxuZXhwb3J0IGNvbnN0IGdlbkRldlZhcnNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdnZW4tZGV2LXZhcnMgW3BhdGhdJyxcbiAgZGVzY3JpYmU6XG4gICAgJ0dlbmVyYXRlIGEgLmRldi52YXJzIGZpbGUgZm9yIGB3cmFuZ2xlciBkZXZgIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQgZnJvbSAuZW52IGZpbGVzIChwbHVzIFdCX0VOViBhbmQgTkVYVF9QVUJMSUNfV0JfRU5WKS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+XG4gICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIGdlbmVyYXRlZCAuZGV2LnZhcnMgZmlsZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnLmRldi52YXJzJyxcbiAgICB9KSBhcyB1bmtub3duIGFzIEFyZ3Y8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFJlc3RyaWN0IHRvIHRoZSB2YXJpYWJsZXMgbG9hZGVkIGZyb20gLmVudiBmaWxlcyAod2IncyBlbnZpcm9ubWVudCBjb250cmFjdCkgc28gdGhhdFxuICAgIC8vIHVucmVsYXRlZCBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZXZlciBsZWFrIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBJZ25vcmVcbiAgICAvLyBwcm9jZXNzLmVudiBiZWNhdXNlIHRoZSBwYXJlbnQgd2IgcHJvY2VzcyBpbmplY3RzIHRoZSAuZW52IHZhbHVlcyBpbnRvIGl0LCB3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBsb2FkaW5nIHRoZW0gaGVyZS5cbiAgICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBkb3RlbnYgdmFsdWVzIGZvciBmaWxlLWRlZmluZWRcbiAgICAvLyBrZXlzIChwcm9qZWN0LmVudiBhcHBsaWVzIHRoYXQgcHJlY2VkZW5jZSksIG9yIGBBVVRIX1NFQ1JFVD0uLi4gd2Igc3RhcnRgIHdvdWxkIHNlcnZlXG4gICAgLy8gdGhlIHN0YWxlIGZpbGUgdmFsdWUuIEFuIGV4cG9ydCB0aGF0IGVtcHRpZXMgYSBub24tZW1wdHkgZmlsZSB2YWx1ZSBpcyBkZWxpYmVyYXRlIGFuZFxuICAgIC8vIG11c3Qgc3Vydml2ZSB0aGUgZW1wdHktdmFsdWUgZmlsdGVyIGJlbG93ICh1bmxpa2UgYEtFWT1gIHBsYWNlaG9sZGVycyBpbiAuZW52IGZpbGVzLFxuICAgIC8vIHdoaWNoIHN0YXkgb21pdHRlZCBzbyB0aGV5IGNhbm5vdCBvdmVycmlkZSB3cmFuZ2xlciBgdmFyc2Agd2l0aCBlbXB0eSBzdHJpbmdzKS5cbiAgICBjb25zdCBleHBsaWNpdGx5RW1wdGllZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSAnJyAmJiBlbnZWYXJzW2tleV0gIT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgLy8gU3VwcGxlbWVudCB3aXRoIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFsdWVzIGZvciB0aGUga2V5cyBuYW1lZCBpbiAuZW52LmV4YW1wbGU6IENJIG9mdGVuXG4gICAgLy8gcHJvdmlkZXMgdGhlbSBhcyB3b3JrZmxvdyBlbnYgaW5zdGVhZCBvZiAuZW52IGZpbGVzIChzdGlsbCBhbiBhbGxvd2xpc3QsIHNvIHVucmVsYXRlZFxuICAgIC8vIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbm5vdCBsZWFrKS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ucmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3QpLCAnV0JfRU5WJywgJ05FWFRfUFVCTElDX1dCX0VOViddKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZW52VmFyc1trZXldIHx8IGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVudlZhcnNba2V5XSA9PT0gdW5kZWZpbmVkICYmIGVmZmVjdGl2ZVZhbHVlID09PSAnJykgZXhwbGljaXRseUVtcHRpZWRLZXlzLmFkZChrZXkpO1xuICAgICAgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gJycgfHwgZXhwbGljaXRseUVtcHRpZWRLZXlzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7cXVvdGVEb3RlbnZWYWx1ZShrZXksIHZhbHVlKX1gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYXJndi5wYXRoID8/ICcuZGV2LnZhcnMnKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBXb3VsZCBnZW5lcmF0ZSAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGxldCBlbnZFeGFtcGxlUGF0aDogc3RyaW5nO1xuICB0cnkge1xuICAgIGVudkV4YW1wbGVQYXRoID0gcHJvamVjdC5maW5kRmlsZSgnLmVudi5leGFtcGxlJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvLyBkb3RlbnYncyBvd24gcGFyc2VyIGNvdmVycyBgZXhwb3J0IEtFWT1gIHByZWZpeGVzIGFuZCB3aGl0ZXNwYWNlIGFyb3VuZCBgPWAsXG4gIC8vIHdoaWNoIGEgbGluZSByZWdleCB3b3VsZCBzaWxlbnRseSBtaXNzLlxuICByZXR1cm4gT2JqZWN0LmtleXMocGFyc2VEb3RlbnYoZnMucmVhZEZpbGVTeW5jKGVudkV4YW1wbGVQYXRoLCAndXRmOCcpKSk7XG59XG5cbi8qKlxuICogUXVvdGUgYSB2YWx1ZSBmb3IgZG90ZW52ICh3aGljaCB3cmFuZ2xlciB1c2VzIGZvciAuZGV2LnZhcnMpLiBFdmVyeSBjYW5kaWRhdGUgcmVwcmVzZW50YXRpb25cbiAqIGlzIHZlcmlmaWVkIGJ5IGFjdHVhbGx5IHBhcnNpbmcgaXQgYmFjayAob3VyIGRvdGVudiBwYXJzZXIgbWF0Y2hlcyB3cmFuZ2xlcidzIGJ1bmRsZWQgZG90ZW52XG4gKiAxNiBmb3IgdGhlc2UgY29uc3RydWN0cyksIHNvIGEgdmFsdWUgaXMgZWl0aGVyIHNlcmlhbGl6ZWQgbG9zc2xlc3NseSBvciByZWplY3RlZCDigJQgbmV2ZXJcbiAqIHNpbGVudGx5IGNvcnJ1cHRlZC4gQ2FuZGlkYXRlczogc2luZ2xlIHF1b3RlcyAobGl0ZXJhbCBzcGFuOyBjbG9zZWQgZWFybHkgYnkgYW4gYXBvc3Ryb3BoZSksXG4gKiBiYWNrdGlja3MgKGVxdWFsbHkgbGl0ZXJhbCksIHRoZW4gZG91YmxlIHF1b3RlcyB3aXRoIGVzY2FwZWQgbmV3bGluZXMvQ1JzIChkb3RlbnYgZG9lcyBub3RcbiAqIHVuZXNjYXBlIGlubmVyIFxcXCIg4oCUIGEgYCNgIGFmdGVyIGFuIGVtYmVkZGVkIHF1b3RlIHN0YXJ0cyBhIGNvbW1lbnQsIHdoaWNoIHRoZSByb3VuZC10cmlwXG4gKiBjaGVjayBjYXRjaGVzIGFuZCByZWplY3RzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlRG90ZW52VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkb3VibGVRdW90ZWRCb2R5ID0gdmFsdWUucmVwbGFjZUFsbCgnXFxuJywgU3RyaW5nLnJhd2BcXG5gKS5yZXBsYWNlQWxsKCdcXHInLCBTdHJpbmcucmF3YFxccmApO1xuICBjb25zdCBjYW5kaWRhdGVzID0gW2AnJHt2YWx1ZX0nYCwgYFxcYCR7dmFsdWV9XFxgYCwgYFwiJHtkb3VibGVRdW90ZWRCb2R5fVwiYF07XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAocGFyc2VEb3RlbnYoYCR7a2V5fT0ke2NhbmRpZGF0ZX1gKVtrZXldID09PSB2YWx1ZSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB2YWx1ZSBvZiAke2tleX0gY2Fubm90IGJlIGxvc3NsZXNzbHkgc2VyaWFsaXplZCBpbnRvIC5kZXYudmFyczsgc2ltcGxpZnkgaXRzIHF1b3RpbmcuYCk7XG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGREcml6emxlS2l0Q29tbWFuZCwgdXNlc0RyaXp6bGVLaXRGb3JEMSB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50LCBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZywgV3JhbmdsZXJEMURhdGFiYXNlIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXJDb25maWcuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52LCB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXJDb25maWcuanMnO1xuXG5pbXBvcnQgeyByZWFkRW52RXhhbXBsZUtleXMgfSBmcm9tICcuL2dlbkRldlZhcnMuanMnO1xuXG4vKipcbiAqIEtleXMgdGhhdCBkcml2ZSB0aGUgZGVwbG95IGl0c2VsZiAob3IgYXJlIG1lYW5pbmdmdWwgb25seSBsb2NhbGx5KSBhbmQgdGh1cyBtdXN0IG5ldmVyIGJlXG4gKiBwdXNoZWQgdG8gdGhlIFdvcmtlciBhcyBzZWNyZXRzLiBgV0JfRU5WYCAvIGBORVhUX1BVQkxJQ19XQl9FTlZgIGJlbG9uZyBpbiB3cmFuZ2xlciBgdmFyc2AuXG4gKi9cbmNvbnN0IE5PTl9TRUNSRVRfS0VZUyA9IG5ldyBTZXQoW1xuICAnQ0knLFxuICAvLyBXcmFuZ2xlciBzeXN0ZW0vYXV0aGVudGljYXRpb24gdmFyaWFibGVzIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy93cmFuZ2xlci9zeXN0ZW0tZW52aXJvbm1lbnQtdmFyaWFibGVzLyksXG4gIC8vIGluY2x1ZGluZyBsZWdhY3kgYWxpYXNlczsgYXBwLXNwZWNpZmljIG5hbWVzIHN1Y2ggYXMgQ0xPVURGTEFSRV9SMl9BQ0NFU1NfS0VZX0lEIHN0YXkgZWxpZ2libGUuXG4gICdDRl9BQ0NPVU5UX0lEJyxcbiAgJ0NGX0FQSV9CQVNFX1VSTCcsXG4gICdDRl9BUElfRU1BSUwnLFxuICAnQ0ZfQVBJX0tFWScsXG4gICdDRl9BUElfVE9LRU4nLFxuICAnQ0ZfRU1BSUwnLFxuICAnQ0xPVURGTEFSRV9BQ0NFU1NfQ0xJRU5UX0lEJyxcbiAgJ0NMT1VERkxBUkVfQUNDRVNTX0NMSUVOVF9TRUNSRVQnLFxuICAnQ0xPVURGTEFSRV9BQ0NPVU5UX0lEJyxcbiAgJ0NMT1VERkxBUkVfQVBJX0JBU0VfVVJMJyxcbiAgJ0NMT1VERkxBUkVfQVBJX0tFWScsXG4gICdDTE9VREZMQVJFX0FQSV9UT0tFTicsXG4gICdDTE9VREZMQVJFX0FVVEhfVVNFX0tFWVJJTkcnLFxuICAnQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCcsXG4gICdDTE9VREZMQVJFX0VNQUlMJyxcbiAgJ0NMT1VERkxBUkVfRU5WJyxcbiAgJ0NMT1VERkxBUkVfSU5DTFVERV9QUk9DRVNTX0VOVicsXG4gICdDTE9VREZMQVJFX0xPQURfREVWX1ZBUlNfRlJPTV9ET1RfRU5WJyxcbiAgJ0RPQ0tFUl9IT1NUJyxcbiAgJ0hUVFBfUFJPWFknLFxuICAnSFRUUFNfUFJPWFknLFxuICAnaHR0cF9wcm94eScsXG4gICdodHRwc19wcm94eScsXG4gICdGT1JDRV9DT0xPUicsXG4gICdNSU5JRkxBUkVfQ0FDSEVfRElSJyxcbiAgJ01JU0VfRU5WJyxcbiAgJ05PX0NPTE9SJyxcbiAgJ05FWFRfUFVCTElDX1dCX0VOVicsXG4gICdORVhUX1BVQkxJQ19XQl9WRVJTSU9OJyxcbiAgJ05PREVfRU5WJyxcbiAgJ1BPUlQnLFxuICAnV0JfRU5WJyxcbiAgJ1dCX1ZFUlNJT04nLFxuXSk7XG5cbmNvbnN0IE5PTl9TRUNSRVRfS0VZX1BSRUZJWEVTID0gWydXUkFOR0xFUl8nLCAnQ0xPVURGTEFSRV9IWVBFUkRSSVZFX0xPQ0FMX0NPTk5FQ1RJT05fU1RSSU5HXycsICdDTE9VREZMQVJFX0NGX0ZFVENIXyddO1xuXG5mdW5jdGlvbiBpc05vblNlY3JldEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gTk9OX1NFQ1JFVF9LRVlTLmhhcyhrZXkpIHx8IE5PTl9TRUNSRVRfS0VZX1BSRUZJWEVTLnNvbWUoKHByZWZpeCkgPT4ga2V5LnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBEZXBsb3lDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBEZXBsb3lDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxEZXBsb3lDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIERlcGxveUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOlxuICAgICdEZXBsb3kgYSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwICh2aW5leHQgb3IgcGxhaW4gV29ya2VyKSB0byB0aGUgV0JfRU5WIGVudmlyb25tZW50OiB2YWxpZGF0ZSBzZWNyZXRzLCBidWlsZCwgYXBwbHkgcmVtb3RlIEQxIG1pZ3JhdGlvbnMsIHRoZW4gZGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHlhcmdzIGFzIHVua25vd24gYXMgQXJndjxEZXBsb3lDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogRGVwbG95Q29tbWFuZEFyZ3YpIHtcbiAgICAvLyBBIHN0cmF5IGV4cG9ydGVkIENMT1VERkxBUkVfRU5WIHdvdWxkIGJha2UgdGhlIHdyb25nIGVudmlyb25tZW50IGludG8gdGhlIGJ1aWxkIGFuZFxuICAgIC8vIGFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXggdHdpY2Ugb24gZGVwbG95OyBpdCBpcyByZS1zZXQgZXhwbGljaXRseSB3aGVyZSBuZWVkZWQuXG4gICAgLy8gQSBkb3RlbnYgZmlsZSBkZWZpbmluZyBpdCBzdGlsbCBzdXJmYWNlcyB0aHJvdWdoIHByb2plY3QuZW52LCB3aGljaCB0aGUgZXhwbGljaXQgYC0tZW52YFxuICAgIC8vIGZsYWdzIGJlbG93IG92ZXJyaWRlLlxuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DTE9VREZMQVJFX0VOVjtcblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHdyYW5nbGVyQ29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgaWYgKCF3cmFuZ2xlckNvbmZpZ1BhdGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCd3YiBkZXBsb3kgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcHMgKG5vIHdyYW5nbGVyIGNvbmZpZyBmb3VuZCkuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBlbnZOYW1lID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIGlmICghZW52TmFtZSB8fCBlbnZOYW1lID09PSAnZGV2ZWxvcG1lbnQnIHx8IGVudk5hbWUgPT09ICd0ZXN0Jykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBXQl9FTlYgbXVzdCBuYW1lIGEgZGVwbG95IGVudmlyb25tZW50IChlLmcuIHN0YWdpbmcgb3IgcHJvZHVjdGlvbiksIGJ1dCBpcyAke2Vudk5hbWV9LmApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFRoZSB2YWx1ZXMgZ28gaW50byBib3RoIHByb2Nlc3MuZW52IChpbmhlcml0ZWQgYnkgZXZlcnl0aGluZyB3YiBzcGF3bnMpIGFuZCBwcm9qZWN0LmVudlxuICAgIC8vICh0aGUgZW52aXJvbm1lbnQgd2IgaXRzZWxmIHJlYWRzIGFuZCBwYXNzZXMgZXhwbGljaXRseSk7IHRoZSBsYXR0ZXIgaXMgYSBjYWNoZWQgc25hcHNob3RcbiAgICAvLyB0YWtlbiBiZWZvcmUgdGhpcyBwb2ludCwgc28gd3JpdGluZyBvbmx5IHRvIHByb2Nlc3MuZW52IHdvdWxkIGxlYXZlIHdiJ3Mgb3duIHByZWZsaWdodCDigJRcbiAgICAvLyBhbmQgYW55IGNvbW1hbmQgc3Bhd25lZCB3aXRoIHByb2plY3QuZW52IOKAlCB3aXRob3V0IHRoZSB0b2tlbi5cbiAgICAvLyBPbmx5IC0taW5jbHVkZS1yb290LWVudiBnYXRlcyB0aGUgcm9vdCBsb29rdXAsIG5vdCBhbiBleHBsaWNpdCAtLWVudjogLS1lbnYgcmVwbGFjZXMgdGhlXG4gICAgLy8gZG90ZW52IFZBUklBQkxFIHNvdXJjZXMsIHdoaWxlIC5lbnYuY2xvdWRmbGFyZSBpcyBhIGNyZWRlbnRpYWwgc2lkZWNhciByZWFkIG91dHNpZGUgdGhhdFxuICAgIC8vIGNhc2NhZGUgKHRoZSBwcm9qZWN0J3Mgb3duIGNvcHkgaXMgcmVhZCByZWdhcmRsZXNzIG9mIC0tZW52LCBhcyBpdCBhbHdheXMgaGFzIGJlZW4pLlxuICAgIC8vIEdhdGluZyBvbiAtLWVudiB3b3VsZCBtYWtlIGB3YiBkZXBsb3kgLS1lbnYgPGZpbGU+YCBzaWxlbnRseSBzdG9wIGZpbmRpbmcgdGhlIHJlcG8ncyB0b2tlbi5cbiAgICBjb25zdCBjbG91ZGZsYXJlRW52VmFycyA9IHJlYWRDbG91ZGZsYXJlRW52RmlsZXMoXG4gICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBhcmd2LmluY2x1ZGVSb290RW52ID8gcHJvamVjdC5yb290RGlyUGF0aCA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY2xvdWRmbGFyZUVudlZhcnMpKSB7XG4gICAgICAvLyA/Pz0gc28gdGhhdCBhbiBleHBsaWNpdGx5IGV4cG9ydGVkIGVtcHR5IHZhbHVlIHN0aWxsIHdpbnMgb3ZlciB0aGUgZmlsZS5cbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPz89IHZhbHVlO1xuICAgICAgcHJvamVjdC5lbnZba2V5XSA/Pz0gdmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICByZXNvbHZlZENvbmZpZyA9IHJlc29sdmVXcmFuZ2xlckNvbmZpZ0ZvckVudihwcm9qZWN0LCBlbnZOYW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoU3RyaW5nKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZWRDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gcGFyc2UgJHt3cmFuZ2xlckNvbmZpZ1BhdGh9LmApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgYWNjb3VudElkID0gcmVzb2x2ZWRDb25maWcuYWNjb3VudElkID8/IHByb2plY3QuZW52LkNMT1VERkxBUkVfQUNDT1VOVF9JRDtcbiAgICAvLyBQcmVmZXIgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgd2hlbmV2ZXIgdGhlIHJlc29sdmVkIGVudmlyb25tZW50J3MgRDEgYmluZGluZ3MgaGF2ZSBhblxuICAgIC8vIGV4aXN0aW5nIG1pZ3JhdGlvbnMgZGlyZWN0b3J5LiBBIGRyaXp6bGUtb3JtIGRlcGVuZGVuY3kgYWxvbmUgZG9lcyBub3QgaW1wbHkgdGhlIHByb2plY3RcbiAgICAvLyBtaWdyYXRlcyBEMSB3aXRoIGRyaXp6bGUta2l0J3MgZDEtaHR0cCBkcml2ZXI6IHRoZSBleHBsaWNpdCBtYXJrZXIgaXMgYSBkcml6emxlIGNvbmZpZ1xuICAgIC8vIHdob3NlIGRpYWxlY3QvZHJpdmVyIHRhcmdldHMgc3FsaXRlIC8gZDEtaHR0cCAvIGR1cmFibGUtc3FsaXRlIChzZWUgdXNlc0RyaXp6bGVLaXRGb3JEMTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NDIpLiBBIGRyaXp6bGUgY29uZmlnIHRhcmdldGluZyBhbm90aGVyXG4gICAgLy8gZGF0YWJhc2UgKGUuZy4gUG9zdGdyZVNRTCB2aWEgSHlwZXJkcml2ZSkgbGVhdmVzIHRoZSBEMSBiaW5kaW5ncyB1bm1hbmFnZWQgYnkgd2IgZGVwbG95LlxuICAgIGNvbnN0IHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMgPSByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5maWx0ZXIoKGRhdGFiYXNlKSA9PlxuICAgICAgdXNlc1dyYW5nbGVyTmF0aXZlTWlncmF0aW9ucyhwcm9qZWN0LCBkYXRhYmFzZSlcbiAgICApO1xuICAgIGNvbnN0IGRyaXp6bGVLaXRNYW5hZ2VzRDEgPSB1c2VzRHJpenpsZUtpdEZvckQxKHByb2plY3QpO1xuICAgIGlmIChcbiAgICAgIGRyaXp6bGVLaXRNYW5hZ2VzRDEgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID4gMCAmJlxuICAgICAgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPCByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIC8vIE1pZ3JhdGluZyBvbmx5IHRoZSB3cmFuZ2xlci1uYXRpdmUgc3Vic2V0IHdvdWxkIHNpbGVudGx5IGRlcGxveSBjb2RlIGFnYWluc3QgdGhlXG4gICAgICAvLyBvdGhlciwgdW5taWdyYXRlZCBkYXRhYmFzZXMuXG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoJ3diIGRlcGxveSBkb2VzIG5vdCBzdXBwb3J0IG1peGluZyB3cmFuZ2xlci1uYXRpdmUgYW5kIG5vbi1uYXRpdmUgRDEgbWlncmF0aW9uIGxheW91dHMuJylcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGRyaXp6bGVEMURhdGFiYXNlID1cbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID09PSAwICYmIGRyaXp6bGVLaXRNYW5hZ2VzRDEgPyByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlc1swXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAod3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPT09IDAgJiYgZHJpenpsZUtpdE1hbmFnZXNEMSAmJiByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoJ3diIGRlcGxveSBzdXBwb3J0cyBkcml6emxlLWtpdCBtaWdyYXRpb25zIG9ubHkgZm9yIGEgc2luZ2xlIEQxIGJpbmRpbmc7IGZvdW5kIG11bHRpcGxlLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBtYW5hZ2VkRDFEYXRhYmFzZXMgPSBuZXcgU2V0KHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMpO1xuICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSkgbWFuYWdlZEQxRGF0YWJhc2VzLmFkZChkcml6emxlRDFEYXRhYmFzZSk7XG4gICAgY29uc3QgdW5tYW5hZ2VkRDFEYXRhYmFzZXMgPSByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5maWx0ZXIoKGRhdGFiYXNlKSA9PiAhbWFuYWdlZEQxRGF0YWJhc2VzLmhhcyhkYXRhYmFzZSkpO1xuICAgIGlmICh1bm1hbmFnZWREMURhdGFiYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBTYXkgc28gb3V0IGxvdWQgaW5zdGVhZCBvZiBzaWxlbnRseSBkZXBsb3lpbmcgY29kZSBhZ2FpbnN0IHVubWlncmF0ZWQgZGF0YWJhc2VzOiB0aGVcbiAgICAgIC8vIGRyaXp6bGUgbWFya2VyIGRldGVjdGlvbiBpcyBoZXVyaXN0aWMgKHRleHQgc2NhbiBvZiBkcml6emxlLmNvbmZpZy4qKSwgc28gYSBwcm9qZWN0IHRoYXRcbiAgICAgIC8vIGdlbnVpbmVseSBtaWdyYXRlcyBEMSBtdXN0IGJlIGFibGUgdG8gbm90aWNlIHdoZW4gbm8gbWVjaGFuaXNtIHdhcyBzZWxlY3RlZC4gVGhpcyBhbHNvXG4gICAgICAvLyBjb3ZlcnMgcGFydGlhbCBsYXlvdXRzIChzb21lIGJpbmRpbmdzIHdyYW5nbGVyLW5hdGl2ZSwgb3RoZXJzIHVubWFuYWdlZCkuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgTm8gRDEgbWlncmF0aW9uIG1lY2hhbmlzbSBkZXRlY3RlZCBmb3IgJHt1bm1hbmFnZWREMURhdGFiYXNlc1xuICAgICAgICAgICAgLm1hcCgoZGF0YWJhc2UpID0+IGRhdGFiYXNlLmJpbmRpbmcgPz8gZGF0YWJhc2UuZGF0YWJhc2VfbmFtZSA/PyAndW5uYW1lZCBiaW5kaW5nJylcbiAgICAgICAgICAgIC5qb2luKCcsICcpfSBgICtcbiAgICAgICAgICAgICcobm8gd3JhbmdsZXIgbWlncmF0aW9ucyBkaXJlY3RvcnkgYW5kIG5vIGRyaXp6bGUgY29uZmlnIHRhcmdldGluZyBzcWxpdGUvZDEtaHR0cC9kdXJhYmxlLXNxbGl0ZSk7IHdiIGRlcGxveSB3aWxsIG5vdCBydW4gRDEgbWlncmF0aW9ucyBmb3IgdGhlbS4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIERyeSBydW5zIGV4ZWN1dGUgbm90aGluZyBhdXRoZW50aWNhdGVkLCBzbyB0aGV5IHNraXAgdGhlIGNyZWRlbnRpYWwgcHJlZmxpZ2h0IGVudGlyZWx5LlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIC8vIEEgZHJpenpsZS1zZWxlY3RlZCBEMSBkYXRhYmFzZSByb3V0ZXMgYm90aCB0aGUgbWlncmF0aW9uIGluIHN0ZXAgMyBhbmQgYW55IGRlcGxveS9wb3N0XG4gICAgICAvLyBob29rIHRocm91Z2ggZHJpenpsZS1raXQncyBkMS1odHRwIGRyaXZlciwgd2hpY2ggbmVlZHMgQ0xPVURGTEFSRV9BUElfVE9LRU4gZXZlbiBmb3JcbiAgICAgIC8vIGxvY2FsLCB3cmFuZ2xlci1PQXV0aCBkZXBsb3lzLiBGYWlsaW5nIGhlcmUga2VlcHMgdGhlIGZhaWwtZmFzdCBvcmRlcmluZzogYSBtaXNzaW5nIHRva2VuXG4gICAgICAvLyBtdXN0IGFib3J0IGJlZm9yZSB0aGUgZGVwbG95IGdvZXMgbGl2ZSwgbm90IGR1cmluZyBtaWdyYXRpb24gb3IgZGVwbG95L3Bvc3RcbiAgICAgIC8vIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NTYpLiBXcmFuZ2xlci1uYXRpdmUgcHJvamVjdHMgKHdpdGggb3JcbiAgICAgIC8vIHdpdGhvdXQgaG9va3MpIG11c3Qgbm90IHJlcXVpcmUgdGhlIHRva2VuOiBhIGxvY2FsIHdyYW5nbGVyIE9BdXRoIGxvZ2luIHN1ZmZpY2VzIHRoZXJlLFxuICAgICAgLy8gZXZlbiB0aG91Z2ggc3RlcCA1IHN0aWxsIGV4cG9ydHMgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCB0byB0aGVpciBob29rcy5cbiAgICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSAmJiAhcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfVE9LRU4pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0NMT1VERkxBUkVfQVBJX1RPS0VOIGlzIHJlcXVpcmVkIGZvciByZW1vdGUgZHJpenpsZS1raXQgbWlncmF0aW9ucy4nKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc1dyYW5nbGVyQXV0aGVudGljYXRpb24gPVxuICAgICAgICAhIXByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX1RPS0VOIHx8XG4gICAgICAgICEhcHJvamVjdC5lbnYuQ0ZfQVBJX1RPS0VOIHx8XG4gICAgICAgICEhKHByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX0tFWSAmJiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0VNQUlMKSB8fFxuICAgICAgICAhIShwcm9qZWN0LmVudi5DRl9BUElfS0VZICYmIHByb2plY3QuZW52LkNGX0VNQUlMKTtcbiAgICAgIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSAmJiAhaGFzV3JhbmdsZXJBdXRoZW50aWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnV3JhbmdsZXIgYXV0aGVudGljYXRpb24gKGUuZy4gQ0xPVURGTEFSRV9BUElfVE9LRU4pIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBvbiBDSS4nKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHAtc3BlY2lmaWMgdmFsaWRhdGlvbiBob29rIChlLmcuIHNlY3JldCBwYWlycyB0aGF0IG11c3QgYmUgYm90aC1zZXQtb3ItYm90aC1lbXB0eSkuXG4gICAgLy8gVGhlIHJldXNhYmxlIGRlcGxveS55bWwgYWxyZWFkeSBydW5zIGl0IG9uIENJOyBydW4gaXQgaGVyZSBmb3IgbG9jYWwgZGVwbG95cy5cbiAgICBpZiAoIWlzQ0kocHJvamVjdC5lbnYuQ0kpICYmIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvY2ktc2V0dXAnXSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdZQVJOIHJ1biBkZXBsb3kvY2ktc2V0dXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICAvLyAxLiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSBhbGwgc2VjcmV0cyBiZWZvcmUgYW55IGJ1aWxkIG9yIHJlbW90ZSBtdXRhdGlvbiwgc28gYSBtaXNzaW5nXG4gICAgLy8gICAgc2VjcmV0IGFib3J0cyB0aGUgZGVwbG95IGluc3RlYWQgb2YgbGVhdmluZyBhIG1pZ3JhdGVkIGRhdGFiYXNlIGJlaGluZCBhbiBvbGQgV29ya2VyLlxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZTb3VyY2VzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBwcm9qZWN0LmRpclBhdGgsIHsgaWdub3JlUHJvY2Vzc0VudjogdHJ1ZSB9KTtcbiAgICAvLyBSZXN0cmljdCB0aGUgc2VjcmV0cyBkb21haW4gdG8ga2V5cyBkZWZpbmVkIGluIHRoZSBwcm9qZWN0J3MgLmVudiBmaWxlczogYG1pc2UgZW52YFxuICAgIC8vIG91dHB1dCAocmVwb3J0ZWQgYXMgYSBwc2V1ZG8tc291cmNlKSBtaXhlcyBpbiBob3N0L3Rvb2wgdmFyaWFibGVzIHN1Y2ggYXMgQ0FSR09fSE9NRSxcbiAgICAvLyB3aGljaCBtdXN0IG5ldmVyIGJlIHVwbG9hZGVkIGFzIFdvcmtlciBzZWNyZXRzLlxuICAgIGNvbnN0IGRvdGVudktleXMgPSBuZXcgU2V0KFxuICAgICAgZW52U291cmNlcy5maWx0ZXIoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpLmZsYXRNYXAoKFssIGtleXNdKSA9PiBrZXlzKVxuICAgICk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGlmICghZG90ZW52S2V5cy5oYXMoa2V5KSkgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWlyZWRLZXlzID0gcmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3QpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlcXVpcmVkS2V5cykge1xuICAgICAgZW52VmFyc1trZXldID8/PSBwcm9qZWN0LmVudltrZXldID8/ICcnO1xuICAgIH1cbiAgICAvLyBOYW1lcyBkZWNsYXJlZCB2aWEgd3JhbmdsZXIgYHNlY3JldHMucmVxdWlyZWRgIG1heSBsaWtld2lzZSBiZSBzdXBwbGllZCBwdXJlbHkgYXNcbiAgICAvLyBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4gQ0kgd29ya2Zsb3cgZW52KSBpbnN0ZWFkIG9mIGRvdGVudiB2YWx1ZXMuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgcmVzb2x2ZWRDb25maWcucmVxdWlyZWRTZWNyZXROYW1lcykge1xuICAgICAgY29uc3QgZXhwb3J0ZWRWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZW52VmFyc1trZXldID09PSB1bmRlZmluZWQgJiYgZXhwb3J0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBleHBvcnRlZFZhbHVlO1xuICAgIH1cbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBtdXN0IHdpbiBvdmVyIGRvdGVudiB2YWx1ZXMgKHByb2plY3QuZW52IGFscmVhZHlcbiAgICAvLyBhcHBsaWVzIHRoYXQgcHJlY2VkZW5jZSksIG9yIGBBVVRIX1NFQ1JFVD0uLi4gd2IgZGVwbG95YCB3b3VsZCBwdXNoIHRoZSBzdGFsZSBmaWxlIHZhbHVlLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZWZmZWN0aXZlVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHsgbWlzc2luZ0tleXMsIHNlY3JldHMgfSA9IHNlbGVjdFdvcmtlclNlY3JldHMoXG4gICAgICBlbnZWYXJzLFxuICAgICAgWy4uLnJlc29sdmVkQ29uZmlnLnZhcktleXMsIC4uLnJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc10sXG4gICAgICByZXF1aXJlZEtleXNcbiAgICApO1xuICAgIC8vIGAtLXZhciBXQl9WRVJTSU9OOi4uLmAgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIG9uIGRlcGxveSwgc28gYVxuICAgIC8vIHJlc291cmNlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIHdvdWxkIHNpbGVudGx5IGJlY29tZSBhIHN0cmluZyB2YXJpYWJsZS5cbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTiAmJiByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMoJ1dCX1ZFUlNJT04nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dCX1ZFUlNJT04gY29sbGlkZXMgd2l0aCBhIFdvcmtlciBiaW5kaW5nIG5hbWU7IHJlbmFtZSB0aGUgYmluZGluZy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGJpbmRpbmdDb2xsaXNpb25zID0gT2JqZWN0LmtleXMoZW52VmFycykuZmlsdGVyKChrZXkpID0+IHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcyhrZXkpKTtcbiAgICBpZiAoYmluZGluZ0NvbGxpc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVXBsb2FkaW5nIGEgc2VjcmV0IG5hbWVkIGxpa2UgYSBiaW5kaW5nIHdvdWxkIHJlcGxhY2UgdGhlIGJpbmRpbmcgd2l0aCBhIHBsYWluIHN0cmluZy5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyBlbnYga2V5cyB0aGF0IGNvbGxpZGUgd2l0aCBXb3JrZXIgYmluZGluZyBuYW1lczogJHtiaW5kaW5nQ29sbGlzaW9ucy5qb2luKCcsICcpfWApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZnJvbSAuZW52LmV4YW1wbGUgb3Igd3JhbmdsZXIgc2VjcmV0cy5yZXF1aXJlZCk6ICR7bWlzc2luZ0tleXMuam9pbignLCAnKX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFdyYW5nbGVyIHZhbGlkYXRlcyBgc2VjcmV0cy5yZXF1aXJlZGAgb25seSBkdXJpbmcgdGhlIHJlYWwgdXBsb2FkIOKAlCBhZnRlciBtaWdyYXRpb25zIOKAlFxuICAgIC8vIHNvIHdiIGNoZWNrcyB1cGZyb250OiBlYWNoIHJlcXVpcmVkIG5hbWUgbXVzdCBiZSBhIGtleSBpbiB0aGUgb3V0Z29pbmcgcGF5bG9hZCAocHJlc2VuY2UsXG4gICAgLy8gbm90IHRydXRoaW5lc3Mg4oCUIGFuIGV4cGxpY2l0IGVtcHR5IGNsZWFycyBhIHN0YWxlIHZhbHVlKSBvciBhbiBlZmZlY3RpdmUgdmFyL2JpbmRpbmcuXG4gICAgY29uc3QgdW5zYXRpc2ZpZWRSZXF1aXJlZFNlY3JldE5hbWVzID0gcmVzb2x2ZWRDb25maWcucmVxdWlyZWRTZWNyZXROYW1lcy5maWx0ZXIoXG4gICAgICAobmFtZSkgPT5cbiAgICAgICAgIU9iamVjdC5oYXNPd24oc2VjcmV0cywgbmFtZSkgJiZcbiAgICAgICAgIXJlc29sdmVkQ29uZmlnLnZhcktleXMuaW5jbHVkZXMobmFtZSkgJiZcbiAgICAgICAgIXJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcyhuYW1lKVxuICAgICk7XG4gICAgaWYgKHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFNlY3JldHMgcmVxdWlyZWQgYnkgdGhlIHdyYW5nbGVyIGNvbmZpZyBhcmUgbm90IHByb3ZpZGVkOiAke3Vuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcy5qb2luKCcsICcpfWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0S2V5cyA9IE9iamVjdC5rZXlzKHNlY3JldHMpLnRvU29ydGVkKCk7XG4gICAgLy8gQ2xvdWRmbGFyZSBsaW1pdHMgYSBidWxrIHVwbG9hZCB0byAxMDAgc2VjcmV0cywgZWFjaCB2YXJpYWJsZS9zZWNyZXQgdmFsdWUgdG8gNSBLQiwgYW5kXG4gICAgLy8gdGhlIGNvbWJpbmVkIHZhcmlhYmxlK3NlY3JldCBjb3VudCB0byAxMjggKDY0IG9uIHRoZSBGcmVlIHBsYW4sIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZFxuICAgIC8vIGhlcmUg4oCUIGhlbmNlIGEgd2FybmluZykuIEZhaWxpbmcgYmVmb3JlIGFueSBidWlsZCBvciBtaWdyYXRpb24ga2VlcHMgYW4gb3ZlcnNpemVkIHBheWxvYWRcbiAgICAvLyBmcm9tIGFib3J0aW5nIHRoZSBkZXBsb3kgYWZ0ZXIgcmVtb3RlIG1pZ3JhdGlvbnMgYWxyZWFkeSByYW4uXG4gICAgaWYgKHNlY3JldEtleXMubGVuZ3RoID4gMTAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYENsb3VkZmxhcmUgYWNjZXB0cyBhdCBtb3N0IDEwMCBzZWNyZXRzIHBlciBkZXBsb3ksIGJ1dCAke3NlY3JldEtleXMubGVuZ3RofSB3ZXJlIHNlbGVjdGVkLmApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBUaGUgQ0xJLXByb3ZpZGVkIFdCX1ZFUlNJT04gb3ZlcmxheXMgYSBjb25maWd1cmVkIHZhciBvZiB0aGUgc2FtZSBuYW1lIG9uIGRlcGxveSxcbiAgICAvLyBzbyBvbmx5IHRoZSBlZmZlY3RpdmUgdmFsdWUgcGFydGljaXBhdGVzIGluIHRoZSBsaW1pdCBjaGVja3MuXG4gICAgY29uc3QgZWZmZWN0aXZlVmFycyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXM8dW5rbm93bj4ocmVzb2x2ZWRDb25maWcudmFycykpO1xuICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OKSBlZmZlY3RpdmVWYXJzLnNldCgnV0JfVkVSU0lPTicsIHByb2plY3QuZW52LldCX1ZFUlNJT04pO1xuICAgIGNvbnN0IHZhckVudHJpZXMgPSBbLi4uZWZmZWN0aXZlVmFyc107XG4gICAgY29uc3Qgb3ZlcnNpemVkS2V5cyA9IFtcbiAgICAgIC4uLnNlY3JldEtleXMuZmlsdGVyKChrZXkpID0+IEJ1ZmZlci5ieXRlTGVuZ3RoKHNlY3JldHNba2V5XSA/PyAnJywgJ3V0ZjgnKSA+IDUgKiAxMDI0KSxcbiAgICAgIC4uLnZhckVudHJpZXNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoWywgdmFsdWVdKSA9PiBCdWZmZXIuYnl0ZUxlbmd0aCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSksICd1dGY4JykgPiA1ICogMTAyNFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpLFxuICAgIF07XG4gICAgaWYgKG92ZXJzaXplZEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFZhcmlhYmxlIG9yIHNlY3JldCB2YWx1ZXMgZXhjZWVkIENsb3VkZmxhcmUncyA1IEtCIGxpbWl0OiAke292ZXJzaXplZEtleXMuam9pbignLCAnKX1gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIGAtLXNlY3JldHMtZmlsZWAgaXMgYWRkaXRpdmU6IHJlbW90ZSBzZWNyZXRzIGFic2VudCBmcm9tIHRoZSBwYXlsb2FkIHN0YXkgYXR0YWNoZWQgdG8gdGhlXG4gICAgLy8gbmV3IHZlcnNpb24sIHNvIHRoZXkgY291bnQgYWdhaW5zdCB0aGUgY29tYmluZWQgbGltaXQgdG9vLiBMaXN0aW5nIHRoZW0gbmVlZHMgYW5cbiAgICAvLyBhdXRoZW50aWNhdGVkIHJlbW90ZSByb3VuZC10cmlwLCB3aGljaCBkcnkgcnVucyBza2lwOyB3aGVuIHRoZSBsaXN0aW5nIGZhaWxzIGZvciBhbnlcbiAgICAvLyByZWFzb24gb3RoZXIgdGhhbiBhIG5vdC15ZXQtY3JlYXRlZCBXb3JrZXIsIGRlZ3JhZGUgdG8gdGhlIGxvY2FsLW9ubHkgY291bnQgaW5zdGVhZCBvZlxuICAgIC8vIGJsb2NraW5nIGEgZGVwbG95IHRoYXQgd3JhbmdsZXIgaXRzZWxmIG1pZ2h0IGFjY2VwdC5cbiAgICBjb25zdCByZW1vdGVTZWNyZXROYW1lcyA9IGFyZ3YuZHJ5UnVuXG4gICAgICA/IFtdXG4gICAgICA6IGF3YWl0IGxpc3RSZW1vdGVXb3JrZXJTZWNyZXROYW1lcyhwcm9qZWN0LCBhcmd2LCB3cmFuZ2xlckNvbmZpZ1BhdGgsIHJlc29sdmVkQ29uZmlnLCBlbnZOYW1lKTtcbiAgICBjb25zdCBpbmhlcml0ZWRTZWNyZXROYW1lcyA9IHNlbGVjdEluaGVyaXRlZFJlbW90ZVNlY3JldE5hbWVzKFxuICAgICAgcmVtb3RlU2VjcmV0TmFtZXMgPz8gW10sXG4gICAgICBzZWNyZXRzLFxuICAgICAgdmFyRW50cmllcy5tYXAoKFtrZXldKSA9PiBrZXkpLFxuICAgICAgcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzXG4gICAgKTtcbiAgICBjb25zdCBjb21iaW5lZENvdW50ID1cbiAgICAgIG5ldyBTZXQoWy4uLnNlY3JldEtleXMsIC4uLnZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KV0pLnNpemUgKyBpbmhlcml0ZWRTZWNyZXROYW1lcy5sZW5ndGg7XG4gICAgY29uc3QgaW5oZXJpdGVkTm90ZSA9XG4gICAgICBpbmhlcml0ZWRTZWNyZXROYW1lcy5sZW5ndGggPiAwXG4gICAgICAgID8gYCAoaW5jbHVkaW5nICR7aW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RofSByZW1vdGUgc2VjcmV0cyBrZXB0IGZyb20gdGhlIHByZXZpb3VzIHZlcnNpb246ICR7aW5oZXJpdGVkU2VjcmV0TmFtZXMuam9pbignLCAnKX0pYFxuICAgICAgICA6ICcnO1xuICAgIGlmIChjb21iaW5lZENvdW50ID4gMTI4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYENsb3VkZmxhcmUgYWxsb3dzIGF0IG1vc3QgMTI4IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBjb21iaW5lZCwgYnV0ICR7Y29tYmluZWRDb3VudH0gd2VyZSBzZWxlY3RlZCR7aW5oZXJpdGVkTm90ZX0uYFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDY0KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgJHtjb21iaW5lZENvdW50fSB2YXJpYWJsZXMgYW5kIHNlY3JldHMke2luaGVyaXRlZE5vdGV9IGV4Y2VlZCB0aGUgRnJlZSBwbGFuJ3MgbGltaXQgb2YgNjQuYClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgIGBEZXBsb3lpbmcgJHtyZXNvbHZlZENvbmZpZy53b3JrZXJOYW1lID8/IHByb2plY3QubmFtZX0gKCR7ZW52TmFtZX0pIHdpdGggJHtzZWNyZXRLZXlzLmxlbmd0aH0gc2VjcmV0czogJHtzZWNyZXRLZXlzLmpvaW4oJywgJyl9YFxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyAyLiBCdWlsZCAodmluZXh0IGVtYmVkcyB0aGUgZW52aXJvbm1lbnQtYXBwbGllZCB3cmFuZ2xlciBjb25maWcgaW50byBkaXN0L3NlcnZlci93cmFuZ2xlci5qc29uKS5cbiAgICAvLyAgICBCdWlsZGluZyBiZWZvcmUgbWlncmF0aW5nIGtlZXBzIGEgYnVpbGQgZmFpbHVyZSBmcm9tIGxlYXZpbmcgYSBtaWdyYXRlZCBzY2hlbWEgYmVoaW5kXG4gICAgLy8gICAgdGhlIG9sZCBXb3JrZXIuIFBsYWluIFdvcmtlcnMgaGF2ZSBubyBidWlsZCBzdGVwOyB3cmFuZ2xlciBidW5kbGVzIHRoZSBlbnRyeSBpdHNlbGYuXG4gICAgY29uc3QgaXNWaW5leHQgPSAhIShwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udmluZXh0ID8/IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aW5leHQpO1xuICAgIGNvbnN0IGRlcGxveUNvbmZpZ1BhdGggPSBpc1ZpbmV4dCA/IHBhdGguam9pbignZGlzdCcsICdzZXJ2ZXInLCAnd3JhbmdsZXIuanNvbicpIDogd3JhbmdsZXJDb25maWdQYXRoO1xuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZBc3NpZ25tZW50ID0gcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb25cbiAgICAgID8gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnQ0xPVURGTEFSRV9FTlYnLCBlbnZOYW1lKX0gYFxuICAgICAgOiAnJztcbiAgICBpZiAoaXNWaW5leHQpIHtcbiAgICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OKSB7XG4gICAgICAgIHByb2plY3QuZW52Lk5FWFRfUFVCTElDX1dCX1ZFUlNJT04gfHw9IHByb2plY3QuZW52LldCX1ZFUlNJT047XG4gICAgICB9XG4gICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdZQVJOIHJ1biBnZW4tY29kZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke2Nsb3VkZmxhcmVFbnZBc3NpZ25tZW50fVlBUk4gdmluZXh0IGJ1aWxkYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAvLyBPbiBkcnkgcnVucyB0aGUgdmluZXh0IGJ1aWxkIGFib3ZlIGlzIGEgcHJpbnRlZCBuby1vcCwgc28gdGhlIGJ1aWx0IGNvbmZpZyBpc1xuICAgICAgLy8gbGVnaXRpbWF0ZWx5IGFic2VudCBhbmQgbXVzdCBub3QgYWJvcnQgdGhlIHJ1bi5cbiAgICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGVwbG95Q29uZmlnUGF0aCkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGAke2RlcGxveUNvbmZpZ1BhdGh9IG5vdCBmb3VuZDsgdGhlIHZpbmV4dCBidWlsZCBkaWQgbm90IHByb2R1Y2UgYSBkZXBsb3kgY29uZmlnLmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgLy8gV3JhbmdsZXIgdmFsaWRhdGVzIGl0cyBjb25maWcgc2NoZW1hIG9ubHkgd2hlbiBpdCBydW5zLCBzbyBhIGRyeSBydW4gb2YgdGhlIGJ1aWx0XG4gICAgICAvLyBjb25maWcgc3VyZmFjZXMgY29uZmlnIGFuZCBidW5kbGUgZXJyb3JzIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnMgYmVsb3cgbXV0YXRlXG4gICAgICAvLyB0aGUgZGF0YWJhc2UsIG1pcnJvcmluZyB0aGUgcGxhaW4tV29ya2VyIGRyeSBydW4uIE5vIC0tZW52OiB0aGUgYnVpbHQgY29uZmlnIGFscmVhZHlcbiAgICAgIC8vIGhhcyB0aGUgZW52aXJvbm1lbnQgYXBwbGllZC5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgYFlBUk4gd3JhbmdsZXIgZGVwbG95IC0tZHJ5LXJ1biAtLWNvbmZpZyAke3NoZWxsRXNjYXBlQXJndW1lbnQoZGVwbG95Q29uZmlnUGF0aCl9YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGxhaW4gV29ya2VycyBhcmUgZmlyc3QgY29tcGlsZWQgYnkgd3JhbmdsZXIgZHVyaW5nIHRoZSBkZXBsb3kgaXRzZWxmOyBhIGRyeSBydW5cbiAgICAgIC8vIHN1cmZhY2VzIGNvbXBpbGUgZXJyb3JzIChlLmcuIGEgbWlzc2luZyBlbnRyeSBwb2ludCkgQkVGT1JFIHRoZSByZW1vdGUgbWlncmF0aW9uc1xuICAgICAgLy8gYmVsb3cgbXV0YXRlIHRoZSBkYXRhYmFzZS5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgYFlBUk4gd3JhbmdsZXIgZGVwbG95IC0tZHJ5LXJ1biAtLWNvbmZpZyAke3NoZWxsRXNjYXBlQXJndW1lbnQod3JhbmdsZXJDb25maWdQYXRoKX0ke3Jlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gYCAtLWVudiAke3NoZWxsRXNjYXBlQXJndW1lbnQoZW52TmFtZSl9YCA6ICcnfWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gQXBwbHkgRDEgbWlncmF0aW9ucyB0byB0aGUgcmVtb3RlIGRhdGFiYXNlIHdpdGggdGhlIHByb2plY3QncyBzaW5nbGUgbWlncmF0aW9uXG4gICAgLy8gICAgbWVjaGFuaXNtICh3cmFuZ2xlci1uYXRpdmUgd2hlbiBhIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGV4aXN0cywgZWxzZSBkcml6emxlLWtpdCB3aGVuXG4gICAgLy8gICAgdGhlIGRyaXp6bGUgY29uZmlnIHRhcmdldHMgc3FsaXRlL2QxLWh0dHAvZHVyYWJsZS1zcWxpdGUpLiBNaWdyYXRpb25zIG11c3QgYmUgYmFja3dhcmRcbiAgICAvLyAgICBjb21wYXRpYmxlOiB0aGUgb2xkIFdvcmtlciBzZXJ2ZXNcbiAgICAvLyAgICB0cmFmZmljIHVudGlsIHRoZSBkZXBsb3kgYmVsb3cuXG4gICAgY29uc3QgZW52T3B0aW9uID0gcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBgIC0tZW52ICR7c2hlbGxFc2NhcGVBcmd1bWVudChlbnZOYW1lKX1gIDogJyc7XG4gICAgZm9yIChjb25zdCBkYXRhYmFzZSBvZiB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKSB7XG4gICAgICBjb25zdCBkYXRhYmFzZU5hbWUgPSBkYXRhYmFzZS5kYXRhYmFzZV9uYW1lID8/IGRhdGFiYXNlLmJpbmRpbmc7XG4gICAgICBpZiAoIWRhdGFiYXNlTmFtZSkgY29udGludWU7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBDST10cnVlIFlBUk4gd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseSAke3NoZWxsRXNjYXBlQXJndW1lbnQoZGF0YWJhc2VOYW1lKX0gLS1yZW1vdGUgLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtlbnZPcHRpb259YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRyaXp6bGVEMURhdGFiYXNlKSB7XG4gICAgICBpZiAoIWRyaXp6bGVEMURhdGFiYXNlLmRhdGFiYXNlX2lkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBUaGUgJHtlbnZOYW1lfSBEMSBiaW5kaW5nIGhhcyBubyBkYXRhYmFzZV9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFhY2NvdW50SWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAnQ0xPVURGTEFSRV9BQ0NPVU5UX0lEIChvciBhY2NvdW50X2lkIGluIHRoZSB3cmFuZ2xlciBjb25maWcpIGlzIHJlcXVpcmVkIGZvciByZW1vdGUgZHJpenpsZS1raXQgbWlncmF0aW9ucy4nXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAnbWlncmF0ZScsXG4gICAgICAgICAgYENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ9JHtkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZH0gQ0xPVURGTEFSRV9BQ0NPVU5UX0lEPSR7YWNjb3VudElkfWBcbiAgICAgICAgKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA0LiBEZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5IChubyBwb3N0LWRlcGxveSBzZWNyZXQgcHVzaCB0aGF0IGNvdWxkIGxlYXZlIHRoZVxuICAgIC8vICAgIG5ldyB2ZXJzaW9uIHJ1bm5pbmcgd2l0aG91dCDigJQgb3Igd2l0aCBzdGFsZSDigJQgc2VjcmV0cykuIFRoZSBzZWNyZXRzIEpTT04gZ29lcyB0aHJvdWdoXG4gICAgLy8gICAgYSBtb2RlLTA2MDAgZmlsZSBpbiBhIHByaXZhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBkZWxldGVkIHJpZ2h0IGFmdGVyIHRoZSBkZXBsb3k6XG4gICAgLy8gICAgL2Rldi9zdGRpbiBpcyBOT1QgcmVsaWFibGUgaGVyZSBiZWNhdXNlIHdyYW5nbGVyIHJlYWRzIHRoZSBzZWNyZXRzIGZpbGUgb25seSBhZnRlclxuICAgIC8vICAgIHVwbG9hZGluZyBhc3NldHMsIGJ5IHdoaWNoIHBvaW50IHRoZSBwaXBlZCBzdGRpbiBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY29uc3VtZWQg4oCUXG4gICAgLy8gICAgb2JzZXJ2ZWQgYXMgYSBmbGFreSBgQ291bGQgbm90IHJlYWQgZmlsZTogL2Rldi9zdGRpbmAgb24gQ0kuIEV4cGxpY2l0bHkgZW1wdHkgdmFsdWVzXG4gICAgLy8gICAgc3RheSBpbiB0aGUgcGF5bG9hZDogLS1zZWNyZXRzLWZpbGUgaXMgYWRkaXRpdmUsIHNvIHB1c2hpbmcgJycgaXMgdGhlIG9ubHkgd2F5IHRvXG4gICAgLy8gICAgY2xlYXIgYSBzdGFsZSBzZWNyZXQuXG4gICAgY29uc3QgZGVwbG95QXJncyA9IFtcbiAgICAgICdkZXBsb3knLFxuICAgICAgJy0tY29uZmlnJyxcbiAgICAgIGRlcGxveUNvbmZpZ1BhdGgsXG4gICAgICAvLyB2aW5leHQncyBidWlsdCBjb25maWcgYWxyZWFkeSBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQ7IHBhc3NpbmcgLS1lbnYgdGhlcmUgd291bGRcbiAgICAgIC8vIGFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXggdHdpY2UuXG4gICAgICAuLi4oIWlzVmluZXh0ICYmIHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gWyctLWVudicsIGVudk5hbWVdIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuZW52LldCX1ZFUlNJT04gPyBbJy0tdmFyJywgYFdCX1ZFUlNJT046JHtwcm9qZWN0LmVudi5XQl9WRVJTSU9OfWBdIDogW10pLFxuICAgICAgJy0tc2VjcmV0cy1maWxlJyxcbiAgICBdO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2RlcGxveUFyZ3Muam9pbignICcpfSA8dGVtcG9yYXJ5IHNlY3JldHMgZmlsZT5gKSk7XG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgcHJlcGFyZUxvY2FsQmluUGF0aChwcm9qZWN0KTtcbiAgICAgIGNvbnN0IGRlcGxveUVudiA9IHsgLi4ucHJvamVjdC5lbnYgfTtcbiAgICAgIGRlbGV0ZSBkZXBsb3lFbnYuQ0xPVURGTEFSRV9FTlY7XG4gICAgICAvLyAwbzcwMCBkaXJlY3RvcnkgKyAwbzYwMCBmaWxlOiByZWFkYWJsZSBvbmx5IGJ5IHRoZSBkZXBsb3lpbmcgdXNlciwgbGlrZSB0aGUgZG90ZW52XG4gICAgICAvLyBmaWxlcyB0aGUgQ0kgd29ya2Zsb3cgYWxyZWFkeSB3cml0ZXMgbmV4dCB0byBpdC4gd3JhbmdsZXIgcnVucyB0aHJvdWdoIGFuIGFzeW5jIHNwYXduXG4gICAgICAvLyAoc3Bhd25TeW5jIHdvdWxkIGJsb2NrIHRoZSBldmVudCBsb29wLCBzbyBhIHNodXRkb3duIHNpZ25hbCB3b3VsZCBraWxsIHRoZSBwcm9jZXNzXG4gICAgICAvLyBiZWZvcmUgYW55IGNsZWFudXApIGFuZCB0aGUgZGlyZWN0b3J5IGlzIHJlbW92ZWQgaW4gYSBmaW5hbGx5LCBzbyBhbiBpbnRlcnJ1cHRlZFxuICAgICAgLy8gZGVwbG95IGNhbm5vdCBsZWF2ZSB0aGUgcGxhaW50ZXh0IHNlY3JldHMgYmVoaW5kLiBTaHV0ZG93biBoYW5kbGluZyBkZXRhaWxzOlxuICAgICAgLy8gLSBIYW5kbGVycyAoaW5jbHVkaW5nIFNJR0hVUCwgb24gd2hpY2ggTm9kZSBhbHNvIHRlcm1pbmF0ZXMgYnkgZGVmYXVsdCkgYXJlIGluc3RhbGxlZFxuICAgICAgLy8gICBCRUZPUkUgdGhlIGZpbGUgaXMgd3JpdHRlbiBhbmQgdXNlIHByb2Nlc3Mub24sIG5vdCBvbmNlLCBzbyBhIHJlcGVhdGVkIHNpZ25hbCBjYW5ub3RcbiAgICAgIC8vICAgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdGVybWluYXRpb24gYW5kIGJ5cGFzcyB0aGUgZmluYWxseSBjbGVhbnVwLlxuICAgICAgLy8gLSBTSUdIVVAvU0lHUVVJVCBhcmUgZm9yd2FyZGVkIHRvIHdyYW5nbGVyIGFzIFNJR1RFUk06IHdyYW5nbGVyJ3MgbGF1bmNoZXIgcmVsYXlzIG9ubHlcbiAgICAgIC8vICAgU0lHSU5UL1NJR1RFUk0gdG8gaXRzIGlubmVyIE5vZGUgcHJvY2VzcywgYW5kIGFueXRoaW5nIGVsc2Ugd291bGQgb3JwaGFuIGEgZGVwbG95bWVudFxuICAgICAgLy8gICB0aGF0IGtlZXBzIG11dGF0aW5nIHRoZSByZW1vdGUgV29ya2VyIGFmdGVyIHdiIGV4aXRzLlxuICAgICAgLy8gLSBUaGUgcmUtcmFpc2UgYmVsb3cgdXNlcyB0aGUgc2lnbmFsIHdiIGl0c2VsZiByZWNlaXZlZDogd3JhbmdsZXIgY2F0Y2hlcyBTSUdJTlQgYW5kXG4gICAgICAvLyAgIGV4aXRzIG51bWVyaWNhbGx5IChlLmcuIDE0MyksIHdoaWNoIG11c3Qgbm90IG1hc3F1ZXJhZGUgYXMgYW4gb3JkaW5hcnkgZmFpbHVyZS5cbiAgICAgIGNvbnN0IHNlY3JldHNEaXJQYXRoID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnd2ItZGVwbG95LScpKTtcbiAgICAgIGNvbnN0IHNodXRkb3duU2lnbmFscyA9IFsnU0lHSFVQJywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSBhcyBjb25zdDtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGxldCB3cmFuZ2xlclByb2Nlc3M6IFJldHVyblR5cGU8dHlwZW9mIHNwYXduPiB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCByZWNlaXZlZFNodXRkb3duU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNodXRkb3duU2lnbmFscykge1xuICAgICAgICBjb25zdCBzaWduYWxIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHJlY2VpdmVkU2h1dGRvd25TaWduYWwgPz89IHNpZ25hbDtcbiAgICAgICAgICBpZiAod3JhbmdsZXJQcm9jZXNzKSB7XG4gICAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mua2lsbChzaWduYWwgPT09ICdTSUdJTlQnIHx8IHNpZ25hbCA9PT0gJ1NJR1RFUk0nID8gc2lnbmFsIDogJ1NJR1RFUk0nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mub2ZmKHNodXRkb3duU2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgLy8gV2l0aCB0aGUgaGFuZGxlcnMgcmVtb3ZlZCwgcmUtcmFpc2luZyB0cmlnZ2VycyB0aGUgZGVmYXVsdCBiZWhhdmlvci5cbiAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgICB9XG4gICAgICBsZXQgZGVwbG95U3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZWNyZXRzRmlsZVBhdGggPSBwYXRoLmpvaW4oc2VjcmV0c0RpclBhdGgsICdzZWNyZXRzLmpzb24nKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhzZWNyZXRzRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNlY3JldHMpLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgICAgICBkZXBsb3lTdGF0dXMgPSBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgd3JhbmdsZXJQcm9jZXNzID0gc3Bhd24oJ3dyYW5nbGVyJywgWy4uLmRlcGxveUFyZ3MsIHNlY3JldHNGaWxlUGF0aF0sIHtcbiAgICAgICAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICAgICAgZW52OiBkZXBsb3lFbnYgYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J10sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZXNvbHZlKDEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc2lnbmFsID8gMSA6IChjb2RlID8/IHVuZGVmaW5lZCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIHByb2Nlc3MuZXhpdCBza2lwcyBmaW5hbGx5IGJsb2Nrcywgc28gdGhlIGV4aXQtb24tZmFpbHVyZSBiZWxvdyBzdGF5cyBvdXRzaWRlLlxuICAgICAgICBmb3IgKGNvbnN0IFtzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKHNlY3JldHNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBpZiAocmVjZWl2ZWRTaHV0ZG93blNpZ25hbCkge1xuICAgICAgICAvLyBSZS1yYWlzZSBzbyB0aGUgY2FsbGVyIG9ic2VydmVzIHRoZSBzYW1lIHNpZ25hbC1kZXJpdmVkIGV4aXQgc3RhdHVzLlxuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHJlY2VpdmVkU2h1dGRvd25TaWduYWwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGVwbG95U3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGB3cmFuZ2xlciBkZXBsb3kgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7ZGVwbG95U3RhdHVzID8/ICd1bmtub3duJ30uYCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoZGVwbG95U3RhdHVzID8/IDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIE9wdGlvbmFsIHBvc3QtZGVwbG95IGhvb2sgKGUuZy4gc2VlZGluZyB0aGUgcmVtb3RlIEQxIHZpYSBkcml6emxlJ3MgZDEtaHR0cCBkcml2ZXIpLlxuICAgIC8vICAgIEFzc2lnbiB0aGUgcmVzb2x2ZWQgaWRzIHVuY29uZGl0aW9uYWxseTogYSBzdGFsZSBleHBvcnRlZCBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEXG4gICAgLy8gICAgbXVzdCBub3QgcmVkaXJlY3QgdGhlIGhvb2sgdG8gYW5vdGhlciBkYXRhYmFzZS5cbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RlcGxveS9wb3N0J10pIHtcbiAgICAgIC8vIFRoZSBpZCBpcyB1bmFtYmlndW91cyBvbmx5IHdpdGggYSBzaW5nbGUgRDEgYmluZGluZzsgd2l0aCBtdWx0aXBsZSwgdGhlIGhvb2sgbXVzdFxuICAgICAgLy8gcmVzb2x2ZSBpdHMgdGFyZ2V0IGl0c2VsZi4gQ2xlYXIgZmlyc3QgZWl0aGVyIHdheTogYSBzdGFsZSBpbmhlcml0ZWQgaWQgbXVzdCBub3RcbiAgICAgIC8vIHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgICBjb25zdCBob29rRDFEYXRhYmFzZTogV3JhbmdsZXJEMURhdGFiYXNlIHwgdW5kZWZpbmVkID1cbiAgICAgICAgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID09PSAxID8gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgICBkZWxldGUgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRDtcbiAgICAgIGlmIChyZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coJ011bHRpcGxlIEQxIGJpbmRpbmdzIGV4aXN0OyBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEIGlzIG5vdCBzZXQgZm9yIGRlcGxveS9wb3N0LicpKTtcbiAgICAgIH1cbiAgICAgIGlmIChob29rRDFEYXRhYmFzZT8uZGF0YWJhc2VfaWQpIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgPSBob29rRDFEYXRhYmFzZS5kYXRhYmFzZV9pZDtcbiAgICAgIGlmIChhY2NvdW50SWQpIHByb2plY3QuZW52LkNMT1VERkxBUkVfQUNDT1VOVF9JRCA9IGFjY291bnRJZDtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZGVwbG95L3Bvc3QnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIFJlYWQgdGhlIENsb3VkZmxhcmUgQVBJIHRva2VuIHRoYXQgQ0kgZHJvcHMgaW4gYSBgLmVudi5jbG91ZGZsYXJlYCBmaWxlIChlLmcuIHRoZSByZXVzYWJsZVxuICogZGVwbG95IHdvcmtmbG93J3MgYGZpbGVfcGF0aF8xYCksIGxvb2tpbmcgYmVzaWRlIHRoZSBXb3JrZXIncyB3cmFuZ2xlciBjb25maWcgYW5kIGF0IHRoZVxuICogbW9ub3JlcG8gcm9vdCDigJQgYGZpbGVfcGF0aF8xYCBpcyByZXBvLXJlbGF0aXZlLCBzbyBib3RoIHNwZWxsaW5ncyBvY2N1ciBpbiBwcmFjdGljZS5cbiAqIE5lYXJlciBmaWxlcyB3aW4sIG1pcnJvcmluZyB0aGUgYC5lbnZgIGNhc2NhZGU6IGEgd29ya3NwYWNlIG1heSBvdmVycmlkZSB0aGUgcm9vdCB0b2tlbixcbiAqIG5ldmVyIHRoZSByZXZlcnNlLiBQYXNzIGByb290RGlyUGF0aGAgYXMgdW5kZWZpbmVkIHRvIHJlYWQgdGhlIHdvcmtzcGFjZSBhbG9uZSwgc28gdGhhdFxuICogYC0taW5jbHVkZS1yb290LWVudj1mYWxzZWAgaXNvbGF0ZXMgdGhpcyBmaWxlIGZyb20gdGhlIHJvb3QganVzdCBhcyBpdCBkb2VzIHRoZSBjYXNjYWRlLlxuICogYENMT1VERkxBUkVfRU5WYCBpcyBkcm9wcGVkOyBpdCB3b3VsZCBkb3VibGUtYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDbG91ZGZsYXJlRW52RmlsZXMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBjdXJyZW50RGlyUGF0aCBvZiBuZXcgU2V0KHJvb3REaXJQYXRoID8gW2RpclBhdGgsIHJvb3REaXJQYXRoXSA6IFtkaXJQYXRoXSkpIHtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJy5lbnYuY2xvdWRmbGFyZScpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjbG91ZGZsYXJlRW52UGF0aCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IGNsb3VkZmxhcmVFbnZQYXRoLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdDTE9VREZMQVJFX0VOVicpIGNvbnRpbnVlO1xuICAgICAgZW52VmFyc1trZXldID8/PSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogU2VsZWN0IHRoZSBzZWNyZXRzIHRvIHB1c2ggdG8gdGhlIFdvcmtlciBmcm9tIHRoZSBkb3RlbnYtbG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIGV2ZXJ5IGV4cGxpY2l0bHkgc2V0IHZhbHVlIOKAlCBpbmNsdWRpbmcgZW1wdHkgc3RyaW5ncywgd2hpY2ggY2xlYXIgc3RhbGUgcmVtb3RlIHNlY3JldHNcbiAqIHNpbmNlIGB3cmFuZ2xlciBkZXBsb3kgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlIOKAlCBleGNlcHQgd3JhbmdsZXIgYHZhcnNgIChhIHNlY3JldCBtYXlcbiAqIG5vdCBzaGFyZSBhIG5hbWUgd2l0aCBhIHZhciksIGRlcGxveS1jb250cm9sIGtleXMsIGFuZCBsb2NhbCBgZmlsZTpgIERBVEFCQVNFX1VSTHMuXG4gKiBSZXR1cm5zIHRoZSByZXF1aXJlZCBrZXlzIChmcm9tIC5lbnYuZXhhbXBsZSkgdGhhdCBhcmUgc3RpbGwgZW1wdHkgc28gdGhlIGRlcGxveSBjYW5cbiAqIGFib3J0IGJlZm9yZSBhbnkgcmVtb3RlIG11dGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0V29ya2VyU2VjcmV0cyhcbiAgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgY29uZmlnVmFyS2V5czogc3RyaW5nW10sXG4gIHJlcXVpcmVkS2V5czogc3RyaW5nW11cbik6IHsgbWlzc2luZ0tleXM6IHN0cmluZ1tdOyBzZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0ge1xuICBjb25zdCBjb25maWdLZXlzID0gbmV3IFNldChjb25maWdWYXJLZXlzKTtcbiAgY29uc3Qgc2VjcmV0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAvLyBObyBydW50aW1lIHVuZGVmaW5lZCBjaGVjayBvbiBgdmFsdWVgOiBlbnZWYXJzIGlzIGJ1aWx0IGV4Y2x1c2l2ZWx5IGZyb20gZG90ZW52LXBhcnNlZFxuICAvLyBzdHJpbmdzLCBhbmQgZXZlcnkgY2FsbGVyLXNpZGUgbWVyZ2UgZWl0aGVyIGNvYWxlc2NlcyB3aXRoIGA/PyAnJ2Agb3IgZ3VhcmRzIGFnYWluc3RcbiAgLy8gdW5kZWZpbmVkIGJlZm9yZSBhc3NpZ25pbmcsIHNvIHRoZSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHR5cGUgaG9sZHMgYXQgcnVudGltZSB0b28uXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKGNvbmZpZ0tleXMuaGFzKGtleSkgfHwgaXNOb25TZWNyZXRLZXkoa2V5KSkgY29udGludWU7XG4gICAgaWYgKGtleSA9PT0gJ0RBVEFCQVNFX1VSTCcgJiYgdmFsdWUuc3RhcnRzV2l0aCgnZmlsZTonKSkgY29udGludWU7XG4gICAgc2VjcmV0c1trZXldID0gdmFsdWU7XG4gIH1cbiAgY29uc3QgbWlzc2luZ0tleXMgPSByZXF1aXJlZEtleXMuZmlsdGVyKChrZXkpID0+ICFjb25maWdLZXlzLmhhcyhrZXkpICYmICFpc05vblNlY3JldEtleShrZXkpICYmICFlbnZWYXJzW2tleV0pO1xuICByZXR1cm4geyBtaXNzaW5nS2V5cywgc2VjcmV0cyB9O1xufVxuXG4vKipcbiAqIExpc3QgdGhlIHNlY3JldCBuYW1lcyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gdGhlIGRlcGxveSB0YXJnZXQgV29ya2VyLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuXG4gKiB0aGUgbGlzdGluZyBmYWlscyBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIHRoZSBXb3JrZXIgbm90IGV4aXN0aW5nIHlldCAoZmlyc3QgZGVwbG95KSwgc29cbiAqIHRoZSBjYWxsZXIgY2FuIGRlZ3JhZGUgdG8gdGhlIGxvY2FsLW9ubHkgbGltaXQgY2hlY2tzIGluc3RlYWQgb2YgYmxvY2tpbmcgYSBkZXBsb3kgdGhhdFxuICogd3JhbmdsZXIgaXRzZWxmIG1pZ2h0IGFjY2VwdC4gRmFpbGluZyBjbG9zZWQgaW5zdGVhZCB3b3VsZCB0dXJuIGV2ZXJ5IHRyYW5zaWVudCBsaXN0aW5nXG4gKiBmYWlsdXJlIChuZXR3b3JrLCBhIHRva2VuIHdpdGhvdXQgc2VjcmV0LXJlYWQgcGVybWlzc2lvbikgaW50byBhIGRlcGxveSBibG9ja2VyLCBhbmQg4oCUIHNpbmNlXG4gKiB3cmFuZ2xlciA0LnggcmVwb3J0cyBhIG1pc3NpbmcgV29ya2VyIG9ubHkgdmlhIGFuIGVycm9yLW1lc3NhZ2UgaGludCDigJQgYW55IHVucmVjb2duaXplZFxuICogbm90LWZvdW5kIHNoYXBlIHdvdWxkIHRoZW4gYmxvY2sgZmlyc3QgZGVwbG95cyBlbnRpcmVseTsgdGhpcyBwcmVmbGlnaHQgbXVzdCBvbmx5IGV2ZXIgYWRkXG4gKiBmYWlsdXJlcyB0aGF0IHdyYW5nbGVyIGl0c2VsZiB3b3VsZCByYWlzZSBhZnRlciB0aGUgbWlncmF0aW9ucy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdFJlbW90ZVdvcmtlclNlY3JldE5hbWVzKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBEZXBsb3lDb21tYW5kQXJndixcbiAgd3JhbmdsZXJDb25maWdQYXRoOiBzdHJpbmcsXG4gIHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnLFxuICBlbnZOYW1lOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10gfCB1bmRlZmluZWQ+IHtcbiAgcHJlcGFyZUxvY2FsQmluUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgbGlzdEFyZ3MgPSBbXG4gICAgJ3NlY3JldCcsXG4gICAgJ2xpc3QnLFxuICAgICctLWZvcm1hdCcsXG4gICAgJ2pzb24nLFxuICAgICctLWNvbmZpZycsXG4gICAgd3JhbmdsZXJDb25maWdQYXRoLFxuICAgIC4uLihyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IFsnLS1lbnYnLCBlbnZOYW1lXSA6IFtdKSxcbiAgXTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFJ1bm5pbmc6IHdyYW5nbGVyICR7bGlzdEFyZ3Muam9pbignICcpfWApKTtcbiAgbGV0IHJldDtcbiAgdHJ5IHtcbiAgICByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKCd3cmFuZ2xlcicsIGxpc3RBcmdzLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYgYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgIGBGYWlsZWQgdG8gcnVuIHdyYW5nbGVyIHRvIGxpc3QgcmVtb3RlIHNlY3JldHM7IGNoZWNraW5nIG9ubHkgdGhlIGxvY2FsIHBheWxvYWQgYWdhaW5zdCBDbG91ZGZsYXJlJ3MgbGltaXRzLlxcbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHJldC5zdGF0dXMgPT09IDApIHtcbiAgICAvLyBDdXQgdGhlIEpTT04gYXJyYXkgb3V0IG9mIHRoZSBzdXJyb3VuZGluZyBvdXRwdXQ6IHdyYW5nbGVyIG1heSBwcmludCBpdHMgYmFubmVyIGFuZFxuICAgIC8vIFwiTXVsdGlwbGUgZW52aXJvbm1lbnRzXCIgd2FybmluZ3MgYXJvdW5kIHRoZSBwYXlsb2FkLlxuICAgIGNvbnN0IGpzb25TdGFydCA9IHJldC5zdGRvdXQuaW5kZXhPZignWycpO1xuICAgIGNvbnN0IGpzb25FbmQgPSByZXQuc3Rkb3V0Lmxhc3RJbmRleE9mKCddJyk7XG4gICAgaWYgKGpzb25TdGFydCAhPT0gLTEgJiYganNvbkVuZCAhPT0gLTEgJiYganNvblN0YXJ0IDwganNvbkVuZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyZXQuc3Rkb3V0LnNsaWNlKGpzb25TdGFydCwganNvbkVuZCArIDEpKSBhcyB7IG5hbWU/OiB1bmtub3duIH1bXTtcbiAgICAgICAgcmV0dXJuIHBhcnNlZC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKS5maWx0ZXIoKG5hbWUpOiBuYW1lIGlzIHN0cmluZyA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byB0aGUgd2FybmluZyBiZWxvdy5cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoL1xcW2NvZGU6IDEwMCgwN3w5MClcXF18SWYgdGhpcyBpcyBhIG5ldyBXb3JrZXIvLnRlc3QocmV0LnN0ZG91dCArIHJldC5zdGRlcnIpKSB7XG4gICAgLy8gVGhlIFdvcmtlciBkb2VzIG5vdCBleGlzdCB5ZXQsIHNvIGEgZmlyc3QgZGVwbG95IGluaGVyaXRzIG5vdGhpbmcuIFdyYW5nbGVyIDQueCBjYXRjaGVzXG4gICAgLy8gdGhlIENsb3VkZmxhcmUgQVBJIGVycm9ycyAxMDAwNyAod29ya2Vycy5hcGkuZXJyb3Iuc2VydmljZV9ub3RfZm91bmQpIGFuZCAxMDA5MFxuICAgIC8vICh3b3JrZXJzLmFwaS5lcnJvci5zY3JpcHRfbm90X2ZvdW5kKSBhbmQgcmV0aHJvd3MgdGhlbSBhcyBhIFVzZXJFcnJvciBjb250YWluaW5nIHRoZVxuICAgIC8vICdJZiB0aGlzIGlzIGEgbmV3IFdvcmtlciwgcnVuIGB3cmFuZ2xlciBkZXBsb3lgIGZpcnN0JyBoaW50IHdpdGhvdXQgdGhlIG51bWVyaWMgY29kZSxcbiAgICAvLyBzbyBtYXRjaCBib3RoIHNoYXBlcy5cbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc29sZS53YXJuKFxuICAgIGNoYWxrLnllbGxvdyhcbiAgICAgIGBGYWlsZWQgdG8gbGlzdCB0aGUgcmVtb3RlIFdvcmtlciBzZWNyZXRzOyBjaGVja2luZyBvbmx5IHRoZSBsb2NhbCBwYXlsb2FkIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGxpbWl0cy5cXG4keyhyZXQuc3RkZXJyIHx8IHJldC5zdGRvdXQpLnRyaW0oKX1gXG4gICAgKVxuICApO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlbW90ZSBzZWNyZXRzIHRoYXQgc3RheSBhdHRhY2hlZCB0byB0aGUgbmV3IHZlcnNpb246IGB3cmFuZ2xlciBkZXBsb3kgLS1zZWNyZXRzLWZpbGVgIGlzXG4gKiBhZGRpdGl2ZSwgc28gZXZlcnkgcmVtb3RlIHNlY3JldCB0aGUgb3V0Z29pbmcgcGF5bG9hZCBkb2VzIG5vdCBvdmVyd3JpdGUga2VlcHMgY291bnRpbmdcbiAqIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIHZhcmlhYmxlK3NlY3JldCBsaW1pdCDigJQgZXhjZXB0IG5hbWVzIHRoYXQgYW4gZWZmZWN0aXZlIHZhciBvclxuICogYmluZGluZyByZXBsYWNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluaGVyaXRlZFJlbW90ZVNlY3JldE5hbWVzKFxuICByZW1vdGVTZWNyZXROYW1lczogc3RyaW5nW10sXG4gIG91dGdvaW5nU2VjcmV0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgZWZmZWN0aXZlVmFyS2V5czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGJpbmRpbmdOYW1lczogcmVhZG9ubHkgc3RyaW5nW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVwbGFjZWROYW1lcyA9IG5ldyBTZXQoWy4uLmVmZmVjdGl2ZVZhcktleXMsIC4uLmJpbmRpbmdOYW1lc10pO1xuICByZXR1cm4gcmVtb3RlU2VjcmV0TmFtZXMuZmlsdGVyKChuYW1lKSA9PiAhT2JqZWN0Lmhhc093bihvdXRnb2luZ1NlY3JldHMsIG5hbWUpICYmICFyZXBsYWNlZE5hbWVzLmhhcyhuYW1lKSk7XG59XG5cbi8qKlxuICogUmVhZGluZyBiaW5FeGlzdHMgcHJlcGVuZHMgbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8gcHJvamVjdC5lbnYuUEFUSCxcbiAqIHNvIHRoZSBkaXJlY3QgKG5vbi1zaGVsbCkgd3JhbmdsZXIgc3Bhd25zIHJlc29sdmUgdGhlIGxvY2FsIGJpbmFyeS5cbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUxvY2FsQmluUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGlmICghcHJvamVjdC5iaW5FeGlzdHMpIHtcbiAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdub2RlX21vZHVsZXMvLmJpbiBub3QgZm91bmQ7IHJlbHlpbmcgb24gUEFUSCB0byByZXNvbHZlIHdyYW5nbGVyLicpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcywgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuaW50ZXJmYWNlIFBhcnNlZERvdGVudkFyZ3Mge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbn1cblxuY29uc3Qgc2h1dGRvd25TaWduYWxzID0gbmV3IFNldDxOb2RlSlMuU2lnbmFscz4oWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pO1xuXG5leHBvcnQgY29uc3QgZG90ZW52Q29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ2RvdGVudiBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnTG9hZCAuZW52IGZpbGVzIGFuZCBydW4gYSBjb21tYW5kLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT4geWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgcnVuUGFyc2VkRG90ZW52Q29tbWFuZChnZXRQYXJzZWREb3RlbnZBcmdzRnJvbVlhcmdzKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Eb3RlbnZDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1blBhcnNlZERvdGVudkNvbW1hbmQocGFyc2VEb3RlbnZBcmdzKGFyZ3MpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFyc2VkRG90ZW52Q29tbWFuZCh7IGNvbW1hbmQgfTogUGFyc2VkRG90ZW52QXJncyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY29tbWFuZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdVc2FnZTogd2IgZG90ZW52IC0tIDxjb21tYW5kPiBbYXJncy4uLl0nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBjd2QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSk7XG4gIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCk7XG4gIGNvbnN0IGJlcnJ5QmluRm9sZGVyUGF0aCA9IHByb2Nlc3MuZW52LkJFUlJZX0JJTl9GT0xERVI7XG4gIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIC8vIFN0cmlwcGluZyB5YXJuJ3MgZW52aXJvbm1lbnQgYWxzbyByZW1vdmVzIGl0cyB0ZW1wb3JhcnkgYmluIGZvbGRlciDigJQgdGhlIE9OTFkgcGxhY2VcbiAgLy8geWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMg4oCUIHNvIHJlc3RvcmUgdGhlIHByb2plY3QncyBvd25cbiAgLy8gbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8ga2VlcCBiYXJlIGJpbmFyeSBuYW1lcyByZXNvbHZhYmxlLiBQbHVnJ24nUGxheSBpbnN0YWxsc1xuICAvLyBjcmVhdGUgbm8gbm9kZV9tb2R1bGVzIGF0IGFsbDsgdGhlIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGlzIHRoZW4gdGhlIHNvbGUgc291cmNlIG9mXG4gIC8vIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMsIHNvIHJlc3RvcmUgaXQgaW5zdGVhZC5cbiAgLy8gVGhlIHRlbXBvcmFyeSBmb2xkZXIgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZXN0b3JlZCB3aGVuIC5iaW4gZGlyZWN0b3JpZXMgZXhpc3Q6IGl0IGFsc29cbiAgLy8gY29udGFpbnMgbm9kZS95YXJuIHNoaW1zLCBhbmQgYSBsZWFrZWQgbm9kZSBzaGltIHdvdWxkIHZpb2xhdGUgd2IncyByZWFsLU5vZGUgZ3VhcmFudGVlXG4gIC8vIGZvciB0b29scyBsaWtlIHdyYW5nbGVyL3ZpbmV4dC4gQ2hpbGQgYHlhcm5gIGludm9jYXRpb25zIHN0YXkgcmVzb2x2YWJsZSB0aHJvdWdoIHRoZVxuICAvLyBsYXVuY2hlciBvbiB0aGUgYmFzZSBQQVRIIChtaXNlL2NvcmVwYWNrKSwgd2hpY2ggZXZlcnkgc3VwcG9ydGVkIGVudmlyb25tZW50IGhhcyDigJRcbiAgLy8gbm90aGluZyBjb3VsZCBoYXZlIHN0YXJ0ZWQgYHlhcm4gcnVuYC9gd2IgZG90ZW52YCB3aXRob3V0IGl0LlxuICBpZiAoIXByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChjd2QsIHByb2Nlc3MuZW52KSAmJiBiZXJyeUJpbkZvbGRlclBhdGgpIHtcbiAgICBwcm9jZXNzLmVudi5QQVRIID0gcHJvY2Vzcy5lbnYuUEFUSCA/IGAke2JlcnJ5QmluRm9sZGVyUGF0aH06JHtwcm9jZXNzLmVudi5QQVRIfWAgOiBiZXJyeUJpbkZvbGRlclBhdGg7XG4gIH1cblxuICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgY3dkLFxuICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2h1dGRvd25TaWduYWxzKSB7XG4gICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNoaWxkLmtpbGwoc2lnbmFsKTtcbiAgICB9O1xuICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgIHByb2Nlc3Mub25jZShzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICB9XG4gIGNoaWxkLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgIH1cbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAvLyBSZS1yYWlzZSBldmVuIGZvciBmb3J3YXJkZWQgc2h1dGRvd24gc2lnbmFscyBzbyBjYWxsZXJzIG9ic2VydmUgdGhlIGNvbnZlbnRpb25hbFxuICAgICAgLy8gc2lnbmFsIGV4aXQgc3RhdHVzIChlLmcuIDEzMCBmb3IgU0lHSU5UKSBpbnN0ZWFkIG9mIGEgbWlzbGVhZGluZyBzdWNjZXNzLlxuICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoY29kZSA/PyAxKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFBhcnNlZERvdGVudkFyZ3NGcm9tWWFyZ3MoYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlKTogUGFyc2VkRG90ZW52QXJncyB7XG4gIHJldHVybiB7XG4gICAgY29tbWFuZDogW1xuICAgICAgLi4uKChhcmd2LmFyZ3MgYXMgdW5rbm93bltdIHwgdW5kZWZpbmVkKSA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgICAuLi4oKGFyZ3ZbJy0tJ10gYXMgdW5rbm93bltdIHwgdW5kZWZpbmVkKSA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEb3RlbnZBcmdzKGFyZ3M6IHN0cmluZ1tdKTogUGFyc2VkRG90ZW52QXJncyB7XG4gIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gYXJncy5pbmRleE9mKCctLScpO1xuICByZXR1cm4geyBjb21tYW5kOiBzZXBhcmF0b3JJbmRleCA9PT0gLTEgPyBhcmdzIDogYXJncy5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpIH07XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhcmRXYkVudih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmaXhUYXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoXG4gICAgIXZhbHVlIHx8XG4gICAgWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddLmluY2x1ZGVzKHZhbHVlKSB8fFxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHxcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmVycm9yKFxuICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7dmFsdWV9XCIuIGAgK1xuICAgICAgYEZpeCAke2ZpeFRhcmdldH0sIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuLy8gTk9URTogYHdiIGRvdGVudmAgZGVsaWJlcmF0ZWx5IHNraXBzIFByb2plY3QuZW52J3MgZnVsbCB2YWxpZGF0aW9uOiBpdCBpcyBhIGdlbmVyaWMgcnVubmVyIGFsc29cbi8vIHVzZWQgYmVmb3JlIGVudiBzb3VyY2VzIGV4aXN0IChib290c3RyYXApIGFuZCBtdXN0IG5vdCBmYWlsIGZhc3QgZm9yIHJlcG9zaXRvcmllcyB0aGF0IGhhdmUgbm90XG4vLyBhZG9wdGVkIHRoZSBvcmcgZW52IHN0YW5kYXJkLiBBIE5PTi1FTVBUWSBXQl9FTlYgaXMgc3RpbGwgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHN0YW5kYXJkIG1vZGVzLFxuLy8gdGhvdWdoIOKAlCBhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmAgd291bGQgb3RoZXJ3aXNlIHNpbGVudGx5IHNlbGVjdCB0aGUgYmFzZSAoZGV2ZWxvcG1lbnQpIHZhbHVlcy5cbmZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG1vZGUgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gIGNvbnN0IHJlYWRFbnZGaWxlID0gKGZpbGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+XG4gICAgY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKGN3ZCwgZmlsZU5hbWUpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAvLyBNb2RlLXNwZWNpZmljIHNvdXJjZXMgZHJpdmUgdGhlIGZvcmNlZC1tb2RlIG92ZXJyaWRlIGJlbG93LlxuICBjb25zdCBtb2RlVmFycyA9IG1vZGUgPyB7IC4uLnJlYWRFbnZGaWxlKGAuZW52LiR7bW9kZX1gKSwgLi4ucmVhZEVudkZpbGUoYC5lbnYuJHttb2RlfS5sb2NhbGApIH0gOiB7fTtcbiAgLy8gTWlycm9yIHRoZSBzaGFyZWQgY2FzY2FkZSdzIHByZWNlZGVuY2U6IC5lbnYuPG1vZGU+LmxvY2FsID4gLmVudi5sb2NhbCA+IC5lbnYuPG1vZGU+ID4gLmVudi5cbiAgY29uc3QgZG90ZW52VmFycyA9IHtcbiAgICAuLi5yZWFkRW52RmlsZSgnLmVudicpLFxuICAgIC4uLihtb2RlID8gcmVhZEVudkZpbGUoYC5lbnYuJHttb2RlfWApIDoge30pLFxuICAgIC4uLnJlYWRFbnZGaWxlKCcuZW52LmxvY2FsJyksXG4gICAgLi4uKG1vZGUgPyByZWFkRW52RmlsZShgLmVudi4ke21vZGV9LmxvY2FsYCkgOiB7fSksXG4gIH07XG4gIC8vIFdCX0VOViBpbiBwcm9jZXNzLmVudiBtZWFucyB0aGUgbW9kZSBpcyBleHBsaWNpdGx5IGZvcmNlZCwgc28gdmFsdWVzIGZyb20gdGhlIG1vZGUncyBvd25cbiAgLy8gc291cmNlcyAoLmVudi48bW9kZT5bLmxvY2FsXSBhbmQgdGhlIGZub3ggcHJvZmlsZSkgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZCBmcm9tIHRoZVxuICAvLyBwYXJlbnQgc2hlbGwg4oCUIGV4Y2VwdCBvbiBDSSwgd2hlcmUgaW5qZWN0ZWQgZW52IHZhcnMgbXVzdCBrZWVwIG92ZXJyaWRpbmcgY29tbWl0dGVkIGZpbGVzXG4gIC8vIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTMwKS5cbiAgY29uc3QgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ID0gISFtb2RlICYmICFpc0NJKHByb2Nlc3MuZW52LkNJKTtcbiAgLy8gZm5veC50b21sIGlzIHRoZSBjb21taXR0ZWQsIGVuY3J5cHRlZCBlcXVpdmFsZW50IG9mIC5lbnYgZmlsZXM7IGxvY2FsIC5lbnYgZmlsZXMgc3RpbGwgd2luIG92ZXIgaXQuXG4gIGNvbnN0IFtmbm94VmFyc10gPSByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgbW9kZSwgZG90ZW52VmFycywgeyBtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgfSk7XG4gIGNvbnN0IHBhcnNlZCA9IHsgLi4uZm5veFZhcnMsIC4uLmRvdGVudlZhcnMgfTtcbiAgLy8gRXhwYW5kICR7Li4ufSByZWZlcmVuY2VzIGFnYWluc3QgZXhwb3J0ZWQgdmFyaWFibGVzIHdob3NlIEZJTEUgdmFsdWUgbG9zZXMgdG8gdGhlIHNoZWxsXG4gIC8vIChtaXJyb3JpbmcgcmVhZEVudmlyb25tZW50VmFyaWFibGVzJyBlZmZlY3RpdmUtdmFsdWUgc2VtYW50aWNzKTogYSByZWZlcmVuY2UgbXVzdCByZXNvbHZlIHRvXG4gIC8vIHRoZSB2YWx1ZSB0aGUgY2hpbGQgd2lsbCBhY3R1YWxseSBzZWUsIHNvIGEgc2hlbGwtc2hhZG93ZWQga2V5IGV4cGFuZHMgdG8gdGhlIHNoZWxsIHZhbHVlXG4gIC8vIHdoaWxlIGEgd2lubmluZyBmaWxlL292ZXJyaWRlIHZhbHVlIGV4cGFuZHMgdG8gdGhlIGZpbGUgdmFsdWUuXG4gIGNvbnN0IGZpbGVWYWx1ZVdpbnMgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgIShrZXkgaW4gcHJvY2Vzcy5lbnYpIHx8IChtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgJiYgKGtleSBpbiBtb2RlVmFycyB8fCBrZXkgaW4gZm5veFZhcnMpKTtcbiAgY29uc3QgcmVmZXJlbmNlRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KSkge1xuICAgIC8vIEVzY2FwZSBkb2xsYXIgc2lnbnMgc28gZXhwb3J0ZWQgdmFsdWVzIHN1YnN0aXR1dGUgbGl0ZXJhbGx5IChwYSR3b3JkIHN0YXlzIHBhJHdvcmQpLlxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICEoa2V5IGluIHBhcnNlZCAmJiBmaWxlVmFsdWVXaW5zKGtleSkpKSB7XG4gICAgICByZWZlcmVuY2VFbnZba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoJyQnLCBTdHJpbmcucmF3YFxcJGApO1xuICAgIH1cbiAgfVxuICBjb25zdCBlbnZWYXJzID0gZXhwYW5kKHsgcGFyc2VkLCBwcm9jZXNzRW52OiByZWZlcmVuY2VFbnYgfSkucGFyc2VkID8/IHBhcnNlZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyByZXR1cm5zIGEgcHJvY2Vzcy5lbnYtc2hhZG93ZWQga2V5IG9ubHkgd2hlbiB0aGUgZm9yY2VkXG4gICAgLy8gcHJvZmlsZSBvdmVycmlkZXMgaXQsIHNvIGZub3gtcHJvdmlkZWQga2V5cyBjb3VudCBhcyBtb2RlLXNwZWNpZmljIGhlcmUuXG4gICAgaWYgKCEoa2V5IGluIG1vZGVWYXJzIHx8IGtleSBpbiBmbm94VmFycykgfHwgcHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIGNvbnRpbnVlO1xuXG4gICAgaWYgKG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0Vudikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgV2FybmluZzogJHtrZXl9IGluIHRoZSBcIiR7bW9kZX1cIiBtb2RlJ3MgZW52IHNvdXJjZXMgb3ZlcnJpZGVzIHRoZSB2YWx1ZSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IGVudmlyb25tZW50IGJlY2F1c2UgV0JfRU5WIGlzIGV4cGxpY2l0bHkgc2V0LmBcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIE9uIENJLCBpbmhlcml0ZWQgdmFyaWFibGVzIGludGVudGlvbmFsbHkgd2luICh3b3JrZmxvd3MgZGVsaWJlcmF0ZWx5IGluamVjdCBlbnYgdmFycyB0aGF0XG4gICAgLy8gb3ZlcnJpZGUgdGhlIGNvbW1pdHRlZCBmaWxlcyk7IHRoaXMgaXMgdGhlIGRlc2lnbmVkIGJlaGF2aW9yLCBzbyBubyB3YXJuaW5nIGlzIGVtaXR0ZWQuXG4gIH1cbiAgLy8gVmFsaWRhdGUgb25seSBBRlRFUiBhcHBseWluZyB0aGUgc291cmNlcywgc28gYSBXQl9TS0lQX0VOVl9DSEVDSyBkZWZpbmVkIGluIGFuIGVudiBGSUxFIGlzXG4gIC8vIGhvbm9yZWQ6IGJvdGggdGhlIGNhcHR1cmVkIGV4cG9ydGVkIG1vZGUgKGl0IHNlbGVjdGVkIHRoZSBjYXNjYWRlKSBhbmQgdGhlIEZJTkFMIHZhbHVlIHRoZVxuICAvLyBjaGlsZCB3aWxsIHNlZSDigJQgdGhlIGVudiBzb3VyY2VzIG1heSBkZWZpbmUgYSBicm9rZW4gV0JfRU5WIChlLmcuIGAuZW52YCB3aXRoXG4gIC8vIGBXQl9FTlY9cHJvZGN1dGlvbmApLCBhbmQgYSBmb3JjZWQgbW9kZSdzIGZpbGVzIG1heSBldmVuIG92ZXJyaWRlIGEgVkFMSUQgZXhwb3J0ZWQgdmFsdWUuXG4gIHZhbGlkYXRlU3RhbmRhcmRXYkVudihtb2RlLCAndGhlIGV4cG9ydGVkIHZhcmlhYmxlJyk7XG4gIHZhbGlkYXRlU3RhbmRhcmRXYkVudihwcm9jZXNzLmVudi5XQl9FTlYsICd0aGUgZW52IHNvdXJjZSBvciB0aGUgZXhwb3J0ZWQgdmFyaWFibGUnKTtcbiAgLy8gVGhlIGV4cG9ydGVkIG1vZGUgc2VsZWN0ZWQgdGhlIGNhc2NhZGUsIHNvIGEgbW9kZSBmaWxlIHNpbGVudGx5IHJlcGxhY2luZyBpdCB3aXRoIGEgRElGRkVSRU5UXG4gIC8vIHZhbGlkIG1vZGUgKGUuZy4gYC5lbnYucHJvZHVjdGlvbmAgY29udGFpbmluZyBgV0JfRU5WPWRldmVsb3BtZW50YCkgbXVzdCBiZSByZWplY3RlZCBhcyB3ZWxsLlxuICBpZiAoXG4gICAgbW9kZSAmJlxuICAgIHByb2Nlc3MuZW52LldCX0VOViAmJlxuICAgIHByb2Nlc3MuZW52LldCX0VOViAhPT0gbW9kZSAmJlxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLICE9PSAnMScgJiZcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyAhPT0gJ3RydWUnXG4gICkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgV0JfRU5WIHJlc29sdmVzIHRvIFwiJHtwcm9jZXNzLmVudi5XQl9FTlZ9XCIgYWx0aG91Z2ggdGhlIFwiJHttb2RlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgIGBGaXggdGhlIFdCX0VOViBkZWZpbmVkIGluIHRoZSBtb2RlJ3MgZW52IHNvdXJjZXMsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgRklMRV9TQ0hFTUEsIGdldEZpbGVEYXRhYmFzZVVybFBhdGggfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FID0gJ2xpdGVzdHJlYW0ueW1sJztcbmNvbnN0IERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBnZW5lcmF0ZShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gWydQUklTTUEgZ2VuZXJhdGUnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgbHMgLWFobCAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfSAmJiAke3RoaXMuZ2VuZXJhdGUocHJvamVjdCl9ICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nLCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnUGF0aCkgcmV0dXJuIGAtY29uZmlnIFwiJHtjb25maWdQYXRofVwiYDtcblxuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgUFJJU01BIGRiIGV4ZWN1dGUgLS1zdGRpbiAtLXVybCBcIiR7RklMRV9TQ0hFTUF9JHtkYlBhdGh9XCI7IGZpICYmIHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSpgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhd0RiUGF0aCA9IGdldEZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghcmF3RGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShyYXdEYlBhdGgpXG4gICAgPyByYXdEYlBhdGhcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIgPz8gJy4nLCByYXdEYlBhdGgpO1xuXG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERyaXp6bGVDb25maWcsIHdyYXBXaXRoRHJpenpsZUNvbmZpZ0RpciB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGdlbkNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZ2VuLWNvZGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIGNvZGUgZm9yIHRoZSBjdXJyZW50IHByb2plY3QnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbkNvZGVUYXJnZXRzID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAgIC5tYXAoKHByb2plY3QpID0+ICh7IHByb2plY3QsIHNjcmlwdHM6IGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3QpIH0pKVxuICAgICAgLmZpbHRlcigoeyBzY3JpcHRzIH0pID0+IHNjcmlwdHMubGVuZ3RoID4gMCk7XG4gICAgaWYgKGdlbkNvZGVUYXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdObyBjb2RlIGdlbmVyYXRpb24gbmVlZGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QsIHNjcmlwdHMgfSBvZiBnZW5Db2RlVGFyZ2V0cykge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiZ2VuLWNvZGVcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcHJpc21hR2VuZXJhdGVTY3JpcHQgPSBnZXRQcmlzbWFHZW5lcmF0ZVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnYmxpdHonKSAmJiBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICBzY3JpcHRzLnB1c2goJ1lBUk4gYmxpdHogY29kZWdlbicpO1xuICAgIGlmIChwcmlzbWFHZW5lcmF0ZVNjcmlwdCkge1xuICAgICAgc2NyaXB0cy5wdXNoKHByaXNtYUdlbmVyYXRlU2NyaXB0KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJpc21hR2VuZXJhdGVTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2gocHJpc21hR2VuZXJhdGVTY3JpcHQpO1xuICB9XG5cbiAgY29uc3QgY2hha3JhVHlwZWdlblNjcmlwdCA9IGdldENoYWtyYVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKGNoYWtyYVR5cGVnZW5TY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goY2hha3JhVHlwZWdlblNjcmlwdCk7XG4gIH1cblxuICBjb25zdCBkcml6emxlQ2hlY2tTY3JpcHQgPSBzY3JpcHRzLmxlbmd0aCA9PT0gMCA/IGdldERyaXp6bGVDaGVja1NjcmlwdChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKGRyaXp6bGVDaGVja1NjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChkcml6emxlQ2hlY2tTY3JpcHQpO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc1NjcmlwdCA9IGdldEdlbkkxOG5Uc1NjcmlwdChwcm9qZWN0KTtcbiAgaWYgKGdlbkkxOG5Uc1NjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChnZW5JMThuVHNTY3JpcHQpO1xuICB9XG4gIHJldHVybiBzY3JpcHRzO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5JMThuVHNTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWkxOG4tdHMnXSkge1xuICAgIGlmICghcHJvamVjdC5oYXNTb3VyY2VDb2RlKSByZXR1cm47XG4gICAgcmV0dXJuICdZQVJOIHJ1biBnZW4taTE4bi10cyc7XG4gIH1cbiAgaWYgKFxuICAgIHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnZ2VuLWkxOG4tdHMnKSAmJlxuICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2kxOG4nKSlcbiAgKSB7XG4gICAgcmV0dXJuICdZQVJOIGdlbi1pMThuLXRzIC1pIGkxOG4gLW8gc3JjL19fZ2VuZXJhdGVkX18vaTE4bi50cyAtZCBqYS1KUCc7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFHZW5lcmF0ZVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc1ByaXNtYSkgcmV0dXJuO1xuICBpZiAoIWhhc1ByaXNtYVNjaGVtYShwcm9qZWN0KSkgcmV0dXJuO1xuICByZXR1cm4gcHJpc21hU2NyaXB0cy5nZW5lcmF0ZShwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQGNoYWtyYS11aS9jbGknKSkgcmV0dXJuO1xuXG4gIGlmIChnZXRPd25EZXBlbmRlbmN5TWFqb3IocHJvamVjdCwgJ0BjaGFrcmEtdWkvY2xpJykgPT09IDIpIHtcbiAgICByZXR1cm4gJ1lBUk4gY2hha3JhLWNsaSB0b2tlbnMgc3JjL2NvcmUvdGhlbWUudHMnO1xuICB9XG4gIGlmIChmaWxlRXhpc3RzKHByb2plY3QsICdzcmMvdGhlbWUudHMnKSkge1xuICAgIHJldHVybiAnWUFSTiBjaGFrcmEgdHlwZWdlbiBzcmMvdGhlbWUudHMgLS1zdHJpY3QnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuO1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgLy8gS2VlcCB0aGUgZXhwbGljaXQgLS1jb25maWcgYmVjYXVzZSBkcml6emxlLWtpdCdzIGRlZmF1bHQgbG9va3VwIG1pc3NlcyBzb21lIGV4dGVuc2lvbnMgKGUuZy4gLm10cykuXG4gIHJldHVybiBgJHt3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgYFlBUk4gZHJpenpsZS1raXQgY2hlY2sgLS1jb25maWcgJHtjb25maWcuZmlsZU5hbWV9YCl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiBnZXRPd25EZXBlbmRlbmN5TWFqb3IocHJvamVjdDogUHJvamVjdCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgY29uc3QgdmVyc2lvbiA9XG4gICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgcGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdO1xuICBjb25zdCBtYWpvciA9IHZlcnNpb24/Lm1hdGNoKC9cXGQrL3UpPy5bMF07XG4gIHJldHVybiBtYWpvciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTnVtYmVyKG1ham9yKTtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGhhc1ByaXNtYVNjaGVtYShwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ3ByaXNtYS9zY2hlbWEucHJpc21hJywgJ3ByaXNtYS9zY2hlbWEnLCAnZGIvc2NoZW1hLnByaXNtYSddLnNvbWUoKGZpbGVQYXRoKSA9PlxuICAgIGZpbGVFeGlzdHMocHJvamVjdCwgZmlsZVBhdGgpXG4gICk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+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+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFsZVByb2Nlc3NNYXhQb2xsczsgaSsrKSB7XG4gICAgYXdhaXQgc2V0VGltZW91dChzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyk7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VTUkNIJykgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUoaW1hZ2VOYW1lOiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYG5hbWU9JHtpbWFnZU5hbWV9YF0sIHByb2plY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2VzcywgcmVtb3ZlU3RhbGVQcm9jZXNzIH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdkZWxheS1tcyc6IHtcbiAgICBkZWZhdWx0OiA1MDAwLFxuICAgIGRlc2NyaWJlOiAnRGVsYXkgYmVmb3JlIHN0YXJ0aW5nIHRoZSBtYWludGVuYW5jZSBwYWdlIHNlcnZlci4nLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcbnR5cGUgTWFpbnRlbmFuY2VBcmd2ID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4gJiB7XG4gIGFjdGlvbjogJ3N0YXJ0JyB8ICdzdG9wJztcbn07XG5jb25zdCBtYWludGVuYW5jZUxpc3Rlbk1heEF0dGVtcHRzID0gNTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuUmV0cnlEZWxheU1zID0gMTAwO1xuY29uc3QgbWF4VGltZW91dERlbGF5TXMgPSAyXzE0N180ODNfNjQ3O1xuY29uc3QgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lID0gJy53Yic7XG5jb25zdCBtYWludGVuYW5jZUh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XG48aHRtbCBsYW5nPVwiamFcIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+XG4gICAgPHRpdGxlPuODoeODs+ODhuODiuODs+OCueS4rTwvdGl0bGU+XG4gICAgPHN0eWxlPlxuICAgICAgYm9keSB7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICAgIGNvbG9yOiAjMTExODI3O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcIlNlZ29lIFVJXCIsIHNhbnMtc2VyaWY7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoO1xuICAgICAgfVxuXG4gICAgICBtYWluIHtcbiAgICAgICAgcGFkZGluZzogMjRweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICBoMSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMjhweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICAgICAgbWFyZ2luOiAwIDAgMTZweDtcbiAgICAgIH1cblxuICAgICAgcCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuODtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPG1haW4+XG4gICAgICA8aDE+54++5Zyo44Oh44Oz44OG44OK44Oz44K55Lit44Gn44GZPC9oMT5cbiAgICAgIDxwPueahuanmOOBq+OBr+OBlOS4jeS+v+OCkuOBiuOBi+OBkeOBl+OBvuOBmeOBjOOAgeODoeODs+ODhuODiuODs+OCuee1guS6huOBvuOBp+OBl+OBsOOCieOBj+OBiuW+heOBoeOBj+OBoOOBleOBhOOAgjwvcD5cbiAgICA8L21haW4+XG4gIDwvYm9keT5cbjwvaHRtbD5gO1xuXG5leHBvcnQgY29uc3QgbWFpbnRlbmFuY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIE1haW50ZW5hbmNlQXJndj4gPSB7XG4gIGNvbW1hbmQ6ICdtYWludGVuYW5jZSA8YWN0aW9uPicsXG4gIGRlc2NyaWJlOiAnU3RhcnQgb3Igc3RvcCBhIGxpZ2h0d2VpZ2h0IG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLiBFeGFtcGxlOiB3YiBtYWludGVuYW5jZSBzdGFydCcsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJnc1xuICAgICAgLnBvc2l0aW9uYWwoJ2FjdGlvbicsIHtcbiAgICAgICAgY2hvaWNlczogWydzdGFydCcsICdzdG9wJ10gYXMgY29uc3QsXG4gICAgICAgIGRlc2NyaWJlOiAnTWFpbnRlbmFuY2Ugc2VydmVyIGFjdGlvbicsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpIGFzIHVua25vd24gYXMgQXJndjxNYWludGVuYW5jZUFyZ3Y+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbiA9IGFyZ3YuYWN0aW9uO1xuICAgIGlmIChwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0Jykge1xuICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlICR7YWN0aW9ufSBiZWNhdXNlIFdCX0VOViBpcyB0ZXN0LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBwYXJzZVBvcnQocHJvamVjdC5lbnYuUE9SVCk7XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgYXdhaXQgc3RhcnRNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0LCBwb3J0LCBhcmd2LmRlbGF5TXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uID09PSAnc3RvcCcpIHtcbiAgICAgIGF3YWl0IHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0LCBwb3J0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWFpbnRlbmFuY2UgYWN0aW9uOiAke2FjdGlvbn1gKTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHBhcnNlUG9ydChwb3J0RW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBhc3NlcnQub2soTnVtYmVyLmlzSW50ZWdlcihwb3J0KSAmJiBwb3J0ID4gMCwgYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApO1xuICByZXR1cm4gcG9ydDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIsIGRlbGF5TXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhc3NlcnQub2soXG4gICAgTnVtYmVyLmlzRmluaXRlKGRlbGF5TXMpICYmIGRlbGF5TXMgPj0gMCAmJiBkZWxheU1zIDw9IG1heFRpbWVvdXREZWxheU1zLFxuICAgIGBkZWxheS1tcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHttYXhUaW1lb3V0RGVsYXlNc306ICR7ZGVsYXlNc31gXG4gICk7XG5cbiAgY29uc3QgcGlkRmlsZVBhdGggPSBhd2FpdCB3cml0ZU1haW50ZW5hbmNlUGlkRmlsZShwcm9qZWN0LCBwb3J0KTtcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBjbGVhbnVwID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcHJvY2Vzcy5waWQpO1xuICB9O1xuICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIH07XG4gIGNvbnN0IHJlbW92ZVNpZ25hbEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdURVJNJywgaGFuZGxlU2lnbmFsKTtcbiAgICBwcm9jZXNzLm9mZignU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCBoYW5kbGVTaWduYWwpO1xuICBwcm9jZXNzLm9uY2UoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBoYW5kbGVTaWduYWwpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgc2V0VGltZW91dChkZWxheU1zLCB1bmRlZmluZWQsIHsgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0pO1xuICAgIHJlbW92ZVNpZ25hbEhhbmRsZXJzKCk7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgY3JlYXRlQW5kTGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIocG9ydCk7XG4gICAgaWYgKCFzZXJ2ZXIpIHJldHVybjtcblxuICAgIGNvbnNvbGUuaW5mbyhgU3RhcnRlZCBtYWludGVuYW5jZSBzZXJ2ZXIgb24gcG9ydCAke3BvcnR9LmApO1xuICAgIGF3YWl0IHdhaXRGb3JTaHV0ZG93bihzZXJ2ZXIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuO1xuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBhd2FpdCBjbGVhbnVwKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQW5kTGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIocG9ydDogbnVtYmVyKTogUHJvbWlzZTxodHRwLlNlcnZlciB8IHVuZGVmaW5lZD4ge1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYWludGVuYW5jZUxpc3Rlbk1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVNYWludGVuYW5jZVNlcnZlcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaXN0ZW5NYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIsIHBvcnQsIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKTtcbiAgICAgIHJldHVybiBzZXJ2ZXI7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbjtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnICYmIGF0dGVtcHQgPCBtYWludGVuYW5jZUxpc3Rlbk1heEF0dGVtcHRzKSB7XG4gICAgICAgIGF3YWl0IHNldFRpbWVvdXQobWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBtYWludGVuYW5jZSBzZXJ2ZXIgYmVjYXVzZSBwb3J0ICR7cG9ydH0gaXMgYWxyZWFkeSBpbiB1c2UuYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBoYW5kbGVNYWludGVuYW5jZVN0YXJ0dXBFcnJvcihwb3J0LCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignVW5yZWFjaGFibGUgbWFpbnRlbmFuY2Ugc2VydmVyIHN0YXJ0dXAgc3RhdGUuJyk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQ6IG51bWJlciwgZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbik6IG5ldmVyIHtcbiAgaWYgKGVycm9yLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQb3J0ICR7cG9ydH0gaXMgYWxyZWFkeSBpbiB1c2UuYCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBNYWludGVuYW5jZSBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKSk7XG4gIH1cbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVSdW50aW1lTWFpbnRlbmFuY2VTZXJ2ZXJFcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtpbGxNYWludGVuYW5jZVByb2Nlc3MocHJvamVjdCwgcG9ydCk7XG4gIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgY29uc29sZS5pbmZvKGBTdG9wcGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk6IGh0dHAuU2VydmVyIHtcbiAgcmV0dXJuIGh0dHAuY3JlYXRlU2VydmVyKChfcmVxdWVzdCwgcmVzcG9uc2UpID0+IHtcbiAgICByZXNwb25zZS53cml0ZUhlYWQoNTAzLCB7XG4gICAgICAnY2FjaGUtY29udHJvbCc6ICduby1zdG9yZScsXG4gICAgICAnY29udGVudC10eXBlJzogJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcsXG4gICAgfSk7XG4gICAgcmVzcG9uc2UuZW5kKG1haW50ZW5hbmNlSHRtbCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0ZW5NYWludGVuYW5jZVNlcnZlcihcbiAgc2VydmVyOiBodHRwLlNlcnZlcixcbiAgcG9ydDogbnVtYmVyLFxuICBvblJ1bnRpbWVFcnJvcjogKGVycm9yOiBFcnJvcikgPT4gdm9pZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBvblN0YXJ0dXBFcnJvciA9IChlcnJvcjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgIHNlcnZlci5vZmYoJ2xpc3RlbmluZycsIG9uTGlzdGVuaW5nKTtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcbiAgICBjb25zdCBvbkxpc3RlbmluZyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHNlcnZlci5vZmYoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgICAgc2VydmVyLm9uKCdlcnJvcicsIG9uUnVudGltZUVycm9yKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9O1xuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIG9uU3RhcnR1cEVycm9yKTtcbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgJzAuMC4wLjAnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JTaHV0ZG93bihzZXJ2ZXI6IGh0dHAuU2VydmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2h1dGRvd24gPSAoKTogdm9pZCA9PiB7XG4gICAgICBwcm9jZXNzLm9mZignU0lHSU5UJywgc2h1dGRvd24pO1xuICAgICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHUVVJVCcsIHNodXRkb3duKTtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYEZhaWxlZCB0byBjbG9zZSBtYWludGVuYW5jZSBzZXJ2ZXI6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXI6IGh0dHAuU2VydmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzZXJ2ZXIuY2xvc2UoKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFUlJfU0VSVkVSX05PVF9SVU5OSU5HJykge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHNlcnZlci5jbG9zZUFsbENvbm5lY3Rpb25zKCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1haW50ZW5hbmNlUGlkRmlsZShwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShwaWRGaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy53cml0ZUZpbGUocGlkRmlsZVBhdGgsIGAke3Byb2Nlc3MucGlkfVxcbmAsICd1dGY4Jyk7XG4gIHJldHVybiBwaWRGaWxlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGlkRmlsZVBhdGggPSBtYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBwaWQgPSBhd2FpdCByZWFkTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoKTtcbiAgaWYgKHBpZCAhPT0gdW5kZWZpbmVkICYmIHBpZCAhPT0gcHJvY2Vzcy5waWQpIHtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocGlkLCAnU0lHVEVSTScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBhd2FpdCByZW1vdmVTdGFsZVByb2Nlc3MocGlkKTtcbiAgfVxuICBhd2FpdCByZW1vdmVNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgsIHBpZCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nLCBleHBlY3RlZFBpZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXhwZWN0ZWRQaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICAgIGlmIChwaWQgIT09IGV4cGVjdGVkUGlkKSByZXR1cm47XG4gIH1cbiAgYXdhaXQgZnMucm0ocGlkRmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGlkVGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBpZEZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IHBpZCA9IE51bWJlcihwaWRUZXh0LnRyaW0oKSk7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocGlkKSAmJiBwaWQgPiAwID8gcGlkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdC5yb290RGlyUGF0aCwgcG9ydCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYWludGVuYW5jZVBpZEZpbGVQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4ocm9vdERpclBhdGgsIG1haW50ZW5hbmNlUGlkRGlyZWN0b3J5TmFtZSwgYG1haW50ZW5hbmNlLSR7cG9ydH0ucGlkYCk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG4vKipcbiAqIE1hdGVyaWFsaXphdGlvbiBvZiBgQHdpbGxib29zdGVyLXByaXZhdGUvKmAgcmVnaXN0cnkgKFZlcmRhY2NpbykgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzOlxuICogdGhlIHBhY2thZ2VzIGFyZSBkb3dubG9hZGVkIG9uIHRoZSBob3N0IChhdXRoIHZpYSAubnBtcmMgLyB+Ly5ucG1yYyBsb2NhbGx5LCBvciBWRVJEQUNDSU9fVE9LRU5cbiAqIG9uIENJKSBhbmQgZXh0cmFjdGVkIG5leHQgdG8gdGhlIHJlcG9zaXRvcnkgc28gaW1hZ2UgYnVpbGRzIG5lZWQgbm8gcmVnaXN0cnkgY3JlZGVudGlhbHNcbiAqIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NjQpLlxuICovXG5leHBvcnQgY29uc3QgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSA9ICdAd2lsbGJvb3N0ZXItcHJpdmF0ZSc7XG5cbi8vIGBnaXQ6YC9gZ2l0K2AvYGdpdEBgIChub3QgdGhlIGJhcmUgd29yZCBgZ2l0YCk6IG5wbSBhbGxvd3MgYXJiaXRyYXJ5IGRpc3QtdGFncywgc28gYSB0YWcgbmFtZWRcbi8vIGBnaXRgIG9yIGBnaXQtbmV4dGAgbXVzdCBzdGlsbCBiZSB0cmVhdGVkIGFzIGEgcmVnaXN0cnkgc3BlY2lmaWVyLlxuY29uc3Qgbm9uUmVnaXN0cnlTcGVjaWZpZXJQcmVmaXhlcyA9IFtcbiAgJ2dpdDonLFxuICAnZ2l0KycsXG4gICdnaXRAJyxcbiAgJ2ZpbGU6JyxcbiAgJ2xpbms6JyxcbiAgJ3dvcmtzcGFjZTonLFxuICAnaHR0cDonLFxuICAnaHR0cHM6JyxcbiAgJ3BvcnRhbDonLFxuICAncGF0Y2g6Jyxcbl07XG5cbi8vIFRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB3aGljaCBnaXQgc3BlY2lmaWVycyB0aGUgcHJpdmF0ZS1wYWNrYWdlIHRvb2xpbmcgc3VwcG9ydHM6XG4vLyBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgbWF0ZXJpYWxpemVzIGV4YWN0bHkgdGhlc2UsIGFuZCBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZGAgbXVzdFxuLy8gcmV3cml0ZSBleGFjdGx5IHRoZXNlIChyZXdyaXRpbmcgb3RoZXIgb3JncycgU1NIIFVSTHMgd291bGQgcG9pbnQgYXQgbmV2ZXItbWF0ZXJpYWxpemVkIHBhdGhzKS5cbmNvbnN0IHByaXZhdGVHaXREZXBlbmRlbmN5UGF0dGVybiA9IC9eZ2l0QGdpdGh1YlxcLmNvbTooPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilcXC9bXi8jXSsoPzpcXC5naXQpPyg/OiMuKik/JC87XG5cbi8vIFJldHVybnMgYm9vbGVhbiAobm90IGEgYHZhbHVlIGlzIHN0cmluZ2AgcHJlZGljYXRlKTogYSBwcmVkaWNhdGUgd291bGQgbmFycm93IHRoZSBuZWdhdGl2ZVxuLy8gYnJhbmNoIHRvIGB1bmRlZmluZWRgIGFuZCBicmVhayBgZWxzZSBpZmAgY2hhaW5zIG92ZXIgYHN0cmluZyB8IHVuZGVmaW5lZGAgZGVwZW5kZW5jeSB2YWx1ZXMuXG5leHBvcnQgZnVuY3Rpb24gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4udGVzdCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgbmFtZS5zdGFydHNXaXRoKGAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9L2ApICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICFub25SZWdpc3RyeVNwZWNpZmllclByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4gdmFsdWUuc3RhcnRzV2l0aChwcmVmaXgpKVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVSZWdpc3RyeUF1dGgge1xuICByZWdpc3RyeVVybDogc3RyaW5nO1xuICBhdXRoVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSByZWdpc3RyeSBVUkwgYW5kIGF1dGggdG9rZW4gZm9yIHRoZSBwcml2YXRlIHNjb3BlIGZyb20gdGhlIHByb2plY3QncyAubnBtcmMgYW5kXG4gKiB+Ly5ucG1yYyAobmVhcmVyIGZpbGUgd2lucyksIGV4cGFuZGluZyBgJHtWQVJ9YCByZWZlcmVuY2VzIGZyb20gdGhlIGVudmlyb25tZW50LiBPbiBDSSB0aGVcbiAqIFZFUkRBQ0NJT19UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXJ2ZXMgYXMgdGhlIGZhbGxiYWNrIHRva2VuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgocm9vdERpclBhdGg6IHN0cmluZyk6IFByaXZhdGVSZWdpc3RyeUF1dGggfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8vIFJldmVyc2Ugb3JkZXIgc28gbmVhcmVyIGZpbGVzIG92ZXJ3cml0ZSB0aGUgaG9tZS1kaXJlY3RvcnkgZGVmYXVsdHMuXG4gIGZvciAoY29uc3QgbnBtcmNQYXRoIG9mIFtwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm5wbXJjJyksIHBhdGguam9pbihyb290RGlyUGF0aCwgJy5ucG1yYycpXSkge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVudHJpZXMsIHBhcnNlTnBtcmMoZnMucmVhZEZpbGVTeW5jKG5wbXJjUGF0aCwgJ3V0ZjgnKSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBucG1yYyBmaWxlcyBhcmUgZmluZTsgdGhlIG90aGVyIGZpbGUgb3IgVkVSREFDQ0lPX1RPS0VOIG1heSBzdGlsbCBwcm92aWRlIGF1dGguXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVnaXN0cnlVcmwgPSBlbnRyaWVzW2Ake1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9OnJlZ2lzdHJ5YF0/LnJlcGxhY2UoL1xcLyskLywgJycpO1xuICBpZiAoIXJlZ2lzdHJ5VXJsKSByZXR1cm47XG5cbiAgLy8gbnBtLXN0eWxlIFVSSSBtYXRjaGluZzogbm9ybWFsaXplIGJvdGggc2lkZXMgdG8gYSB0cmFpbGluZyBzbGFzaCBzbyBhIHRva2VuIGZvclxuICAvLyBgLy92ZXJkYWNjaW8uZXhhbXBsZS5jb20vYCBjYW4gbmV2ZXIgbWF0Y2ggYC8vdmVyZGFjY2lvLmV4YW1wbGUuY29tLW90aGVyLm9yZy9gLCBhbmQgcGljayB0aGVcbiAgLy8gTU9TVCBTUEVDSUZJQyAobG9uZ2VzdCkgbWF0Y2hpbmcgcHJlZml4IHNvIGAvL2hvc3QvcHJpdmF0ZS9gIGJlYXRzIGAvL2hvc3QvYC5cbiAgY29uc3Qgbm9ybWFsaXplZFJlZ2lzdHJ5VXJsID0gYCR7cmVnaXN0cnlVcmwucmVwbGFjZSgvXmh0dHBzPzovLCAnJykucmVwbGFjZSgvXFwvKyQvLCAnJyl9L2A7XG4gIGxldCBtYXRjaGVkVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG1hdGNoZWRQcmVmaXhMZW5ndGggPSAtMTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAvLyBTa2lwIGVtcHR5IHRva2VucyAoYW4gdW5zZXQgYCR7VkFSfWAgZXhwYW5kcyB0byAnJyk6IGFuIGVtcHR5IG1hdGNoIG11c3Qgbm90IGRlZmVhdCB0aGVcbiAgICAvLyBWRVJEQUNDSU9fVE9LRU4gZmFsbGJhY2sgYmVsb3cuXG4gICAgaWYgKCFrZXkuZW5kc1dpdGgoJzpfYXV0aFRva2VuJykgfHwgIXZhbHVlKSBjb250aW51ZTtcbiAgICBjb25zdCBwcmVmaXggPSBgJHtrZXkuc2xpY2UoMCwgLSc6X2F1dGhUb2tlbicubGVuZ3RoKS5yZXBsYWNlKC9cXC8rJC8sICcnKX0vYDtcbiAgICBpZiAobm9ybWFsaXplZFJlZ2lzdHJ5VXJsLnN0YXJ0c1dpdGgocHJlZml4KSAmJiBwcmVmaXgubGVuZ3RoID4gbWF0Y2hlZFByZWZpeExlbmd0aCkge1xuICAgICAgbWF0Y2hlZFByZWZpeExlbmd0aCA9IHByZWZpeC5sZW5ndGg7XG4gICAgICBtYXRjaGVkVG9rZW4gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLy8gTm8gUHJvamVjdCBpbnN0YW5jZSBleGlzdHMgYXQgdGhpcyBsYXllciwgc28gcHJvY2Vzcy5lbnYgaXMgdGhlIG9ubHkgc291cmNlIGZvciB0aGVcbiAgLy8gQ0ktaW5qZWN0ZWQgZmFsbGJhY2sgdG9rZW4uXG4gIGNvbnN0IGF1dGhUb2tlbiA9IG1hdGNoZWRUb2tlbiA/PyBwcm9jZXNzLmVudi5WRVJEQUNDSU9fVE9LRU47XG4gIHJldHVybiB7IHJlZ2lzdHJ5VXJsLCBhdXRoVG9rZW4gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTnBtcmMoY29udGVudDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCByYXdMaW5lIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbGluZSA9IHJhd0xpbmUudHJpbSgpO1xuICAgIGlmICghbGluZSB8fCBsaW5lLnN0YXJ0c1dpdGgoJyMnKSB8fCBsaW5lLnN0YXJ0c1dpdGgoJzsnKSkgY29udGludWU7XG5cbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGxpbmUuaW5kZXhPZignPScpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA8PSAwKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGtleSA9IGxpbmUuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLnRyaW0oKTtcbiAgICBjb25zdCB2YWx1ZSA9IGxpbmVcbiAgICAgIC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpXG4gICAgICAudHJpbSgpXG4gICAgICAucmVwbGFjZUFsbCgvXFwkXFx7KFtefV0rKVxcfS9nLCAoXywgdmFyaWFibGVOYW1lOiBzdHJpbmcpID0+IHByb2Nlc3MuZW52W3ZhcmlhYmxlTmFtZV0gPz8gJycpO1xuICAgIGVudHJpZXNba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIERvd25sb2FkIGFuZCBleHRyYWN0IG9uZSByZWdpc3RyeSBwYWNrYWdlIGludG8gYHRhcmdldERpclBhdGhgLiBUaGUgc3BlY2lmaWVyIG1heSBiZSBhbiBleGFjdFxuICogc2VtdmVyIHZlcnNpb24gKHRoZSBvcmcncyBjb21tb24gY2FzZSB2aWEgYnVuZmlnIGBleGFjdCA9IHRydWVgKSwgYW55IHNlbXZlciByYW5nZSAocmVzb2x2ZWRcbiAqIG1heC1zYXRpc2Z5aW5nIGFnYWluc3QgdGhlIHJlZ2lzdHJ5J3MgcHVibGlzaGVkIHZlcnNpb25zLCBtYXRjaGluZyBgbnBtIGluc3RhbGxgKSwgb3IgYVxuICogZGlzdC10YWcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UoXG4gIGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZyxcbiAgdGFyZ2V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHJlc29sdmVWZXJzaW9uKGF1dGgsIHBhY2thZ2VOYW1lLCB2ZXJzaW9uU3BlY2lmaWVyKTtcbiAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBmZXRjaFJlZ2lzdHJ5SnNvbjx7IGRpc3Q/OiB7IHRhcmJhbGw/OiBzdHJpbmcgfSB9PihcbiAgICBhdXRoLFxuICAgIGAke2F1dGgucmVnaXN0cnlVcmx9LyR7ZW5jb2RlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpfS8ke3ZlcnNpb259YFxuICApO1xuICBjb25zdCB0YXJiYWxsVXJsID0gbWV0YWRhdGEuZGlzdD8udGFyYmFsbDtcbiAgaWYgKCF0YXJiYWxsVXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXJiYWxsIFVSTCBmb3IgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9ufSBpbiAke2F1dGgucmVnaXN0cnlVcmx9LmApO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZyb21SZWdpc3RyeShhdXRoLCB0YXJiYWxsVXJsKTtcbiAgY29uc3QgdGFyYmFsbFBhdGggPSBwYXRoLmpvaW4oXG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksICd3Yi1wcml2YXRlLXBhY2thZ2UtJykpLFxuICAgICdwYWNrYWdlLnRneidcbiAgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUodGFyYmFsbFBhdGgsIEJ1ZmZlci5mcm9tKGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0YXJnZXREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGFyZ2V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gbnBtIHRhcmJhbGxzIHBsYWNlIHRoZSBjb250ZW50IHVuZGVyIGEgdG9wLWxldmVsIGBwYWNrYWdlL2AgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCd0YXInLCBbJy14emYnLCB0YXJiYWxsUGF0aCwgJy1DJywgdGFyZ2V0RGlyUGF0aCwgJy0tc3RyaXAtY29tcG9uZW50cz0xJ10sIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9ufSAoJHt0YXJiYWxsVXJsfSkuYCk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguZGlybmFtZSh0YXJiYWxsUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVmVyc2lvbihcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyBQcmVyZWxlYXNlIGFuZCBgK2J1aWxkYCBtZXRhZGF0YSBhcmUgYm90aCBwYXJ0IG9mIHZhbGlkIGV4YWN0IFNlbVZlciB2ZXJzaW9ucywgc28gYW4gZXhhY3RcbiAgLy8gc3BlY2lmaWVyIHJlc29sdmVzIHRvIGl0c2VsZiB3aXRob3V0IGEgcGFja3VtZW50IGZldGNoLlxuICBpZiAoaXNFeGFjdFZlcnNpb24odmVyc2lvblNwZWNpZmllcikpIHJldHVybiB2ZXJzaW9uU3BlY2lmaWVyO1xuXG4gIGNvbnN0IHBhY2t1bWVudCA9IGF3YWl0IGZldGNoUmVnaXN0cnlKc29uPFBhY2t1bWVudD4oYXV0aCwgYCR7YXV0aC5yZWdpc3RyeVVybH0vJHtlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSl9YCk7XG4gIGNvbnN0IHZlcnNpb24gPSBzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCh2ZXJzaW9uU3BlY2lmaWVyLCBwYWNrdW1lbnQpO1xuICBpZiAoIXZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHJlc29sdmUgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9uU3BlY2lmaWVyfSBhZ2FpbnN0ICR7YXV0aC5yZWdpc3RyeVVybH07IHVzZSBhbiBleGFjdCB2ZXJzaW9uLCBhIHNlbXZlciByYW5nZSwgb3IgYSBkaXN0LXRhZy5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWNrdW1lbnQge1xuICAnZGlzdC10YWdzJz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHZlcnNpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogbnBtJ3Mgc3BlY2lmaWVyIGNsYXNzaWZpY2F0aW9uOiBgKmAgYW5kIGRpc3QtdGFnIG5hbWVzIHJlc29sdmUgdmlhIGRpc3QtdGFncyAobnBtIHJlc29sdmVzIGAqYFxuICogdG8gdGhlIGBsYXRlc3RgIHRhZyksIHdoaWxlIGFueSBvdGhlciB2YWxpZCBzZW12ZXIgcmFuZ2UgcmVzb2x2ZXMgdG8gdGhlIGhpZ2hlc3QgcHVibGlzaGVkXG4gKiB2ZXJzaW9uIHNhdGlzZnlpbmcgaXQsIG1hdGNoaW5nIGBucG0gaW5zdGFsbGAncyBtYXgtc2F0aXNmeWluZyBzZW1hbnRpY3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCh2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmcsIHBhY2t1bWVudDogUGFja3VtZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZlcnNpb25TcGVjaWZpZXIgIT09ICcqJyAmJiBzZW12ZXIudmFsaWRSYW5nZSh2ZXJzaW9uU3BlY2lmaWVyKSkge1xuICAgIHJldHVybiBzZW12ZXIubWF4U2F0aXNmeWluZyhPYmplY3Qua2V5cyhwYWNrdW1lbnQudmVyc2lvbnMgPz8ge30pLCB2ZXJzaW9uU3BlY2lmaWVyKSA/PyB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHBhY2t1bWVudFsnZGlzdC10YWdzJ10/Llt2ZXJzaW9uU3BlY2lmaWVyID09PSAnKicgPyAnbGF0ZXN0JyA6IHZlcnNpb25TcGVjaWZpZXJdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlZ2lzdHJ5SnNvbjxUPihhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLCB1cmw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGgsIHVybCk7XG4gIHJldHVybiAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBUO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEZyb21SZWdpc3RyeShhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLCB1cmw6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgLy8gVGFyYmFsbCBVUkxzIGNvbWUgZnJvbSByZWdpc3RyeS1jb250cm9sbGVkIG1ldGFkYXRhOyBhdHRhY2ggdGhlIHRva2VuIG9ubHkgdG8gdGhlIGNvbmZpZ3VyZWRcbiAgLy8gcmVnaXN0cnkncyBvd24gb3JpZ2luIHNvIGEgbWFsaWNpb3VzIG9yIG1pc2NvbmZpZ3VyZWQgcmVnaXN0cnkgY2Fubm90IHJlZGlyZWN0IHRoZSBjcmVkZW50aWFsXG4gIC8vIHRvIGEgdGhpcmQtcGFydHkgaG9zdC5cbiAgY29uc3Qgc2VuZEF1dGhUb2tlbiA9ICEhYXV0aC5hdXRoVG9rZW4gJiYgaXNTYW1lT3JpZ2luKHVybCwgYXV0aC5yZWdpc3RyeVVybCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgaGVhZGVyczogc2VuZEF1dGhUb2tlbiA/IHsgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGguYXV0aFRva2VufWAgfSA6IHt9LFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfTogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbih1cmw6IHN0cmluZywgcmVnaXN0cnlVcmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHVybCkub3JpZ2luID09PSBuZXcgVVJMKHJlZ2lzdHJ5VXJsKS5vcmlnaW47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoJy8nLCAnJTJGJyk7XG59XG5cbi8vIFRoZSBvZmZpY2lhbCBTZW1WZXIgMi4wLjAgZ3JhbW1hciAoc2VtdmVyLm9yZyksIGFuY2hvcmVkOiBudW1lcmljLWxvb2tpbmcgZGlzdC10YWdzIHN1Y2ggYXNcbi8vIGAxLjIuM2xhdGVzdGAsIGxlYWRpbmctemVybyB2ZXJzaW9ucyAoYDAxLjIuM2ApLCBhbmQgdW5kZXJzY29yZSBpZGVudGlmaWVycyBhcmUgTk9UIHZlcnNpb25zIOKAlFxuLy8gcmVzb2x2ZVZlcnNpb24gdHJlYXRzIHRoZW0gYXMgdGFncywgbWF0Y2hpbmcgbm9kZS1zZW12ZXIncyBjbGFzc2lmaWNhdGlvbi5cbmNvbnN0IGV4YWN0U2VtdmVyUGF0dGVybiA9XG4gIC9eKD86MHxbMS05XVxcZCopXFwuKD86MHxbMS05XVxcZCopXFwuKD86MHxbMS05XVxcZCopKD86LSg/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSg/OlxcLig/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSkqKT8oPzpcXCtbMC05YS16QS1aLV0rKD86XFwuWzAtOWEtekEtWi1dKykqKT8kLztcblxuLyoqIFdoZXRoZXIgdGhlIHNwZWNpZmllciBpcyBhbiBleGFjdCBTZW1WZXIgdmVyc2lvbiAobm90IGEgcmFuZ2UsIHRhZywgb3IgZ2l0IFVSTCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc3BlY2lmaWVyICYmIGV4YWN0U2VtdmVyUGF0dGVybi50ZXN0KHNwZWNpZmllcik7XG59XG5cbi8qKlxuICogV2hldGhlciBFVkVSWSB2ZXJzaW9uIGBzcGVjaWZpZXJgIGNhbiByZXNvbHZlIHRvIGFsc28gc2F0aXNmaWVzIGByZXF1aXJlbWVudGAgKGV4YWN0IHZlcnNpb25zXG4gKiBjb3VudCBhcyBzaW5nbGUtdmVyc2lvbiByYW5nZXMpLiBDb25mbGljdCBjaGVja3MgdXNlIHRoaXMgYmVjYXVzZSB0aGUgYWN0dWFsbHkgcmVzb2x2ZWQgdmVyc2lvblxuICogaXMgdW5rbm93biBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGlzIGNvbnN1bHRlZDogYSBzdWJzZXQgc3BlY2lmaWVyJ3MgbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBpc1xuICogZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSB3aWRlciByZXF1aXJlbWVudC4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMpIGFyZSBub3RcbiAqIGNvbXBhcmFibGUgYW5kIHJldHVybiBmYWxzZSDigJQgY2FsbGVycyBhY2NlcHQgdGhvc2Ugb25seSBvbiBleGFjdCBzdHJpbmcgZXF1YWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGVjaWZpZXJTdWJzZXQoc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJlcXVpcmVtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKHNwZWNpZmllciA9PT0gdW5kZWZpbmVkIHx8IHJlcXVpcmVtZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFzZW12ZXIudmFsaWRSYW5nZShzcGVjaWZpZXIpIHx8ICFzZW12ZXIudmFsaWRSYW5nZShyZXF1aXJlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHNlbXZlci5zdWJzZXQoc3BlY2lmaWVyLCByZXF1aXJlbWVudCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbWF0ZXJpYWxpemVkIGB2ZXJzaW9uYCBjYW4gYmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIHJlZ2lzdHJ5IGBzcGVjaWZpZXJgLlxuICogRGlzdC10YWdzIChpbnZhbGlkIHJhbmdlcykgYXJlIG5vdCBzdGF0aWNhbGx5IGNoZWNrYWJsZSBhbmQgcGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikpIHJldHVybiB0cnVlO1xuICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyh2ZXJzaW9uLCBzcGVjaWZpZXIpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7XG4gIGZpbmREZXNjZW5kYW50UHJvamVjdHMsXG4gIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCxcbiAgZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCxcbiAgdHlwZSBQcm9qZWN0LFxufSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHtcbiAgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSxcbiAgaXNQcml2YXRlR2l0RGVwZW5kZW5jeSxcbiAgaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5LFxuICBtYXRlcmlhbGl6ZWRWZXJzaW9uU2F0aXNmaWVzLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBzcWxpdGVGaWxlUGF0dGVybiA9IC9cXC4oPzpzcWxpdGUzP3xkYikoPzpbLS5dKD86am91cm5hbHxzaG18d2FsKSk/JC9pO1xuY29uc3QgZG9ja2VyQnVpbGRDYWNoZVBhdGhzID0gW1xuICAnLmNhY2hlJyxcbiAgJy5teXB5X2NhY2hlJyxcbiAgJy5uZXh0L2NhY2hlJyxcbiAgJy5wYXJjZWwtY2FjaGUnLFxuICAnLnB5dGVzdF9jYWNoZScsXG4gICcucnVmZl9jYWNoZScsXG4gICcudG94JyxcbiAgJy50dXJibycsXG4gICcudmVudicsXG4gICcueWFybi9jYWNoZScsXG4gICcueWFybi9pbnN0YWxsLXN0YXRlLmd6JyxcbiAgJ19fcHljYWNoZV9fJyxcbiAgJ2NvdmVyYWdlJyxcbiAgJ25vZGVfbW9kdWxlcy8uY2FjaGUnLFxuICAncGxheXdyaWdodC1yZXBvcnQnLFxuICAnc3Rvcnlib29rLXN0YXRpYycsXG4gICd0YXJnZXQnLFxuICAndGVzdC1yZXN1bHRzJyxcbl07XG5jb25zdCBkb2NrZXJCdWlsZENhY2hlUGF0dGVybnMgPSBbJyoqLyoucHljJywgJyoqLyoudHNidWlsZGluZm8nLCAnKiovX19weWNhY2hlX18nXTtcbmNvbnN0IGdlbmVyYXRlZFNxbGl0ZURpck5hbWVzID0gWydwcmlzbWEnLCAnZGInLCAnZHJpenpsZSddIGFzIGNvbnN0O1xuY29uc3QgZG9ja2VyR2VuZXJhdGVkRGF0YURpclBhdGhzID0gWycvZGF0YSddIGFzIGNvbnN0O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGltaXplZFByb2plY3RzOiBQcm9qZWN0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdCwgcGFja2FnZUpzb24pO1xuICAgICAgY29uc3QgcmVtb3ZlZERldkRlcGVuZGVuY2llcyA9IG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uLCB7XG4gICAgICAgIHJlbW92ZVdiUG9zdGluc3RhbGw6ICFhcmd2Lm91dHNpZGUgJiYgcmVtb3ZlZERldkRlcGVuZGVuY2llcy5pbmNsdWRlcygnQHdpbGxib29zdGVyL3diJyksXG4gICAgICB9KTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgICAgYXdhaXQgd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMocGF0aC5qb2luKGRpc3REaXJQYXRoLCAnYmFzaCcpKTtcbiAgICAgIH1cbiAgICAgIG9wdGltaXplZFByb2plY3RzLnB1c2gocHJvamVjdCk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocHJvamVjdHMucm9vdC5wYWNrYWdlTWFuYWdlckNvbW1hbmQsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICAgIGF3YWl0IGNsZWFudXBEb2NrZXJCdWlsZEFydGlmYWN0cyhvcHRpbWl6ZWRQcm9qZWN0cyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdDogUHJvamVjdCwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXNGb3JEaXIocHJvamVjdC5yb290RGlyUGF0aCwgcHJvamVjdC5kaXJQYXRoLCBwYWNrYWdlSnNvbik7XG59XG5cbmZ1bmN0aW9uIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzRm9yRGlyKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb25cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmV3cml0dGVuRGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgIGlmIChpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSkge1xuICAgICAgICAvLyBEb2NrZXIgYnVpbGRzIGNhbm5vdCBhY2Nlc3MgcHJpdmF0ZSBTU0ggVVJMcyB1bmxlc3MgY3JlZGVudGlhbHMgYXJlIGZvcndhcmRlZC5cbiAgICAgICAgLy8gVGhlIERvY2tlcmZpbGUgY29waWVzIHRob3NlIHdvcmtzcGFjZSBwYWNrYWdlcyBpbnRvIHRoZSBpbWFnZSBpbnN0ZWFkLiBPbmx5IHRoZSBvcmcnc1xuICAgICAgICAvLyBvd24gZ2l0IGRlcGVuZGVuY2llcyBhcmUgcmV3cml0dGVuIOKAlCB0aGUgc2hhcmVkIHByZWRpY2F0ZSBtYXRjaGVzIGV4YWN0bHkgd2hhdFxuICAgICAgICAvLyBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgbWF0ZXJpYWxpemVzLCBzbyBvdGhlciBTU0ggVVJMcyBhcmUgbGVmdCB1bmNoYW5nZWQgaW5zdGVhZFxuICAgICAgICAvLyBvZiBiZWluZyBwb2ludGVkIGF0IG5ldmVyLW1hdGVyaWFsaXplZCBsb2NhbCBwYXRocy5cbiAgICAgICAgZGVwc1tuYW1lXSA9IGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKHJvb3REaXJQYXRoLCBwYWNrYWdlRGlyUGF0aCwgJ0B3aWxsYm9vc3RlcicsIG5hbWUpO1xuICAgICAgICByZXdyaXR0ZW5EZXBlbmRlbmNpZXMucHVzaChgJHtrZXl9LiR7bmFtZX1gKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKSkge1xuICAgICAgICBjb25zdCBtYXRlcmlhbGl6ZWRWZXJzaW9uID0gcmVhZE1hdGVyaWFsaXplZFBhY2thZ2VWZXJzaW9uKHJvb3REaXJQYXRoLCBuYW1lKTtcbiAgICAgICAgaWYgKG1hdGVyaWFsaXplZFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIExlYXZpbmcgdGhlIHJlZ2lzdHJ5IHNwZWNpZmllciBtZWFucyB0aGUgaW4taW1hZ2UgaW5zdGFsbCBuZWVkcyBWZXJkYWNjaW9cbiAgICAgICAgICAvLyBjcmVkZW50aWFscyDigJQgdGhlIGZhaWx1cmUgdGhpcyBmZWF0dXJlIGV4aXN0cyB0byBhdm9pZCDigJQgc28gc2F5IHNvIG91dCBsb3VkLlxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYCR7bmFtZX0gaXMgbm90IG1hdGVyaWFsaXplZCB1bmRlciAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9LzsgcnVuIFxcYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNcXGAgc28gdGhlIERvY2tlciBidWlsZCBkb2VzIG5vdCBuZWVkIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBpcyBzdGFsZSB3aGVuIHRoZSBzcGVjaWZpZXIgKGFuIGV4YWN0IHZlcnNpb24gb3IgYW55IHNlbXZlclxuICAgICAgICAvLyByYW5nZSBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgcmVzb2x2ZXMgbWF4LXNhdGlzZnlpbmcgYWdhaW5zdCB0aGUgcmVnaXN0cnkpIGRvZXNcbiAgICAgICAgLy8gbm90IGFkbWl0IGl0LiBEaXN0LXRhZyBzcGVjaWZpZXJzIChlLmcuIGAyMDI2LXN0YWJsZWApIHNraXAgdGhlIHN0YWxlbmVzcyBjaGVjay5cbiAgICAgICAgaWYgKCFtYXRlcmlhbGl6ZWRWZXJzaW9uU2F0aXNmaWVzKHZhbHVlLCBtYXRlcmlhbGl6ZWRWZXJzaW9uKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAgIGBNYXRlcmlhbGl6ZWQgJHtuYW1lfSBpcyAke21hdGVyaWFsaXplZFZlcnNpb259IGJ1dCBwYWNrYWdlLmpzb24gcmVxdWlyZXMgJHt2YWx1ZX07IHJlcnVuIFxcYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNcXGAuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIHRoYXQgYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplZCBvbiB0aGUgaG9zdCBhcmUgdXNlZCBhc1xuICAgICAgICAvLyBsb2NhbCBwYXRocyBzbyBpbWFnZSBidWlsZHMgbmVlZCBubyBWZXJkYWNjaW8gY3JlZGVudGlhbHM7IHRoZSBDT01NSVRURUQgcGFja2FnZS5qc29uXG4gICAgICAgIC8vIGtlZXBzIHRoZSByZWdpc3RyeSBzcGVjaWZpZXIg4oCUIG9ubHkgdGhlIGdlbmVyYXRlZCAoZGlzdC8pcGFja2FnZS5qc29uIGlzIHJld3JpdHRlblxuICAgICAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTY0KS5cbiAgICAgICAgZGVwc1tuYW1lXSA9IGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKHJvb3REaXJQYXRoLCBwYWNrYWdlRGlyUGF0aCwgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSwgbmFtZSk7XG4gICAgICAgIHJld3JpdHRlbkRlcGVuZGVuY2llcy5wdXNoKGAke2tleX0uJHtuYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1Jld3JvdGUgcHJpdmF0ZSBkZXBlbmRlbmNpZXM6JywgcmV3cml0dGVuRGVwZW5kZW5jaWVzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbiAgcmV0dXJuIHJld3JpdHRlbkRlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIHNjb3BlRGlyTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwcml2YXRlUGFja2FnZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsIHNjb3BlRGlyTmFtZSwgdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKSk7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHByaXZhdGVQYWNrYWdlRGlyUGF0aCk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cblxuZnVuY3Rpb24gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgvXkB3aWxsYm9vc3Rlcig/Oi1wcml2YXRlKT9cXC8vLCAnJyk7XG59XG5cbi8qKiBVbmRlZmluZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBub3QgbWF0ZXJpYWxpemVkIChvciBpdHMgbWFuaWZlc3QgaXMgdW5yZWFkYWJsZS92ZXJzaW9ubGVzcykuICovXG5mdW5jdGlvbiByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihcbiAgICByb290RGlyUGF0aCxcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSksXG4gICAgJ3BhY2thZ2UuanNvbidcbiAgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24pLnZlcnNpb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgLy8gT3V0c2lkZSBvcHRpbWl6YXRpb24gd3JpdGVzIGRpc3QvcGFja2FnZS5qc29uIGJlZm9yZSBEb2NrZXIgYnVpbGRzIHRoZSBhcHAuXG4gICAgLy8gS2VlcCBidWlsZC10aW1lIGRlcGVuZGVuY2llcyBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmV0dXJuIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgY29uc3QgcmVtb3ZlZERlcGVuZGVuY2llcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICByZXR1cm4gcmVtb3ZlZERlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAnb3hmbXQnLFxuICAgICdveGxpbnQnLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZW1vdmVkRGVwcztcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgb3B0aW9uczogeyByZW1vdmVXYlBvc3RpbnN0YWxsOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgKG9wdGlvbnMucmVtb3ZlV2JQb3N0aW5zdGFsbCAmJiBuYW1lID09PSAncG9zdGluc3RhbGwnICYmIGNvbnRlbnQudHJpbSgpID09PSAnd2IgZ2VuLWNvZGUnKSB8fFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwRG9ja2VyQnVpbGRBcnRpZmFjdHMocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBhd2FpdCByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3QpO1xuICAgIGF3YWl0IHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0KTtcbiAgICBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3QpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gW1xuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdCkpLFxuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdCkpLFxuICBdO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgRG9ja2VyIGJ1aWxkIGNhY2hlczonLCByZWxhdGl2ZVBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgZG9ja2VyQnVpbGRDYWNoZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYmJ5KGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucywge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzJywgJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ueWFybicsICcqKi8ueWFybi8qKicsICcqKi8uZ2l0JywgJyoqLy5naXQvKionXSxcbiAgICBvbmx5RmlsZXM6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoKHJlbGF0aXZlUGF0aCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoR3JvdXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoW3JlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0KSwgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCldKTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gcmVtb3ZlZFBhdGhHcm91cHMuZmxhdCgpO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZ2VuZXJhdGVkIGxvY2FsIGRhdGE6JywgcmVtb3ZlZFBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHJlbGF0aXZlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkZWZhdWx0UGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihkaXJOYW1lLCAnbW91bnQnKSk7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRiUGF0aCk7XG4gIGlmIChwYXRoLmJhc2VuYW1lKGFic29sdXRlRGlyUGF0aCkgIT09ICdtb3VudCcgfHwgIWlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgYWJzb2x1dGVEaXJQYXRoKSkge1xuICAgIHJldHVybiBkZWZhdWx0UGF0aHM7XG4gIH1cbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGFic29sdXRlRGlyUGF0aCk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVmYXVsdFBhdGhzLCByZWxhdGl2ZVBhdGhdKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdCksXG4gICAgcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCksXG4gIF0pO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gYXdhaXQgZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0LCBkaXJQYXRoKSkpO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUpKTtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gaXNEaXJlY3RvcnkoZGlyUGF0aCkpKTtcbiAgcmV0dXJuIGRpclBhdGhzLmZpbHRlcigoXywgaW5kZXgpID0+IHJlc3VsdHNbaW5kZXhdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGJGaWxlUGF0aHMgPSBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkYkZpbGVQYXRoIG9mIGRiRmlsZVBhdGhzKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIG9mIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgaXNGaWxlKHRhcmdldFBhdGgpKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICByZW1vdmVkUGF0aHMucHVzaChwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVEYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoIHx8ICFhYnNvbHV0ZURiUGF0aCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpXG4gICAgPyBbZGJQYXRoXVxuICAgIDogW2Fic29sdXRlRGJQYXRoLCAuLi5nZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUsIGRiUGF0aCkpXTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbGVQYXRocyldLmZpbHRlcigoZmlsZVBhdGgpID0+IGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgZmlsZVBhdGgpIHx8IGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMuc29tZSgoZGlyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcnICYmIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBkYkZpbGVQYXRoLFxuICAgIGAke2RiRmlsZVBhdGh9LWpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LXNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0td2FsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LndhbGAsXG4gIF07XG59XG5cbmZ1bmN0aW9uIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdDogUHJvamVjdCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKTtcbiAgLy8gYHN0YXJ0c1dpdGgoJy4uJylgIHdvdWxkIHJlamVjdCBwcm9qZWN0LWxvY2FsIG5hbWVzIHN1Y2ggYXMgYC4uY2FjaGVgLlxuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAocmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3BhdGguc2VwfWApKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhcHJvamVjdC5lbnYuV0JfRE9DS0VSICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJzAnICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJ2ZhbHNlJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChkaXJQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0OiBQcm9qZWN0LCBkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgc3FsaXRlRmlsZU5hbWVzID0gZGlyZW50c1xuICAgIC5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIHNxbGl0ZUZpbGVQYXR0ZXJuLnRlc3QoZGlyZW50Lm5hbWUpKVxuICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuXG4gIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBkaXJQYXRoKTtcbiAgcmV0dXJuIHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBmaWxlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Jhc2gnLCAnY2xlYW51cC5zaCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnYmFzaCcsIFtzY3JpcHRQYXRoLCAnLS1rZWVwLXNjcmlwdHMnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBzY3JpcHRQYXRoKX1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlT3JtLCBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzLCBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsIGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZERyaXp6bGVLaXRDb21tYW5kLCBkcml6emxlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGFsaWFzZXM6IFsnZGInXSxcbiAgZGVzY3JpYmU6XG4gICAgXCJSdW4gZGF0YWJhc2UgY29tbWFuZHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gUHJpc21hLiBEcml6emxlIHByb2plY3RzIHVzZSBkcml6emxlLWtpdC4gRXhhbXBsZTogd2IgcHJpc21hIG1pZ3JhdGUtZGV2IC0tIC0tbmFtZSBpbml0XCIsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5jb21tYW5kKGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGdlbmVyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpc3RCYWNrdXBzQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjbGVhbnVwLWxpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ0NsZWFuIHVwIHRlbXBvcmFsIExpdGVzdHJlYW0gZmlsZXMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgY2xlYW51cC1saXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcvZXRjL2xpdGVzdHJlYW0ueW1sJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXI6IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGlmIChhbGxQcm9qZWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDcmVhdGluZyBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZm9yIG11bHRpcGxlIHByb2plY3RzIGF0IG9uY2UgaXMgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHRoZXkgd291bGQgb3ZlcndyaXRlIGVhY2ggb3RoZXIuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdCwgb3JtLCBhcmd2Lm91dHB1dCk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UnLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmRlcGxveUZvcmNlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBnZW5lcmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZ2VuZXJhdGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIE9STSBjbGllbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBnZW5lcmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmdlbmVyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGNvbmZpZzoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGxpc3RCYWNrdXBzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGlzdC1iYWNrdXBzJyxcbiAgZGVzY3JpYmU6ICdMaXN0IExpdGVzdHJlYW0gYmFja3VwcycsXG4gIGJ1aWxkZXI6IGxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubGlzdEJhY2t1cHMocHJvamVjdCwgYXJndi5jb25maWcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2NoZWNrLWlkZW1wb3RlbmN5Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnUnVuIHRoZSBtaWdyYXRpb24gY29tbWFuZCB0d2ljZSB0byBjb25maXJtIGl0IGlzIGlkZW1wb3RlbnQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBtaWdyYXRlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcjogbWlncmF0ZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydjaGVjay1pZGVtcG90ZW5jeSddKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG9ybVNjcmlwdHMgPSBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bih3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgb3JtU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKHNob3VsZENoZWNrSWRlbXBvdGVuY3kocHJvamVjdCwgYXJndi5jaGVja0lkZW1wb3RlbmN5KSkge1xuICAgICAgICBpZiAoaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQocHJvamVjdCkpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KGBTa2lwcGluZyBpZGVtcG90ZW5jeSBjaGVjayBmb3IgJHtwcm9qZWN0Lm5hbWV9IGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuYCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBvcm1TY3JpcHRzLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0OiBQcm9qZWN0LCBjaGVja0lkZW1wb3RlbmN5OiBib29sZWFuIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGVja0lkZW1wb3RlbmN5ID8/IGlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhcHJvamVjdC5lbnYuV0JfRE9DS0VSICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJzAnICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJ2ZhbHNlJztcbn1cblxuZnVuY3Rpb24gaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Byb2R1Y3Rpb24nKTtcbn1cblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRvIHJlc2V0IHRlc3QgZGF0YWJhc2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuV0JfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHByb2Nlc3MuZW52LldCX0VOViA9ICd0ZXN0JztcbiAgICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgICAgICAgJ1dCX0VOVj10ZXN0IGRiIHJlc2V0JyxcbiAgICAgICAgYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndilcbiAgICAgICkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5saXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifGRyaXp6bGV8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlJyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhcmd2Lm91dHB1dCA/PyBnZXREZWZhdWx0UmVzdG9yZU91dHB1dChwcm9qZWN0LCBvcm0pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0LCBhcmd2LmNvbmZpZyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIGRhdGFiYXNlIHN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTpcbiAgICBcIlBhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byB0aGUgZGV0ZWN0ZWQgT1JNIGFzIGlzLiBBZGRpdGlvbmFsIFByaXNtYSBmbGFncyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgYWZ0ZXIgJy0tJy5cIixcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChgZGIgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBvcm0gPT09ICdwcmlzbWEnID8gYFBSSVNNQSAke2Z1bGxDb21tYW5kfWAgOiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGZ1bGxDb21tYW5kKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bih3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgY29tbWFuZCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogTWFrZSBEcml6emxlIGNvbW1hbmRzIHdvcmsgb24gQ2xvdWRmbGFyZSBEMSBwcm9qZWN0cyBieSBwb2ludGluZyBEQVRBQkFTRV9VUkxcbiAqIGF0IHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtOiBEYXRhYmFzZU9ybSwgcHJvamVjdDogUHJvamVjdCwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3JtID09PSAnZHJpenpsZScgPyB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBzY3JpcHQpIDogc2NyaXB0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0sIGNvbmZpZ1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3QsIG9ybSk7XG4gIGNvbnN0IHJlcXVpcmVkRW52VmFycyA9IHtcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZLFxuICB9IGFzIGNvbnN0O1xuICBjb25zdCBtaXNzaW5nRW52VmFycyA9IE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkRW52VmFycylcbiAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+ICF2YWx1ZSlcbiAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcbiAgaWYgKG1pc3NpbmdFbnZWYXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMaXRlc3RyZWFtOiAke21pc3NpbmdFbnZWYXJzLmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYHNuYXBzaG90OlxuICBpbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gIHJldGVudGlvbjogNzJoICMgS2VlcCBiYWNrdXBzIGZvciAzIGRheXNcbmRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc3luYy1pbnRlcnZhbDogMW1cbmA7XG5cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGxpdGVzdHJlYW1Db25maWcpO1xuICAgIGNvbnNvbGUuaW5mbyhgR2VuZXJhdGVkICR7Y29uZmlnUGF0aH1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgJHtjb25maWdQYXRofTogJHtyZWFzb259YCwge1xuICAgICAgY2F1c2U6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRSZXN0b3JlT3V0cHV0KHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJylcbiAgICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJztcbiAgcmV0dXJuICdkcml6emxlL3Jlc3RvcmVkLnNxbGl0ZTMnO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJykge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcgZm9yIERyaXp6bGUgcmVxdWlyZXMgZmlsZTogREFUQUJBU0VfVVJMLicpO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmludGVyZmFjZSBEYXRhYmFzZU9ybVByb2plY3Qge1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBvcm06IERhdGFiYXNlT3JtO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcm0/OiBEYXRhYmFzZU9ybSk6IFByb21pc2U8RGF0YWJhc2VPcm1Qcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAubWFwKChwcm9qZWN0KSA9PiAocHJvamVjdC5kYXRhYmFzZU9ybSA/IHsgcHJvamVjdCwgb3JtOiBwcm9qZWN0LmRhdGFiYXNlT3JtIH0gOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKHByb2plY3QpOiBwcm9qZWN0IGlzIERhdGFiYXNlT3JtUHJvamVjdCA9PiAhIXByb2plY3QgJiYgKCFvcm0gfHwgcHJvamVjdC5vcm0gPT09IG9ybSkpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQob3JtID8gYE5vICR7b3JtfSBwcm9qZWN0IGZvdW5kLmAgOiAnTm8gc3VwcG9ydGVkIGRhdGFiYXNlIE9STSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtOiBEYXRhYmFzZU9ybSk6IHR5cGVvZiBwcmlzbWFTY3JpcHRzIHwgdHlwZW9mIGRyaXp6bGVTY3JpcHRzIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ3ByaXNtYScgPyBwcmlzbWFTY3JpcHRzIDogZHJpenpsZVNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgcHJvamVjdHM6IERhdGFiYXNlT3JtUHJvamVjdFtdXG4pOiBHZW5lcmF0b3I8RGF0YWJhc2VPcm1Qcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGNvbnN0IG9ybVByb2plY3RCeVByb2plY3QgPSBuZXcgTWFwKHByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gW3Byb2plY3QucHJvamVjdCwgcHJvamVjdF0pKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChcbiAgICBjb21tYW5kTmFtZSxcbiAgICBwcm9qZWN0cy5tYXAoKHsgcHJvamVjdCB9KSA9PiBwcm9qZWN0KVxuICApKSB7XG4gICAgY29uc3Qgb3JtUHJvamVjdCA9IG9ybVByb2plY3RCeVByb2plY3QuZ2V0KHByb2plY3QpO1xuICAgIGlmICghb3JtUHJvamVjdCkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGV0ZWN0IGRhdGFiYXNlIE9STSBmb3IgJHtwcm9qZWN0Lm5hbWV9LmApO1xuXG4gICAgeWllbGQgb3JtUHJvamVjdDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIE9STSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnLS0nLFxuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gQXJyYXkuaXNBcnJheShhcmd2WyctLSddKSA/IGFyZ3ZbJy0tJ10ubWFwKFN0cmluZykgOiBbXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi51bmtub3duT3B0aW9ucywgLi4ucGFzc3Rocm91Z2hBcmdzXSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxudHlwZSBSZWxlYXNlQXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBhcmdzPzogdW5rbm93bltdO1xuICAnLS0nPzogdW5rbm93bltdO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbGVhc2VDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncmVsZWFzZSBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgICdSdW4gc2VtYW50aWMtcmVsZWFzZSAob3IgbXVsdGktc2VtYW50aWMtcmVsZWFzZSkgc28gdGhhdCByZXBvc2l0b3JpZXMgdXNpbmcgQnVuIGlzb2xhdGVkIGluc3RhbGxzIGNhbiBwdWJsaXNoIHRvIG5wbTogJyArXG4gICAgXCJyZWluc3RhbGwgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgKG5wbSBjYW5ub3Qgd2FsayBCdW4ncyBpc29sYXRlZCBub2RlX21vZHVsZXMgbGF5b3V0KSwgXCIgK1xuICAgICdyZXdyaXRlIGB3b3Jrc3BhY2U6YCByYW5nZXMgbnBtIGNhbm5vdCBwYXJzZSwgcnVuIHRoZSByZWxlYXNlLCB0aGVuIHJlc3RvcmUgdGhlIG1vZGlmaWVkIGZpbGVzLiAnICtcbiAgICAnRXh0cmEgYXJndW1lbnRzIChlLmcuIGAtLWRlYnVnYCwgYWZ0ZXIgYC0tYCkgYXJlIGZvcndhcmRlZCB0byB0aGUgcmVsZWFzZSBjb21tYW5kLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT4geWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgcmVsZWFzZShhcmd2IGFzIFJlbGVhc2VBcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxlYXNlKGFyZ3Y6IFJlbGVhc2VBcmd2LCBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgLy8gc2VtYW50aWMtcmVsZWFzZSBtdXN0IHJ1biBhdCB0aGUgcmVwb3NpdG9yeSByb290OiBpdCByZWFkcyB0aGUgZ2l0IHJlcG8gYW5kLCBmb3IgbW9ub3JlcG9zLFxuICAvLyBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIHdhbGtzIHRoZSB3b3Jrc3BhY2VzIGl0c2VsZi5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLnJvb3Q7XG5cbiAgLy8gTWFwcyBhIG11dGF0ZWQgZmlsZSB0byBpdHMgcHJlLXJlbGVhc2UgY29udGVudCAocmF3IGJ5dGVzIOKAlCBidW4ubG9ja2IgaXMgYmluYXJ5KTsgYHVuZGVmaW5lZGBcbiAgLy8gbWFya3MgYSBmaWxlIHRoYXQgZGlkIG5vdCBleGlzdCBhbmQgbXVzdCBiZSBkZWxldGVkIG9uIHJlc3RvcmUgKGUuZy4gYSBjcmVhdGVkIGxvY2tmaWxlKS5cbiAgY29uc3QgbW9kaWZpZWRGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBCdWZmZXIgfCB1bmRlZmluZWQ+KCk7XG4gIC8vIFdpdGggYSBoYW5kbGVyIGluc3RhbGxlZCwgU0lHSU5UL1NJR1RFUk0gbm8gbG9uZ2VyIHRlcm1pbmF0ZSB0aGlzIHByb2Nlc3MsIHNvIHRoZVxuICAvLyBmaW5hbGx5LXJlc3RvcmUgYWx3YXlzIGV4ZWN1dGVzIGFuZCB0aGUgc2lnbmFsIGlzIHJlLXJhaXNlZCBhZnRlcndhcmRzLiBUaGUgaGFuZGxlciBhbHNvXG4gIC8vIEZPUldBUkRTIHRoZSBzaWduYWwgdG8gdGhlIHJ1bm5pbmcgY2hpbGQ6IGNoaWxkcmVuIGFyZSBzcGF3bmVkIGFzeW5jaHJvbm91c2x5IChuZXZlclxuICAvLyBzcGF3blN5bmMsIHdoaWNoIHdvdWxkIGJsb2NrIHRoZSBldmVudCBsb29wIGFuZCBkZWZlciB0aGUgaGFuZGxlciB1bnRpbCBhZnRlciB0aGUgY2hpbGQg4oCUXG4gIC8vIGFuZCBhIHB1Ymxpc2gg4oCUIGNvbXBsZXRlZCksIHNvIGEgc2lnbmFsIHRhcmdldGVkIGF0IHRoaXMgcHJvY2VzcyBhbG9uZSBzdGlsbCBjYW5jZWxzIHRoZVxuICAvLyBjaGlsZCBwcm9tcHRseS5cbiAgbGV0IHJlY2VpdmVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmID0geyBjdXJyZW50OiB1bmRlZmluZWQgfTtcbiAgY29uc3Qgc2lnbmFsSGFuZGxlciA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgcmVjZWl2ZWRTaWduYWwgPSBzaWduYWw7XG4gICAgLy8gdHJlZUtpbGwgKG5vdCBjaGlsZC5raWxsKTogc2VtYW50aWMtcmVsZWFzZSBhbmQgYnVuIGluc3RhbGwgc3Bhd24gdGhlaXIgb3duIHN1YnByb2Nlc3Nlc1xuICAgIC8vIChucG0gcHVibGlzaCwgZ2l0IHB1c2gsIC4uLiksIHdoaWNoIG11c3Qgbm90IGtlZXAgcHVibGlzaGluZyBhZnRlciB3YiByZXBvcnRzIGNhbmNlbGxhdGlvbi5cbiAgICAvLyB0cmVlS2lsbCBUSFJPV1MgKG1pc3NpbmcvdGltaW5nLW91dCBgcHNgLCBFUEVSTSksIGFuZCBhbiBleGNlcHRpb24gZXNjYXBpbmcgYSBzaWduYWxcbiAgICAvLyBsaXN0ZW5lciB3b3VsZCB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MgYW5kIHNraXAgdGhlIHJlc3RvcmluZyBmaW5hbGx5IOKAlCBzbyBkZWdyYWRlIHRvXG4gICAgLy8ga2lsbGluZyB0aGUgZGlyZWN0IGNoaWxkIGluc3RlYWQuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3RpdmVDaGlsZC5jdXJyZW50Py5waWQpIHRyZWVLaWxsKGFjdGl2ZUNoaWxkLmN1cnJlbnQucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHRlcm1pbmF0ZSB0aGUgcmVsZWFzZSBjaGlsZCBwcm9jZXNzIHRyZWU6ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gICAgICBhY3RpdmVDaGlsZC5jdXJyZW50Py5raWxsKHNpZ25hbCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBndWFyZGVkU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9IFsnU0lHSU5UJywgJ1NJR1RFUk0nXTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgZ3VhcmRlZFNpZ25hbHMpIHByb2Nlc3Mub24oc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcblxuICBsZXQgZXhpdENvZGUgPSAwO1xuICBsZXQgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSA9IGZhbHNlO1xuICB0cnkge1xuICAgIGlmIChhd2FpdCByZWxlYXNlUHVibGlzaGVzVG9OcG0ocHJvamVjdCkpIHtcbiAgICAgIGF3YWl0IHByZXBhcmVOcG1Db21wYXRpYmxlTGF5b3V0KHByb2plY3QsIGFyZ3YsIG1vZGlmaWVkRmlsZXMsIGFjdGl2ZUNoaWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGhvaXN0ZWQgcmVpbnN0YWxsIGFuZCB3b3Jrc3BhY2UtcmFuZ2UgcmV3cml0ZSBleGlzdCBzb2xlbHkgc28gbnBtICh3aGljaCB0aGVcbiAgICAgIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBwbHVnaW4gc2hlbGxzIG91dCB0bykgY2FuIGRpZ2VzdCB0aGUgY2hlY2tvdXQ7IHdpdGhvdXQgdGhhdCBwbHVnaW5cbiAgICAgIC8vIHRoZSByZWxlYXNlIHJ1bnMgZGlyZWN0bHkgb24gdGhlIGlzb2xhdGVkIGxheW91dCAoaXNzdWUgIzEwMDApLlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgICdTa2lwcGluZyB0aGUgaG9pc3RlZCByZWluc3RhbGwgYmVjYXVzZSB0aGUgc2VtYW50aWMtcmVsZWFzZSBjb25maWd1cmF0aW9uIGRvZXMgbm90IGluY2x1ZGUgQHNlbWFudGljLXJlbGVhc2UvbnBtLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQSBzaWduYWwgbWF5IGhhdmUgYXJyaXZlZCBiZXR3ZWVuIGNoaWxkcmVuIChub3RoaW5nIHRvIGZvcndhcmQgdG8gYXQgdGhhdCBpbnN0YW50KSwgc28gaXRcbiAgICAvLyBtdXN0IGJlIGNoZWNrZWQgZXhwbGljaXRseSBiZWZvcmUgYW55dGhpbmcgcHVibGlzaGVzLlxuICAgIGlmIChyZWNlaXZlZFNpZ25hbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBYm9ydGVkIGJ5ICR7cmVjZWl2ZWRTaWduYWx9IGJlZm9yZSBydW5uaW5nIHRoZSByZWxlYXNlLmApO1xuICAgIH1cbiAgICBleGl0Q29kZSA9IGF3YWl0IHJ1blNlbWFudGljUmVsZWFzZShwcm9qZWN0LCBhcmd2LCBhY3RpdmVDaGlsZCk7XG4gICAgLy8gUmVjb3JkZWQgc2VwYXJhdGVseSBmcm9tIHJlY2VpdmVkU2lnbmFsOiBhIHNpZ25hbCBhcnJpdmluZyBBRlRFUiBhIHN1Y2Nlc3NmdWwgcHVibGlzaCBtdXN0XG4gICAgLy8gbm90IGRlbW90ZSB0aGUgcmVzdG9yZSB0byBieXRlLWZvci1ieXRlICh0aGF0IHdvdWxkIHJldmVydCB0aGUgcHVibGlzaGVkIHZlcnNpb24gYnVtcHMpLlxuICAgIHJlbGVhc2VSYW5TdWNjZXNzZnVsbHkgPSBleGl0Q29kZSA9PT0gMDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBFcnJvcnMgbXVzdCB1bndpbmQgdGhyb3VnaCB0aGlzIHRyeSAobmV2ZXIgYHByb2Nlc3MuZXhpdGAgaW5zaWRlIGl0KTogdGhlIHJlc3RvcmUgYmVsb3cgaXNcbiAgICAvLyB0aGUgb25seSB0aGluZyB0aGF0IHVuZG9lcyB0aGUgYnVuZmlnL3BhY2thZ2UuanNvbiBtdXRhdGlvbnMuXG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoU3RyaW5nKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IpKSk7XG4gICAgZXhpdENvZGUgPSAxO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIE9uIGZhaWx1cmUgb3IgaW50ZXJydXB0aW9uLCByZXN0b3JlIGJ5dGUtZm9yLWJ5dGU6IHNlbWFudGljLXJlbGVhc2UgbWF5IGhhdmUgbGVmdCBQQVJUSUFMXG4gICAgLy8gZWRpdHMgKGUuZy4gYSB2ZXJzaW9uIGJ1bXAgd2l0aG91dCBhIHB1Ymxpc2gpLCB3aGljaCBtdXN0IG5vdCBzdXJ2aXZlLiBUaGUgc2VtYW50aWNcbiAgICAvLyB3b3Jrc3BhY2UtcmFuZ2UgcmVzdG9yZSBpcyByZXNlcnZlZCBmb3IgYSBzdWNjZXNzZnVsIHJlbGVhc2UuXG4gICAgY29uc3QgcmVzdG9yZWRGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGNvbnRlbnRdIG9mIG1vZGlmaWVkRmlsZXMpIHtcbiAgICAgIGlmIChyZXN0b3JlTW9kaWZpZWRGaWxlKGZpbGVQYXRoLCBjb250ZW50LCByZWxlYXNlUmFuU3VjY2Vzc2Z1bGx5KSkgcmVzdG9yZWRGaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgfVxuICAgIGlmIChyZXN0b3JlZEZpbGVQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oYFJlc3RvcmVkICR7cmVzdG9yZWRGaWxlUGF0aHMubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgcCkpLmpvaW4oJywgJyl9LmApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBUaGUgaGludCBhcHBsaWVzIG9ubHkgd2hlbiB0aGUgaG9pc3RlZCByZWluc3RhbGwgYWN0dWFsbHkgcmFuOyBidW5maWcudG9tbCBpcyBzbmFwc2hvdHRlZFxuICAgIC8vIGV4YWN0bHkgaW4gdGhhdCBicmFuY2guXG4gICAgY29uc3QgcmVpbnN0YWxsZWRXaXRoSG9pc3RlZExpbmtlciA9IFsuLi5tb2RpZmllZEZpbGVzLmtleXMoKV0uc29tZShcbiAgICAgIChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgPT09ICdidW5maWcudG9tbCdcbiAgICApO1xuICAgIGlmIChyZWluc3RhbGxlZFdpdGhIb2lzdGVkTGlua2VyICYmICFpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgJ25vZGVfbW9kdWxlcyBub3cgdXNlcyB0aGUgaG9pc3RlZCBsYXlvdXQ7IHJ1biBhIGNsZWFuIHJlaW5zdGFsbCAoYHJtIC1yZiBub2RlX21vZHVsZXMgcGFja2FnZXMvKi9ub2RlX21vZHVsZXMgJiYgYnVuIGluc3RhbGxgKSB0byByZXN0b3JlIHRoZSBpc29sYXRlZCBsYXlvdXQuJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBndWFyZGVkU2lnbmFscykgcHJvY2Vzcy5vZmYoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgfVxuICBpZiAocmVjZWl2ZWRTaWduYWwpIHtcbiAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHJlY2VpdmVkU2lnbmFsKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQWN0aXZlQ2hpbGRSZWYge1xuICBjdXJyZW50OiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTcGF3biBhc3luY2hyb25vdXNseSBhbmQgYXdhaXQgdGhlIGV4aXQgc3RhdHVzLiBUaGUgZXZlbnQgbG9vcCBzdGF5cyBmcmVlLCBzbyBwYXJlbnQtb25seVxuICogc2lnbmFscyBhcmUgaGFuZGxlZCBwcm9tcHRseSBhbmQgZm9yd2FyZGVkIHRvIHRoZSBjaGlsZCBieSByZWxlYXNlKCkncyBzaWduYWwgaGFuZGxlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3Bhd25BbmRXYWl0KFxuICBhY3RpdmVDaGlsZDogQWN0aXZlQ2hpbGRSZWYsXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IGNoaWxkX3Byb2Nlc3MuU3Bhd25PcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRfcHJvY2Vzcy5zcGF3bihjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcbiAgICBhY3RpdmVDaGlsZC5jdXJyZW50ID0gY2hpbGQ7XG4gICAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBhY3RpdmVDaGlsZC5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcmVzb2x2ZSgxKTtcbiAgICB9KTtcbiAgICBjaGlsZC5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICBhY3RpdmVDaGlsZC5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZShjb2RlID8/IDEpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWxlYXNlIGNhbiBwdWJsaXNoIHRvIG5wbS4gVHJ1ZSB1bmxlc3MgYSBwbHVnaW4gbGlzdCBpcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWRcbiAqIChpbiBhIEpTT04tcGFyc2VhYmxlIHNvdXJjZSkgYW5kIG9taXRzIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIGV2ZXJ5d2hlcmUgaW4gc2NvcGUg4oCUIHRoZSByb290XG4gKiBhbmQsIGZvciBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIG1vbm9yZXBvcywgZWFjaCB3b3Jrc3BhY2UgcGFja2FnZSAoYSBwYWNrYWdlLWxldmVsIHBsdWdpbiBsaXN0XG4gKiBvdmVycmlkZXMgdGhlIHJvb3QncykuIHNlbWFudGljLXJlbGVhc2UncyBERUZBVUxUIHBsdWdpbiBsaXN0IGluY2x1ZGVzIHRoZSBucG0gcGx1Z2luLCBzbyBhXG4gKiBtaXNzaW5nIHBsdWdpbiBsaXN0LCBhIG5vbi1KU09OIGNvbmZpZyBmaWxlLCBvciBhbiBgZXh0ZW5kc2AgcHJlc2V0IGNvbnNlcnZhdGl2ZWx5IGtlZXBzIHRoZVxuICogbnBtIHByZXBhcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVsZWFzZVB1Ymxpc2hlc1RvTnBtKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJz4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgcm9vdFBsdWdpbnMgPSByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zKHByb2plY3QuZGlyUGF0aCwgcHJvamVjdC5wYWNrYWdlSnNvbik7XG4gIC8vIFdpdGhvdXQgYW4gZXhwbGljaXQgcm9vdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCAobnBtIGluY2x1ZGVkKSBhcHBsaWVzLlxuICBpZiAoIUFycmF5LmlzQXJyYXkocm9vdFBsdWdpbnMpIHx8IHBsdWdpbnNJbmNsdWRlTnBtKHJvb3RQbHVnaW5zKSkgcmV0dXJuIHRydWU7XG5cbiAgZm9yIChjb25zdCBwYWNrYWdlRGlyUGF0aCBvZiBhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocHJvamVjdCkpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyhwYWNrYWdlRGlyUGF0aCwgdW5kZWZpbmVkKTtcbiAgICAvLyBBIHdvcmtzcGFjZSBwYWNrYWdlIHdpdGhvdXQgaXRzIG93biBwbHVnaW4gbGlzdCBpbmhlcml0cyB0aGUgcm9vdCdzIChucG0tZnJlZSkgZGVjaXNpb24uXG4gICAgaWYgKHBsdWdpbnMgPT09ICd1bmtub3duJyB8fCAoQXJyYXkuaXNBcnJheShwbHVnaW5zKSAmJiBwbHVnaW5zSW5jbHVkZU5wbShwbHVnaW5zKSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGx1Z2luc0luY2x1ZGVOcG0ocGx1Z2luczogcmVhZG9ubHkgdW5rbm93bltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBwbHVnaW5zLnNvbWUoKHBsdWdpbikgPT4gKEFycmF5LmlzQXJyYXkocGx1Z2luKSA/IHBsdWdpblswXSA6IHBsdWdpbikgPT09ICdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKTtcbn1cblxuLyoqXG4gKiBjb3NtaWNvbmZpZyA5J3MgZGVmYXVsdCBzZWFyY2hQbGFjZXMgb3JkZXIgZm9yIG1vZHVsZSBcInJlbGVhc2VcIiAod2hhdCBzZW1hbnRpYy1yZWxlYXNlIDI1XG4gKiBkZWxlZ2F0ZXMgdG8pLCBtaW51cyB0aGUgbGVhZGluZyBwYWNrYWdlLmpzb24gZW50cnksIHdoaWNoIHRoZSBjYWxsZXIgY2hlY2tzIGZpcnN0LiBUaGUgRklSU1RcbiAqIGV4aXN0aW5nIHBsYWNlIHdpbnM7IHBsYWNlcyB3aG9zZSBmb3JtYXQgSlNPTi5wYXJzZSBjYW5ub3QgcmVhZCBtYWtlIHRoZSBlZmZlY3RpdmUgcGx1Z2luXG4gKiBsaXN0ICd1bmtub3duJy5cbiAqL1xuY29uc3Qgc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzOiB7IGZpbGVOYW1lOiBzdHJpbmc7IGpzb25QYXJzZWFibGU6IGJvb2xlYW4gfVtdID0gW1xuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYycsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnltbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5tanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5janMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy5qc29uJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLmNqcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy50cycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5tanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcuY2pzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbl07XG5cbmZ1bmN0aW9uIHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkXG4pOiByZWFkb25seSB1bmtub3duW10gfCB1bmRlZmluZWQgfCAndW5rbm93bicge1xuICAvLyBjb3NtaWNvbmZpZyBzZWFyY2hlcyBwYWNrYWdlLmpzb24ncyBgcmVsZWFzZWAga2V5IEJFRk9SRSBhbnkgcmMvY29uZmlnIGZpbGU7IGEgbWlzc2luZyBvclxuICAvLyB1bnJlYWRhYmxlIHBhY2thZ2UuanNvbiBqdXN0IGZhbGxzIHRocm91Z2ggdG8gdGhlIGZpbGUgc2VhcmNoIHBsYWNlcy5cbiAgaWYgKHBhY2thZ2VKc29uID09PSB1bmRlZmluZWQpIHtcbiAgICB0cnkge1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHBhY2thZ2VKc29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICBsZXQgY29uZmlnID0gKHBhY2thZ2VKc29uIGFzIHsgcmVsZWFzZT86IHsgcGx1Z2lucz86IHVua25vd247IGV4dGVuZHM/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlbGVhc2U7XG4gIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgeyBmaWxlTmFtZSwganNvblBhcnNlYWJsZSB9IG9mIHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlcykge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFqc29uUGFyc2VhYmxlKSByZXR1cm4gJ3Vua25vd24nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSkgYXMgdHlwZW9mIGNvbmZpZztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcucGx1Z2lucykpIHJldHVybiBjb25maWcucGx1Z2lucztcbiAgLy8gQW4gYGV4dGVuZHNgIHByZXNldCBtYXkgY29udHJpYnV0ZSBpdHMgb3duIHBsdWdpbiBsaXN0LCB3aGljaCBjYW5ub3QgYmUgcmVzb2x2ZWQgc3RhdGljYWxseS5cbiAgcmV0dXJuIGNvbmZpZy5leHRlbmRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAndW5rbm93bic7XG59XG5cbi8qKlxuICogTWFrZSB0aGUgY2hlY2tvdXQgZGlnZXN0aWJsZSBmb3IgbnBtLCB3aGljaCBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvIGZvclxuICogYG5wbSB2ZXJzaW9uYCAvIGBucG0gcHVibGlzaGA6XG4gKiAxLiBucG0ncyBhcmJvcmlzdCBjYW5ub3Qgd2FsayBCdW4ncyBJU09MQVRFRCBub2RlX21vZHVsZXMgbGF5b3V0ICh0aGUgYC5idW5gIHN5bWxpbmsgZmFybSksIHNvXG4gKiAgICBjbGVhbi1yZWluc3RhbGwgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgZmlyc3QuIEEgbm9uLWNsZWFuIGxpbmtlciBzd2l0Y2ggd291bGQgbGVhdmUgc3RhbGVcbiAqICAgIGdsb2JhbC1zdG9yZSBzeW1saW5rcyBiZWhpbmQgKHBhY2thZ2VzIHRoZW4gcmVzb2x2ZSBmcm9tIH4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzIHdoZXJlXG4gKiAgICBwaGFudG9tIGRlcGVuZGVuY2llcyBhcmUgdW5yZWFjaGFibGUpLCBzbyBldmVyeSBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGlzIHdpcGVkIGZpcnN0LlxuICogMi4gbnBtIGNhbm5vdCBwYXJzZSBgd29ya3NwYWNlOmAgc3BlY2lmaWVycywgd2hpbGUgQnVuIFJFUVVJUkVTIHRoZSBwcm90b2NvbCBzbyBhIGNvbGQgaW5zdGFsbFxuICogICAgbGlua3MgdGhlIHdvcmtzcGFjZSDigJQgc28gcmV3cml0ZSB0aGUgcmFuZ2VzIHRvIGAqYCBBRlRFUiB0aGUgcmVpbnN0YWxsIChCdW4gbXVzdCBzdGlsbCBzZWVcbiAqICAgIHRoZSBwcm90b2NvbCB3aGlsZSBpbnN0YWxsaW5nOyBucG0gb25seSBuZWVkcyB0aGUgbWFuaWZlc3QgVEVYVCB0byBiZSBwYXJzZWFibGUpLiBUaGVcbiAqICAgIGFmZmVjdGVkIG1hbmlmZXN0cyBhcmUgcHJpdmF0ZS91bnB1Ymxpc2hlZCBvciByZXdyaXR0ZW4gYnkgdGhlIG5wbSBwbHVnaW4gb24gcHVibGlzaC5cbiAqIEFsbCBtdXRhdGlvbnMgYXJlIHJlc3RvcmVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdGhlIHJlbGVhc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVOcG1Db21wYXRpYmxlTGF5b3V0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBSZWxlYXNlQXJndixcbiAgbW9kaWZpZWRGaWxlczogTWFwPHN0cmluZywgQnVmZmVyIHwgdW5kZWZpbmVkPixcbiAgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYnVuZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICBjb25zdCBidW5maWcgPSBmcy5leGlzdHNTeW5jKGJ1bmZpZ1BhdGgpID8gZnMucmVhZEZpbGVTeW5jKGJ1bmZpZ1BhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhvaXN0ZWRCdW5maWcgPSBidW5maWcgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJ1aWxkSG9pc3RlZEJ1bmZpZyhidW5maWcpO1xuICBpZiAoYnVuZmlnICE9PSB1bmRlZmluZWQgJiYgaG9pc3RlZEJ1bmZpZyAhPT0gYnVuZmlnKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oJ0NsZWFuLXJlaW5zdGFsbGluZyB3aXRoIHRoZSBob2lzdGVkIGxpbmtlciBzbyBucG0gY2FuIHdhbGsgbm9kZV9tb2R1bGVzLi4uJykpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KGJ1bmZpZ1BhdGgsIEJ1ZmZlci5mcm9tKGJ1bmZpZywgJ3V0ZjgnKSk7XG4gICAgICAvLyBUaGUgaG9pc3RlZCByZWluc3RhbGwgbWF5IHJld3JpdGUgKG9yIGNyZWF0ZSkgdGhlIGxvY2tmaWxlOyBzbmFwc2hvdCB0aGUgcmF3IGJ5dGVzIHNvIGFcbiAgICAgIC8vIHN1Y2Nlc3NmdWwgcmVsZWFzZSBsZWF2ZXMgbm8gdHJhY2tlZCBvciB1bnRyYWNrZWQgbG9ja2ZpbGUgY2hhbmdlcyBiZWhpbmQuXG4gICAgICBmb3IgKGNvbnN0IGxvY2tGaWxlTmFtZSBvZiBbJ2J1bi5sb2NrJywgJ2J1bi5sb2NrYiddKSB7XG4gICAgICAgIGNvbnN0IGxvY2tGaWxlUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGxvY2tGaWxlTmFtZSk7XG4gICAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KGxvY2tGaWxlUGF0aCwgZnMuZXhpc3RzU3luYyhsb2NrRmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGxvY2tGaWxlUGF0aCkgOiB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhidW5maWdQYXRoLCBob2lzdGVkQnVuZmlnID8/ICcnLCAndXRmOCcpO1xuICAgICAgY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRocyA9IFtwcm9qZWN0LmRpclBhdGgsIC4uLihhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocHJvamVjdCkpXS5tYXAoKGRpclBhdGgpID0+XG4gICAgICAgIHBhdGguam9pbihkaXJQYXRoLCAnbm9kZV9tb2R1bGVzJylcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aCBvZiBub2RlTW9kdWxlc0RpclBhdGhzKSB7XG4gICAgICAgIGZzLnJtU3luYyhub2RlTW9kdWxlc0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFJlc29sdmUgYW5kIGRvd25sb2FkIHdpdGggbGlmZWN5Y2xlIHNjcmlwdHMgRElTQUJMRUQgd2hpbGUgdGhlIHJlbGVhc2UgY3JlZGVudGlhbHNcbiAgICAgIC8vIChWRVJEQUNDSU9fVE9LRU4sIE5QTV9UT0tFTiwgR0lUSFVCX1RPS0VOLCBGTk9YX0FHRV9LRVksIC4uLikgYXJlIGluIHRoZSBlbnZpcm9ubWVudCxcbiAgICAgIC8vIHNvIHJlcG9zaXRvcnktIG9yIGRlcGVuZGVuY3ktZGVmaW5lZCBwcmVpbnN0YWxsL3Bvc3RpbnN0YWxsIGNhbiBuZXZlciByZWFkIHRoZW0g4oCUXG4gICAgICAvLyBtaXJyb3JpbmcgcmV1c2FibGUtd29ya2Zsb3dzJyB0d28tc3RlcCByZWxlYXNlIGluc3RhbGwgKGlzc3VlICMxMDAzKS5cbiAgICAgIGNvbnN0IGluc3RhbGxTdGF0dXMgPSBhd2FpdCBzcGF3bkFuZFdhaXQoYWN0aXZlQ2hpbGQsICdidW4nLCBbJ2luc3RhbGwnLCAnLS1pZ25vcmUtc2NyaXB0cyddLCB7XG4gICAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBpZiAoaW5zdGFsbFN0YXR1cyAhPT0gMCkge1xuICAgICAgICAvLyBUaHJvd2luZyAoaW5zdGVhZCBvZiBwcm9jZXNzLmV4aXQsIHdoaWNoIHdvdWxkIHNraXAgdGhlIGNhbGxlcidzIGZpbmFsbHkpIGxldHMgdGhlXG4gICAgICAgIC8vIHJlc3RvcmUgcnVuIGJlZm9yZSB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1biBpbnN0YWxsIGZhaWxlZCB3aGlsZSBwcmVwYXJpbmcgdGhlIHJlbGVhc2UuJyk7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYXkgdGhlIHNraXBwZWQgbGlmZWN5Y2xlIHNjcmlwdHMgaW4gYSBjcmVkZW50aWFsLXNjcnViYmVkIGVudmlyb25tZW50LiBBIHJlcGVhdGVkXG4gICAgICAvLyBgYnVuIGluc3RhbGxgIGlzIGEgbm8tb3AgdGhhdCBkb2VzIG5vdCByZXBsYXkgdGhlbSwgc28gbm9kZV9tb2R1bGVzIGlzIHdpcGVkIGFnYWluO1xuICAgICAgLy8gZXZlcnkgcGFja2FnZSBpcyBhbHJlYWR5IGluIGJ1bidzIGNhY2hlIGZyb20gdGhlIGNyZWRlbnRpYWxlZCBzdGVwLCBzbyB0aGlzIHJlLWxpbmtcbiAgICAgIC8vIG5lZWRzIG5vIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLlxuICAgICAgZm9yIChjb25zdCBub2RlTW9kdWxlc0RpclBhdGggb2Ygbm9kZU1vZHVsZXNEaXJQYXRocykge1xuICAgICAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXBsYXlTdGF0dXMgPSBhd2FpdCBzcGF3bkFuZFdhaXQoYWN0aXZlQ2hpbGQsICdidW4nLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgZW52OiBidWlsZENyZWRlbnRpYWxGcmVlRW52KHByb2plY3QuZW52KSxcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcGxheVN0YXR1cyAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1biBpbnN0YWxsIGZhaWxlZCB3aGlsZSByZXBsYXlpbmcgbGlmZWN5Y2xlIHNjcmlwdHMgZm9yIHRoZSByZWxlYXNlLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHdvcmtzcGFjZVBhY2thZ2VEaXJzID0gYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBbXG4gICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGgsXG4gICAgLi4ud29ya3NwYWNlUGFja2FnZURpcnMubWFwKChkaXJQYXRoKSA9PiBwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgXSkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG9yaWdpbmFsID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBTbmFwc2hvdCBFVkVSWSBtYW5pZmVzdCAobm90IG9ubHkgcmV3cml0dGVuIG9uZXMpOiBzZW1hbnRpYy1yZWxlYXNlIGFsc28gZWRpdHMgbWFuaWZlc3RzXG4gICAgLy8gd2l0aG91dCB3b3Jrc3BhY2U6IHJhbmdlcyAodmVyc2lvbiBidW1wcyksIGFuZCBhIGZhaWxlZCByZWxlYXNlIG11c3QgcmVzdG9yZSB0aG9zZSB0b28uXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgbW9kaWZpZWRGaWxlcy5zZXQocGFja2FnZUpzb25QYXRoLCBCdWZmZXIuZnJvbShvcmlnaW5hbCwgJ3V0ZjgnKSk7XG4gICAgfVxuICAgIGNvbnN0IHJld3JpdHRlbiA9IHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMob3JpZ2luYWwpO1xuICAgIGlmIChyZXdyaXR0ZW4gPT09IG9yaWdpbmFsKSBjb250aW51ZTtcblxuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSZXdyaXRpbmcgd29ya3NwYWNlOiByYW5nZXMgaW4gJHtwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKX0uLi5gKSk7XG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIHJld3JpdHRlbiwgJ3V0ZjgnKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIGNyZWRlbnRpYWxzIHRoZSByZWxlYXNlIHdvcmtmbG93IGluamVjdHMgKGNmLiByZXVzYWJsZS13b3JrZmxvd3MnIHJlbGVhc2UueW1sIHNlY3JldHMgYW5kXG4vLyBucG0ncyBvd24gdG9rZW4gdmFyaWFibGVzKS4gVGhlIHJlbGVhc2UgY29tbWFuZCBsb2FkcyB0aGUgcHJvamVjdCB3aXRoIGxvYWRFbnY6IGZhbHNlLCBzbyBub1xuLy8gd2ItbG9hZGVyLWluamVjdGVkIGtleXMgZXhpc3QgdG8gc2NydWIgYmV5b25kIHRoZXNlLiBBIGRlbnlsaXN0IChub3QgYW4gYWxsb3dsaXN0KSBpc1xuLy8gZGVsaWJlcmF0ZTogaW4gdGhlIHN1cHBvcnRlZCBlbnRyeSBwb2ludCDigJQgcmV1c2FibGUtd29ya2Zsb3dzJyByZWxlYXNlIGpvYiDigJQgdGhlc2UgZW51bWVyYXRlZFxuLy8gdmFyaWFibGVzIGFyZSB0aGUgT05MWSBzZWNyZXRzIGluIHRoZSBhbWJpZW50IGVudmlyb25tZW50IChmbm94IHNlY3JldHMgc3RheSBlbmNyeXB0ZWQgYmVjYXVzZVxuLy8gRk5PWF9BR0VfS0VZIGlzIHNjcnViYmVkIGFuZCBuZXZlciBleHBvcnRlZCBhcyBwbGFpbnRleHQgdGhlcmUpLCB3aGlsZSBhbiBhbGxvd2xpc3Qgd291bGRcbi8vIGJyZWFrIGxpZmVjeWNsZSBzY3JpcHRzIHRoYXQgbGVnaXRpbWF0ZWx5IHJlYWQgb3BlcmF0aW9uYWwgdmFyaWFibGVzIChQQVRILCBIT01FLCBDSSwgLi4uKS5cbi8vIEEgbG9jYWwgYHdiIHJlbGVhc2VgIGluaGVyaXRzIHdoYXRldmVyIHRoZSBkZXZlbG9wZXIncyBzaGVsbCBhbHJlYWR5IGV4cG9zZXMgdG8gZXZlcnlcbi8vIGBidW4gaW5zdGFsbGAsIHdoaWNoIHRoaXMgcmVwbGF5IGRvZXMgbm90IHdpZGVuLlxuY29uc3QgY3JlZGVudGlhbEVudlZhck5hbWVzID0gW1xuICAnVkVSREFDQ0lPX1RPS0VOJyxcbiAgJ05QTV9UT0tFTicsXG4gICdOT0RFX0FVVEhfVE9LRU4nLFxuICAnR0lUSFVCX1RPS0VOJyxcbiAgJ0dIX1RPS0VOJyxcbiAgJ0dIX1BBQ0tBR0VTX1RPS0VOJyxcbiAgJ0dIX1BLR19SRUFEX1RPS0VOJyxcbiAgJ0ZOT1hfQUdFX0tFWScsXG5dO1xuXG4vKipcbiAqIEEgY29weSBvZiBgZW52YCBzYWZlIHRvIGV4cG9zZSB0byBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzLiBDcmVkZW50aWFsIHZhcmlhYmxlcyBhcmVcbiAqIEVNUFRJRUQgcmF0aGVyIHRoYW4gZGVsZXRlZCBzbyBgJHtWRVJEQUNDSU9fVE9LRU59YC1zdHlsZSByZWZlcmVuY2VzIGluIC5ucG1yYyBrZWVwIGV4cGFuZGluZ1xuICogdG8gJycgaW5zdGVhZCBvZiBjcmFzaGluZyB0aGUgaW5zdGFsbCAodGhlIHBhdHRlcm4gcmV1c2FibGUtd29ya2Zsb3dzIHJlbGllcyBvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENyZWRlbnRpYWxGcmVlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzY3J1YmJlZEVudiA9IHsgLi4uZW52IH07XG4gIGZvciAoY29uc3QgbmFtZSBvZiBjcmVkZW50aWFsRW52VmFyTmFtZXMpIHtcbiAgICBpZiAobmFtZSBpbiBzY3J1YmJlZEVudikgc2NydWJiZWRFbnZbbmFtZV0gPSAnJztcbiAgfVxuICByZXR1cm4gc2NydWJiZWRFbnY7XG59XG5cbi8qKlxuICogVW5kbyB0aGUgdGVtcG9yYXJ5IHJlbGVhc2UtdGltZSBtdXRhdGlvbnMgb2Ygb25lIGZpbGUuIGBwYWNrYWdlLmpzb25gIGZpbGVzIGFyZSByZXN0b3JlZFxuICogc2VtYW50aWNhbGx5IGluc3RlYWQgb2YgYnl0ZS1mb3ItYnl0ZTogc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gd3JpdGVzIHRoZSByZWxlYXNlZFxuICogdmVyc2lvbiBpbnRvIG1hbmlmZXN0cyB3aGlsZSB0aGV5IGhvbGQgdGhlIHJld3JpdHRlbiByYW5nZXMsIGFuZCBhIGJ5dGUgcmVzdG9yZSB3b3VsZCBzaWxlbnRseVxuICogcmV2ZXJ0IHRoYXQgYnVtcCDigJQgc28gd2hlbiB0aGUgZmlsZSBjaGFuZ2VkIGR1cmluZyB0aGUgcmVsZWFzZSwgb25seSB0aGUgYHdvcmtzcGFjZTpgXG4gKiBzcGVjaWZpZXJzIGFyZSB3cml0dGVuIGJhY2sgaW50byB0aGUgQ1VSUkVOVCBjb250ZW50LlxuICovXG4vKiogUmV0dXJucyB3aGV0aGVyIHRoZSBvbi1kaXNrIGNvbnRlbnQgYWN0dWFsbHkgY2hhbmdlZCAoZHJpdmVzIHRoZSBcIlJlc3RvcmVkIC4uLlwiIG1lc3NhZ2UpLiAqL1xuZnVuY3Rpb24gcmVzdG9yZU1vZGlmaWVkRmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgb3JpZ2luYWxDb250ZW50OiBCdWZmZXIgfCB1bmRlZmluZWQsXG4gIHJlbGVhc2VTdWNjZWVkZWQ6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICBpZiAob3JpZ2luYWxDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBleGlzdGVkID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIHJldHVybiBleGlzdGVkO1xuICB9XG4gIGlmIChyZWxlYXNlU3VjY2VlZGVkICYmIHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpID09PSAncGFja2FnZS5qc29uJyAmJiBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IG9yaWdpbmFsQ29udGVudC50b1N0cmluZygndXRmOCcpO1xuICAgIGlmIChjdXJyZW50Q29udGVudCAhPT0gcmV3cml0ZVdvcmtzcGFjZVJhbmdlcyhvcmlnaW5hbFRleHQpKSB7XG4gICAgICBjb25zdCByZXN0b3JlZENvbnRlbnQgPSByZXN0b3JlV29ya3NwYWNlUmFuZ2VzKGN1cnJlbnRDb250ZW50LCBvcmlnaW5hbFRleHQpO1xuICAgICAgaWYgKHJlc3RvcmVkQ29udGVudCA9PT0gY3VycmVudENvbnRlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIHJlc3RvcmVkQ29udGVudCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBjdXJyZW50QnVmZmVyID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgpIDogdW5kZWZpbmVkO1xuICBpZiAoY3VycmVudEJ1ZmZlcj8uZXF1YWxzKG9yaWdpbmFsQ29udGVudCkpIHJldHVybiBmYWxzZTtcbiAgLy8gV3JpdGUgdGhlIHNuYXBzaG90IGJ5dGVzIHZlcmJhdGltOiBidW4ubG9ja2IgaXMgYmluYXJ5LCBzbyBhbnkgdGV4dCBkZWNvZGUvZW5jb2RlIHJvdW5kIHRyaXBcbiAgLy8gd291bGQgY29ycnVwdCBpdC5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgb3JpZ2luYWxDb250ZW50KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEhvaXN0ZWRCdW5maWcoYnVuZmlnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVuZmlnXG4gICAgLnJlcGxhY2UoL14oXFxzKmxpbmtlclxccyo9XFxzKilbXCInXWlzb2xhdGVkW1wiJ10vbXUsICckMVwiaG9pc3RlZFwiJylcbiAgICAucmVwbGFjZSgvXlxccypnbG9iYWxTdG9yZVxccyo9XFxzKnRydWVbXlxcbl0qXFxuPy9tdSwgJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV3cml0ZVdvcmtzcGFjZVJhbmdlcyhwYWNrYWdlSnNvbkNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE9wZXJhdGUgb25seSBpbnNpZGUgdGhlIGRlcGVuZGVuY3kgc2VjdGlvbnM6IGEgYmxhbmtldCBgXCJ3b3Jrc3BhY2U6Li4uXCJgIHJlcGxhY2VtZW50IHdvdWxkXG4gIC8vIGFsc28gY29ycnVwdCB1bnJlbGF0ZWQgc3RyaW5nIHZhbHVlcyAoZS5nLiBhIGRlc2NyaXB0aW9uIHN0YXJ0aW5nIHdpdGggYHdvcmtzcGFjZTpgKSwgYW5kIGFcbiAgLy8gbmFtZS1rZXllZCBnbG9iYWwgcmVwbGFjZW1lbnQgd291bGQgdG91Y2ggc2FtZS1uYW1lZCBrZXlzIGluIG90aGVyIHNlY3Rpb25zIChlLmcuIG92ZXJyaWRlcykuXG4gIHJldHVybiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMocGFja2FnZUpzb25Db250ZW50LCAoc2VjdGlvbikgPT5cbiAgICBzZWN0aW9uLnJlcGxhY2VBbGwoLyhcIlteXCJcXG5dK1wiXFxzKjpcXHMqKVwid29ya3NwYWNlOlteXCJdKlwiL2d1LCAnJDFcIipcIicpXG4gICk7XG59XG5cbi8qKlxuICogUmUtYXBwbHkgdGhlIG9yaWdpbmFsIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXJzIHRvIHRoZSBDVVJSRU5UIG1hbmlmZXN0IGNvbnRlbnQuIE1hdGNoaW5nIGtleXNcbiAqIG9mZiB0aGUgZGVwZW5kZW5jeSBOQU1FIChub3QgdGhlIGBcIipcImAgcGxhY2Vob2xkZXIpIGlzIGRlbGliZXJhdGU6IG11bHRpLXNlbWFudGljLXJlbGVhc2Unc1xuICogcHJlcGFyZSBzdGVwIG92ZXJ3cml0ZXMgbG9jYWwgZGVwZW5kZW5jeSBzcGVjaWZpZXJzIHdpdGggY29uY3JldGUgcmVsZWFzZWQgdmVyc2lvbnMsIGFuZCB0aGVcbiAqIGNvbW1pdHRlZCBtYW5pZmVzdCBtdXN0IGdldCBpdHMgYHdvcmtzcGFjZTpgIHByb3RvY29sIGJhY2sgcmVnYXJkbGVzcyDigJQgQnVuIHJlcXVpcmVzIHRoZVxuICogcHJvdG9jb2wgc28gYSBjb2xkIGluc3RhbGwgbGlua3MgdGhlIHdvcmtzcGFjZSBpbnN0ZWFkIG9mIHJlc29sdmluZyBhIHJlZ2lzdHJ5IGNvcHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlV29ya3NwYWNlUmFuZ2VzKGN1cnJlbnRDb250ZW50OiBzdHJpbmcsIG9yaWdpbmFsQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29ya3NwYWNlRGVwZW5kZW5jaWVzID0gY29sbGVjdFdvcmtzcGFjZURlcGVuZGVuY2llcyhvcmlnaW5hbENvbnRlbnQpO1xuICAvLyBSZXN0b3JlIHBlciAoc2VjdGlvbiwgbmFtZSk6IGEgc2FtZS1uYW1lZCBkZXBlbmRlbmN5IGluIGFub3RoZXIgc2VjdGlvbiBtYXkgbGVnaXRpbWF0ZWx5XG4gIC8vIGhvbGQgYSBub24td29ya3NwYWNlIHJhbmdlIChlLmcuIGEgcGVlckRlcGVuZGVuY2llcyBgPj0xLjAuMGAgbmV4dCB0byBhIGRldkRlcGVuZGVuY2llc1xuICAvLyBgd29ya3NwYWNlOipgKSBvciBhIGRpZmZlcmVudCB3b3Jrc3BhY2UgcmFuZ2UsIGFuZCBtdXN0IGtlZXAgaXRzIG93biB2YWx1ZS5cbiAgcmV0dXJuIHJlcGxhY2VJbkRlcGVuZGVuY3lTZWN0aW9ucyhjdXJyZW50Q29udGVudCwgKHNlY3Rpb24sIHNlY3Rpb25LZXkpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gc2VjdGlvbjtcbiAgICBmb3IgKGNvbnN0IHsgc2VjdGlvbjogZGVwZW5kZW5jeVNlY3Rpb24sIG5hbWUsIHNwZWNpZmllciB9IG9mIHdvcmtzcGFjZURlcGVuZGVuY2llcykge1xuICAgICAgaWYgKGRlcGVuZGVuY3lTZWN0aW9uICE9PSBzZWN0aW9uS2V5KSBjb250aW51ZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlQWxsKFxuICAgICAgICBuZXcgUmVnRXhwKGAoXCIke2VzY2FwZVJlZ0V4cChuYW1lKX1cIlxcXFxzKjpcXFxccyopXCJbXlwiXSpcImAsICdndScpLFxuICAgICAgICAvLyBBIHJlcGxhY2VyIGZ1bmN0aW9uLCBub3QgYSByZXBsYWNlbWVudCBzdHJpbmc6IHNwZWNpZmllcnMgY29udGFpbmluZyBgJGAgbXVzdCBiZVxuICAgICAgICAvLyBpbnNlcnRlZCBsaXRlcmFsbHkgaW5zdGVhZCBvZiBiZWluZyBpbnRlcnByZXRlZCBhcyBzdWJzdGl0dXRpb24gcGF0dGVybnMuXG4gICAgICAgIChfbWF0Y2gsIHByZWZpeDogc3RyaW5nKSA9PiBgJHtwcmVmaXh9JHtKU09OLnN0cmluZ2lmeShzcGVjaWZpZXIpfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG4vKiogRGVwZW5kZW5jeSBzZWN0aW9ucyBjb250YWluIG9ubHkgYFwibmFtZVwiOiBcInNwZWNpZmllclwiYCBzdHJpbmcgcGFpcnMsIHNvIGBbXnt9XSpgIHNwYW5zIHRoZW0uICovXG5mdW5jdGlvbiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgcmVwbGFjZVNlY3Rpb246IChzZWN0aW9uOiBzdHJpbmcsIHNlY3Rpb25LZXk6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKFxuICAgIC8oXCIoZGVwZW5kZW5jaWVzfGRldkRlcGVuZGVuY2llc3xvcHRpb25hbERlcGVuZGVuY2llc3xwZWVyRGVwZW5kZW5jaWVzKVwiXFxzKjpcXHMqXFx7KShbXnt9XSopKFxcfSkvZ3UsXG4gICAgKF9tYXRjaCwgcHJlZml4OiBzdHJpbmcsIHNlY3Rpb25LZXk6IHN0cmluZywgYm9keTogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykgPT5cbiAgICAgIGAke3ByZWZpeH0ke3JlcGxhY2VTZWN0aW9uKGJvZHksIHNlY3Rpb25LZXkpfSR7c3VmZml4fWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFdvcmtzcGFjZURlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25Db250ZW50OiBzdHJpbmdcbik6IHsgc2VjdGlvbjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNwZWNpZmllcjogc3RyaW5nIH1bXSB7XG4gIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb247XG4gIHRyeSB7XG4gICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudCkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmNpZXM6IHsgc2VjdGlvbjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNwZWNpZmllcjogc3RyaW5nIH1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0KSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VKc29uW2tleV0gPz8ge30pKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goeyBzZWN0aW9uOiBrZXksIG5hbWUsIHNwZWNpZmllcjogdmFsdWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bJCgpKisuP1tcXFxcXFxdXnt8fV0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlbWFudGljUmVsZWFzZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBSZWxlYXNlQXJndiwgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgZm9yd2FyZGVkQXJncyA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXS5tYXAoU3RyaW5nKTtcbiAgLy8gVGhlIFBBQ0tBR0UgbmFtZSAoZm9yIGBidW54YC9geWFybiBkbHhgLCB3aGljaCBmZXRjaCBhIHBhY2thZ2UpIGFuZCB0aGUgQklOIG5hbWUgKGZvciB0aGVcbiAgLy8gbG9jYWwgbm9kZV9tb2R1bGVzLy5iaW4gbG9va3VwKSBkaWZmZXIgZm9yIHRoZSBzY29wZWQgZm9ya3M6IGBidW54IG11bHRpLXNlbWFudGljLXJlbGVhc2VgXG4gIC8vIHdvdWxkIGZldGNoIHRoZSB1bnJlbGF0ZWQgdW5zY29wZWQgbnBtIHBhY2thZ2UgaW5zdGVhZCBvZiBlLmcuIEBhbm9saWxhYidzIGZvcmsuXG4gIGNvbnN0IHJlbGVhc2VQYWNrYWdlTmFtZSA9IChcbiAgICBbJ0Bhbm9saWxhYi9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJywgJ211bHRpLXNlbWFudGljLXJlbGVhc2UnLCAnQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddIGFzIGNvbnN0XG4gICkuZmluZCgocGFja2FnZU5hbWUpID0+IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdKTtcbiAgY29uc3QgcmVsZWFzZUJpbiA9IHJlbGVhc2VQYWNrYWdlTmFtZSA/ICdtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJyA6ICdzZW1hbnRpYy1yZWxlYXNlJztcblxuICAvLyBUaGUgcHJvamVjdCBpcyBsb2FkZWQgd2l0aCBsb2FkRW52OiBmYWxzZSAoc2VtYW50aWMtcmVsZWFzZSBydW5zIHdpdGggdGhlIGFtYmllbnQvQ0lcbiAgLy8gZW52aXJvbm1lbnQgYnkgZGVzaWduKSwgc28gcHJvamVjdC5lbnYgYWxpYXNlcyBwcm9jZXNzLmVudiBoZXJlOyB1c2luZyBpdCBrZWVwcyB0aGVcbiAgLy8gcHJvamVjdC5lbnYgY29udmVudGlvbiBhbmQgcGlja3MgdXAgZW52IGxvYWRpbmcgaWYgdGhhdCBkZXNpZ24gZXZlciBjaGFuZ2VzLlxuICBjb25zdCBlbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChwcm9qZWN0LmRpclBhdGgsIGVudik7XG4gIGNvbnN0IGhhc0xvY2FsQmluID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nLCByZWxlYXNlQmluKSk7XG4gIGNvbnN0IGZhbGxiYWNrUGFja2FnZU5hbWUgPSByZWxlYXNlUGFja2FnZU5hbWUgPz8gJ3NlbWFudGljLXJlbGVhc2UnO1xuICBjb25zdCBjb21tYW5kID0gaGFzTG9jYWxCaW5cbiAgICA/IFtyZWxlYXNlQmluLCAuLi5mb3J3YXJkZWRBcmdzXVxuICAgIDogcHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmQgPT09ICdidW4nXG4gICAgICA/IFsnYnVueCcsIGZhbGxiYWNrUGFja2FnZU5hbWUsIC4uLmZvcndhcmRlZEFyZ3NdXG4gICAgICA6IFsneWFybicsICdkbHgnLCBmYWxsYmFja1BhY2thZ2VOYW1lLCAuLi5mb3J3YXJkZWRBcmdzXTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFJ1bm5pbmc6ICR7Y29tbWFuZC5qb2luKCcgJyl9YCkpO1xuICBpZiAoYXJndi5kcnlSdW4pIHJldHVybiAwO1xuXG4gIHJldHVybiBhd2FpdCBzcGF3bkFuZFdhaXQoYWN0aXZlQ2hpbGQsIGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52LFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb24nPik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgd29ya3NwYWNlcyA9IHByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgY29uc3QgcGF0dGVybnMgPSBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXMpID8gd29ya3NwYWNlcyA6ICh3b3Jrc3BhY2VzPy5wYWNrYWdlcyA/PyBbXSk7XG4gIGlmIChwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBkaXJQYXRocyA9IGF3YWl0IGdsb2JieShwYXR0ZXJucywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pO1xuICByZXR1cm4gZGlyUGF0aHMubWFwKChkaXJQYXRoKSA9PiBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBkaXJQYXRoKSk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgb25TaWduYWw6IChzaWduYWwpID0+IHtcbiAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByaXZhdGVSZWdpc3RyeUF1dGggfSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuaW1wb3J0IHtcbiAgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSxcbiAgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlLFxuICBpc1ByaXZhdGVHaXREZXBlbmRlbmN5LFxuICBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3ksXG4gIHJlc29sdmVQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBzcGVjaWZpZXJTdWJzZXQsXG59IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVSZWdpc3RyeS5qcyc7XG5cbmludGVyZmFjZSBQcml2YXRlUGFja2FnZSB7XG4gIG5hbWU6IHN0cmluZztcbiAga2luZDogJ2dpdCcgfCAncmVnaXN0cnknO1xuICAvKiogVW5kZWZpbmVkIGZvciByZWdpc3RyeSBwYWNrYWdlcywgd2hpY2ggYXJlIGRvd25sb2FkZWQgaW5zdGVhZCBvZiBjb3BpZWQuICovXG4gIHNvdXJjZURpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdGFyZ2V0RGlyUGF0aDogc3RyaW5nO1xuICB2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lLZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ291dC1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdEaXJlY3RvcnkgdG8gY29weSBwcml2YXRlIHBhY2thZ2VzIGludG8nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICdAd2lsbGJvb3N0ZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx7IGRyeVJ1bj86IGJvb2xlYW4gfSwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAtcHJpdmF0ZS1wYWNrYWdlcycsXG4gIGRlc2NyaWJlOlxuICAgICdNYXRlcmlhbGl6ZSBwcml2YXRlIGRlcGVuZGVuY2llcyBmb3IgRG9ja2VyIGJ1aWxkczogY29weSBnaXQgZGVwZW5kZW5jaWVzIGFuZCBkb3dubG9hZCBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIHJlZ2lzdHJ5IHBhY2thZ2VzIChhdXRoIHZpYSAubnBtcmMgLyB+Ly5ucG1yYyBsb2NhbGx5LCBvciBWRVJEQUNDSU9fVE9LRU4gb24gQ0kpLiAnICtcbiAgICAnVGhlIERvY2tlcmZpbGUgbXVzdCBDT1BZIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3JpZXMgKGUuZy4gYENPUFkgQHdpbGxib29zdGVyLyBAd2lsbGJvb3N0ZXIvYCBhbmQgYENPUFkgQHdpbGxib29zdGVyLXByaXZhdGUvIEB3aWxsYm9vc3Rlci1wcml2YXRlL2ApIHNvIHRoZSBpbi1pbWFnZSBpbnN0YWxsIHJlc29sdmVzIHRoZSByZXdyaXR0ZW4gZmlsZTogcGF0aHMuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dERpclBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdHMucm9vdC5kaXJQYXRoLCBhcmd2Lm91dERpcik7XG4gICAgYXNzZXJ0U3ViZGlyZWN0b3J5KHByb2plY3RzLnJvb3QuZGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gICAgLy8gUmVnaXN0cnkgcGFja2FnZXMgYWx3YXlzIG1hdGVyaWFsaXplIGF0IHRoZSByZXBvc2l0b3J5IHJvb3Q6IGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYFxuICAgIC8vIHJlc29sdmVzIHRoZW0gZnJvbSBgPHJvb3Q+L0B3aWxsYm9vc3Rlci1wcml2YXRlYCByZWdhcmRsZXNzIG9mIGAtLW91dC1kaXJgLlxuICAgIGNvbnN0IHJlZ2lzdHJ5T3V0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0cy5yb290LmRpclBhdGgsIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUpO1xuICAgIGlmIChwYXRoc092ZXJsYXAob3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKSkge1xuICAgICAgLy8gZS5nLiBgLS1vdXQtZGlyIEB3aWxsYm9vc3Rlci1wcml2YXRlYCBvciBgLS1vdXQtZGlyIEB3aWxsYm9vc3Rlci1wcml2YXRlL3N1YmA6IHRoZVxuICAgICAgLy8gcmVnaXN0cnkgc3RlcCByZWN1cnNpdmVseSBkZWxldGVzIHJlZ2lzdHJ5T3V0RGlyUGF0aCwgd2hpY2ggd291bGQgZGVzdHJveSB0aGUgZ2l0XG4gICAgICAvLyBwYWNrYWdlcyBjb3BpZWQgaW50byBhbiBlcXVhbCBvciBORVNURUQgZGlyZWN0b3J5IG1vbWVudHMgZWFybGllci5cbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGAtLW91dC1kaXIgbXVzdCBub3Qgb3ZlcmxhcCB0aGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSByZWdpc3RyeSBvdXRwdXQgZGlyZWN0b3J5LmApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKHBhdGgucmVsYXRpdmUocHJvamVjdHMucm9vdC5kaXJQYXRoLCBvdXREaXJQYXRoKSAhPT0gJ0B3aWxsYm9vc3RlcicpIHtcbiAgICAgIC8vIFByZS1leGlzdGluZyBsaW1pdGF0aW9uIG9mIHRoZSBvcHRpb246IHRoZSBEb2NrZXIgbWFuaWZlc3QgcmV3cml0ZSBoYXMgbm8gYWNjZXNzIHRvIGl0LlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgJ05vdGU6IHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgcmV3cml0ZXMgZ2l0IGRlcGVuZGVuY2llcyB0byA8cm9vdD4vQHdpbGxib29zdGVyOyBhIGN1c3RvbSAtLW91dC1kaXIgcmVxdWlyZXMgYSBtYXRjaGluZyBEb2NrZXJmaWxlIGxheW91dC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHByaXZhdGVQYWNrYWdlcyA9IGF3YWl0IGNvbGxlY3RQcml2YXRlUGFja2FnZXMoXG4gICAgICBwcm9qZWN0cy5yb290LmRpclBhdGgsXG4gICAgICBwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICAgICk7XG5cbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGgsIHByaXZhdGVQYWNrYWdlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29waWVkUGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ2dpdCcpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5UGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ3JlZ2lzdHJ5Jyk7XG4gICAgLy8gUmVzb2x2ZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIEJFRk9SRSBkZWxldGluZyB0aGUgZXhpc3RpbmcgbWF0ZXJpYWxpemF0aW9ucywgc28gYSBtaXNzaW5nXG4gICAgLy8gcmVnaXN0cnkgY29uZmlndXJhdGlvbiBjYW5ub3QgZGVzdHJveSBhIHByZXZpb3VzbHkgdXNhYmxlIG91dHB1dCB0cmVlLlxuICAgIGNvbnN0IGF1dGggPSByZWdpc3RyeVBhY2thZ2VzLmxlbmd0aCA+IDAgPyByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aChwcm9qZWN0cy5yb290LmRpclBhdGgpIDogdW5kZWZpbmVkO1xuICAgIGlmIChyZWdpc3RyeVBhY2thZ2VzLmxlbmd0aCA+IDAgJiYgIWF1dGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgTm8gcmVnaXN0cnkgY29uZmlndXJlZCBmb3IgdGhlICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0gc2NvcGU7IGFkZCBcIiR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX06cmVnaXN0cnk9Li4uXCIgdG8gLm5wbXJjIG9yIH4vLm5wbXJjLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShvdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgLy8gQm90aCBvdXRwdXQgZGlyZWN0b3JpZXMgYWx3YXlzIGV4aXN0IGFmdGVyd2FyZHM6IERvY2tlcmZpbGVzIENPUFkgdGhlbSB1bmNvbmRpdGlvbmFsbHksXG4gICAgLy8gYW5kIGEgbWlzc2luZyBzb3VyY2UgcGF0aCBmYWlscyB0aGUgYnVpbGQuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIob3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBjb3BpZWRQYWNrYWdlcykge1xuICAgICAgYXdhaXQgY29weUdpdFBhY2thZ2UocHJvamVjdHMucm9vdC5kaXJQYXRoLCBwcml2YXRlUGFja2FnZSk7XG4gICAgfVxuXG4gICAgaWYgKGF1dGgpIHtcbiAgICAgIC8vIERvd25sb2FkIGludG8gYSBzdGFnaW5nIGRpcmVjdG9yeSBhbmQgc3dhcCBpdCBpbiBvbmx5IGFmdGVyIGV2ZXJ5IGRvd25sb2FkIHN1Y2NlZWRlZCwgc29cbiAgICAgIC8vIGEgZmFpbGluZyByZWdpc3RyeS90b2tlbi9leHRyYWN0aW9uIGNhbm5vdCBkZXN0cm95IHRoZSBsYXN0IHVzYWJsZSBtYXRlcmlhbGl6YXRpb24uXG4gICAgICBjb25zdCBzdGFnaW5nRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0cy5yb290LmRpclBhdGgsICcudG1wJywgJ3diLXByaXZhdGUtcmVnaXN0cnktc3RhZ2luZycpO1xuICAgICAgY29uc3QgdG9TdGFnZWRQYXRoID0gKHRhcmdldERpclBhdGg6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgICAgICBwYXRoLmpvaW4oc3RhZ2luZ0RpclBhdGgsIHBhdGgucmVsYXRpdmUocmVnaXN0cnlPdXREaXJQYXRoLCB0YXJnZXREaXJQYXRoKSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShzdGFnaW5nRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoc3RhZ2luZ0RpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiByZWdpc3RyeVBhY2thZ2VzKSB7XG4gICAgICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIHByaXZhdGVQYWNrYWdlLm5hbWUsXG4gICAgICAgICAgICBwcml2YXRlUGFja2FnZS52ZXJzaW9uU3BlY2lmaWVyID8/ICdsYXRlc3QnLFxuICAgICAgICAgICAgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICBgRG93bmxvYWRlZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9IHRvICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0cy5yb290LmRpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIEEgZG93bmxvYWRlZCBwYWNrYWdlIG1heSBpdHNlbGYgZGVwZW5kIG9uIHByaXZhdGUgcGFja2FnZXMgdGhhdCB3ZXJlIG5vdCB2aXNpYmxlXG4gICAgICAgICAgLy8gYmVmb3JlIGV4dHJhY3Rpb247IG1hdGVyaWFsaXplIHRoZW0gdG9vLlxuICAgICAgICAgIGF3YWl0IGNvbGxlY3ROZXN0ZWRQcml2YXRlUGFja2FnZXMoXG4gICAgICAgICAgICBwcm9qZWN0cy5yb290LmRpclBhdGgsXG4gICAgICAgICAgICBhdXRoLFxuICAgICAgICAgICAgcHJpdmF0ZVBhY2thZ2UsXG4gICAgICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgICAgICBvdXREaXJQYXRoLFxuICAgICAgICAgICAgcmVnaXN0cnlPdXREaXJQYXRoLFxuICAgICAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShyZWdpc3RyeU91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKHN0YWdpbmdEaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oc3RhZ2luZ0RpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHJlZ2lzdHJ5T3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVnaXN0cnlPdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCByZXBsYWNlUHJpdmF0ZURlcGVuZGVuY2llcyhwcm9qZWN0cy5yb290LmRpclBhdGgsIHByaXZhdGVQYWNrYWdlcyk7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYEVuc3VyZSB0aGUgRG9ja2VyZmlsZSBDT1BZcyAke3BhdGgucmVsYXRpdmUocHJvamVjdHMucm9vdC5kaXJQYXRoLCBvdXREaXJQYXRoKX0vIGFuZCAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9LyBpbnRvIHRoZSBpbWFnZSBiZWZvcmUgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuYFxuICAgICk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICByb290UGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPj4ge1xuICBjb25zdCBwcml2YXRlUGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KCk7XG4gIC8vIFN0YXJ0IGZyb20gdGhlIHJvb3QgcGFja2FnZS5qc29uIGJ5IGRlc2lnbjsgd29ya3NwYWNlIHBhY2thZ2UgZGVwZW5kZW5jaWVzIGFyZSBvdXRzaWRlIHRoaXMgY29tbWFuZCdzIHRhcmdldC5cbiAgY29uc3QgcGFja2FnZXNUb1Byb2Nlc3MgPSBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhyb290UGFja2FnZUpzb24sIG91dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCk7XG4gIGNvbnN0IHF1ZXVlZFBhY2thZ2VzID0gbmV3IE1hcChwYWNrYWdlc1RvUHJvY2Vzcy5tYXAoKHApID0+IFtwLm5hbWUsIHBdKSk7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhY2thZ2VzVG9Qcm9jZXNzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHByaXZhdGVQYWNrYWdlID0gcGFja2FnZXNUb1Byb2Nlc3NbaW5kZXhdO1xuICAgIGlmICghcHJpdmF0ZVBhY2thZ2UpIGNvbnRpbnVlO1xuICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKHByaXZhdGVQYWNrYWdlLm5hbWUpKSBjb250aW51ZTtcblxuICAgIGlmIChwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0Jykge1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZS5uYW1lKTtcbiAgICAgIC8vIE5lc3RlZCBwcml2YXRlIGRlcGVuZGVuY2llcyBvZiBhbiBpbnN0YWxsZWQgZ2l0IHBhY2thZ2UgYXJlIGRpc2NvdmVyYWJsZSByaWdodCBhd2F5O1xuICAgICAgLy8gcmVnaXN0cnkgcGFja2FnZXMgYXJlIGluc3BlY3RlZCBhZnRlciBkb3dubG9hZCBpbnN0ZWFkIChjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKS5cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uLCBvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KG5lc3RlZC5uYW1lKTtcbiAgICAgICAgICBpZiAocXVldWVkKSB7XG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChxdWV1ZWQsIG5lc3RlZCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1ZXVlZFBhY2thZ2VzLnNldChuZXN0ZWQubmFtZSwgbmVzdGVkKTtcbiAgICAgICAgICAgIHBhY2thZ2VzVG9Qcm9jZXNzLnB1c2gobmVzdGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZVBhY2thZ2VzLnNldChwcml2YXRlUGFja2FnZS5uYW1lLCBwcml2YXRlUGFja2FnZSk7XG4gIH1cblxuICByZXR1cm4gcHJpdmF0ZVBhY2thZ2VzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBleHRyYWN0ZWRQYWNrYWdlOiBQcml2YXRlUGFja2FnZSxcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIG91dERpclBhdGg6IHN0cmluZyxcbiAgcmVnaXN0cnlPdXREaXJQYXRoOiBzdHJpbmcsXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gUmVnaXN0cnkgcGFja2FnZXMgc3RpbGwgbGl2ZSBpbiB0aGUgc3RhZ2luZyBkaXJlY3RvcnkgYXQgdGhpcyBwb2ludCAodGhleSBhcmUgc3dhcHBlZCBpbnRvXG4gIC8vIHBsYWNlIG9ubHkgYWZ0ZXIgZXZlcnkgZG93bmxvYWQgc3VjY2VlZGVkKTsgZ2l0IHBhY2thZ2VzIGFyZSBjb3BpZWQgc3RyYWlnaHQgdG8gdGhlaXIgZmluYWxcbiAgLy8gbG9jYXRpb24sIHNvIHRoZWlyIG1hbmlmZXN0IG11c3QgYmUgcmVhZCB0aGVyZS5cbiAgY29uc3QgZXh0cmFjdGVkRGlyUGF0aCA9XG4gICAgZXh0cmFjdGVkUGFja2FnZS5raW5kID09PSAncmVnaXN0cnknXG4gICAgICA/IHRvU3RhZ2VkUGF0aChleHRyYWN0ZWRQYWNrYWdlLnRhcmdldERpclBhdGgpXG4gICAgICA6IGV4dHJhY3RlZFBhY2thZ2UudGFyZ2V0RGlyUGF0aDtcbiAgLy8gU2NhbiBFVkVSWSBtYW5pZmVzdCBvZiB0aGUgbWF0ZXJpYWxpemVkIHBhY2thZ2UgKG9yZyBnaXQgZGVwZW5kZW5jaWVzIGFyZSB3aG9sZSBtb25vcmVwb1xuICAvLyBjaGVja291dHMgd2l0aCBwYWNrYWdlcy8qL3BhY2thZ2UuanNvbiksIG1pcnJvcmluZyBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzJyBkZWVwIHNjYW4g4oCUIHRoZVxuICAvLyBkZXBlbmRlbmN5LXJld3JpdGUgc3RlcCB3YWxrcyB0aGUgc2FtZSBzZXQsIHNvIGFueXRoaW5nIGRlY2xhcmVkIHRoZXJlIG11c3QgYmUgbWF0ZXJpYWxpemVkLlxuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyhleHRyYWN0ZWREaXJQYXRoKSkge1xuICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKFxuICAgICAgYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCksXG4gICAgICBvdXREaXJQYXRoLFxuICAgICAgcmVnaXN0cnlPdXREaXJQYXRoXG4gICAgKSkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5lc3RlZC5uYW1lKTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAvLyBDb2xsYXBzaW5nIGRpZmZlcmVudCByZXF1ZXN0ZWQgdmVyc2lvbnMgaW50byBvbmUgbWF0ZXJpYWxpemF0aW9uIHdvdWxkIHNpbGVudGx5IHZpb2xhdGVcbiAgICAgICAgLy8gdGhlIGRlcGVuZGVudCdzIHJlcXVpcmVtZW50LCBzbyBjb25mbGljdHMgbXVzdCBmYWlsIGxvdWRseS5cbiAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QoZXhpc3RpbmcsIG5lc3RlZCwgZXh0cmFjdGVkUGFja2FnZS5uYW1lKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXN0ZWQua2luZCA9PT0gJ2dpdCcpIHtcbiAgICAgICAgbmVzdGVkLnNvdXJjZURpclBhdGggPSBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290RGlyUGF0aCwgbmVzdGVkLm5hbWUpO1xuICAgICAgICBhd2FpdCBjb3B5R2l0UGFja2FnZShyb290RGlyUGF0aCwgbmVzdGVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIG5lc3RlZC5uYW1lLFxuICAgICAgICAgIG5lc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/ICdsYXRlc3QnLFxuICAgICAgICAgIHRvU3RhZ2VkUGF0aChuZXN0ZWQudGFyZ2V0RGlyUGF0aClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBEb3dubG9hZGVkICR7bmVzdGVkLm5hbWV9IChuZXN0ZWQgZGVwZW5kZW5jeSkgdG8gJHtuZXN0ZWQudGFyZ2V0RGlyUGF0aH1gKTtcbiAgICAgIH1cbiAgICAgIHByaXZhdGVQYWNrYWdlcy5zZXQobmVzdGVkLm5hbWUsIG5lc3RlZCk7XG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgbmVzdGVkLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5R2l0UGFja2FnZShyb290RGlyUGF0aDogc3RyaW5nLCBwcml2YXRlUGFja2FnZTogUHJpdmF0ZVBhY2thZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMuY3AocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCEsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgsIHtcbiAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgZm9yY2U6IHRydWUsXG4gICAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIGV4cG9zZXMgaW5zdGFsbGVkIHBhY2thZ2VzIHRocm91Z2ggc3ltbGlua3M7IHRoZSBtYXRlcmlhbGl6ZWQgdHJlZVxuICAgIC8vIG11c3QgY29udGFpbiByZWFsIGZpbGVzIChhIGNvcGllZCBhYnNvbHV0ZSBzeW1saW5rIHdvdWxkIGRhbmdsZSBpbnNpZGUgdGhlIERvY2tlciBpbWFnZSxcbiAgICAvLyBhbmQgbGF0ZXIgZGVwZW5kZW5jeSByZXdyaXRpbmcgd291bGQgd3JpdGUgdGhyb3VnaCBpdCBpbnRvIHRoZSBzaGFyZWQgc3RvcmUpLlxuICAgIGRlcmVmZXJlbmNlOiB0cnVlLFxuICAgIGZpbHRlcjogKHNyYykgPT4ge1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnJlbGF0aXZlKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBzcmMpLnNwbGl0KHBhdGguc2VwKTtcbiAgICAgIHJldHVybiAhc2VnbWVudHMuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcycpICYmICFzZWdtZW50cy5pbmNsdWRlcygnLmdpdCcpO1xuICAgIH0sXG4gIH0pO1xuICBjb25zb2xlLmluZm8oYENvcGllZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9IHRvICR7cGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCl9YCk7XG59XG5cbi8qKlxuICogVGhlIG1hdGVyaWFsaXphdGlvbiBmb3IgYGV4aXN0aW5nYCBpcyBhbHJlYWR5IHNlbGVjdGVkIChhIHJhbmdlIHJlc29sdmVzIG1heC1zYXRpc2Z5aW5nIGFnYWluc3RcbiAqIHRoZSByZWdpc3RyeSDigJQgc2VlIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZSksIHNvIGFjY2VwdCBgcmVxdWVzdGVkYCBvbmx5IHdoZW4gaXQgaXNcbiAqIGd1YXJhbnRlZWQgc2F0aXNmaWVkOiBgZXhpc3RpbmdgIG11c3QgYmUgYSBzdWJzZXQgb2YgaXQgKGV2ZXJ5IHBvc3NpYmxlIHJlc29sdXRpb24gb2YgYGV4aXN0aW5nYFxuICogdGhlbiBzYXRpc2ZpZXMgYHJlcXVlc3RlZGApLiBOb24tcmFuZ2Ugc3BlY2lmaWVycyAoZGlzdC10YWdzLCBnaXQgVVJMcy9yZXZpc2lvbnMpIG11c3QgbWF0Y2hcbiAqIGV4YWN0bHkuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0KGV4aXN0aW5nOiBQcml2YXRlUGFja2FnZSwgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZSwgZGVwZW5kZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGlzdGluZy5raW5kID09PSByZXF1ZXN0ZWQua2luZCkge1xuICAgIGlmIChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID09PSByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikgcmV0dXJuO1xuICAgIGlmIChzcGVjaWZpZXJTdWJzZXQoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciwgcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpKSByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfTogYCArXG4gICAgICBgJHtleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID8/IGV4aXN0aW5nLmtpbmR9IGlzIGFscmVhZHkgc2VsZWN0ZWQsIGJ1dCAke2RlcGVuZGVudE5hbWV9IHJlcXVpcmVzIGAgK1xuICAgICAgYCR7cmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gcmVxdWVzdGVkLmtpbmR9LiBPbmx5IGEgc2luZ2xlIHZlcnNpb24gcGVyIHByaXZhdGUgcGFja2FnZSBpcyBzdXBwb3J0ZWQuYFxuICApO1xufVxuXG4vKiogV2hldGhlciB0aGUgdHdvIHBhdGhzIGFyZSBlcXVhbCBvciBvbmUgY29udGFpbnMgdGhlIG90aGVyLiAqL1xuZnVuY3Rpb24gcGF0aHNPdmVybGFwKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYSwgYikgfHwgaXNFcXVhbE9yQW5jZXN0b3JQYXRoKGIsIGEpO1xufVxuXG5mdW5jdGlvbiBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYW5jZXN0b3JQYXRoOiBzdHJpbmcsIGRlc2NlbmRhbnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShhbmNlc3RvclBhdGgsIGRlc2NlbmRhbnRQYXRoKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aCA9PT0gJycgfHwgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTdWJkaXJlY3Rvcnkocm9vdERpclBhdGg6IHN0cmluZywgb3V0RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIG91dERpclBhdGgpO1xuICBpZiAocmVsYXRpdmVQYXRoICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpIHJldHVybjtcblxuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgT3V0cHV0IGRpcmVjdG9yeSBtdXN0IGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IHJvb3Q6ICR7b3V0RGlyUGF0aH1gKSk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7XG4gIC8vIHJlYWxwYXRoU3luYyByZXNvbHZlcyB0aGUgaXNvbGF0ZWQgbGlua2VyJ3Mgc3ltbGluayBzbyBjb3BpZXMgcmVhZCAoYW5kIHRoZSBjb3B5IGZpbHRlclxuICAvLyBjb21wdXRlcyByZWxhdGl2ZSBwYXRocyBhZ2FpbnN0KSB0aGUgYWN0dWFsIHBhY2thZ2UgZGlyZWN0b3J5LlxuICBjb25zdCBkaXJlY3REaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ0B3aWxsYm9vc3RlcicsIHVuc2NvcGVkTmFtZSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJlY3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhkaXJlY3REaXJQYXRoKTtcbiAgfVxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIga2VlcHMgdHJhbnNpdGl2ZS1vbmx5IGRlcGVuZGVuY2llcyBvdXQgb2YgdGhlIHJvb3Qgbm9kZV9tb2R1bGVzO1xuICAvLyBzZWFyY2ggdGhlIC5idW4gc3RvcmUgZm9yIHRoZSBwYWNrYWdlIGJlZm9yZSBnaXZpbmcgdXAuIFRoZSBzdG9yZSBtYXkgbGVnaXRpbWF0ZWx5IGhvbGRcbiAgLy8gTVVMVElQTEUgcmVzb2x1dGlvbnMgb2Ygb25lIHBhY2thZ2UgKGRpZmZlcmVudCB2ZXJzaW9ucy9yZXZpc2lvbnMpLCBhbmQgcGlja2luZyBhbiBhcmJpdHJhcnlcbiAgLy8gb25lIGNvdWxkIHNpbGVudGx5IG1hdGVyaWFsaXplIHRoZSB3cm9uZyBjb250ZW50IOKAlCBzbyBhbWJpZ3VpdHkgZmFpbHMgbG91ZGx5LlxuICBjb25zdCBidW5TdG9yZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpO1xuICBjb25zdCBjYW5kaWRhdGVEaXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGZzLnJlYWRkaXJTeW5jKGJ1blN0b3JlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVEaXJQYXRoID0gcGF0aC5qb2luKGJ1blN0b3JlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdub2RlX21vZHVsZXMnLCAnQHdpbGxib29zdGVyJywgdW5zY29wZWROYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjYW5kaWRhdGVEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgIGNhbmRpZGF0ZURpclBhdGhzLmFkZChmcy5yZWFscGF0aFN5bmMoY2FuZGlkYXRlRGlyUGF0aCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCB0aHJvdWdoIHRvIHRoZSBlcnJvciBiZWxvdy5cbiAgfVxuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA9PT0gMSkgcmV0dXJuIFsuLi5jYW5kaWRhdGVEaXJQYXRoc11bMF0hO1xuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgaW5zdGFsbGVkIHJlc29sdXRpb25zIGZvdW5kIGZvciAke3BhY2thZ2VOYW1lfTogJHtbLi4uY2FuZGlkYXRlRGlyUGF0aHNdLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgJ0RlZHVwbGljYXRlIHRoZSBkZXBlbmRlbmN5IHNvIGEgc2luZ2xlIHJlc29sdXRpb24gcmVtYWlucy4nXG4gICAgKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAke3BhY2thZ2VOYW1lfSAoJHtkaXJlY3REaXJQYXRofSlgKTtcbn1cblxuZnVuY3Rpb24gZmluZFByaXZhdGVEZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJpdmF0ZVBhY2thZ2VbXSB7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4oKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBjb25zdCBpc0dpdCA9IGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpO1xuICAgICAgaWYgKCFpc0dpdCAmJiAhaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKSkgY29udGludWU7XG4gICAgICBpZiAoaXNHaXQgJiYgIW5hbWUuc3RhcnRzV2l0aCgnQHdpbGxib29zdGVyLycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJpdmF0ZSBnaXQgZGVwZW5kZW5jeSBtdXN0IGJlIGFuIEB3aWxsYm9vc3RlciBwYWNrYWdlOiAke25hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1bnNjb3BlZE5hbWUgPSB0b1Vuc2NvcGVkUGFja2FnZU5hbWUobmFtZSk7XG4gICAgICAvLyBEZXBlbmRlbmN5IG5hbWVzIGJlY29tZSBleHRlcm5hbCBkYXRhIG9uY2UgbmVzdGVkIG1hbmlmZXN0cyBjb21lIGZyb20gZG93bmxvYWRlZFxuICAgICAgLy8gdGFyYmFsbHM7IHJlamVjdCBhbnl0aGluZyAocGF0aCBzZXBhcmF0b3JzLCBgLi5gLCBoaWRkZW4tZmlsZSBwcmVmaXhlcykgdGhhdCBjb3VsZFxuICAgICAgLy8gZXNjYXBlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRoZSBuYW1lIGlzIGpvaW5lZCBpbnRvIGJlZm9yZSBpdCBpcyByZWN1cnNpdmVseSBkZWxldGVkLlxuICAgICAgaWYgKCEvXltcXHcuLV0rJC8udGVzdCh1bnNjb3BlZE5hbWUpIHx8IHVuc2NvcGVkTmFtZS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByaXZhdGUgcGFja2FnZSBuYW1lOiAke25hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0ZWQ6IFByaXZhdGVQYWNrYWdlID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBraW5kOiBpc0dpdCA/ICdnaXQnIDogJ3JlZ2lzdHJ5JyxcbiAgICAgICAgc291cmNlRGlyUGF0aDogdW5kZWZpbmVkLFxuICAgICAgICB0YXJnZXREaXJQYXRoOiBwYXRoLmpvaW4oaXNHaXQgPyBvdXREaXJQYXRoIDogcmVnaXN0cnlPdXREaXJQYXRoLCB1bnNjb3BlZE5hbWUpLFxuICAgICAgICAvLyBUaGUgZnVsbCBnaXQgc3BlY2lmaWVyIGlzIHByZXNlcnZlZCBzbyBkaXZlcmdlbnQgVVJMcy9yZXZpc2lvbnMgKCNhYmMgdnMgI2RlZikgYXJlXG4gICAgICAgIC8vIGRldGVjdGVkIGFzIGNvbmZsaWN0cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGNvbGxhcHNpbmcgaW50byBvbmUgY29waWVkIHBhY2thZ2UuXG4gICAgICAgIHZlcnNpb25TcGVjaWZpZXI6IHZhbHVlIGFzIHN0cmluZyxcbiAgICAgIH07XG4gICAgICBjb25zdCBleGlzdGluZyA9IHByaXZhdGVQYWNrYWdlcy5nZXQobmFtZSk7XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5hbWUsIGV4aXN0aW5nID8gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKSA6IHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXTtcbn1cblxuLyoqXG4gKiBBIG1hbmlmZXN0IG1heSBsZWdpdGltYXRlbHkgcmVxdWVzdCBvbmUgcGFja2FnZSBmcm9tIHNldmVyYWwgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBhbiBleGFjdFxuICogZGV2RGVwZW5kZW5jaWVzIHBpbiBhbG9uZ3NpZGUgYSBwZWVyRGVwZW5kZW5jaWVzIHJhbmdlKS4gS2VlcCB0aGUgTkFSUk9XRVIgcmVxdWlyZW1lbnQg4oCUIGl0c1xuICogbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBzYXRpc2ZpZXMgdGhlIHdpZGVyIG9uZSBieSBkZWZpbml0aW9uIChhbiBleGFjdCBwaW4gaXMgdGhlIG5hcnJvd2VzdFxuICogcmFuZ2UpIOKAlCBhbmQgZmFpbCBsb3VkbHkgd2hlbiB0aGUgcmVxdWlyZW1lbnRzIGdlbnVpbmVseSBkaXZlcmdlLlxuICovXG5mdW5jdGlvbiBtZXJnZVNhbWVNYW5pZmVzdFJlcXVpcmVtZW50KGV4aXN0aW5nOiBQcml2YXRlUGFja2FnZSwgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZSk6IFByaXZhdGVQYWNrYWdlIHtcbiAgaWYgKGV4aXN0aW5nLmtpbmQgPT09IHJlcXVlc3RlZC5raW5kKSB7XG4gICAgaWYgKGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPT09IHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgaWYgKHNwZWNpZmllclN1YnNldChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyLCByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikpIHJldHVybiBleGlzdGluZztcbiAgICBpZiAoc3BlY2lmaWVyU3Vic2V0KHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyLCBleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuIHJlcXVlc3RlZDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfSB3aXRoaW4gb25lIG1hbmlmZXN0OiBgICtcbiAgICAgIGAke2V4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPz8gZXhpc3Rpbmcua2luZH0gdnMgJHtyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciA/PyByZXF1ZXN0ZWQua2luZH0uYFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXBsYWNlUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT5cbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgaWYgKCFyZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25QYXRoLCBwYWNrYWdlSnNvbiwgcHJpdmF0ZVBhY2thZ2VzKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIGAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCB1bmRlZmluZWQsIDIpfVxcbmAsICd1dGY4Jyk7XG4gICAgICBjb25zb2xlLmluZm8oYFJld3JvdGUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgaW4gJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpfWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+XG4pOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBpZiAoIWlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRhcmdldFBhY2thZ2UgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCF0YXJnZXRQYWNrYWdlKSBjb250aW51ZTtcblxuICAgICAgZGVwZW5kZW5jaWVzW25hbWVdID0gYGZpbGU6JHtwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCB0YXJnZXRQYWNrYWdlLnRhcmdldERpclBhdGgpfWA7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblBhdGhzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRpclBhdGgpKSByZXR1cm4gW107XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoZGlyZW50Lm5hbWUgPT09ICdub2RlX21vZHVsZXMnIHx8IGRpcmVudC5uYW1lID09PSAnLmdpdCcpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHBhY2thZ2VKc29uUGF0aHMucHVzaCguLi4oYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoY2hpbGRQYXRoKSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUgPT09ICdwYWNrYWdlLmpzb24nKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goY2hpbGRQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IFByb21pc2U8UGFja2FnZUpzb24+IHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbn1cblxuZnVuY3Rpb24gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgvXkB3aWxsYm9vc3Rlcig/Oi1wcml2YXRlKT9cXC8vLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4pOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKGBbZHJ5LXJ1bl0gV291bGQgcmVjcmVhdGUgJHtvdXREaXJQYXRofWApO1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIHByaXZhdGVQYWNrYWdlLmtpbmQgPT09ICdnaXQnXG4gICAgICAgID8gYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06ICR7cHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA/PyAnKGluc3RhbGxlZCB1bmRlciBub2RlX21vZHVsZXMpJ31gXG4gICAgICAgIDogYFtkcnktcnVuXSBXb3VsZCBkb3dubG9hZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9QCR7cHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllcn0gdG8gJHtwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRofWBcbiAgICApO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhgW2RyeS1ydW5dIFdvdWxkIHJld3JpdGUgY29waWVkIHByaXZhdGUgZGVwZW5kZW5jaWVzIHRvIGZpbGU6Li4vPG5hbWU+YCk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkSW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgY29uc3QgbWlzZUFnZUtleVNlY3JldE9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWVxuICAgICAgPyAnXFxuICAgICAgICAtLXNlY3JldCBpZD1taXNlX2FnZV9rZXksZW52PU1JU0VfQUdFX0tFWSdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSR7bWlzZUFnZUtleVNlY3JldE9wdGlvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zLCBhZGRpdGlvbmFsQXJncyl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIGNvbnN0IGFsbG9jYXRlVHR5ID0gYWRkaXRpb25hbEFyZ3MuaW5jbHVkZXMoJy9iaW4vYmFzaCcpO1xuICAgIGNvbnN0IG1pc2VBZ2VLZXlFbnZPcHRpb24gPSBwcm9qZWN0LmVudi5NSVNFX0FHRV9LRVkgPyAnLS1lbnYgTUlTRV9BR0VfS0VZICcgOiAnJztcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9JHttaXNlQWdlS2V5RW52T3B0aW9ufS0tcHVibGlzaCAke3Byb2plY3QuZW52LlBPUlR9OjgwODAgLS1uYW1lICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbE9wdGlvbnN9ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbEFyZ3N9YDtcbiAgfVxuXG4gIHN0b3AocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBkb2NrZXIgcm0gLWYgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gPiAvZGV2L251bGwgMj4mMSB8fCB0cnVlYDtcbiAgfVxuXG4gIHN0b3BBbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgcHMgLXEpIDI+IC9kZXYvbnVsbClgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJTY3JpcHRzID0gbmV3IERvY2tlclNjcmlwdHMoKTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCwgYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7XG4gIGZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoLFxuICBmaW5kV3JhbmdsZXJDb25maWdQYXRoLFxuICBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIsXG4gIHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCA9IGZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoKHByb2plY3QpO1xuICAgIGlmIChjdXN0b21TdGFydFNjcmlwdFBhdGgpIHtcbiAgICAgIGNvbnN0IHN0YXJ0Q29tbWFuZCA9XG4gICAgICAgIGAke2J1aWxkU2hlbGxDb21tYW5kKFsnYmFzaCcsIGN1c3RvbVN0YXJ0U2NyaXB0UGF0aF0pfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICAgICAgLy8gQSBzdGFydCBzY3JpcHQgZm91bmQgYXQgdGhlIG1vbm9yZXBvIHJvb3QgKGNmLiBQcm9qZWN0LmZpbmRGaWxlKSBpcyB3cml0dGVuIHRvIHJ1biBmcm9tXG4gICAgICAvLyB0aGUgcm9vdCwgbGlrZSBEb2NrZXIncyBXT1JLRElSLCBzbyBpdHMgY3dkIG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHNjcmlwdHMvLlxuICAgICAgY29uc3Qgc2NyaXB0Um9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUocGF0aC5kaXJuYW1lKGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCkpO1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBbXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBzY3JpcHRSb290RGlyUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoXG4gICAgICAgICAgPyBzdGFydENvbW1hbmRcbiAgICAgICAgICA6IGAoJHtidWlsZFNoZWxsQ29tbWFuZChbJ2NkJywgc2NyaXB0Um9vdERpclBhdGhdKX0gJiYgJHtzdGFydENvbW1hbmR9KWAsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPSBlY29zeXN0ZW1Db25maWdQYXRoXG4gICAgICA/IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdXG4gICAgICA6IHRoaXMuYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gdGhpcy5idWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3QsIGFyZ3YsIGNvbW1hbmRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpLFxuICAgIF07XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBjb21tYW5kczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIC8vIFRlc3QtZW52aXJvbm1lbnQgd3JhbmdsZXIgc3RhdGUgaXMgZGlzcG9zYWJsZTsgd2lwZSBpdCBlbnRpcmVseSAobm90IGp1c3QgRDEpIGJlZm9yZVxuICAgIC8vIG1pZ3JhdGluZywgc2luY2Ugc3RhbGUgS1YgY2FjaGUgZW50cmllcyBvciBEdXJhYmxlIE9iamVjdCBzdG9yYWdlIGNhbiBicmVhayBlMmUgdGVzdHMuXG4gICAgY29uc3Qgd3JhbmdsZXJTdGF0ZVdpcGVDb21tYW5kcyA9XG4gICAgICBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpICYmIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdClcbiAgICAgICAgPyBbYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiYF1cbiAgICAgICAgOiBbXTtcbiAgICAvLyBBIHByb2plY3Qgd2hvc2UgRDEgYmluZGluZ3MgY2Fycnkgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgYXBwbGllcyB0aGVtIHdpdGggd3JhbmdsZXJcbiAgICAvLyAoc2VlIFdvcmtlcnNTY3JpcHRzIC8gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQpLiBSdW5uaW5nIGRyaXp6bGUta2l0IG1pZ3JhdGUgYWdhaW5zdFxuICAgIC8vIHRoZSBzYW1lIGxvY2FsIEQxIHdvdWxkIGFwcGx5IHRoZSBzYW1lIFNRTCB0d2ljZSDigJQgZHJpenpsZSdzIGdlbmVyYXRlZCBzdGF0ZW1lbnRzIGFyZSBub3RcbiAgICAvLyBpZGVtcG90ZW50IChgQ1JFQVRFIElOREVYYCB3aXRob3V0IElGIE5PVCBFWElTVFMpIOKAlCBzbyBkcml6emxlIHN0YXlzIE9STS1vbmx5IHRoZXJlLlxuICAgIGNvbnN0IG1pZ3JhdGVzRDFXaXRoV3JhbmdsZXIgPSAhIWZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmRzID0gW1xuICAgICAgLi4ud3JhbmdsZXJTdGF0ZVdpcGVDb21tYW5kcyxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuaGFzRHJpenpsZSAmJiAhbWlncmF0ZXNEMVdpdGhXcmFuZ2xlclxuICAgICAgICA/IFt3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBkcml6emxlU2NyaXB0cy5taWdyYXRlRm9yU3RhcnQocHJvamVjdCkpXVxuICAgICAgICA6IFtdKSxcbiAgICBdO1xuICAgIC8vIFNwbGl0dGluZyBtYXkgY3V0IHRocm91Z2ggYSBgKGNkIOKApiAmJiDigKYpYCBzdWJzaGVsbCwgYnV0IHJlam9pbmluZyB3aXRoICcgJiYgJyBhbmQgcGVyLXBpZWNlXG4gICAgLy8gcmVkaXJlY3RzIGtlZXBzIHRoZSBzY3JpcHQgdmFsaWQsIGFuZCB3Yi1nZW5lcmF0ZWQgcGF0aHMgbmV2ZXIgY29udGFpbiAnJiYnLlxuICAgIHJldHVybiBbLi4ubWlncmF0aW9uQ29tbWFuZHMuZmxhdE1hcCgoY21kKSA9PiBjbWQuc3BsaXQoJyYmJykpLCAuLi5jb21tYW5kc11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAoKGNtZCkgPT4gYCR7Y21kfSAke3RvRGV2TnVsbChhcmd2KX1gLnRyaW0oKSlcbiAgICAgIC5qb2luKCcgJiYgJyk7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiB0ZXN0IChlMmUpIGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuICB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVEb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QpLCBvcHRpb25zKTtcbiAgfVxuICBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIC8vIFVzZSBlbXB0eSBOT0RFX0VOViB0byBhdm9pZCBcInByb2R1Y3Rpb25cIiBtb2RlIGluIHNvbWUgZnJhbWV3b3JrcyBsaWtlIEJsaXR6LmpzLlxuICAgIHJldHVybiBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IFtdLCBwbGF5d3JpZ2h0QXJncyA9IFsndGVzdCcsICd0ZXN0L2UyZS8nXSB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICctLWFsbG93T25seScsXG4gICAgICAgICctLXdhdGNoPWZhbHNlJyxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsPTEnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ2J1bicsXG4gICAgICAgICd0ZXN0JyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbCddIDogW10pLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiAnZWNobyBcIk5vIHRlc3RzLlwiJztcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA5MDAwMCAtaSAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ3NjcmlwdHMvc3RhcnQtcHJvZHVjdGlvbi5zaCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKFxuICBwbGF5d3JpZ2h0QXJnczogc3RyaW5nW10sXG4gIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sXG4gIGJhaWw/OiBib29sZWFuLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IFsnQlVOJywgJ3BsYXl3cmlnaHQnXTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgaWYgKHBsYXl3cmlnaHRBcmdzWzBdICE9PSAndGVzdCcgfHwgIW5vcm1hbGl6ZWRUYXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oWy4uLmJhc2UsIC4uLnBsYXl3cmlnaHRBcmdzLCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sIGJhaWwpO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKDEpO1xuICBjb25zdCBleHBsaWNpdFRhcmdldEluZGV4ZXMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhyZXN0KTtcbiAgY29uc3QgcmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCA9XG4gICAgZXhwbGljaXRUYXJnZXRJbmRleGVzLmxlbmd0aCA9PT0gMCA/IHJlc3QgOiByZXN0LmZpbHRlcigoXywgaW5kZXgpID0+ICFleHBsaWNpdFRhcmdldEluZGV4ZXMuaW5jbHVkZXMoaW5kZXgpKTtcbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFxuICAgIFsuLi5iYXNlLCAndGVzdCcsIC4uLm5vcm1hbGl6ZWRUYXJnZXRzLCAuLi5yZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0LCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sXG4gICAgYmFpbFxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoYXJnczogc3RyaW5nW10pOiBudW1iZXJbXSB7XG4gIGxldCBwZW5kaW5nVmFsdWVNb2RlOiAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgYXJnXSBvZiBhcmdzLmVudHJpZXMoKSkge1xuICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlKSB7XG4gICAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSA9PT0gJ3JlcXVpcmVkJyB8fCAhYXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgcmV0dXJuIFsuLi50YXJnZXRJbmRleGVzLCAuLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkubWFwKChfLCBvZmZzZXQpID0+IGluZGV4ICsgMSArIG9mZnNldCldO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIGlmIChhcmcuaW5jbHVkZXMoJz0nKSkgY29udGludWU7XG4gICAgICBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9IGVsc2UgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAnb3B0aW9uYWwnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICBjb25zdCBzaG9ydE9wdGlvbiA9IGFyZy5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID09PSAyICYmIFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhzaG9ydE9wdGlvbikpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRJbmRleGVzO1xufVxuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1icm93c2VyJyxcbiAgJy0tY29uZmlnJyxcbiAgJy0tZ3JlcCcsXG4gICctLWdyZXAtaW52ZXJ0JyxcbiAgJy0tZ2xvYmFsLXRpbWVvdXQnLFxuICAnLS1tYXgtZmFpbHVyZXMnLFxuICAnLS1vdXRwdXQnLFxuICAnLS1wcm9qZWN0JyxcbiAgJy0tcmVwZWF0LWVhY2gnLFxuICAnLS1yZXBvcnRlcicsXG4gICctLXJldHJpZXMnLFxuICAnLS1zaGFyZCcsXG4gICctLXRlc3QtbGlzdCcsXG4gICctLXRlc3QtbGlzdC1pbnZlcnQnLFxuICAnLS10aW1lb3V0JyxcbiAgJy0tdHJhY2UnLFxuICAnLS10c2NvbmZpZycsXG4gICctLXVpLWhvc3QnLFxuICAnLS11aS1wb3J0JyxcbiAgJy0tdWktdGl0bGUnLFxuICAnLS13b3JrZXJzJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1vbmx5LWNoYW5nZWQnLFxuICAnLS11cGRhdGUtc25hcHNob3RzJyxcbiAgJy0tdXBkYXRlLXNvdXJjZS1tZXRob2QnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbJy1jJywgJy1nJywgJy1qJ10pO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMsIHR5cGUgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHByb2plY3QuaGFzUGxheXdyaWdodENvbmZpZykge1xuICAgICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgc3RhcnRDb21tYW5kLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddO1xuICAgIGNvbnN0IHRlc3RDb21tYW5kID0gdGhpcy50ZXN0VW5pdChwcm9qZWN0LCB7IC4uLmFyZ3YsIHRhcmdldHM6IG5vcm1hbGl6ZWRUYXJnZXRzIH0pO1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBZQVJOIG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgU0VSVkVSX0xPR19GSUxFID0gJ3NlcnZlci5sb2cnO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBTRVJWRVJfTE9HX0ZJTEUgfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQge1xuICBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCxcbiAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZCxcbiAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyB2aW5leHQgKE5leHQuanMgb24gVml0ZSkgYXBwcyB0YXJnZXRpbmcgQ2xvdWRmbGFyZSBXb3JrZXJzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaW5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgLy8gVW5saWtlIGBuZXh0IGRldmAsIFZpdGUtYmFzZWQgdmluZXh0IGRvZXMgbm90IHJlYWQgdGhlIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAgY29uc3QgZGV2Q29tbWFuZCA9IGBZQVJOIHZpbmV4dCBkZXYgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAvLyBUaGUgQ2xvdWRmbGFyZSB2aXRlIHBsdWdpbiAobWluaWZsYXJlKSByZWFkcyBydW50aW1lIHZhcnMgb25seSBmcm9tIGEgLmRldi52YXJzIGZpbGUsXG4gICAgLy8gc28gaXQgbXVzdCBiZSByZWdlbmVyYXRlZCBmcm9tIHRoZSB3Yi1tYW5hZ2VkIC5lbnYgZmlsZXMgYmVmb3JlIHNlcnZpbmcuXG4gICAgY29uc3QgY29tbWFuZHMgPSBbYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnLmRldi52YXJzJyldO1xuICAgIC8vIGB2aW5leHQgZGV2YCAobWluaWZsYXJlKSBzdGFydHMgd2l0aCBhbiBlbXB0eSBsb2NhbCBEMSBhbmQgYXBwbGllcyBubyBtaWdyYXRpb25zIGl0c2VsZjtcbiAgICAvLyB0aGUgdGVzdCBlbnZpcm9ubWVudCB3aXBlcyBpdHMgc3RhdGUgZGlyZWN0b3J5LCBzbyBldmVyeSBwYWdlIHdvdWxkIDUwMCB3aXRob3V0IHRoaXMuXG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZCA9IGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgPyBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobWlncmF0aW9uQ29tbWFuZCkgY29tbWFuZHMucHVzaChtaWdyYXRpb25Db21tYW5kKTtcbiAgICByZXR1cm4gWy4uLmNvbW1hbmRzLCBkZXZDb21tYW5kXS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgLy8gU2VydmluZyB0aGUgYnVpbHQgd29ya2VyIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IChvciB3aXBlZCkgbG9jYWwgRDEsIHNvIHdyYW5nbGVyLW5hdGl2ZVxuICAgIC8vIG1pZ3JhdGlvbnMgKGlmIGFueSkgbXVzdCBiZSBhcHBsaWVkIGZpcnN0OyBkcml6emxlL3ByaXNtYSBtaWdyYXRpb25zIGFyZSBoYW5kbGVkIGJ5XG4gICAgLy8gYnVpbGRQcm9kdWN0aW9uQ29tbWFuZC5cbiAgICBjb25zdCBkMU1pZ3JhdGlvbnNDb21tYW5kID0gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCk7XG4gICAgLy8gYHZpbmV4dCBidWlsZGAgZW1pdHMgYSB3b3JrZXIgYnVuZGxlIGFuZCBpdHMgd3JhbmdsZXIgY29uZmlnIHVuZGVyIGRpc3Qvc2VydmVyLCBzbyB0aGVcbiAgICAvLyAuZGV2LnZhcnMgZmlsZSBleHBvc2luZyB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcyBtdXN0IGJlIGdlbmVyYXRlZCBhZnRlciBidWlsZGluZy5cbiAgICAvLyBgLS1sb2NhbC11cHN0cmVhbWAga2VlcHMgcmVxdWVzdCBVUkxzIG9uIHRoZSBsb2NhbCBob3N0OyBvdGhlcndpc2UsIHdyYW5nbGVyIGRldiBzaW11bGF0ZXNcbiAgICAvLyB0aGUgcHJvZHVjdGlvbiBjdXN0b20gZG9tYWluIGRlY2xhcmVkIGluIHRoZSB3cmFuZ2xlciBjb25maWcgcm91dGVzLlxuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJ2Rpc3Qvc2VydmVyLy5kZXYudmFycycpLFxuICAgICAgLi4uKGQxTWlncmF0aW9uc0NvbW1hbmQgPyBbZDFNaWdyYXRpb25zQ29tbWFuZF0gOiBbXSksXG4gICAgICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChcbiAgICAgICAgYGRldiAtLWNvbmZpZyBkaXN0L3NlcnZlci93cmFuZ2xlci5qc29uIC0taXAgMTI3LjAuMC4xIC0tcG9ydCAke3BvcnR9IC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiIC0tbG9jYWwtdXBzdHJlYW0gbG9jYWxob3N0OiR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKVxuICAgICAgKSxcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aW5leHRTY3JpcHRzID0gbmV3IFZpbmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgSHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHBzIChkZXRlY3RlZCB2aWEgYSB3cmFuZ2xlclxuICogY29uZmlnIGZpbGUgd2hlbiBubyBvdGhlciBmcmFtZXdvcmsgbWF0Y2hlczsgdmluZXh0IGFwcHMgaGF2ZSB0aGVpciBvd24gc2NyaXB0cykuXG4gKiBFeHRlbmRzIEh0dHBTZXJ2ZXJTY3JpcHRzIHNvIHRoYXQgZTJlIHRlc3RzIHJ1biB2aWEgdGhlIHVuaXQtdGVzdCBydW5uZXIgYWdhaW5zdCB0aGUgcnVubmluZ1xuICogd29ya2VyIHdoZW4gdGhlIHByb2plY3QgaGFzIG5vIFBsYXl3cmlnaHQgY29uZmlnLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBXb3JrZXJzU2NyaXB0cyBleHRlbmRzIEh0dHBTZXJ2ZXJTY3JpcHRzIHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0LCBhcmd2KS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICAvLyB3cmFuZ2xlciBkZXYgYnVuZGxlcyB0aGUgd29ya2VyIGl0c2VsZiwgc28gbm8gc2VwYXJhdGUgYnVpbGQgc3RlcCBpcyBuZWVkZWQuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnODc4Nyc7XG4gICAgY29uc3Qgc3RhdGVEaXIgPSBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCk7XG5cbiAgICAvLyBUaGVzZSBoZWxwZXJzIHJlYWQgdGhlIGRlZmF1bHQtbmFtZWQgd3JhbmdsZXIgY29uZmlnOyB0aGF0IGlzIHNhZmUgYmVjYXVzZSB3b3JrZXJzU2NyaXB0c1xuICAgIC8vIGl0c2VsZiBpcyBvbmx5IHNlbGVjdGVkIHdoZW4gc3VjaCBhIGNvbmZpZyBmaWxlIGV4aXN0cyBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuXG4gICAgY29uc3QgY29tbWFuZHMgPSBbYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnLmRldi52YXJzJyldO1xuICAgIC8vIEFwcGx5IHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIChpZiBhbnkpIHNvIHRoZSBsb2NhbCBkYXRhYmFzZSBtYXRjaGVzIHRoZSBkZXBsb3llZCBvbmUuXG4gICAgY29uc3QgZDFNaWdyYXRpb25zQ29tbWFuZCA9IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpO1xuICAgIGlmIChkMU1pZ3JhdGlvbnNDb21tYW5kKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGQxTWlncmF0aW9uc0NvbW1hbmQpO1xuICAgIH1cbiAgICBjb21tYW5kcy5wdXNoKFxuICAgICAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoXG4gICAgICAgIGBkZXYgLS1pcCAxMjcuMC4wLjEgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gLS1wZXJzaXN0LXRvIFwiJHtzdGF0ZURpcn1cIiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHdvcmtlcnNTY3JpcHRzID0gbmV3IFdvcmtlcnNTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiU3RhcnQgYXBwLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGFwcCBjb21tYW5kLiBFeGFtcGxlOiB3YiBzdGFydCAtLSAtLWhvc3QgMC4wLjAuMFwiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KS5vcHRpb25zKGJ1aWxkZXIpIGFzIEFyZ3Y8XG4gICAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuICAgID4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy52aW5leHQgfHwgZGV2RGVwcy52aW5leHQpIHtcbiAgICAgICAgLy8gdmluZXh0IGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gdGhpcyBjaGVjayBtdXN0IGNvbWUgZmlyc3QuXG4gICAgICAgIHNjcmlwdHMgPSB2aW5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCkpIHtcbiAgICAgICAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICAgICAgICBzY3JpcHRzID0gd29ya2Vyc1NjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlID8/ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ2RldmVsb3BtZW50JztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERldihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhd2FpdCBzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQgPSAyMDA7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPID0gMC4wNTtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246ICdIb3cgdG8gcnVuIEUyRSB0ZXN0cycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYmFpbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RvcCB0ZXN0cyBhZnRlciB0aGUgZmlyc3QgZmFpbHVyZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgYXJyYXk6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdVbml0IG9yIEUyRSB0ZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFRlc3RDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj47XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VGVzdENvbW1hbmRPcHRpb25zPiAmIHsgJy0tJz86IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdFJ1bk9wdGlvbnMge1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVGVzdENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgZmxhZ3MgdG8gUGxheXdyaWdodC4gRXhhbXBsZTogd2IgdGVzdCAtLSAtLWdyZXAgJ3VwbG9hZGVkIGltYWdlIGFzc2V0J1wiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pOiBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4gPT5cbiAgICB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpXG4gICAgICAucG9zaXRpb25hbCgndGFyZ2V0cycsIGFyZ3VtZW50c0J1aWxkZXIudGFyZ2V0cykgYXMgQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoYXJndjogVGVzdENvbW1hbmRBcmd2LCBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3YpO1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHModGVzdEFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKHRlc3RBcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IHRlc3RBcmd2WyctLSddID8/IFtdO1xuICBjb25zdCB7IHNob3VsZFJ1bkUyZSwgc2hvdWxkUnVuVW5pdCB9ID0gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKHRlc3RUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgZW52aXJvbm1lbnQgZWFnZXJseTogd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudiBmb3JjZXMgdGhlIHRlc3QgY2FzY2FkZSBhbmRcbiAgICAvLyBQcm9qZWN0LmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudiBmYWxscyBiYWNrIFdCX0VOViB0byB0aGF0IG1vZGUg4oCUIGJ1dCB0aGUgZW52IGdldHRlciBpc1xuICAgIC8vIGxhenksIHNvIGEgcHJvamVjdCB3aXRoIG5vIHJ1bm5hYmxlIHRlc3RzIHdvdWxkIG90aGVyd2lzZSBza2lwIHRoZSB2YWxpZGF0aW9uIGVudGlyZWx5LlxuICAgIHZvaWQgcHJvamVjdC5lbnY7XG5cbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSB7XG4gICAgICAvLyB2aW5leHQgYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyB0aGlzIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbiAgICAgIHNjcmlwdHMgPSB2aW5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpKSB7XG4gICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICBzY3JpcHRzID0gd29ya2Vyc1NjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZGVmYXVsdFVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgICB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiBkZWZhdWx0VW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IGRlZmF1bHRVbml0VGFyZ2V0cyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgIHRpbWVvdXQ6IHRlc3RBcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBpZiAoc2hvdWxkUnVuRTJlKSB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZShwcm9qZWN0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBlMmUgdGFyZ2V0cyBmb3IgdGhpcyBwcm9qZWN0XG4gICAgY29uc3QgZTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMuYmxpdHogfHwgZGVwcy5uZXh0IHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10gfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgICAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vKipcbiAqIFdhcm4gd2hlbiBhIHByb2plY3QgaGFzIGEgUGxheXdyaWdodCBjb25maWcgYnV0IG5vIHRlc3QvZTJlIGRpcmVjdG9yeS5cbiAqIHdiIGRpc2NvdmVycyBlMmUgdGVzdHMgb25seSB1bmRlciB0ZXN0L2UyZS8sIHNvIHN1Y2ggcHJvamVjdHMgd291bGQgb3RoZXJ3aXNlIGhhdmUgdGhlaXJcbiAqIFBsYXl3cmlnaHQgc3BlY3Mgc2lsZW50bHkgc2tpcHBlZCBhbmQgYHdiIHRlc3RgIC8gYHdiIHZlcmlmeSAtLWZ1bGxgIHdvdWxkIHJlcG9ydCBzdWNjZXNzXG4gKiB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ25hbWUnIHwgJ3BhY2thZ2VKc29uJz5cbik6IHZvaWQge1xuICAvLyBDYWxsZXJzIGludm9rZSB0aGlzIG9ubHkgYWZ0ZXIgZXN0YWJsaXNoaW5nIHRoYXQgdGVzdC9lMmUgaXMgbWlzc2luZywgc28gaXQgaXMgbm90IHJlLWNoZWNrZWRcbiAgLy8gaGVyZS4gQSB3b3Jrc3BhY2Ugcm9vdCBkZWxlZ2F0ZXMgZTJlIHRvIGl0cyBwYWNrYWdlcywgc28gaXQgbmV2ZXIgd2FybnMgKGNoZWNrZWQgZmlyc3QgdG8gc2tpcFxuICAvLyB0aGUgZmlsZXN5c3RlbSBsb29rdXAgYmVsb3cpLiBPbmx5IGEgcHJvamVjdCdzIE9XTiBQbGF5d3JpZ2h0IGNvbmZpZyBjb3VudHM6IGBoYXNQbGF5d3JpZ2h0Q29uZmlnYFxuICAvLyB3YWxrcyB1cCB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc28gcmV1c2luZyBpdCB3b3VsZCBmYWxzZS1wb3NpdGl2ZSBvbiBsaWJyYXJ5IHBhY2thZ2VzIGFuZCB0aGVcbiAgLy8gcm9vdCBpdHNlbGYsIHdoaWNoIGxlZ2l0aW1hdGVseSBzaGFyZSBhIHJvb3QtbGV2ZWwgcGxheXdyaWdodC5jb25maWcudHMgYnV0IGtlZXAgZTJlIHNwZWNzIGluIGFcbiAgLy8gc2luZ2xlIGFwcCBwYWNrYWdlLlxuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSByZXR1cm47XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKSkpIHJldHVybjtcblxuICBjb25zb2xlLndhcm4oXG4gICAgY2hhbGsueWVsbG93KFxuICAgICAgYFNraXBwaW5nIGUyZSB0ZXN0cyBmb3IgJHtwcm9qZWN0Lm5hbWV9OiBhIFBsYXl3cmlnaHQgY29uZmlnIGV4aXN0cyBidXQgdGhlIHRlc3QvZTJlIGRpcmVjdG9yeSBpcyBtaXNzaW5nLiB3YiBvbmx5IGRpc2NvdmVycyBQbGF5d3JpZ2h0IHNwZWNzIHVuZGVyIHRlc3QvZTJlLywgc28gbW92ZSB0aGVtIHRoZXJlIHRvIHJ1biBlMmUgdGVzdHMuYFxuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndjogVGVzdENvbW1hbmRBcmd2KTogVGVzdENvbW1hbmRBcmd2IHtcbiAgaWYgKGFyZ3YuZW52Py5sZW5ndGggfHwgYXJndi5jYXNjYWRlRW52IHx8IGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiA9PT0gZmFsc2UpIHtcbiAgICAvLyBFeHBsaWNpdCBlbnYgZmxhZ3Mga2VlcCB0aGVpciBmaWxlLXNlbGVjdGlvbiBzZW1hbnRpY3MsIGJ1dCB0aGUgc3Bhd25lZCB0ZXN0cyBtdXN0IHN0aWxsXG4gICAgLy8gcnVuIGFzIGB0ZXN0YCB3aGVuIHRob3NlIGZpbGVzIGRlZmluZSBubyBXQl9FTlYgKHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKS5cbiAgICByZXR1cm4geyAuLi5hcmd2LCBjb21tYW5kRGVmYXVsdFdiRW52OiAndGVzdCcgfTtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSA/IFsndGVzdCcsICctLWV4Y2x1ZGUnLCAndGVzdC9lMmUvKionXSA6IFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgd29ya2Vyc1NjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZSB9IGZyb20gJy4vdGVzdC5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBTcGF3bmVkIGNvbW1hbmRzIHJlLWRlcml2ZSB0aGVpciBkb3RlbnYgY2FzY2FkZSBmcm9tIHRoZSBleHBvcnRlZCBXQl9FTlYsIHNvIGFuIHVuZXhwb3J0ZWRcbiAgLy8gV0JfRU5WIHdvdWxkIGxldCBhIGNvbW1pdHRlZCBgLmVudmAgKGUuZy4gV0JfRU5WPWRldmVsb3BtZW50KSBzZWxlY3QgdGhlIGRldmVsb3BtZW50XG4gIC8vIGVudmlyb25tZW50IOKAlCBydW5uaW5nIHRoZSBkZXN0cnVjdGl2ZSBlMmUgc3VpdGUgYWdhaW5zdCB0aGUgZGV2ZWxvcGVyJ3Mgb3duIGRhdGFiYXNlLlxuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuQ0kgfHw9ICcxJztcbiAgICAvLyBPdmVyd3JpdGUsIG5vdCB8fD06IHByb2plY3QuZW52IGFscmVhZHkgY2FycmllcyB0aGUgZG90ZW52LWRlcml2ZWQgdmFsdWUuXG4gICAgcHJvamVjdC5lbnYuV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuXG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLnZpbmV4dCB8fCBkZXZEZXBzLnZpbmV4dCkge1xuICAgICAgLy8gdmluZXh0IGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gdGhpcyBjaGVjayBtdXN0IGNvbWUgZmlyc3QuXG4gICAgICBzY3JpcHRzID0gdmluZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkge1xuICAgICAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICAgICAgc2NyaXB0cyA9IHdvcmtlcnNTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3QgaGFzRG9ja2VyZmlsZSA9IHByb2plY3QuaGFzRG9ja2VyZmlsZTtcbiAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIC8vIENvbmZpcm0gZGV2IHNlcnZlciBzdGFydHVwIGZvciBjb25zaXN0ZW5jeSBhY3Jvc3MgcHJvamVjdHMgd2l0aCBFMkUgdGVzdHMuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGF3YWl0IHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NyaXB0ID0gaGFzRG9ja2VyZmlsZVxuICAgICAgICA/IGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7fSlcbiAgICAgICAgOiBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHt9KTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0LnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUocHJvamVjdCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmludGVyZmFjZSBUcmVlS2lsbENvbW1hbmRBcmdzIHtcbiAgcGlkOiBudW1iZXI7XG4gIHNpZ25hbDogc3RyaW5nO1xufVxuXG5jb25zdCBidWlsZGVyID0gKHlhcmdzOiBBcmd2KTogQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPiA9PlxuICB5YXJnc1xuICAgIC5wb3NpdGlvbmFsKCdwaWQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwcm9jZXNzIElEIHRvIGtpbGwuJyxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbignc2lnbmFsJywge1xuICAgICAgZGVzY3JpcHRpb246ICdTaWduYWwgdG8gc2VuZCB0byB0aGUgcHJvY2VzcyB0cmVlLicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHQ6ICdTSUdURVJNJyxcbiAgICB9KSBhcyBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+O1xuXG5leHBvcnQgY29uc3QgdHJlZUtpbGxDb21tYW5kOiBDb21tYW5kTW9kdWxlPG9iamVjdCwgVHJlZUtpbGxDb21tYW5kQXJncz4gPSB7XG4gIGNvbW1hbmQ6ICd0cmVlLWtpbGwgPHBpZD4gW3NpZ25hbF0nLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIGdpdmVuIHByb2Nlc3MgYW5kIGFsbCBkZXNjZW5kYW50cycsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBhcmd2LnNpZ25hbCBhcyBOb2RlSlMuU2lnbmFscztcbiAgICAgIGlmICghKHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpZ25hbDogJHtzaWduYWx9YCk7XG4gICAgICB9XG4gICAgICB0cmVlS2lsbChhcmd2LnBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xuZXhwb3J0IHR5cGUgVHlwZUNoZWNrQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0eXBlQ2hlY2soYXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHR5cGVDaGVjayhhcmd2OiBUeXBlQ2hlY2tDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBsZXQgcmVtb3ZlZE5leHREaXIgPSBmYWxzZSBhcyBib29sZWFuO1xuICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzIHx8IHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgICAgY29tbWFuZHMucHVzaCguLi5idWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0KSk7XG4gICAgfVxuICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgncHlyaWdodCcpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICB9XG4gICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZUNvbG9yOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgcmVtb3ZlZE5leHREaXIgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgfVxuICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgIH1cbiAgfVxuICBpZiAoIWZpbmFsRXhpdENvZGUpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgIHJlbW92ZWROZXh0RGlyXG4gICAgICAgICAgPyAnLS0tLS1cXG5ObyB0eXBlIGVycm9ycyBmb3VuZC4gUGxlYXNlIGlnbm9yZSB0aGUgcHJldmlvdXMgdHlwZSBlcnJvcnMsIGFzIHRoZXkgd2VyZSBjYXVzZWQgYnkgb3V0ZGF0ZWQgTmV4dC5qcyBjYWNoZSBmaWxlcy4nXG4gICAgICAgICAgOiAnTm8gdHlwZSBlcnJvcnMgZm91bmQuJ1xuICAgICAgKVxuICAgICk7XG4gIHJldHVybiBmaW5hbEV4aXRDb2RlO1xufVxuXG5mdW5jdGlvbiBidWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyBgdHlwZXNjcmlwdGAgKGB0c2NgKTsgd2JmeSByZW1vdmVzIHRoZVxuICAvLyBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSBwcmV2aWV3IGZyb20gbm9uLU5leHQuanMgcmVwb3MgKE5leHQuanMtZmFtaWx5XG4gIC8vIHJlcG9zIGtlZXAgaXQgZm9yIGBuZXh0IGJ1aWxkYCksIHNvIHJlcG9zIHN0aWxsIG9uIHRoZSBwcmV2aWV3IHNob3VsZCBydW4gd2JmeVxuICAvLyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYSB0c2dvIGZhbGxiYWNrIGhlcmUuXG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3R5cGVzY3JpcHQnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2MgLS1ub0VtaXQnXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMsIGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgbGludCwgdHlwZSBMaW50Q29tbWFuZEFyZ3YgfSBmcm9tICcuL2xpbnQuanMnO1xuaW1wb3J0IHsgdGVzdCwgdHlwZSBUZXN0Q29tbWFuZEFyZ3YsIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYgfSBmcm9tICcuL3Rlc3QuanMnO1xuaW1wb3J0IHsgdHlwZUNoZWNrLCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2IH0gZnJvbSAnLi90eXBlY2hlY2suanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmdWxsOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIGRlc2NyaWJlOiAnUnVuIHRlc3RzIGFmdGVyIHZlcmlmeWluZyBwcm9qZWN0IGNvZGUnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz47XG50eXBlIFBhY2thZ2VDb21tYW5kQXJndiA9IFBpY2s8VmVyaWZ5Q29kZUNvbW1hbmRBcmd2LCAnZHJ5UnVuJyB8ICd2ZXJib3NlJz47XG5cbmV4cG9ydCBjb25zdCB2ZXJpZnlDb2RlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndmVyaWZ5JyxcbiAgZGVzY3JpYmU6ICdWZXJpZnkgcHJvamVjdCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGF3YWl0IChhcmd2LmZ1bGwgPyB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdHMuc2VsZiwgYXJndikgOiB2ZXJpZnlDb2RlKHByb2plY3RzLnNlbGYsIGFyZ3YpKTtcbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGVGdWxseShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3J0ZXIgPSBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3QsIGFyZ3YpO1xuICAgIGF3YWl0IHJ1blByb2plY3RUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgIHJlcG9ydGVyLnN1Y2NlZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRlci5mYWlsKGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZXBvcnRlci5maW5pc2goKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gaW5zdGFsbGAsIHByb2plY3QsIGFyZ3YpO1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKFxuICAgICdjbGVhbnVwJyxcbiAgICAoKSA9PlxuICAgICAgbGludCh7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIF86IFsnbGludCddLFxuICAgICAgICBmaXg6IHRydWUsXG4gICAgICAgIGZvcm1hdDogdHJ1ZSxcbiAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgfSBhcyB1bmtub3duIGFzIExpbnRDb21tYW5kQXJndiksXG4gICAgeyBzaWxlbnQ6IHRydWUgfVxuICApO1xuICAvLyBUeXBlLWF3YXJlIGxpbnQgcmVwb3J0cyBUeXBlU2NyaXB0IGRpYWdub3N0aWNzIG9ubHkgZm9yIHRoZSBmaWxlcyBveGxpbnQgYWN0dWFsbHkgbGludHMsIGFuZFxuICAvLyB0aGUgc2hhcmVkIGNvbmZpZyBpZ25vcmVzIGRpcmVjdG9yaWVzIHRzYyBzdGlsbCBjb21waWxlcyAoZS5nLiBgX19nZW5lcmF0ZWRfX2AsIGBAdHlwZXNgLFxuICAvLyBgZGlzdGApLiBLZWVwIHRoZSB0eXBlY2hlY2sgY29tbWFuZCBzbyBgdmVyaWZ5YCBzdGF5cyBlcXVpdmFsZW50IHRvIFwidGhlIHJlcG9zaXRvcnkgY29tcGlsZXNcIi5cbiAgLy8gVGhlIG92ZXJsYXAgd2l0aCBsaW50IGlzIGRlbGliZXJhdGU6IGAtLXR5cGUtYXdhcmVgIGFsc28gcG93ZXJzIHR5cGUtYXdhcmUgbGludCBydWxlcywgYW5kXG4gIC8vIGRyb3BwaW5nIG9ubHkgYC0tdHlwZS1jaGVja2AgZnJvbSBsaW50IHNhdmVzIH4wLjFzLCBmYXIgbGVzcyB0aGFuIHRoZSBjb3ZlcmFnZSBpdCB3b3VsZCBjb3N0LlxuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKFxuICAgICd0eXBlY2hlY2snLFxuICAgICgpID0+IHR5cGVDaGVjayh7IC4uLmFyZ3YsIF86IFsndHlwZWNoZWNrJ10gfSBhcyB1bmtub3duIGFzIFR5cGVDaGVja0NvbW1hbmRBcmd2KSxcbiAgICB7IHNpbGVudDogdHJ1ZSB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByb2plY3RUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoe1xuICAgIC4uLmFyZ3YsXG4gICAgXzogWyd0ZXN0J10sXG4gICAgZTJlOiAnaGVhZGxlc3MnLFxuICAgIHNpbGVudDogdHJ1ZSxcbiAgfSBhcyB1bmtub3duIGFzIFRlc3RDb21tYW5kQXJndik7XG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAoZXhpdENvZGUgPT09IDApIHJldHVybjtcblxuICBpZiAoIXByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkYi1yZXNldCddKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksICd0ZXN0JykpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oXG4gICAgY2hhbGsueWVsbG93KCdUZXN0cyBmYWlsZWQuIFRoaXMgcHJvamVjdCBkZWZpbmVzIFwiZGItcmVzZXRcIiwgc28gd2Igd2lsbCByZXNldCB0aGUgZGF0YWJhc2Ugb25jZSBhbmQgcmV0cnkgdGVzdHMuJylcbiAgKTtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGRiLXJlc2V0YCwgZmluZFRlc3RQcm9qZWN0KHByb2plY3QsIHRlc3RBcmd2KSwgdGVzdEFyZ3YsIHtcbiAgICBwcmludFJhd091dHB1dDogdHJ1ZSxcbiAgfSk7XG5cbiAgY29uc3QgcmV0cnlFeGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKHJldHJ5RXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7cmV0cnlFeGl0Q29kZX0pOmApLCAndGVzdCBhZnRlciBkYi1yZXNldCByZXRyeScpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0cnlFeGl0Q29kZSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdUZXN0cyBwYXNzZWQgYWZ0ZXIgZGItcmVzZXQgcmV0cnkuJykpO1xufVxuXG5mdW5jdGlvbiBmaW5kVGVzdFByb2plY3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdENvbW1hbmRBcmd2KTogUHJvamVjdCB7XG4gIGNvbnN0IHRlc3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmICghdGVzdFByb2plY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2plY3Qgbm90IGZvdW5kOiAke3Byb2plY3QuZGlyUGF0aH1gKTtcbiAgfVxuICByZXR1cm4gdGVzdFByb2plY3Q7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH1cbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYWNrYWdlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBwcmVzZXJ2ZUNvbG9yOiBmYWxzZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKCFvcHRpb25zLnByaW50UmF3T3V0cHV0KSB7XG4gICAgcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kLCBleGl0Q29kZSwgcmV0LnN0ZG91dCk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDAgJiYgIW9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBQcmludHMgcGFja2FnZSBjb21tYW5kIG91dHB1dCBmb3IgYHdiIHZlcmlmeWAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIHNvIHN1Y2Nlc3NmdWwgbm9pc3lcbiAqIGNvbW1hbmRzIGFyZSBzdW1tYXJpemVkIHdoaWxlIGZhaWx1cmUgb3V0cHV0IHJlbWFpbnMgYXZhaWxhYmxlIGZvciBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgVGhlIGV4ZWN1dGVkIGNvbW1hbmQuXG4gKiBAcGFyYW0gZXhpdENvZGUgVGhlIGNvbW1hbmQgZXhpdCBjb2RlLlxuICogQHBhcmFtIG91dHB1dCBUaGUgbWVyZ2VkIHN0ZG91dCBhbmQgc3RkZXJyIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQ6IHN0cmluZywgZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwICYmIC9eKD86YnVufHlhcm4pICg/Omluc3RhbGx8Z2VuLWNvZGUpJC91LnRlc3QoY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGlmICh0cmltbWVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodHJpbW1lZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0OiBQcm9qZWN0KToge1xuICBmYWlsOiAoZXJyb3I/OiB1bmtub3duKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd2JEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy53YicpO1xuICBmcy5ta2RpclN5bmMod2JEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBsb2dGaWxlUGF0aCA9IHBhdGguam9pbih3YkRpclBhdGgsICd2ZXJpZnktZnVsbC5sb2cnKTtcbiAgY29uc3QgbG9nRmlsZSA9IGZzLm9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCAndycpO1xuICBjb25zdCBvcmlnaW5hbFN0ZG91dFdyaXRlID0gcHJvY2Vzcy5zdGRvdXQud3JpdGUuYmluZChwcm9jZXNzLnN0ZG91dCk7XG4gIGNvbnN0IG9yaWdpbmFsU3RkZXJyV3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKTtcbiAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IHRlZVdyaXRlKG9yaWdpbmFsU3Rkb3V0V3JpdGUsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZGVycldyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0Z1bGwgbG9nOicpLCBsb2dGaWxlUGF0aCkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoZmluaXNoZWQpIHJldHVybjtcbiAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IG9yaWdpbmFsU3Rkb3V0V3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gb3JpZ2luYWxTdGRlcnJXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG5cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IGZvcm1hdEVsYXBzZWRUaW1lKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWRlZCA/ICdTdWNjZWVkZWQnIDogJ0ZhaWxlZCc7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGAke3N0YXR1c30gaW4gJHtlbGFwc2VkVGltZX0uIEZ1bGwgbG9nOiAke2xvZ0ZpbGVQYXRofVxcbmA7XG4gICAgY29uc3QgY29sb3JlZFN1bW1hcnkgPSBzdWNjZWVkZWQgPyBjaGFsay5ncmVlbihzdW1tYXJ5KSA6IGNoYWxrLnJlZChzdW1tYXJ5KTtcbiAgICBvcmlnaW5hbFN0ZG91dFdyaXRlKGNvbG9yZWRTdW1tYXJ5KTtcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgc3VtbWFyeSk7XG4gICAgZnMuY2xvc2VTeW5jKGxvZ0ZpbGUpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnZXhpdCcsIGZpbmlzaCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmYWlsOiAoZXJyb3IpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmluaXNoOiAoKSA9PiB7XG4gICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdleGl0JywgZmluaXNoKTtcbiAgICAgIGZpbmlzaCgpO1xuICAgIH0sXG4gICAgc3VjY2VlZDogKCkgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0ZWVXcml0ZShvcmlnaW5hbFdyaXRlOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUsIGxvZ0ZpbGU6IG51bWJlcik6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSB7XG4gIHJldHVybiAoKFxuICAgIGNodW5rOiBVaW50OEFycmF5IHwgc3RyaW5nLFxuICAgIGVuY29kaW5nT3JDYWxsYmFjaz86IEJ1ZmZlckVuY29kaW5nIHwgKChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCksXG4gICAgY2FsbGJhY2s/OiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWRcbiAgKSA9PiB7XG4gICAgY29uc3QgYnVmZmVyID1cbiAgICAgIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBCdWZmZXIuZnJvbShjaHVuaywgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ3N0cmluZycgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiAndXRmOCcpXG4gICAgICAgIDogY2h1bms7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIGJ1ZmZlcik7XG4gICAgLy8gV3JpdGUgdG8gdGhlIHRlcm1pbmFsIHZpYSB0aGUgb3JpZ2luYWwgc3RyZWFtIG1ldGhvZDogYSBzeW5jaHJvbm91cyBmcy53cml0ZVN5bmMgb24gdGhlXG4gICAgLy8gc3Rkb3V0L3N0ZGVyciBmZCB0aHJvd3MgRUFHQUlOIG9uIENJJ3Mgbm9uLWJsb2NraW5nIHBpcGVzIHdoZW4gbGFyZ2Ugb3V0cHV0IGZsdXNoZXMgYXQgb25jZSxcbiAgICAvLyB3aGlsZSB0aGUgc3RyZWFtIG1ldGhvZCBidWZmZXJzIGludGVybmFsbHkgYW5kIGhhbmRsZXMgYmFja3ByZXNzdXJlLlxuICAgIHJldHVybiBvcmlnaW5hbFdyaXRlKGJ1ZmZlciwgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6IGNhbGxiYWNrKTtcbiAgfSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBgJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xuICB9XG4gIHJldHVybiBgJHttaW51dGVzfW0gJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBkZXBsb3lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9kZXBsb3kuanMnO1xuaW1wb3J0IHsgZG90ZW52Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZG90ZW52LmpzJztcbmltcG9ydCB7IGdlbkNvZGVDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5Db2RlLmpzJztcbmltcG9ydCB7IGdlbkRldlZhcnNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5EZXZWYXJzLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBtYWludGVuYW5jZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL21haW50ZW5hbmNlLmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZWxlYXNlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmVsZWFzZS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cFByaXZhdGVQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuUEFUSD8uaW5jbHVkZXMoJy9idW4tbm9kZS0nKSkge1xuICAgICAgLy8gTm90IGZpeGVkIHVwIGhlcmU6IHRvb2xzIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpIG1heSBoYW5nIG9yXG4gICAgICAvLyBjcmFzaCB1bmRlciB0aGUgc2hpbSwgYW5kIHNvbWUgKHdyYW5nbGVyIGRldikgZmFpbCBzaWxlbnRseSwgc28gc3VyZmFjZSB0aGUgY2F1c2UgdXBmcm9udC5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJXYXJuaW5nOiBQQVRIIGNvbnRhaW5zIGEgYnVuLW5vZGUgc2hpbSAoZnJvbSBgYnVuIC0tYnVuYCBvciBidW5maWcncyBgcnVuLmJ1bmApOyBcIiArXG4gICAgICAgICAgJ3J1biB3YiB3aXRob3V0IGAtLWJ1bmAgYW5kIHJlbW92ZSBgW3J1bl0gYnVuYCBmcm9tIGJ1bmZpZy50b21sLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQodmVyaWZ5Q29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChjb25jdXJyZW50bHlDb21tYW5kKVxuICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAuY29tbWFuZChkb3RlbnZDb21tYW5kKVxuICAuY29tbWFuZChnZW5Db2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuRGV2VmFyc0NvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChtYWludGVuYW5jZUNvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZWxlYXNlQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0cmVlS2lsbENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuXG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2Nlc3MucGlkfSkgZHVyaW5nIHNodXRkb3duOmAsIGVycm9yKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls2LDcsOCw5LDEwXSwibWFwcGluZ3MiOiJneUJBUUEsTUFBYSxFQUE0QixDQUN2QyxJQUFLLENBQ0gsWUFBYSwyQkFDYixNQUFPLEVBQ1AsS0FBTSxPQUNSLEVBQ0EsY0FBZSxDQUNiLFlBQ0Usd0xBQ0YsS0FBTSxRQUNSLEVBQ0EsbUJBQW9CLENBQ2xCLFlBQWEsMEZBQ2IsS0FBTSxTQUNSLEVBQ0EsbUJBQW9CLENBQ2xCLFlBQWEsaUVBQ2IsS0FBTSxV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QUFXLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxXQUFXLE1BQU0sV0FBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksV0FBVyxNQUFNLFdBQVcsTUFBTSxXQUFXLE1BQU0sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFLFdBQVcsV0FBVyxXQUFXLFdBQVcsTUFBTSxXQUFXLFdBQVcsRUFBRSxXQUFXLFVBQVUsRUFBRSxTQUFTQyxHQUFFLEVBQUUsQ0FBQyxPQUFPLElBQUksR0FBRSxJQUFJLEdBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNQyxHQUFFLEdBQUcsQ0FBQyxJQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFNLEdBQU4sS0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLFFBQVEsRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLFdBQVcsTUFBTSxHQUFHLElBQUksRUFBRSxLQUFLLFVBQVUsS0FBSyxZQUFZLEVBQUUsS0FBSyxhQUFhLEdBQUcsRUFBRSxLQUFLLFlBQVksR0FBRyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEtBQUssVUFBVSxNQUFVLE1BQU0seUJBQXlCLEVBQUUsSUFBTSxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLE1BQU0sSUFBSSxLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHRixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUlBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sR0FBRyxPQUFPLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEtBQUssSUFBSSxHQUFHLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxHQUFHLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsTUFBTSxHQUFHLEtBQUssY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsRUFBRSxLQUFLLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFNLE1BQUssTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLENBQUMsRUFBRSxJQUFNLEVBQUUsS0FBSyxPQUFXLEVBQUUsS0FBSyxjQUFvQixFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEtBQUssUUFBUSxFQUFFLEdBQUcsS0FBSyxnQkFBZ0IsS0FBSyxVQUFVLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFLElBQU0sRUFBRSxLQUFLLFdBQWUsRUFBRSxLQUFLLEVBQVEsRUFBRSxLQUFLLGFBQWEsRUFBRSxLQUFLLFdBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHRCxFQUFFLEdBQUcsRUFBRSxJQUFJQSxFQUFFLEdBQUcsR0FBR0EsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEVBQUUsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFRyxHQUFFLENBQUMsRUFBRUMsR0FBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUdKLEVBQUUsR0FBRyxFQUFFLElBQUlBLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFDLE1BQU1JLEdBQUUsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUUsR0FBRSxFQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFHLEdBQUcsRUFBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssR0FBRyxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksRUFBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUcsRUFBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUcsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRyxDQUFDLEVBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRyxFQUFFLElBQUksRUFBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRSxHQUFHLEVBQUUsSUFBSSxHQUFFLEVB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QUFZLElBQVQsSUFBSyxHQUFNLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLE9BQU8sRUFBekIsQ0FBNEIsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxHQUFVLElBQVAsS0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsR0FBRSxPQUFPLEVBQUUsQ0FBQyxJQUFNLEVBQUUsR0FBRSxPQUFPLEdBQUUsT0FBTyxFQUFFLEdBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBSyxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQU0sRUFBRSxFQUFFLFlBQVksR0FBZSxPQUFPLEdBQW5CLFdBQXFCLENBQUMsSUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBWSxJQUFULElBQUssR0FBTSxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFNLEVBQUUsT0FBTyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENDQXZwQyxTQUFTLEdBQUUsRUFBRSxFQUFFLENBQUMsT0FBT0UsR0FBRUMsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFpQyxTQUFTLElBQUcsQ0FBQyxNQUFNLEVBQUUsQ0NBMUYsTUFBTSxFQUFFLEdBQUUsQ0FBQyxZQUFZQyxFQUFDLENBQUMsRUFBSSxHQUFFLENBQUMsWUFBWUMsRUFBQyxDQUFDLEVBQUUsU0FBUyxHQUFFLENBQUMsY0FBYyxFQUFFLElBQXlCLFlBQVksRUFBRUQsSUFBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFpQixHQUFHLE9BQWQsU0FBbUIsVUFBVSxDQUFDLElBQU0sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQyxJQUFNLEVBQUUsRUFBRSxLQUFLLENBQUMs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
|
|
96
|
+
--build-arg WB_VERSION=${n}${i} .`}stopAndStart(e,t=``,n=``){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t=``,n=``){bi(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 ts=class{shouldWaitAndOpenApp;constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return Q.buildImage(e,t)}async startDev(e,t){return await ci(e.env.PORT,e),this.shouldWaitAndOpenApp?W([`YARN`,`wb`,`concurrently`,...Ft(t),`--kill-others-on-fail`,this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await ci(e.env.PORT,e),this.shouldWaitAndOpenApp?W([`YARN`,`wb`,`concurrently`,...Ft(t),`--kill-others-on-fail`,this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await ci(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await ci(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,`development`)}
|
|
97
|
+
&& ${W([`YARN`,`wb`,`concurrently`,...Ft(t),`--kill-others-on-fail`,Q.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,`development`)}
|
|
98
|
+
&& ${Q.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`}startProductionProtected(e,n){let r=ns(e);if(r){let i=`${W([`bash`,r])} ${n.normalizedArgsText??``}`.trim(),a=t.dirname(t.dirname(r));return this.buildProductionCommand(e,n,[e.buildCommand,a===e.dirPath?i:`(${W([`cd`,a])} && ${i})`])}let i=rs(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=st(e,`test`)&&K(e)?[`rm -Rf "${sn(e)}"`]:[],i=!!an(e);return[...[...r,...e.hasPrisma?[ur.migrate(e)]:[],...e.hasDrizzle&&!i?[nn(e,kn.migrateForStart(e))]:[]].flatMap(e=>e.split(`&&`)),...n].filter(Boolean).map(e=>`${e} ${es(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,Q.stopAndStart(e),n)}async testStart(e,t){return e.env.PORT||=`3000`,await ci(e.env.PORT,e),`${Zt(`NODE_ENV`,``)} ${W([`YARN`,`wb`,`concurrently`,...Ft(t),`--kill-others`,`--success`,`first`,this.startDevProtected(e,t),this.waitApp(e)])}`}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:i=[`test`,`test/e2e/`]}){e.env.PORT||=`3000`;let a=await ci(e.env.PORT,e),o=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,s=is(i,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${s}${o}`:W([`YARN`,`wb`,`concurrently`,...Ft(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`${$(a,`-t 600000 -i 2000`)}
|
|
99
|
+
&& ${s}${o}`])}testUnit(e,t){let n=t.targets?.map(String);return e.hasVitest?W([`YARN`,`vitest`,`run`,...n?.length?n:[`test/unit/`],`--passWithNoTests`,`--allowOnly`,`--watch=false`,...t.bail?[`--bail=1`]:[]]):e.isBunAvailable?W([`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
|
|
100
|
+
|| ${$(t,`-t 10000 -i 500`)} 2> /dev/null
|
|
101
|
+
|| ${$(t,`-t 10000 -i 1000`)} 2> /dev/null
|
|
102
|
+
|| ${$(t,`-t 10000 -i 2000`)} 2> /dev/null
|
|
103
|
+
|| ${$(t,`-t 20000 -i 4000`)} 2> /dev/null
|
|
104
|
+
|| ${$(t,`-t 60000 -i 5000`)} 2> /dev/null
|
|
105
|
+
|| ${$(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 ns(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function rs(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function is(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return as([...i,...e,...r],n);let o=e.slice(1),s=os(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return as([...i,`test`,...a,...c,...r],n)}function as(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=`))?W(e):W([...e,`--max-failures=1`])}function os(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;ss.has(i)?t=`required`:cs.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&ls.has(e)&&(t=`required`);continue}n.push(r)}return n}const ss=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`]),cs=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),ls=new Set([`-c`,`-g`,`-j`]),us=new class extends ts{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??``}`}};var ds=class extends ts{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 ci(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 W([`YARN`,`wb`,`concurrently`,...Ft(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`${$(i,`-t 600000 -i 2000`)} && ${c}${a}`])}};const fs=new ds,ps=new class extends ts{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 ts{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`)} && ${Q.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(){return Promise.resolve(`echo 'do nothing.'`)}testE2EProduction(){return Promise.resolve(`echo 'do nothing.'`)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},hs=new class extends ts{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??``}`}},gs=new class extends ts{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[$t(t,`.dev.vars`)],i=st(e,`test`)?tn(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=tn(e);return[e.buildCommand,$t(t,`dist/server/.dev.vars`),...r?[r]:[],en(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${sn(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},_s=new class extends ts{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()}},vs=new class extends ds{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=sn(e),r=[$t(t,`.dev.vars`)],i=tn(e);return i&&r.push(i),r.push(en(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}},ys=[`express`,`fastify`,`elysia`,`hono`],bs={...Qo,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},xs={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(bs),async handler(e){$o(e);let t=await B(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.blitz)i=us;else if(t.vinext||r.vinext)i=gs;else if(t.next)i=ps;else if(r[`@remix-run/dev`])i=hs;else if(r.vite)i=_s;else if(K(n))i=vs;else if(ys.some(e=>t[e])&&!t[`firebase-functions`]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=fs;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 V(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await V(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await V(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await V(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await V(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},Ss=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),Cs=.05,ws={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`}},Ts={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},Es={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(ws).positional(`targets`,Ts.targets),async handler(e){process.exit(await Ds(e))}};async function Ds(n,r={}){let i=ks(n),a=await B(i);if(!a)return console.error(p.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=Bs(o,s);for(let n of a.descendants){n.env;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d;d=a.blitz?us:a.vinext||u.vinext?gs:a.next?ps:u[`@remix-run/dev`]?hs:u.vite?_s:K(n)?vs:ys.some(e=>a[e])&&!a[`firebase-functions`]?fs:ms,console.info(`Running "test" for ${n.name} ...`);let f=As(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 Ns(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&&Os(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 Ms(await d.testE2EProduction(n,m,{playwrightArgs:zs(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await Ms(await d.testE2EDev(n,m,{playwrightArgs:zs(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await js(n,m,d,zs(p,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await js(n,m,d,zs(p,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.blitz||a.next||u[`@remix-run/dev`]||u.vite)switch(i.e2e){case`headed`:{let e=await Ms(await d.testE2EProduction(n,m,{playwrightArgs:zs(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await Ms(await d.testE2EDev(n,m,{playwrightArgs:zs(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await Ms(await d.testE2EProduction(n,m,{playwrightArgs:zs(p,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await Ms(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 Ms(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function Os(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 As(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 V(`${n.buildDocker(e,`test`)}${es(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await Ms(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await V(Q.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function Ms(e,t,n,r={}){return V(e,t,n,{...r,processSilentOutput:Ps})}function Ns(e,t,n,r={}){return V(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function Ps(e){let t=[],n=new Set,r=[];for(let i of Fs(e)){let e=Ls(i);n.has(e)||t.some(t=>Rs(t,e))||(Is(t,n,e),r.push(i))}return r.join(`
|
|
106
|
+
`)}function*Fs(e){let t=0;for(;t<=e.length;){let n=e.indexOf(`
|
|
107
|
+
`,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function Is(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 Ls(e){return e.replaceAll(Ss,``).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 Rs(e,t){let n=Math.max(e.length,t.length);return n===0?!0:Math.abs(e.length-t.length)>n*Cs?!1:D(e,t)/n<=Cs}function zs(e,t=[],n=[]){let r=os(t).length>0;return[`test`,...e.length>0||r?[]:[`test/e2e/`],...n]}function Bs(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 Vs={command:`test-on-ci`,describe:`Test project on CI with no options.`,builder:{silent:{description:`Reduce redundant outputs`,type:`boolean`}},async handler(e){await Hs(e)}};async function Hs(n){process.env.WB_ENV||=`test`;let r=await B(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.blitz?us:r.vinext||a.vinext?gs:r.next?ps:a[`@remix-run/dev`]?hs:a.vite?_s:K(i)?vs:ys.some(e=>r[e])&&!r[`firebase-functions`]?fs:ms,console.info(`Running "test-on-ci" for ${i.name} ...`);let s=i.hasDockerfile;if(s&&await H(Q.stopAll(),i,n),e.existsSync(t.join(i.dirPath,`test`,`unit`))&&await H(o.testUnit(i,n).replaceAll(` --allowOnly`,``),i,n),e.existsSync(t.join(i.dirPath,`test`,`e2e`))){await H(await o.testStart(i,n),i,n),await Dt.promiseAll(),s&&(i.env.WB_DOCKER||=`1`,await V(`${o.buildDocker(i,`test`)}${es(n)}`,i,n));let e=s?await o.testE2EDocker(i,n,{}):await o.testE2EProduction(i,n,{});process.exitCode=await V(e.replaceAll(` --allowOnly`,``),i,n,{exitIfFailed:!1}),s&&await V(Q.stop(i),i,n)}else Os(i)}}const Us={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}`);F(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},Ws={command:`typecheck`,describe:`Run type checking. .env files are ignored.`,builder:{},async handler(e){process.exit(await Gs(e))}};async function Gs(n){let r=await B(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(...Ks(a)),!a.packageJson.workspaces&&a.hasOwnDependency(`pyright`)&&o.push(`YARN pyright`);o.length>0;){let s=await H(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,t]of o.entries())t&&((r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(p.yellow(`Please try "yarn gen-code" if you face unknown type errors.`)),s=t);return s||console.info(p.green(i?`-----
|
|
108
|
+
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 Ks(e){return e.hasOwnDependency(`typescript`)?[`BUN tsc --noEmit`]:[]}const qs={...Ws,command:`tc`},Js={command:`verify`,describe:`Verify project code`,builder:{full:{type:`boolean`,default:!1,describe:`Run tests after verifying project code`}},async handler(e){let t=ct(e,!1);t||(console.error(p.red(`No project found.`)),process.exit(1)),await(e.full?Ys(t.self,e):Xs(t.self,e))}};async function Ys(e,t){let n=rc(e);try{await Xs(e,t),await Zs(e,t),n.succeed()}catch(e){throw n.fail(e),e}finally{n.finish()}}async function Xs(e,t){await ec(`${e.packageManagerCommand} install`,e,t),e.packageJson.scripts?.[`gen-code`]&&await ec(`${e.packageManagerCommand} gen-code`,e,t),await $s(`cleanup`,()=>Ir({...t,_:[`lint`],fix:!0,format:!0,silent:!0}),{silent:!0}),await $s(`typecheck`,()=>Gs({...t,_:[`typecheck`]}),{silent:!0})}async function Zs(e,t){let n=ks({...t,_:[`test`],e2e:`headless`,silent:!0}),r=await Ds(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 ec(`${e.packageManagerCommand} db-reset`,Qs(e,n),n,{printRawOutput:!0});let i=await Ds(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 Qs(e,t){let n=z(t,!0,e.dirPath);if(!n)throw Error(`Project not found: ${e.dirPath}`);return n}async function $s(e,t,n={}){n.silent||console.info(`
|
|
109
|
+
`+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 ec(e,t,n,r={}){if(nc(e,t.dirPath),n.dryRun)return 0;let i=await Oe(e,void 0,{cwd:t.dirPath,env:Mt(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||tc(e,a,i.stdout),a!==0&&!r.allowFailure&&(console.info(p.red(p.bold(`Failed (exit code ${a}):`),e)),process.exit(a)),a}function tc(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(`
|
|
110
|
+
`))}function nc(e,t){console.info(`
|
|
111
|
+
`+p.cyan(p.bold(`Command:`),e)+p.gray(` at ${t}`))}function rc(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=ic(s,o),process.stderr.write=ic(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=ac(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 ic(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 ac(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(Pt).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."),he(process.env)}).command(Js).command(ft).command(zt).command(Hn).command(Yn).command(dr).command(In).command(br).command(Fr).command(Ci).command(ua).command(Ua).command(po).command(jo).command(Mo).command(Fo).command(xs).command(Es).command(Vs).command(Us).command(Ws).command(qs).demandCommand().strict().version(oc()).help().argv;function oc(){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 sc=!1;for(let e of[`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,()=>{if(!sc){sc=!0;try{F(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
|
|
112
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsInQiLCJpIiwibyIsIm4iLCJyIiwiYSIsIm4iLCJyIiwibiIsInQiLCJlIiwiYnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYXJndW1lbnRzQnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUiLCJERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgiLCJidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZCIsImdldExpdGVzdHJlYW1Db25maWdPcHRpb24iLCJwYXJzZSIsInBhcnNlRG90ZW52IiwiZGVwbG95Q29tbWFuZCIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZnMiLCJzZXRUaW1lb3V0IiwiYnVpbGRlciIsInNldFRpbWVvdXQiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwidG9VbnNjb3BlZFBhY2thZ2VOYW1lIiwiaXNEb2NrZXJFbmFibGVkIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiYnVpbGRlciIsImRlcGxveUNvbW1hbmQiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9iaW5QYXRoLnRzIiwiLi4vc3JjL3V0aWxzL2NpLnRzIiwiLi4vc3JjL3Byb2plY3QudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy9zY3JpcHRzL3J1bi50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9jb25jdXJyZW50bHkudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXIudHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5EZXZWYXJzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2RlcGxveS50cyIsIi4uL3NyYy9jb21tYW5kcy9kb3RlbnYudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkNvZGUudHMiLCIuLi9zcmMvY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLnRzIiwiLi4vc3JjL3V0aWxzL291dHB1dC50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy9jb21tYW5kcy9tYWludGVuYW5jZS50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUmVnaXN0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JlbGVhc2UudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXBQcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMudHMiLCIuLi9zcmMvdXRpbHMvbG9nLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9odHRwU2VydmVyUGFja2FnZXMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0T25DaS50cyIsIi4uL3NyYy9jb21tYW5kcy90cmVlS2lsbC50cyIsIi4uL3NyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyaWZ5Q29kZS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/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/Lm1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiBjYXNjYWRlID8gZ2V0QmFzZVNlY3JldHMoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBiYXNlU2VjcmV0cyAhPT0gdW5kZWZpbmVkICYmIGJhc2VTZWNyZXRzW2tleV0gIT09IHZhbHVlO1xuICAgICAgaWYgKCFvdmVycmlkZXNQcm9jZXNzRW52KSBjb250aW51ZTtcbiAgICB9XG4gICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcnVuRm5veEV4cG9ydChcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogeyBxdWlldDogYm9vbGVhbjsgaWdub3JlUHJvZmlsZUVudlZhcj86IGJvb2xlYW4gfVxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAvLyBgLS1pZi1taXNzaW5nIGVycm9yYDogZm5veCBvdGhlcndpc2UgZXhpdHMgMCBhbmQgc2lsZW50bHkgb21pdHMgc2VjcmV0cyBpdCBmYWlscyB0byByZXNvbHZlXG4gIC8vIChlLmcuIGEgbWlzc2luZyBhZ2Uga2V5KSwgd2hpY2ggd291bGQgYmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIHNlY3JldHMuXG4gIC8vIGAtLW5vbi1pbnRlcmFjdGl2ZWA6IHByb21wdHMgb3IgYnJvd3NlciBhdXRoIGZsb3dzIHdvdWxkIGhhbmcgZm9yZXZlciBiZWNhdXNlIHN0ZGluIGlzIGlnbm9yZWQuXG4gIGNvbnN0IGFyZ3MgPSBbJ2V4cG9ydCcsICctLWZvcm1hdCcsICdqc29uJywgJy0tbm8tY29sb3InLCAnLS1pZi1taXNzaW5nJywgJ2Vycm9yJywgJy0tbm9uLWludGVyYWN0aXZlJ107XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tcHJvZmlsZScsIGNhc2NhZGUpO1xuICB9XG4gIGlmIChvcHRpb25zLmlnbm9yZVByb2ZpbGVFbnZWYXIpIHtcbiAgICAvLyBXaXRob3V0IGAtLXByb2ZpbGVgLCBmbm94IGZhbGxzIGJhY2sgdG8gRk5PWF9QUk9GSUxFOyB0aGUgYmFzZS1hZGp1ZGljYXRpb24gZXhwb3J0IG11c3RcbiAgICAvLyByZWFkIHRoZSBCQVNFIHNlY3JldHMsIHNvIHRoZSBpbmhlcml0ZWQgcHJvZmlsZSBzZWxlY3Rpb24gaXMgY2xlYXJlZCBmb3IgaXQg4oCUIGFuZCBvbmx5IGZvclxuICAgIC8vIGl0OiBhIHByb2ZpbGUtbGVzcyBQUklNQVJZIGV4cG9ydCAoZS5nLiBgd2IgZG90ZW52YCB3aXRob3V0IFdCX0VOVikga2VlcHMgaG9ub3JpbmdcbiAgICAvLyBGTk9YX1BST0ZJTEUuXG4gICAgZGVsZXRlIGVudi5GTk9YX1BST0ZJTEU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnZm5veCcsIGFyZ3MsIHtcbiAgICBjd2QsXG4gICAgZW52LFxuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuc3RhdHVzICE9PSAwIHx8ICFyZXN1bHQuc3Rkb3V0Py50cmltKCkpIHtcbiAgICAvLyBUaGUgcmVwb3NpdG9yeSBkZWNsYXJlcyBmbm94LW1hbmFnZWQgc2VjcmV0cyAoZm5veC50b21sIGV4aXN0cyksIHNvIGEgZmFpbGluZyBleHBvcnQgbXVzdCBiZVxuICAgIC8vIHN1cmZhY2VkOiBzd2FsbG93aW5nIGl0IHdvdWxkIG1ha2UgZGVjbGFyZWQgc2VjcmV0cyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHVuZGVjbGFyZWQgb25lcy5cbiAgICBpZiAoIW9wdGlvbnMucXVpZXQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYEZhaWxlZCB0byByZWFkIGZub3ggc2VjcmV0czogJHtyZXN1bHQuZXJyb3I/Lm1lc3NhZ2UgfHwgcmVzdWx0LnN0ZGVycj8udHJpbSgpIHx8IGBmbm94IGV4aXRlZCB3aXRoIHN0YXR1cyAke3Jlc3VsdC5zdGF0dXN9YH1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzZWNyZXRzID0gKHBhcnNlZCBhcyB7IHNlY3JldHM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5zZWNyZXRzO1xuICBpZiAoIXNlY3JldHMgfHwgdHlwZW9mIHNlY3JldHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc2VjcmV0cykpIHJldHVybjtcbiAgcmV0dXJuIHNlY3JldHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QpOyA7IGN1cnJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgIGlmIChwYXJlbnRQYXRoID09PSBjdXJyZW50UGF0aCkgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZub3hFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNhc2NhZGUgPyBgZm5veCBleHBvcnQgLS1wcm9maWxlICR7Y2FzY2FkZX1gIDogJ2Zub3ggZXhwb3J0Jztcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3VycmVudEVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9wdGlvbnM/OiB7IGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuIH1cbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBzdHJpbmdbXV0ge1xuICBpZiAoIWhhc1Byb2plY3RNaXNlQ29uZmlnKGN3ZCkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBhcmdzID0gWydlbnYnLCAnLS1qc29uJywgJy0tY2QnLCBjd2RdO1xuICBpZiAoY2FzY2FkZSkge1xuICAgIGFyZ3MucHVzaCgnLS1lbnYnLCBjYXNjYWRlKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjaGlsZFByb2Nlc3Muc3Bhd25TeW5jKCdtaXNlJywgYXJncywge1xuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuc3RhdHVzICE9PSAwIHx8ICFyZXN1bHQuc3Rkb3V0Py50cmltKCkpIHJldHVybiBbe30sIFtdXTtcblxuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbe30sIFtdXTtcbiAgfVxuICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCBrZXkgaW4gY3VycmVudEVudlZhcnMpIGNvbnRpbnVlO1xuICAgIGlmIChvcHRpb25zPy5pZ25vcmVQcm9jZXNzRW52KSB7XG4gICAgICAvLyBgbWlzZSBlbnZgIGFsd2F5cyBlbWl0cyBQQVRIIGR1ZSB0byB0b29sIHNoaW1zOyBjb25zdW1lcnMgb2YgZmlsZS1kZWZpbmVkIHZhcmlhYmxlc1xuICAgICAgLy8gKGUuZy4gYHdiIGdlbi1kZXYtdmFyc2ApIG11c3Qgbm90IHByb3BhZ2F0ZSBpdC5cbiAgICAgIGlmIChrZXkgPT09ICdQQVRIJykgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBbZW52VmFycywga2V5c107XG59XG5cbmZ1bmN0aW9uIGhhc1Byb2plY3RNaXNlQ29uZmlnKGN3ZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbWlzZS50b21sJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLm1pc2UudG9tbCcpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgIGlmIChwYXJlbnRQYXRoID09PSBjdXJyZW50UGF0aCkgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNhc2NhZGUgPyBgbWlzZSBlbnYgLS1lbnYgJHtjYXNjYWRlfWAgOiAnbWlzZSBlbnYnO1xufVxuXG5mdW5jdGlvbiBpc0NJRW52aXJvbm1lbnQoY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFjaUVudiAmJiBjaUVudiAhPT0gJzAnICYmIGNpRW52ICE9PSAnZmFsc2UnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IG91dHB1dE9wdGlvbnMgPSBhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHF1aWV0RW52PzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9O1xuICByZXR1cm4gb3V0cHV0T3B0aW9ucy5xdWlldEVudiA9PT0gdHJ1ZSB8fCAob3V0cHV0T3B0aW9ucy5xdWlldEVudiAhPT0gZmFsc2UgJiYgb3V0cHV0T3B0aW9ucy5zaWxlbnQgPT09IHRydWUpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIC8vIEV4aXN0aW5nIHByb2Nlc3MuZW52IGtleXMgYXJlIGtlcHQ6IGVudlZhcnMgbWF5IGRlbGliZXJhdGVseSBjb250YWluIGRpZmZlcmluZyB2YWx1ZXMgdGhhdFxuICAgIC8vIG11c3Qgd2luIG9ubHkgaW4gdGhlIHJldHVybmVkIHJlY29yZCAobWlzZSBjYXNjYWRlLXByb2ZpbGUgdmFsdWVzLCBmb3JjZWQtbW9kZSBvdmVycmlkZXNcbiAgICAvLyBjb25zdW1lZCB2aWEgYHByb2plY3QuZW52YCksIG5ldmVyIGNsb2JiZXIgdGhlIGNhbGxlcidzIG93biBwcm9jZXNzIGVudmlyb25tZW50LlxuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30sIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgY2FjaGVkRW52VmFycy5zZXQoZmlsZVBhdGgsIHBhcnNlZCk7XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdjb2RlJyBpbiBlcnJvcjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAocHNPdXRwdXQ6IHN0cmluZyk6IE1hcDxudW1iZXIsIG51bWJlcltdPiB7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBwc091dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBtYXRjaGVkID0gL15cXHMqKFxcZCspXFxzKyhcXGQrKVxccyokLy5leGVjKGxpbmUpO1xuICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRQaWQgPSBOdW1iZXIobWF0Y2hlZFsxXSk7XG4gICAgY29uc3QgcGFyZW50UGlkID0gTnVtYmVyKG1hdGNoZWRbMl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudC5nZXQocGFyZW50UGlkKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRQaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50LnNldChwYXJlbnRQaWQsIFtjaGlsZFBpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW5CeVBhcmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIsIGNoaWxkcmVuQnlQYXJlbnQ6IE1hcDxudW1iZXIsIG51bWJlcltdPik6IG51bWJlcltdIHtcbiAgY29uc3QgZGVzY2VuZGFudHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHF1ZXVlID0gWy4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChyb290UGlkKSA/PyBbXSldO1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICBjb25zdCBwaWQgPSBxdWV1ZVtpbmRleF0gYXMgbnVtYmVyO1xuICAgIGluZGV4ICs9IDE7XG4gICAgZGVzY2VuZGFudHMucHVzaChwaWQpO1xuICAgIHF1ZXVlLnB1c2goLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBpZCkgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gZGVzY2VuZGFudHM7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5pbXBvcnQgeyBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAsIGNvbGxlY3REZXNjZW5kYW50UGlkcyBhcyBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIH0gZnJvbSAnLi9wcm9jZXNzVHJlZS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlS2lsbChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGlkKSB8fCBwaWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwaWQ6ICR7cGlkfWApO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBraWxsVHJlZU9uV2luZG93cyhwaWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlc2NlbmRhbnRzID0gY29sbGVjdERlc2NlbmRhbnRQaWRzKHBpZCk7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZCwgZGVzY2VuZGFudHMpO1xuICBmb3IgKGNvbnN0IHRhcmdldFBpZCBvZiB0YXJnZXRQaWRzKSB7XG4gICAga2lsbElmTmVlZGVkKHRhcmdldFBpZCwgc2lnbmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsSWZOZWVkZWQocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCBzaWduYWwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbFRyZWVPbldpbmRvd3MocGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBydW5Db21tYW5kKCd0YXNra2lsbCcsIFsnL1BJRCcsIFN0cmluZyhwaWQpLCAnL1QnLCAnL0YnXSwge1xuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gcnVuQ29tbWFuZChcbiAgICAncHMnLFxuICAgIFsnLUFvJywgJ3BpZD0scHBpZD0nXSxcbiAgICAvLyBLZWVwIGNvbW1hbmQgYm91bmRlZCBzbyB3YXRjaC1tb2RlIGtpbGwgbG9vcHMgY2Fubm90IGhhbmcgdGhpcyBwYXRoLlxuICAgIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCwgdGltZW91dDogMjAwMCB9XG4gICk7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAoc3Rkb3V0KTtcbiAgcmV0dXJuIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAocm9vdFBpZCwgY2hpbGRyZW5CeVBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkOiBudW1iZXIsIGRlc2NlbmRhbnRzOiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IGRlc2NlbmRhbnRzLnRvUmV2ZXJzZWQoKTtcbiAgdGFyZ2V0UGlkcy5wdXNoKHBpZCk7XG4gIHJldHVybiB0YXJnZXRQaWRzO1xufVxuXG5mdW5jdGlvbiBydW5Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogeyB0aW1lb3V0OiBudW1iZXI7IG1heEJ1ZmZlcjogbnVtYmVyIH1cbik6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYyhjb21tYW5kLCBbLi4uYXJnc10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IG9wdGlvbnM/Lm1heEJ1ZmZlcixcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnI6ICcnIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3Qgc3RkZXJyID0gZXh0cmFjdFN0ZGVycihlcnJvcik7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRFeGVjdXRpb25FcnJvcihjb21tYW5kLCBhcmdzLCBzdGRlcnIsIHRvRXhpdENvZGUoZXJyb3IpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKSB7XG4gICAgcmV0dXJuIC9ubyBzdWNoIHByb2Nlc3N8bm90IGZvdW5kfG5vdCByZWNvZ25pemVkfHRoZXJlIGlzIG5vIHJ1bm5pbmcgaW5zdGFuY2UvaS50ZXN0KGVycm9yLnN0ZGVycik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0b0V4aXRDb2RlKGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ3N0YXR1cycgaW4gZXJyb3IpIHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM6IHVua25vd24gfSkuc3RhdHVzO1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0ZGVycihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8IGVycm9yID09PSBudWxsIHx8ICEoJ3N0ZGVycicgaW4gZXJyb3IpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc3RkZXJyID0gKGVycm9yIGFzIFJlY29yZDwnc3RkZXJyJywgdW5rbm93bj4pLnN0ZGVycjtcbiAgaWYgKHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ZGVycjtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0ZGVycikpIHtcbiAgICByZXR1cm4gc3RkZXJyLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5jbGFzcyBDb21tYW5kRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgc3RkZXJyOiBzdHJpbmcsIGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKGBDb21tYW5kIGZhaWxlZDogJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIHRoaXMubmFtZSA9ICdDb21tYW5kRXhlY3V0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RkZXJyID0gc3RkZXJyO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICcuL3RyZWVLaWxsLmpzJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBibGFuay1vbmx5IGxpbmVzIGFyZSBza2lwcGVkIHdoaWxlIHByaW50aW5nIHN0ZG91dC9zdGRlcnIgaW4gcmVhbHRpbWUgKi9cbiAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGNvbnN0IHN0ZG91dFByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRvdXQsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBjb25zdCBzdGRlcnJQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3RkZXJyLCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgc3Rkb3V0UHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgc3RkZXJyUHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsZWFudXBTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID1cbiAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFsnU0lHSU5UJywgJ1NJR1RFUk0nXSA6IFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddO1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgY29uc3QgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgY2xlYW51cFNpZ25hbHMpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzdG9wUHJvY2VzcygpO1xuICAgICAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5saXN0ZW5lckNvdW50KHNpZ25hbCkgPT09IDApIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBzdGRvdXRQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIHN0ZGVyclByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCA9IG5ldyBSZWdFeHAoYCR7U3RyaW5nLmZyb21Db2RlUG9pbnQoMjcpfVxcXFxbWzAtP10qWyAtL10qW0Atfl1gLCAnZycpO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWFsdGltZVByaW50ZXIoXG4gIHN0cmVhbTogTm9kZUpTLldyaXRlU3RyZWFtLFxuICBvbWl0QmxhbmtMaW5lcyA9IGZhbHNlXG4pOiB7IHdyaXRlOiAoZGF0YTogc3RyaW5nKSA9PiB2b2lkOyBmbHVzaDogKCkgPT4gdm9pZCB9IHtcbiAgaWYgKCFvbWl0QmxhbmtMaW5lcykge1xuICAgIHJldHVybiB7XG4gICAgICB3cml0ZTogKGRhdGEpID0+IHN0cmVhbS53cml0ZShkYXRhKSxcbiAgICAgIGZsdXNoOiAoKSA9PiB7fSxcbiAgICB9O1xuICB9XG5cbiAgbGV0IHBlbmRpbmcgPSAnJztcbiAgcmV0dXJuIHtcbiAgICB3cml0ZTogKGRhdGEpID0+IHtcbiAgICAgIHBlbmRpbmcgKz0gZGF0YTtcbiAgICAgIGNvbnN0IGxpbmVzID0gcGVuZGluZy5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgcGVuZGluZyA9IGxpbmVzLnBvcCgpID8/ICcnO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghaXNCbGFua0xpbmUobGluZSkpIHtcbiAgICAgICAgICBzdHJlYW0ud3JpdGUoYCR7bGluZX1cXG5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZmx1c2g6ICgpID0+IHtcbiAgICAgIGlmICghaXNCbGFua0xpbmUocGVuZGluZykpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKHBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgcGVuZGluZyA9ICcnO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQmxhbmtMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQLCAnJykudHJpbSgpLmxlbmd0aCA9PT0gMDtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XG4gKlxuICogQHZlcnNpb24gMC45LjNcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTUtMjAyM1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IHQ9Wy4uLlwiMDEyMzQ1Njc4OWFiY2RlZlwiXSxzPVs2LDE1MzYsMzkzMjE2LDEwMDY2MzI5Nl0saT1bMCw4LDE2LDI0XSxlPVsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XTtmdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgaCg1MTIscyw1MTIpLnVwZGF0ZSh0KS5oZXgoKX1jb25zdCBuPXQ9Pntjb25zdCBzPVtdO2Zvcihjb25zdFtpLGVdb2YgdC5lbnRyaWVzKCkpc1tpXT1lO3JldHVybiBzfTtjbGFzcyBoe2Jsb2Nrcz1bXTtzPVtdO3Jlc2V0PSEwO2ZpbmFsaXplZD0hMTtibG9jaz0wO3N0YXJ0PTA7bGFzdEJ5dGVJbmRleD0wO2NvbnN0cnVjdG9yKHQscyxpKXt0aGlzLnBhZGRpbmc9cyx0aGlzLm91dHB1dEJpdHM9aSx0aGlzLmJsb2NrQ291bnQ9MTYwMC0odDw8MSk+PjUsdGhpcy5ieXRlQ291bnQ9dGhpcy5ibG9ja0NvdW50PDwyLHRoaXMub3V0cHV0QmxvY2tzPWk+PjUsdGhpcy5leHRyYUJ5dGVzPSgzMSZpKT4+Mztmb3IobGV0IHQ9MDt0PDUwOysrdCl0aGlzLnNbdF09MH11cGRhdGUodCl7aWYodGhpcy5maW5hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKFwiZmluYWxpemUgYWxyZWFkeSBjYWxsZWRcIik7Y29uc3Qgcz10aGlzLmJsb2NrcyxlPXRoaXMuYnl0ZUNvdW50LG89dC5sZW5ndGgsbj10aGlzLmJsb2NrQ291bnQsaD10aGlzLnM7bGV0IGwsYyxmPTA7Zm9yKDtmPG87KXtpZih0aGlzLnJlc2V0KWZvcih0aGlzLnJlc2V0PSExLHNbMF09dGhpcy5ibG9jayxsPTE7bDxuKzE7KytsKXNbbF09MDtmb3IobD10aGlzLnN0YXJ0O2Y8byYmbDxlOysrZiljPXQuY29kZVBvaW50QXQoZil8fDAsYzwxMjg/c1tsPj4yXXw9Yzw8aVszJmwrK106YzwyMDQ4PyhzW2w+PjJdfD0oMTkyfGM+PjYpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6Yzw1NTI5Nnx8Yz49NTczNDQ/KHNbbD4+Ml18PSgyMjR8Yz4+MTIpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6KGM9NjU1MzYrKCgxMDIzJmMpPDwxMHwxMDIzJih0LmNvZGVQb2ludEF0KCsrZil8fDApKSxzW2w+PjJdfD0oMjQwfGM+PjE4KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj4xMiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTtpZih0aGlzLmxhc3RCeXRlSW5kZXg9bCxsPj1lKXtmb3IodGhpcy5zdGFydD1sLWUsdGhpcy5ibG9jaz1zW25dLGw9MDtsPG47KytsKWhbbF1ePXNbbF07cihoKSx0aGlzLnJlc2V0PSEwfWVsc2UgdGhpcy5zdGFydD1sfXJldHVybiB0aGlzfWZpbmFsaXplKCl7aWYodGhpcy5maW5hbGl6ZWQpcmV0dXJuO3RoaXMuZmluYWxpemVkPSEwO2NvbnN0IHQ9dGhpcy5ibG9ja3M7bGV0IHM9dGhpcy5sYXN0Qnl0ZUluZGV4O2NvbnN0IGk9dGhpcy5ibG9ja0NvdW50LGU9dGhpcy5zO2lmKHRbcz4+Ml18PXRoaXMucGFkZGluZ1szJnNdLHRoaXMubGFzdEJ5dGVJbmRleD09PXRoaXMuYnl0ZUNvdW50KWZvcih0WzBdPXRbaV0scz0xO3M8aSsxOysrcyl0W3NdPTA7Zm9yKHRbaS0xXXw9MjE0NzQ4MzY0OCxzPTA7czxpOysrcyllW3NdXj10W3NdO3IoZSl9aGV4KCl7dGhpcy5maW5hbGl6ZSgpO2NvbnN0IHM9dGhpcy5ibG9ja0NvdW50O2xldCBpPXRoaXMucztjb25zdCBlPXRoaXMub3V0cHV0QmxvY2tzLG89dGhpcy5leHRyYUJ5dGVzO2xldCBoLGw9MCxjPTAsZj1cIlwiO2Zvcig7YzxlOyl7Zm9yKGw9MDtsPHMmJmM8ZTsrK2wsKytjKWg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0rdFtoPj4xMiYxNV0rdFtoPj44JjE1XSt0W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSt0W2g+PjI4JjE1XSt0W2g+PjI0JjE1XTtjJXM9PT0wJiYoaT1uKGkpLHIoaSksbD0wKX1yZXR1cm4gbyYmKGg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0sbz4xJiYoZis9dFtoPj4xMiYxNV0rdFtoPj44JjE1XSksbz4yJiYoZis9dFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0pKSxmfX1jb25zdCByPWZ1bmN0aW9uKHQpe2xldCBzLGksbyxuLGgscixsLGMsZixhLHUsZCxiLGsseSx4LEIscCxDLHosSSxnLHcsQSxQLEUsaixtLHEsdixELEYsRyxILEosSyxMLE0sTixPLFEsUixTLFQsVSxWLFcsWCxZLFosJCxfLHR0LHN0LGl0LGV0LG90LG50LGh0LHJ0LGx0LGN0LGZ0O2ZvcihvPTA7bzw0ODtvKz0yKW49dFswXV50WzEwXV50WzIwXV50WzMwXV50WzQwXSxoPXRbMV1edFsxMV1edFsyMV1edFszMV1edFs0MV0scj10WzJdXnRbMTJdXnRbMjJdXnRbMzJdXnRbNDJdLGw9dFszXV50WzEzXV50WzIzXV50WzMzXV50WzQzXSxjPXRbNF1edFsxNF1edFsyNF1edFszNF1edFs0NF0sZj10WzVdXnRbMTVdXnRbMjVdXnRbMzVdXnRbNDVdLGE9dFs2XV50WzE2XV50WzI2XV50WzM2XV50WzQ2XSx1PXRbN11edFsxN11edFsyN11edFszN11edFs0N10sZD10WzhdXnRbMThdXnRbMjhdXnRbMzhdXnRbNDhdLGI9dFs5XV50WzE5XV50WzI5XV50WzM5XV50WzQ5XSxzPWReKHI8PDF8bD4+PjMxKSxpPWJeKGw8PDF8cj4+PjMxKSx0WzBdXj1zLHRbMV1ePWksdFsxMF1ePXMsdFsxMV1ePWksdFsyMF1ePXMsdFsyMV1ePWksdFszMF1ePXMsdFszMV1ePWksdFs0MF1ePXMsdFs0MV1ePWkscz1uXihjPDwxfGY+Pj4zMSksaT1oXihmPDwxfGM+Pj4zMSksdFsyXV49cyx0WzNdXj1pLHRbMTJdXj1zLHRbMTNdXj1pLHRbMjJdXj1zLHRbMjNdXj1pLHRbMzJdXj1zLHRbMzNdXj1pLHRbNDJdXj1zLHRbNDNdXj1pLHM9cl4oYTw8MXx1Pj4+MzEpLGk9bF4odTw8MXxhPj4+MzEpLHRbNF1ePXMsdFs1XV49aSx0WzE0XV49cyx0WzE1XV49aSx0WzI0XV49cyx0WzI1XV49aSx0WzM0XV49cyx0WzM1XV49aSx0WzQ0XV49cyx0WzQ1XV49aSxzPWNeKGQ8PDF8Yj4+PjMxKSxpPWZeKGI8PDF8ZD4+PjMxKSx0WzZdXj1zLHRbN11ePWksdFsxNl1ePXMsdFsxN11ePWksdFsyNl1ePXMsdFsyN11ePWksdFszNl1ePXMsdFszN11ePWksdFs0Nl1ePXMsdFs0N11ePWkscz1hXihuPDwxfGg+Pj4zMSksaT11XihoPDwxfG4+Pj4zMSksdFs4XV49cyx0WzldXj1pLHRbMThdXj1zLHRbMTldXj1pLHRbMjhdXj1zLHRbMjldXj1pLHRbMzhdXj1zLHRbMzldXj1pLHRbNDhdXj1zLHRbNDldXj1pLGs9dFswXSx5PXRbMV0sVj10WzExXTw8NHx0WzEwXT4+PjI4LFc9dFsxMF08PDR8dFsxMV0+Pj4yOCxtPXRbMjBdPDwzfHRbMjFdPj4+MjkscT10WzIxXTw8M3x0WzIwXT4+PjI5LHJ0PXRbMzFdPDw5fHRbMzBdPj4+MjMsbHQ9dFszMF08PDl8dFszMV0+Pj4yMyxSPXRbNDBdPDwxOHx0WzQxXT4+PjE0LFM9dFs0MV08PDE4fHRbNDBdPj4+MTQsSD10WzJdPDwxfHRbM10+Pj4zMSxKPXRbM108PDF8dFsyXT4+PjMxLHg9dFsxM108PDEyfHRbMTJdPj4+MjAsQj10WzEyXTw8MTJ8dFsxM10+Pj4yMCxYPXRbMjJdPDwxMHx0WzIzXT4+PjIyLFk9dFsyM108PDEwfHRbMjJdPj4+MjIsdj10WzMzXTw8MTN8dFszMl0+Pj4xOSxEPXRbMzJdPDwxM3x0WzMzXT4+PjE5LGN0PXRbNDJdPDwyfHRbNDNdPj4+MzAsZnQ9dFs0M108PDJ8dFs0Ml0+Pj4zMCxzdD10WzVdPDwzMHx0WzRdPj4+MixpdD10WzRdPDwzMHx0WzVdPj4+MixLPXRbMTRdPDw2fHRbMTVdPj4+MjYsTD10WzE1XTw8Nnx0WzE0XT4+PjI2LHA9dFsyNV08PDExfHRbMjRdPj4+MjEsQz10WzI0XTw8MTF8dFsyNV0+Pj4yMSxaPXRbMzRdPDwxNXx0WzM1XT4+PjE3LCQ9dFszNV08PDE1fHRbMzRdPj4+MTcsRj10WzQ1XTw8Mjl8dFs0NF0+Pj4zLEc9dFs0NF08PDI5fHRbNDVdPj4+MyxBPXRbNl08PDI4fHRbN10+Pj40LFA9dFs3XTw8Mjh8dFs2XT4+PjQsZXQ9dFsxN108PDIzfHRbMTZdPj4+OSxvdD10WzE2XTw8MjN8dFsxN10+Pj45LE09dFsyNl08PDI1fHRbMjddPj4+NyxOPXRbMjddPDwyNXx0WzI2XT4+Pjcsej10WzM2XTw8MjF8dFszN10+Pj4xMSxJPXRbMzddPDwyMXx0WzM2XT4+PjExLF89dFs0N108PDI0fHRbNDZdPj4+OCx0dD10WzQ2XTw8MjR8dFs0N10+Pj44LFQ9dFs4XTw8Mjd8dFs5XT4+PjUsVT10WzldPDwyN3x0WzhdPj4+NSxFPXRbMThdPDwyMHx0WzE5XT4+PjEyLGo9dFsxOV08PDIwfHRbMThdPj4+MTIsbnQ9dFsyOV08PDd8dFsyOF0+Pj4yNSxodD10WzI4XTw8N3x0WzI5XT4+PjI1LE89dFszOF08PDh8dFszOV0+Pj4yNCxRPXRbMzldPDw4fHRbMzhdPj4+MjQsZz10WzQ4XTw8MTR8dFs0OV0+Pj4xOCx3PXRbNDldPDwxNHx0WzQ4XT4+PjE4LHRbMF09a15+eCZwLHRbMV09eV5+QiZDLHRbMTBdPUFefkUmbSx0WzExXT1QXn5qJnEsdFsyMF09SF5+SyZNLHRbMjFdPUpefkwmTix0WzMwXT1UXn5WJlgsdFszMV09VV5+VyZZLHRbNDBdPXN0Xn5ldCZudCx0WzQxXT1pdF5+b3QmaHQsdFsyXT14Xn5wJnosdFszXT1CXn5DJkksdFsxMl09RV5+bSZ2LHRbMTNdPWpefnEmRCx0WzIyXT1LXn5NJk8sdFsyM109TF5+TiZRLHRbMzJdPVZeflgmWix0WzMzXT1XXn5ZJiQsdFs0Ml09ZXRefm50JnJ0LHRbNDNdPW90Xn5odCZsdCx0WzRdPXBefnomZyx0WzVdPUNefkkmdyx0WzE0XT1tXn52JkYsdFsxNV09cV5+RCZHLHRbMjRdPU1efk8mUix0WzI1XT1OXn5RJlMsdFszNF09WF5+WiZfLHRbMzVdPVlefiQmdHQsdFs0NF09bnRefnJ0JmN0LHRbNDVdPWh0Xn5sdCZmdCx0WzZdPXpefmcmayx0WzddPUlefncmeSx0WzE2XT12Xn5GJkEsdFsxN109RF5+RyZQLHRbMjZdPU9eflImSCx0WzI3XT1RXn5TJkosdFszNl09Wl5+XyZULHRbMzddPSRefnR0JlUsdFs0Nl09cnRefmN0JnN0LHRbNDddPWx0Xn5mdCZpdCx0WzhdPWdefmsmeCx0WzldPXdefnkmQix0WzE4XT1GXn5BJkUsdFsxOV09R15+UCZqLHRbMjhdPVJefkgmSyx0WzI5XT1TXn5KJkwsdFszOF09X15+VCZWLHRbMzldPXR0Xn5VJlcsdFs0OF09Y3RefnN0JmV0LHRbNDldPWZ0Xn5pdCZvdCx0WzBdXj1lW29dLHRbMV1ePWVbbysxXX07ZXhwb3J0e28gYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImNvbnN0IGU9XCJcIix0PWZ1bmN0aW9uKCl7Y29uc3QgZT17aW5zdGFuY2U6RXJyb3IsZnJvbTplPT57Y29uc3QgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIHZvaWQgMCE9PWUuc3RhY2smJnQucHVzaChlLnN0YWNrKSx2b2lkIDAhPT1lLmNhdXNlJiYodm9pZCAwPT09ZS5zdGFjayYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5uZXcgRXJyb3IsaHlkcmF0ZTooZSxbdCxuLGEsc10pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4sdm9pZCAwPT09YT9kZWxldGUgZS5zdGFjazplLnN0YWNrPWEsdm9pZCAwIT09cyYmKGUuY2F1c2U9cyl9fSx0PXtpbnN0YW5jZTpVaW50OEFycmF5LGZyb206ZT0+W2J0b2EoYS5kZWNvZGUoZSkpXSxjcmVhdGU6KFtlXSk9Pm4uZW5jb2RlKGF0b2IoZSkpfSxzPXtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdFtuLGFdb2YgdCllLnNldChuLGEpfX0sbz17aW5zdGFuY2U6U2V0LGZyb206ZT0+Wy4uLmUudmFsdWVzKCldLHN0dWI6KCk9Pm5ldyBTZXQsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdCBuIG9mIHQpZS5hZGQobil9fSxyPXtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LGM9e2luc3RhbmNlOlJlZ0V4cCxmcm9tOih7ZmxhZ3M6ZSxzb3VyY2U6dH0pPT5lP1t0LGVdOlt0XSxjcmVhdGU6KFtlLHRdKT0+bmV3IFJlZ0V4cChlLHQpfSxkPXtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9O3JldHVybiBuZXcgTWFwKFtlLHQscyxvLHIsYyxkXS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuLGU9dCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEobixlKSl9ZnVuY3Rpb24gdSh0KXtpZih2b2lkIDA9PT10KXJldHVybi0xO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gdDwwPy01Oi00fXJldHVybiBudWxsfWNvbnN0IGw9W107ZnVuY3Rpb24gYShlLHI9dCl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2NvbnN0IGk9W10scz1uZXcgTWFwO3JldHVybiBmdW5jdGlvbiB0KGUpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztsZXQgYz1zLmdldChlKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO3N3aXRjaChjPWkubGVuZ3RoLHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpjYXNlXCJib29sZWFuXCI6aVtjXT1lLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwiYmlnaW50XCI6aVtjXT1bLTYsZS50b1N0cmluZygxNildLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6aWYobnVsbD09PWUpaVtjXT1lLHMuc2V0KGUsYyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKGwubGVuZ3RoPHQpe2NvbnN0IG49bC5sZW5ndGg7bC5sZW5ndGg9dCxsLmZpbGwoLTIsbix0KX1yZXR1cm4gbC5zbGljZSgwLHQpfShlLmxlbmd0aCk7aVtjXT1uLHMuc2V0KGUsYyk7Zm9yKGNvbnN0W3Isb11vZiBlLmVudHJpZXMoKSluW3JdPXQobyl9ZWxzZXtjb25zdFtvLGZdPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmNvbnN0cnVjdG9yO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIpe2NvbnN0IG49ci5uYW1lLG89ZS5nZXQobik7aWYodm9pZCAwIT09bylyZXR1cm5bbixvLmZyb20odCldfWNvbnN0IG89T2JqZWN0LmVudHJpZXModCksaT1vLmxlbmd0aCxzPUFycmF5LmZyb20oe2xlbmd0aDppK2l9KTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBuPW9bdF0sZT10K3Q7c1tlXT1uWzBdLHNbZSsxXT1uWzFdfXJldHVybltuLHNdfShlLHIpLHU9Zi5sZW5ndGgsbD1BcnJheS5mcm9tKHtsZW5ndGg6dSsxfSk7bFswXT1vLGlbY109bCxzLnNldChlLGMpO2ZvcihsZXQgbj0wO248dTtuKyspbFtuKzFdPXQoZltuXSl9fXJldHVybiBjfShlKSxpfWV4cG9ydHtyIGFzIEFSUkFZX0hPTEVfSU5ERVgsYyBhcyBCSUdfSU5UX0xBQkVMLG8gYXMgTkFOX0lOREVYLHMgYXMgTkVHX0lORl9JTkRFWCxpIGFzIFBPU19JTkZfSU5ERVgsZSBhcyBVTkRFRklORURfSU5ERVgsYSBhcyBsaXN0aWZ5LGYgYXMgc3RyaW5naWZ5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXBcbiIsImltcG9ydHtzaGEzXzUxMiBhcyByfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgbn1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbyhvLHQpe3JldHVybiByKG4oW28sdF0pKX1mdW5jdGlvbiB0KHIsbyl7cmV0dXJuIG4oW3Isb10pfWZ1bmN0aW9uIGkoKXtyZXR1cm5cIlwifWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxvIGFzIGdldENhY2hlS2V5T2ZIYXNoLHQgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcFxuIiwiaW1wb3J0e2dldENhY2hlS2V5T2ZIYXNoIGFzIHQsZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGV9ZnJvbVwiLi9nZXRDYWNoZUtleS5qc1wiO2NvbnN0IG49cih7Z2V0Q2FjaGVLZXk6dH0pLGM9cih7Z2V0Q2FjaGVLZXk6ZX0pO2Z1bmN0aW9uIHIoe2NhY2hlRHVyYXRpb246ZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZ2V0Q2FjaGVLZXk6bj10fT17fSl7cmV0dXJuIGZ1bmN0aW9uKHQsYyl7bGV0IHIsbyxpO3JldHVyblwiZ2V0dGVyXCI9PT1jPy5raW5kP2Z1bmN0aW9uKCl7Y29uc3QgYz1uKHRoaXMsW10pLGE9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PWN8fGEtbz5lKSYmKGk9YyxyPXQuY2FsbCh0aGlzKSxvPWEpLHJ9OmZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bih0aGlzLGEpLGg9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PXV8fGgtbz5lKSYmKGk9dSxyPWM/dC5jYWxsKHRoaXMsLi4uYSk6dCguLi5hKSxvPWgpLHJ9fX1leHBvcnR7biBhcyBtZW1vaXplT25lLHIgYXMgbWVtb2l6ZU9uZUZhY3RvcnksYyBhcyBtZW1vaXplT25lV2l0aEVtcHR5SGFzaH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplT25lLmpzLm1hcFxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBQcmVwZW5kIGV2ZXJ5IGV4aXN0aW5nIGBub2RlX21vZHVsZXMvLmJpbmAgZGlyZWN0b3J5IGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeSB1cCB0byB0aGVcbiAqIHJlcG9zaXRvcnkgcm9vdCAob3IgZmlsZXN5c3RlbSByb290KSB0byB0aGUgZW52aXJvbm1lbnQncyBQQVRILCBuZWFyZXN0IGRpcmVjdG9yeSBmaXJzdCBzb1xuICogYSB3b3Jrc3BhY2UtbG9jYWwgZGVwZW5kZW5jeSB3aW5zIG92ZXIgYSByZXBvc2l0b3J5LXJvb3Qgb25lLiBOZWVkZWQgd2hlcmV2ZXIgd2Igc3RyaXBzXG4gKiB5YXJuJ3MgdGVtcG9yYXJ5IGJpbiBmb2xkZXIgZnJvbSBQQVRIICh5YXJuIEJlcnJ5IGV4cG9zZXMgZGVwZW5kZW5jeSBleGVjdXRhYmxlcyBvbmx5XG4gKiB0aHJvdWdoIHRoYXQgZm9sZGVyLCBuZXZlciB0aHJvdWdoIGBub2RlX21vZHVsZXMvLmJpbmAgb24gUEFUSCksIHNvIHRoYXQgYmFyZSBiaW5hcnkgbmFtZXNcbiAqIGluIHdyYXBwZWQgY29tbWFuZHMga2VlcCByZXNvbHZpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgoZGlyUGF0aDogc3RyaW5nLCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBib29sZWFuIHtcbiAgY29uc3QgYmluUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICBiaW5QYXRocy5wdXNoKGJpblBhdGgpO1xuICAgIH1cblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gIH1cbiAgaWYgKGJpblBhdGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBlbnYuUEFUSCA9IGVudi5QQVRIID8gYCR7YmluUGF0aHMuam9pbignOicpfToke2Vudi5QQVRIfWAgOiBiaW5QYXRocy5qb2luKCc6Jyk7XG4gIHJldHVybiB0cnVlO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzQ0koY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFjaUVudiAmJiBjaUVudiAhPT0gJzAnICYmIGNpRW52ICE9PSAnZmFsc2UnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuLFxuICByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsXG4gIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxuICByZXNvbHZlRmFsbGJhY2tXYkVudixcbiAgc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgLy8gVGhlIHBhY2thZ2UgbWFuYWdlciBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiOlxuICAvLyBgbm9kZSB3YiAuLi5gIGFnYWluc3QgYSBCdW4gcmVwbyBtdXN0IHN0aWxsIHJ1biBgYnVuIGluc3RhbGxgLCBhbmQgdmljZSB2ZXJzYS5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCgpOiAnYnVuJyB8ICd5YXJuJyB7XG4gICAgcmV0dXJuIHRoaXMuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIGdldCBwYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoKTogJ2J1biBydW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIC8vIEEgc2luZ2xlIHNpZ25hbCBkZWNpZGVzIGV2ZXJ5IGJ1bi12cy15YXJuIGJyYW5jaCBpbiB3YiAoc2NyaXB0IG5vcm1hbGl6YXRpb24gaW5jbHVkZWQpOlxuICAvLyBzcGxpdHRpbmcgdGhlIHRvb2wtbWFuaWZlc3Qgc2lnbmFsIGZyb20gdGhlIGxvY2tmaWxlIHNpZ25hbCBvbmNlIHByb2R1Y2VkIGNvbW1hbmRzIG1peGluZ1xuICAvLyBgYnVuIGluc3RhbGxgIHdpdGggYHlhcm4gcHJpc21hIC4uLmAgaW4gbWlzZS1waW5uZWQgcmVwb3Mgd2hvc2UgYnVuLmxvY2sgaXMgZ2l0aWdub3JlZC5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNCdW5Ub29sVmVyc2lvbigpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5oYXNCdW5Mb2NrZmlsZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNCdW5QYWNrYWdlTWFuYWdlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Ub29sVmVyc2lvbigpOiBib29sZWFuIHtcbiAgICAvLyB3YmZ5IG1pZ3JhdGVzIC50b29sLXZlcnNpb25zIGludG8gbWlzZS50b21sLCBzbyBhIG1pc2UtcGlubmVkIGJ1biBtdXN0IGNvdW50IGFzIHdlbGw6XG4gICAgLy8gcmVwb3MgdGhhdCBnaXRpZ25vcmUgYnVuLmxvY2sgYW5kIGhhdmUgbm8gcGFja2FnZU1hbmFnZXIgZmllbGQgcmVseSBvbiB0aGUgdG9vbCBtYW5pZmVzdC5cbiAgICBpZiAodGVzdEZpbGVDb250ZW50KHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgLyhefFxcbilidW5cXHMvKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIHRlc3RGaWxlQ29udGVudChwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgZmlsZU5hbWUpLCAvXlxccyooPzpcImJ1blwifGJ1bilcXHMqPS9tKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1bkxvY2tmaWxlKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHJlbHkgb24gdGhlIGxvY2tmaWxlIG9yIHBhY2thZ2VNYW5hZ2VyIGZpZWxkIGluc3RlYWQgb2YgbWlzZS5cbiAgICAvLyBEb2NrZXIgb3B0aW1pemF0aW9uIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2IuXG4gICAgcmV0dXJuIFsnYnVuLmxvY2snLCAnYnVuLmxvY2tiJ10uc29tZSgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsIGZpbGVOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHRoaXMucm9vdFBhY2thZ2VKc29uPy5wYWNrYWdlTWFuYWdlciA/PyB0aGlzLnBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyO1xuICAgIHJldHVybiB0eXBlb2YgcGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnICYmIHBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ2J1bkAnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICAvLyBDYWNoZWQgaW4gYSBwbGFpbiBmaWVsZCByYXRoZXIgdGhhbiB3aXRoIEBtZW1vaXplT25lOiB0aGF0IGRlY29yYXRvciBrZXlzIGl0cyBjYWNoZSBvbiBhIGhhc2hcbiAgLy8gb2YgdGhlIGluc3RhbmNlLCB3aGljaCBjaGFuZ2VzIGFzIG90aGVyIG1lbW9pemVkIGdldHRlcnMgcG9wdWxhdGUgdGhlIGluc3RhbmNlLCBzbyBgZW52YCBjb3VsZFxuICAvLyBzaWxlbnRseSBiZSByZWNvbXB1dGVkIOKAlCBkcm9wcGluZyBpbi1wbGFjZSBtdXRhdGlvbnMgKGUuZy4gYHByb2plY3QuZW52LlBPUlQgfHw9IOKApmAsIG9yIHRoZVxuICAvLyBzZWNyZXRzIGB3YiBkZXBsb3lgIG1lcmdlcyBmcm9tIC5lbnYuY2xvdWRmbGFyZSkgdGhhdCBjYWxsZXJzIHJlbHkgb24gZm9yIHNwYXduZWQgY29tbWFuZHMuXG4gIHByaXZhdGUgZW52Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5lbnZDYWNoZSkgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZW52Q2FjaGUgPSBwcm9jZXNzLmVudjtcbiAgICAgIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICAgIH1cblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCwge1xuICAgICAgLy8gY29tcGxldGVBbmRWYWxpZGF0ZVdiRW52IGJlbG93IGZpbGxzIGFuIHVuc2V0IFdCX0VOViB3aXRoIHRoZSBzYW1lIGZhbGxiYWNrLCBzbyBleHBhbmRpbmdcbiAgICAgIC8vICR7V0JfRU5WfSByZWZlcmVuY2VzIGFnYWluc3QgaXQga2VlcHMgdGhlIHBhaXIgY29uc2lzdGVudC5cbiAgICAgIGV4cGFuZEZhbGxiYWNrV2JFbnY6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKCFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgIGZvciAoY29uc3QgW2VudlBhdGgsIG5hbWVzXSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7bmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNwcmVhZGluZyBlbnZWYXJzIGxhc3QgaXMgc2FmZSBmb3IgZXhwb3J0ZWQtdmFyaWFibGUgcHJlY2VkZW5jZTogcmVhZEVudmlyb25tZW50VmFyaWFibGVzXG4gICAgLy8gYWxyZWFkeSBleGNsdWRlcyBrZXlzIHByZXNlbnQgaW4gcHJvY2Vzcy5lbnYgZnJvbSAuZW52L2Zub3ggc291cmNlcyAocmV0dXJuaW5nIGEga2V5IHRoYXRcbiAgICAvLyBleGlzdHMgaW4gcHJvY2Vzcy5lbnYgb25seSBmb3IgZGVsaWJlcmF0ZSBmb3JjZWQtbW9kZSBvdmVycmlkZXMpLiBNaXNlIHZhbHVlcyB0aGF0XG4gICAgLy8gZGlmZmVyIGZyb20gdGhlIGFtYmllbnQgYWN0aXZhdGlvbiBhcmUgZGVsaWJlcmF0ZWx5IGtlcHQgc28gdGhlIHJlcXVlc3RlZCBjYXNjYWRlIHByb2ZpbGVcbiAgICAvLyAoZS5nLiBgLS1jYXNjYWRlLWVudj10ZXN0YCkgd2lucyBvdmVyIGEgc3RhbGUgYG1pc2UgYWN0aXZhdGVgIGVudmlyb25tZW50LlxuICAgIHRoaXMuZW52Q2FjaGUgPSB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnZWYXJzIH07XG4gICAgLy8gYG1pc2UgZW52YCBpcyBleGNsdWRlZDogaXQgcmVwb3J0cyB0b29sLWFjdGl2YXRpb24gb3V0cHV0IChlLmcuIFBBVEgpIGV2ZW4gaW4gcmVwb3MgdGhhdFxuICAgIC8vIGRlY2xhcmUgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGF0IGFsbCwgd2hpY2ggbXVzdCBub3QgdHJpZ2dlciB0aGUgQ0kgc3RyaWN0bmVzcyBiZWxvdy5cbiAgICB0aGlzLmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzLnNvbWUoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpKTtcbiAgICByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuICAvKipcbiAgICogQ29tcGxldGVzIGFuZCB2YWxpZGF0ZXMgdGhlIHJlc29sdmVkIGBXQl9FTlZgIHBlciB0aGUgb3JnIHN0YW5kYXJkIChzZWUgdGhlXG4gICAqIGd1aWRlbGluZXMtZm9yLW1pc2UtZm5veCBza2lsbCk6XG4gICAqIC0gTG9jYWxseSwgYW4gdW5zZXQgYFdCX0VOVmAgZmFsbHMgYmFjayB0byB0aGUgc2VsZWN0ZWQgY2FzY2FkZSBtb2RlIChkZXZlbG9wbWVudCB1bmxlc3MgYVxuICAgKiAgIGNvbW1hbmQgZm9yY2VzIGFub3RoZXIsIGUuZy4gYHdiIHRlc3RgIGZvcmNlcyB0ZXN0KSwgc28gY2FzdWFsIGBidW4gd2IgLi4uYCBpbnZvY2F0aW9uc1xuICAgKiAgIHdvcmsgaW4gcmVwb3NpdG9yaWVzIHRoYXQgZGVmaW5lIG5vIFdCX0VOViBhdCBhbGwuXG4gICAqIC0gT24gQ0ksIGFuIHVuc2V0IGBXQl9FTlZgIGlzIGEgaGFyZCBlcnJvciB3aGVuIGVudiBzb3VyY2VzIGV4aXN0OiB3b3JrZmxvd3MgbXVzdCBleHBvcnQgdGhlXG4gICAqICAgZW52aXJvbm1lbnQgZXhwbGljaXRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHJ1bm5pbmcgaW4gYW4gYW1iaWd1b3VzIG1vZGUuXG4gICAqIC0gVGhlIHZhbHVlIG11c3QgbmFtZSBhIHN0YW5kYXJkIG1vZGU7IGFuIHVua25vd24gdmFsdWUgKGUuZy4gYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gKSB3b3VsZFxuICAgKiAgIG90aGVyd2lzZSBzaWxlbnRseSBzZWxlY3QgdGhlIGRldmVsb3BtZW50IGNhc2NhZGUsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIHRoaXMgZ3VhcmRzIGFnYWluc3QuXG4gICAqIC0gYE5FWFRfUFVCTElDX1dCX0VOVmAgaXMgZGVyaXZlZCBmcm9tIGBXQl9FTlZgIGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzIHdoZW4gbWlzc2luZywgc28gYVxuICAgKiAgIHByb2R1Y3Rpb24gYnVpbGQgY2FuIG5vIGxvbmdlciBiYWtlIGEgc3RhbGUgZGV2ZWxvcG1lbnQgdmFsdWUgaW50byB0aGUgY2xpZW50IGJ1bmRsZS5cbiAgICogU2tpcHBlZCB3aGVuIGBXQl9TS0lQX0VOVl9DSEVDSz0xYCBpcyBzZXQuXG4gICAqL1xuICBwcml2YXRlIGNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihoYXNFbnZpcm9ubWVudFNvdXJjZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBlbnYgPSB0aGlzLmVudkNhY2hlO1xuICAgIGlmICghZW52KSByZXR1cm47XG4gICAgaWYgKGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8IGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnKSByZXR1cm47XG5cbiAgICAvLyBPbiBDSSwgV0JfRU5WIG11c3QgYmUgRVhQT1JURUQgYnkgdGhlIHdvcmtmbG93IOKAlCBjaGVja2VkIGFnYWluc3QgcHJvY2Vzcy5lbnYsIG5vdCB0aGVcbiAgICAvLyBtZXJnZWQgZW52aXJvbm1lbnQ6IGEgY29tbWl0dGVkIGJhc2UgZGVmYXVsdCAoZS5nLiBmbm94J3MgZGV2ZWxvcG1lbnQgZW50cnkpIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNhdGlzZnkgdGhlIGNoZWNrIGFuZCBzaWxlbnRseSBydW4gQ0kgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cbiAgICBpZiAoaXNDSShlbnYuQ0kpICYmICFwcm9jZXNzLmVudi5XQl9FTlYgJiYgaGFzRW52aXJvbm1lbnRTb3VyY2VzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgJ1dCX0VOViBpcyBub3QgZXhwb3J0ZWQgb24gQ0kuIEV4cG9ydCBXQl9FTlYgZXhwbGljaXRseSAodGhlIHJldXNhYmxlIHdvcmtmbG93cyBwYXNzIGl0IHZpYSB0aGUgXCJlbnZpcm9ubWVudFwiIGlucHV0KSwgJyArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFlbnYuV0JfRU5WKSB7XG4gICAgICAvLyBUaGUgc2hhcmVkIHJlc29sdmVyIGtlZXBzIHRoaXMgZmFsbGJhY2sgY29uc2lzdGVudCB3aXRoIHRoZSBjYXNjYWRlIHNlbGVjdGlvbiBBTkQgd2l0aFxuICAgICAgLy8gdGhlICR7V0JfRU5WfSBleHBhbnNpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzIGFscmVhZHkgcGVyZm9ybWVkOiB0aGUgZm9yY2VkIGNhc2NhZGVcbiAgICAgIC8vIChlLmcuIGB3YiB0ZXN0YCksIHRoZW4gdGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCwgdGhlbiB0aGUgQU1CSUVOVC1OT0RFX0VOVi1kcml2ZW4gYXV0b1xuICAgICAgLy8gY2FzY2FkZSBjbGFtcGVkIHRvIGEgc3RhbmRhcmQgbW9kZSAoYW4gZXhwbGljaXQgLS1jYXNjYWRlLWVudiBrZWVwcyBpdHMgdmFsdWUgYW5kIGlzXG4gICAgICAvLyB2YWxpZGF0ZWQgYmVsb3cgbGlrZSBhbnkgb3RoZXIgV0JfRU5WKS5cbiAgICAgIGNvbnN0IG1vZGUgPSByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpO1xuICAgICAgZW52LldCX0VOViA9IG1vZGU7XG4gICAgICBpZiAoaGFzRW52aXJvbm1lbnRTb3VyY2VzICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBXQl9FTlYgaXMgbm90IGRlZmluZWQ7IGRlZmF1bHRpbmcgdG8gXCIke21vZGV9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViBtdXN0IGJlIG9uZSBvZiBkZXZlbG9wbWVudCwgdGVzdCwgc3RhZ2luZywgb3IgcHJvZHVjdGlvbiwgYnV0IGlzIFwiJHtlbnYuV0JfRU5WfVwiLiBgICtcbiAgICAgICAgICAgICdGaXggdGhlIHZhbHVlIGluIHRoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZSwgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gQSBmb3JjZWQgbW9kZSAoYW4gZXhwbGljaXQvY29tbWFuZC1kZWZhdWx0IC0tY2FzY2FkZS1lbnYsIG9yIGFuIGV4cG9ydGVkIFdCX0VOViB3aG9zZVxuICAgIC8vIG1vZGUtc3BlY2lmaWMgZmlsZXMgbWF5IG92ZXJyaWRlIGl0IGxvY2FsbHkgcGVyIGlzc3VlICM5MzApIG11c3Qgbm90IGJlIHNpbGVudGx5IHJlcGxhY2VkXG4gICAgLy8gYnkgYW5vdGhlciBtb2RlIGEgbW9kZSBmaWxlIGRlZmluZXM6IGB3YiB0ZXN0YCByZXNvbHZpbmcgV0JfRU5WPWRldmVsb3BtZW50IGZyb20gYVxuICAgIC8vIGNvbW1pdHRlZCBgLmVudmAgd291bGQgcnVuIHRoZSB0ZXN0cyBhZ2FpbnN0IGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGFuIGV4cG9ydGVkXG4gICAgLy8gV0JfRU5WPXByb2R1Y3Rpb24gb3ZlcnJpZGRlbiB0byBkZXZlbG9wbWVudCBieSBgLmVudi5wcm9kdWN0aW9uYCB3b3VsZCBidWlsZC9kZXBsb3kgdGhlXG4gICAgLy8gd3JvbmcgZW52aXJvbm1lbnQgd2hpbGUgbG9va2luZyBzdWNjZXNzZnVsLlxuICAgIC8vIC0tY2FzY2FkZS1ub2RlLWVudiBmb3JjZXMgPE5PREVfRU5WIHx8IGRldmVsb3BtZW50PiAocGVyIGl0cyBvd24gZG9jdW1lbnRhdGlvbiksIHJlYWQgZnJvbVxuICAgIC8vIHRoZSBBTUJJRU5UIGVudmlyb25tZW50IGxpa2UgdGhlIGNhc2NhZGUgc2VsZWN0aW9uLiBPbmx5IGEgU1RBTkRBUkQgZm9yY2VkIG1vZGUgaXMgZW5mb3JjZWQ6XG4gICAgLy8gYSBub24tc3RhbmRhcmQgb25lIChlLmcuIE5PREVfRU5WPXFhKSBhbHJlYWR5IGhhZCBpdHMgZmFsbGJhY2sgY2xhbXBlZCB0byBkZXZlbG9wbWVudCBhYm92ZSxcbiAgICAvLyBhbmQgZXJyb3Jpbmcgb24gdGhhdCBjbGFtcCB3b3VsZCBjb250cmFkaWN0IGl0LlxuICAgIGNvbnN0IGZvcmNlZE1vZGUgPVxuICAgICAgdGhpcy5hcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAgICh0aGlzLmFyZ3YuY2FzY2FkZU5vZGVFbnYgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHVuZGVmaW5lZCk7XG4gICAgLy8gVGhlIEFVVE8tc2VsZWN0ZWQgbW9kZSBjb3VudHMgYXMgdGhlIGV4cGVjdGF0aW9uIHRvbzogd2l0aCBub3RoaW5nIHNldCBhbnl3aGVyZSwgdGhlXG4gICAgLy8gZGV2ZWxvcG1lbnQgY2FzY2FkZSdzIGZpbGVzIGFyZSBsb2FkZWQsIHNvIGEgYC5lbnYubG9jYWxgIGRlY2xhcmluZyBXQl9FTlY9cHJvZHVjdGlvbiB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBydW4gZGV2ZWxvcG1lbnQgc291cmNlcyBsYWJlbGVkIGFzIHByb2R1Y3Rpb24uXG4gICAgY29uc3QgZXhwZWN0ZWRNb2RlID1cbiAgICAgIGZvcmNlZE1vZGUgPz8gKHRoaXMuYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2UgPyByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpIDogdW5kZWZpbmVkKTtcbiAgICAvLyBUaGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGlzIGEgbGVnaXRpbWF0ZSBzZWNvbmQgZXhwZWN0YXRpb246IGB3YiB0ZXN0IC0tY2FzY2FkZS1lbnY9c3RhZ2luZ2BcbiAgICAvLyBsb2FkcyB0aGUgc3RhZ2luZyBmaWxlcyB3aGlsZSB0aGUgZmFsbGJhY2sgY29ycmVjdGx5IGZpbGxzIFdCX0VOVj10ZXN0LlxuICAgIGlmIChcbiAgICAgIGV4cGVjdGVkTW9kZSAmJlxuICAgICAgUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGV4cGVjdGVkTW9kZSkgJiZcbiAgICAgIGVudi5XQl9FTlYgIT09IGV4cGVjdGVkTW9kZSAmJlxuICAgICAgZW52LldCX0VOViAhPT0gdGhpcy5hcmd2LmNvbW1hbmREZWZhdWx0V2JFbnZcbiAgICApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgV0JfRU5WIHJlc29sdmVzIHRvIFwiJHtlbnYuV0JfRU5WfVwiIGFsdGhvdWdoIHRoZSBcIiR7ZXhwZWN0ZWRNb2RlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgICAgICBgRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgbW9kZSdzIGVudiBzb3VyY2UgKGUuZy4gLmVudi4ke2V4cGVjdGVkTW9kZX0gb3IgdGhlIGZub3ggXCIke2V4cGVjdGVkTW9kZX1cIiBwcm9maWxlKSwgYCArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVxdWlyZXNOZXh0UHVibGljV2JFbnYgJiYgZW52Lk5FWFRfUFVCTElDX1dCX0VOViAhPT0gZW52LldCX0VOVikge1xuICAgICAgLy8gQXNzaWduIHVuY29uZGl0aW9uYWxseSwgbm90IGB8fD1gOiB0aGUgcGFpciBtdXN0IGFncmVlIGJ5IGNvbnZlbnRpb24sIGFuZCBhIHN0YWxlIHZhbHVlXG4gICAgICAvLyAoZS5nLiBhIGJhc2UgYC5lbnZgJ3MgZGV2ZWxvcG1lbnQgZGVmYXVsdCB3aGlsZSBDSSBleHBvcnRzIFdCX0VOVj10ZXN0KSB3b3VsZCBvdGhlcndpc2VcbiAgICAgIC8vIGJlIGJha2VkIGludG8gdGhlIGNsaWVudCBidW5kbGUgZXZlbiB0aG91Z2ggdGhlIHNlcnZlciBzaWRlIHJ1bnMgd2l0aCB0aGUgY29ycmVjdCBXQl9FTlYuXG4gICAgICBpZiAoZW52Lk5FWFRfUFVCTElDX1dCX0VOViAmJiAhc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCh0aGlzLmFyZ3YpKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgT3ZlcnJpZGluZyBORVhUX1BVQkxJQ19XQl9FTlYgKFwiJHtlbnYuTkVYVF9QVUJMSUNfV0JfRU5WfVwiKSB3aXRoIFdCX0VOViAoXCIke2Vudi5XQl9FTlZ9XCIpLmApO1xuICAgICAgfVxuICAgICAgZW52Lk5FWFRfUFVCTElDX1dCX0VOViA9IGVudi5XQl9FTlY7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcmVxdWlyZXNOZXh0UHVibGljV2JFbnYoKTogYm9vbGVhbiB7XG4gICAgLy8gT1dOIGRlcGVuZGVuY2llcyBvbmx5OiBhIHJvb3QtbGV2ZWwgbmV4dC92aW5leHQgZGV2RGVwZW5kZW5jeSBpbiBhIG1peGVkIG1vbm9yZXBvIG11c3Qgbm90XG4gICAgLy8gZm9yY2UgTkVYVF9QVUJMSUNfV0JfRU5WIG9udG8gZXZlcnkgbm9uLU5leHQgd29ya3NwYWNlIHBhY2thZ2UuXG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignbmV4dCcpIHx8ICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigndmluZXh0Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRHJpenpsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdkcml6emxlLW9ybScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRhdGFiYXNlT3JtKCk6IERhdGFiYXNlT3JtIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNQcmlzbWEpIHJldHVybiAncHJpc21hJztcbiAgICBpZiAodGhpcy5oYXNEcml6emxlKSByZXR1cm4gJ2RyaXp6bGUnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1R5cGVBd2FyZU94bGludCgpOiBib29sZWFuIHtcbiAgICAvLyBPeGxpbnQncyB0eXBlLWF3YXJlIG1vZGUgcmVxdWlyZXMgdGhlIG94bGludC10c2dvbGludCBiaW5hcnkuXG4gICAgcmV0dXJuIHRoaXMuaGFzT3hsaW50ICYmIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hsaW50LXRzZ29saW50Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hmbXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hmbXQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmV0dGllcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdwcmV0dGllcicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BvZXRyeUxvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwb2V0cnkubG9jaycpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHVic3BlY1lhbWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSB8fFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzQ2FyZ29Ub21sKCk6IGJvb2xlYW4ge1xuICAgIC8vIE9ubHkgdGhlIHByb2plY3QncyBvd24gZGlyZWN0b3J5IGlzIGNoZWNrZWQgYmVjYXVzZSBgY2FyZ28gZm10IC0tYWxsYFxuICAgIC8vIGNvdmVycyB0aGUgd2hvbGUgd29ya3NwYWNlOyBtYXRjaGluZyB0aGUgcm9vdCBkaXJlY3RvcnkgdG9vIHdvdWxkIG1ha2VcbiAgICAvLyBldmVyeSBkZXNjZW5kYW50IHByb2plY3QgcnVuIHRoZSBzYW1lIHdvcmtzcGFjZS13aWRlIGNvbW1hbmQgaW5cbiAgICAvLyBwYXJhbGxlbC5cbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnQ2FyZ28udG9tbCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwcmVmZXJyZWRMaW50ZXIoKTogJ294bGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc094bGludCkgcmV0dXJuICdveGxpbnQnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhc093bkRlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICAgIHJldHVybiAvXFxid2ViU2VydmVyXFxiLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKHRoaXMuZGlyUGF0aCwgdGhpcy5lbnYpO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGhhc0RlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpID8/IHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5yb290UGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm47XG5cbiAgICByZXR1cm4gKFxuICAgICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJvb3RQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucm9vdERpclBhdGggPT09IHRoaXMuZGlyUGF0aCkgcmV0dXJuIHRoaXMucGFja2FnZUpzb247XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbd2JdIEZhaWxlZCB0byByZWFkIG9yIHBhcnNlICR7cGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKX1gLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3UGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByYXdQYXRoLnN0YXJ0c1dpdGgoJy8vJykgPyByYXdQYXRoLnNsaWNlKDIpIDogcmF3UGF0aDtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoIHx8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4gJiBQYXJ0aWFsPFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3Jvb3REaXJQYXRoJz4+XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSkgcmV0dXJuIGRiUGF0aDtcblxuICBjb25zdCBiYXNlRGlyUGF0aCA9IHByb2plY3Qucm9vdERpclBhdGggPz8gcHJvamVjdC5kaXJQYXRoO1xuICByZXR1cm4gYmFzZURpclBhdGggPyBwYXRoLnJlc29sdmUoYmFzZURpclBhdGgsIGRiUGF0aCkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdDogUHJvamVjdCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9qZWN0LmVudi5XQl9FTlYgPT09IG5hbWUgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlYgPT09IG5hbWU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmZ1bmN0aW9uIHRlc3RGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByb290IHByb2plY3QgZm9sbG93ZWQgYnkgb25lIFByb2plY3QgcGVyIHdvcmtzcGFjZSBkaXJlY3RvcnkgdGhlIHRhcmdldCByZXBvc2l0b3J5J3NcbiAqIHBhY2thZ2UgbWFuYWdlciB3b3VsZCBsaW5rIChpc3N1ZSAjMTAwOCk6IEJ1biByZXBvcyB1c2UgdGhlIHNoYXJlZCBCdW4tZXhhY3QgcmVzb2x2ZXJcbiAqIChuZWdhdGlvbnMsIHBpbm5lZCBwb3NpdGl2ZXMsIGFuZCBiYXNlbGluZS1zZWVkaW5nIG5lZ2F0aW9ucyBpbmNsdWRlZCksIHdoaWxlIFlhcm4gcmVwb3Mga2VlcFxuICogZ2xvYiBzZW1hbnRpY3Mg4oCUIEJ1bi1vbmx5IHJ1bGVzIHN1Y2ggYXMgdGhlIGltcGxpY2l0IGJhc2VsaW5lIHdvdWxkIGludmVudCB3b3Jrc3BhY2VzIFlhcm5cbiAqIG5ldmVyIGxpbmtzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290UHJvamVjdCk7XG4gIHJldHVybiBbcm9vdFByb2plY3QsIC4uLndvcmtzcGFjZURpclBhdGhzLm1hcCgod29ya3NwYWNlRGlyUGF0aCkgPT4gbmV3IFByb2plY3Qod29ya3NwYWNlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpXTtcbn1cblxuLyoqXG4gKiBUaGUgYWJzb2x1dGUgZGlyZWN0b3J5IG9mIGV2ZXJ5IHdvcmtzcGFjZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBwYWNrYWdlIG1hbmFnZXIgd291bGQgbGluayxcbiAqIG1hdGNoaW5nIHRoZSBtYW5hZ2VyIHRoZSB3YXkgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIGRlc2NyaWJlcy4gRXhwb3J0ZWQgZm9yIHdiIHJlbGVhc2UsIHdob3NlXG4gKiBwbHVnaW4gaW5zcGVjdGlvbiwgbm9kZV9tb2R1bGVzIGNsZWFudXAsIGFuZCBtYW5pZmVzdCByZXdyaXRpbmcgbXVzdCBzZWUgdGhlIHNhbWUgd29ya3NwYWNlIHNldC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb24nIHwgJ3VzZXNCdW5QYWNrYWdlTWFuYWdlcic+XG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmIChwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlcikge1xuICAgIHJldHVybiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMsIHByb2plY3QuZGlyUGF0aCkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICApO1xuICB9XG4gIC8vIFlhcm4gMS4yMi4yMiByZXNvbHZlcyBlYWNoIGRlY2xhcmVkIHBhdHRlcm4gKGFycmF5IG9yIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBmb3JtKSBpbmRlcGVuZGVudGx5XG4gIC8vIGFuZCB1bmlvbnMgdGhlIHJlc3VsdHMsIHNvIGEgbGVhZGluZy1gIWAgcGF0dGVybiBpcyBub3QgYW4gZXhjbHVzaW9uIOKAlCBgW1wicGFja2FnZXMvKlwiLFxuICAvLyBcIiFwYWNrYWdlcy9hXCJdYCBzdGlsbCBsaW5rcyBwYWNrYWdlcy9hLiBZYXJuIGFkZGl0aW9uYWxseSBpZ25vcmVzIG1hbmlmZXN0cyBtaXNzaW5nIGEgbmFtZSBvclxuICAvLyB2ZXJzaW9uIChcIk1pc3NpbmcgdmVyc2lvbiBpbiB3b3Jrc3BhY2Ug4oCmLCBpZ25vcmluZy5cIiksIGJ1dCB0aGF0IGlzIGRlbGliZXJhdGVseSBOT1QgbWlycm9yZWQ6XG4gIC8vIHdiJ3MgZGVzY2VuZGFudCBkaXNjb3ZlcnkgZXhpc3RzIHRvIHJ1biBjb21tYW5kcyAobGludCwgdGVzdCwgdHlwZWNoZWNrLCDigKYpIGluIHN1Yi1wYWNrYWdlcyxcbiAgLy8gYW5kIHZlcnNpb24tbGVzcyBwcml2YXRlIHBhY2thZ2VzIG11c3Qgc3RheSBkaXNjb3ZlcmVkIOKAlCB0aGUgbG9uZy1zdGFuZGluZyBiZWhhdmlvciB3YidzXG4gIC8vIG1vbm9yZXBvIGZpeHR1cmVzIGVuY29kZS4gR2xvYiBmb3IgdGhlIG1hbmlmZXN0cyB0aGVtc2VsdmVzOiBnbG9iYnkncyBgb25seURpcmVjdG9yaWVzYFxuICAvLyB3b3VsZCByZXR1cm4gYSBsaXRlcmFsIGRpcmVjdG9yeSBwYXR0ZXJuJ3MgQ0hJTERSRU4gaW5zdGVhZCBvZiB0aGUgZGlyZWN0b3J5LiBUaGUgcmVhbHBhdGhcbiAgLy8gY29udGFpbm1lbnQgbWlycm9ycyByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRoczogYSB3b3Jrc3BhY2Ugc3ltbGluayBlc2NhcGluZyB0aGVcbiAgLy8gcmVwb3NpdG9yeSBtdXN0IG5vdCBsZXQgY29uc3VtZXJzIHRvdWNoIGFub3RoZXIgY2hlY2tvdXQuXG4gIGNvbnN0IHBvc2l0aXZlUGF0dGVybnMgPSBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykuZmlsdGVyKFxuICAgIChwYXR0ZXJuKSA9PiAhcGF0dGVybi5zdGFydHNXaXRoKCchJykgJiYgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHBhdHRlcm4pXG4gICk7XG4gIGlmIChwb3NpdGl2ZVBhdHRlcm5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAvLyBleHBhbmREaXJlY3RvcmllczogZmFsc2Ug4oCUIGdsb2JieSB3b3VsZCBvdGhlcndpc2UgZXhwYW5kIGEgbGl0ZXJhbCBkaXJlY3RvcnkgcGF0dGVybiB0byBpdHNcbiAgLy8gQ0hJTERSRU4sIHR1cm5pbmcgZS5nLiBgcGFja2FnZXNgIGludG8gbWF0Y2hlcyBmb3IgZXZlcnkgcGFja2FnZXMvKiBzdWJkaXJlY3RvcnkuXG4gIGNvbnN0IGdsb2JieU9wdGlvbnMgPSB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZXhwYW5kRGlyZWN0b3JpZXM6IGZhbHNlLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgfTtcbiAgLy8gZmFzdC1nbG9iIChnbG9iYnkncyBlbmdpbmUpIHJldHVybnMgbm8gbWF0Y2hlcyBmb3IgZmlsZSBnbG9icyB3aXRoIGEgbG9uZS1gP2Agc2VnbWVudCAoZS5nLlxuICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSBhbHRob3VnaCBZYXJuIGxpbmtzIHN1Y2ggd29ya3NwYWNlczsgZm9yIGA/YC1jYXJyeWluZyBwYXR0ZXJuc1xuICAvLyBvbmx5IChhIGRpcmVjdG9yeSBnbG9iIGZvciBlLmcuIGAqKmAgd291bGQgc2NhbiBldmVyeSBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZ1xuICAvLyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYi5cbiAgY29uc3QgZ2xvYmJlZE1hbmlmZXN0UGF0aHMgPSBhd2FpdCBnbG9iYnkoXG4gICAgcG9zaXRpdmVQYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IHBhdGgucG9zaXguam9pbihwYXR0ZXJuLCAncGFja2FnZS5qc29uJykpLFxuICAgIGdsb2JieU9wdGlvbnNcbiAgKTtcbiAgY29uc3QgbWFuaWZlc3RQYXRoU2V0ID0gbmV3IFNldChnbG9iYmVkTWFuaWZlc3RQYXRocyk7XG4gIGNvbnN0IHF1ZXN0aW9uTWFya1BhdHRlcm5zID0gcG9zaXRpdmVQYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHBhdHRlcm4uaW5jbHVkZXMoJz8nKSk7XG4gIGlmIChxdWVzdGlvbk1hcmtQYXR0ZXJucy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGF3YWl0IGdsb2JieShxdWVzdGlvbk1hcmtQYXR0ZXJucywgeyAuLi5nbG9iYnlPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBtYW5pZmVzdFBhdGgpKSkgbWFuaWZlc3RQYXRoU2V0LmFkZChtYW5pZmVzdFBhdGgpO1xuICAgIH1cbiAgfVxuICBjb25zdCBtYW5pZmVzdFBhdGhzID0gWy4uLm1hbmlmZXN0UGF0aFNldF07XG4gIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhwcm9qZWN0LmRpclBhdGgpO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IG1hbmlmZXN0UGF0aHNcbiAgICAvLyBBIGAqKmAgcGF0dGVybiByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0IGFuZCBpbnN0YWxsZWQgcGFja2FnZXMsIGJ1dCBuZWl0aGVyIGlzIGFcbiAgICAvLyB3b3Jrc3BhY2UgdG8gWWFybiAod2hpY2ggbmV2ZXIgZGVzY2VuZHMgaW50byBub2RlX21vZHVsZXMpLlxuICAgIC5maWx0ZXIoKG1hbmlmZXN0UGF0aCkgPT4ge1xuICAgICAgaWYgKG1hbmlmZXN0UGF0aCA9PT0gJ3BhY2thZ2UuanNvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWFuaWZlc3RQYXRoKSkpO1xuICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBtYW5pZmVzdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbDogbm90IGEgd29ya3NwYWNlLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSlcbiAgICAubWFwKChtYW5pZmVzdFBhdGgpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHBhdGgucG9zaXguZGlybmFtZShtYW5pZmVzdFBhdGgpKSk7XG4gIHJldHVybiBbLi4ubmV3IFNldCh3b3Jrc3BhY2VEaXJQYXRocyldLnRvU29ydGVkKCk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdCdWlsZCBvdXRwdXQgcGF0aHMgKHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSkgdGhhdCBtdXN0IGV4aXN0IGZvciB0aGUgY2FjaGUgdG8gYmUgdmFsaWQgKGRlZmF1bHQ6IGF1dG8tZGV0ZWN0ZWQgY29tbW9uIG91dHB1dCBkaXJlY3RvcmllcyknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRDb21tYW5kID1cbiAgICBhcmd2LmNvbW1hbmQgPz8gKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZH0gYnVpbGRgIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICAvLyBUaGUgY2FjaGUgcmVxdWlyZXMgdGhlIGdpdCByZXBvc2l0b3J5IHJvb3QgdG8gQkUgcm9vdERpclBhdGg6IHBvcmNlbGFpbiBwYXRocyBhbmQgZGlmZlxuICAvLyBwYXRoc3BlY3MgYmVsb3cgYXJlIGpvaW5lZC9leGVjdXRlZCBhZ2FpbnN0IHJvb3REaXJQYXRoLiBXaGVuIHRoZSByZXBvIHJvb3QgaXMgZWxzZXdoZXJlXG4gIC8vIChlLmcuIGEgc3VicHJvamVjdCBvZiBhIGxhcmdlciByZXBvc2l0b3J5KSwgYWx3YXlzIGJ1aWxkIGluc3RlYWQgb2YgbWlzLXJlc29sdmluZyBwYXRocy5cbiAgLy8gQSBmcmVzaGx5IGluaXRpYWxpemVkIHJlcG8gd2l0aG91dCBjb21taXRzICh1bmJvcm4gSEVBRCkgbGlrZXdpc2UgYnVpbGRzIHdpdGhvdXQgY2FjaGluZzpcbiAgLy8gYGdpdCByZXYtcGFyc2UgSEVBRGAgd291bGQgdGhyb3cuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkgfHwgIWhhc0dpdENvbW1pdChwcm9qZWN0KSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCBvdXRwdXRQYXRocyA9IGdldEV4cGxpY2l0T3V0cHV0UGF0aHMoYXJndikgPz8gZGV0ZWN0RXhpc3RpbmdEZWZhdWx0T3V0cHV0UGF0aHMocHJvamVjdCk7XG4gICAgaWYgKG91dHB1dFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gV2l0aCBubyByZWNvcmRlZCBvdXRwdXRzLCBhIGRlbGV0ZWQgYnVpbGQgZGlyZWN0b3J5IGNhbiBuZXZlciBpbnZhbGlkYXRlIHRoZSBjYWNoZTsgbWFrZVxuICAgICAgLy8gdGhlIGluYWN0aXZlIHByb3RlY3Rpb24gdmlzaWJsZSBpbnN0ZWFkIG9mIGZhaWxpbmcgc2lsZW50bHkgKGNmLiBpc3N1ZSAjOTgxKS5cbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsueWVsbG93KCdObyBidWlsZCBvdXRwdXQgZGlyZWN0b3J5IGRldGVjdGVkOyBwYXNzIC0tb3V0cHV0IHRvIGVuYWJsZSBtaXNzaW5nLW91dHB1dCBjYWNoZSBpbnZhbGlkYXRpb24uJylcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeSh7IGhhc2g6IGNvbnRlbnRIYXNoLCBvdXRwdXRQYXRocyB9KSwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gQ29tbW9uIGJ1aWxkIG91dHB1dCBkaXJlY3RvcmllcyB1c2VkIGFjcm9zcyBvcmcgcHJvamVjdHMgKHZpbmV4dC9idWlsZC10cyBlbWl0IGRpc3QsXG4vLyBOZXh0LmpzIGVtaXRzIC5uZXh0LCBDUkEtc3R5bGUgYXBwcyBlbWl0IGJ1aWxkLCBgbmV4dCBleHBvcnRgIGVtaXRzIG91dCkuXG5jb25zdCBkZWZhdWx0T3V0cHV0Q2FuZGlkYXRlcyA9IFsnZGlzdCcsICdidWlsZCcsICcubmV4dCcsICdvdXQnXTtcblxuZnVuY3Rpb24gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gYXJndi5vdXRwdXQ/Lmxlbmd0aCA/IGFyZ3Yub3V0cHV0Lm1hcChTdHJpbmcpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RFeGlzdGluZ0RlZmF1bHRPdXRwdXRQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICByZXR1cm4gZGVmYXVsdE91dHB1dENhbmRpZGF0ZXMuZmlsdGVyKChvdXRwdXRQYXRoKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIG91dHB1dFBhdGgpKSk7XG59XG5cbi8qKiBBbiBgLS1vdXRwdXRgIHZhbHVlIG1heSBuYW1lIGEgZmlsZSwgc28gbWF0Y2ggdGhlIGV4YWN0IHBhdGggYXMgd2VsbCBhcyBkZXNjZW5kYW50cy4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNPdXRwdXRQYXRoKG91dHB1dFBhdGhzOiBzdHJpbmdbXSwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3V0cHV0UGF0aHMuc29tZSgob3V0cHV0UGF0aCkgPT4gZmlsZVBhdGggPT09IG91dHB1dFBhdGggfHwgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtvdXRwdXRQYXRofS9gKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0dpdENvbW1pdChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgJ0hFQUQnXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgfSkuc3RhdHVzID09PSAwXG4gICk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIC8vIFRoZSBpbnZva2VkIGJ1aWxkIGNvbW1hbmQgaXMgcGFydCBvZiB0aGUgY2FjaGUgaWRlbnRpdHk6IGAtYyBjb21tYW5kQmAgbXVzdCBub3QgcmV1c2UgYVxuICAvLyBjYWNoZSByZWNvcmRlZCBmb3IgY29tbWFuZEEgd2l0aCBvdGhlcndpc2UgdW5jaGFuZ2VkIGlucHV0cy5cbiAgaGFzaC51cGRhdGUoYXJndi5jb21tYW5kID8/ICcnKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnQgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgY29uc3QgY2FjaGUgPSBwYXJzZUJ1aWxkQ2FjaGUoY2FjaGVkQ29udGVudCk7XG4gIGlmIChjYWNoZT8uaGFzaCAhPT0gY29udGVudEhhc2gpIHJldHVybiBbZmFsc2UsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcblxuICAvLyBUaGUgY2FjaGUgaXMgdmFsaWQgb25seSB3aGlsZSB0aGUgcmVjb3JkZWQgKG9yIGV4cGxpY2l0bHkgcmVxdWVzdGVkKSBidWlsZCBvdXRwdXRzIHN0aWxsXG4gIC8vIGV4aXN0OiBhIGRlbGV0ZWQgb3V0cHV0IGRpcmVjdG9yeSAoZS5nLiBgcm0gLXJmIGRpc3RgKSBtdXN0IHRyaWdnZXIgYSByZWJ1aWxkIGV2ZW4gd2hlbiB0aGVcbiAgLy8gaW5wdXRzIGFyZSB1bmNoYW5nZWQgKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk4MSkuXG4gIGNvbnN0IHJlcXVpcmVkT3V0cHV0UGF0aHMgPSBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKGFyZ3YpID8/IGNhY2hlLm91dHB1dFBhdGhzO1xuICBjb25zdCBtaXNzaW5nT3V0cHV0UGF0aHMgPSByZXF1aXJlZE91dHB1dFBhdGhzLmZpbHRlcihcbiAgICAob3V0cHV0UGF0aCkgPT4gIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpXG4gICk7XG4gIGlmIChtaXNzaW5nT3V0cHV0UGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFJlYnVpbGRpbmcgYmVjYXVzZSBidWlsZCBvdXRwdXRzIGFyZSBtaXNzaW5nOiAke21pc3NpbmdPdXRwdXRQYXRocy5qb2luKCcsICcpfWApKTtcbiAgICByZXR1cm4gW2ZhbHNlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG4gIH1cbiAgcmV0dXJuIFt0cnVlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVpbGRDYWNoZShjYWNoZWRDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB7IGhhc2g6IHN0cmluZzsgb3V0cHV0UGF0aHM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIWNhY2hlZENvbnRlbnQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNhY2hlZENvbnRlbnQpIGFzIHsgaGFzaD86IHVua25vd247IG91dHB1dFBhdGhzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgcGFyc2VkPy5oYXNoICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gQXJyYXkuaXNBcnJheShwYXJzZWQub3V0cHV0UGF0aHMpXG4gICAgICA/IHBhcnNlZC5vdXRwdXRQYXRocy5maWx0ZXIoKHApID0+IHR5cGVvZiBwID09PSAnc3RyaW5nJylcbiAgICAgIDogW107XG4gICAgcmV0dXJuIHsgaGFzaDogcGFyc2VkLmhhc2gsIG91dHB1dFBhdGhzIH07XG4gIH0gY2F0Y2gge1xuICAgIC8vIEEgbGVnYWN5IGNhY2hlIGZpbGUgY29udGFpbnMgYSByYXcgY29udGVudCBoYXNoIHdpdGhvdXQgb3V0cHV0IHJlY29yZHMuIFRyZWF0IGl0IGFzIGEgbWlzczpcbiAgICAvLyBob25vcmluZyBpdCB3b3VsZCBsZXQgYSBtYXRjaGluZyBoYXNoIHNraXAgYSBidWlsZCB3aG9zZSBvdXRwdXRzIHdlcmUgZGVsZXRlZCwgYW5kIG9uZVxuICAgIC8vIHJlYnVpbGQgdXBncmFkZXMgdGhlIHJlY29yZCB0byB0aGUgSlNPTiBmb3JtYXQuXG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8vIE1hdGNoZWQgYXMgY29tcGxldGUgcGF0aCBTRUdNRU5UUyAobm90IHN1YnN0cmluZ3MpOiBgc3JjL2NvbnRlc3QvYCBtdXN0IG5vdCBiZSBleGNsdWRlZCBieVxuLy8gYHRlc3RgLCBhbmQgYG15c3JjL2AgbXVzdCBub3QgYmUgaW5jbHVkZWQgYnkgYHNyY2AuXG5jb25zdCBpbmNsdWRlRGlyTmFtZXMgPSBuZXcgU2V0KFsnc3JjJywgJ3B1YmxpYyddKTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbiAgJ2J1bi5sb2NrJyxcbiAgJ2J1bi5sb2NrYicsXG5dO1xuY29uc3QgZXhjbHVkZURpck5hbWVzID0gbmV3IFNldChbJ3Rlc3QnLCAndGVzdHMnLCAnX190ZXN0c19fJywgJ3Rlc3QtZml4dHVyZXMnXSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIC8vIGAtdWFsbGAgbGlzdHMgdW50cmFja2VkIGZpbGVzIGluZGl2aWR1YWxseSAobm90IGp1c3QgdGhlaXIgZGlyZWN0b3J5KSwgc28gbmV3IGZpbGVzIGluIGFcbiAgICAvLyBicmFuZC1uZXcgc291cmNlIGRpcmVjdG9yeSBwYXJ0aWNpcGF0ZSBpbiB0aGUgaGFzaCBiZWxvdy4gYC16YCB5aWVsZHMgTlVMLWRlbGltaXRlZCxcbiAgICAvLyBVTlFVT1RFRCByZWNvcmRzOiB3aXRob3V0IGl0IGdpdCBDLXF1b3RlcyBub24tQVNDSUkgcGF0aHMsIHdoaWNoIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhvc2VcbiAgICAvLyBmaWxlcyBmcm9tIGJvdGggdGhlIHVudHJhY2tlZCBoYXNoaW5nIGFuZCB0aGUgYGdpdCBkaWZmYCBwYXRoc3BlY3MuXG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJywgJy11YWxsJywgJy16J10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IHRva2VucyA9IHJldC5zdGRvdXQuc3BsaXQoJ1xcMCcpLmZpbHRlcigodG9rZW4pID0+IHRva2VuLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IHN0YXR1c0VudHJpZXM6IHsgdW50cmFja2VkOiBib29sZWFuOyBmaWxlUGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0hO1xuICAgICAgY29uc3Qgc3RhdHVzID0gdG9rZW4uc2xpY2UoMCwgMik7XG4gICAgICBzdGF0dXNFbnRyaWVzLnB1c2goeyB1bnRyYWNrZWQ6IHN0YXR1cyA9PT0gJz8/JywgZmlsZVBhdGg6IHRva2VuLnNsaWNlKDMpIH0pO1xuICAgICAgLy8gUmVuYW1lL2NvcHkgcmVjb3JkcyBjYXJyeSB0aGUgT1JJR0lOQUwgcGF0aCBhcyBhbiBleHRyYSBOVUwtZGVsaW1pdGVkIGZpZWxkOyBpbmNsdWRlIGl0XG4gICAgICAvLyBzbyBhIGZpbGUgcmVuYW1lZCBvdXQgb2YgdGhlIGJ1aWxkIGlucHV0cyBzdGlsbCBpbnZhbGlkYXRlcyB0aGUgY2FjaGUuXG4gICAgICBpZiAoc3RhdHVzLmluY2x1ZGVzKCdSJykgfHwgc3RhdHVzLmluY2x1ZGVzKCdDJykpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxQYXRoID0gdG9rZW5zWysraW5kZXhdO1xuICAgICAgICBpZiAob3JpZ2luYWxQYXRoKSBzdGF0dXNFbnRyaWVzLnB1c2goeyB1bnRyYWNrZWQ6IGZhbHNlLCBmaWxlUGF0aDogb3JpZ2luYWxQYXRoIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkRW50cmllcyA9IHN0YXR1c0VudHJpZXMubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIC4uLmVudHJ5LFxuICAgICAgaGFzaFBhdGg6XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnXG4gICAgICAgICAgPyBlbnRyeS5maWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJylcbiAgICAgICAgICA6IGVudHJ5LmZpbGVQYXRoLFxuICAgIH0pKTtcbiAgICAvLyBCdWlsZCBPVVRQVVRTIG11c3QgbmV2ZXIgY291bnQgYXMgYnVpbGQgaW5wdXRzOiBoYXNoaW5nIGUuZy4gYW4gdW50cmFja2VkIGRpc3QvIGZpbGUgd291bGRcbiAgICAvLyBjaGFuZ2UgdGhlIGhhc2ggb24gZXZlcnkgYnVpbGQgYW5kIGRpc2FibGUgdGhlIGNhY2hlIHBlcm1hbmVudGx5LlxuICAgIGNvbnN0IHByb2plY3RSZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3Qucm9vdERpclBhdGgsIHByb2plY3QuZGlyUGF0aCk7XG4gICAgY29uc3QgZXhwbGljaXRPdXRwdXRQYXRocyA9IChnZXRFeHBsaWNpdE91dHB1dFBhdGhzKGFyZ3YpID8/IFtdKS5tYXAoKG91dHB1dFBhdGgpID0+XG4gICAgICBwYXRoLmpvaW4ocHJvamVjdFJlbGF0aXZlRGlyUGF0aCwgb3V0cHV0UGF0aClcbiAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRW50cmllcyA9IG5vcm1hbGl6ZWRFbnRyaWVzLmZpbHRlcigoeyBmaWxlUGF0aCwgaGFzaFBhdGggfSkgPT4ge1xuICAgICAgY29uc3QgZGlyZWN0b3J5U2VnbWVudHMgPSBoYXNoUGF0aC5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChkaXJlY3RvcnlTZWdtZW50cy5zb21lKChzZWdtZW50KSA9PiBpbmNsdWRlRGlyTmFtZXMuaGFzKHNlZ21lbnQpKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBoYXNoUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWRpcmVjdG9yeVNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+IGV4Y2x1ZGVEaXJOYW1lcy5oYXMoc2VnbWVudCkpICYmXG4gICAgICAgIC8vIE9ubHkgRVhQTElDSVRMWSBkZWNsYXJlZCBvdXRwdXRzIGFyZSBleGNsdWRlZCBmcm9tIHRoZSBpbnB1dCBoYXNoLiBEZWZhdWx0IGNhbmRpZGF0ZXNcbiAgICAgICAgLy8gKGRpc3QvYnVpbGQvLm5leHQvb3V0KSBhcmUgTk9UOiBnaXRpZ25vcmVkIGFydGlmYWN0cyBuZXZlciBhcHBlYXIgaW4gYGdpdCBzdGF0dXNgXG4gICAgICAgIC8vIGFueXdheSwgYW5kIGEgbm9uLWlnbm9yZWQgZmlsZSB0aGVyZSBtYXkgYmUgZ2VudWluZSBzb3VyY2UgKGUuZy4gYnVpbGQvIHNjcmlwdHMpLCB3aG9zZVxuICAgICAgICAvLyBjaGFuZ2VzIG11c3QgaW52YWxpZGF0ZSB0aGUgY2FjaGUg4oCUIGNvcnJlY3RuZXNzIG92ZXIgY2FjaGUgaGl0cy4gUHJvamVjdHMga2VlcGluZ1xuICAgICAgICAvLyBub24taWdub3JlZCBhcnRpZmFjdHMgaW4gdGhvc2UgZGlyZWN0b3JpZXMgc2hvdWxkIGdpdGlnbm9yZSB0aGVtIG9yIHBhc3MgLS1vdXRwdXQuXG4gICAgICAgICFtYXRjaGVzT3V0cHV0UGF0aChleHBsaWNpdE91dHB1dFBhdGhzLCBmaWxlUGF0aClcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRW50cmllcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5oYXNoUGF0aCkuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBVbnRyYWNrZWQgZmlsZXMgbmV2ZXIgYXBwZWFyIGluIGBnaXQgZGlmZmAsIHNvIGhhc2ggdGhlaXIgY29udGVudHMgZGlyZWN0bHkuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBmaWx0ZXJlZEVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkudW50cmFja2VkKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFzaC51cGRhdGUoZW50cnkuaGFzaFBhdGgpO1xuICAgICAgICBoYXNoLnVwZGF0ZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsIGVudHJ5LmZpbGVQYXRoKSkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBmaWxlIG1heSB2YW5pc2ggY29uY3VycmVudGx5OyB0aGUgdHJhY2tlZC1zdGF0ZSBkaWZmIGJlbG93IGlzIHVuYWZmZWN0ZWQuXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tlZFBhdGhzID0gZmlsdGVyZWRFbnRyaWVzLmZpbHRlcigoZW50cnkpID0+ICFlbnRyeS51bnRyYWNrZWQpLm1hcCgoZW50cnkpID0+IGVudHJ5Lmhhc2hQYXRoKTtcbiAgICBpZiAodHJhY2tlZFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gYGdpdCBkaWZmIEhFQUQgLS1gIHdpdGggbm8gcGF0aHNwZWMgd291bGQgZGlmZiBFVkVSWSBmaWxlLCBsZXR0aW5nIGV4Y2x1ZGVkIGNoYW5nZXNcbiAgICAgIC8vIChkb2NzLCB0ZXN0cykgaW52YWxpZGF0ZSB0aGUgY2FjaGUuXG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGBnaXQgZGlmZiBIRUFEYCAobm90IHBsYWluIGBnaXQgZGlmZmApIHNvIHN0YWdlZC1vbmx5IGNoYW5nZXMgaW52YWxpZGF0ZSB0aGUgY2FjaGUgdG9vO1xuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aC5cbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJ0hFQUQnLCAnLS0nLCAuLi50cmFja2VkUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY2k/OiBib29sZWFuO1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xuICBvblNpZ25hbD86IChzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4gdm9pZDtcbiAgb21pdFNpbGVudFN0YXJ0PzogYm9vbGVhbjtcbiAgcHJlc2VydmVDb2xvcj86IGJvb2xlYW47XG4gIHByb2Nlc3NTaWxlbnRPdXRwdXQ/OiAob3V0cHV0OiBzdHJpbmcpID0+IHN0cmluZztcbiAgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuO1xuICBwcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHk/OiBib29sZWFuO1xuICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM/OiBudW1iZXI7XG4gIHNpbGVudFN1Y2Nlc3NNZXNzYWdlPzogc3RyaW5nO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBCdWZmZXJlZFJ1blJlc3VsdCB7XG4gIGV4aXRDb2RlOiBudW1iZXI7XG4gIG91dHB1dDogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4gJiB7IHNpbGVudD86IGJvb2xlYW4gfSxcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIGlmICghKGFyZ3Yuc2lsZW50ICYmIG9wdHMub21pdFNpbGVudFN0YXJ0ICYmICFhcmd2LmRyeVJ1bikpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCBhcmd2LnNpbGVudCA/ICdDb21tYW5kJyA6ICdTdGFydCcpO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0ID0gQm9vbGVhbihcbiAgICBhcmd2LnNpbGVudCAmJiAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8/IG9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5KVxuICApO1xuICBsZXQgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IGZhbHNlO1xuICBjb25zdCBwcm9ncmVzc1RpbWVyID1cbiAgICBhcmd2LnNpbGVudCAmJiBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNc1xuICAgICAgPyBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJy4nKTtcbiAgICAgICAgICB3cm90ZVNpbGVudFByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgfSwgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gKGFyZ3Yuc2lsZW50ID8gdHJ1ZSA6IHVuZGVmaW5lZCkgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86IGFyZ3Yuc2lsZW50ID8gJ3BpcGUnIDogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBtZXJnZU91dEFuZEVycm9yOiBzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIHByaW50aW5nU3RkZXJyOiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmc6IGFyZ3Yuc2lsZW50LFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgaWYgKHByb2dyZXNzVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICh3cm90ZVNpbGVudFByb2dyZXNzKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG4gIGlmIChzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0ICYmICghb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkgfHwgZXhpdENvZGUgIT09IDApKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/IG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dChyZXQuc3Rkb3V0KSA6IHJldC5zdGRvdXQpLnRyaW0oKTtcbiAgICBpZiAob3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgfVxuICBpZiAoYXJndi5zaWxlbnQgJiYgZXhpdENvZGUgPT09IDAgJiYgb3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSk7XG4gIH1cbiAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBleGl0Q29kZSwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gdHJ1ZSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQgJiYgIW9wdHMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxCdWZmZXJlZFJ1blJlc3VsdD4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgb3V0cHV0OiAnJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHJldHVybiB7XG4gICAgICBleGl0Q29kZTogcmV0LnN0YXR1cyA/PyAxLFxuICAgICAgb3V0cHV0OiByZXQuc3Rkb3V0LFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogeyBwcmludGFibGU6IHN0cmluZzsgcnVubmFibGU6IHN0cmluZyB9IHtcbiAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHMgcmVxdWlyaW5nXG4gIC8vIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCkuXG4gIGNvbnN0IHByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAvUFJJU01BIGdlbmVyYXRlKD8hXFxzKy0tbm8taGludHMpKD89XFxzfCQpL2d1LFxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1BSSVNNQSBnZW5lcmF0ZScgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiBydW4gJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1bikgcnVuYC5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ3lhcm4gcnVuICcpO1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gcnVuIGJ1biBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IG5ld1NjcmlwdFxuICAgIC8vIEtlZXAgUGxheXdyaWdodCBhcyBhIHBhY2thZ2UtbWFuYWdlciBjb21tYW5kIGluc3RlYWQgb2YgcmVzb2x2aW5nIGl0IHRocm91Z2ggbm9kZV9tb2R1bGVzLy5iaW4uXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGNvbmZpZ3VyZUNvbG9yRW52KG5ld0Vudiwgb3B0cy5wcmVzZXJ2ZUNvbG9yKTtcbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGNoaWxkLXByb2Nlc3MgY29sb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB3Yi1tYW5hZ2VkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBjaGlsZC1wcm9jZXNzIGVudmlyb25tZW50IHRvIG11dGF0ZS5cbiAqIEBwYXJhbSBwcmVzZXJ2ZUNvbG9yIFdoZXRoZXIgd2Igc2hvdWxkIHByZXNlcnZlIGNvbG9ycyBmb3Igb3V0cHV0IHRoYXQgaXQgY2FwdHVyZXMgYW5kIHJlcHJpbnRzIHRvIGFuIGludGVyYWN0aXZlIFRUWS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUNvbG9yRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgcHJlc2VydmVDb2xvcj86IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGVudi5OT19DT0xPUiAhPT0gdW5kZWZpbmVkIHx8IHByZXNlcnZlQ29sb3IgPT09IGZhbHNlKSB7XG4gICAgLy8gTk9fQ09MT1IgYW5kIHByZXNlcnZlQ29sb3I9ZmFsc2UgYXJlIGV4cGxpY2l0IG5vLWNvbG9yIGNob2ljZXMsIHNvIGluaGVyaXRlZCBGT1JDRV9DT0xPUiBtdXN0IG5vdCBsZWFrIHRocm91Z2guXG4gICAgZGVsZXRlIGVudi5GT1JDRV9DT0xPUjtcbiAgfSBlbHNlIGlmIChwcmVzZXJ2ZUNvbG9yICYmIHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIH1cbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHNpbGVudD86IGJvb2xlYW4gfSkuc2lsZW50ID09PSB0cnVlICYmXG4gICAgZ2V0T3B0aW9uVmFsdWUoYXJndiwgJ3F1aWV0LWVudicpID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgYXJncy5wdXNoKCctLXF1aWV0LWVudicpO1xuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYsIG5vcm1hbGl6ZVNjcmlwdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBGT1JDRV9LSUxMX0RFTEFZX01TID0gNTAwMDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2tpbGwtb3RoZXJzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGV4aXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdraWxsLW90aGVycy1vbi1mYWlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGZhaWxzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHN1Y2Nlc3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmluZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gY3JpdGVyaWEnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnYWxsJywgJ2ZpcnN0J10sXG4gICAgZGVmYXVsdDogJ2FsbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZHMgdG8gcnVuIGNvbmN1cnJlbnRseScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBSdW5Db25jdXJyZW50bHlPcHRpb25zIHtcbiAgY29tbWFuZHM6IHN0cmluZ1tdO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBraWxsT3RoZXJzOiBib29sZWFuO1xuICBraWxsT3RoZXJzT25GYWlsOiBib29sZWFuO1xuICBzdWNjZXNzOiAnYWxsJyB8ICdmaXJzdCc7XG4gIGNpPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbnRseUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjb25jdXJyZW50bHkgPGNvbW1hbmRzLi4uPicsXG4gIGRlc2NyaWJlOiAnUnVuIGNvbW1hbmRzIGNvbmN1cnJlbnRseScsXG4gIGJ1aWxkZXI6IHsgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsIC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gKGFyZ3YuY29tbWFuZHMgPz8gW10pLm1hcChTdHJpbmcpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29tbWFuZHMgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkNvbmN1cnJlbnRseSh7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBraWxsT3RoZXJzOiBhcmd2LmtpbGxPdGhlcnMgPz8gZmFsc2UsXG4gICAgICAgIGtpbGxPdGhlcnNPbkZhaWw6IGFyZ3Yua2lsbE90aGVyc09uRmFpbCA/PyBmYWxzZSxcbiAgICAgICAgc3VjY2VzczogYXJndi5zdWNjZXNzLFxuICAgICAgICBjaTogdHlwZW9mIGFyZ3YuY2kgPT09ICdib29sZWFuJyA/IGFyZ3YuY2kgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db25jdXJyZW50bHkob3B0aW9uczogUnVuQ29uY3VycmVudGx5T3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+XG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3bihub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgb3B0aW9ucy5wcm9qZWN0KS5ydW5uYWJsZSwge1xuICAgICAgY3dkOiBvcHRpb25zLnByb2plY3QuZGlyUGF0aCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYob3B0aW9ucy5wcm9qZWN0LmVudiwgeyBjaTogb3B0aW9ucy5jaSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZm9yY2VLaWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbTxudW1iZXIgfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiBjaGlsZHJlbi5sZW5ndGggfSk7XG4gIGNvbnN0IHdhaXRGb3JFeGl0UHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNldHRsZSA9IChleGl0Q29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZXhpdENvZGU7XG4gICAgICAgIGZpcnN0UmVzdWx0ID8/PSBleGl0Q29kZTtcblxuICAgICAgICBpZiAoIXN0b3BwaW5nICYmIHNob3VsZFN0b3BPdGhlcnMoZXhpdENvZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcFJlc3VsdCA9IGV4aXRDb2RlO1xuICAgICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCAnU0lHVEVSTScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgICAgIHNldHRsZSgxKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgc2V0dGxlKGdldEV4aXRDb2RlKGNvZGUgPz8gdW5kZWZpbmVkLCBzaWduYWwgPz8gdW5kZWZpbmVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBzaWduYWwpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lnaW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR0lOVCcpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWd0ZXJtID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1RFUk0nKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lncXVpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdRVUlUJyk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgcHJvY2Vzcy5vbignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3JFeGl0UHJvbWlzZXMpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGZvcmNlS2lsbFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUodW5kZWZpbmVkLCBpbnRlcnJ1cHRlZFNpZ25hbCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnKSB7XG4gICAgcmV0dXJuIGZpcnN0UmVzdWx0ID8/IDE7XG4gIH1cbiAgaWYgKHN0b3BSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdG9wUmVzdWx0O1xuICB9XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpdENvZGUoY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG4gIGlmIChzaWduYWwgJiYgc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSB7XG4gICAgcmV0dXJuIDEyOCArIGNvbnN0YW50cy5zaWduYWxzW3NpZ25hbF07XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3BPdGhlcnMoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFBpY2s8UnVuQ29uY3VycmVudGx5T3B0aW9ucywgJ2tpbGxPdGhlcnMnIHwgJ2tpbGxPdGhlcnNPbkZhaWwnIHwgJ3N1Y2Nlc3MnPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcgfHwgb3B0aW9ucy5raWxsT3RoZXJzIHx8IChvcHRpb25zLmtpbGxPdGhlcnNPbkZhaWwgJiYgZXhpdENvZGUgIT09IDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmb3JjZUtpbGxQaWRzID0gc2lnbmFsUGlkcyh0b0NoaWxkUGlkcyhjaGlsZHJlbiksIHNpZ25hbCk7XG4gIGlmIChmb3JjZUtpbGxQaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmIChhd2FpdCB3YWl0Rm9yRm9yY2VLaWxsKGZvcmNlS2lsbFBpZHMpKSB7XG4gICAgc2lnbmFsUGlkcyhmb3JjZUtpbGxQaWRzLCAnU0lHS0lMTCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRQaWRzKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdKTogbnVtYmVyW10ge1xuICByZXR1cm4gY2hpbGRyZW4uZmxhdE1hcCgoY2hpbGQpID0+IChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCA/IFtdIDogW2NoaWxkLnBpZF0pKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsUGlkcyhwaWRzOiByZWFkb25seSBudW1iZXJbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IG51bWJlcltdIHtcbiAgY29uc3Qgc2lnbmFsZWRQaWRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBpZCBvZiBwaWRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgha2lsbFByb2Nlc3NHcm91cChwaWQsIHNpZ25hbCkpIGNvbnRpbnVlO1xuXG4gICAgICBzaWduYWxlZFBpZHMucHVzaChwaWQpO1xuICAgICAgdHJlZUtpbGwocGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmFsZWRQaWRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRm9yY2VLaWxsKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEZPUkNFX0tJTExfREVMQVlfTVM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocGlkcy5ldmVyeShpc1Byb2Nlc3NHcm91cEdvbmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBzbGVlcChNYXRoLm1pbigxMDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1Byb2Nlc3NHcm91cEdvbmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgMCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZykpLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWV9PSR7c2hlbGxFc2NhcGVBcmd1bWVudCh2YWx1ZSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li86PSxAJSstXSskL3UudGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlQWxsKFwiJ1wiLCBgJ1wiJ1wiJ2ApfSdgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuL3NoZWxsLmpzJztcblxuY29uc3Qgd3JhbmdsZXJDb25maWdGaWxlTmFtZXMgPSBbJ3dyYW5nbGVyLmpzb25jJywgJ3dyYW5nbGVyLmpzb24nLCAnd3JhbmdsZXIudG9tbCddO1xuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBnZW5lcmF0aW5nIGEgLmRldi52YXJzIGZpbGUgKHZpYSBgd2IgZ2VuLWRldi12YXJzYCkgc28gdGhhdFxuICogYHdyYW5nbGVyIGRldmAgY2FuIHNlZSB0aGUgd2ItbWFuYWdlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3Y6IFNjcmlwdEFyZ3YsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnd2InLCAnZ2VuLWRldi12YXJzJywgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLCBvdXRwdXRQYXRoXSk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBgd3JhbmdsZXIgZGV2YC1zdHlsZSBjb21tYW5kLiBgZW52IC11IENMT1VERkxBUkVfRU5WYCBtYWtlcyB3cmFuZ2xlciBzZXJ2ZSB0aGUgdG9wLWxldmVsXG4gKiAobm9uLWRlcGxveSkgY29uZmlnLiB3cmFuZ2xlciAobGlrZSB2aW5leHQpIHJlcXVpcmVzIHJlYWwgTm9kZS5qcyDigJQgYGJ1biBydW5gIHJlc3BlY3RzIHRoZSBiaW4nc1xuICogbm9kZSBzaGViYW5nLCBhbmQgd2IgbmV2ZXIgY29tcG9zZXMgYC0tYnVuYCAod2hvc2Ugbm9kZS0+YnVuIFBBVEggc2hpbSBicmVha3MgYm90aCB0b29scykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChhcmdzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGVudiAtdSBDTE9VREZMQVJFX0VOViBZQVJOIHdyYW5nbGVyICR7YXJnc31gLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGNvbW1hbmQgYXBwbHlpbmcgd3JhbmdsZXItbmF0aXZlIEQxIG1pZ3JhdGlvbnMgdG8gdGhlIGxvY2FsIGRhdGFiYXNlLCBvciB1bmRlZmluZWRcbiAqIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBEMSBkYXRhYmFzZSBvciBubyB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyBkaXJlY3RvcnkuXG4gKiBDST10cnVlIHN1cHByZXNzZXMgd3JhbmdsZXIncyBpbnRlcmFjdGl2ZSBjb25maXJtYXRpb24gcHJvbXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnZW52Jz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgaWYgKCFkYXRhYmFzZU5hbWUgfHwgIWZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3QpKSByZXR1cm47XG5cbiAgcmV0dXJuIGBDST10cnVlIFlBUk4gd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseSAke2RhdGFiYXNlTmFtZX0gLS1sb2NhbCAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImA7XG59XG5cbi8qKlxuICogUHJlZml4IHRoZSBnaXZlbiBzY3JpcHQgd2l0aCBjb21tYW5kcyBleHBvcnRpbmcgREFUQUJBU0VfVVJMIHBvaW50aW5nIHRvIHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUsXG4gKiBzbyB0aGF0IGRyaXp6bGUta2l0IGFuZCBzZWVkIHNjcmlwdHMgY2FuIG9wZXJhdGUgb24gdGhlIHNhbWUgZGF0YWJhc2UgYXMgdGhlIGFwcC5cbiAqIERvIG5vdGhpbmcgaWYgdGhlIHByb2plY3QgaGFzIG5vIEQxIGRhdGFiYXNlIGluIGl0cyB3cmFuZ2xlciBjb25maWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdlbnYnPiwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgaWYgKCFkYXRhYmFzZU5hbWUpIHJldHVybiBzY3JpcHQ7XG5cbiAgLy8gRXhjbHVkaW5nIG1pbmlmbGFyZSdzIG1ldGFkYXRhLnNxbGl0ZSwgd2hpY2ggbGl2ZXMgbmV4dCB0byB0aGUgaGFzaC1uYW1lZCBkYXRhYmFzZSBmaWxlLlxuICAvLyBBbiB1bm1hdGNoZWQgZ2xvYiBjYW5ub3QgaGFwcGVuIGhlcmU6IHRoZSBzY3JpcHQgcnVucyB1bmRlciAvYmluL3NoICh2aWEgTm9kZSdzIGBzaGVsbDogdHJ1ZWApLFxuICAvLyBhbmQgdGhlIHByZWNlZGluZyBtYXRlcmlhbGl6YXRpb24gY29tbWFuZCBndWFyYW50ZWVzIHRoZSBTUUxpdGUgZmlsZSBleGlzdHMuXG4gIC8vIFByb2plY3RzIHdpdGggbXVsdGlwbGUgRDEgZGF0YWJhc2VzIGFyZSBub3Qgc3VwcG9ydGVkOiB0aGUgaGFzaC1uYW1lZCBmaWxlcyBjYW5ub3QgYmVcbiAgLy8gZGlzdGluZ3Vpc2hlZCBjaGVhcGx5IChtYXRlcmlhbGl6YXRpb24gZG9lcyBub3QgZXZlbiB1cGRhdGUgdGhlIHRhcmdldCBmaWxlJ3MgbXRpbWUpLlxuICAvLyBUaGUgc3RhdGUgZGlyZWN0b3J5IG11c3QgYmUgYWJzb2x1dGUgYmVjYXVzZSB0aGUgd3JhcHBlZCBzY3JpcHQgbWF5IGBjZGAgdG8gdGhlIG1vbm9yZXBvIHJvb3QuXG4gIGNvbnN0IHN0YXRlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KSk7XG4gIGNvbnN0IGV4cG9ydENvbW1hbmQgPSBgZXhwb3J0IERBVEFCQVNFX1VSTD1cImZpbGU6JChscyBcIiR7c3RhdGVEaXJQYXRofVwiL3YzL2QxL21pbmlmbGFyZS1EMURhdGFiYXNlT2JqZWN0Lyouc3FsaXRlIHwgZ3JlcCAtdiBtZXRhZGF0YSB8IGhlYWQgLTEpXCJgO1xuICByZXR1cm4gYCR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGRhdGFiYXNlTmFtZSl9ICYmICR7ZXhwb3J0Q29tbWFuZH0gJiYgJHtzY3JpcHR9YDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IEQxIGRhdGFiYXNlIGRlY2xhcmVkIGluIHRoZSB3cmFuZ2xlciBjb25maWcgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcblxuICAvLyBDb3ZlciBKU09OKEMpIChgXCJkYXRhYmFzZV9uYW1lXCI6IFwiLi4uXCJgKSBhbmQgVE9NTCwgaW5jbHVkaW5nIGl0cyBpbmxpbmUtdGFibGUgZm9ybVxuICAvLyAoYGQxX2RhdGFiYXNlcyA9IFt7IC4uLiwgZGF0YWJhc2VfbmFtZSA9IFwiLi4uXCIgfV1gKSwgd2l0aG91dCBmdWxsIHBhcnNlcnMuXG4gIC8vIENvbW1lbnRlZC1vdXQgbGluZXMgYXJlIHNraXBwZWQgc28gdGhhdCB0aGV5IGNhbm5vdCBzaGFkb3cgdGhlIGFjdGl2ZSBkYXRhYmFzZSBuYW1lLFxuICAvLyBhbmQgdGhlIGtleSBtdXN0IGZvbGxvdyBhIGxpbmUgc3RhcnQsIGB7YCBvciBgLGAgc28gdGhhdCBwcm9zZSBtZW50aW9uaW5nIGl0IGNhbm5vdCBtYXRjaC5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmICgvXlxccyooPzojfFxcL1xcLykvdS50ZXN0KGxpbmUpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58Wyx7XSlcXHMqW1wiJ10/ZGF0YWJhc2VfbmFtZVtcIiddP1xccypbOj1dXFxzKltcIiddKFteXCInXSspW1wiJ10vdS5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gVGVzdHMgbWF5IHBhc3MgcGFydGlhbCBQcm9qZWN0IG9iamVjdHMgd2l0aG91dCBkaXJQYXRoLlxuICBpZiAoIXByb2plY3QuZGlyUGF0aCkgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2Ygd3JhbmdsZXJDb25maWdGaWxlTmFtZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIG9mIHRoZSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyBkaXJlY3RvcnkgKGBtaWdyYXRpb25zX2RpcmAgaW4gdGhlIHdyYW5nbGVyXG4gKiBjb25maWcsIGRlZmF1bHRpbmcgdG8gYG1pZ3JhdGlvbnNgKSBpZiBpdCBleGlzdHMgb24gZGlzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcblxuICBsZXQgbWlncmF0aW9uc0RpciA9ICdtaWdyYXRpb25zJztcbiAgZm9yIChjb25zdCBsaW5lIG9mIGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmICgvXlxccyooPzojfFxcL1xcLykvdS50ZXN0KGxpbmUpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58Wyx7XSlcXHMqW1wiJ10/bWlncmF0aW9uc19kaXJbXCInXT9cXHMqWzo9XVxccypbXCInXShbXlwiJ10rKVtcIiddL3UuZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG1pZ3JhdGlvbnNEaXIgPSBtYXRjaFsxXSBhcyBzdHJpbmc7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgY29uc3QgbWlncmF0aW9uc0RpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBtaWdyYXRpb25zRGlyKTtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMobWlncmF0aW9uc0RpclBhdGgpID8gbWlncmF0aW9uc0RpclBhdGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIG1hdGVyaWFsaXppbmcgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqIEEgbm8tb3AgcXVlcnkgZm9yY2VzIG1pbmlmbGFyZSB0byBjcmVhdGUgdGhlIFNRTGl0ZSBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LlxuICogT25seSBzdGRvdXQgaXMgc3VwcHJlc3NlZDsgd3JhbmdsZXIgcmVwb3J0cyBlcnJvcnMgb24gc3RkZXJyLCB3aGljaCBtdXN0IHN0YXkgdmlzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPiwgZGF0YWJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFlBUk4gd3JhbmdsZXIgZDEgZXhlY3V0ZSAke2RhdGFiYXNlTmFtZX0gLS1sb2NhbCAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cIiAtLWNvbW1hbmQgXCJTRUxFQ1QgMVwiID4gL2Rldi9udWxsYDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGxvY2FsIHdyYW5nbGVyL21pbmlmbGFyZSBzdGF0ZSBkaXJlY3RvcnkuXG4gKiBEZXZlbG9wbWVudCBmb2xsb3dzIHdyYW5nbGVyJ3MgZGVmYXVsdCBkaXJlY3Rvcnkgc28gdGhhdCBwbGFpbiBgd3JhbmdsZXIgZGV2YCAvIGB2aW5leHQgZGV2YFxuICogKHdpdGhvdXQgYSBwZXJzaXN0LXBhdGggb3ZlcnJpZGUpIHNoYXJlcyB0aGUgc2FtZSBkYXRhYmFzZSBhcyB3Yi1tYW5hZ2VkIGRiIGNvbW1hbmRzLlxuICogT3RoZXIgZW52aXJvbm1lbnRzIChlLmcuIHRlc3QpIGdldCB0aGVpciBvd24gZGlyZWN0b3J5IHNvIHRoYXQgdGhleSBjYW4gYmUgcmVzZXRcbiAqIHdpdGhvdXQgZGVzdHJveWluZyBkZXZlbG9wbWVudCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB7XG4gIC8vIERlc3RydWN0aXZlIHRlc3QgcmVzZXRzIGFyZSBnYXRlZCBvbiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpLCB3aGljaCBhY2NlcHRzXG4gIC8vIGVpdGhlciBXQl9FTlYgb3IgTUlTRV9FTlY7IHJlc29sdmUgdG8gdGhlIHRlc3QgZGlyZWN0b3J5IHdoZW5ldmVyIGVpdGhlciBzYXlzICd0ZXN0JyBzb1xuICAvLyB0aGF0IHN1Y2ggcmVzZXRzIGNhbiBuZXZlciB0YXJnZXQgdGhlIGRldmVsb3BtZW50IHN0YXRlLlxuICBjb25zdCB3YkVudiA9IFtwcm9qZWN0LmVudi5XQl9FTlYsIHByb2plY3QuZW52Lk1JU0VfRU5WXS5pbmNsdWRlcygndGVzdCcpXG4gICAgPyAndGVzdCdcbiAgICA6IHByb2plY3QuZW52LldCX0VOViB8fCBwcm9qZWN0LmVudi5NSVNFX0VOVjtcbiAgcmV0dXJuICF3YkVudiB8fCB3YkVudiA9PT0gJ2RldmVsb3BtZW50JyA/ICcud3JhbmdsZXIvc3RhdGUnIDogYC53cmFuZ2xlci9zdGF0ZS0ke3diRW52fWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsIGlzUHJvamVjdEVudmlyb25tZW50LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgYnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kLCBnZXREMURhdGFiYXNlTmFtZSwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdjbGVhbnVwLWxpdGVzdHJlYW0nKTtcbiAgICBjb25zdCB3YWxDaGVja3BvaW50Q29tbWFuZCA9IGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXSAmJiBjb21tYW5kIC12IHNxbGl0ZTMgPi9kZXYvbnVsbDsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IHNxbGl0ZTMgXCIke2RiUGF0aH1cIjsgZmlgO1xuICAgIHJldHVybiBgJHt3YWxDaGVja3BvaW50Q29tbWFuZH07IHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSo7IHJtIC1SZiBcIiR7cGF0aC5kaXJuYW1lKGRiUGF0aCl9Ly4ke3BhdGguYmFzZW5hbWUoZGJQYXRoKX1cIiogfHwgdHJ1ZWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBkMURhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICAgIGlmIChkMURhdGFiYXNlTmFtZSkge1xuICAgICAgLy8gUmVtb3ZlIG9ubHkgdGhlIEQxIHN1YnRyZWUgc28gdGhhdCBvdGhlciBsb2NhbGx5LXBlcnNpc3RlZCBiaW5kaW5ncyAoS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpIHN1cnZpdmUsXG4gICAgICAvLyB0aGVuIHJlLW1hdGVyaWFsaXplIHRoZSBEMSBTUUxpdGUgZmlsZS4gSXRzIHBhdGggaXMgZGV0ZXJtaW5pc3RpYywgc28gYSBEQVRBQkFTRV9VUkwgZXhwb3J0ZWRcbiAgICAgIC8vIGJlZm9yZSB0aGUgcmVtb3ZhbCBzdGF5cyB2YWxpZC5cbiAgICAgIHJldHVybiBgcm0gLVJmIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9L3YzL2QxXCIgJiYgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZDFEYXRhYmFzZU5hbWUpfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgICB9XG5cbiAgICBjb25zdCByZW1vdmVDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKCFyZW1vdmVDb21tYW5kKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiByZXNldCBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBmaWxlOiBEQVRBQkFTRV9VUkwgaXMgc2V0LicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3JlbW92ZUNvbW1hbmR9ICYmICR7dGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKX1gO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWVkQ29tbWFuZCA9IHRoaXMuc2VlZChwcm9qZWN0KTtcbiAgICBjb25zdCBtaWdyYXRlQ29tbWFuZCA9IHRoaXMuZGVwbG95KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICByZXR1cm4gc2VlZENvbW1hbmQgPT09ICd0cnVlJyA/IG1pZ3JhdGVDb21tYW5kIDogYCR7bWlncmF0ZUNvbW1hbmR9ICYmICR7c2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIG1pZ3JhdGVGb3JTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiAoYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCkgfHwgZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNldChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgZGVwbG95KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YC50cmltKCkpO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ2RlcGxveS1mb3JjZScpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJGYW1pbHlDb21tYW5kKGRiUGF0aCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gVGhlIGVudmlyb25tZW50IGFzc2lnbm1lbnQgbXVzdCBnbyB0aHJvdWdoIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQ6IHByZWZpeGluZyBpdHNcbiAgICAvLyBwb3NzaWJseS1wYXJlbnRoZXNpemVkIHJlc3VsdCB3aXRoIGBBTExPV19UT19TS0lQX1NFRUQ9MGAgd291bGQgYmUgYSBzaGVsbCBzeW50YXggZXJyb3IuXG4gICAgY29uc3QgbWlncmF0ZVdpdGhTZWVkQ29tbWFuZCA9IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgJ21pZ3JhdGUnLCAnQUxMT1dfVE9fU0tJUF9TRUVEPTAnKTtcbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgJHt0aGlzLmRlcGxveShwcm9qZWN0KX0gJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgJHtsaXRlc3RyZWFtQ29uZmlnT3B0aW9ufSAtbyBcIiR7ZGJQYXRofVwiIFwiJHtkYlBhdGh9XCIgJiYgbHMgLWFobCBcIiR7ZGJQYXRofVwiICYmICR7bWlncmF0ZVdpdGhTZWVkQ29tbWFuZH1gO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ2xpc3QtYmFja3VwcycpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSBcIiR7ZGJQYXRofVwiYDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nLCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAncmVzdG9yZScpO1xuICAgIHJldHVybiBgJHtidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgob3V0cHV0UGF0aCl9OyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAtbyBcIiR7b3V0cHV0UGF0aH1cIiBcIiR7ZGJQYXRofVwiYDtcbiAgfVxuXG4gIGdlbmVyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgY29uc3QgZGVmYXVsdFNlZWRQYXRoID0gcGF0aC5qb2luKCdkYicsICdzZWVkLnRzJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZGVmYXVsdFNlZWRQYXRoKSkpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGBCVU4gJHtkZWZhdWx0U2VlZFBhdGh9YCA6IGBCVU4gYnVpbGQtdHMgcnVuICR7ZGVmYXVsdFNlZWRQYXRofWA7XG4gICAgfVxuICAgIHJldHVybiAndHJ1ZSc7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YC50cmltKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3Q6IFByb2plY3QsIGFyZ3M6IHN0cmluZywgZW52aXJvbm1lbnRBc3NpZ25tZW50ID0gJycpOiBzdHJpbmcge1xuICBjb25zdCBjb21tYW5kID0gYCR7ZW52aXJvbm1lbnRBc3NpZ25tZW50ICYmIGAke2Vudmlyb25tZW50QXNzaWdubWVudH0gYH1ZQVJOIGRyaXp6bGUta2l0ICR7YXJnc31gO1xuICAvLyBBIGNhbGxlci1zdXBwbGllZCAtLWNvbmZpZyByZXNvbHZlcyBhZ2FpbnN0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwgc28gdGhlIGN3ZCBtdXN0IHN0YXkgdGhlcmUuXG4gIHJldHVybiBhcmdzLmluY2x1ZGVzKCctLWNvbmZpZycpID8gY29tbWFuZCA6IHdyYXBXaXRoRHJpenpsZUNvbmZpZ0Rpcihwcm9qZWN0LCBjb21tYW5kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoRHJpenpsZUNvbmZpZ0Rpcihwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgLy8gZHJpenpsZS1raXQgcmVzb2x2ZXMgcmVsYXRpdmUgcGF0aHMgaW4gaXRzIGNvbmZpZyBhZ2FpbnN0IHRoZSBjd2QsIHNvIHRoZSBjb21tYW5kIG11c3QgcnVuXG4gIC8vIGluIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBkcml6emxlLmNvbmZpZy4qIGV2ZW4gd2hlbiBtb25vcmVwbyBwYWNrYWdlcyBzaGFyZSBpdCBhdCB0aGUgcm9vdC5cbiAgcmV0dXJuIGNvbmZpZyAmJiBjb25maWcuZGlyUGF0aCAhPT0gcHJvamVjdC5kaXJQYXRoXG4gICAgPyBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIGNvbmZpZy5kaXJQYXRoXSl9ICYmICR7Y29tbWFuZH0pYFxuICAgIDogY29tbWFuZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGRyaXp6bGUta2l0IGlzIHRoZSBwcm9qZWN0J3MgRDEgbWlncmF0aW9uIG1lY2hhbmlzbS4gQSBkcml6emxlLW9ybSBkZXBlbmRlbmN5IGFsb25lIGlzXG4gKiBub3QgYSByZWxpYWJsZSBtYXJrZXI6IGEgV29ya2VyIG1heSB1c2UgRDEgb25seSBmb3IgY2FjaGluZyB3aGlsZSBpdHMgZHJpenpsZSBjb25maWcgdGFyZ2V0cyBhblxuICogdW5yZWxhdGVkIGRhdGFiYXNlIChlLmcuIFBvc3RncmVTUUwgdmlhIEh5cGVyZHJpdmUpLCBhbmQgcnVubmluZyBgZHJpenpsZS1raXQgbWlncmF0ZWAgYWdhaW5zdFxuICogdGhhdCBkYXRhYmFzZSBkdXJpbmcgYSBEMSBkZXBsb3kgd291bGQgYmUgd3JvbmcgKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk0MikuXG4gKiBTbyByZXF1aXJlIGFuIGV4cGxpY2l0IG1hcmtlcjogYSBkcml6emxlIGNvbmZpZyB3aG9zZSBkaWFsZWN0L2RyaXZlciB0YXJnZXRzIHNxbGl0ZSwgZDEtaHR0cCwgb3JcbiAqIGR1cmFibGUtc3FsaXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlc0RyaXp6bGVLaXRGb3JEMShwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIGlmICghcHJvamVjdC5oYXNEcml6emxlKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gc3RyaXBKc0NvbW1lbnRzKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGNvbmZpZy5maWxlTmFtZSksICd1dGY4JykpO1xuICAgIC8vIFNjYW4gb25seSB0aGUgZXhwb3J0ZWQgY29uZmlnJ3Mgb2JqZWN0IGxpdGVyYWw6IGRyaXp6bGUta2l0IGNvbnN1bWVzIHRoZSBkZWZhdWx0IGV4cG9ydCxcbiAgICAvLyBhbmQgbWF0Y2hpbmcgb3RoZXIgdGV4dCAoYW4gdW51c2VkIHNxbGl0ZS1zaGFwZWQgY29uc3RhbnQgYWJvdmUgdGhlIGV4cG9ydCwgb3IgbWFya2VyLWxpa2VcbiAgICAvLyBzdHJpbmcgY29udGVudCBpbiBzdGF0ZW1lbnRzIGFmdGVyIGl0KSB3b3VsZCBzZWxlY3QgdGhlIHdyb25nIG1pZ3JhdGlvbiBtZWNoYW5pc20uXG4gICAgLy8gUE9TSVRJT05TIChleHBvcnQgbWFya2VycywgZGVjbGFyYXRpb25zKSBhcmUgbG9jYXRlZCBvbiBhIHN0cmluZy1tYXNrZWQgdmlldyBvZiB0aGUgc2FtZVxuICAgIC8vIGxlbmd0aCwgc28gYGV4cG9ydCBkZWZhdWx0YCBpbnNpZGUgYSBzdHJpbmcgbGl0ZXJhbCBjYW5ub3QgbWlzbGVhZCB0aGUgc2VhcmNoLlxuICAgIGNvbnN0IG1hc2tlZENvbnRlbnQgPSBtYXNrU3RyaW5nQ29udGVudHMoY29udGVudCk7XG4gICAgY29uc3QgZXhwb3J0SW5kaWNlcyA9IFsnZXhwb3J0IGRlZmF1bHQnLCAnbW9kdWxlLmV4cG9ydHMnXVxuICAgICAgLm1hcCgobWFya2VyKSA9PiBtYXNrZWRDb250ZW50LmluZGV4T2YobWFya2VyKSlcbiAgICAgIC5maWx0ZXIoKGluZGV4KSA9PiBpbmRleCAhPT0gLTEpO1xuICAgIGNvbnN0IGV4cG9ydFN0YXJ0SW5kZXggPSBleHBvcnRJbmRpY2VzLmxlbmd0aCA+IDAgPyBNYXRoLm1pbiguLi5leHBvcnRJbmRpY2VzKSA6IDA7XG4gICAgY29uc3Qgb2JqZWN0U3BhbiA9IGV4dHJhY3RFeHBvcnRlZENvbmZpZ09iamVjdChjb250ZW50LCBtYXNrZWRDb250ZW50LCBleHBvcnRTdGFydEluZGV4KTtcbiAgICByZXR1cm4gb2JqZWN0U3BhbiAhPT0gdW5kZWZpbmVkICYmIGRlY2xhcmVzU3FsaXRlVGFyZ2V0KG9iamVjdFNwYW4pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgb2JqZWN0IGxpdGVyYWwgdGhlIGV4cG9ydCBhY3R1YWxseSBldmFsdWF0ZXMgdG86IGZvciBgZXhwb3J0IGRlZmF1bHQgey4uLn1gIG9yXG4gKiBgZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsuLi59KWAgdGhlIGZpcnN0IGJhbGFuY2VkIG9iamVjdCBhZnRlciB0aGUgbWFya2VyLCBhbmQgZm9yXG4gKiBgZXhwb3J0IGRlZmF1bHQgY29uZmlnO2AgdGhlIGluaXRpYWxpemVyIG9mIHRoYXQgaWRlbnRpZmllcidzIGRlY2xhcmF0aW9uIOKAlCBuZXZlciB0aGUgd2hvbGVcbiAqIGZpbGUsIHNpbmNlIGFuIHVucmVsYXRlZCBvYmplY3QgKGUuZy4gYW4gdW51c2VkIHNxbGl0ZS1zaGFwZWQgY29uc3RhbnQpIG11c3Qgbm90IGJlIHNlbGVjdGVkLlxuICogVW5kZWZpbmVkIHdoZW4gdGhlIGV4cHJlc3Npb24gY2Fubm90IGJlIHJlc29sdmVkOyB3YiBkZXBsb3kncyB1bm1hbmFnZWQtRDEgd2FybmluZyBjb3ZlcnMgdGhhdC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEV4cG9ydGVkQ29uZmlnT2JqZWN0KFxuICBjb250ZW50OiBzdHJpbmcsXG4gIG1hc2tlZENvbnRlbnQ6IHN0cmluZyxcbiAgZXhwb3J0U3RhcnRJbmRleDogbnVtYmVyXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBleHBvcnRlZEV4cHJlc3Npb24gPSBtYXNrZWRDb250ZW50XG4gICAgLnNsaWNlKGV4cG9ydFN0YXJ0SW5kZXgpXG4gICAgLnJlcGxhY2UoL14oPzpleHBvcnRcXHMrZGVmYXVsdHxtb2R1bGVcXC5leHBvcnRzXFxzKj0pXFxzKi8sICcnKTtcbiAgLy8gQW4gaWRlbnRpZmllciBleHBvcnQgbWF5IGNhcnJ5IGEgVHlwZVNjcmlwdCB0eXBlIHBvc3RmaXggKGBjb25maWcgc2F0aXNmaWVzIENvbmZpZztgIC9cbiAgLy8gYGNvbmZpZyBhcyBDb25maWc7YCk7IHRoZSBpZGVudGlmaWVyIGlzIHJlY29nbml6ZWQgRklSU1Qgc28gYSBwb3N0Zml4IGNvbnRhaW5pbmcgYSBUWVBFXG4gIC8vIGxpdGVyYWwgKGBzYXRpc2ZpZXMgeyBkaWFsZWN0OiAnc3FsaXRlJyB8IC4uLiB9YCkgaXMgbmV2ZXIgbWlzdGFrZW4gZm9yIHRoZSBydW50aW1lIGNvbmZpZy5cbiAgY29uc3QgaWRlbnRpZmllck1hdGNoID0gL14oW0EtWmEtel8kXVtcXHckXSopXFxzKig/OnNhdGlzZmllc1xcYnxhc1xcYnw7fFxcbnwkKS8uZXhlYyhleHBvcnRlZEV4cHJlc3Npb24pO1xuICBpZiAoIWlkZW50aWZpZXJNYXRjaCkge1xuICAgIGNvbnN0IGJyYWNlT2Zmc2V0ID0gbWFza2VkQ29udGVudC5zbGljZShleHBvcnRTdGFydEluZGV4KS5pbmRleE9mKCd7Jyk7XG4gICAgaWYgKGJyYWNlT2Zmc2V0ID09PSAtMSkgcmV0dXJuO1xuICAgIHJldHVybiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50LnNsaWNlKGV4cG9ydFN0YXJ0SW5kZXggKyBicmFjZU9mZnNldCkpO1xuICB9XG5cbiAgLy8gYCRgIGlzIGxlZ2FsIGluIGlkZW50aWZpZXJzIGJ1dCBhIHJlZ2V4IGFuY2hvciwgc28gaXQgbXVzdCBiZSBlc2NhcGVkIGJlZm9yZSBpbnRlcnBvbGF0aW9uO1xuICAvLyBgKD8hW1xcdyRdKWAgKG5vdCBgXFxiYCkgZW5kcyB0aGUgbWF0Y2ggYmVjYXVzZSBgXFxiYCBuZXZlciBmaXJlcyBhZnRlciBhIHRyYWlsaW5nIGAkYC5cbiAgY29uc3QgZXNjYXBlZElkZW50aWZpZXIgPSBpZGVudGlmaWVyTWF0Y2hbMV0hLnJlcGxhY2VBbGwoJyQnLCBTdHJpbmcucmF3YFxcJGApO1xuICBjb25zdCBkZWNsYXJhdGlvbkVuZEluZGV4ID0gZmluZE1vZHVsZVNjb3BlRGVjbGFyYXRpb25FbmQobWFza2VkQ29udGVudCwgZXNjYXBlZElkZW50aWZpZXIpO1xuICBpZiAoZGVjbGFyYXRpb25FbmRJbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIC8vIFRoZSBpbml0aWFsaXplciBtdXN0IGJlbG9uZyB0byBUSElTIGRlY2xhcmF0aW9uIChhIHR5cGUgYW5ub3RhdGlvbiBtYXkgcHJlY2VkZSB0aGUgYD1gKTsgYW5cbiAgLy8gdW5pbml0aWFsaXplZCBgbGV0IGNvbmZpZztgIHN0YXlzIHVucmVzb2x2ZWQgaW5zdGVhZCBvZiBncmFiYmluZyBhIGxhdGVyIHN0YXRlbWVudCdzIGA9YC5cbiAgY29uc3QgYXNzaWdubWVudE1hdGNoID0gL15cXHMqKD86OltePTtcXG5dKik/PS8uZXhlYyhtYXNrZWRDb250ZW50LnNsaWNlKGRlY2xhcmF0aW9uRW5kSW5kZXgpKTtcbiAgaWYgKCFhc3NpZ25tZW50TWF0Y2gpIHJldHVybjtcbiAgcmV0dXJuIGV4dHJhY3RGaXJzdEJhbGFuY2VkT2JqZWN0KGNvbnRlbnQuc2xpY2UoZGVjbGFyYXRpb25FbmRJbmRleCArIGFzc2lnbm1lbnRNYXRjaFswXS5sZW5ndGgpKTtcbn1cblxuLyoqXG4gKiBUaGUgZW5kIGluZGV4IG9mIHRoZSBpZGVudGlmaWVyJ3MgZGVjbGFyYXRpb24gYXQgYnJhY2UgZGVwdGggWkVSTyAobW9kdWxlIHNjb3BlKTogYSBzYW1lLW5hbWVkXG4gKiBkZWNsYXJhdGlvbiBpbnNpZGUgYSBmdW5jdGlvbiBib2R5IG11c3Qgbm90IHNoYWRvdyB0aGUgYmluZGluZyB0aGUgZXhwb3J0IHJlZmVyZW5jZXMsIGFuZFxuICogaW5kZW50YXRpb24gaXMgbm8gc2NvcGUgc2lnbmFsIOKAlCBkZXB0aCBvdmVyIHRoZSBzdHJpbmctbWFza2VkIGNvbnRlbnQgaXMuXG4gKi9cbmZ1bmN0aW9uIGZpbmRNb2R1bGVTY29wZURlY2xhcmF0aW9uRW5kKG1hc2tlZENvbnRlbnQ6IHN0cmluZywgZXNjYXBlZElkZW50aWZpZXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIFN0cmluZy5yYXdgKD88IVtcXHckXSkoPzpleHBvcnRcXHMrKT8oPzpjb25zdHxsZXR8dmFyKVxccyske2VzY2FwZWRJZGVudGlmaWVyfSg/IVtcXHckXSlgLFxuICAgICdnJ1xuICApO1xuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgc2NhbkluZGV4ID0gMDtcbiAgZm9yIChsZXQgbWF0Y2ggPSBkZWNsYXJhdGlvblJlZ2V4LmV4ZWMobWFza2VkQ29udGVudCk7IG1hdGNoOyBtYXRjaCA9IGRlY2xhcmF0aW9uUmVnZXguZXhlYyhtYXNrZWRDb250ZW50KSkge1xuICAgIGZvciAoOyBzY2FuSW5kZXggPCBtYXRjaC5pbmRleDsgc2NhbkluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBtYXNrZWRDb250ZW50W3NjYW5JbmRleF07XG4gICAgICBpZiAoY2hhciA9PT0gJ3snKSBkZXB0aCsrO1xuICAgICAgZWxzZSBpZiAoY2hhciA9PT0gJ30nKSBkZXB0aC0tO1xuICAgIH1cbiAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogUmVwbGFjZSB0aGUgQ09OVEVOVFMgb2Ygc3RyaW5nIGxpdGVyYWxzIHdpdGggc3BhY2VzIChzYW1lIGxlbmd0aCwgbmV3bGluZXMga2VwdCksIHNvIHBvc2l0aW9uXG4gKiBzZWFyY2hlcyBvdmVyIHRoZSByZXN1bHQgY2Fubm90IG1hdGNoIHRleHQgaW5zaWRlIHN0cmluZ3Mgd2hpbGUgYWxsIGluZGV4ZXMgc3RpbGwgbWFwIDE6MSB0b1xuICogdGhlIG9yaWdpbmFsIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIG1hc2tTdHJpbmdDb250ZW50cyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBzdHJpbmdEZWxpbWl0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoc3RyaW5nRGVsaW1pdGVyKSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIHJlc3VsdCArPSAnICAnO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkge1xuICAgICAgICBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBjaGFyID09PSAnXFxuJyA/ICdcXG4nIDogJyAnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykgc3RyaW5nRGVsaW1pdGVyID0gY2hhcjtcbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFN0cmluZy1hd2FyZSBzY2FuIGZvciB0aGUgbWFya2VycyBpbmRpY2F0aW5nIHRoZSBjb25maWcgbWFuYWdlcyBhIChDbG91ZGZsYXJlIEQxIGNvbXBhdGlibGUpXG4gKiBTUUxpdGUgZGF0YWJhc2Ug4oCUIGEgYGRpYWxlY3Q6ICdzcWxpdGUnYCwgYGRyaXZlcjogJ2QxLWh0dHAnYCwgb3IgYGRyaXZlcjogJ2R1cmFibGUtc3FsaXRlJ2BcbiAqIFBST1BFUlRZIChwbGFpbiBvciBxdW90ZWQga2V5KS4gS2V5cyBhcmUgb25seSByZWNvZ25pemVkIGluIGNvZGUgcG9zaXRpb24sIHNvIG1hcmtlci1saWtlIHRleHRcbiAqIGVtYmVkZGVkIGluIHVucmVsYXRlZCBzdHJpbmcgdmFsdWVzIChlLmcuIGEgc2NoZW1hIHBhdGgpIGNhbm5vdCBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNTcWxpdGVUYXJnZXQoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5ncyhjb250ZW50KTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2Vucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0hO1xuICAgIGxldCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdmFsdWVUb2tlbkluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdjb2RlJykge1xuICAgICAgY29uc3QgbWF0Y2ggPSAvKD86XnxbXFxzeywoXSkoZGlhbGVjdHxkcml2ZXIpXFxzKjpcXHMqJC8uZXhlYyh0b2tlbi52YWx1ZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAga2V5ID0gbWF0Y2hbMV07XG4gICAgICAgIHZhbHVlVG9rZW5JbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnZGlhbGVjdCcgfHwgdG9rZW4udmFsdWUgPT09ICdkcml2ZXInKSB7XG4gICAgICAvLyBBIHF1b3RlZCBrZXk6IHRoZSBzdXJyb3VuZGluZyBjb2RlIHRva2VucyBtdXN0IGZvcm0gYSBwcm9wZXJ0eSBwb3NpdGlvbiAoYHtgL2AsYCBiZWZvcmUsXG4gICAgICAvLyBgOmAgYWZ0ZXIpLlxuICAgICAgY29uc3QgcHJldmlvdXNUb2tlbiA9IHRva2Vuc1tpbmRleCAtIDFdO1xuICAgICAgY29uc3QgbmV4dFRva2VuID0gdG9rZW5zW2luZGV4ICsgMV07XG4gICAgICBpZiAoXG4gICAgICAgIHByZXZpb3VzVG9rZW4/LnR5cGUgPT09ICdjb2RlJyAmJlxuICAgICAgICAvW3ssKF1cXHMqJC8udGVzdChwcmV2aW91c1Rva2VuLnZhbHVlKSAmJlxuICAgICAgICBuZXh0VG9rZW4/LnR5cGUgPT09ICdjb2RlJyAmJlxuICAgICAgICAvXlxccyo6XFxzKiQvLnRlc3QobmV4dFRva2VuLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGtleSA9IHRva2VuLnZhbHVlO1xuICAgICAgICB2YWx1ZVRva2VuSW5kZXggPSBpbmRleCArIDI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZVRva2VuSW5kZXggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBjb25zdCB2YWx1ZVRva2VuID0gdG9rZW5zW3ZhbHVlVG9rZW5JbmRleF07XG4gICAgaWYgKHZhbHVlVG9rZW4/LnR5cGUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICBpZiAoa2V5ID09PSAnZGlhbGVjdCcgJiYgdmFsdWVUb2tlbi52YWx1ZSA9PT0gJ3NxbGl0ZScpIHJldHVybiB0cnVlO1xuICAgIGlmIChrZXkgPT09ICdkcml2ZXInICYmICh2YWx1ZVRva2VuLnZhbHVlID09PSAnZDEtaHR0cCcgfHwgdmFsdWVUb2tlbi52YWx1ZSA9PT0gJ2R1cmFibGUtc3FsaXRlJykpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdCBpbnRvIGFsdGVybmF0aW5nIGNvZGUgYW5kIHN0cmluZy1saXRlcmFsLWNvbnRlbnQgdG9rZW5zIChxdW90ZXMgZXhjbHVkZWQpLiBUaGUgaW5wdXQgaXNcbiAqIGFscmVhZHkgY29tbWVudC1mcmVlIOKAlCB1c2VzRHJpenpsZUtpdEZvckQxIHJ1bnMgc3RyaXBKc0NvbW1lbnRzIGJlZm9yZSBhbnkgc2Nhbm5pbmcg4oCUIHNvXG4gKiBjb21tZW50IGRlbGltaXRlcnMgbmVlZCBubyBoYW5kbGluZyBoZXJlIChhIGNvbW1lbnRlZC1vdXQgYC8vIGRpYWxlY3Q6ICdzcWxpdGUnYCBjYW4gbmV2ZXJcbiAqIHJlYWNoIHRoaXMgdG9rZW5pemVyKS5cbiAqL1xuZnVuY3Rpb24gdG9rZW5pemVTdHJpbmdzKGNvbnRlbnQ6IHN0cmluZyk6IHsgdHlwZTogJ2NvZGUnIHwgJ3N0cmluZyc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgdG9rZW5zOiB7IHR5cGU6ICdjb2RlJyB8ICdzdHJpbmcnOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuICBsZXQgY29kZSA9ICcnO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykge1xuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAnY29kZScsIHZhbHVlOiBjb2RlIH0pO1xuICAgICAgY29kZSA9ICcnO1xuICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICBpbmRleCsrO1xuICAgICAgd2hpbGUgKGluZGV4IDwgY29udGVudC5sZW5ndGggJiYgY29udGVudFtpbmRleF0gIT09IGNoYXIpIHtcbiAgICAgICAgaWYgKGNvbnRlbnRbaW5kZXhdID09PSAnXFxcXCcpIGluZGV4Kys7XG4gICAgICAgIHZhbHVlICs9IGNvbnRlbnRbaW5kZXhdID8/ICcnO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAnc3RyaW5nJywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29kZSArPSBjaGFyO1xuICB9XG4gIHRva2Vucy5wdXNoKHsgdHlwZTogJ2NvZGUnLCB2YWx1ZTogY29kZSB9KTtcbiAgcmV0dXJuIHRva2Vucztcbn1cblxuLyoqIFRoZSBmaXJzdCBgeyAuLi4gfWAgc3BhbiAoc3RyaW5nLWF3YXJlIGJyYWNlIG1hdGNoaW5nKSwgb3IgdW5kZWZpbmVkIHdoZW4gbm9uZSBleGlzdHMuICovXG5mdW5jdGlvbiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdGFydEluZGV4ID0gY29udGVudC5pbmRleE9mKCd7Jyk7XG4gIGlmIChzdGFydEluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gIGxldCBkZXB0aCA9IDA7XG4gIGxldCBzdHJpbmdEZWxpbWl0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoc3RyaW5nRGVsaW1pdGVyKSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnKSBpbmRleCsrO1xuICAgICAgZWxzZSBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHN0cmluZ0RlbGltaXRlciA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgZWxzZSBpZiAoY2hhciA9PT0gJ3snKSBkZXB0aCsrO1xuICAgIGVsc2UgaWYgKGNoYXIgPT09ICd9JyAmJiAtLWRlcHRoID09PSAwKSByZXR1cm4gY29udGVudC5zbGljZShzdGFydEluZGV4LCBpbmRleCArIDEpO1xuICB9XG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYmxvY2sgYW5kIGxpbmUgY29tbWVudHMgc28gY29tbWVudGVkLW91dCBtYXJrZXJzIChlLmcuIGAvLyBkaWFsZWN0OiAnc3FsaXRlJ2AgaW4gYVxuICogUG9zdGdyZVNRTCBjb25maWcpIGNhbm5vdCBtaXNjbGFzc2lmeSB0aGUgY29uZmlnLiBUaGUgc2Nhbm5lciB0cmFja3Mgc3RyaW5nIHN0YXRlLCBzbyBgLy9gXG4gKiBpbnNpZGUgc3RyaW5nIGxpdGVyYWxzIChVUkxzIHN1Y2ggYXMgYGh0dHBzOi8vLi4uYCBpbiBjb25uZWN0aW9uIHN0cmluZ3MpIHN1cnZpdmVzIHdoaWxlXG4gKiBjb21tZW50cyBkaXJlY3RseSBhZnRlciBhIHN0cmluZyBsaXRlcmFsIGFyZSBzdGlsbCByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdHJpcEpzQ29tbWVudHMoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgY29uc3QgbmV4dENoYXIgPSBjb250ZW50W2luZGV4ICsgMV07XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICByZXN1bHQgKz0gY2hhciArIChuZXh0Q2hhciA/PyAnJyk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSB7XG4gICAgICAgIHN0cmluZ0RlbGltaXRlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykge1xuICAgICAgc3RyaW5nRGVsaW1pdGVyID0gY2hhcjtcbiAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSAnLycgJiYgbmV4dENoYXIgPT09ICcvJykge1xuICAgICAgd2hpbGUgKGluZGV4IDwgY29udGVudC5sZW5ndGggJiYgY29udGVudFtpbmRleF0gIT09ICdcXG4nKSBpbmRleCsrO1xuICAgICAgcmVzdWx0ICs9ICdcXG4nO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSAnLycgJiYgbmV4dENoYXIgPT09ICcqJykge1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmICEoY29udGVudFtpbmRleF0gPT09ICcqJyAmJiBjb250ZW50W2luZGV4ICsgMV0gPT09ICcvJykpIGluZGV4Kys7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc3VsdCArPSBjaGFyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0OiBQcm9qZWN0KTogeyBkaXJQYXRoOiBzdHJpbmc7IGZpbGVOYW1lOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbJ2RyaXp6bGUuY29uZmlnLnRzJywgJ2RyaXp6bGUuY29uZmlnLm10cycsICdkcml6emxlLmNvbmZpZy5qcycsICdkcml6emxlLmNvbmZpZy5tanMnXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIFtwcm9qZWN0LmRpclBhdGgsIHByb2plY3Qucm9vdERpclBhdGhdKSB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBjYW5kaWRhdGVzLmZpbmQoKGZpbGVOYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSkpKTtcbiAgICBpZiAoZmlsZU5hbWUpIHJldHVybiB7IGRpclBhdGgsIGZpbGVOYW1lIH07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kRm9yUGF0aChhYnNvbHV0ZVBhdGgpO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1mIFwiJHtkYlBhdGh9XCIgXCIke2RiUGF0aH0td2FsXCIgXCIke2RiUGF0aH0tc2htXCJgO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRGJQYXRoT3JFcnJvcihwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgd2IgZGIgJHtjb21tYW5kTmFtZX0gc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC5gKTtcbiAgfVxuICByZXR1cm4gZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoT3JFcnJvcihwcm9qZWN0LCBjb21tYW5kTmFtZSk7XG4gIHJldHVybiBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZ1BhdGgpIHJldHVybiBgLWNvbmZpZyBcIiR7Y29uZmlnUGF0aH1cImA7XG5cbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxDb25maWdQYXRoKSkgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIKSkgcmV0dXJuIGAtY29uZmlnICR7REVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIfWA7XG4gIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuL3dyYW5nbGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBXcmFuZ2xlckQxRGF0YWJhc2Uge1xuICBiaW5kaW5nPzogc3RyaW5nO1xuICBkYXRhYmFzZV9uYW1lPzogc3RyaW5nO1xuICBkYXRhYmFzZV9pZD86IHN0cmluZztcbiAgbWlncmF0aW9uc19kaXI/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfcGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBEMSBiaW5kaW5nIHVzZXMgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgdGhhdCBgd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseWBcbiAqIHdvdWxkIGFjdHVhbGx5IGRpc2NvdmVyOiBhbiBleHBsaWNpdCBgbWlncmF0aW9uc19wYXR0ZXJuYCBvcHRzIGluLCBvdGhlcndpc2UgdGhlIG1pZ3JhdGlvbnNcbiAqIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gZmxhdCBgKi5zcWxgIGZpbGVzICh3cmFuZ2xlcidzIGRlZmF1bHQgcGF0dGVybikuIEEgZHJpenpsZS1raXQgYG91dGBcbiAqIGRpcmVjdG9yeSB3aXRoIG5lc3RlZCBgPG5hbWU+L21pZ3JhdGlvbi5zcWxgIGZpbGVzIGFuZCBubyBwYXR0ZXJuIHdvdWxkIG1hdGNoIG5vdGhpbmcgYW5kXG4gKiBzaWxlbnRseSBhcHBseSB6ZXJvIG1pZ3JhdGlvbnMsIHNvIGl0IG11c3QgZmFsbCB0aHJvdWdoIHRvIHRoZSBkcml6emxlLWtpdCBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPiwgZGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSk6IGJvb2xlYW4ge1xuICAvLyBBbiBleHBsaWNpdCBwYXR0ZXJuIG9wdHMgaW50byB0aGUgd3JhbmdsZXItbmF0aXZlIG1lY2hhbmlzbSBldmVuIGJlZm9yZSB0aGUgZGlyZWN0b3J5XG4gIC8vIGV4aXN0czsgd3JhbmdsZXIgdGhlbiBmYWlscyBzYWZlbHkgd2l0aCBcIk5vIG1pZ3JhdGlvbnMgZm9sZGVyIGZvdW5kXCIgaW5zdGVhZCBvZiB3YlxuICAvLyBzaWxlbnRseSBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgbWlncmF0aW9uIGVuZ2luZS5cbiAgaWYgKGRhdGFiYXNlLm1pZ3JhdGlvbnNfcGF0dGVybikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGF0YWJhc2UubWlncmF0aW9uc19kaXIgPz8gJ21pZ3JhdGlvbnMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZnMucmVhZGRpclN5bmMobWlncmF0aW9uc0RpclBhdGgpLnNvbWUoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5lbmRzV2l0aCgnLnNxbCcpKTtcbn1cblxuY29uc3QgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMgPSBuZXcgU2V0KFsnYmluZGluZ3MnLCAnc2VuZF9lbWFpbCcsICdyYXRlbGltaXRzJ10pO1xuY29uc3QgUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUyA9IG5ldyBTZXQoWyd3YXNtX21vZHVsZXMnLCAndGV4dF9ibG9icycsICdkYXRhX2Jsb2JzJ10pO1xuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgYmluZGluZyBuYW1lIGRlY2xhcmVkIGluIHRoZSAoZW52aXJvbm1lbnQtcmVzb2x2ZWQpIGNvbmZpZyBzdWJ0cmVlOiBgYmluZGluZ2BcbiAqIHByb3BlcnRpZXMgYW55d2hlcmUgKEQxLCBLViwgUjIsIHNlcnZpY2VzLCBhc3NldHMsIHF1ZXVlcywgZXRjLiksIHRoZSBgbmFtZWAta2V5ZWQgYmluZGluZ3NcbiAqIChgZHVyYWJsZV9vYmplY3RzLmJpbmRpbmdzYCwgYGxvZ2Z3ZHIuYmluZGluZ3NgLCBgc2VuZF9lbWFpbGAsIGByYXRlbGltaXRzYCksIGFuZCB0aGVcbiAqIHJlY29yZC1rZXllZCBsZWdhY3kgbW9kdWxlIGJpbmRpbmdzIChgd2FzbV9tb2R1bGVzYCwgYHRleHRfYmxvYnNgLCBgZGF0YV9ibG9ic2ApLiBBIHNlY3JldFxuICogc2hhcmluZyBhIGJpbmRpbmcncyBuYW1lIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhhdCBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcgb24gZGVwbG95LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyh2YWx1ZTogdW5rbm93biwgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKSwgcGFyZW50S2V5ID0gJycpOiBTZXQ8c3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgY29sbGVjdEJpbmRpbmdOYW1lcyhpdGVtLCBuYW1lcywgcGFyZW50S2V5KTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbmFtZXM7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChrZXkgPT09ICdiaW5kaW5nJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbmFtZScgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyAmJiBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUy5oYXMocGFyZW50S2V5KSkge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMuaGFzKGtleSkgJiYgY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmluZGluZ05hbWUgb2YgT2JqZWN0LmtleXMoY2hpbGQpKSBuYW1lcy5hZGQoYmluZGluZ05hbWUpO1xuICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnZW52JyAmJiBrZXkgIT09ICd2YXJzJyAmJiBrZXkgIT09ICdtZXRhZGF0YScgJiYga2V5ICE9PSAnb3B0aW9ucycpIHtcbiAgICAgIC8vIE5lc3RlZCBgZW52YCBzdWJ0cmVlcyBiZWxvbmcgdG8gb3RoZXIgZW52aXJvbm1lbnRzOyBgdmFyc2AgdmFsdWVzLCBgdW5zYWZlLm1ldGFkYXRhYCxcbiAgICAgIC8vIGFuZCBgdW5zYWZlLmJpbmRpbmdzW10uZGV2Lm9wdGlvbnNgIGFyZSBhcmJpdHJhcnkgSlNPTiB3aG9zZSBwcm9wZXJ0aWVzIChlLmcuIGFcbiAgICAgIC8vIFwiYmluZGluZ1wiIGZpZWxkKSBhcmUgZGF0YSwgbm90IFdvcmtlciBiaW5kaW5ncy5cbiAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoY2hpbGQsIG5hbWVzLCBrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB7XG4gIC8qKiBUaGUgV29ya2VyIG5hbWUgZm9yIHRoZSBkZXBsb3kgZW52aXJvbm1lbnQgKHdyYW5nbGVyIGFwcGVuZHMgYC08ZW52PmAgd2hlbiB0aGUgZW52IHNlY3Rpb24gaGFzIG5vIG93biBuYW1lKS4gKi9cbiAgd29ya2VyTmFtZT86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB2YXJLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBlbnZpcm9ubWVudCdzIGB2YXJzYCB2YWx1ZXMgKG5lZWRlZCBmb3IgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIGNvdW50L3NpemUgbGltaXRzKS4gKi9cbiAgdmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTZWNyZXRzIGRlY2xhcmVkIGFzIHJlcXVpcmVkIHZpYSB3cmFuZ2xlcidzIGBzZWNyZXRzLnJlcXVpcmVkYCAodmFsaWRhdGVkIGF0IGRlcGxveSB0aW1lKS4gKi9cbiAgcmVxdWlyZWRTZWNyZXROYW1lczogc3RyaW5nW107XG4gIC8qKiBOYW1lcyBvZiBhbGwgbm9uLXZhciBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzLCBzZW5kX2VtYWlsLCBzZXJ2aWNlcywgLi4uKS4gKi9cbiAgYmluZGluZ05hbWVzOiBzdHJpbmdbXTtcbiAgZDFEYXRhYmFzZXM6IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZW52aXJvbm1lbnQgY29tZXMgZnJvbSBhbiBgZW52LjxuYW1lPmAgc2VjdGlvbiAodGhlbiB3cmFuZ2xlciBjb21tYW5kcyBuZWVkXG4gICAqIGAtLWVudiA8bmFtZT5gIC8gYENMT1VERkxBUkVfRU5WPTxuYW1lPmApLiBgcHJvZHVjdGlvbmAgbWF5IGJlIGVpdGhlciB0aGUgdG9wIGxldmVsIG9yIGFcbiAgICogbmFtZWQgYGVudi5wcm9kdWN0aW9uYCBzZWN0aW9uOyB0aGUgc2VjdGlvbiB3aW5zIHdoZW4gaXQgZXhpc3RzLlxuICAgKi9cbiAgdXNlc0VudlNlY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSYXdXcmFuZ2xlckNvbmZpZyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZDFfZGF0YWJhc2VzPzogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIGFzc2V0cz86IHVua25vd247XG4gIGxvZ2Z3ZHI/OiB1bmtub3duO1xuICB3YXNtX21vZHVsZXM/OiB1bmtub3duO1xuICB0ZXh0X2Jsb2JzPzogdW5rbm93bjtcbiAgZGF0YV9ibG9icz86IHVua25vd247XG4gIHNpdGU/OiB1bmtub3duO1xuICBzZWNyZXRzPzogeyByZXF1aXJlZD86IHN0cmluZ1tdIH07XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIFJhd1dyYW5nbGVyQ29uZmlnPjtcbn1cblxuLy8gV29ya2VycyBTaXRlcyBpbXBsaWNpdGx5IGJpbmRzIGl0cyBLViBuYW1lc3BhY2UgYXMgX19TVEFUSUNfQ09OVEVOVC5cbmZ1bmN0aW9uIHNpdGVCaW5kaW5nTmFtZXMoY29uZmlnOiBSYXdXcmFuZ2xlckNvbmZpZywgZW52Q29uZmlnPzogUmF3V3JhbmdsZXJDb25maWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoZW52Q29uZmlnPy5zaXRlID8/IGNvbmZpZy5zaXRlKSA/IFsnX19TVEFUSUNfQ09OVEVOVCddIDogW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd3JhbmdsZXIgY29uZmlnIHZhbHVlcyBuZWVkZWQgZm9yIGRlcGxveWluZyB0byB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuXG4gKiBGb2xsb3dzIHdyYW5nbGVyJ3MgaW5oZXJpdGFuY2UgcnVsZXM6IGBhY2NvdW50X2lkYCBpcyBpbmhlcml0ZWQgYnkgbmFtZWQgZW52aXJvbm1lbnRzLFxuICogd2hpbGUgYHZhcnNgIGFuZCBgZDFfZGF0YWJhc2VzYCBhcmUgbm90IGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcbiAgaWYgKHBhdGguZXh0bmFtZShjb25maWdQYXRoKSA9PT0gJy50b21sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGVwbG95IHN1cHBvcnRzIHdyYW5nbGVyLmpzb25jL3dyYW5nbGVyLmpzb24gY29uZmlncyBvbmx5OyBtaWdyYXRlIHdyYW5nbGVyLnRvbWwgZmlyc3QuJyk7XG4gIH1cblxuICAvLyBqc29uYy1wYXJzZXIgaXMgZmF1bHQgdG9sZXJhbnQgYW5kIHdvdWxkIHJldHVybiBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsXG4gIC8vIHdoaWNoIGNvdWxkIG1pZ3JhdGUgYSByZW1vdGUgZGF0YWJhc2UgZnJvbSBhIGhhbGYtcmVhZCBjb25maWc7IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IuXG4gIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgY29uc3QgY29uZmlnID0gcGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JyksIHBhcnNlRXJyb3JzLCB7XG4gICAgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlLFxuICB9KSBhcyBSYXdXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2NvbmZpZ1BhdGh9OiAke3BhcnNlRXJyb3JzLmxlbmd0aH0gSlNPTkMgc3ludGF4IGVycm9yKHMpLmApO1xuICB9XG4gIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgY29uc3QgZW52Q29uZmlnID0gY29uZmlnLmVudj8uW2Vudk5hbWVdO1xuICBpZiAoIWVudkNvbmZpZyAmJiBlbnZOYW1lICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB3cmFuZ2xlciBjb25maWcgaGFzIG5vIFwiZW52XCI6IHsgXCIke2Vudk5hbWV9XCI6IC4uLiB9IHNlY3Rpb24uYCk7XG4gIH1cbiAgcmV0dXJuIGVudkNvbmZpZ1xuICAgID8ge1xuICAgICAgICB3b3JrZXJOYW1lOiBlbnZDb25maWcubmFtZSA/PyAoY29uZmlnLm5hbWUgPyBgJHtjb25maWcubmFtZX0tJHtlbnZOYW1lfWAgOiB1bmRlZmluZWQpLFxuICAgICAgICBhY2NvdW50SWQ6IGVudkNvbmZpZy5hY2NvdW50X2lkID8/IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhlbnZDb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGVudkNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICAvLyBNb3N0IGJpbmRpbmdzIGFyZSBub24taW5oZXJpdGFibGUgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQsIHNvIG9ubHkgdGhlXG4gICAgICAgIC8vIGVudmlyb25tZW50J3Mgb3duIG5hbWVzIGNvdW50IOKAlCBwbHVzIHRoZSBnZW51aW5lbHkgaW5oZXJpdGVkIHNoYXBlcyAoYXNzZXRzLCBsb2dmd2RyKSxcbiAgICAgICAgLy8gd2hpY2ggd3JhbmdsZXIgcmVzb2x2ZXMgYXMgd2hvbGUgZmllbGRzOiB0aGUgZW52aXJvbm1lbnQncyBvd24gZmllbGQgb3ZlcnJpZGVzIHRoZVxuICAgICAgICAvLyB0b3AgbGV2ZWwgZW50aXJlbHksIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSdzIG5hbWVzIGNvdW50LlxuICAgICAgICBiaW5kaW5nTmFtZXM6IFtcbiAgICAgICAgICAuLi5jb2xsZWN0QmluZGluZ05hbWVzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhc3NldHM6IGVudkNvbmZpZy5hc3NldHMgPz8gY29uZmlnLmFzc2V0cyxcbiAgICAgICAgICAgICAgbG9nZndkcjogZW52Q29uZmlnLmxvZ2Z3ZHIgPz8gY29uZmlnLmxvZ2Z3ZHIsXG4gICAgICAgICAgICAgIHdhc21fbW9kdWxlczogZW52Q29uZmlnLndhc21fbW9kdWxlcyA/PyBjb25maWcud2FzbV9tb2R1bGVzLFxuICAgICAgICAgICAgICB0ZXh0X2Jsb2JzOiBlbnZDb25maWcudGV4dF9ibG9icyA/PyBjb25maWcudGV4dF9ibG9icyxcbiAgICAgICAgICAgICAgZGF0YV9ibG9iczogZW52Q29uZmlnLmRhdGFfYmxvYnMgPz8gY29uZmlnLmRhdGFfYmxvYnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhlbnZDb25maWcpXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZywgZW52Q29uZmlnKSxcbiAgICAgICAgXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGVudkNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIC8vIGBzZWNyZXRzYCBpcyBub24taW5oZXJpdGFibGU6IGEgdG9wLWxldmVsIHJlcXVpcmVtZW50IG11c3Qgbm90IGZvcmNlIChvciB1cGxvYWQpXG4gICAgICAgIC8vIGEgc2VjcmV0IGludG8gYSBuYW1lZCBlbnZpcm9ubWVudC5cbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogZW52Q29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogdHJ1ZSxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgd29ya2VyTmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgIGFjY291bnRJZDogY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogY29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIGJpbmRpbmdOYW1lczogWy4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoY29uZmlnKSwgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcpXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IGZhbHNlLFxuICAgICAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZURvdGVudiB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbi8vIENsb3VkZmxhcmUgV29ya2VycyBkb24ndCBzZWUgdGhlIHByb2Nlc3MgZW52aXJvbm1lbnQ7IHdyYW5nbGVyIGRldiByZWFkcyB2YXJzIGZyb20gYSAuZGV2LnZhcnNcbi8vIGZpbGUgbmV4dCB0byBpdHMgY29uZmlnIGZpbGUgaW5zdGVhZC4gVGhpcyBjb21tYW5kIGJyaWRnZXMgd2ItbWFuYWdlZCAuZW52IGZpbGVzIHRvIHRoYXQgZmlsZS5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyAmIHsgcGF0aD86IHN0cmluZyB9PjtcblxuZXhwb3J0IGNvbnN0IGdlbkRldlZhcnNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdnZW4tZGV2LXZhcnMgW3BhdGhdJyxcbiAgZGVzY3JpYmU6XG4gICAgJ0dlbmVyYXRlIGEgLmRldi52YXJzIGZpbGUgZm9yIGB3cmFuZ2xlciBkZXZgIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQgZnJvbSAuZW52IGZpbGVzIChwbHVzIFdCX0VOViBhbmQgTkVYVF9QVUJMSUNfV0JfRU5WKS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+XG4gICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIGdlbmVyYXRlZCAuZGV2LnZhcnMgZmlsZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnLmRldi52YXJzJyxcbiAgICB9KSBhcyB1bmtub3duIGFzIEFyZ3Y8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFJlc3RyaWN0IHRvIHRoZSB2YXJpYWJsZXMgbG9hZGVkIGZyb20gLmVudiBmaWxlcyAod2IncyBlbnZpcm9ubWVudCBjb250cmFjdCkgc28gdGhhdFxuICAgIC8vIHVucmVsYXRlZCBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZXZlciBsZWFrIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBJZ25vcmVcbiAgICAvLyBwcm9jZXNzLmVudiBiZWNhdXNlIHRoZSBwYXJlbnQgd2IgcHJvY2VzcyBpbmplY3RzIHRoZSAuZW52IHZhbHVlcyBpbnRvIGl0LCB3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBsb2FkaW5nIHRoZW0gaGVyZS5cbiAgICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBkb3RlbnYgdmFsdWVzIGZvciBmaWxlLWRlZmluZWRcbiAgICAvLyBrZXlzIChwcm9qZWN0LmVudiBhcHBsaWVzIHRoYXQgcHJlY2VkZW5jZSksIG9yIGBBVVRIX1NFQ1JFVD0uLi4gd2Igc3RhcnRgIHdvdWxkIHNlcnZlXG4gICAgLy8gdGhlIHN0YWxlIGZpbGUgdmFsdWUuIEFuIGV4cG9ydCB0aGF0IGVtcHRpZXMgYSBub24tZW1wdHkgZmlsZSB2YWx1ZSBpcyBkZWxpYmVyYXRlIGFuZFxuICAgIC8vIG11c3Qgc3Vydml2ZSB0aGUgZW1wdHktdmFsdWUgZmlsdGVyIGJlbG93ICh1bmxpa2UgYEtFWT1gIHBsYWNlaG9sZGVycyBpbiAuZW52IGZpbGVzLFxuICAgIC8vIHdoaWNoIHN0YXkgb21pdHRlZCBzbyB0aGV5IGNhbm5vdCBvdmVycmlkZSB3cmFuZ2xlciBgdmFyc2Agd2l0aCBlbXB0eSBzdHJpbmdzKS5cbiAgICBjb25zdCBleHBsaWNpdGx5RW1wdGllZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSAnJyAmJiBlbnZWYXJzW2tleV0gIT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgLy8gU3VwcGxlbWVudCB3aXRoIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFsdWVzIGZvciB0aGUga2V5cyBuYW1lZCBpbiAuZW52LmV4YW1wbGU6IENJIG9mdGVuXG4gICAgLy8gcHJvdmlkZXMgdGhlbSBhcyB3b3JrZmxvdyBlbnYgaW5zdGVhZCBvZiAuZW52IGZpbGVzIChzdGlsbCBhbiBhbGxvd2xpc3QsIHNvIHVucmVsYXRlZFxuICAgIC8vIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbm5vdCBsZWFrKS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ucmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3QpLCAnV0JfRU5WJywgJ05FWFRfUFVCTElDX1dCX0VOViddKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZW52VmFyc1trZXldIHx8IGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVudlZhcnNba2V5XSA9PT0gdW5kZWZpbmVkICYmIGVmZmVjdGl2ZVZhbHVlID09PSAnJykgZXhwbGljaXRseUVtcHRpZWRLZXlzLmFkZChrZXkpO1xuICAgICAgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gJycgfHwgZXhwbGljaXRseUVtcHRpZWRLZXlzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7cXVvdGVEb3RlbnZWYWx1ZShrZXksIHZhbHVlKX1gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYXJndi5wYXRoID8/ICcuZGV2LnZhcnMnKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBXb3VsZCBnZW5lcmF0ZSAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGxldCBlbnZFeGFtcGxlUGF0aDogc3RyaW5nO1xuICB0cnkge1xuICAgIGVudkV4YW1wbGVQYXRoID0gcHJvamVjdC5maW5kRmlsZSgnLmVudi5leGFtcGxlJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvLyBkb3RlbnYncyBvd24gcGFyc2VyIGNvdmVycyBgZXhwb3J0IEtFWT1gIHByZWZpeGVzIGFuZCB3aGl0ZXNwYWNlIGFyb3VuZCBgPWAsXG4gIC8vIHdoaWNoIGEgbGluZSByZWdleCB3b3VsZCBzaWxlbnRseSBtaXNzLlxuICByZXR1cm4gT2JqZWN0LmtleXMocGFyc2VEb3RlbnYoZnMucmVhZEZpbGVTeW5jKGVudkV4YW1wbGVQYXRoLCAndXRmOCcpKSk7XG59XG5cbi8qKlxuICogUXVvdGUgYSB2YWx1ZSBmb3IgZG90ZW52ICh3aGljaCB3cmFuZ2xlciB1c2VzIGZvciAuZGV2LnZhcnMpLiBFdmVyeSBjYW5kaWRhdGUgcmVwcmVzZW50YXRpb25cbiAqIGlzIHZlcmlmaWVkIGJ5IGFjdHVhbGx5IHBhcnNpbmcgaXQgYmFjayAob3VyIGRvdGVudiBwYXJzZXIgbWF0Y2hlcyB3cmFuZ2xlcidzIGJ1bmRsZWQgZG90ZW52XG4gKiAxNiBmb3IgdGhlc2UgY29uc3RydWN0cyksIHNvIGEgdmFsdWUgaXMgZWl0aGVyIHNlcmlhbGl6ZWQgbG9zc2xlc3NseSBvciByZWplY3RlZCDigJQgbmV2ZXJcbiAqIHNpbGVudGx5IGNvcnJ1cHRlZC4gQ2FuZGlkYXRlczogc2luZ2xlIHF1b3RlcyAobGl0ZXJhbCBzcGFuOyBjbG9zZWQgZWFybHkgYnkgYW4gYXBvc3Ryb3BoZSksXG4gKiBiYWNrdGlja3MgKGVxdWFsbHkgbGl0ZXJhbCksIHRoZW4gZG91YmxlIHF1b3RlcyB3aXRoIGVzY2FwZWQgbmV3bGluZXMvQ1JzIChkb3RlbnYgZG9lcyBub3RcbiAqIHVuZXNjYXBlIGlubmVyIFxcXCIg4oCUIGEgYCNgIGFmdGVyIGFuIGVtYmVkZGVkIHF1b3RlIHN0YXJ0cyBhIGNvbW1lbnQsIHdoaWNoIHRoZSByb3VuZC10cmlwXG4gKiBjaGVjayBjYXRjaGVzIGFuZCByZWplY3RzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlRG90ZW52VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkb3VibGVRdW90ZWRCb2R5ID0gdmFsdWUucmVwbGFjZUFsbCgnXFxuJywgU3RyaW5nLnJhd2BcXG5gKS5yZXBsYWNlQWxsKCdcXHInLCBTdHJpbmcucmF3YFxccmApO1xuICBjb25zdCBjYW5kaWRhdGVzID0gW2AnJHt2YWx1ZX0nYCwgYFxcYCR7dmFsdWV9XFxgYCwgYFwiJHtkb3VibGVRdW90ZWRCb2R5fVwiYF07XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAocGFyc2VEb3RlbnYoYCR7a2V5fT0ke2NhbmRpZGF0ZX1gKVtrZXldID09PSB2YWx1ZSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB2YWx1ZSBvZiAke2tleX0gY2Fubm90IGJlIGxvc3NsZXNzbHkgc2VyaWFsaXplZCBpbnRvIC5kZXYudmFyczsgc2ltcGxpZnkgaXRzIHF1b3RpbmcuYCk7XG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGREcml6emxlS2l0Q29tbWFuZCwgdXNlc0RyaXp6bGVLaXRGb3JEMSB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50LCBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZywgV3JhbmdsZXJEMURhdGFiYXNlIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXJDb25maWcuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52LCB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXJDb25maWcuanMnO1xuXG5pbXBvcnQgeyByZWFkRW52RXhhbXBsZUtleXMgfSBmcm9tICcuL2dlbkRldlZhcnMuanMnO1xuXG4vKipcbiAqIEtleXMgdGhhdCBkcml2ZSB0aGUgZGVwbG95IGl0c2VsZiAob3IgYXJlIG1lYW5pbmdmdWwgb25seSBsb2NhbGx5KSBhbmQgdGh1cyBtdXN0IG5ldmVyIGJlXG4gKiBwdXNoZWQgdG8gdGhlIFdvcmtlciBhcyBzZWNyZXRzLiBgV0JfRU5WYCAvIGBORVhUX1BVQkxJQ19XQl9FTlZgIGJlbG9uZyBpbiB3cmFuZ2xlciBgdmFyc2AuXG4gKi9cbmNvbnN0IE5PTl9TRUNSRVRfS0VZUyA9IG5ldyBTZXQoW1xuICAnQ0knLFxuICAvLyBXcmFuZ2xlciBzeXN0ZW0vYXV0aGVudGljYXRpb24gdmFyaWFibGVzIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy93cmFuZ2xlci9zeXN0ZW0tZW52aXJvbm1lbnQtdmFyaWFibGVzLyksXG4gIC8vIGluY2x1ZGluZyBsZWdhY3kgYWxpYXNlczsgYXBwLXNwZWNpZmljIG5hbWVzIHN1Y2ggYXMgQ0xPVURGTEFSRV9SMl9BQ0NFU1NfS0VZX0lEIHN0YXkgZWxpZ2libGUuXG4gICdDRl9BQ0NPVU5UX0lEJyxcbiAgJ0NGX0FQSV9CQVNFX1VSTCcsXG4gICdDRl9BUElfRU1BSUwnLFxuICAnQ0ZfQVBJX0tFWScsXG4gICdDRl9BUElfVE9LRU4nLFxuICAnQ0ZfRU1BSUwnLFxuICAnQ0xPVURGTEFSRV9BQ0NFU1NfQ0xJRU5UX0lEJyxcbiAgJ0NMT1VERkxBUkVfQUNDRVNTX0NMSUVOVF9TRUNSRVQnLFxuICAnQ0xPVURGTEFSRV9BQ0NPVU5UX0lEJyxcbiAgJ0NMT1VERkxBUkVfQVBJX0JBU0VfVVJMJyxcbiAgJ0NMT1VERkxBUkVfQVBJX0tFWScsXG4gICdDTE9VREZMQVJFX0FQSV9UT0tFTicsXG4gICdDTE9VREZMQVJFX0FVVEhfVVNFX0tFWVJJTkcnLFxuICAnQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCcsXG4gICdDTE9VREZMQVJFX0VNQUlMJyxcbiAgJ0NMT1VERkxBUkVfRU5WJyxcbiAgJ0NMT1VERkxBUkVfSU5DTFVERV9QUk9DRVNTX0VOVicsXG4gICdDTE9VREZMQVJFX0xPQURfREVWX1ZBUlNfRlJPTV9ET1RfRU5WJyxcbiAgJ0RPQ0tFUl9IT1NUJyxcbiAgJ0hUVFBfUFJPWFknLFxuICAnSFRUUFNfUFJPWFknLFxuICAnaHR0cF9wcm94eScsXG4gICdodHRwc19wcm94eScsXG4gICdGT1JDRV9DT0xPUicsXG4gICdNSU5JRkxBUkVfQ0FDSEVfRElSJyxcbiAgJ01JU0VfRU5WJyxcbiAgJ05PX0NPTE9SJyxcbiAgJ05FWFRfUFVCTElDX1dCX0VOVicsXG4gICdORVhUX1BVQkxJQ19XQl9WRVJTSU9OJyxcbiAgJ05PREVfRU5WJyxcbiAgJ1BPUlQnLFxuICAnV0JfRU5WJyxcbiAgJ1dCX1ZFUlNJT04nLFxuXSk7XG5cbmNvbnN0IE5PTl9TRUNSRVRfS0VZX1BSRUZJWEVTID0gWydXUkFOR0xFUl8nLCAnQ0xPVURGTEFSRV9IWVBFUkRSSVZFX0xPQ0FMX0NPTk5FQ1RJT05fU1RSSU5HXycsICdDTE9VREZMQVJFX0NGX0ZFVENIXyddO1xuXG5mdW5jdGlvbiBpc05vblNlY3JldEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gTk9OX1NFQ1JFVF9LRVlTLmhhcyhrZXkpIHx8IE5PTl9TRUNSRVRfS0VZX1BSRUZJWEVTLnNvbWUoKHByZWZpeCkgPT4ga2V5LnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBEZXBsb3lDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBEZXBsb3lDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxEZXBsb3lDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIERlcGxveUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOlxuICAgICdEZXBsb3kgYSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwICh2aW5leHQgb3IgcGxhaW4gV29ya2VyKSB0byB0aGUgV0JfRU5WIGVudmlyb25tZW50OiB2YWxpZGF0ZSBzZWNyZXRzLCBidWlsZCwgYXBwbHkgcmVtb3RlIEQxIG1pZ3JhdGlvbnMsIHRoZW4gZGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHlhcmdzIGFzIHVua25vd24gYXMgQXJndjxEZXBsb3lDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogRGVwbG95Q29tbWFuZEFyZ3YpIHtcbiAgICAvLyBBIHN0cmF5IGV4cG9ydGVkIENMT1VERkxBUkVfRU5WIHdvdWxkIGJha2UgdGhlIHdyb25nIGVudmlyb25tZW50IGludG8gdGhlIGJ1aWxkIGFuZFxuICAgIC8vIGFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXggdHdpY2Ugb24gZGVwbG95OyBpdCBpcyByZS1zZXQgZXhwbGljaXRseSB3aGVyZSBuZWVkZWQuXG4gICAgLy8gQSBkb3RlbnYgZmlsZSBkZWZpbmluZyBpdCBzdGlsbCBzdXJmYWNlcyB0aHJvdWdoIHByb2plY3QuZW52LCB3aGljaCB0aGUgZXhwbGljaXQgYC0tZW52YFxuICAgIC8vIGZsYWdzIGJlbG93IG92ZXJyaWRlLlxuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DTE9VREZMQVJFX0VOVjtcblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHdyYW5nbGVyQ29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgaWYgKCF3cmFuZ2xlckNvbmZpZ1BhdGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCd3YiBkZXBsb3kgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcHMgKG5vIHdyYW5nbGVyIGNvbmZpZyBmb3VuZCkuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBlbnZOYW1lID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIGlmICghZW52TmFtZSB8fCBlbnZOYW1lID09PSAnZGV2ZWxvcG1lbnQnIHx8IGVudk5hbWUgPT09ICd0ZXN0Jykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBXQl9FTlYgbXVzdCBuYW1lIGEgZGVwbG95IGVudmlyb25tZW50IChlLmcuIHN0YWdpbmcgb3IgcHJvZHVjdGlvbiksIGJ1dCBpcyAke2Vudk5hbWV9LmApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFRoZSB2YWx1ZXMgZ28gaW50byBib3RoIHByb2Nlc3MuZW52IChpbmhlcml0ZWQgYnkgZXZlcnl0aGluZyB3YiBzcGF3bnMpIGFuZCBwcm9qZWN0LmVudlxuICAgIC8vICh0aGUgZW52aXJvbm1lbnQgd2IgaXRzZWxmIHJlYWRzIGFuZCBwYXNzZXMgZXhwbGljaXRseSk7IHRoZSBsYXR0ZXIgaXMgYSBjYWNoZWQgc25hcHNob3RcbiAgICAvLyB0YWtlbiBiZWZvcmUgdGhpcyBwb2ludCwgc28gd3JpdGluZyBvbmx5IHRvIHByb2Nlc3MuZW52IHdvdWxkIGxlYXZlIHdiJ3Mgb3duIHByZWZsaWdodCDigJRcbiAgICAvLyBhbmQgYW55IGNvbW1hbmQgc3Bhd25lZCB3aXRoIHByb2plY3QuZW52IOKAlCB3aXRob3V0IHRoZSB0b2tlbi5cbiAgICAvLyBPbmx5IC0taW5jbHVkZS1yb290LWVudiBnYXRlcyB0aGUgcm9vdCBsb29rdXAsIG5vdCBhbiBleHBsaWNpdCAtLWVudjogLS1lbnYgcmVwbGFjZXMgdGhlXG4gICAgLy8gZG90ZW52IFZBUklBQkxFIHNvdXJjZXMsIHdoaWxlIC5lbnYuY2xvdWRmbGFyZSBpcyBhIGNyZWRlbnRpYWwgc2lkZWNhciByZWFkIG91dHNpZGUgdGhhdFxuICAgIC8vIGNhc2NhZGUgKHRoZSBwcm9qZWN0J3Mgb3duIGNvcHkgaXMgcmVhZCByZWdhcmRsZXNzIG9mIC0tZW52LCBhcyBpdCBhbHdheXMgaGFzIGJlZW4pLlxuICAgIC8vIEdhdGluZyBvbiAtLWVudiB3b3VsZCBtYWtlIGB3YiBkZXBsb3kgLS1lbnYgPGZpbGU+YCBzaWxlbnRseSBzdG9wIGZpbmRpbmcgdGhlIHJlcG8ncyB0b2tlbi5cbiAgICBjb25zdCBjbG91ZGZsYXJlRW52VmFycyA9IHJlYWRDbG91ZGZsYXJlRW52RmlsZXMoXG4gICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBhcmd2LmluY2x1ZGVSb290RW52ID8gcHJvamVjdC5yb290RGlyUGF0aCA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY2xvdWRmbGFyZUVudlZhcnMpKSB7XG4gICAgICAvLyA/Pz0gc28gdGhhdCBhbiBleHBsaWNpdGx5IGV4cG9ydGVkIGVtcHR5IHZhbHVlIHN0aWxsIHdpbnMgb3ZlciB0aGUgZmlsZS5cbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPz89IHZhbHVlO1xuICAgICAgcHJvamVjdC5lbnZba2V5XSA/Pz0gdmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICByZXNvbHZlZENvbmZpZyA9IHJlc29sdmVXcmFuZ2xlckNvbmZpZ0ZvckVudihwcm9qZWN0LCBlbnZOYW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoU3RyaW5nKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZWRDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gcGFyc2UgJHt3cmFuZ2xlckNvbmZpZ1BhdGh9LmApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgYWNjb3VudElkID0gcmVzb2x2ZWRDb25maWcuYWNjb3VudElkID8/IHByb2plY3QuZW52LkNMT1VERkxBUkVfQUNDT1VOVF9JRDtcbiAgICAvLyBQcmVmZXIgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgd2hlbmV2ZXIgdGhlIHJlc29sdmVkIGVudmlyb25tZW50J3MgRDEgYmluZGluZ3MgaGF2ZSBhblxuICAgIC8vIGV4aXN0aW5nIG1pZ3JhdGlvbnMgZGlyZWN0b3J5LiBBIGRyaXp6bGUtb3JtIGRlcGVuZGVuY3kgYWxvbmUgZG9lcyBub3QgaW1wbHkgdGhlIHByb2plY3RcbiAgICAvLyBtaWdyYXRlcyBEMSB3aXRoIGRyaXp6bGUta2l0J3MgZDEtaHR0cCBkcml2ZXI6IHRoZSBleHBsaWNpdCBtYXJrZXIgaXMgYSBkcml6emxlIGNvbmZpZ1xuICAgIC8vIHdob3NlIGRpYWxlY3QvZHJpdmVyIHRhcmdldHMgc3FsaXRlIC8gZDEtaHR0cCAvIGR1cmFibGUtc3FsaXRlIChzZWUgdXNlc0RyaXp6bGVLaXRGb3JEMTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NDIpLiBBIGRyaXp6bGUgY29uZmlnIHRhcmdldGluZyBhbm90aGVyXG4gICAgLy8gZGF0YWJhc2UgKGUuZy4gUG9zdGdyZVNRTCB2aWEgSHlwZXJkcml2ZSkgbGVhdmVzIHRoZSBEMSBiaW5kaW5ncyB1bm1hbmFnZWQgYnkgd2IgZGVwbG95LlxuICAgIGNvbnN0IHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMgPSByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5maWx0ZXIoKGRhdGFiYXNlKSA9PlxuICAgICAgdXNlc1dyYW5nbGVyTmF0aXZlTWlncmF0aW9ucyhwcm9qZWN0LCBkYXRhYmFzZSlcbiAgICApO1xuICAgIGNvbnN0IGRyaXp6bGVLaXRNYW5hZ2VzRDEgPSB1c2VzRHJpenpsZUtpdEZvckQxKHByb2plY3QpO1xuICAgIGlmIChcbiAgICAgIGRyaXp6bGVLaXRNYW5hZ2VzRDEgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID4gMCAmJlxuICAgICAgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPCByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIC8vIE1pZ3JhdGluZyBvbmx5IHRoZSB3cmFuZ2xlci1uYXRpdmUgc3Vic2V0IHdvdWxkIHNpbGVudGx5IGRlcGxveSBjb2RlIGFnYWluc3QgdGhlXG4gICAgICAvLyBvdGhlciwgdW5taWdyYXRlZCBkYXRhYmFzZXMuXG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoJ3diIGRlcGxveSBkb2VzIG5vdCBzdXBwb3J0IG1peGluZyB3cmFuZ2xlci1uYXRpdmUgYW5kIG5vbi1uYXRpdmUgRDEgbWlncmF0aW9uIGxheW91dHMuJylcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGRyaXp6bGVEMURhdGFiYXNlID1cbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID09PSAwICYmIGRyaXp6bGVLaXRNYW5hZ2VzRDEgPyByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlc1swXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAod3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPT09IDAgJiYgZHJpenpsZUtpdE1hbmFnZXNEMSAmJiByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoJ3diIGRlcGxveSBzdXBwb3J0cyBkcml6emxlLWtpdCBtaWdyYXRpb25zIG9ubHkgZm9yIGEgc2luZ2xlIEQxIGJpbmRpbmc7IGZvdW5kIG11bHRpcGxlLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBtYW5hZ2VkRDFEYXRhYmFzZXMgPSBuZXcgU2V0KHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMpO1xuICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSkgbWFuYWdlZEQxRGF0YWJhc2VzLmFkZChkcml6emxlRDFEYXRhYmFzZSk7XG4gICAgY29uc3QgdW5tYW5hZ2VkRDFEYXRhYmFzZXMgPSByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5maWx0ZXIoKGRhdGFiYXNlKSA9PiAhbWFuYWdlZEQxRGF0YWJhc2VzLmhhcyhkYXRhYmFzZSkpO1xuICAgIGlmICh1bm1hbmFnZWREMURhdGFiYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBTYXkgc28gb3V0IGxvdWQgaW5zdGVhZCBvZiBzaWxlbnRseSBkZXBsb3lpbmcgY29kZSBhZ2FpbnN0IHVubWlncmF0ZWQgZGF0YWJhc2VzOiB0aGVcbiAgICAgIC8vIGRyaXp6bGUgbWFya2VyIGRldGVjdGlvbiBpcyBoZXVyaXN0aWMgKHRleHQgc2NhbiBvZiBkcml6emxlLmNvbmZpZy4qKSwgc28gYSBwcm9qZWN0IHRoYXRcbiAgICAgIC8vIGdlbnVpbmVseSBtaWdyYXRlcyBEMSBtdXN0IGJlIGFibGUgdG8gbm90aWNlIHdoZW4gbm8gbWVjaGFuaXNtIHdhcyBzZWxlY3RlZC4gVGhpcyBhbHNvXG4gICAgICAvLyBjb3ZlcnMgcGFydGlhbCBsYXlvdXRzIChzb21lIGJpbmRpbmdzIHdyYW5nbGVyLW5hdGl2ZSwgb3RoZXJzIHVubWFuYWdlZCkuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgTm8gRDEgbWlncmF0aW9uIG1lY2hhbmlzbSBkZXRlY3RlZCBmb3IgJHt1bm1hbmFnZWREMURhdGFiYXNlc1xuICAgICAgICAgICAgLm1hcCgoZGF0YWJhc2UpID0+IGRhdGFiYXNlLmJpbmRpbmcgPz8gZGF0YWJhc2UuZGF0YWJhc2VfbmFtZSA/PyAndW5uYW1lZCBiaW5kaW5nJylcbiAgICAgICAgICAgIC5qb2luKCcsICcpfSBgICtcbiAgICAgICAgICAgICcobm8gd3JhbmdsZXIgbWlncmF0aW9ucyBkaXJlY3RvcnkgYW5kIG5vIGRyaXp6bGUgY29uZmlnIHRhcmdldGluZyBzcWxpdGUvZDEtaHR0cC9kdXJhYmxlLXNxbGl0ZSk7IHdiIGRlcGxveSB3aWxsIG5vdCBydW4gRDEgbWlncmF0aW9ucyBmb3IgdGhlbS4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIERyeSBydW5zIGV4ZWN1dGUgbm90aGluZyBhdXRoZW50aWNhdGVkLCBzbyB0aGV5IHNraXAgdGhlIGNyZWRlbnRpYWwgcHJlZmxpZ2h0IGVudGlyZWx5LlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIC8vIEEgZHJpenpsZS1zZWxlY3RlZCBEMSBkYXRhYmFzZSByb3V0ZXMgYm90aCB0aGUgbWlncmF0aW9uIGluIHN0ZXAgMyBhbmQgYW55IGRlcGxveS9wb3N0XG4gICAgICAvLyBob29rIHRocm91Z2ggZHJpenpsZS1raXQncyBkMS1odHRwIGRyaXZlciwgd2hpY2ggbmVlZHMgQ0xPVURGTEFSRV9BUElfVE9LRU4gZXZlbiBmb3JcbiAgICAgIC8vIGxvY2FsLCB3cmFuZ2xlci1PQXV0aCBkZXBsb3lzLiBGYWlsaW5nIGhlcmUga2VlcHMgdGhlIGZhaWwtZmFzdCBvcmRlcmluZzogYSBtaXNzaW5nIHRva2VuXG4gICAgICAvLyBtdXN0IGFib3J0IGJlZm9yZSB0aGUgZGVwbG95IGdvZXMgbGl2ZSwgbm90IGR1cmluZyBtaWdyYXRpb24gb3IgZGVwbG95L3Bvc3RcbiAgICAgIC8vIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NTYpLiBXcmFuZ2xlci1uYXRpdmUgcHJvamVjdHMgKHdpdGggb3JcbiAgICAgIC8vIHdpdGhvdXQgaG9va3MpIG11c3Qgbm90IHJlcXVpcmUgdGhlIHRva2VuOiBhIGxvY2FsIHdyYW5nbGVyIE9BdXRoIGxvZ2luIHN1ZmZpY2VzIHRoZXJlLFxuICAgICAgLy8gZXZlbiB0aG91Z2ggc3RlcCA1IHN0aWxsIGV4cG9ydHMgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCB0byB0aGVpciBob29rcy5cbiAgICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSAmJiAhcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfVE9LRU4pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0NMT1VERkxBUkVfQVBJX1RPS0VOIGlzIHJlcXVpcmVkIGZvciByZW1vdGUgZHJpenpsZS1raXQgbWlncmF0aW9ucy4nKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc1dyYW5nbGVyQXV0aGVudGljYXRpb24gPVxuICAgICAgICAhIXByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX1RPS0VOIHx8XG4gICAgICAgICEhcHJvamVjdC5lbnYuQ0ZfQVBJX1RPS0VOIHx8XG4gICAgICAgICEhKHByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX0tFWSAmJiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0VNQUlMKSB8fFxuICAgICAgICAhIShwcm9qZWN0LmVudi5DRl9BUElfS0VZICYmIHByb2plY3QuZW52LkNGX0VNQUlMKTtcbiAgICAgIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSAmJiAhaGFzV3JhbmdsZXJBdXRoZW50aWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnV3JhbmdsZXIgYXV0aGVudGljYXRpb24gKGUuZy4gQ0xPVURGTEFSRV9BUElfVE9LRU4pIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBvbiBDSS4nKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHAtc3BlY2lmaWMgdmFsaWRhdGlvbiBob29rIChlLmcuIHNlY3JldCBwYWlycyB0aGF0IG11c3QgYmUgYm90aC1zZXQtb3ItYm90aC1lbXB0eSkuXG4gICAgLy8gVGhlIHJldXNhYmxlIGRlcGxveS55bWwgYWxyZWFkeSBydW5zIGl0IG9uIENJOyBydW4gaXQgaGVyZSBmb3IgbG9jYWwgZGVwbG95cy5cbiAgICBpZiAoIWlzQ0kocHJvamVjdC5lbnYuQ0kpICYmIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvY2ktc2V0dXAnXSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdZQVJOIHJ1biBkZXBsb3kvY2ktc2V0dXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICAvLyAxLiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSBhbGwgc2VjcmV0cyBiZWZvcmUgYW55IGJ1aWxkIG9yIHJlbW90ZSBtdXRhdGlvbiwgc28gYSBtaXNzaW5nXG4gICAgLy8gICAgc2VjcmV0IGFib3J0cyB0aGUgZGVwbG95IGluc3RlYWQgb2YgbGVhdmluZyBhIG1pZ3JhdGVkIGRhdGFiYXNlIGJlaGluZCBhbiBvbGQgV29ya2VyLlxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZTb3VyY2VzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBwcm9qZWN0LmRpclBhdGgsIHsgaWdub3JlUHJvY2Vzc0VudjogdHJ1ZSB9KTtcbiAgICAvLyBSZXN0cmljdCB0aGUgc2VjcmV0cyBkb21haW4gdG8ga2V5cyBkZWZpbmVkIGluIHRoZSBwcm9qZWN0J3MgLmVudiBmaWxlczogYG1pc2UgZW52YFxuICAgIC8vIG91dHB1dCAocmVwb3J0ZWQgYXMgYSBwc2V1ZG8tc291cmNlKSBtaXhlcyBpbiBob3N0L3Rvb2wgdmFyaWFibGVzIHN1Y2ggYXMgQ0FSR09fSE9NRSxcbiAgICAvLyB3aGljaCBtdXN0IG5ldmVyIGJlIHVwbG9hZGVkIGFzIFdvcmtlciBzZWNyZXRzLlxuICAgIGNvbnN0IGRvdGVudktleXMgPSBuZXcgU2V0KFxuICAgICAgZW52U291cmNlcy5maWx0ZXIoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpLmZsYXRNYXAoKFssIGtleXNdKSA9PiBrZXlzKVxuICAgICk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGlmICghZG90ZW52S2V5cy5oYXMoa2V5KSkgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWlyZWRLZXlzID0gcmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3QpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlcXVpcmVkS2V5cykge1xuICAgICAgZW52VmFyc1trZXldID8/PSBwcm9qZWN0LmVudltrZXldID8/ICcnO1xuICAgIH1cbiAgICAvLyBOYW1lcyBkZWNsYXJlZCB2aWEgd3JhbmdsZXIgYHNlY3JldHMucmVxdWlyZWRgIG1heSBsaWtld2lzZSBiZSBzdXBwbGllZCBwdXJlbHkgYXNcbiAgICAvLyBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4gQ0kgd29ya2Zsb3cgZW52KSBpbnN0ZWFkIG9mIGRvdGVudiB2YWx1ZXMuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgcmVzb2x2ZWRDb25maWcucmVxdWlyZWRTZWNyZXROYW1lcykge1xuICAgICAgY29uc3QgZXhwb3J0ZWRWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZW52VmFyc1trZXldID09PSB1bmRlZmluZWQgJiYgZXhwb3J0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBleHBvcnRlZFZhbHVlO1xuICAgIH1cbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBtdXN0IHdpbiBvdmVyIGRvdGVudiB2YWx1ZXMgKHByb2plY3QuZW52IGFscmVhZHlcbiAgICAvLyBhcHBsaWVzIHRoYXQgcHJlY2VkZW5jZSksIG9yIGBBVVRIX1NFQ1JFVD0uLi4gd2IgZGVwbG95YCB3b3VsZCBwdXNoIHRoZSBzdGFsZSBmaWxlIHZhbHVlLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZWZmZWN0aXZlVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHsgbWlzc2luZ0tleXMsIHNlY3JldHMgfSA9IHNlbGVjdFdvcmtlclNlY3JldHMoXG4gICAgICBlbnZWYXJzLFxuICAgICAgWy4uLnJlc29sdmVkQ29uZmlnLnZhcktleXMsIC4uLnJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc10sXG4gICAgICByZXF1aXJlZEtleXNcbiAgICApO1xuICAgIC8vIGAtLXZhciBXQl9WRVJTSU9OOi4uLmAgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIG9uIGRlcGxveSwgc28gYVxuICAgIC8vIHJlc291cmNlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIHdvdWxkIHNpbGVudGx5IGJlY29tZSBhIHN0cmluZyB2YXJpYWJsZS5cbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTiAmJiByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMoJ1dCX1ZFUlNJT04nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dCX1ZFUlNJT04gY29sbGlkZXMgd2l0aCBhIFdvcmtlciBiaW5kaW5nIG5hbWU7IHJlbmFtZSB0aGUgYmluZGluZy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGJpbmRpbmdDb2xsaXNpb25zID0gT2JqZWN0LmtleXMoZW52VmFycykuZmlsdGVyKChrZXkpID0+IHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcyhrZXkpKTtcbiAgICBpZiAoYmluZGluZ0NvbGxpc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVXBsb2FkaW5nIGEgc2VjcmV0IG5hbWVkIGxpa2UgYSBiaW5kaW5nIHdvdWxkIHJlcGxhY2UgdGhlIGJpbmRpbmcgd2l0aCBhIHBsYWluIHN0cmluZy5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyBlbnYga2V5cyB0aGF0IGNvbGxpZGUgd2l0aCBXb3JrZXIgYmluZGluZyBuYW1lczogJHtiaW5kaW5nQ29sbGlzaW9ucy5qb2luKCcsICcpfWApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZnJvbSAuZW52LmV4YW1wbGUgb3Igd3JhbmdsZXIgc2VjcmV0cy5yZXF1aXJlZCk6ICR7bWlzc2luZ0tleXMuam9pbignLCAnKX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFdyYW5nbGVyIHZhbGlkYXRlcyBgc2VjcmV0cy5yZXF1aXJlZGAgb25seSBkdXJpbmcgdGhlIHJlYWwgdXBsb2FkIOKAlCBhZnRlciBtaWdyYXRpb25zIOKAlFxuICAgIC8vIHNvIHdiIGNoZWNrcyB1cGZyb250OiBlYWNoIHJlcXVpcmVkIG5hbWUgbXVzdCBiZSBhIGtleSBpbiB0aGUgb3V0Z29pbmcgcGF5bG9hZCAocHJlc2VuY2UsXG4gICAgLy8gbm90IHRydXRoaW5lc3Mg4oCUIGFuIGV4cGxpY2l0IGVtcHR5IGNsZWFycyBhIHN0YWxlIHZhbHVlKSBvciBhbiBlZmZlY3RpdmUgdmFyL2JpbmRpbmcuXG4gICAgY29uc3QgdW5zYXRpc2ZpZWRSZXF1aXJlZFNlY3JldE5hbWVzID0gcmVzb2x2ZWRDb25maWcucmVxdWlyZWRTZWNyZXROYW1lcy5maWx0ZXIoXG4gICAgICAobmFtZSkgPT5cbiAgICAgICAgIU9iamVjdC5oYXNPd24oc2VjcmV0cywgbmFtZSkgJiZcbiAgICAgICAgIXJlc29sdmVkQ29uZmlnLnZhcktleXMuaW5jbHVkZXMobmFtZSkgJiZcbiAgICAgICAgIXJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcyhuYW1lKVxuICAgICk7XG4gICAgaWYgKHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFNlY3JldHMgcmVxdWlyZWQgYnkgdGhlIHdyYW5nbGVyIGNvbmZpZyBhcmUgbm90IHByb3ZpZGVkOiAke3Vuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcy5qb2luKCcsICcpfWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0S2V5cyA9IE9iamVjdC5rZXlzKHNlY3JldHMpLnRvU29ydGVkKCk7XG4gICAgLy8gQ2xvdWRmbGFyZSBsaW1pdHMgYSBidWxrIHVwbG9hZCB0byAxMDAgc2VjcmV0cywgZWFjaCB2YXJpYWJsZS9zZWNyZXQgdmFsdWUgdG8gNSBLQiwgYW5kXG4gICAgLy8gdGhlIGNvbWJpbmVkIHZhcmlhYmxlK3NlY3JldCBjb3VudCB0byAxMjggKDY0IG9uIHRoZSBGcmVlIHBsYW4sIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZFxuICAgIC8vIGhlcmUg4oCUIGhlbmNlIGEgd2FybmluZykuIEZhaWxpbmcgYmVmb3JlIGFueSBidWlsZCBvciBtaWdyYXRpb24ga2VlcHMgYW4gb3ZlcnNpemVkIHBheWxvYWRcbiAgICAvLyBmcm9tIGFib3J0aW5nIHRoZSBkZXBsb3kgYWZ0ZXIgcmVtb3RlIG1pZ3JhdGlvbnMgYWxyZWFkeSByYW4uXG4gICAgaWYgKHNlY3JldEtleXMubGVuZ3RoID4gMTAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYENsb3VkZmxhcmUgYWNjZXB0cyBhdCBtb3N0IDEwMCBzZWNyZXRzIHBlciBkZXBsb3ksIGJ1dCAke3NlY3JldEtleXMubGVuZ3RofSB3ZXJlIHNlbGVjdGVkLmApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBUaGUgQ0xJLXByb3ZpZGVkIFdCX1ZFUlNJT04gb3ZlcmxheXMgYSBjb25maWd1cmVkIHZhciBvZiB0aGUgc2FtZSBuYW1lIG9uIGRlcGxveSxcbiAgICAvLyBzbyBvbmx5IHRoZSBlZmZlY3RpdmUgdmFsdWUgcGFydGljaXBhdGVzIGluIHRoZSBsaW1pdCBjaGVja3MuXG4gICAgY29uc3QgZWZmZWN0aXZlVmFycyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXM8dW5rbm93bj4ocmVzb2x2ZWRDb25maWcudmFycykpO1xuICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OKSBlZmZlY3RpdmVWYXJzLnNldCgnV0JfVkVSU0lPTicsIHByb2plY3QuZW52LldCX1ZFUlNJT04pO1xuICAgIGNvbnN0IHZhckVudHJpZXMgPSBbLi4uZWZmZWN0aXZlVmFyc107XG4gICAgY29uc3Qgb3ZlcnNpemVkS2V5cyA9IFtcbiAgICAgIC4uLnNlY3JldEtleXMuZmlsdGVyKChrZXkpID0+IEJ1ZmZlci5ieXRlTGVuZ3RoKHNlY3JldHNba2V5XSA/PyAnJywgJ3V0ZjgnKSA+IDUgKiAxMDI0KSxcbiAgICAgIC4uLnZhckVudHJpZXNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoWywgdmFsdWVdKSA9PiBCdWZmZXIuYnl0ZUxlbmd0aCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSksICd1dGY4JykgPiA1ICogMTAyNFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpLFxuICAgIF07XG4gICAgaWYgKG92ZXJzaXplZEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFZhcmlhYmxlIG9yIHNlY3JldCB2YWx1ZXMgZXhjZWVkIENsb3VkZmxhcmUncyA1IEtCIGxpbWl0OiAke292ZXJzaXplZEtleXMuam9pbignLCAnKX1gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIGAtLXNlY3JldHMtZmlsZWAgaXMgYWRkaXRpdmU6IHJlbW90ZSBzZWNyZXRzIGFic2VudCBmcm9tIHRoZSBwYXlsb2FkIHN0YXkgYXR0YWNoZWQgdG8gdGhlXG4gICAgLy8gbmV3IHZlcnNpb24sIHNvIHRoZXkgY291bnQgYWdhaW5zdCB0aGUgY29tYmluZWQgbGltaXQgdG9vLiBMaXN0aW5nIHRoZW0gbmVlZHMgYW5cbiAgICAvLyBhdXRoZW50aWNhdGVkIHJlbW90ZSByb3VuZC10cmlwLCB3aGljaCBkcnkgcnVucyBza2lwOyB3aGVuIHRoZSBsaXN0aW5nIGZhaWxzIGZvciBhbnlcbiAgICAvLyByZWFzb24gb3RoZXIgdGhhbiBhIG5vdC15ZXQtY3JlYXRlZCBXb3JrZXIsIGRlZ3JhZGUgdG8gdGhlIGxvY2FsLW9ubHkgY291bnQgaW5zdGVhZCBvZlxuICAgIC8vIGJsb2NraW5nIGEgZGVwbG95IHRoYXQgd3JhbmdsZXIgaXRzZWxmIG1pZ2h0IGFjY2VwdC5cbiAgICBjb25zdCByZW1vdGVTZWNyZXROYW1lcyA9IGFyZ3YuZHJ5UnVuXG4gICAgICA/IFtdXG4gICAgICA6IGF3YWl0IGxpc3RSZW1vdGVXb3JrZXJTZWNyZXROYW1lcyhwcm9qZWN0LCBhcmd2LCB3cmFuZ2xlckNvbmZpZ1BhdGgsIHJlc29sdmVkQ29uZmlnLCBlbnZOYW1lKTtcbiAgICBjb25zdCBpbmhlcml0ZWRTZWNyZXROYW1lcyA9IHNlbGVjdEluaGVyaXRlZFJlbW90ZVNlY3JldE5hbWVzKFxuICAgICAgcmVtb3RlU2VjcmV0TmFtZXMgPz8gW10sXG4gICAgICBzZWNyZXRzLFxuICAgICAgdmFyRW50cmllcy5tYXAoKFtrZXldKSA9PiBrZXkpLFxuICAgICAgcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzXG4gICAgKTtcbiAgICBjb25zdCBjb21iaW5lZENvdW50ID1cbiAgICAgIG5ldyBTZXQoWy4uLnNlY3JldEtleXMsIC4uLnZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KV0pLnNpemUgKyBpbmhlcml0ZWRTZWNyZXROYW1lcy5sZW5ndGg7XG4gICAgY29uc3QgaW5oZXJpdGVkTm90ZSA9XG4gICAgICBpbmhlcml0ZWRTZWNyZXROYW1lcy5sZW5ndGggPiAwXG4gICAgICAgID8gYCAoaW5jbHVkaW5nICR7aW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RofSByZW1vdGUgc2VjcmV0cyBrZXB0IGZyb20gdGhlIHByZXZpb3VzIHZlcnNpb246ICR7aW5oZXJpdGVkU2VjcmV0TmFtZXMuam9pbignLCAnKX0pYFxuICAgICAgICA6ICcnO1xuICAgIGlmIChjb21iaW5lZENvdW50ID4gMTI4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYENsb3VkZmxhcmUgYWxsb3dzIGF0IG1vc3QgMTI4IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBjb21iaW5lZCwgYnV0ICR7Y29tYmluZWRDb3VudH0gd2VyZSBzZWxlY3RlZCR7aW5oZXJpdGVkTm90ZX0uYFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDY0KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgJHtjb21iaW5lZENvdW50fSB2YXJpYWJsZXMgYW5kIHNlY3JldHMke2luaGVyaXRlZE5vdGV9IGV4Y2VlZCB0aGUgRnJlZSBwbGFuJ3MgbGltaXQgb2YgNjQuYClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgIGBEZXBsb3lpbmcgJHtyZXNvbHZlZENvbmZpZy53b3JrZXJOYW1lID8/IHByb2plY3QubmFtZX0gKCR7ZW52TmFtZX0pIHdpdGggJHtzZWNyZXRLZXlzLmxlbmd0aH0gc2VjcmV0czogJHtzZWNyZXRLZXlzLmpvaW4oJywgJyl9YFxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyAyLiBCdWlsZCAodmluZXh0IGVtYmVkcyB0aGUgZW52aXJvbm1lbnQtYXBwbGllZCB3cmFuZ2xlciBjb25maWcgaW50byBkaXN0L3NlcnZlci93cmFuZ2xlci5qc29uKS5cbiAgICAvLyAgICBCdWlsZGluZyBiZWZvcmUgbWlncmF0aW5nIGtlZXBzIGEgYnVpbGQgZmFpbHVyZSBmcm9tIGxlYXZpbmcgYSBtaWdyYXRlZCBzY2hlbWEgYmVoaW5kXG4gICAgLy8gICAgdGhlIG9sZCBXb3JrZXIuIFBsYWluIFdvcmtlcnMgaGF2ZSBubyBidWlsZCBzdGVwOyB3cmFuZ2xlciBidW5kbGVzIHRoZSBlbnRyeSBpdHNlbGYuXG4gICAgY29uc3QgaXNWaW5leHQgPSAhIShwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udmluZXh0ID8/IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aW5leHQpO1xuICAgIGNvbnN0IGRlcGxveUNvbmZpZ1BhdGggPSBpc1ZpbmV4dCA/IHBhdGguam9pbignZGlzdCcsICdzZXJ2ZXInLCAnd3JhbmdsZXIuanNvbicpIDogd3JhbmdsZXJDb25maWdQYXRoO1xuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZBc3NpZ25tZW50ID0gcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb25cbiAgICAgID8gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnQ0xPVURGTEFSRV9FTlYnLCBlbnZOYW1lKX0gYFxuICAgICAgOiAnJztcbiAgICBpZiAoaXNWaW5leHQpIHtcbiAgICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OKSB7XG4gICAgICAgIHByb2plY3QuZW52Lk5FWFRfUFVCTElDX1dCX1ZFUlNJT04gfHw9IHByb2plY3QuZW52LldCX1ZFUlNJT047XG4gICAgICB9XG4gICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdZQVJOIHJ1biBnZW4tY29kZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke2Nsb3VkZmxhcmVFbnZBc3NpZ25tZW50fVlBUk4gdmluZXh0IGJ1aWxkYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAvLyBPbiBkcnkgcnVucyB0aGUgdmluZXh0IGJ1aWxkIGFib3ZlIGlzIGEgcHJpbnRlZCBuby1vcCwgc28gdGhlIGJ1aWx0IGNvbmZpZyBpc1xuICAgICAgLy8gbGVnaXRpbWF0ZWx5IGFic2VudCBhbmQgbXVzdCBub3QgYWJvcnQgdGhlIHJ1bi5cbiAgICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGVwbG95Q29uZmlnUGF0aCkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGAke2RlcGxveUNvbmZpZ1BhdGh9IG5vdCBmb3VuZDsgdGhlIHZpbmV4dCBidWlsZCBkaWQgbm90IHByb2R1Y2UgYSBkZXBsb3kgY29uZmlnLmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgLy8gV3JhbmdsZXIgdmFsaWRhdGVzIGl0cyBjb25maWcgc2NoZW1hIG9ubHkgd2hlbiBpdCBydW5zLCBzbyBhIGRyeSBydW4gb2YgdGhlIGJ1aWx0XG4gICAgICAvLyBjb25maWcgc3VyZmFjZXMgY29uZmlnIGFuZCBidW5kbGUgZXJyb3JzIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnMgYmVsb3cgbXV0YXRlXG4gICAgICAvLyB0aGUgZGF0YWJhc2UsIG1pcnJvcmluZyB0aGUgcGxhaW4tV29ya2VyIGRyeSBydW4uIE5vIC0tZW52OiB0aGUgYnVpbHQgY29uZmlnIGFscmVhZHlcbiAgICAgIC8vIGhhcyB0aGUgZW52aXJvbm1lbnQgYXBwbGllZC5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgYFlBUk4gd3JhbmdsZXIgZGVwbG95IC0tZHJ5LXJ1biAtLWNvbmZpZyAke3NoZWxsRXNjYXBlQXJndW1lbnQoZGVwbG95Q29uZmlnUGF0aCl9YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGxhaW4gV29ya2VycyBhcmUgZmlyc3QgY29tcGlsZWQgYnkgd3JhbmdsZXIgZHVyaW5nIHRoZSBkZXBsb3kgaXRzZWxmOyBhIGRyeSBydW5cbiAgICAgIC8vIHN1cmZhY2VzIGNvbXBpbGUgZXJyb3JzIChlLmcuIGEgbWlzc2luZyBlbnRyeSBwb2ludCkgQkVGT1JFIHRoZSByZW1vdGUgbWlncmF0aW9uc1xuICAgICAgLy8gYmVsb3cgbXV0YXRlIHRoZSBkYXRhYmFzZS5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgYFlBUk4gd3JhbmdsZXIgZGVwbG95IC0tZHJ5LXJ1biAtLWNvbmZpZyAke3NoZWxsRXNjYXBlQXJndW1lbnQod3JhbmdsZXJDb25maWdQYXRoKX0ke3Jlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gYCAtLWVudiAke3NoZWxsRXNjYXBlQXJndW1lbnQoZW52TmFtZSl9YCA6ICcnfWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gQXBwbHkgRDEgbWlncmF0aW9ucyB0byB0aGUgcmVtb3RlIGRhdGFiYXNlIHdpdGggdGhlIHByb2plY3QncyBzaW5nbGUgbWlncmF0aW9uXG4gICAgLy8gICAgbWVjaGFuaXNtICh3cmFuZ2xlci1uYXRpdmUgd2hlbiBhIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGV4aXN0cywgZWxzZSBkcml6emxlLWtpdCB3aGVuXG4gICAgLy8gICAgdGhlIGRyaXp6bGUgY29uZmlnIHRhcmdldHMgc3FsaXRlL2QxLWh0dHAvZHVyYWJsZS1zcWxpdGUpLiBNaWdyYXRpb25zIG11c3QgYmUgYmFja3dhcmRcbiAgICAvLyAgICBjb21wYXRpYmxlOiB0aGUgb2xkIFdvcmtlciBzZXJ2ZXNcbiAgICAvLyAgICB0cmFmZmljIHVudGlsIHRoZSBkZXBsb3kgYmVsb3cuXG4gICAgY29uc3QgZW52T3B0aW9uID0gcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBgIC0tZW52ICR7c2hlbGxFc2NhcGVBcmd1bWVudChlbnZOYW1lKX1gIDogJyc7XG4gICAgZm9yIChjb25zdCBkYXRhYmFzZSBvZiB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKSB7XG4gICAgICBjb25zdCBkYXRhYmFzZU5hbWUgPSBkYXRhYmFzZS5kYXRhYmFzZV9uYW1lID8/IGRhdGFiYXNlLmJpbmRpbmc7XG4gICAgICBpZiAoIWRhdGFiYXNlTmFtZSkgY29udGludWU7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBDST10cnVlIFlBUk4gd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseSAke3NoZWxsRXNjYXBlQXJndW1lbnQoZGF0YWJhc2VOYW1lKX0gLS1yZW1vdGUgLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtlbnZPcHRpb259YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRyaXp6bGVEMURhdGFiYXNlKSB7XG4gICAgICBpZiAoIWRyaXp6bGVEMURhdGFiYXNlLmRhdGFiYXNlX2lkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBUaGUgJHtlbnZOYW1lfSBEMSBiaW5kaW5nIGhhcyBubyBkYXRhYmFzZV9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFhY2NvdW50SWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAnQ0xPVURGTEFSRV9BQ0NPVU5UX0lEIChvciBhY2NvdW50X2lkIGluIHRoZSB3cmFuZ2xlciBjb25maWcpIGlzIHJlcXVpcmVkIGZvciByZW1vdGUgZHJpenpsZS1raXQgbWlncmF0aW9ucy4nXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAnbWlncmF0ZScsXG4gICAgICAgICAgYENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ9JHtkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZH0gQ0xPVURGTEFSRV9BQ0NPVU5UX0lEPSR7YWNjb3VudElkfWBcbiAgICAgICAgKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA0LiBEZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5IChubyBwb3N0LWRlcGxveSBzZWNyZXQgcHVzaCB0aGF0IGNvdWxkIGxlYXZlIHRoZVxuICAgIC8vICAgIG5ldyB2ZXJzaW9uIHJ1bm5pbmcgd2l0aG91dCDigJQgb3Igd2l0aCBzdGFsZSDigJQgc2VjcmV0cykuIFRoZSBzZWNyZXRzIEpTT04gZ29lcyB0aHJvdWdoXG4gICAgLy8gICAgYSBtb2RlLTA2MDAgZmlsZSBpbiBhIHByaXZhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBkZWxldGVkIHJpZ2h0IGFmdGVyIHRoZSBkZXBsb3k6XG4gICAgLy8gICAgL2Rldi9zdGRpbiBpcyBOT1QgcmVsaWFibGUgaGVyZSBiZWNhdXNlIHdyYW5nbGVyIHJlYWRzIHRoZSBzZWNyZXRzIGZpbGUgb25seSBhZnRlclxuICAgIC8vICAgIHVwbG9hZGluZyBhc3NldHMsIGJ5IHdoaWNoIHBvaW50IHRoZSBwaXBlZCBzdGRpbiBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY29uc3VtZWQg4oCUXG4gICAgLy8gICAgb2JzZXJ2ZWQgYXMgYSBmbGFreSBgQ291bGQgbm90IHJlYWQgZmlsZTogL2Rldi9zdGRpbmAgb24gQ0kuIEV4cGxpY2l0bHkgZW1wdHkgdmFsdWVzXG4gICAgLy8gICAgc3RheSBpbiB0aGUgcGF5bG9hZDogLS1zZWNyZXRzLWZpbGUgaXMgYWRkaXRpdmUsIHNvIHB1c2hpbmcgJycgaXMgdGhlIG9ubHkgd2F5IHRvXG4gICAgLy8gICAgY2xlYXIgYSBzdGFsZSBzZWNyZXQuXG4gICAgY29uc3QgZGVwbG95QXJncyA9IFtcbiAgICAgICdkZXBsb3knLFxuICAgICAgJy0tY29uZmlnJyxcbiAgICAgIGRlcGxveUNvbmZpZ1BhdGgsXG4gICAgICAvLyB2aW5leHQncyBidWlsdCBjb25maWcgYWxyZWFkeSBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQ7IHBhc3NpbmcgLS1lbnYgdGhlcmUgd291bGRcbiAgICAgIC8vIGFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXggdHdpY2UuXG4gICAgICAuLi4oIWlzVmluZXh0ICYmIHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gWyctLWVudicsIGVudk5hbWVdIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuZW52LldCX1ZFUlNJT04gPyBbJy0tdmFyJywgYFdCX1ZFUlNJT046JHtwcm9qZWN0LmVudi5XQl9WRVJTSU9OfWBdIDogW10pLFxuICAgICAgJy0tc2VjcmV0cy1maWxlJyxcbiAgICBdO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2RlcGxveUFyZ3Muam9pbignICcpfSA8dGVtcG9yYXJ5IHNlY3JldHMgZmlsZT5gKSk7XG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgcHJlcGFyZUxvY2FsQmluUGF0aChwcm9qZWN0KTtcbiAgICAgIGNvbnN0IGRlcGxveUVudiA9IHsgLi4ucHJvamVjdC5lbnYgfTtcbiAgICAgIGRlbGV0ZSBkZXBsb3lFbnYuQ0xPVURGTEFSRV9FTlY7XG4gICAgICAvLyAwbzcwMCBkaXJlY3RvcnkgKyAwbzYwMCBmaWxlOiByZWFkYWJsZSBvbmx5IGJ5IHRoZSBkZXBsb3lpbmcgdXNlciwgbGlrZSB0aGUgZG90ZW52XG4gICAgICAvLyBmaWxlcyB0aGUgQ0kgd29ya2Zsb3cgYWxyZWFkeSB3cml0ZXMgbmV4dCB0byBpdC4gd3JhbmdsZXIgcnVucyB0aHJvdWdoIGFuIGFzeW5jIHNwYXduXG4gICAgICAvLyAoc3Bhd25TeW5jIHdvdWxkIGJsb2NrIHRoZSBldmVudCBsb29wLCBzbyBhIHNodXRkb3duIHNpZ25hbCB3b3VsZCBraWxsIHRoZSBwcm9jZXNzXG4gICAgICAvLyBiZWZvcmUgYW55IGNsZWFudXApIGFuZCB0aGUgZGlyZWN0b3J5IGlzIHJlbW92ZWQgaW4gYSBmaW5hbGx5LCBzbyBhbiBpbnRlcnJ1cHRlZFxuICAgICAgLy8gZGVwbG95IGNhbm5vdCBsZWF2ZSB0aGUgcGxhaW50ZXh0IHNlY3JldHMgYmVoaW5kLiBTaHV0ZG93biBoYW5kbGluZyBkZXRhaWxzOlxuICAgICAgLy8gLSBIYW5kbGVycyAoaW5jbHVkaW5nIFNJR0hVUCwgb24gd2hpY2ggTm9kZSBhbHNvIHRlcm1pbmF0ZXMgYnkgZGVmYXVsdCkgYXJlIGluc3RhbGxlZFxuICAgICAgLy8gICBCRUZPUkUgdGhlIGZpbGUgaXMgd3JpdHRlbiBhbmQgdXNlIHByb2Nlc3Mub24sIG5vdCBvbmNlLCBzbyBhIHJlcGVhdGVkIHNpZ25hbCBjYW5ub3RcbiAgICAgIC8vICAgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdGVybWluYXRpb24gYW5kIGJ5cGFzcyB0aGUgZmluYWxseSBjbGVhbnVwLlxuICAgICAgLy8gLSBTSUdIVVAvU0lHUVVJVCBhcmUgZm9yd2FyZGVkIHRvIHdyYW5nbGVyIGFzIFNJR1RFUk06IHdyYW5nbGVyJ3MgbGF1bmNoZXIgcmVsYXlzIG9ubHlcbiAgICAgIC8vICAgU0lHSU5UL1NJR1RFUk0gdG8gaXRzIGlubmVyIE5vZGUgcHJvY2VzcywgYW5kIGFueXRoaW5nIGVsc2Ugd291bGQgb3JwaGFuIGEgZGVwbG95bWVudFxuICAgICAgLy8gICB0aGF0IGtlZXBzIG11dGF0aW5nIHRoZSByZW1vdGUgV29ya2VyIGFmdGVyIHdiIGV4aXRzLlxuICAgICAgLy8gLSBUaGUgcmUtcmFpc2UgYmVsb3cgdXNlcyB0aGUgc2lnbmFsIHdiIGl0c2VsZiByZWNlaXZlZDogd3JhbmdsZXIgY2F0Y2hlcyBTSUdJTlQgYW5kXG4gICAgICAvLyAgIGV4aXRzIG51bWVyaWNhbGx5IChlLmcuIDE0MyksIHdoaWNoIG11c3Qgbm90IG1hc3F1ZXJhZGUgYXMgYW4gb3JkaW5hcnkgZmFpbHVyZS5cbiAgICAgIGNvbnN0IHNlY3JldHNEaXJQYXRoID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnd2ItZGVwbG95LScpKTtcbiAgICAgIGNvbnN0IHNodXRkb3duU2lnbmFscyA9IFsnU0lHSFVQJywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSBhcyBjb25zdDtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGxldCB3cmFuZ2xlclByb2Nlc3M6IFJldHVyblR5cGU8dHlwZW9mIHNwYXduPiB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCByZWNlaXZlZFNodXRkb3duU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNodXRkb3duU2lnbmFscykge1xuICAgICAgICBjb25zdCBzaWduYWxIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHJlY2VpdmVkU2h1dGRvd25TaWduYWwgPz89IHNpZ25hbDtcbiAgICAgICAgICBpZiAod3JhbmdsZXJQcm9jZXNzKSB7XG4gICAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mua2lsbChzaWduYWwgPT09ICdTSUdJTlQnIHx8IHNpZ25hbCA9PT0gJ1NJR1RFUk0nID8gc2lnbmFsIDogJ1NJR1RFUk0nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mub2ZmKHNodXRkb3duU2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgLy8gV2l0aCB0aGUgaGFuZGxlcnMgcmVtb3ZlZCwgcmUtcmFpc2luZyB0cmlnZ2VycyB0aGUgZGVmYXVsdCBiZWhhdmlvci5cbiAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgICB9XG4gICAgICBsZXQgZGVwbG95U3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZWNyZXRzRmlsZVBhdGggPSBwYXRoLmpvaW4oc2VjcmV0c0RpclBhdGgsICdzZWNyZXRzLmpzb24nKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhzZWNyZXRzRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNlY3JldHMpLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgICAgICBkZXBsb3lTdGF0dXMgPSBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgd3JhbmdsZXJQcm9jZXNzID0gc3Bhd24oJ3dyYW5nbGVyJywgWy4uLmRlcGxveUFyZ3MsIHNlY3JldHNGaWxlUGF0aF0sIHtcbiAgICAgICAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICAgICAgZW52OiBkZXBsb3lFbnYgYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAnaW5oZXJpdCcsICdpbmhlcml0J10sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZXNvbHZlKDEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc2lnbmFsID8gMSA6IChjb2RlID8/IHVuZGVmaW5lZCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIHByb2Nlc3MuZXhpdCBza2lwcyBmaW5hbGx5IGJsb2Nrcywgc28gdGhlIGV4aXQtb24tZmFpbHVyZSBiZWxvdyBzdGF5cyBvdXRzaWRlLlxuICAgICAgICBmb3IgKGNvbnN0IFtzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKHNlY3JldHNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBpZiAocmVjZWl2ZWRTaHV0ZG93blNpZ25hbCkge1xuICAgICAgICAvLyBSZS1yYWlzZSBzbyB0aGUgY2FsbGVyIG9ic2VydmVzIHRoZSBzYW1lIHNpZ25hbC1kZXJpdmVkIGV4aXQgc3RhdHVzLlxuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHJlY2VpdmVkU2h1dGRvd25TaWduYWwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGVwbG95U3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGB3cmFuZ2xlciBkZXBsb3kgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7ZGVwbG95U3RhdHVzID8/ICd1bmtub3duJ30uYCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoZGVwbG95U3RhdHVzID8/IDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIE9wdGlvbmFsIHBvc3QtZGVwbG95IGhvb2sgKGUuZy4gc2VlZGluZyB0aGUgcmVtb3RlIEQxIHZpYSBkcml6emxlJ3MgZDEtaHR0cCBkcml2ZXIpLlxuICAgIC8vICAgIEFzc2lnbiB0aGUgcmVzb2x2ZWQgaWRzIHVuY29uZGl0aW9uYWxseTogYSBzdGFsZSBleHBvcnRlZCBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEXG4gICAgLy8gICAgbXVzdCBub3QgcmVkaXJlY3QgdGhlIGhvb2sgdG8gYW5vdGhlciBkYXRhYmFzZS5cbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RlcGxveS9wb3N0J10pIHtcbiAgICAgIC8vIFRoZSBpZCBpcyB1bmFtYmlndW91cyBvbmx5IHdpdGggYSBzaW5nbGUgRDEgYmluZGluZzsgd2l0aCBtdWx0aXBsZSwgdGhlIGhvb2sgbXVzdFxuICAgICAgLy8gcmVzb2x2ZSBpdHMgdGFyZ2V0IGl0c2VsZi4gQ2xlYXIgZmlyc3QgZWl0aGVyIHdheTogYSBzdGFsZSBpbmhlcml0ZWQgaWQgbXVzdCBub3RcbiAgICAgIC8vIHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgICBjb25zdCBob29rRDFEYXRhYmFzZTogV3JhbmdsZXJEMURhdGFiYXNlIHwgdW5kZWZpbmVkID1cbiAgICAgICAgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID09PSAxID8gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgICBkZWxldGUgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRDtcbiAgICAgIGlmIChyZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coJ011bHRpcGxlIEQxIGJpbmRpbmdzIGV4aXN0OyBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEIGlzIG5vdCBzZXQgZm9yIGRlcGxveS9wb3N0LicpKTtcbiAgICAgIH1cbiAgICAgIGlmIChob29rRDFEYXRhYmFzZT8uZGF0YWJhc2VfaWQpIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgPSBob29rRDFEYXRhYmFzZS5kYXRhYmFzZV9pZDtcbiAgICAgIGlmIChhY2NvdW50SWQpIHByb2plY3QuZW52LkNMT1VERkxBUkVfQUNDT1VOVF9JRCA9IGFjY291bnRJZDtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZGVwbG95L3Bvc3QnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIFJlYWQgdGhlIENsb3VkZmxhcmUgQVBJIHRva2VuIHRoYXQgQ0kgZHJvcHMgaW4gYSBgLmVudi5jbG91ZGZsYXJlYCBmaWxlIChlLmcuIHRoZSByZXVzYWJsZVxuICogZGVwbG95IHdvcmtmbG93J3MgYGZpbGVfcGF0aF8xYCksIGxvb2tpbmcgYmVzaWRlIHRoZSBXb3JrZXIncyB3cmFuZ2xlciBjb25maWcgYW5kIGF0IHRoZVxuICogbW9ub3JlcG8gcm9vdCDigJQgYGZpbGVfcGF0aF8xYCBpcyByZXBvLXJlbGF0aXZlLCBzbyBib3RoIHNwZWxsaW5ncyBvY2N1ciBpbiBwcmFjdGljZS5cbiAqIE5lYXJlciBmaWxlcyB3aW4sIG1pcnJvcmluZyB0aGUgYC5lbnZgIGNhc2NhZGU6IGEgd29ya3NwYWNlIG1heSBvdmVycmlkZSB0aGUgcm9vdCB0b2tlbixcbiAqIG5ldmVyIHRoZSByZXZlcnNlLiBQYXNzIGByb290RGlyUGF0aGAgYXMgdW5kZWZpbmVkIHRvIHJlYWQgdGhlIHdvcmtzcGFjZSBhbG9uZSwgc28gdGhhdFxuICogYC0taW5jbHVkZS1yb290LWVudj1mYWxzZWAgaXNvbGF0ZXMgdGhpcyBmaWxlIGZyb20gdGhlIHJvb3QganVzdCBhcyBpdCBkb2VzIHRoZSBjYXNjYWRlLlxuICogYENMT1VERkxBUkVfRU5WYCBpcyBkcm9wcGVkOyBpdCB3b3VsZCBkb3VibGUtYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDbG91ZGZsYXJlRW52RmlsZXMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBjdXJyZW50RGlyUGF0aCBvZiBuZXcgU2V0KHJvb3REaXJQYXRoID8gW2RpclBhdGgsIHJvb3REaXJQYXRoXSA6IFtkaXJQYXRoXSkpIHtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJy5lbnYuY2xvdWRmbGFyZScpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjbG91ZGZsYXJlRW52UGF0aCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IGNsb3VkZmxhcmVFbnZQYXRoLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdDTE9VREZMQVJFX0VOVicpIGNvbnRpbnVlO1xuICAgICAgZW52VmFyc1trZXldID8/PSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogU2VsZWN0IHRoZSBzZWNyZXRzIHRvIHB1c2ggdG8gdGhlIFdvcmtlciBmcm9tIHRoZSBkb3RlbnYtbG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIGV2ZXJ5IGV4cGxpY2l0bHkgc2V0IHZhbHVlIOKAlCBpbmNsdWRpbmcgZW1wdHkgc3RyaW5ncywgd2hpY2ggY2xlYXIgc3RhbGUgcmVtb3RlIHNlY3JldHNcbiAqIHNpbmNlIGB3cmFuZ2xlciBkZXBsb3kgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlIOKAlCBleGNlcHQgd3JhbmdsZXIgYHZhcnNgIChhIHNlY3JldCBtYXlcbiAqIG5vdCBzaGFyZSBhIG5hbWUgd2l0aCBhIHZhciksIGRlcGxveS1jb250cm9sIGtleXMsIGFuZCBsb2NhbCBgZmlsZTpgIERBVEFCQVNFX1VSTHMuXG4gKiBSZXR1cm5zIHRoZSByZXF1aXJlZCBrZXlzIChmcm9tIC5lbnYuZXhhbXBsZSkgdGhhdCBhcmUgc3RpbGwgZW1wdHkgc28gdGhlIGRlcGxveSBjYW5cbiAqIGFib3J0IGJlZm9yZSBhbnkgcmVtb3RlIG11dGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0V29ya2VyU2VjcmV0cyhcbiAgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgY29uZmlnVmFyS2V5czogc3RyaW5nW10sXG4gIHJlcXVpcmVkS2V5czogc3RyaW5nW11cbik6IHsgbWlzc2luZ0tleXM6IHN0cmluZ1tdOyBzZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0ge1xuICBjb25zdCBjb25maWdLZXlzID0gbmV3IFNldChjb25maWdWYXJLZXlzKTtcbiAgY29uc3Qgc2VjcmV0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAvLyBObyBydW50aW1lIHVuZGVmaW5lZCBjaGVjayBvbiBgdmFsdWVgOiBlbnZWYXJzIGlzIGJ1aWx0IGV4Y2x1c2l2ZWx5IGZyb20gZG90ZW52LXBhcnNlZFxuICAvLyBzdHJpbmdzLCBhbmQgZXZlcnkgY2FsbGVyLXNpZGUgbWVyZ2UgZWl0aGVyIGNvYWxlc2NlcyB3aXRoIGA/PyAnJ2Agb3IgZ3VhcmRzIGFnYWluc3RcbiAgLy8gdW5kZWZpbmVkIGJlZm9yZSBhc3NpZ25pbmcsIHNvIHRoZSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHR5cGUgaG9sZHMgYXQgcnVudGltZSB0b28uXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKGNvbmZpZ0tleXMuaGFzKGtleSkgfHwgaXNOb25TZWNyZXRLZXkoa2V5KSkgY29udGludWU7XG4gICAgaWYgKGtleSA9PT0gJ0RBVEFCQVNFX1VSTCcgJiYgdmFsdWUuc3RhcnRzV2l0aCgnZmlsZTonKSkgY29udGludWU7XG4gICAgc2VjcmV0c1trZXldID0gdmFsdWU7XG4gIH1cbiAgY29uc3QgbWlzc2luZ0tleXMgPSByZXF1aXJlZEtleXMuZmlsdGVyKChrZXkpID0+ICFjb25maWdLZXlzLmhhcyhrZXkpICYmICFpc05vblNlY3JldEtleShrZXkpICYmICFlbnZWYXJzW2tleV0pO1xuICByZXR1cm4geyBtaXNzaW5nS2V5cywgc2VjcmV0cyB9O1xufVxuXG4vKipcbiAqIExpc3QgdGhlIHNlY3JldCBuYW1lcyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gdGhlIGRlcGxveSB0YXJnZXQgV29ya2VyLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuXG4gKiB0aGUgbGlzdGluZyBmYWlscyBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIHRoZSBXb3JrZXIgbm90IGV4aXN0aW5nIHlldCAoZmlyc3QgZGVwbG95KSwgc29cbiAqIHRoZSBjYWxsZXIgY2FuIGRlZ3JhZGUgdG8gdGhlIGxvY2FsLW9ubHkgbGltaXQgY2hlY2tzIGluc3RlYWQgb2YgYmxvY2tpbmcgYSBkZXBsb3kgdGhhdFxuICogd3JhbmdsZXIgaXRzZWxmIG1pZ2h0IGFjY2VwdC4gRmFpbGluZyBjbG9zZWQgaW5zdGVhZCB3b3VsZCB0dXJuIGV2ZXJ5IHRyYW5zaWVudCBsaXN0aW5nXG4gKiBmYWlsdXJlIChuZXR3b3JrLCBhIHRva2VuIHdpdGhvdXQgc2VjcmV0LXJlYWQgcGVybWlzc2lvbikgaW50byBhIGRlcGxveSBibG9ja2VyLCBhbmQg4oCUIHNpbmNlXG4gKiB3cmFuZ2xlciA0LnggcmVwb3J0cyBhIG1pc3NpbmcgV29ya2VyIG9ubHkgdmlhIGFuIGVycm9yLW1lc3NhZ2UgaGludCDigJQgYW55IHVucmVjb2duaXplZFxuICogbm90LWZvdW5kIHNoYXBlIHdvdWxkIHRoZW4gYmxvY2sgZmlyc3QgZGVwbG95cyBlbnRpcmVseTsgdGhpcyBwcmVmbGlnaHQgbXVzdCBvbmx5IGV2ZXIgYWRkXG4gKiBmYWlsdXJlcyB0aGF0IHdyYW5nbGVyIGl0c2VsZiB3b3VsZCByYWlzZSBhZnRlciB0aGUgbWlncmF0aW9ucy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdFJlbW90ZVdvcmtlclNlY3JldE5hbWVzKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBEZXBsb3lDb21tYW5kQXJndixcbiAgd3JhbmdsZXJDb25maWdQYXRoOiBzdHJpbmcsXG4gIHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnLFxuICBlbnZOYW1lOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10gfCB1bmRlZmluZWQ+IHtcbiAgcHJlcGFyZUxvY2FsQmluUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgbGlzdEFyZ3MgPSBbXG4gICAgJ3NlY3JldCcsXG4gICAgJ2xpc3QnLFxuICAgICctLWZvcm1hdCcsXG4gICAgJ2pzb24nLFxuICAgICctLWNvbmZpZycsXG4gICAgd3JhbmdsZXJDb25maWdQYXRoLFxuICAgIC4uLihyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IFsnLS1lbnYnLCBlbnZOYW1lXSA6IFtdKSxcbiAgXTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFJ1bm5pbmc6IHdyYW5nbGVyICR7bGlzdEFyZ3Muam9pbignICcpfWApKTtcbiAgbGV0IHJldDtcbiAgdHJ5IHtcbiAgICByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKCd3cmFuZ2xlcicsIGxpc3RBcmdzLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYgYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgIGBGYWlsZWQgdG8gcnVuIHdyYW5nbGVyIHRvIGxpc3QgcmVtb3RlIHNlY3JldHM7IGNoZWNraW5nIG9ubHkgdGhlIGxvY2FsIHBheWxvYWQgYWdhaW5zdCBDbG91ZGZsYXJlJ3MgbGltaXRzLlxcbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHJldC5zdGF0dXMgPT09IDApIHtcbiAgICAvLyBDdXQgdGhlIEpTT04gYXJyYXkgb3V0IG9mIHRoZSBzdXJyb3VuZGluZyBvdXRwdXQ6IHdyYW5nbGVyIG1heSBwcmludCBpdHMgYmFubmVyIGFuZFxuICAgIC8vIFwiTXVsdGlwbGUgZW52aXJvbm1lbnRzXCIgd2FybmluZ3MgYXJvdW5kIHRoZSBwYXlsb2FkLlxuICAgIGNvbnN0IGpzb25TdGFydCA9IHJldC5zdGRvdXQuaW5kZXhPZignWycpO1xuICAgIGNvbnN0IGpzb25FbmQgPSByZXQuc3Rkb3V0Lmxhc3RJbmRleE9mKCddJyk7XG4gICAgaWYgKGpzb25TdGFydCAhPT0gLTEgJiYganNvbkVuZCAhPT0gLTEgJiYganNvblN0YXJ0IDwganNvbkVuZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyZXQuc3Rkb3V0LnNsaWNlKGpzb25TdGFydCwganNvbkVuZCArIDEpKSBhcyB7IG5hbWU/OiB1bmtub3duIH1bXTtcbiAgICAgICAgcmV0dXJuIHBhcnNlZC5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKS5maWx0ZXIoKG5hbWUpOiBuYW1lIGlzIHN0cmluZyA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byB0aGUgd2FybmluZyBiZWxvdy5cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoL1xcW2NvZGU6IDEwMCgwN3w5MClcXF18SWYgdGhpcyBpcyBhIG5ldyBXb3JrZXIvLnRlc3QocmV0LnN0ZG91dCArIHJldC5zdGRlcnIpKSB7XG4gICAgLy8gVGhlIFdvcmtlciBkb2VzIG5vdCBleGlzdCB5ZXQsIHNvIGEgZmlyc3QgZGVwbG95IGluaGVyaXRzIG5vdGhpbmcuIFdyYW5nbGVyIDQueCBjYXRjaGVzXG4gICAgLy8gdGhlIENsb3VkZmxhcmUgQVBJIGVycm9ycyAxMDAwNyAod29ya2Vycy5hcGkuZXJyb3Iuc2VydmljZV9ub3RfZm91bmQpIGFuZCAxMDA5MFxuICAgIC8vICh3b3JrZXJzLmFwaS5lcnJvci5zY3JpcHRfbm90X2ZvdW5kKSBhbmQgcmV0aHJvd3MgdGhlbSBhcyBhIFVzZXJFcnJvciBjb250YWluaW5nIHRoZVxuICAgIC8vICdJZiB0aGlzIGlzIGEgbmV3IFdvcmtlciwgcnVuIGB3cmFuZ2xlciBkZXBsb3lgIGZpcnN0JyBoaW50IHdpdGhvdXQgdGhlIG51bWVyaWMgY29kZSxcbiAgICAvLyBzbyBtYXRjaCBib3RoIHNoYXBlcy5cbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc29sZS53YXJuKFxuICAgIGNoYWxrLnllbGxvdyhcbiAgICAgIGBGYWlsZWQgdG8gbGlzdCB0aGUgcmVtb3RlIFdvcmtlciBzZWNyZXRzOyBjaGVja2luZyBvbmx5IHRoZSBsb2NhbCBwYXlsb2FkIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGxpbWl0cy5cXG4keyhyZXQuc3RkZXJyIHx8IHJldC5zdGRvdXQpLnRyaW0oKX1gXG4gICAgKVxuICApO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlbW90ZSBzZWNyZXRzIHRoYXQgc3RheSBhdHRhY2hlZCB0byB0aGUgbmV3IHZlcnNpb246IGB3cmFuZ2xlciBkZXBsb3kgLS1zZWNyZXRzLWZpbGVgIGlzXG4gKiBhZGRpdGl2ZSwgc28gZXZlcnkgcmVtb3RlIHNlY3JldCB0aGUgb3V0Z29pbmcgcGF5bG9hZCBkb2VzIG5vdCBvdmVyd3JpdGUga2VlcHMgY291bnRpbmdcbiAqIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIHZhcmlhYmxlK3NlY3JldCBsaW1pdCDigJQgZXhjZXB0IG5hbWVzIHRoYXQgYW4gZWZmZWN0aXZlIHZhciBvclxuICogYmluZGluZyByZXBsYWNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluaGVyaXRlZFJlbW90ZVNlY3JldE5hbWVzKFxuICByZW1vdGVTZWNyZXROYW1lczogc3RyaW5nW10sXG4gIG91dGdvaW5nU2VjcmV0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgZWZmZWN0aXZlVmFyS2V5czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGJpbmRpbmdOYW1lczogcmVhZG9ubHkgc3RyaW5nW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVwbGFjZWROYW1lcyA9IG5ldyBTZXQoWy4uLmVmZmVjdGl2ZVZhcktleXMsIC4uLmJpbmRpbmdOYW1lc10pO1xuICByZXR1cm4gcmVtb3RlU2VjcmV0TmFtZXMuZmlsdGVyKChuYW1lKSA9PiAhT2JqZWN0Lmhhc093bihvdXRnb2luZ1NlY3JldHMsIG5hbWUpICYmICFyZXBsYWNlZE5hbWVzLmhhcyhuYW1lKSk7XG59XG5cbi8qKlxuICogUmVhZGluZyBiaW5FeGlzdHMgcHJlcGVuZHMgbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8gcHJvamVjdC5lbnYuUEFUSCxcbiAqIHNvIHRoZSBkaXJlY3QgKG5vbi1zaGVsbCkgd3JhbmdsZXIgc3Bhd25zIHJlc29sdmUgdGhlIGxvY2FsIGJpbmFyeS5cbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUxvY2FsQmluUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGlmICghcHJvamVjdC5iaW5FeGlzdHMpIHtcbiAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdub2RlX21vZHVsZXMvLmJpbiBub3QgZm91bmQ7IHJlbHlpbmcgb24gUEFUSCB0byByZXNvbHZlIHdyYW5nbGVyLicpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcywgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuaW50ZXJmYWNlIFBhcnNlZERvdGVudkFyZ3Mge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbn1cblxuY29uc3Qgc2h1dGRvd25TaWduYWxzID0gbmV3IFNldDxOb2RlSlMuU2lnbmFscz4oWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pO1xuXG5leHBvcnQgY29uc3QgZG90ZW52Q29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ2RvdGVudiBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnTG9hZCAuZW52IGZpbGVzIGFuZCBydW4gYSBjb21tYW5kLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT4geWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgcnVuUGFyc2VkRG90ZW52Q29tbWFuZChnZXRQYXJzZWREb3RlbnZBcmdzRnJvbVlhcmdzKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Eb3RlbnZDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1blBhcnNlZERvdGVudkNvbW1hbmQocGFyc2VEb3RlbnZBcmdzKGFyZ3MpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFyc2VkRG90ZW52Q29tbWFuZCh7IGNvbW1hbmQgfTogUGFyc2VkRG90ZW52QXJncyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY29tbWFuZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdVc2FnZTogd2IgZG90ZW52IC0tIDxjb21tYW5kPiBbYXJncy4uLl0nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBjd2QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSk7XG4gIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCk7XG4gIGNvbnN0IGJlcnJ5QmluRm9sZGVyUGF0aCA9IHByb2Nlc3MuZW52LkJFUlJZX0JJTl9GT0xERVI7XG4gIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIC8vIFN0cmlwcGluZyB5YXJuJ3MgZW52aXJvbm1lbnQgYWxzbyByZW1vdmVzIGl0cyB0ZW1wb3JhcnkgYmluIGZvbGRlciDigJQgdGhlIE9OTFkgcGxhY2VcbiAgLy8geWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMg4oCUIHNvIHJlc3RvcmUgdGhlIHByb2plY3QncyBvd25cbiAgLy8gbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8ga2VlcCBiYXJlIGJpbmFyeSBuYW1lcyByZXNvbHZhYmxlLiBQbHVnJ24nUGxheSBpbnN0YWxsc1xuICAvLyBjcmVhdGUgbm8gbm9kZV9tb2R1bGVzIGF0IGFsbDsgdGhlIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGlzIHRoZW4gdGhlIHNvbGUgc291cmNlIG9mXG4gIC8vIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMsIHNvIHJlc3RvcmUgaXQgaW5zdGVhZC5cbiAgLy8gVGhlIHRlbXBvcmFyeSBmb2xkZXIgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZXN0b3JlZCB3aGVuIC5iaW4gZGlyZWN0b3JpZXMgZXhpc3Q6IGl0IGFsc29cbiAgLy8gY29udGFpbnMgbm9kZS95YXJuIHNoaW1zLCBhbmQgYSBsZWFrZWQgbm9kZSBzaGltIHdvdWxkIHZpb2xhdGUgd2IncyByZWFsLU5vZGUgZ3VhcmFudGVlXG4gIC8vIGZvciB0b29scyBsaWtlIHdyYW5nbGVyL3ZpbmV4dC4gQ2hpbGQgYHlhcm5gIGludm9jYXRpb25zIHN0YXkgcmVzb2x2YWJsZSB0aHJvdWdoIHRoZVxuICAvLyBsYXVuY2hlciBvbiB0aGUgYmFzZSBQQVRIIChtaXNlL2NvcmVwYWNrKSwgd2hpY2ggZXZlcnkgc3VwcG9ydGVkIGVudmlyb25tZW50IGhhcyDigJRcbiAgLy8gbm90aGluZyBjb3VsZCBoYXZlIHN0YXJ0ZWQgYHlhcm4gcnVuYC9gd2IgZG90ZW52YCB3aXRob3V0IGl0LlxuICBpZiAoIXByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChjd2QsIHByb2Nlc3MuZW52KSAmJiBiZXJyeUJpbkZvbGRlclBhdGgpIHtcbiAgICBwcm9jZXNzLmVudi5QQVRIID0gcHJvY2Vzcy5lbnYuUEFUSCA/IGAke2JlcnJ5QmluRm9sZGVyUGF0aH06JHtwcm9jZXNzLmVudi5QQVRIfWAgOiBiZXJyeUJpbkZvbGRlclBhdGg7XG4gIH1cblxuICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgY3dkLFxuICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2h1dGRvd25TaWduYWxzKSB7XG4gICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNoaWxkLmtpbGwoc2lnbmFsKTtcbiAgICB9O1xuICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgIHByb2Nlc3Mub25jZShzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICB9XG4gIGNoaWxkLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgIH1cbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAvLyBSZS1yYWlzZSBldmVuIGZvciBmb3J3YXJkZWQgc2h1dGRvd24gc2lnbmFscyBzbyBjYWxsZXJzIG9ic2VydmUgdGhlIGNvbnZlbnRpb25hbFxuICAgICAgLy8gc2lnbmFsIGV4aXQgc3RhdHVzIChlLmcuIDEzMCBmb3IgU0lHSU5UKSBpbnN0ZWFkIG9mIGEgbWlzbGVhZGluZyBzdWNjZXNzLlxuICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoY29kZSA/PyAxKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFBhcnNlZERvdGVudkFyZ3NGcm9tWWFyZ3MoYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlKTogUGFyc2VkRG90ZW52QXJncyB7XG4gIHJldHVybiB7XG4gICAgY29tbWFuZDogW1xuICAgICAgLi4uKChhcmd2LmFyZ3MgYXMgdW5rbm93bltdIHwgdW5kZWZpbmVkKSA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgICAuLi4oKGFyZ3ZbJy0tJ10gYXMgdW5rbm93bltdIHwgdW5kZWZpbmVkKSA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEb3RlbnZBcmdzKGFyZ3M6IHN0cmluZ1tdKTogUGFyc2VkRG90ZW52QXJncyB7XG4gIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gYXJncy5pbmRleE9mKCctLScpO1xuICByZXR1cm4geyBjb21tYW5kOiBzZXBhcmF0b3JJbmRleCA9PT0gLTEgPyBhcmdzIDogYXJncy5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpIH07XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhcmRXYkVudih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmaXhUYXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoXG4gICAgIXZhbHVlIHx8XG4gICAgWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddLmluY2x1ZGVzKHZhbHVlKSB8fFxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHxcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmVycm9yKFxuICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7dmFsdWV9XCIuIGAgK1xuICAgICAgYEZpeCAke2ZpeFRhcmdldH0sIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuLy8gTk9URTogYHdiIGRvdGVudmAgZGVsaWJlcmF0ZWx5IHNraXBzIFByb2plY3QuZW52J3MgZnVsbCB2YWxpZGF0aW9uOiBpdCBpcyBhIGdlbmVyaWMgcnVubmVyIGFsc29cbi8vIHVzZWQgYmVmb3JlIGVudiBzb3VyY2VzIGV4aXN0IChib290c3RyYXApIGFuZCBtdXN0IG5vdCBmYWlsIGZhc3QgZm9yIHJlcG9zaXRvcmllcyB0aGF0IGhhdmUgbm90XG4vLyBhZG9wdGVkIHRoZSBvcmcgZW52IHN0YW5kYXJkLiBBIE5PTi1FTVBUWSBXQl9FTlYgaXMgc3RpbGwgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHN0YW5kYXJkIG1vZGVzLFxuLy8gdGhvdWdoIOKAlCBhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmAgd291bGQgb3RoZXJ3aXNlIHNpbGVudGx5IHNlbGVjdCB0aGUgYmFzZSAoZGV2ZWxvcG1lbnQpIHZhbHVlcy5cbmZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG1vZGUgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gIGNvbnN0IHJlYWRFbnZGaWxlID0gKGZpbGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+XG4gICAgY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKGN3ZCwgZmlsZU5hbWUpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAvLyBNb2RlLXNwZWNpZmljIHNvdXJjZXMgZHJpdmUgdGhlIGZvcmNlZC1tb2RlIG92ZXJyaWRlIGJlbG93LlxuICBjb25zdCBtb2RlVmFycyA9IG1vZGUgPyB7IC4uLnJlYWRFbnZGaWxlKGAuZW52LiR7bW9kZX1gKSwgLi4ucmVhZEVudkZpbGUoYC5lbnYuJHttb2RlfS5sb2NhbGApIH0gOiB7fTtcbiAgLy8gTWlycm9yIHRoZSBzaGFyZWQgY2FzY2FkZSdzIHByZWNlZGVuY2U6IC5lbnYuPG1vZGU+LmxvY2FsID4gLmVudi5sb2NhbCA+IC5lbnYuPG1vZGU+ID4gLmVudi5cbiAgY29uc3QgZG90ZW52VmFycyA9IHtcbiAgICAuLi5yZWFkRW52RmlsZSgnLmVudicpLFxuICAgIC4uLihtb2RlID8gcmVhZEVudkZpbGUoYC5lbnYuJHttb2RlfWApIDoge30pLFxuICAgIC4uLnJlYWRFbnZGaWxlKCcuZW52LmxvY2FsJyksXG4gICAgLi4uKG1vZGUgPyByZWFkRW52RmlsZShgLmVudi4ke21vZGV9LmxvY2FsYCkgOiB7fSksXG4gIH07XG4gIC8vIFdCX0VOViBpbiBwcm9jZXNzLmVudiBtZWFucyB0aGUgbW9kZSBpcyBleHBsaWNpdGx5IGZvcmNlZCwgc28gdmFsdWVzIGZyb20gdGhlIG1vZGUncyBvd25cbiAgLy8gc291cmNlcyAoLmVudi48bW9kZT5bLmxvY2FsXSBhbmQgdGhlIGZub3ggcHJvZmlsZSkgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZCBmcm9tIHRoZVxuICAvLyBwYXJlbnQgc2hlbGwg4oCUIGV4Y2VwdCBvbiBDSSwgd2hlcmUgaW5qZWN0ZWQgZW52IHZhcnMgbXVzdCBrZWVwIG92ZXJyaWRpbmcgY29tbWl0dGVkIGZpbGVzXG4gIC8vIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTMwKS5cbiAgY29uc3QgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ID0gISFtb2RlICYmICFpc0NJKHByb2Nlc3MuZW52LkNJKTtcbiAgLy8gZm5veC50b21sIGlzIHRoZSBjb21taXR0ZWQsIGVuY3J5cHRlZCBlcXVpdmFsZW50IG9mIC5lbnYgZmlsZXM7IGxvY2FsIC5lbnYgZmlsZXMgc3RpbGwgd2luIG92ZXIgaXQuXG4gIGNvbnN0IFtmbm94VmFyc10gPSByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgbW9kZSwgZG90ZW52VmFycywgeyBtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgfSk7XG4gIGNvbnN0IHBhcnNlZCA9IHsgLi4uZm5veFZhcnMsIC4uLmRvdGVudlZhcnMgfTtcbiAgLy8gRXhwYW5kICR7Li4ufSByZWZlcmVuY2VzIGFnYWluc3QgZXhwb3J0ZWQgdmFyaWFibGVzIHdob3NlIEZJTEUgdmFsdWUgbG9zZXMgdG8gdGhlIHNoZWxsXG4gIC8vIChtaXJyb3JpbmcgcmVhZEVudmlyb25tZW50VmFyaWFibGVzJyBlZmZlY3RpdmUtdmFsdWUgc2VtYW50aWNzKTogYSByZWZlcmVuY2UgbXVzdCByZXNvbHZlIHRvXG4gIC8vIHRoZSB2YWx1ZSB0aGUgY2hpbGQgd2lsbCBhY3R1YWxseSBzZWUsIHNvIGEgc2hlbGwtc2hhZG93ZWQga2V5IGV4cGFuZHMgdG8gdGhlIHNoZWxsIHZhbHVlXG4gIC8vIHdoaWxlIGEgd2lubmluZyBmaWxlL292ZXJyaWRlIHZhbHVlIGV4cGFuZHMgdG8gdGhlIGZpbGUgdmFsdWUuXG4gIGNvbnN0IGZpbGVWYWx1ZVdpbnMgPSAoa2V5OiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgIShrZXkgaW4gcHJvY2Vzcy5lbnYpIHx8IChtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgJiYgKGtleSBpbiBtb2RlVmFycyB8fCBrZXkgaW4gZm5veFZhcnMpKTtcbiAgY29uc3QgcmVmZXJlbmNlRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KSkge1xuICAgIC8vIEVzY2FwZSBkb2xsYXIgc2lnbnMgc28gZXhwb3J0ZWQgdmFsdWVzIHN1YnN0aXR1dGUgbGl0ZXJhbGx5IChwYSR3b3JkIHN0YXlzIHBhJHdvcmQpLlxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICEoa2V5IGluIHBhcnNlZCAmJiBmaWxlVmFsdWVXaW5zKGtleSkpKSB7XG4gICAgICByZWZlcmVuY2VFbnZba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoJyQnLCBTdHJpbmcucmF3YFxcJGApO1xuICAgIH1cbiAgfVxuICBjb25zdCBlbnZWYXJzID0gZXhwYW5kKHsgcGFyc2VkLCBwcm9jZXNzRW52OiByZWZlcmVuY2VFbnYgfSkucGFyc2VkID8/IHBhcnNlZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyByZXR1cm5zIGEgcHJvY2Vzcy5lbnYtc2hhZG93ZWQga2V5IG9ubHkgd2hlbiB0aGUgZm9yY2VkXG4gICAgLy8gcHJvZmlsZSBvdmVycmlkZXMgaXQsIHNvIGZub3gtcHJvdmlkZWQga2V5cyBjb3VudCBhcyBtb2RlLXNwZWNpZmljIGhlcmUuXG4gICAgaWYgKCEoa2V5IGluIG1vZGVWYXJzIHx8IGtleSBpbiBmbm94VmFycykgfHwgcHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIGNvbnRpbnVlO1xuXG4gICAgaWYgKG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0Vudikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgV2FybmluZzogJHtrZXl9IGluIHRoZSBcIiR7bW9kZX1cIiBtb2RlJ3MgZW52IHNvdXJjZXMgb3ZlcnJpZGVzIHRoZSB2YWx1ZSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IGVudmlyb25tZW50IGJlY2F1c2UgV0JfRU5WIGlzIGV4cGxpY2l0bHkgc2V0LmBcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIE9uIENJLCBpbmhlcml0ZWQgdmFyaWFibGVzIGludGVudGlvbmFsbHkgd2luICh3b3JrZmxvd3MgZGVsaWJlcmF0ZWx5IGluamVjdCBlbnYgdmFycyB0aGF0XG4gICAgLy8gb3ZlcnJpZGUgdGhlIGNvbW1pdHRlZCBmaWxlcyk7IHRoaXMgaXMgdGhlIGRlc2lnbmVkIGJlaGF2aW9yLCBzbyBubyB3YXJuaW5nIGlzIGVtaXR0ZWQuXG4gIH1cbiAgLy8gVmFsaWRhdGUgb25seSBBRlRFUiBhcHBseWluZyB0aGUgc291cmNlcywgc28gYSBXQl9TS0lQX0VOVl9DSEVDSyBkZWZpbmVkIGluIGFuIGVudiBGSUxFIGlzXG4gIC8vIGhvbm9yZWQ6IGJvdGggdGhlIGNhcHR1cmVkIGV4cG9ydGVkIG1vZGUgKGl0IHNlbGVjdGVkIHRoZSBjYXNjYWRlKSBhbmQgdGhlIEZJTkFMIHZhbHVlIHRoZVxuICAvLyBjaGlsZCB3aWxsIHNlZSDigJQgdGhlIGVudiBzb3VyY2VzIG1heSBkZWZpbmUgYSBicm9rZW4gV0JfRU5WIChlLmcuIGAuZW52YCB3aXRoXG4gIC8vIGBXQl9FTlY9cHJvZGN1dGlvbmApLCBhbmQgYSBmb3JjZWQgbW9kZSdzIGZpbGVzIG1heSBldmVuIG92ZXJyaWRlIGEgVkFMSUQgZXhwb3J0ZWQgdmFsdWUuXG4gIHZhbGlkYXRlU3RhbmRhcmRXYkVudihtb2RlLCAndGhlIGV4cG9ydGVkIHZhcmlhYmxlJyk7XG4gIHZhbGlkYXRlU3RhbmRhcmRXYkVudihwcm9jZXNzLmVudi5XQl9FTlYsICd0aGUgZW52IHNvdXJjZSBvciB0aGUgZXhwb3J0ZWQgdmFyaWFibGUnKTtcbiAgLy8gVGhlIGV4cG9ydGVkIG1vZGUgc2VsZWN0ZWQgdGhlIGNhc2NhZGUsIHNvIGEgbW9kZSBmaWxlIHNpbGVudGx5IHJlcGxhY2luZyBpdCB3aXRoIGEgRElGRkVSRU5UXG4gIC8vIHZhbGlkIG1vZGUgKGUuZy4gYC5lbnYucHJvZHVjdGlvbmAgY29udGFpbmluZyBgV0JfRU5WPWRldmVsb3BtZW50YCkgbXVzdCBiZSByZWplY3RlZCBhcyB3ZWxsLlxuICBpZiAoXG4gICAgbW9kZSAmJlxuICAgIHByb2Nlc3MuZW52LldCX0VOViAmJlxuICAgIHByb2Nlc3MuZW52LldCX0VOViAhPT0gbW9kZSAmJlxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLICE9PSAnMScgJiZcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyAhPT0gJ3RydWUnXG4gICkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgV0JfRU5WIHJlc29sdmVzIHRvIFwiJHtwcm9jZXNzLmVudi5XQl9FTlZ9XCIgYWx0aG91Z2ggdGhlIFwiJHttb2RlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgIGBGaXggdGhlIFdCX0VOViBkZWZpbmVkIGluIHRoZSBtb2RlJ3MgZW52IHNvdXJjZXMsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgRklMRV9TQ0hFTUEsIGdldEZpbGVEYXRhYmFzZVVybFBhdGggfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuY29uc3QgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FID0gJ2xpdGVzdHJlYW0ueW1sJztcbmNvbnN0IERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBnZW5lcmF0ZShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gWydQUklTTUEgZ2VuZXJhdGUnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gYHByaXNtYSBtaWdyYXRlIHJlc2V0YCBjYW4gZmFpbCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBleGlzdGluZyBkYXRhYmFzZSwgc28gd2UgcmVtb3ZlIGl0IGZpcnN0LlxuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgbHMgLWFobCAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfSAmJiAke3RoaXMuZ2VuZXJhdGUocHJvamVjdCl9ICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nLCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnUGF0aCkgcmV0dXJuIGAtY29uZmlnIFwiJHtjb25maWdQYXRofVwiYDtcblxuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgUFJJU01BIGRiIGV4ZWN1dGUgLS1zdGRpbiAtLXVybCBcIiR7RklMRV9TQ0hFTUF9JHtkYlBhdGh9XCI7IGZpICYmIHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSpgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhd0RiUGF0aCA9IGdldEZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghcmF3RGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShyYXdEYlBhdGgpXG4gICAgPyByYXdEYlBhdGhcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIgPz8gJy4nLCByYXdEYlBhdGgpO1xuXG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERyaXp6bGVDb25maWcsIHdyYXBXaXRoRHJpenpsZUNvbmZpZ0RpciB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGdlbkNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZ2VuLWNvZGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIGNvZGUgZm9yIHRoZSBjdXJyZW50IHByb2plY3QnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbkNvZGVUYXJnZXRzID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAgIC5tYXAoKHByb2plY3QpID0+ICh7IHByb2plY3QsIHNjcmlwdHM6IGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3QpIH0pKVxuICAgICAgLmZpbHRlcigoeyBzY3JpcHRzIH0pID0+IHNjcmlwdHMubGVuZ3RoID4gMCk7XG4gICAgaWYgKGdlbkNvZGVUYXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdObyBjb2RlIGdlbmVyYXRpb24gbmVlZGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QsIHNjcmlwdHMgfSBvZiBnZW5Db2RlVGFyZ2V0cykge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiZ2VuLWNvZGVcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcHJpc21hR2VuZXJhdGVTY3JpcHQgPSBnZXRQcmlzbWFHZW5lcmF0ZVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnYmxpdHonKSAmJiBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICBzY3JpcHRzLnB1c2goJ1lBUk4gYmxpdHogY29kZWdlbicpO1xuICAgIGlmIChwcmlzbWFHZW5lcmF0ZVNjcmlwdCkge1xuICAgICAgc2NyaXB0cy5wdXNoKHByaXNtYUdlbmVyYXRlU2NyaXB0KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJpc21hR2VuZXJhdGVTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2gocHJpc21hR2VuZXJhdGVTY3JpcHQpO1xuICB9XG5cbiAgY29uc3QgY2hha3JhVHlwZWdlblNjcmlwdCA9IGdldENoYWtyYVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKGNoYWtyYVR5cGVnZW5TY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goY2hha3JhVHlwZWdlblNjcmlwdCk7XG4gIH1cblxuICBjb25zdCBkcml6emxlQ2hlY2tTY3JpcHQgPSBzY3JpcHRzLmxlbmd0aCA9PT0gMCA/IGdldERyaXp6bGVDaGVja1NjcmlwdChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKGRyaXp6bGVDaGVja1NjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChkcml6emxlQ2hlY2tTY3JpcHQpO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc1NjcmlwdCA9IGdldEdlbkkxOG5Uc1NjcmlwdChwcm9qZWN0KTtcbiAgaWYgKGdlbkkxOG5Uc1NjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChnZW5JMThuVHNTY3JpcHQpO1xuICB9XG4gIHJldHVybiBzY3JpcHRzO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5JMThuVHNTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWkxOG4tdHMnXSkge1xuICAgIGlmICghcHJvamVjdC5oYXNTb3VyY2VDb2RlKSByZXR1cm47XG4gICAgcmV0dXJuICdZQVJOIHJ1biBnZW4taTE4bi10cyc7XG4gIH1cbiAgaWYgKFxuICAgIHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnZ2VuLWkxOG4tdHMnKSAmJlxuICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2kxOG4nKSlcbiAgKSB7XG4gICAgcmV0dXJuICdZQVJOIGdlbi1pMThuLXRzIC1pIGkxOG4gLW8gc3JjL19fZ2VuZXJhdGVkX18vaTE4bi50cyAtZCBqYS1KUCc7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFHZW5lcmF0ZVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc1ByaXNtYSkgcmV0dXJuO1xuICBpZiAoIWhhc1ByaXNtYVNjaGVtYShwcm9qZWN0KSkgcmV0dXJuO1xuICByZXR1cm4gcHJpc21hU2NyaXB0cy5nZW5lcmF0ZShwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQGNoYWtyYS11aS9jbGknKSkgcmV0dXJuO1xuXG4gIGlmIChnZXRPd25EZXBlbmRlbmN5TWFqb3IocHJvamVjdCwgJ0BjaGFrcmEtdWkvY2xpJykgPT09IDIpIHtcbiAgICByZXR1cm4gJ1lBUk4gY2hha3JhLWNsaSB0b2tlbnMgc3JjL2NvcmUvdGhlbWUudHMnO1xuICB9XG4gIGlmIChmaWxlRXhpc3RzKHByb2plY3QsICdzcmMvdGhlbWUudHMnKSkge1xuICAgIHJldHVybiAnWUFSTiBjaGFrcmEgdHlwZWdlbiBzcmMvdGhlbWUudHMgLS1zdHJpY3QnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuO1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgLy8gS2VlcCB0aGUgZXhwbGljaXQgLS1jb25maWcgYmVjYXVzZSBkcml6emxlLWtpdCdzIGRlZmF1bHQgbG9va3VwIG1pc3NlcyBzb21lIGV4dGVuc2lvbnMgKGUuZy4gLm10cykuXG4gIHJldHVybiBgJHt3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgYFlBUk4gZHJpenpsZS1raXQgY2hlY2sgLS1jb25maWcgJHtjb25maWcuZmlsZU5hbWV9YCl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiBnZXRPd25EZXBlbmRlbmN5TWFqb3IocHJvamVjdDogUHJvamVjdCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgY29uc3QgdmVyc2lvbiA9XG4gICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgcGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdO1xuICBjb25zdCBtYWpvciA9IHZlcnNpb24/Lm1hdGNoKC9cXGQrL3UpPy5bMF07XG4gIHJldHVybiBtYWpvciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTnVtYmVyKG1ham9yKTtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGhhc1ByaXNtYVNjaGVtYShwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ3ByaXNtYS9zY2hlbWEucHJpc21hJywgJ3ByaXNtYS9zY2hlbWEnLCAnZGIvc2NoZW1hLnByaXNtYSddLnNvbWUoKGZpbGVQYXRoKSA9PlxuICAgIGZpbGVFeGlzdHMocHJvamVjdCwgZmlsZVBhdGgpXG4gICk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+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+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFsZVByb2Nlc3NNYXhQb2xsczsgaSsrKSB7XG4gICAgYXdhaXQgc2V0VGltZW91dChzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyk7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VTUkNIJykgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUoaW1hZ2VOYW1lOiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYG5hbWU9JHtpbWFnZU5hbWV9YF0sIHByb2plY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2VzcywgcmVtb3ZlU3RhbGVQcm9jZXNzIH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdkZWxheS1tcyc6IHtcbiAgICBkZWZhdWx0OiA1MDAwLFxuICAgIGRlc2NyaWJlOiAnRGVsYXkgYmVmb3JlIHN0YXJ0aW5nIHRoZSBtYWludGVuYW5jZSBwYWdlIHNlcnZlci4nLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcbnR5cGUgTWFpbnRlbmFuY2VBcmd2ID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4gJiB7XG4gIGFjdGlvbjogJ3N0YXJ0JyB8ICdzdG9wJztcbn07XG5jb25zdCBtYWludGVuYW5jZUxpc3Rlbk1heEF0dGVtcHRzID0gNTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuUmV0cnlEZWxheU1zID0gMTAwO1xuY29uc3QgbWF4VGltZW91dERlbGF5TXMgPSAyXzE0N180ODNfNjQ3O1xuY29uc3QgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lID0gJy53Yic7XG5jb25zdCBtYWludGVuYW5jZUh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XG48aHRtbCBsYW5nPVwiamFcIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+XG4gICAgPHRpdGxlPuODoeODs+ODhuODiuODs+OCueS4rTwvdGl0bGU+XG4gICAgPHN0eWxlPlxuICAgICAgYm9keSB7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICAgIGNvbG9yOiAjMTExODI3O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcIlNlZ29lIFVJXCIsIHNhbnMtc2VyaWY7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoO1xuICAgICAgfVxuXG4gICAgICBtYWluIHtcbiAgICAgICAgcGFkZGluZzogMjRweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICBoMSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMjhweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICAgICAgbWFyZ2luOiAwIDAgMTZweDtcbiAgICAgIH1cblxuICAgICAgcCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuODtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPG1haW4+XG4gICAgICA8aDE+54++5Zyo44Oh44Oz44OG44OK44Oz44K55Lit44Gn44GZPC9oMT5cbiAgICAgIDxwPueahuanmOOBq+OBr+OBlOS4jeS+v+OCkuOBiuOBi+OBkeOBl+OBvuOBmeOBjOOAgeODoeODs+ODhuODiuODs+OCuee1guS6huOBvuOBp+OBl+OBsOOCieOBj+OBiuW+heOBoeOBj+OBoOOBleOBhOOAgjwvcD5cbiAgICA8L21haW4+XG4gIDwvYm9keT5cbjwvaHRtbD5gO1xuXG5leHBvcnQgY29uc3QgbWFpbnRlbmFuY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIE1haW50ZW5hbmNlQXJndj4gPSB7XG4gIGNvbW1hbmQ6ICdtYWludGVuYW5jZSA8YWN0aW9uPicsXG4gIGRlc2NyaWJlOiAnU3RhcnQgb3Igc3RvcCBhIGxpZ2h0d2VpZ2h0IG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLiBFeGFtcGxlOiB3YiBtYWludGVuYW5jZSBzdGFydCcsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJnc1xuICAgICAgLnBvc2l0aW9uYWwoJ2FjdGlvbicsIHtcbiAgICAgICAgY2hvaWNlczogWydzdGFydCcsICdzdG9wJ10gYXMgY29uc3QsXG4gICAgICAgIGRlc2NyaWJlOiAnTWFpbnRlbmFuY2Ugc2VydmVyIGFjdGlvbicsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpIGFzIHVua25vd24gYXMgQXJndjxNYWludGVuYW5jZUFyZ3Y+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbiA9IGFyZ3YuYWN0aW9uO1xuICAgIGlmIChwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0Jykge1xuICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlICR7YWN0aW9ufSBiZWNhdXNlIFdCX0VOViBpcyB0ZXN0LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBwYXJzZVBvcnQocHJvamVjdC5lbnYuUE9SVCk7XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgYXdhaXQgc3RhcnRNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0LCBwb3J0LCBhcmd2LmRlbGF5TXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uID09PSAnc3RvcCcpIHtcbiAgICAgIGF3YWl0IHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0LCBwb3J0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWFpbnRlbmFuY2UgYWN0aW9uOiAke2FjdGlvbn1gKTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHBhcnNlUG9ydChwb3J0RW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBhc3NlcnQub2soTnVtYmVyLmlzSW50ZWdlcihwb3J0KSAmJiBwb3J0ID4gMCwgYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApO1xuICByZXR1cm4gcG9ydDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIsIGRlbGF5TXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhc3NlcnQub2soXG4gICAgTnVtYmVyLmlzRmluaXRlKGRlbGF5TXMpICYmIGRlbGF5TXMgPj0gMCAmJiBkZWxheU1zIDw9IG1heFRpbWVvdXREZWxheU1zLFxuICAgIGBkZWxheS1tcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHttYXhUaW1lb3V0RGVsYXlNc306ICR7ZGVsYXlNc31gXG4gICk7XG5cbiAgY29uc3QgcGlkRmlsZVBhdGggPSBhd2FpdCB3cml0ZU1haW50ZW5hbmNlUGlkRmlsZShwcm9qZWN0LCBwb3J0KTtcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBjbGVhbnVwID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcHJvY2Vzcy5waWQpO1xuICB9O1xuICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIH07XG4gIGNvbnN0IHJlbW92ZVNpZ25hbEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdURVJNJywgaGFuZGxlU2lnbmFsKTtcbiAgICBwcm9jZXNzLm9mZignU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCBoYW5kbGVTaWduYWwpO1xuICBwcm9jZXNzLm9uY2UoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBoYW5kbGVTaWduYWwpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgc2V0VGltZW91dChkZWxheU1zLCB1bmRlZmluZWQsIHsgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0pO1xuICAgIHJlbW92ZVNpZ25hbEhhbmRsZXJzKCk7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgY3JlYXRlQW5kTGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIocG9ydCk7XG4gICAgaWYgKCFzZXJ2ZXIpIHJldHVybjtcblxuICAgIGNvbnNvbGUuaW5mbyhgU3RhcnRlZCBtYWludGVuYW5jZSBzZXJ2ZXIgb24gcG9ydCAke3BvcnR9LmApO1xuICAgIGF3YWl0IHdhaXRGb3JTaHV0ZG93bihzZXJ2ZXIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykgcmV0dXJuO1xuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBhd2FpdCBjbGVhbnVwKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQW5kTGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIocG9ydDogbnVtYmVyKTogUHJvbWlzZTxodHRwLlNlcnZlciB8IHVuZGVmaW5lZD4ge1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYWludGVuYW5jZUxpc3Rlbk1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVNYWludGVuYW5jZVNlcnZlcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaXN0ZW5NYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIsIHBvcnQsIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKTtcbiAgICAgIHJldHVybiBzZXJ2ZXI7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbjtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnICYmIGF0dGVtcHQgPCBtYWludGVuYW5jZUxpc3Rlbk1heEF0dGVtcHRzKSB7XG4gICAgICAgIGF3YWl0IHNldFRpbWVvdXQobWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBtYWludGVuYW5jZSBzZXJ2ZXIgYmVjYXVzZSBwb3J0ICR7cG9ydH0gaXMgYWxyZWFkeSBpbiB1c2UuYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBoYW5kbGVNYWludGVuYW5jZVN0YXJ0dXBFcnJvcihwb3J0LCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignVW5yZWFjaGFibGUgbWFpbnRlbmFuY2Ugc2VydmVyIHN0YXJ0dXAgc3RhdGUuJyk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQ6IG51bWJlciwgZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbik6IG5ldmVyIHtcbiAgaWYgKGVycm9yLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQb3J0ICR7cG9ydH0gaXMgYWxyZWFkeSBpbiB1c2UuYCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBNYWludGVuYW5jZSBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKSk7XG4gIH1cbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVSdW50aW1lTWFpbnRlbmFuY2VTZXJ2ZXJFcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtpbGxNYWludGVuYW5jZVByb2Nlc3MocHJvamVjdCwgcG9ydCk7XG4gIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgY29uc29sZS5pbmZvKGBTdG9wcGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk6IGh0dHAuU2VydmVyIHtcbiAgcmV0dXJuIGh0dHAuY3JlYXRlU2VydmVyKChfcmVxdWVzdCwgcmVzcG9uc2UpID0+IHtcbiAgICByZXNwb25zZS53cml0ZUhlYWQoNTAzLCB7XG4gICAgICAnY2FjaGUtY29udHJvbCc6ICduby1zdG9yZScsXG4gICAgICAnY29udGVudC10eXBlJzogJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcsXG4gICAgfSk7XG4gICAgcmVzcG9uc2UuZW5kKG1haW50ZW5hbmNlSHRtbCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0ZW5NYWludGVuYW5jZVNlcnZlcihcbiAgc2VydmVyOiBodHRwLlNlcnZlcixcbiAgcG9ydDogbnVtYmVyLFxuICBvblJ1bnRpbWVFcnJvcjogKGVycm9yOiBFcnJvcikgPT4gdm9pZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBvblN0YXJ0dXBFcnJvciA9IChlcnJvcjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgIHNlcnZlci5vZmYoJ2xpc3RlbmluZycsIG9uTGlzdGVuaW5nKTtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcbiAgICBjb25zdCBvbkxpc3RlbmluZyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHNlcnZlci5vZmYoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgICAgc2VydmVyLm9uKCdlcnJvcicsIG9uUnVudGltZUVycm9yKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9O1xuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIG9uU3RhcnR1cEVycm9yKTtcbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgJzAuMC4wLjAnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JTaHV0ZG93bihzZXJ2ZXI6IGh0dHAuU2VydmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2h1dGRvd24gPSAoKTogdm9pZCA9PiB7XG4gICAgICBwcm9jZXNzLm9mZignU0lHSU5UJywgc2h1dGRvd24pO1xuICAgICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHUVVJVCcsIHNodXRkb3duKTtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYEZhaWxlZCB0byBjbG9zZSBtYWludGVuYW5jZSBzZXJ2ZXI6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXI6IGh0dHAuU2VydmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzZXJ2ZXIuY2xvc2UoKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFUlJfU0VSVkVSX05PVF9SVU5OSU5HJykge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHNlcnZlci5jbG9zZUFsbENvbm5lY3Rpb25zKCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1haW50ZW5hbmNlUGlkRmlsZShwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShwaWRGaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy53cml0ZUZpbGUocGlkRmlsZVBhdGgsIGAke3Byb2Nlc3MucGlkfVxcbmAsICd1dGY4Jyk7XG4gIHJldHVybiBwaWRGaWxlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGlkRmlsZVBhdGggPSBtYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBwaWQgPSBhd2FpdCByZWFkTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoKTtcbiAgaWYgKHBpZCAhPT0gdW5kZWZpbmVkICYmIHBpZCAhPT0gcHJvY2Vzcy5waWQpIHtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocGlkLCAnU0lHVEVSTScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBhd2FpdCByZW1vdmVTdGFsZVByb2Nlc3MocGlkKTtcbiAgfVxuICBhd2FpdCByZW1vdmVNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgsIHBpZCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nLCBleHBlY3RlZFBpZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXhwZWN0ZWRQaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICAgIGlmIChwaWQgIT09IGV4cGVjdGVkUGlkKSByZXR1cm47XG4gIH1cbiAgYXdhaXQgZnMucm0ocGlkRmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGlkVGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBpZEZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IHBpZCA9IE51bWJlcihwaWRUZXh0LnRyaW0oKSk7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocGlkKSAmJiBwaWQgPiAwID8gcGlkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdC5yb290RGlyUGF0aCwgcG9ydCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYWludGVuYW5jZVBpZEZpbGVQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4ocm9vdERpclBhdGgsIG1haW50ZW5hbmNlUGlkRGlyZWN0b3J5TmFtZSwgYG1haW50ZW5hbmNlLSR7cG9ydH0ucGlkYCk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG4vKipcbiAqIE1hdGVyaWFsaXphdGlvbiBvZiBgQHdpbGxib29zdGVyLXByaXZhdGUvKmAgcmVnaXN0cnkgKFZlcmRhY2NpbykgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzOlxuICogdGhlIHBhY2thZ2VzIGFyZSBkb3dubG9hZGVkIG9uIHRoZSBob3N0IChhdXRoIHZpYSAubnBtcmMgLyB+Ly5ucG1yYyBsb2NhbGx5LCBvciBWRVJEQUNDSU9fVE9LRU5cbiAqIG9uIENJKSBhbmQgZXh0cmFjdGVkIG5leHQgdG8gdGhlIHJlcG9zaXRvcnkgc28gaW1hZ2UgYnVpbGRzIG5lZWQgbm8gcmVnaXN0cnkgY3JlZGVudGlhbHNcbiAqIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NjQpLlxuICovXG5leHBvcnQgY29uc3QgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSA9ICdAd2lsbGJvb3N0ZXItcHJpdmF0ZSc7XG5cbi8vIGBnaXQ6YC9gZ2l0K2AvYGdpdEBgIChub3QgdGhlIGJhcmUgd29yZCBgZ2l0YCk6IG5wbSBhbGxvd3MgYXJiaXRyYXJ5IGRpc3QtdGFncywgc28gYSB0YWcgbmFtZWRcbi8vIGBnaXRgIG9yIGBnaXQtbmV4dGAgbXVzdCBzdGlsbCBiZSB0cmVhdGVkIGFzIGEgcmVnaXN0cnkgc3BlY2lmaWVyLlxuY29uc3Qgbm9uUmVnaXN0cnlTcGVjaWZpZXJQcmVmaXhlcyA9IFtcbiAgJ2dpdDonLFxuICAnZ2l0KycsXG4gICdnaXRAJyxcbiAgJ2ZpbGU6JyxcbiAgJ2xpbms6JyxcbiAgJ3dvcmtzcGFjZTonLFxuICAnaHR0cDonLFxuICAnaHR0cHM6JyxcbiAgJ3BvcnRhbDonLFxuICAncGF0Y2g6Jyxcbl07XG5cbi8vIFRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB3aGljaCBnaXQgc3BlY2lmaWVycyB0aGUgcHJpdmF0ZS1wYWNrYWdlIHRvb2xpbmcgc3VwcG9ydHM6XG4vLyBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgbWF0ZXJpYWxpemVzIGV4YWN0bHkgdGhlc2UsIGFuZCBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZGAgbXVzdFxuLy8gcmV3cml0ZSBleGFjdGx5IHRoZXNlIChyZXdyaXRpbmcgb3RoZXIgb3JncycgU1NIIFVSTHMgd291bGQgcG9pbnQgYXQgbmV2ZXItbWF0ZXJpYWxpemVkIHBhdGhzKS5cbmNvbnN0IHByaXZhdGVHaXREZXBlbmRlbmN5UGF0dGVybiA9IC9eZ2l0QGdpdGh1YlxcLmNvbTooPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilcXC9bXi8jXSsoPzpcXC5naXQpPyg/OiMuKik/JC87XG5cbi8vIFJldHVybnMgYm9vbGVhbiAobm90IGEgYHZhbHVlIGlzIHN0cmluZ2AgcHJlZGljYXRlKTogYSBwcmVkaWNhdGUgd291bGQgbmFycm93IHRoZSBuZWdhdGl2ZVxuLy8gYnJhbmNoIHRvIGB1bmRlZmluZWRgIGFuZCBicmVhayBgZWxzZSBpZmAgY2hhaW5zIG92ZXIgYHN0cmluZyB8IHVuZGVmaW5lZGAgZGVwZW5kZW5jeSB2YWx1ZXMuXG5leHBvcnQgZnVuY3Rpb24gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4udGVzdCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgbmFtZS5zdGFydHNXaXRoKGAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9L2ApICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICFub25SZWdpc3RyeVNwZWNpZmllclByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4gdmFsdWUuc3RhcnRzV2l0aChwcmVmaXgpKVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVSZWdpc3RyeUF1dGgge1xuICByZWdpc3RyeVVybDogc3RyaW5nO1xuICBhdXRoVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSByZWdpc3RyeSBVUkwgYW5kIGF1dGggdG9rZW4gZm9yIHRoZSBwcml2YXRlIHNjb3BlIGZyb20gdGhlIHByb2plY3QncyAubnBtcmMgYW5kXG4gKiB+Ly5ucG1yYyAobmVhcmVyIGZpbGUgd2lucyksIGV4cGFuZGluZyBgJHtWQVJ9YCByZWZlcmVuY2VzIGZyb20gdGhlIGVudmlyb25tZW50LiBPbiBDSSB0aGVcbiAqIFZFUkRBQ0NJT19UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXJ2ZXMgYXMgdGhlIGZhbGxiYWNrIHRva2VuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgocm9vdERpclBhdGg6IHN0cmluZyk6IFByaXZhdGVSZWdpc3RyeUF1dGggfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8vIFJldmVyc2Ugb3JkZXIgc28gbmVhcmVyIGZpbGVzIG92ZXJ3cml0ZSB0aGUgaG9tZS1kaXJlY3RvcnkgZGVmYXVsdHMuXG4gIGZvciAoY29uc3QgbnBtcmNQYXRoIG9mIFtwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm5wbXJjJyksIHBhdGguam9pbihyb290RGlyUGF0aCwgJy5ucG1yYycpXSkge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVudHJpZXMsIHBhcnNlTnBtcmMoZnMucmVhZEZpbGVTeW5jKG5wbXJjUGF0aCwgJ3V0ZjgnKSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBucG1yYyBmaWxlcyBhcmUgZmluZTsgdGhlIG90aGVyIGZpbGUgb3IgVkVSREFDQ0lPX1RPS0VOIG1heSBzdGlsbCBwcm92aWRlIGF1dGguXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVnaXN0cnlVcmwgPSBlbnRyaWVzW2Ake1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9OnJlZ2lzdHJ5YF0/LnJlcGxhY2UoL1xcLyskLywgJycpO1xuICBpZiAoIXJlZ2lzdHJ5VXJsKSByZXR1cm47XG5cbiAgLy8gbnBtLXN0eWxlIFVSSSBtYXRjaGluZzogbm9ybWFsaXplIGJvdGggc2lkZXMgdG8gYSB0cmFpbGluZyBzbGFzaCBzbyBhIHRva2VuIGZvclxuICAvLyBgLy92ZXJkYWNjaW8uZXhhbXBsZS5jb20vYCBjYW4gbmV2ZXIgbWF0Y2ggYC8vdmVyZGFjY2lvLmV4YW1wbGUuY29tLW90aGVyLm9yZy9gLCBhbmQgcGljayB0aGVcbiAgLy8gTU9TVCBTUEVDSUZJQyAobG9uZ2VzdCkgbWF0Y2hpbmcgcHJlZml4IHNvIGAvL2hvc3QvcHJpdmF0ZS9gIGJlYXRzIGAvL2hvc3QvYC5cbiAgY29uc3Qgbm9ybWFsaXplZFJlZ2lzdHJ5VXJsID0gYCR7cmVnaXN0cnlVcmwucmVwbGFjZSgvXmh0dHBzPzovLCAnJykucmVwbGFjZSgvXFwvKyQvLCAnJyl9L2A7XG4gIGxldCBtYXRjaGVkVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG1hdGNoZWRQcmVmaXhMZW5ndGggPSAtMTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAvLyBTa2lwIGVtcHR5IHRva2VucyAoYW4gdW5zZXQgYCR7VkFSfWAgZXhwYW5kcyB0byAnJyk6IGFuIGVtcHR5IG1hdGNoIG11c3Qgbm90IGRlZmVhdCB0aGVcbiAgICAvLyBWRVJEQUNDSU9fVE9LRU4gZmFsbGJhY2sgYmVsb3cuXG4gICAgaWYgKCFrZXkuZW5kc1dpdGgoJzpfYXV0aFRva2VuJykgfHwgIXZhbHVlKSBjb250aW51ZTtcbiAgICBjb25zdCBwcmVmaXggPSBgJHtrZXkuc2xpY2UoMCwgLSc6X2F1dGhUb2tlbicubGVuZ3RoKS5yZXBsYWNlKC9cXC8rJC8sICcnKX0vYDtcbiAgICBpZiAobm9ybWFsaXplZFJlZ2lzdHJ5VXJsLnN0YXJ0c1dpdGgocHJlZml4KSAmJiBwcmVmaXgubGVuZ3RoID4gbWF0Y2hlZFByZWZpeExlbmd0aCkge1xuICAgICAgbWF0Y2hlZFByZWZpeExlbmd0aCA9IHByZWZpeC5sZW5ndGg7XG4gICAgICBtYXRjaGVkVG9rZW4gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLy8gTm8gUHJvamVjdCBpbnN0YW5jZSBleGlzdHMgYXQgdGhpcyBsYXllciwgc28gcHJvY2Vzcy5lbnYgaXMgdGhlIG9ubHkgc291cmNlIGZvciB0aGVcbiAgLy8gQ0ktaW5qZWN0ZWQgZmFsbGJhY2sgdG9rZW4uXG4gIGNvbnN0IGF1dGhUb2tlbiA9IG1hdGNoZWRUb2tlbiA/PyBwcm9jZXNzLmVudi5WRVJEQUNDSU9fVE9LRU47XG4gIHJldHVybiB7IHJlZ2lzdHJ5VXJsLCBhdXRoVG9rZW4gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTnBtcmMoY29udGVudDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCByYXdMaW5lIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbGluZSA9IHJhd0xpbmUudHJpbSgpO1xuICAgIGlmICghbGluZSB8fCBsaW5lLnN0YXJ0c1dpdGgoJyMnKSB8fCBsaW5lLnN0YXJ0c1dpdGgoJzsnKSkgY29udGludWU7XG5cbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGxpbmUuaW5kZXhPZignPScpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA8PSAwKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGtleSA9IGxpbmUuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLnRyaW0oKTtcbiAgICBjb25zdCB2YWx1ZSA9IGxpbmVcbiAgICAgIC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpXG4gICAgICAudHJpbSgpXG4gICAgICAucmVwbGFjZUFsbCgvXFwkXFx7KFtefV0rKVxcfS9nLCAoXywgdmFyaWFibGVOYW1lOiBzdHJpbmcpID0+IHByb2Nlc3MuZW52W3ZhcmlhYmxlTmFtZV0gPz8gJycpO1xuICAgIGVudHJpZXNba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIERvd25sb2FkIGFuZCBleHRyYWN0IG9uZSByZWdpc3RyeSBwYWNrYWdlIGludG8gYHRhcmdldERpclBhdGhgLiBUaGUgc3BlY2lmaWVyIG1heSBiZSBhbiBleGFjdFxuICogc2VtdmVyIHZlcnNpb24gKHRoZSBvcmcncyBjb21tb24gY2FzZSB2aWEgYnVuZmlnIGBleGFjdCA9IHRydWVgKSwgYW55IHNlbXZlciByYW5nZSAocmVzb2x2ZWRcbiAqIG1heC1zYXRpc2Z5aW5nIGFnYWluc3QgdGhlIHJlZ2lzdHJ5J3MgcHVibGlzaGVkIHZlcnNpb25zLCBtYXRjaGluZyBgbnBtIGluc3RhbGxgKSwgb3IgYVxuICogZGlzdC10YWcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UoXG4gIGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZyxcbiAgdGFyZ2V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHJlc29sdmVWZXJzaW9uKGF1dGgsIHBhY2thZ2VOYW1lLCB2ZXJzaW9uU3BlY2lmaWVyKTtcbiAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBmZXRjaFJlZ2lzdHJ5SnNvbjx7IGRpc3Q/OiB7IHRhcmJhbGw/OiBzdHJpbmcgfSB9PihcbiAgICBhdXRoLFxuICAgIGAke2F1dGgucmVnaXN0cnlVcmx9LyR7ZW5jb2RlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpfS8ke3ZlcnNpb259YFxuICApO1xuICBjb25zdCB0YXJiYWxsVXJsID0gbWV0YWRhdGEuZGlzdD8udGFyYmFsbDtcbiAgaWYgKCF0YXJiYWxsVXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXJiYWxsIFVSTCBmb3IgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9ufSBpbiAke2F1dGgucmVnaXN0cnlVcmx9LmApO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZyb21SZWdpc3RyeShhdXRoLCB0YXJiYWxsVXJsKTtcbiAgY29uc3QgdGFyYmFsbFBhdGggPSBwYXRoLmpvaW4oXG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksICd3Yi1wcml2YXRlLXBhY2thZ2UtJykpLFxuICAgICdwYWNrYWdlLnRneidcbiAgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUodGFyYmFsbFBhdGgsIEJ1ZmZlci5mcm9tKGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0YXJnZXREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGFyZ2V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gbnBtIHRhcmJhbGxzIHBsYWNlIHRoZSBjb250ZW50IHVuZGVyIGEgdG9wLWxldmVsIGBwYWNrYWdlL2AgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCd0YXInLCBbJy14emYnLCB0YXJiYWxsUGF0aCwgJy1DJywgdGFyZ2V0RGlyUGF0aCwgJy0tc3RyaXAtY29tcG9uZW50cz0xJ10sIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGV4dHJhY3QgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9ufSAoJHt0YXJiYWxsVXJsfSkuYCk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguZGlybmFtZSh0YXJiYWxsUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVmVyc2lvbihcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyBQcmVyZWxlYXNlIGFuZCBgK2J1aWxkYCBtZXRhZGF0YSBhcmUgYm90aCBwYXJ0IG9mIHZhbGlkIGV4YWN0IFNlbVZlciB2ZXJzaW9ucywgc28gYW4gZXhhY3RcbiAgLy8gc3BlY2lmaWVyIHJlc29sdmVzIHRvIGl0c2VsZiB3aXRob3V0IGEgcGFja3VtZW50IGZldGNoLlxuICBpZiAoaXNFeGFjdFZlcnNpb24odmVyc2lvblNwZWNpZmllcikpIHJldHVybiB2ZXJzaW9uU3BlY2lmaWVyO1xuXG4gIGNvbnN0IHBhY2t1bWVudCA9IGF3YWl0IGZldGNoUmVnaXN0cnlKc29uPFBhY2t1bWVudD4oYXV0aCwgYCR7YXV0aC5yZWdpc3RyeVVybH0vJHtlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSl9YCk7XG4gIGNvbnN0IHZlcnNpb24gPSBzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCh2ZXJzaW9uU3BlY2lmaWVyLCBwYWNrdW1lbnQpO1xuICBpZiAoIXZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHJlc29sdmUgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9uU3BlY2lmaWVyfSBhZ2FpbnN0ICR7YXV0aC5yZWdpc3RyeVVybH07IHVzZSBhbiBleGFjdCB2ZXJzaW9uLCBhIHNlbXZlciByYW5nZSwgb3IgYSBkaXN0LXRhZy5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWNrdW1lbnQge1xuICAnZGlzdC10YWdzJz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHZlcnNpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogbnBtJ3Mgc3BlY2lmaWVyIGNsYXNzaWZpY2F0aW9uOiBgKmAgYW5kIGRpc3QtdGFnIG5hbWVzIHJlc29sdmUgdmlhIGRpc3QtdGFncyAobnBtIHJlc29sdmVzIGAqYFxuICogdG8gdGhlIGBsYXRlc3RgIHRhZyksIHdoaWxlIGFueSBvdGhlciB2YWxpZCBzZW12ZXIgcmFuZ2UgcmVzb2x2ZXMgdG8gdGhlIGhpZ2hlc3QgcHVibGlzaGVkXG4gKiB2ZXJzaW9uIHNhdGlzZnlpbmcgaXQsIG1hdGNoaW5nIGBucG0gaW5zdGFsbGAncyBtYXgtc2F0aXNmeWluZyBzZW1hbnRpY3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCh2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmcsIHBhY2t1bWVudDogUGFja3VtZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZlcnNpb25TcGVjaWZpZXIgIT09ICcqJyAmJiBzZW12ZXIudmFsaWRSYW5nZSh2ZXJzaW9uU3BlY2lmaWVyKSkge1xuICAgIHJldHVybiBzZW12ZXIubWF4U2F0aXNmeWluZyhPYmplY3Qua2V5cyhwYWNrdW1lbnQudmVyc2lvbnMgPz8ge30pLCB2ZXJzaW9uU3BlY2lmaWVyKSA/PyB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHBhY2t1bWVudFsnZGlzdC10YWdzJ10/Llt2ZXJzaW9uU3BlY2lmaWVyID09PSAnKicgPyAnbGF0ZXN0JyA6IHZlcnNpb25TcGVjaWZpZXJdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlZ2lzdHJ5SnNvbjxUPihhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLCB1cmw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGgsIHVybCk7XG4gIHJldHVybiAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBUO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEZyb21SZWdpc3RyeShhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLCB1cmw6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgLy8gVGFyYmFsbCBVUkxzIGNvbWUgZnJvbSByZWdpc3RyeS1jb250cm9sbGVkIG1ldGFkYXRhOyBhdHRhY2ggdGhlIHRva2VuIG9ubHkgdG8gdGhlIGNvbmZpZ3VyZWRcbiAgLy8gcmVnaXN0cnkncyBvd24gb3JpZ2luIHNvIGEgbWFsaWNpb3VzIG9yIG1pc2NvbmZpZ3VyZWQgcmVnaXN0cnkgY2Fubm90IHJlZGlyZWN0IHRoZSBjcmVkZW50aWFsXG4gIC8vIHRvIGEgdGhpcmQtcGFydHkgaG9zdC5cbiAgY29uc3Qgc2VuZEF1dGhUb2tlbiA9ICEhYXV0aC5hdXRoVG9rZW4gJiYgaXNTYW1lT3JpZ2luKHVybCwgYXV0aC5yZWdpc3RyeVVybCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgaGVhZGVyczogc2VuZEF1dGhUb2tlbiA/IHsgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGguYXV0aFRva2VufWAgfSA6IHt9LFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfTogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbih1cmw6IHN0cmluZywgcmVnaXN0cnlVcmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHVybCkub3JpZ2luID09PSBuZXcgVVJMKHJlZ2lzdHJ5VXJsKS5vcmlnaW47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoJy8nLCAnJTJGJyk7XG59XG5cbi8vIFRoZSBvZmZpY2lhbCBTZW1WZXIgMi4wLjAgZ3JhbW1hciAoc2VtdmVyLm9yZyksIGFuY2hvcmVkOiBudW1lcmljLWxvb2tpbmcgZGlzdC10YWdzIHN1Y2ggYXNcbi8vIGAxLjIuM2xhdGVzdGAsIGxlYWRpbmctemVybyB2ZXJzaW9ucyAoYDAxLjIuM2ApLCBhbmQgdW5kZXJzY29yZSBpZGVudGlmaWVycyBhcmUgTk9UIHZlcnNpb25zIOKAlFxuLy8gcmVzb2x2ZVZlcnNpb24gdHJlYXRzIHRoZW0gYXMgdGFncywgbWF0Y2hpbmcgbm9kZS1zZW12ZXIncyBjbGFzc2lmaWNhdGlvbi5cbmNvbnN0IGV4YWN0U2VtdmVyUGF0dGVybiA9XG4gIC9eKD86MHxbMS05XVxcZCopXFwuKD86MHxbMS05XVxcZCopXFwuKD86MHxbMS05XVxcZCopKD86LSg/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSg/OlxcLig/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSkqKT8oPzpcXCtbMC05YS16QS1aLV0rKD86XFwuWzAtOWEtekEtWi1dKykqKT8kLztcblxuLyoqIFdoZXRoZXIgdGhlIHNwZWNpZmllciBpcyBhbiBleGFjdCBTZW1WZXIgdmVyc2lvbiAobm90IGEgcmFuZ2UsIHRhZywgb3IgZ2l0IFVSTCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc3BlY2lmaWVyICYmIGV4YWN0U2VtdmVyUGF0dGVybi50ZXN0KHNwZWNpZmllcik7XG59XG5cbi8qKlxuICogV2hldGhlciBFVkVSWSB2ZXJzaW9uIGBzcGVjaWZpZXJgIGNhbiByZXNvbHZlIHRvIGFsc28gc2F0aXNmaWVzIGByZXF1aXJlbWVudGAgKGV4YWN0IHZlcnNpb25zXG4gKiBjb3VudCBhcyBzaW5nbGUtdmVyc2lvbiByYW5nZXMpLiBDb25mbGljdCBjaGVja3MgdXNlIHRoaXMgYmVjYXVzZSB0aGUgYWN0dWFsbHkgcmVzb2x2ZWQgdmVyc2lvblxuICogaXMgdW5rbm93biBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGlzIGNvbnN1bHRlZDogYSBzdWJzZXQgc3BlY2lmaWVyJ3MgbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBpc1xuICogZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSB3aWRlciByZXF1aXJlbWVudC4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMpIGFyZSBub3RcbiAqIGNvbXBhcmFibGUgYW5kIHJldHVybiBmYWxzZSDigJQgY2FsbGVycyBhY2NlcHQgdGhvc2Ugb25seSBvbiBleGFjdCBzdHJpbmcgZXF1YWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGVjaWZpZXJTdWJzZXQoc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJlcXVpcmVtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKHNwZWNpZmllciA9PT0gdW5kZWZpbmVkIHx8IHJlcXVpcmVtZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFzZW12ZXIudmFsaWRSYW5nZShzcGVjaWZpZXIpIHx8ICFzZW12ZXIudmFsaWRSYW5nZShyZXF1aXJlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHNlbXZlci5zdWJzZXQoc3BlY2lmaWVyLCByZXF1aXJlbWVudCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbWF0ZXJpYWxpemVkIGB2ZXJzaW9uYCBjYW4gYmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIHJlZ2lzdHJ5IGBzcGVjaWZpZXJgLlxuICogRGlzdC10YWdzIChpbnZhbGlkIHJhbmdlcykgYXJlIG5vdCBzdGF0aWNhbGx5IGNoZWNrYWJsZSBhbmQgcGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikpIHJldHVybiB0cnVlO1xuICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyh2ZXJzaW9uLCBzcGVjaWZpZXIpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7XG4gIGZpbmREZXNjZW5kYW50UHJvamVjdHMsXG4gIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCxcbiAgZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCxcbiAgdHlwZSBQcm9qZWN0LFxufSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHtcbiAgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSxcbiAgaXNQcml2YXRlR2l0RGVwZW5kZW5jeSxcbiAgaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5LFxuICBtYXRlcmlhbGl6ZWRWZXJzaW9uU2F0aXNmaWVzLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBzcWxpdGVGaWxlUGF0dGVybiA9IC9cXC4oPzpzcWxpdGUzP3xkYikoPzpbLS5dKD86am91cm5hbHxzaG18d2FsKSk/JC9pO1xuY29uc3QgZG9ja2VyQnVpbGRDYWNoZVBhdGhzID0gW1xuICAnLmNhY2hlJyxcbiAgJy5teXB5X2NhY2hlJyxcbiAgJy5uZXh0L2NhY2hlJyxcbiAgJy5wYXJjZWwtY2FjaGUnLFxuICAnLnB5dGVzdF9jYWNoZScsXG4gICcucnVmZl9jYWNoZScsXG4gICcudG94JyxcbiAgJy50dXJibycsXG4gICcudmVudicsXG4gICcueWFybi9jYWNoZScsXG4gICcueWFybi9pbnN0YWxsLXN0YXRlLmd6JyxcbiAgJ19fcHljYWNoZV9fJyxcbiAgJ2NvdmVyYWdlJyxcbiAgJ25vZGVfbW9kdWxlcy8uY2FjaGUnLFxuICAncGxheXdyaWdodC1yZXBvcnQnLFxuICAnc3Rvcnlib29rLXN0YXRpYycsXG4gICd0YXJnZXQnLFxuICAndGVzdC1yZXN1bHRzJyxcbl07XG5jb25zdCBkb2NrZXJCdWlsZENhY2hlUGF0dGVybnMgPSBbJyoqLyoucHljJywgJyoqLyoudHNidWlsZGluZm8nLCAnKiovX19weWNhY2hlX18nXTtcbmNvbnN0IGdlbmVyYXRlZFNxbGl0ZURpck5hbWVzID0gWydwcmlzbWEnLCAnZGInLCAnZHJpenpsZSddIGFzIGNvbnN0O1xuY29uc3QgZG9ja2VyR2VuZXJhdGVkRGF0YURpclBhdGhzID0gWycvZGF0YSddIGFzIGNvbnN0O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGltaXplZFByb2plY3RzOiBQcm9qZWN0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdCwgcGFja2FnZUpzb24pO1xuICAgICAgY29uc3QgcmVtb3ZlZERldkRlcGVuZGVuY2llcyA9IG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uLCB7XG4gICAgICAgIHJlbW92ZVdiUG9zdGluc3RhbGw6ICFhcmd2Lm91dHNpZGUgJiYgcmVtb3ZlZERldkRlcGVuZGVuY2llcy5pbmNsdWRlcygnQHdpbGxib29zdGVyL3diJyksXG4gICAgICB9KTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgICAgYXdhaXQgd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMocGF0aC5qb2luKGRpc3REaXJQYXRoLCAnYmFzaCcpKTtcbiAgICAgIH1cbiAgICAgIG9wdGltaXplZFByb2plY3RzLnB1c2gocHJvamVjdCk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocHJvamVjdHMucm9vdC5wYWNrYWdlTWFuYWdlckNvbW1hbmQsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICAgIGF3YWl0IGNsZWFudXBEb2NrZXJCdWlsZEFydGlmYWN0cyhvcHRpbWl6ZWRQcm9qZWN0cyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdDogUHJvamVjdCwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXNGb3JEaXIocHJvamVjdC5yb290RGlyUGF0aCwgcHJvamVjdC5kaXJQYXRoLCBwYWNrYWdlSnNvbik7XG59XG5cbmZ1bmN0aW9uIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzRm9yRGlyKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb25cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmV3cml0dGVuRGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgIGlmIChpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSkge1xuICAgICAgICAvLyBEb2NrZXIgYnVpbGRzIGNhbm5vdCBhY2Nlc3MgcHJpdmF0ZSBTU0ggVVJMcyB1bmxlc3MgY3JlZGVudGlhbHMgYXJlIGZvcndhcmRlZC5cbiAgICAgICAgLy8gVGhlIERvY2tlcmZpbGUgY29waWVzIHRob3NlIHdvcmtzcGFjZSBwYWNrYWdlcyBpbnRvIHRoZSBpbWFnZSBpbnN0ZWFkLiBPbmx5IHRoZSBvcmcnc1xuICAgICAgICAvLyBvd24gZ2l0IGRlcGVuZGVuY2llcyBhcmUgcmV3cml0dGVuIOKAlCB0aGUgc2hhcmVkIHByZWRpY2F0ZSBtYXRjaGVzIGV4YWN0bHkgd2hhdFxuICAgICAgICAvLyBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgbWF0ZXJpYWxpemVzLCBzbyBvdGhlciBTU0ggVVJMcyBhcmUgbGVmdCB1bmNoYW5nZWQgaW5zdGVhZFxuICAgICAgICAvLyBvZiBiZWluZyBwb2ludGVkIGF0IG5ldmVyLW1hdGVyaWFsaXplZCBsb2NhbCBwYXRocy5cbiAgICAgICAgZGVwc1tuYW1lXSA9IGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKHJvb3REaXJQYXRoLCBwYWNrYWdlRGlyUGF0aCwgJ0B3aWxsYm9vc3RlcicsIG5hbWUpO1xuICAgICAgICByZXdyaXR0ZW5EZXBlbmRlbmNpZXMucHVzaChgJHtrZXl9LiR7bmFtZX1gKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKSkge1xuICAgICAgICBjb25zdCBtYXRlcmlhbGl6ZWRWZXJzaW9uID0gcmVhZE1hdGVyaWFsaXplZFBhY2thZ2VWZXJzaW9uKHJvb3REaXJQYXRoLCBuYW1lKTtcbiAgICAgICAgaWYgKG1hdGVyaWFsaXplZFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIExlYXZpbmcgdGhlIHJlZ2lzdHJ5IHNwZWNpZmllciBtZWFucyB0aGUgaW4taW1hZ2UgaW5zdGFsbCBuZWVkcyBWZXJkYWNjaW9cbiAgICAgICAgICAvLyBjcmVkZW50aWFscyDigJQgdGhlIGZhaWx1cmUgdGhpcyBmZWF0dXJlIGV4aXN0cyB0byBhdm9pZCDigJQgc28gc2F5IHNvIG91dCBsb3VkLlxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYCR7bmFtZX0gaXMgbm90IG1hdGVyaWFsaXplZCB1bmRlciAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9LzsgcnVuIFxcYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNcXGAgc28gdGhlIERvY2tlciBidWlsZCBkb2VzIG5vdCBuZWVkIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBpcyBzdGFsZSB3aGVuIHRoZSBzcGVjaWZpZXIgKGFuIGV4YWN0IHZlcnNpb24gb3IgYW55IHNlbXZlclxuICAgICAgICAvLyByYW5nZSBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgcmVzb2x2ZXMgbWF4LXNhdGlzZnlpbmcgYWdhaW5zdCB0aGUgcmVnaXN0cnkpIGRvZXNcbiAgICAgICAgLy8gbm90IGFkbWl0IGl0LiBEaXN0LXRhZyBzcGVjaWZpZXJzIChlLmcuIGAyMDI2LXN0YWJsZWApIHNraXAgdGhlIHN0YWxlbmVzcyBjaGVjay5cbiAgICAgICAgaWYgKCFtYXRlcmlhbGl6ZWRWZXJzaW9uU2F0aXNmaWVzKHZhbHVlLCBtYXRlcmlhbGl6ZWRWZXJzaW9uKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAgIGBNYXRlcmlhbGl6ZWQgJHtuYW1lfSBpcyAke21hdGVyaWFsaXplZFZlcnNpb259IGJ1dCBwYWNrYWdlLmpzb24gcmVxdWlyZXMgJHt2YWx1ZX07IHJlcnVuIFxcYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNcXGAuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIHRoYXQgYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplZCBvbiB0aGUgaG9zdCBhcmUgdXNlZCBhc1xuICAgICAgICAvLyBsb2NhbCBwYXRocyBzbyBpbWFnZSBidWlsZHMgbmVlZCBubyBWZXJkYWNjaW8gY3JlZGVudGlhbHM7IHRoZSBDT01NSVRURUQgcGFja2FnZS5qc29uXG4gICAgICAgIC8vIGtlZXBzIHRoZSByZWdpc3RyeSBzcGVjaWZpZXIg4oCUIG9ubHkgdGhlIGdlbmVyYXRlZCAoZGlzdC8pcGFja2FnZS5qc29uIGlzIHJld3JpdHRlblxuICAgICAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTY0KS5cbiAgICAgICAgZGVwc1tuYW1lXSA9IGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKHJvb3REaXJQYXRoLCBwYWNrYWdlRGlyUGF0aCwgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSwgbmFtZSk7XG4gICAgICAgIHJld3JpdHRlbkRlcGVuZGVuY2llcy5wdXNoKGAke2tleX0uJHtuYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1Jld3JvdGUgcHJpdmF0ZSBkZXBlbmRlbmNpZXM6JywgcmV3cml0dGVuRGVwZW5kZW5jaWVzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbiAgcmV0dXJuIHJld3JpdHRlbkRlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIHNjb3BlRGlyTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwcml2YXRlUGFja2FnZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsIHNjb3BlRGlyTmFtZSwgdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKSk7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHByaXZhdGVQYWNrYWdlRGlyUGF0aCk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cblxuZnVuY3Rpb24gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgvXkB3aWxsYm9vc3Rlcig/Oi1wcml2YXRlKT9cXC8vLCAnJyk7XG59XG5cbi8qKiBVbmRlZmluZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBub3QgbWF0ZXJpYWxpemVkIChvciBpdHMgbWFuaWZlc3QgaXMgdW5yZWFkYWJsZS92ZXJzaW9ubGVzcykuICovXG5mdW5jdGlvbiByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihcbiAgICByb290RGlyUGF0aCxcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSksXG4gICAgJ3BhY2thZ2UuanNvbidcbiAgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24pLnZlcnNpb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgLy8gT3V0c2lkZSBvcHRpbWl6YXRpb24gd3JpdGVzIGRpc3QvcGFja2FnZS5qc29uIGJlZm9yZSBEb2NrZXIgYnVpbGRzIHRoZSBhcHAuXG4gICAgLy8gS2VlcCBidWlsZC10aW1lIGRlcGVuZGVuY2llcyBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmV0dXJuIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgY29uc3QgcmVtb3ZlZERlcGVuZGVuY2llcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICByZXR1cm4gcmVtb3ZlZERlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAnb3hmbXQnLFxuICAgICdveGxpbnQnLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZW1vdmVkRGVwcztcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgb3B0aW9uczogeyByZW1vdmVXYlBvc3RpbnN0YWxsOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgKG9wdGlvbnMucmVtb3ZlV2JQb3N0aW5zdGFsbCAmJiBuYW1lID09PSAncG9zdGluc3RhbGwnICYmIGNvbnRlbnQudHJpbSgpID09PSAnd2IgZ2VuLWNvZGUnKSB8fFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwRG9ja2VyQnVpbGRBcnRpZmFjdHMocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBhd2FpdCByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3QpO1xuICAgIGF3YWl0IHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0KTtcbiAgICBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3QpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gW1xuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdCkpLFxuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdCkpLFxuICBdO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgRG9ja2VyIGJ1aWxkIGNhY2hlczonLCByZWxhdGl2ZVBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgZG9ja2VyQnVpbGRDYWNoZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYmJ5KGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucywge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzJywgJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ueWFybicsICcqKi8ueWFybi8qKicsICcqKi8uZ2l0JywgJyoqLy5naXQvKionXSxcbiAgICBvbmx5RmlsZXM6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoKHJlbGF0aXZlUGF0aCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoR3JvdXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoW3JlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0KSwgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCldKTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gcmVtb3ZlZFBhdGhHcm91cHMuZmxhdCgpO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZ2VuZXJhdGVkIGxvY2FsIGRhdGE6JywgcmVtb3ZlZFBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHJlbGF0aXZlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkZWZhdWx0UGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihkaXJOYW1lLCAnbW91bnQnKSk7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRiUGF0aCk7XG4gIGlmIChwYXRoLmJhc2VuYW1lKGFic29sdXRlRGlyUGF0aCkgIT09ICdtb3VudCcgfHwgIWlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgYWJzb2x1dGVEaXJQYXRoKSkge1xuICAgIHJldHVybiBkZWZhdWx0UGF0aHM7XG4gIH1cbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGFic29sdXRlRGlyUGF0aCk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVmYXVsdFBhdGhzLCByZWxhdGl2ZVBhdGhdKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdCksXG4gICAgcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCksXG4gIF0pO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gYXdhaXQgZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0LCBkaXJQYXRoKSkpO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUpKTtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gaXNEaXJlY3RvcnkoZGlyUGF0aCkpKTtcbiAgcmV0dXJuIGRpclBhdGhzLmZpbHRlcigoXywgaW5kZXgpID0+IHJlc3VsdHNbaW5kZXhdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGJGaWxlUGF0aHMgPSBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkYkZpbGVQYXRoIG9mIGRiRmlsZVBhdGhzKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIG9mIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgaXNGaWxlKHRhcmdldFBhdGgpKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICByZW1vdmVkUGF0aHMucHVzaChwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVEYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoIHx8ICFhYnNvbHV0ZURiUGF0aCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpXG4gICAgPyBbZGJQYXRoXVxuICAgIDogW2Fic29sdXRlRGJQYXRoLCAuLi5nZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUsIGRiUGF0aCkpXTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbGVQYXRocyldLmZpbHRlcigoZmlsZVBhdGgpID0+IGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgZmlsZVBhdGgpIHx8IGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMuc29tZSgoZGlyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcnICYmIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBkYkZpbGVQYXRoLFxuICAgIGAke2RiRmlsZVBhdGh9LWpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LXNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0td2FsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LndhbGAsXG4gIF07XG59XG5cbmZ1bmN0aW9uIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdDogUHJvamVjdCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKTtcbiAgLy8gYHN0YXJ0c1dpdGgoJy4uJylgIHdvdWxkIHJlamVjdCBwcm9qZWN0LWxvY2FsIG5hbWVzIHN1Y2ggYXMgYC4uY2FjaGVgLlxuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAocmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3BhdGguc2VwfWApKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhcHJvamVjdC5lbnYuV0JfRE9DS0VSICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJzAnICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJ2ZhbHNlJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChkaXJQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0OiBQcm9qZWN0LCBkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgc3FsaXRlRmlsZU5hbWVzID0gZGlyZW50c1xuICAgIC5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIHNxbGl0ZUZpbGVQYXR0ZXJuLnRlc3QoZGlyZW50Lm5hbWUpKVxuICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuXG4gIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBkaXJQYXRoKTtcbiAgcmV0dXJuIHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBmaWxlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Jhc2gnLCAnY2xlYW51cC5zaCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnYmFzaCcsIFtzY3JpcHRQYXRoLCAnLS1rZWVwLXNjcmlwdHMnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBzY3JpcHRQYXRoKX1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlT3JtLCBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzLCBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsIGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZERyaXp6bGVLaXRDb21tYW5kLCBkcml6emxlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGFsaWFzZXM6IFsnZGInXSxcbiAgZGVzY3JpYmU6XG4gICAgXCJSdW4gZGF0YWJhc2UgY29tbWFuZHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gUHJpc21hLiBEcml6emxlIHByb2plY3RzIHVzZSBkcml6emxlLWtpdC4gRXhhbXBsZTogd2IgcHJpc21hIG1pZ3JhdGUtZGV2IC0tIC0tbmFtZSBpbml0XCIsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5jb21tYW5kKGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGdlbmVyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpc3RCYWNrdXBzQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjbGVhbnVwLWxpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ0NsZWFuIHVwIHRlbXBvcmFsIExpdGVzdHJlYW0gZmlsZXMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgY2xlYW51cC1saXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcvZXRjL2xpdGVzdHJlYW0ueW1sJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXI6IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGlmIChhbGxQcm9qZWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDcmVhdGluZyBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZm9yIG11bHRpcGxlIHByb2plY3RzIGF0IG9uY2UgaXMgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHRoZXkgd291bGQgb3ZlcndyaXRlIGVhY2ggb3RoZXIuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdCwgb3JtLCBhcmd2Lm91dHB1dCk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UnLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmRlcGxveUZvcmNlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBnZW5lcmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZ2VuZXJhdGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIE9STSBjbGllbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBnZW5lcmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmdlbmVyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGNvbmZpZzoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGxpc3RCYWNrdXBzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGlzdC1iYWNrdXBzJyxcbiAgZGVzY3JpYmU6ICdMaXN0IExpdGVzdHJlYW0gYmFja3VwcycsXG4gIGJ1aWxkZXI6IGxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubGlzdEJhY2t1cHMocHJvamVjdCwgYXJndi5jb25maWcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2NoZWNrLWlkZW1wb3RlbmN5Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnUnVuIHRoZSBtaWdyYXRpb24gY29tbWFuZCB0d2ljZSB0byBjb25maXJtIGl0IGlzIGlkZW1wb3RlbnQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBtaWdyYXRlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcjogbWlncmF0ZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydjaGVjay1pZGVtcG90ZW5jeSddKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG9ybVNjcmlwdHMgPSBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bih3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgb3JtU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKHNob3VsZENoZWNrSWRlbXBvdGVuY3kocHJvamVjdCwgYXJndi5jaGVja0lkZW1wb3RlbmN5KSkge1xuICAgICAgICBpZiAoaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQocHJvamVjdCkpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KGBTa2lwcGluZyBpZGVtcG90ZW5jeSBjaGVjayBmb3IgJHtwcm9qZWN0Lm5hbWV9IGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuYCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBvcm1TY3JpcHRzLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0OiBQcm9qZWN0LCBjaGVja0lkZW1wb3RlbmN5OiBib29sZWFuIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGVja0lkZW1wb3RlbmN5ID8/IGlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhcHJvamVjdC5lbnYuV0JfRE9DS0VSICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJzAnICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJ2ZhbHNlJztcbn1cblxuZnVuY3Rpb24gaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Byb2R1Y3Rpb24nKTtcbn1cblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRvIHJlc2V0IHRlc3QgZGF0YWJhc2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuV0JfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHByb2Nlc3MuZW52LldCX0VOViA9ICd0ZXN0JztcbiAgICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgICAgICAgJ1dCX0VOVj10ZXN0IGRiIHJlc2V0JyxcbiAgICAgICAgYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndilcbiAgICAgICkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5saXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifGRyaXp6bGV8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlJyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhcmd2Lm91dHB1dCA/PyBnZXREZWZhdWx0UmVzdG9yZU91dHB1dChwcm9qZWN0LCBvcm0pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0LCBhcmd2LmNvbmZpZyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIGRhdGFiYXNlIHN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTpcbiAgICBcIlBhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byB0aGUgZGV0ZWN0ZWQgT1JNIGFzIGlzLiBBZGRpdGlvbmFsIFByaXNtYSBmbGFncyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgYWZ0ZXIgJy0tJy5cIixcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChgZGIgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBvcm0gPT09ICdwcmlzbWEnID8gYFBSSVNNQSAke2Z1bGxDb21tYW5kfWAgOiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGZ1bGxDb21tYW5kKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bih3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgY29tbWFuZCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogTWFrZSBEcml6emxlIGNvbW1hbmRzIHdvcmsgb24gQ2xvdWRmbGFyZSBEMSBwcm9qZWN0cyBieSBwb2ludGluZyBEQVRBQkFTRV9VUkxcbiAqIGF0IHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtOiBEYXRhYmFzZU9ybSwgcHJvamVjdDogUHJvamVjdCwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3JtID09PSAnZHJpenpsZScgPyB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBzY3JpcHQpIDogc2NyaXB0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0sIGNvbmZpZ1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3QsIG9ybSk7XG4gIGNvbnN0IHJlcXVpcmVkRW52VmFycyA9IHtcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZLFxuICB9IGFzIGNvbnN0O1xuICBjb25zdCBtaXNzaW5nRW52VmFycyA9IE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkRW52VmFycylcbiAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+ICF2YWx1ZSlcbiAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcbiAgaWYgKG1pc3NpbmdFbnZWYXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMaXRlc3RyZWFtOiAke21pc3NpbmdFbnZWYXJzLmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYHNuYXBzaG90OlxuICBpbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gIHJldGVudGlvbjogNzJoICMgS2VlcCBiYWNrdXBzIGZvciAzIGRheXNcbmRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc3luYy1pbnRlcnZhbDogMW1cbmA7XG5cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGxpdGVzdHJlYW1Db25maWcpO1xuICAgIGNvbnNvbGUuaW5mbyhgR2VuZXJhdGVkICR7Y29uZmlnUGF0aH1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgJHtjb25maWdQYXRofTogJHtyZWFzb259YCwge1xuICAgICAgY2F1c2U6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRSZXN0b3JlT3V0cHV0KHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJylcbiAgICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJztcbiAgcmV0dXJuICdkcml6emxlL3Jlc3RvcmVkLnNxbGl0ZTMnO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJykge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcgZm9yIERyaXp6bGUgcmVxdWlyZXMgZmlsZTogREFUQUJBU0VfVVJMLicpO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmludGVyZmFjZSBEYXRhYmFzZU9ybVByb2plY3Qge1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBvcm06IERhdGFiYXNlT3JtO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcm0/OiBEYXRhYmFzZU9ybSk6IFByb21pc2U8RGF0YWJhc2VPcm1Qcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAubWFwKChwcm9qZWN0KSA9PiAocHJvamVjdC5kYXRhYmFzZU9ybSA/IHsgcHJvamVjdCwgb3JtOiBwcm9qZWN0LmRhdGFiYXNlT3JtIH0gOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKHByb2plY3QpOiBwcm9qZWN0IGlzIERhdGFiYXNlT3JtUHJvamVjdCA9PiAhIXByb2plY3QgJiYgKCFvcm0gfHwgcHJvamVjdC5vcm0gPT09IG9ybSkpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQob3JtID8gYE5vICR7b3JtfSBwcm9qZWN0IGZvdW5kLmAgOiAnTm8gc3VwcG9ydGVkIGRhdGFiYXNlIE9STSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtOiBEYXRhYmFzZU9ybSk6IHR5cGVvZiBwcmlzbWFTY3JpcHRzIHwgdHlwZW9mIGRyaXp6bGVTY3JpcHRzIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ3ByaXNtYScgPyBwcmlzbWFTY3JpcHRzIDogZHJpenpsZVNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgcHJvamVjdHM6IERhdGFiYXNlT3JtUHJvamVjdFtdXG4pOiBHZW5lcmF0b3I8RGF0YWJhc2VPcm1Qcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGNvbnN0IG9ybVByb2plY3RCeVByb2plY3QgPSBuZXcgTWFwKHByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gW3Byb2plY3QucHJvamVjdCwgcHJvamVjdF0pKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChcbiAgICBjb21tYW5kTmFtZSxcbiAgICBwcm9qZWN0cy5tYXAoKHsgcHJvamVjdCB9KSA9PiBwcm9qZWN0KVxuICApKSB7XG4gICAgY29uc3Qgb3JtUHJvamVjdCA9IG9ybVByb2plY3RCeVByb2plY3QuZ2V0KHByb2plY3QpO1xuICAgIGlmICghb3JtUHJvamVjdCkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGV0ZWN0IGRhdGFiYXNlIE9STSBmb3IgJHtwcm9qZWN0Lm5hbWV9LmApO1xuXG4gICAgeWllbGQgb3JtUHJvamVjdDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIE9STSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnLS0nLFxuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gQXJyYXkuaXNBcnJheShhcmd2WyctLSddKSA/IGFyZ3ZbJy0tJ10ubWFwKFN0cmluZykgOiBbXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi51bmtub3duT3B0aW9ucywgLi4ucGFzc3Rocm91Z2hBcmdzXSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzLCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbnR5cGUgUmVsZWFzZUFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+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+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcml2YXRlUmVnaXN0cnlBdXRoIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZSxcbiAgaXNQcml2YXRlR2l0RGVwZW5kZW5jeSxcbiAgaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5LFxuICByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgc3BlY2lmaWVyU3Vic2V0LFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbnRlcmZhY2UgUHJpdmF0ZVBhY2thZ2Uge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6ICdnaXQnIHwgJ3JlZ2lzdHJ5JztcbiAgLyoqIFVuZGVmaW5lZCBmb3IgcmVnaXN0cnkgcGFja2FnZXMsIHdoaWNoIGFyZSBkb3dubG9hZGVkIGluc3RlYWQgb2YgY29waWVkLiAqL1xuICBzb3VyY2VEaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRhcmdldERpclBhdGg6IHN0cmluZztcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5jb25zdCBkZXBlbmRlbmN5S2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdvdXQtZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGlyZWN0b3J5IHRvIGNvcHkgcHJpdmF0ZSBwYWNrYWdlcyBpbnRvJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnQHdpbGxib29zdGVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8eyBkcnlSdW4/OiBib29sZWFuIH0sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwLXByaXZhdGUtcGFja2FnZXMnLFxuICBkZXNjcmliZTpcbiAgICAnTWF0ZXJpYWxpemUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgZm9yIERvY2tlciBidWlsZHM6IGNvcHkgZ2l0IGRlcGVuZGVuY2llcyBhbmQgZG93bmxvYWQgQHdpbGxib29zdGVyLXByaXZhdGUvKiByZWdpc3RyeSBwYWNrYWdlcyAoYXV0aCB2aWEgLm5wbXJjIC8gfi8ubnBtcmMgbG9jYWxseSwgb3IgVkVSREFDQ0lPX1RPS0VOIG9uIENJKS4gJyArXG4gICAgJ1RoZSBEb2NrZXJmaWxlIG11c3QgQ09QWSB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yaWVzIChlLmcuIGBDT1BZIEB3aWxsYm9vc3Rlci8gQHdpbGxib29zdGVyL2AgYW5kIGBDT1BZIEB3aWxsYm9vc3Rlci1wcml2YXRlLyBAd2lsbGJvb3N0ZXItcHJpdmF0ZS9gKSBzbyB0aGUgaW4taW1hZ2UgaW5zdGFsbCByZXNvbHZlcyB0aGUgcmV3cml0dGVuIGZpbGU6IHBhdGhzLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXREaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgYXJndi5vdXREaXIpO1xuICAgIGFzc2VydFN1YmRpcmVjdG9yeShwcm9qZWN0cy5yb290LmRpclBhdGgsIG91dERpclBhdGgpO1xuICAgIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIGFsd2F5cyBtYXRlcmlhbGl6ZSBhdCB0aGUgcmVwb3NpdG9yeSByb290OiBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZGBcbiAgICAvLyByZXNvbHZlcyB0aGVtIGZyb20gYDxyb290Pi9Ad2lsbGJvb3N0ZXItcHJpdmF0ZWAgcmVnYXJkbGVzcyBvZiBgLS1vdXQtZGlyYC5cbiAgICBjb25zdCByZWdpc3RyeU91dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdHMucm9vdC5kaXJQYXRoLCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFKTtcbiAgICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCkpIHtcbiAgICAgIC8vIGUuZy4gYC0tb3V0LWRpciBAd2lsbGJvb3N0ZXItcHJpdmF0ZWAgb3IgYC0tb3V0LWRpciBAd2lsbGJvb3N0ZXItcHJpdmF0ZS9zdWJgOiB0aGVcbiAgICAgIC8vIHJlZ2lzdHJ5IHN0ZXAgcmVjdXJzaXZlbHkgZGVsZXRlcyByZWdpc3RyeU91dERpclBhdGgsIHdoaWNoIHdvdWxkIGRlc3Ryb3kgdGhlIGdpdFxuICAgICAgLy8gcGFja2FnZXMgY29waWVkIGludG8gYW4gZXF1YWwgb3IgTkVTVEVEIGRpcmVjdG9yeSBtb21lbnRzIGVhcmxpZXIuXG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgLS1vdXQtZGlyIG11c3Qgbm90IG92ZXJsYXAgdGhlICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0gcmVnaXN0cnkgb3V0cHV0IGRpcmVjdG9yeS5gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmIChwYXRoLnJlbGF0aXZlKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgb3V0RGlyUGF0aCkgIT09ICdAd2lsbGJvb3N0ZXInKSB7XG4gICAgICAvLyBQcmUtZXhpc3RpbmcgbGltaXRhdGlvbiBvZiB0aGUgb3B0aW9uOiB0aGUgRG9ja2VyIG1hbmlmZXN0IHJld3JpdGUgaGFzIG5vIGFjY2VzcyB0byBpdC5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICdOb3RlOiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIHJld3JpdGVzIGdpdCBkZXBlbmRlbmNpZXMgdG8gPHJvb3Q+L0B3aWxsYm9vc3RlcjsgYSBjdXN0b20gLS1vdXQtZGlyIHJlcXVpcmVzIGEgbWF0Y2hpbmcgRG9ja2VyZmlsZSBsYXlvdXQuJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwcml2YXRlUGFja2FnZXMgPSBhd2FpdCBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgcHJvamVjdHMucm9vdC5kaXJQYXRoLFxuICAgICAgcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbixcbiAgICAgIG91dERpclBhdGgsXG4gICAgICByZWdpc3RyeU91dERpclBhdGhcbiAgICApO1xuXG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludERyeVJ1blJlc3VsdChvdXREaXJQYXRoLCBwcml2YXRlUGFja2FnZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvcGllZFBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdnaXQnKTtcbiAgICBjb25zdCByZWdpc3RyeVBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScpO1xuICAgIC8vIFJlc29sdmUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBCRUZPUkUgZGVsZXRpbmcgdGhlIGV4aXN0aW5nIG1hdGVyaWFsaXphdGlvbnMsIHNvIGEgbWlzc2luZ1xuICAgIC8vIHJlZ2lzdHJ5IGNvbmZpZ3VyYXRpb24gY2Fubm90IGRlc3Ryb3kgYSBwcmV2aW91c2x5IHVzYWJsZSBvdXRwdXQgdHJlZS5cbiAgICBjb25zdCBhdXRoID0gcmVnaXN0cnlQYWNrYWdlcy5sZW5ndGggPiAwID8gcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgocHJvamVjdHMucm9vdC5kaXJQYXRoKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAocmVnaXN0cnlQYWNrYWdlcy5sZW5ndGggPiAwICYmICFhdXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYE5vIHJlZ2lzdHJ5IGNvbmZpZ3VyZWQgZm9yIHRoZSAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9IHNjb3BlOyBhZGQgXCIke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9OnJlZ2lzdHJ5PS4uLlwiIHRvIC5ucG1yYyBvciB+Ly5ucG1yYy5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ob3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIC8vIEJvdGggb3V0cHV0IGRpcmVjdG9yaWVzIGFsd2F5cyBleGlzdCBhZnRlcndhcmRzOiBEb2NrZXJmaWxlcyBDT1BZIHRoZW0gdW5jb25kaXRpb25hbGx5LFxuICAgIC8vIGFuZCBhIG1pc3Npbmcgc291cmNlIHBhdGggZmFpbHMgdGhlIGJ1aWxkLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKG91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGNvcHlHaXRQYWNrYWdlKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgIH1cblxuICAgIGlmIChhdXRoKSB7XG4gICAgICAvLyBEb3dubG9hZCBpbnRvIGEgc3RhZ2luZyBkaXJlY3RvcnkgYW5kIHN3YXAgaXQgaW4gb25seSBhZnRlciBldmVyeSBkb3dubG9hZCBzdWNjZWVkZWQsIHNvXG4gICAgICAvLyBhIGZhaWxpbmcgcmVnaXN0cnkvdG9rZW4vZXh0cmFjdGlvbiBjYW5ub3QgZGVzdHJveSB0aGUgbGFzdCB1c2FibGUgbWF0ZXJpYWxpemF0aW9uLlxuICAgICAgY29uc3Qgc3RhZ2luZ0RpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdHMucm9vdC5kaXJQYXRoLCAnLnRtcCcsICd3Yi1wcml2YXRlLXJlZ2lzdHJ5LXN0YWdpbmcnKTtcbiAgICAgIGNvbnN0IHRvU3RhZ2VkUGF0aCA9ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgICAgICAgcGF0aC5qb2luKHN0YWdpbmdEaXJQYXRoLCBwYXRoLnJlbGF0aXZlKHJlZ2lzdHJ5T3V0RGlyUGF0aCwgdGFyZ2V0RGlyUGF0aCkpO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oc3RhZ2luZ0RpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHN0YWdpbmdEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgcmVnaXN0cnlQYWNrYWdlcykge1xuICAgICAgICAgIGF3YWl0IGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgICBwcml2YXRlUGFja2FnZS5uYW1lLFxuICAgICAgICAgICAgcHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JyxcbiAgICAgICAgICAgIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgYERvd25sb2FkZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocHJvamVjdHMucm9vdC5kaXJQYXRoLCBwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBBIGRvd25sb2FkZWQgcGFja2FnZSBtYXkgaXRzZWxmIGRlcGVuZCBvbiBwcml2YXRlIHBhY2thZ2VzIHRoYXQgd2VyZSBub3QgdmlzaWJsZVxuICAgICAgICAgIC8vIGJlZm9yZSBleHRyYWN0aW9uOyBtYXRlcmlhbGl6ZSB0aGVtIHRvby5cbiAgICAgICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICAgICAgcHJvamVjdHMucm9vdC5kaXJQYXRoLFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIHByaXZhdGVQYWNrYWdlLFxuICAgICAgICAgICAgcHJpdmF0ZVBhY2thZ2VzLFxuICAgICAgICAgICAgb3V0RGlyUGF0aCxcbiAgICAgICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgICAgIHRvU3RhZ2VkUGF0aFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocmVnaXN0cnlPdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShzdGFnaW5nRGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHN0YWdpbmdEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShyZWdpc3RyeU91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlZ2lzdHJ5T3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcmVwbGFjZVByaXZhdGVEZXBlbmRlbmNpZXMocHJvamVjdHMucm9vdC5kaXJQYXRoLCBwcml2YXRlUGFja2FnZXMpO1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGBFbnN1cmUgdGhlIERvY2tlcmZpbGUgQ09QWXMgJHtwYXRoLnJlbGF0aXZlKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgb3V0RGlyUGF0aCl9LyBhbmQgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS8gaW50byB0aGUgaW1hZ2UgYmVmb3JlIGluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLmBcbiAgICApO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcm9vdFBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4+IHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICAvLyBTdGFydCBmcm9tIHRoZSByb290IHBhY2thZ2UuanNvbiBieSBkZXNpZ247IHdvcmtzcGFjZSBwYWNrYWdlIGRlcGVuZGVuY2llcyBhcmUgb3V0c2lkZSB0aGlzIGNvbW1hbmQncyB0YXJnZXQuXG4gIGNvbnN0IHBhY2thZ2VzVG9Qcm9jZXNzID0gZmluZFByaXZhdGVEZXBlbmRlbmNpZXMocm9vdFBhY2thZ2VKc29uLCBvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpO1xuICBjb25zdCBxdWV1ZWRQYWNrYWdlcyA9IG5ldyBNYXAocGFja2FnZXNUb1Byb2Nlc3MubWFwKChwKSA9PiBbcC5uYW1lLCBwXSkpO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwYWNrYWdlc1RvUHJvY2Vzcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBwcml2YXRlUGFja2FnZSA9IHBhY2thZ2VzVG9Qcm9jZXNzW2luZGV4XTtcbiAgICBpZiAoIXByaXZhdGVQYWNrYWdlKSBjb250aW51ZTtcbiAgICBpZiAocHJpdmF0ZVBhY2thZ2VzLmhhcyhwcml2YXRlUGFja2FnZS5uYW1lKSkgY29udGludWU7XG5cbiAgICBpZiAocHJpdmF0ZVBhY2thZ2Uua2luZCA9PT0gJ2dpdCcpIHtcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGggPSBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgICAvLyBOZXN0ZWQgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgb2YgYW4gaW5zdGFsbGVkIGdpdCBwYWNrYWdlIGFyZSBkaXNjb3ZlcmFibGUgcmlnaHQgYXdheTtcbiAgICAgIC8vIHJlZ2lzdHJ5IHBhY2thZ2VzIGFyZSBpbnNwZWN0ZWQgYWZ0ZXIgZG93bmxvYWQgaW5zdGVhZCAoY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcykuXG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyhwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoKSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhwYWNrYWdlSnNvbiwgb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlZCA9IHF1ZXVlZFBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICAgICAgaWYgKHF1ZXVlZCkge1xuICAgICAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCBuZXN0ZWQsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWV1ZWRQYWNrYWdlcy5zZXQobmVzdGVkLm5hbWUsIG5lc3RlZCk7XG4gICAgICAgICAgICBwYWNrYWdlc1RvUHJvY2Vzcy5wdXNoKG5lc3RlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByaXZhdGVQYWNrYWdlcy5zZXQocHJpdmF0ZVBhY2thZ2UubmFtZSwgcHJpdmF0ZVBhY2thZ2UpO1xuICB9XG5cbiAgcmV0dXJuIHByaXZhdGVQYWNrYWdlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgZXh0cmFjdGVkUGFja2FnZTogUHJpdmF0ZVBhY2thZ2UsXG4gIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+LFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nLFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIHN0aWxsIGxpdmUgaW4gdGhlIHN0YWdpbmcgZGlyZWN0b3J5IGF0IHRoaXMgcG9pbnQgKHRoZXkgYXJlIHN3YXBwZWQgaW50b1xuICAvLyBwbGFjZSBvbmx5IGFmdGVyIGV2ZXJ5IGRvd25sb2FkIHN1Y2NlZWRlZCk7IGdpdCBwYWNrYWdlcyBhcmUgY29waWVkIHN0cmFpZ2h0IHRvIHRoZWlyIGZpbmFsXG4gIC8vIGxvY2F0aW9uLCBzbyB0aGVpciBtYW5pZmVzdCBtdXN0IGJlIHJlYWQgdGhlcmUuXG4gIGNvbnN0IGV4dHJhY3RlZERpclBhdGggPVxuICAgIGV4dHJhY3RlZFBhY2thZ2Uua2luZCA9PT0gJ3JlZ2lzdHJ5J1xuICAgICAgPyB0b1N0YWdlZFBhdGgoZXh0cmFjdGVkUGFja2FnZS50YXJnZXREaXJQYXRoKVxuICAgICAgOiBleHRyYWN0ZWRQYWNrYWdlLnRhcmdldERpclBhdGg7XG4gIC8vIFNjYW4gRVZFUlkgbWFuaWZlc3Qgb2YgdGhlIG1hdGVyaWFsaXplZCBwYWNrYWdlIChvcmcgZ2l0IGRlcGVuZGVuY2llcyBhcmUgd2hvbGUgbW9ub3JlcG9cbiAgLy8gY2hlY2tvdXRzIHdpdGggcGFja2FnZXMvKi9wYWNrYWdlLmpzb24pLCBtaXJyb3JpbmcgY29sbGVjdFByaXZhdGVQYWNrYWdlcycgZGVlcCBzY2FuIOKAlCB0aGVcbiAgLy8gZGVwZW5kZW5jeS1yZXdyaXRlIHN0ZXAgd2Fsa3MgdGhlIHNhbWUgc2V0LCBzbyBhbnl0aGluZyBkZWNsYXJlZCB0aGVyZSBtdXN0IGJlIG1hdGVyaWFsaXplZC5cbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoZXh0cmFjdGVkRGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgICAgIGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgLy8gQ29sbGFwc2luZyBkaWZmZXJlbnQgcmVxdWVzdGVkIHZlcnNpb25zIGludG8gb25lIG1hdGVyaWFsaXphdGlvbiB3b3VsZCBzaWxlbnRseSB2aW9sYXRlXG4gICAgICAgIC8vIHRoZSBkZXBlbmRlbnQncyByZXF1aXJlbWVudCwgc28gY29uZmxpY3RzIG11c3QgZmFpbCBsb3VkbHkuXG4gICAgICAgIGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0KGV4aXN0aW5nLCBuZXN0ZWQsIGV4dHJhY3RlZFBhY2thZ2UubmFtZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVzdGVkLmtpbmQgPT09ICdnaXQnKSB7XG4gICAgICAgIG5lc3RlZC5zb3VyY2VEaXJQYXRoID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGgsIG5lc3RlZC5uYW1lKTtcbiAgICAgICAgYXdhaXQgY29weUdpdFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UoXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBuZXN0ZWQubmFtZSxcbiAgICAgICAgICBuZXN0ZWQudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JyxcbiAgICAgICAgICB0b1N0YWdlZFBhdGgobmVzdGVkLnRhcmdldERpclBhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke25lc3RlZC5uYW1lfSAobmVzdGVkIGRlcGVuZGVuY3kpIHRvICR7bmVzdGVkLnRhcmdldERpclBhdGh9YCk7XG4gICAgICB9XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5lc3RlZC5uYW1lLCBuZXN0ZWQpO1xuICAgICAgYXdhaXQgY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcyhcbiAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2VzLFxuICAgICAgICBvdXREaXJQYXRoLFxuICAgICAgICByZWdpc3RyeU91dERpclBhdGgsXG4gICAgICAgIHRvU3RhZ2VkUGF0aFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weUdpdFBhY2thZ2Uocm9vdERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2U6IFByaXZhdGVQYWNrYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLmNwKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIGZvcmNlOiB0cnVlLFxuICAgIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciBleHBvc2VzIGluc3RhbGxlZCBwYWNrYWdlcyB0aHJvdWdoIHN5bWxpbmtzOyB0aGUgbWF0ZXJpYWxpemVkIHRyZWVcbiAgICAvLyBtdXN0IGNvbnRhaW4gcmVhbCBmaWxlcyAoYSBjb3BpZWQgYWJzb2x1dGUgc3ltbGluayB3b3VsZCBkYW5nbGUgaW5zaWRlIHRoZSBEb2NrZXIgaW1hZ2UsXG4gICAgLy8gYW5kIGxhdGVyIGRlcGVuZGVuY3kgcmV3cml0aW5nIHdvdWxkIHdyaXRlIHRocm91Z2ggaXQgaW50byB0aGUgc2hhcmVkIHN0b3JlKS5cbiAgICBkZXJlZmVyZW5jZTogdHJ1ZSxcbiAgICBmaWx0ZXI6IChzcmMpID0+IHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5yZWxhdGl2ZShwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoISwgc3JjKS5zcGxpdChwYXRoLnNlcCk7XG4gICAgICByZXR1cm4gIXNlZ21lbnRzLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSAmJiAhc2VnbWVudHMuaW5jbHVkZXMoJy5naXQnKTtcbiAgICB9LFxuICB9KTtcbiAgY29uc29sZS5pbmZvKGBDb3BpZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWApO1xufVxuXG4vKipcbiAqIFRoZSBtYXRlcmlhbGl6YXRpb24gZm9yIGBleGlzdGluZ2AgaXMgYWxyZWFkeSBzZWxlY3RlZCAoYSByYW5nZSByZXNvbHZlcyBtYXgtc2F0aXNmeWluZyBhZ2FpbnN0XG4gKiB0aGUgcmVnaXN0cnkg4oCUIHNlZSBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UpLCBzbyBhY2NlcHQgYHJlcXVlc3RlZGAgb25seSB3aGVuIGl0IGlzXG4gKiBndWFyYW50ZWVkIHNhdGlzZmllZDogYGV4aXN0aW5nYCBtdXN0IGJlIGEgc3Vic2V0IG9mIGl0IChldmVyeSBwb3NzaWJsZSByZXNvbHV0aW9uIG9mIGBleGlzdGluZ2BcbiAqIHRoZW4gc2F0aXNmaWVzIGByZXF1ZXN0ZWRgKS4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMvcmV2aXNpb25zKSBtdXN0IG1hdGNoXG4gKiBleGFjdGx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UsIGRlcGVuZGVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpc3Rpbmcua2luZCA9PT0gcmVxdWVzdGVkLmtpbmQpIHtcbiAgICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybjtcbiAgICBpZiAoc3BlY2lmaWVyU3Vic2V0KGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIsIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDb25mbGljdGluZyByZXF1aXJlbWVudHMgZm9yICR7ZXhpc3RpbmcubmFtZX06IGAgK1xuICAgICAgYCR7ZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA/PyBleGlzdGluZy5raW5kfSBpcyBhbHJlYWR5IHNlbGVjdGVkLCBidXQgJHtkZXBlbmRlbnROYW1lfSByZXF1aXJlcyBgICtcbiAgICAgIGAke3JlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/IHJlcXVlc3RlZC5raW5kfS4gT25seSBhIHNpbmdsZSB2ZXJzaW9uIHBlciBwcml2YXRlIHBhY2thZ2UgaXMgc3VwcG9ydGVkLmBcbiAgKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHR3byBwYXRocyBhcmUgZXF1YWwgb3Igb25lIGNvbnRhaW5zIHRoZSBvdGhlci4gKi9cbmZ1bmN0aW9uIHBhdGhzT3ZlcmxhcChhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNFcXVhbE9yQW5jZXN0b3JQYXRoKGEsIGIpIHx8IGlzRXF1YWxPckFuY2VzdG9yUGF0aChiLCBhKTtcbn1cblxuZnVuY3Rpb24gaXNFcXVhbE9yQW5jZXN0b3JQYXRoKGFuY2VzdG9yUGF0aDogc3RyaW5nLCBkZXNjZW5kYW50UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoYW5jZXN0b3JQYXRoLCBkZXNjZW5kYW50UGF0aCk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGggPT09ICcnIHx8ICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0U3ViZGlyZWN0b3J5KHJvb3REaXJQYXRoOiBzdHJpbmcsIG91dERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKTtcbiAgaWYgKHJlbGF0aXZlUGF0aCAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpKSByZXR1cm47XG5cbiAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE91dHB1dCBkaXJlY3RvcnkgbXVzdCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCByb290OiAke291dERpclBhdGh9YCkpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3REaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB1bnNjb3BlZE5hbWUgPSB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpO1xuICAvLyByZWFscGF0aFN5bmMgcmVzb2x2ZXMgdGhlIGlzb2xhdGVkIGxpbmtlcidzIHN5bWxpbmsgc28gY29waWVzIHJlYWQgKGFuZCB0aGUgY29weSBmaWx0ZXJcbiAgLy8gY29tcHV0ZXMgcmVsYXRpdmUgcGF0aHMgYWdhaW5zdCkgdGhlIGFjdHVhbCBwYWNrYWdlIGRpcmVjdG9yeS5cbiAgY29uc3QgZGlyZWN0RGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICdAd2lsbGJvb3N0ZXInLCB1bnNjb3BlZE5hbWUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyZWN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHJldHVybiBmcy5yZWFscGF0aFN5bmMoZGlyZWN0RGlyUGF0aCk7XG4gIH1cbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIGtlZXBzIHRyYW5zaXRpdmUtb25seSBkZXBlbmRlbmNpZXMgb3V0IG9mIHRoZSByb290IG5vZGVfbW9kdWxlcztcbiAgLy8gc2VhcmNoIHRoZSAuYnVuIHN0b3JlIGZvciB0aGUgcGFja2FnZSBiZWZvcmUgZ2l2aW5nIHVwLiBUaGUgc3RvcmUgbWF5IGxlZ2l0aW1hdGVseSBob2xkXG4gIC8vIE1VTFRJUExFIHJlc29sdXRpb25zIG9mIG9uZSBwYWNrYWdlIChkaWZmZXJlbnQgdmVyc2lvbnMvcmV2aXNpb25zKSwgYW5kIHBpY2tpbmcgYW4gYXJiaXRyYXJ5XG4gIC8vIG9uZSBjb3VsZCBzaWxlbnRseSBtYXRlcmlhbGl6ZSB0aGUgd3JvbmcgY29udGVudCDigJQgc28gYW1iaWd1aXR5IGZhaWxzIGxvdWRseS5cbiAgY29uc3QgYnVuU3RvcmVEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5idW4nKTtcbiAgY29uc3QgY2FuZGlkYXRlRGlyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBmcy5yZWFkZGlyU3luYyhidW5TdG9yZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgICAgY29uc3QgY2FuZGlkYXRlRGlyUGF0aCA9IHBhdGguam9pbihidW5TdG9yZURpclBhdGgsIGRpcmVudC5uYW1lLCAnbm9kZV9tb2R1bGVzJywgJ0B3aWxsYm9vc3RlcicsIHVuc2NvcGVkTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY2FuZGlkYXRlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICBjYW5kaWRhdGVEaXJQYXRocy5hZGQoZnMucmVhbHBhdGhTeW5jKGNhbmRpZGF0ZURpclBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vIC5idW4gc3RvcmUgKGhvaXN0ZWQgaW5zdGFsbCk7IGZhbGwgdGhyb3VnaCB0byB0aGUgZXJyb3IgYmVsb3cuXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZURpclBhdGhzLnNpemUgPT09IDEpIHJldHVybiBbLi4uY2FuZGlkYXRlRGlyUGF0aHNdWzBdITtcbiAgaWYgKGNhbmRpZGF0ZURpclBhdGhzLnNpemUgPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE11bHRpcGxlIGluc3RhbGxlZCByZXNvbHV0aW9ucyBmb3VuZCBmb3IgJHtwYWNrYWdlTmFtZX06ICR7Wy4uLmNhbmRpZGF0ZURpclBhdGhzXS5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICdEZWR1cGxpY2F0ZSB0aGUgZGVwZW5kZW5jeSBzbyBhIHNpbmdsZSByZXNvbHV0aW9uIHJlbWFpbnMuJ1xuICAgICk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJHtwYWNrYWdlTmFtZX0gKCR7ZGlyZWN0RGlyUGF0aH0pYCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG91dERpclBhdGg6IHN0cmluZyxcbiAgcmVnaXN0cnlPdXREaXJQYXRoOiBzdHJpbmdcbik6IFByaXZhdGVQYWNrYWdlW10ge1xuICBjb25zdCBwcml2YXRlUGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KCk7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lLZXlzKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb25ba2V5XTtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwZW5kZW5jaWVzKSkge1xuICAgICAgY29uc3QgaXNHaXQgPSBpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKTtcbiAgICAgIGlmICghaXNHaXQgJiYgIWlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeShuYW1lLCB2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzR2l0ICYmICFuYW1lLnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgZ2l0IGRlcGVuZGVuY3kgbXVzdCBiZSBhbiBAd2lsbGJvb3N0ZXIgcGFja2FnZTogJHtuYW1lfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgdW5zY29wZWROYW1lID0gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKG5hbWUpO1xuICAgICAgLy8gRGVwZW5kZW5jeSBuYW1lcyBiZWNvbWUgZXh0ZXJuYWwgZGF0YSBvbmNlIG5lc3RlZCBtYW5pZmVzdHMgY29tZSBmcm9tIGRvd25sb2FkZWRcbiAgICAgIC8vIHRhcmJhbGxzOyByZWplY3QgYW55dGhpbmcgKHBhdGggc2VwYXJhdG9ycywgYC4uYCwgaGlkZGVuLWZpbGUgcHJlZml4ZXMpIHRoYXQgY291bGRcbiAgICAgIC8vIGVzY2FwZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSB0aGUgbmFtZSBpcyBqb2luZWQgaW50byBiZWZvcmUgaXQgaXMgcmVjdXJzaXZlbHkgZGVsZXRlZC5cbiAgICAgIGlmICghL15bXFx3Li1dKyQvLnRlc3QodW5zY29wZWROYW1lKSB8fCB1bnNjb3BlZE5hbWUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcml2YXRlIHBhY2thZ2UgbmFtZTogJHtuYW1lfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZSA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAga2luZDogaXNHaXQgPyAnZ2l0JyA6ICdyZWdpc3RyeScsXG4gICAgICAgIHNvdXJjZURpclBhdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgdGFyZ2V0RGlyUGF0aDogcGF0aC5qb2luKGlzR2l0ID8gb3V0RGlyUGF0aCA6IHJlZ2lzdHJ5T3V0RGlyUGF0aCwgdW5zY29wZWROYW1lKSxcbiAgICAgICAgLy8gVGhlIGZ1bGwgZ2l0IHNwZWNpZmllciBpcyBwcmVzZXJ2ZWQgc28gZGl2ZXJnZW50IFVSTHMvcmV2aXNpb25zICgjYWJjIHZzICNkZWYpIGFyZVxuICAgICAgICAvLyBkZXRlY3RlZCBhcyBjb25mbGljdHMgaW5zdGVhZCBvZiBzaWxlbnRseSBjb2xsYXBzaW5nIGludG8gb25lIGNvcGllZCBwYWNrYWdlLlxuICAgICAgICB2ZXJzaW9uU3BlY2lmaWVyOiB2YWx1ZSBhcyBzdHJpbmcsXG4gICAgICB9O1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgcHJpdmF0ZVBhY2thZ2VzLnNldChuYW1lLCBleGlzdGluZyA/IG1lcmdlU2FtZU1hbmlmZXN0UmVxdWlyZW1lbnQoZXhpc3RpbmcsIHJlcXVlc3RlZCkgOiByZXF1ZXN0ZWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV07XG59XG5cbi8qKlxuICogQSBtYW5pZmVzdCBtYXkgbGVnaXRpbWF0ZWx5IHJlcXVlc3Qgb25lIHBhY2thZ2UgZnJvbSBzZXZlcmFsIGRlcGVuZGVuY3kgc2VjdGlvbnMgKGUuZy4gYW4gZXhhY3RcbiAqIGRldkRlcGVuZGVuY2llcyBwaW4gYWxvbmdzaWRlIGEgcGVlckRlcGVuZGVuY2llcyByYW5nZSkuIEtlZXAgdGhlIE5BUlJPV0VSIHJlcXVpcmVtZW50IOKAlCBpdHNcbiAqIG1heC1zYXRpc2Z5aW5nIHJlc29sdXRpb24gc2F0aXNmaWVzIHRoZSB3aWRlciBvbmUgYnkgZGVmaW5pdGlvbiAoYW4gZXhhY3QgcGluIGlzIHRoZSBuYXJyb3dlc3RcbiAqIHJhbmdlKSDigJQgYW5kIGZhaWwgbG91ZGx5IHdoZW4gdGhlIHJlcXVpcmVtZW50cyBnZW51aW5lbHkgZGl2ZXJnZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UpOiBQcml2YXRlUGFja2FnZSB7XG4gIGlmIChleGlzdGluZy5raW5kID09PSByZXF1ZXN0ZWQua2luZCkge1xuICAgIGlmIChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID09PSByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGlmIChzcGVjaWZpZXJTdWJzZXQoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciwgcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgaWYgKHNwZWNpZmllclN1YnNldChyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciwgZXhpc3RpbmcudmVyc2lvblNwZWNpZmllcikpIHJldHVybiByZXF1ZXN0ZWQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDb25mbGljdGluZyByZXF1aXJlbWVudHMgZm9yICR7ZXhpc3RpbmcubmFtZX0gd2l0aGluIG9uZSBtYW5pZmVzdDogYCArXG4gICAgICBgJHtleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID8/IGV4aXN0aW5nLmtpbmR9IHZzICR7cmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gcmVxdWVzdGVkLmtpbmR9LmBcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZVByaXZhdGVEZXBlbmRlbmNpZXMoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBwcml2YXRlUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyhwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIGlmICghcmVwbGFjZVBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uUGF0aCwgcGFja2FnZUpzb24sIHByaXZhdGVQYWNrYWdlcykpIGNvbnRpbnVlO1xuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBgJHtKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKX1cXG5gLCAndXRmOCcpO1xuICAgICAgY29uc29sZS5pbmZvKGBSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzIGluICR7cGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKX1gKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvblBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBwcml2YXRlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPlxuKTogYm9vbGVhbiB7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lLZXlzKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb25ba2V5XTtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwZW5kZW5jaWVzKSkge1xuICAgICAgaWYgKCFpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSAmJiAhaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKSkgY29udGludWU7XG4gICAgICBjb25zdCB0YXJnZXRQYWNrYWdlID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuYW1lKTtcbiAgICAgIGlmICghdGFyZ2V0UGFja2FnZSkgY29udGludWU7XG5cbiAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9IGBmaWxlOiR7cGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgdGFyZ2V0UGFja2FnZS50YXJnZXREaXJQYXRoKX1gO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25QYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKGRpcmVudC5uYW1lID09PSAnbm9kZV9tb2R1bGVzJyB8fCBkaXJlbnQubmFtZSA9PT0gJy5naXQnKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goLi4uKGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKGNoaWxkUGF0aCkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lID09PSAncGFja2FnZS5qc29uJykge1xuICAgICAgcGFja2FnZUpzb25QYXRocy5wdXNoKGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWNrYWdlSnNvblBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15Ad2lsbGJvb3N0ZXIoPzotcHJpdmF0ZSk/XFwvLywgJycpO1xufVxuXG5mdW5jdGlvbiBwcmludERyeVJ1blJlc3VsdChvdXREaXJQYXRoOiBzdHJpbmcsIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhgW2RyeS1ydW5dIFdvdWxkIHJlY3JlYXRlICR7b3V0RGlyUGF0aH1gKTtcbiAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBwcml2YXRlUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0J1xuICAgICAgICA/IGBbZHJ5LXJ1bl0gV291bGQgY29weSAke3ByaXZhdGVQYWNrYWdlLm5hbWV9OiAke3ByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGggPz8gJyhpbnN0YWxsZWQgdW5kZXIgbm9kZV9tb2R1bGVzKSd9YFxuICAgICAgICA6IGBbZHJ5LXJ1bl0gV291bGQgZG93bmxvYWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfUAke3ByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXJ9IHRvICR7cHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aH1gXG4gICAgKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZXdyaXRlIGNvcGllZCBwcml2YXRlIGRlcGVuZGVuY2llcyB0byBmaWxlOi4uLzxuYW1lPmApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgJy0tJz86IHN0cmluZ1tdO1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbiAgc2lsZW50PzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7ICctLSc/OiBzdHJpbmdbXSB9XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZXZOdWxsKGFyZ3Y6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKGFyZ3YgYXMgeyBzaWxlbnQ6IGJvb2xlYW4gfSkuc2lsZW50ID8gYCA+IC9kZXYvbnVsbGAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZEltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICdZQVJOIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IG1pc2VBZ2VLZXlTZWNyZXRPcHRpb24gPSBwcm9qZWN0LmVudi5NSVNFX0FHRV9LRVlcbiAgICAgID8gJ1xcbiAgICAgICAgLS1zZWNyZXQgaWQ9bWlzZV9hZ2Vfa2V5LGVudj1NSVNFX0FHRV9LRVknXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIHg4Nl82NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0ke21pc2VBZ2VLZXlTZWNyZXRPcHRpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICBjb25zdCBtaXNlQWdlS2V5RW52T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZID8gJy0tZW52IE1JU0VfQUdFX0tFWSAnIDogJyc7XG4gICAgcmV0dXJuIGBkb2NrZXIgcnVuIC0tcm0gJHthbGxvY2F0ZVR0eSA/ICctaXQgJyA6ICcnfSR7bWlzZUFnZUtleUVudk9wdGlvbn0tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZG9ja2VyIHJtIC1mICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ID4gL2Rldi9udWxsIDI+JjEgfHwgdHJ1ZWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQge1xuICBmaW5kRDFNaWdyYXRpb25zRGlyUGF0aCxcbiAgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxuICB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXN0b21TdGFydFNjcmlwdFBhdGggPSBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0KTtcbiAgICBpZiAoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSB7XG4gICAgICBjb25zdCBzdGFydENvbW1hbmQgPVxuICAgICAgICBgJHtidWlsZFNoZWxsQ29tbWFuZChbJ2Jhc2gnLCBjdXN0b21TdGFydFNjcmlwdFBhdGhdKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAgIC8vIEEgc3RhcnQgc2NyaXB0IGZvdW5kIGF0IHRoZSBtb25vcmVwbyByb290IChjZi4gUHJvamVjdC5maW5kRmlsZSkgaXMgd3JpdHRlbiB0byBydW4gZnJvbVxuICAgICAgLy8gdGhlIHJvb3QsIGxpa2UgRG9ja2VyJ3MgV09SS0RJUiwgc28gaXRzIGN3ZCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBzY3JpcHRzLy5cbiAgICAgIGNvbnN0IHNjcmlwdFJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShjdXN0b21TdGFydFNjcmlwdFBhdGgpKTtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgc2NyaXB0Um9vdERpclBhdGggPT09IHByb2plY3QuZGlyUGF0aFxuICAgICAgICAgID8gc3RhcnRDb21tYW5kXG4gICAgICAgICAgOiBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIHNjcmlwdFJvb3REaXJQYXRoXSl9ICYmICR7c3RhcnRDb21tYW5kfSlgLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZWNvc3lzdGVtQ29uZmlnUGF0aCA9IGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gZWNvc3lzdGVtQ29uZmlnUGF0aFxuICAgICAgPyBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXVxuICAgICAgOiB0aGlzLmJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBjb21tYW5kcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAvLyBUZXN0LWVudmlyb25tZW50IHdyYW5nbGVyIHN0YXRlIGlzIGRpc3Bvc2FibGU7IHdpcGUgaXQgZW50aXJlbHkgKG5vdCBqdXN0IEQxKSBiZWZvcmVcbiAgICAvLyBtaWdyYXRpbmcsIHNpbmNlIHN0YWxlIEtWIGNhY2hlIGVudHJpZXMgb3IgRHVyYWJsZSBPYmplY3Qgc3RvcmFnZSBjYW4gYnJlYWsgZTJlIHRlc3RzLlxuICAgIGNvbnN0IHdyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMgPVxuICAgICAgaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpXG4gICAgICAgID8gW2BybSAtUmYgXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImBdXG4gICAgICAgIDogW107XG4gICAgLy8gQSBwcm9qZWN0IHdob3NlIEQxIGJpbmRpbmdzIGNhcnJ5IHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGFwcGxpZXMgdGhlbSB3aXRoIHdyYW5nbGVyXG4gICAgLy8gKHNlZSBXb3JrZXJzU2NyaXB0cyAvIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKS4gUnVubmluZyBkcml6emxlLWtpdCBtaWdyYXRlIGFnYWluc3RcbiAgICAvLyB0aGUgc2FtZSBsb2NhbCBEMSB3b3VsZCBhcHBseSB0aGUgc2FtZSBTUUwgdHdpY2Ug4oCUIGRyaXp6bGUncyBnZW5lcmF0ZWQgc3RhdGVtZW50cyBhcmUgbm90XG4gICAgLy8gaWRlbXBvdGVudCAoYENSRUFURSBJTkRFWGAgd2l0aG91dCBJRiBOT1QgRVhJU1RTKSDigJQgc28gZHJpenpsZSBzdGF5cyBPUk0tb25seSB0aGVyZS5cbiAgICBjb25zdCBtaWdyYXRlc0QxV2l0aFdyYW5nbGVyID0gISFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kcyA9IFtcbiAgICAgIC4uLndyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMsXG4gICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc0RyaXp6bGUgJiYgIW1pZ3JhdGVzRDFXaXRoV3JhbmdsZXJcbiAgICAgICAgPyBbd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdCwgZHJpenpsZVNjcmlwdHMubWlncmF0ZUZvclN0YXJ0KHByb2plY3QpKV1cbiAgICAgICAgOiBbXSksXG4gICAgXTtcbiAgICAvLyBTcGxpdHRpbmcgbWF5IGN1dCB0aHJvdWdoIGEgYChjZCDigKYgJiYg4oCmKWAgc3Vic2hlbGwsIGJ1dCByZWpvaW5pbmcgd2l0aCAnICYmICcgYW5kIHBlci1waWVjZVxuICAgIC8vIHJlZGlyZWN0cyBrZWVwcyB0aGUgc2NyaXB0IHZhbGlkLCBhbmQgd2ItZ2VuZXJhdGVkIHBhdGhzIG5ldmVyIGNvbnRhaW4gJyYmJy5cbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLmZsYXRNYXAoKGNtZCkgPT4gY21kLnNwbGl0KCcmJicpKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCBwbGF5d3JpZ2h0Q29tbWFuZCA9IGJ1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cywgYXJndi5iYWlsLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgNjAwMDAwIC1pIDIwMDAnKX1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICctLWFsbG93T25seScsXG4gICAgICAgICctLXdhdGNoPWZhbHNlJyxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsPTEnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ2J1bicsXG4gICAgICAgICd0ZXN0JyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbCddIDogW10pLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiAnZWNobyBcIk5vIHRlc3RzLlwiJztcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMTAwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCAtaSA1MDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCAtaSAxMDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMTAwMDAgLWkgMjAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDIwMDAwIC1pIDQwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA2MDAwMCAtaSA1MDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgOTAwMDAgLWkgMTAwMDAnKX1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0KX0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGEgd2FpdC1vbiBib290IGNoZWNrIHBvbGxpbmcgYGh0dHAtZ2V0Oi8vbG9jYWxob3N0Ojxwb3J0PmAuIGBsb2NhbGhvc3RgIChub3QgYDEyNy4wLjAuMWApXG4gKiBsZXRzIE5vZGUncyBIYXBweSBFeWViYWxscyB0cnkgYm90aCBhZGRyZXNzIGZhbWlsaWVzOiBvbiBtYWNPUywgZGV2IHNlcnZlcnMgd2l0aG91dCBhbiBleHBsaWNpdFxuICogaG9zdCAoZS5nLiB2aW5leHQvVml0ZSkgY2FuIGJpbmQgSVB2Ni1vbmx5IChgOjoxYCksIHNvIGFuIElQdjQtb25seSBwb2xsIHdvdWxkIGhhbmcgdW50aWwgdGltZW91dFxuICogZXZlbiB0aG91Z2ggdGhlIHNlcnZlciBpcyB1cC4gVGhlIGBOT19QUk9YWWAvYG5vX3Byb3h5YCBwcmVmaXgga2VlcHMgdGhlIGxvb3BiYWNrIHBvbGwgb2ZmIEhUVFBcbiAqIHByb3hpZXM6IHdhaXQtb24ncyBheGlvcyBhcHBsaWVzIGBIVFRQKFMpX1BST1hZYCBlbnYgdmFycyB1bmxlc3MgYE5PX1BST1hZYCBtYXRjaGVzIHRoZSBwb2xsZWRcbiAqIGhvc3QsIGFuZCBleGlzdGluZyBgTk9fUFJPWFlgIGNvbnZlbnRpb25zIG1heSBsaXN0IGAxMjcuMC4wLjFgIHdpdGhvdXQgYGxvY2FsaG9zdGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsIHdhaXRPbkFyZ3M/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYE5PX1BST1hZPWxvY2FsaG9zdCBub19wcm94eT1sb2NhbGhvc3Qgd2FpdC1vbiAke3dhaXRPbkFyZ3MgPyBgJHt3YWl0T25BcmdzfSBgIDogJyd9aHR0cC1nZXQ6Ly9sb2NhbGhvc3Q6JHtwb3J0fWA7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9qZWN0LmZpbmRGaWxlKCdzY3JpcHRzL3N0YXJ0LXByb2R1Y3Rpb24uc2gnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChcbiAgcGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdLFxuICB0YXJnZXRzOiBUZXN0QXJndlsndGFyZ2V0cyddLFxuICBiYWlsPzogYm9vbGVhbixcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBbJ0JVTicsICdwbGF5d3JpZ2h0J107XG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXRzID0gdGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gIGlmIChwbGF5d3JpZ2h0QXJnc1swXSAhPT0gJ3Rlc3QnIHx8ICFub3JtYWxpemVkVGFyZ2V0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFsuLi5iYXNlLCAuLi5wbGF5d3JpZ2h0QXJncywgLi4uZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NdLCBiYWlsKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3QgPSBwbGF5d3JpZ2h0QXJncy5zbGljZSgxKTtcbiAgY29uc3QgZXhwbGljaXRUYXJnZXRJbmRleGVzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMocmVzdCk7XG4gIGNvbnN0IHJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQgPVxuICAgIGV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5sZW5ndGggPT09IDAgPyByZXN0IDogcmVzdC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhZXhwbGljaXRUYXJnZXRJbmRleGVzLmluY2x1ZGVzKGluZGV4KSk7XG4gIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihcbiAgICBbLi4uYmFzZSwgJ3Rlc3QnLCAuLi5ub3JtYWxpemVkVGFyZ2V0cywgLi4ucmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCwgLi4uZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NdLFxuICAgIGJhaWxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oY29tbWFuZEFyZ3M6IHN0cmluZ1tdLCBiYWlsPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHBsYXl3cmlnaHRJbmRleCA9IGNvbW1hbmRBcmdzLmluZGV4T2YoJ3BsYXl3cmlnaHQnKTtcbiAgY29uc3QgaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQgPSBwbGF5d3JpZ2h0SW5kZXggIT09IC0xICYmIGNvbW1hbmRBcmdzW3BsYXl3cmlnaHRJbmRleCArIDFdID09PSAndGVzdCc7XG4gIGlmICghYmFpbCB8fCAhaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIGlmIChjb21tYW5kQXJncy5zb21lKChhcmcpID0+IGFyZyA9PT0gJy0tbWF4LWZhaWx1cmVzJyB8fCBhcmcuc3RhcnRzV2l0aCgnLS1tYXgtZmFpbHVyZXM9JykpKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLmNvbW1hbmRBcmdzLCAnLS1tYXgtZmFpbHVyZXM9MSddKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGFyZ3M6IHN0cmluZ1tdKTogbnVtYmVyW10ge1xuICBsZXQgcGVuZGluZ1ZhbHVlTW9kZTogJ29wdGlvbmFsJyB8ICdyZXF1aXJlZCcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHRhcmdldEluZGV4ZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGFyZ10gb2YgYXJncy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSkge1xuICAgICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUgPT09ICdyZXF1aXJlZCcgfHwgIWFyZy5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgIHJldHVybiBbLi4udGFyZ2V0SW5kZXhlcywgLi4uYXJncy5zbGljZShpbmRleCArIDEpLm1hcCgoXywgb2Zmc2V0KSA9PiBpbmRleCArIDEgKyBvZmZzZXQpXTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICBpZiAoYXJnLmluY2x1ZGVzKCc9JykpIGNvbnRpbnVlO1xuICAgICAgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAncmVxdWlyZWQnO1xuICAgICAgfSBlbHNlIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ29wdGlvbmFsJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0nKSAmJiBhcmcgIT09ICctJykge1xuICAgICAgY29uc3Qgc2hvcnRPcHRpb24gPSBhcmcuc2xpY2UoMCwgMik7XG4gICAgICBpZiAoYXJnLmxlbmd0aCA9PT0gMiAmJiBQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoc2hvcnRPcHRpb24pKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAncmVxdWlyZWQnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRhcmdldEluZGV4ZXMucHVzaChpbmRleCk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0SW5kZXhlcztcbn1cblxuY29uc3QgUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFtcbiAgJy0tYnJvd3NlcicsXG4gICctLWNvbmZpZycsXG4gICctLWdyZXAnLFxuICAnLS1ncmVwLWludmVydCcsXG4gICctLWdsb2JhbC10aW1lb3V0JyxcbiAgJy0tbWF4LWZhaWx1cmVzJyxcbiAgJy0tb3V0cHV0JyxcbiAgJy0tcHJvamVjdCcsXG4gICctLXJlcGVhdC1lYWNoJyxcbiAgJy0tcmVwb3J0ZXInLFxuICAnLS1yZXRyaWVzJyxcbiAgJy0tc2hhcmQnLFxuICAnLS10ZXN0LWxpc3QnLFxuICAnLS10ZXN0LWxpc3QtaW52ZXJ0JyxcbiAgJy0tdGltZW91dCcsXG4gICctLXRyYWNlJyxcbiAgJy0tdHNjb25maWcnLFxuICAnLS11aS1ob3N0JyxcbiAgJy0tdWktcG9ydCcsXG4gICctLXVpLXRpdGxlJyxcbiAgJy0td29ya2VycycsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMgPSBuZXcgU2V0KFtcbiAgJy0tb25seS1jaGFuZ2VkJyxcbiAgJy0tdXBkYXRlLXNuYXBzaG90cycsXG4gICctLXVwZGF0ZS1zb3VyY2UtbWV0aG9kJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoWyctYycsICctZycsICctaiddKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzLCBidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZCwgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gc3VwZXIudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBzdGFydENvbW1hbmQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXRzID0gdGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC9lMmUvJ107XG4gICAgY29uc3QgdGVzdENvbW1hbmQgPSB0aGlzLnRlc3RVbml0KHByb2plY3QsIHsgLi4uYXJndiwgdGFyZ2V0czogbm9ybWFsaXplZFRhcmdldHMgfSk7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA2MDAwMDAgLWkgMjAwMCcpfSAmJiAke3Rlc3RDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBuZXh0IGRldiAtLXR1cmJvcGFjayAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW3Byb2plY3QuYnVpbGRDb21tYW5kLCBgWUFSTiBuZXh0IHN0YXJ0ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCldO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IFNFUlZFUl9MT0dfRklMRSA9ICdzZXJ2ZXIubG9nJztcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgU0VSVkVSX0xPR19GSUxFIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIHJ1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ30gfCB0ZWUgJHtTRVJWRVJfTE9HX0ZJTEV9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgKX1gXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFUHJvZHVjdGlvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVEb2NrZXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFJlbWl4IGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBSZW1peFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgcmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQsXG4gIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQsXG4gIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kLFxuICBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIsXG59IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgdmluZXh0IChOZXh0LmpzIG9uIFZpdGUpIGFwcHMgdGFyZ2V0aW5nIENsb3VkZmxhcmUgV29ya2Vycy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVmluZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIC8vIFVubGlrZSBgbmV4dCBkZXZgLCBWaXRlLWJhc2VkIHZpbmV4dCBkb2VzIG5vdCByZWFkIHRoZSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgIGNvbnN0IGRldkNvbW1hbmQgPSBgWUFSTiB2aW5leHQgZGV2IC0tcG9ydCAke3Byb2plY3QuZW52LlBPUlR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gICAgLy8gVGhlIENsb3VkZmxhcmUgdml0ZSBwbHVnaW4gKG1pbmlmbGFyZSkgcmVhZHMgcnVudGltZSB2YXJzIG9ubHkgZnJvbSBhIC5kZXYudmFycyBmaWxlLFxuICAgIC8vIHNvIGl0IG11c3QgYmUgcmVnZW5lcmF0ZWQgZnJvbSB0aGUgd2ItbWFuYWdlZCAuZW52IGZpbGVzIGJlZm9yZSBzZXJ2aW5nLlxuICAgIGNvbnN0IGNvbW1hbmRzID0gW2J1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJy5kZXYudmFycycpXTtcbiAgICAvLyBgdmluZXh0IGRldmAgKG1pbmlmbGFyZSkgc3RhcnRzIHdpdGggYW4gZW1wdHkgbG9jYWwgRDEgYW5kIGFwcGxpZXMgbm8gbWlncmF0aW9ucyBpdHNlbGY7XG4gICAgLy8gdGhlIHRlc3QgZW52aXJvbm1lbnQgd2lwZXMgaXRzIHN0YXRlIGRpcmVjdG9yeSwgc28gZXZlcnkgcGFnZSB3b3VsZCA1MDAgd2l0aG91dCB0aGlzLlxuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmQgPSBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpID8gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG1pZ3JhdGlvbkNvbW1hbmQpIGNvbW1hbmRzLnB1c2gobWlncmF0aW9uQ29tbWFuZCk7XG4gICAgcmV0dXJuIFsuLi5jb21tYW5kcywgZGV2Q29tbWFuZF0uam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIC8vIFNlcnZpbmcgdGhlIGJ1aWx0IHdvcmtlciBzdGFydHMgZnJvbSBhbiBlbXB0eSAob3Igd2lwZWQpIGxvY2FsIEQxLCBzbyB3cmFuZ2xlci1uYXRpdmVcbiAgICAvLyBtaWdyYXRpb25zIChpZiBhbnkpIG11c3QgYmUgYXBwbGllZCBmaXJzdDsgZHJpenpsZS9wcmlzbWEgbWlncmF0aW9ucyBhcmUgaGFuZGxlZCBieVxuICAgIC8vIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQuXG4gICAgY29uc3QgZDFNaWdyYXRpb25zQ29tbWFuZCA9IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpO1xuICAgIC8vIGB2aW5leHQgYnVpbGRgIGVtaXRzIGEgd29ya2VyIGJ1bmRsZSBhbmQgaXRzIHdyYW5nbGVyIGNvbmZpZyB1bmRlciBkaXN0L3NlcnZlciwgc28gdGhlXG4gICAgLy8gLmRldi52YXJzIGZpbGUgZXhwb3Npbmcgd2ItbWFuYWdlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCBiZSBnZW5lcmF0ZWQgYWZ0ZXIgYnVpbGRpbmcuXG4gICAgLy8gYC0tbG9jYWwtdXBzdHJlYW1gIGtlZXBzIHJlcXVlc3QgVVJMcyBvbiB0aGUgbG9jYWwgaG9zdDsgb3RoZXJ3aXNlLCB3cmFuZ2xlciBkZXYgc2ltdWxhdGVzXG4gICAgLy8gdGhlIHByb2R1Y3Rpb24gY3VzdG9tIGRvbWFpbiBkZWNsYXJlZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnIHJvdXRlcy5cbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICdkaXN0L3NlcnZlci8uZGV2LnZhcnMnKSxcbiAgICAgIC4uLihkMU1pZ3JhdGlvbnNDb21tYW5kID8gW2QxTWlncmF0aW9uc0NvbW1hbmRdIDogW10pLFxuICAgICAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoXG4gICAgICAgIGBkZXYgLS1jb25maWcgZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbiAtLWlwIDEyNy4wLjAuMSAtLXBvcnQgJHtwb3J0fSAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cIiAtLWxvY2FsLXVwc3RyZWFtIGxvY2FsaG9zdDoke3BvcnR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKClcbiAgICAgICksXG4gICAgXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdmluZXh0U2NyaXB0cyA9IG5ldyBWaW5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQge1xuICBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCxcbiAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZCxcbiAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBwbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAoZGV0ZWN0ZWQgdmlhIGEgd3JhbmdsZXJcbiAqIGNvbmZpZyBmaWxlIHdoZW4gbm8gb3RoZXIgZnJhbWV3b3JrIG1hdGNoZXM7IHZpbmV4dCBhcHBzIGhhdmUgdGhlaXIgb3duIHNjcmlwdHMpLlxuICogRXh0ZW5kcyBIdHRwU2VydmVyU2NyaXB0cyBzbyB0aGF0IGUyZSB0ZXN0cyBydW4gdmlhIHRoZSB1bml0LXRlc3QgcnVubmVyIGFnYWluc3QgdGhlIHJ1bm5pbmdcbiAqIHdvcmtlciB3aGVuIHRoZSBwcm9qZWN0IGhhcyBubyBQbGF5d3JpZ2h0IGNvbmZpZy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgV29ya2Vyc1NjcmlwdHMgZXh0ZW5kcyBIdHRwU2VydmVyU2NyaXB0cyB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdCwgYXJndikuam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgLy8gd3JhbmdsZXIgZGV2IGJ1bmRsZXMgdGhlIHdvcmtlciBpdHNlbGYsIHNvIG5vIHNlcGFyYXRlIGJ1aWxkIHN0ZXAgaXMgbmVlZGVkLlxuICAgIHJldHVybiB0aGlzLmJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0LCBhcmd2KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzg3ODcnO1xuICAgIGNvbnN0IHN0YXRlRGlyID0gZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpO1xuXG4gICAgLy8gVGhlc2UgaGVscGVycyByZWFkIHRoZSBkZWZhdWx0LW5hbWVkIHdyYW5nbGVyIGNvbmZpZzsgdGhhdCBpcyBzYWZlIGJlY2F1c2Ugd29ya2Vyc1NjcmlwdHNcbiAgICAvLyBpdHNlbGYgaXMgb25seSBzZWxlY3RlZCB3aGVuIHN1Y2ggYSBjb25maWcgZmlsZSBleGlzdHMgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5LlxuICAgIGNvbnN0IGNvbW1hbmRzID0gW2J1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJy5kZXYudmFycycpXTtcbiAgICAvLyBBcHBseSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyAoaWYgYW55KSBzbyB0aGUgbG9jYWwgZGF0YWJhc2UgbWF0Y2hlcyB0aGUgZGVwbG95ZWQgb25lLlxuICAgIGNvbnN0IGQxTWlncmF0aW9uc0NvbW1hbmQgPSBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KTtcbiAgICBpZiAoZDFNaWdyYXRpb25zQ29tbWFuZCkge1xuICAgICAgY29tbWFuZHMucHVzaChkMU1pZ3JhdGlvbnNDb21tYW5kKTtcbiAgICB9XG4gICAgY29tbWFuZHMucHVzaChcbiAgICAgIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKFxuICAgICAgICBgZGV2IC0taXAgMTI3LjAuMC4xIC0tcG9ydCAke3Byb2plY3QuZW52LlBPUlR9IC0tcGVyc2lzdC10byBcIiR7c3RhdGVEaXJ9XCIgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB3b3JrZXJzU2NyaXB0cyA9IG5ldyBXb3JrZXJzU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgd29ya2Vyc1NjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSB7XG4gICAgICAgIC8vIHZpbmV4dCBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIHRoaXMgY2hlY2sgbXVzdCBjb21lIGZpcnN0LlxuICAgICAgICBzY3JpcHRzID0gdmluZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpKSB7XG4gICAgICAgIC8vIFBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHA7IHZpbmV4dCBhcHBzIGFyZSBkZXRlY3RlZCBhYm92ZS5cbiAgICAgICAgc2NyaXB0cyA9IHdvcmtlcnNTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdkZXZlbG9wbWVudCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREZXYocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgc2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgd29ya2Vyc1NjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCA9IG5ldyBSZWdFeHAoYCR7U3RyaW5nLmZyb21Db2RlUG9pbnQoMjcpfVxcXFxbWzAtP10qWyAtL10qW0Atfl1gLCAnZycpO1xuY29uc3QgU0lNSUxBUl9URVNUX09VVFBVVF9MT09LQkFDS19MSU5FX0NPVU5UID0gMjAwO1xuY29uc3QgU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTyA9IDAuMDU7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOiAnSG93IHRvIHJ1biBFMkUgdGVzdHMnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGJhaWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0b3AgdGVzdHMgYWZ0ZXIgdGhlIGZpcnN0IGZhaWx1cmUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGFycmF5OiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnVW5pdCBvciBFMkUgdGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBUZXN0Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8XG4gIEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuPjtcblxuZXhwb3J0IHR5cGUgVGVzdENvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFRlc3RDb21tYW5kT3B0aW9ucz4gJiB7ICctLSc/OiBzdHJpbmdbXSB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSdW5PcHRpb25zIHtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFRlc3RDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGZsYWdzIHRvIFBsYXl3cmlnaHQuIEV4YW1wbGU6IHdiIHRlc3QgLS0gLS1ncmVwICd1cGxvYWRlZCBpbWFnZSBhc3NldCdcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KTogQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+ID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAub3B0aW9ucyhidWlsZGVyKVxuICAgICAgLnBvc2l0aW9uYWwoJ3RhcmdldHMnLCBhcmd1bWVudHNCdWlsZGVyLnRhcmdldHMpIGFzIEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHRlc3QoYXJndiBhcyBUZXN0Q29tbWFuZEFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KGFyZ3Y6IFRlc3RDb21tYW5kQXJndiwgb3B0aW9uczogVGVzdFJ1bk9wdGlvbnMgPSB7fSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHRlc3RBcmd2ID0gd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudihhcmd2KTtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKHRlc3RBcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9ICh0ZXN0QXJndi50YXJnZXRzID8/IFtdKSBhcyBzdHJpbmdbXTtcbiAgY29uc3QgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSB0ZXN0QXJndlsnLS0nXSA/PyBbXTtcbiAgY29uc3QgeyBzaG91bGRSdW5FMmUsIHNob3VsZFJ1blVuaXQgfSA9IHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyh0ZXN0VGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIC8vIFJlc29sdmUgdGhlIGVudmlyb25tZW50IGVhZ2VybHk6IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYgZm9yY2VzIHRoZSB0ZXN0IGNhc2NhZGUgYW5kXG4gICAgLy8gUHJvamVjdC5jb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYgZmFsbHMgYmFjayBXQl9FTlYgdG8gdGhhdCBtb2RlIOKAlCBidXQgdGhlIGVudiBnZXR0ZXIgaXNcbiAgICAvLyBsYXp5LCBzbyBhIHByb2plY3Qgd2l0aCBubyBydW5uYWJsZSB0ZXN0cyB3b3VsZCBvdGhlcndpc2Ugc2tpcCB0aGUgdmFsaWRhdGlvbiBlbnRpcmVseS5cbiAgICB2b2lkIHByb2plY3QuZW52O1xuXG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLnZpbmV4dCB8fCBkZXZEZXBzLnZpbmV4dCkge1xuICAgICAgLy8gdmluZXh0IGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gdGhpcyBjaGVjayBtdXN0IGNvbWUgZmlyc3QuXG4gICAgICBzY3JpcHRzID0gdmluZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkge1xuICAgICAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICAgICAgc2NyaXB0cyA9IHdvcmtlcnNTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgY29uc3QgZGVmYXVsdFVuaXRUYXJnZXRzID0gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3QpO1xuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGRlZmF1bHRVbml0VGFyZ2V0cyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB0YXJnZXRzID1cbiAgICAgICAgdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogZGVmYXVsdFVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBkZWZhdWx0VW5pdFRhcmdldHMgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHMgfTtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVW5pdFRlc3RDb21tYW5kKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICAgICAgICB0aW1lb3V0OiB0ZXN0QXJndi51bml0VGltZW91dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgaWYgKHNob3VsZFJ1bkUyZSkgd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUocHJvamVjdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLmJsaXR6IHx8IGRlcHMubmV4dCB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddIHx8IGRldkRlcHMudml0ZSkge1xuICAgICAgc3dpdGNoICh0ZXN0QXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsnY29kZWdlbicsIGBodHRwOi8vbG9jYWxob3N0OiR7cHJvamVjdC5lbnYuUE9SVH1gXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLyoqXG4gKiBXYXJuIHdoZW4gYSBwcm9qZWN0IGhhcyBhIFBsYXl3cmlnaHQgY29uZmlnIGJ1dCBubyB0ZXN0L2UyZSBkaXJlY3RvcnkuXG4gKiB3YiBkaXNjb3ZlcnMgZTJlIHRlc3RzIG9ubHkgdW5kZXIgdGVzdC9lMmUvLCBzbyBzdWNoIHByb2plY3RzIHdvdWxkIG90aGVyd2lzZSBoYXZlIHRoZWlyXG4gKiBQbGF5d3JpZ2h0IHNwZWNzIHNpbGVudGx5IHNraXBwZWQgYW5kIGB3YiB0ZXN0YCAvIGB3YiB2ZXJpZnkgLS1mdWxsYCB3b3VsZCByZXBvcnQgc3VjY2Vzc1xuICogd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm5JZlBsYXl3cmlnaHRTcGVjc0FyZVVuZGlzY292ZXJhYmxlKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICduYW1lJyB8ICdwYWNrYWdlSnNvbic+XG4pOiB2b2lkIHtcbiAgLy8gQ2FsbGVycyBpbnZva2UgdGhpcyBvbmx5IGFmdGVyIGVzdGFibGlzaGluZyB0aGF0IHRlc3QvZTJlIGlzIG1pc3NpbmcsIHNvIGl0IGlzIG5vdCByZS1jaGVja2VkXG4gIC8vIGhlcmUuIEEgd29ya3NwYWNlIHJvb3QgZGVsZWdhdGVzIGUyZSB0byBpdHMgcGFja2FnZXMsIHNvIGl0IG5ldmVyIHdhcm5zIChjaGVja2VkIGZpcnN0IHRvIHNraXBcbiAgLy8gdGhlIGZpbGVzeXN0ZW0gbG9va3VwIGJlbG93KS4gT25seSBhIHByb2plY3QncyBPV04gUGxheXdyaWdodCBjb25maWcgY291bnRzOiBgaGFzUGxheXdyaWdodENvbmZpZ2BcbiAgLy8gd2Fsa3MgdXAgdG8gdGhlIG1vbm9yZXBvIHJvb3QsIHNvIHJldXNpbmcgaXQgd291bGQgZmFsc2UtcG9zaXRpdmUgb24gbGlicmFyeSBwYWNrYWdlcyBhbmQgdGhlXG4gIC8vIHJvb3QgaXRzZWxmLCB3aGljaCBsZWdpdGltYXRlbHkgc2hhcmUgYSByb290LWxldmVsIHBsYXl3cmlnaHQuY29uZmlnLnRzIGJ1dCBrZWVwIGUyZSBzcGVjcyBpbiBhXG4gIC8vIHNpbmdsZSBhcHAgcGFja2FnZS5cbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykgcmV0dXJuO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3BsYXl3cmlnaHQuY29uZmlnLnRzJykpKSByZXR1cm47XG5cbiAgY29uc29sZS53YXJuKFxuICAgIGNoYWxrLnllbGxvdyhcbiAgICAgIGBTa2lwcGluZyBlMmUgdGVzdHMgZm9yICR7cHJvamVjdC5uYW1lfTogYSBQbGF5d3JpZ2h0IGNvbmZpZyBleGlzdHMgYnV0IHRoZSB0ZXN0L2UyZSBkaXJlY3RvcnkgaXMgbWlzc2luZy4gd2Igb25seSBkaXNjb3ZlcnMgUGxheXdyaWdodCBzcGVjcyB1bmRlciB0ZXN0L2UyZS8sIHNvIG1vdmUgdGhlbSB0aGVyZSB0byBydW4gZTJlIHRlc3RzLmBcbiAgICApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFRlc3RDb21tYW5kQXJndiB7XG4gIGlmIChhcmd2LmVudj8ubGVuZ3RoIHx8IGFyZ3YuY2FzY2FkZUVudiB8fCBhcmd2LmNhc2NhZGVOb2RlRW52IHx8IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgPT09IGZhbHNlKSB7XG4gICAgLy8gRXhwbGljaXQgZW52IGZsYWdzIGtlZXAgdGhlaXIgZmlsZS1zZWxlY3Rpb24gc2VtYW50aWNzLCBidXQgdGhlIHNwYXduZWQgdGVzdHMgbXVzdCBzdGlsbFxuICAgIC8vIHJ1biBhcyBgdGVzdGAgd2hlbiB0aG9zZSBmaWxlcyBkZWZpbmUgbm8gV0JfRU5WICh0aGUgcHJlLTE1IGB8fD0gJ3Rlc3QnYCBiZWhhdmlvcikuXG4gICAgcmV0dXJuIHsgLi4uYXJndiwgY29tbWFuZERlZmF1bHRXYkVudjogJ3Rlc3QnIH07XG4gIH1cbiAgcmV0dXJuIHsgLi4uYXJndiwgY2FzY2FkZUVudjogJ3Rlc3QnIH07XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRVbml0VGFyZ2V0cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10gfCBmYWxzZSB7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKHByb2plY3QuaGFzVml0ZXN0ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnKSkpIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkgPyBbJ3Rlc3QnLCAnLS1leGNsdWRlJywgJ3Rlc3QvZTJlLyoqJ10gOiBbJ3Rlc3QnXTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXSxcbiAgb3B0aW9uczogVGVzdFJ1bk9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGNvbnN0IGJ1aWxkRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YsIHtcbiAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICB9KTtcbiAgaWYgKGJ1aWxkRXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gYnVpbGRFeGl0Q29kZTtcbiAgfVxuICBjb25zdCB0ZXN0RXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICB9KSxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgY29uc3Qgc3RvcEV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAodGVzdEV4aXRDb2RlICE9PSAwKSB7XG4gICAgcmV0dXJuIHRlc3RFeGl0Q29kZTtcbiAgfVxuICByZXR1cm4gc3RvcEV4aXRDb2RlO1xufVxuXG5mdW5jdGlvbiBydW5UZXN0Q29tbWFuZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bMl0sXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bM10gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHByb2Nlc3NTaWxlbnRPdXRwdXQ6IGRlZHVwZU5vaXN5VGVzdE91dHB1dCxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1blVuaXRUZXN0Q29tbWFuZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bMl0sXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bM10gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG9taXRTaWxlbnRTdGFydDogdHJ1ZSxcbiAgICBwcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHk6IHRydWUsXG4gICAgc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zOiAxMF8wMDAsXG4gICAgc2lsZW50U3VjY2Vzc01lc3NhZ2U6ICdVbml0IHRlc3RzIHBhc3NlZC4nLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVkdXBlTm9pc3lUZXN0T3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVjZW50UHJpbnRlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZWR1cGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBpdGVyYXRlTGluZXMob3V0cHV0KSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRMaW5lID0gbm9ybWFsaXplTGluZUZvclNpbWlsYXJpdHkobGluZSk7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lU2V0Lmhhcyhub3JtYWxpemVkTGluZSkpIGNvbnRpbnVlO1xuICAgIGlmIChyZWNlbnRQcmludGVkTGluZXMuc29tZSgocHJpbnRlZExpbmUpID0+IGFyZUxpbmVzU2ltaWxhcihwcmludGVkTGluZSwgbm9ybWFsaXplZExpbmUpKSkgY29udGludWU7XG5cbiAgICBwdXNoUmVjZW50UHJpbnRlZExpbmUocmVjZW50UHJpbnRlZExpbmVzLCByZWNlbnRQcmludGVkTGluZVNldCwgbm9ybWFsaXplZExpbmUpO1xuICAgIGRlZHVwZWRMaW5lcy5wdXNoKGxpbmUpO1xuICB9XG4gIHJldHVybiBkZWR1cGVkTGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uKiBpdGVyYXRlTGluZXMob3V0cHV0OiBzdHJpbmcpOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGxldCBsaW5lU3RhcnRJbmRleCA9IDA7XG4gIHdoaWxlIChsaW5lU3RhcnRJbmRleCA8PSBvdXRwdXQubGVuZ3RoKSB7XG4gICAgY29uc3QgbGluZUVuZEluZGV4ID0gb3V0cHV0LmluZGV4T2YoJ1xcbicsIGxpbmVTdGFydEluZGV4KTtcbiAgICBpZiAobGluZUVuZEluZGV4ID09PSAtMSkge1xuICAgICAgeWllbGQgb3V0cHV0LnNsaWNlKGxpbmVTdGFydEluZGV4KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCk7XG4gICAgbGluZVN0YXJ0SW5kZXggPSBsaW5lRW5kSW5kZXggKyAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hSZWNlbnRQcmludGVkTGluZShsaW5lczogc3RyaW5nW10sIGxpbmVTZXQ6IFNldDxzdHJpbmc+LCBsaW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGluZXMucHVzaChsaW5lKTtcbiAgbGluZVNldC5hZGQobGluZSk7XG4gIGlmIChsaW5lcy5sZW5ndGggPD0gU0lNSUxBUl9URVNUX09VVFBVVF9MT09LQkFDS19MSU5FX0NPVU5UKSByZXR1cm47XG5cbiAgY29uc3QgcmVtb3ZlZExpbmUgPSBsaW5lcy5zaGlmdCgpO1xuICBpZiAocmVtb3ZlZExpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxpbmVTZXQuZGVsZXRlKHJlbW92ZWRMaW5lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZVxuICAgIC5yZXBsYWNlQWxsKEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQLCAnJylcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2VBbGwoL14oPzpcXFtbXlxcXV0rXFxdXFxzKikrL2csICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXChub2RlOlxcZCtcXCkvZywgJyhub2RlOjxudW1iZXI+KScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkKyk/Wj9cXGIvZywgJzx0aW1lc3RhbXA+JylcbiAgICAucmVwbGFjZUFsbCgvKFs/Jl1jYWNoZT0pXFxkKy9nLCAnJDE8bnVtYmVyPicpO1xufVxuXG5mdW5jdGlvbiBhcmVMaW5lc1NpbWlsYXIoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4TGVuZ3RoID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgaWYgKG1heExlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIGlmIChNYXRoLmFicyhhLmxlbmd0aCAtIGIubGVuZ3RoKSA+IG1heExlbmd0aCAqIFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZGlzdGFuY2UoYSwgYikgLyBtYXhMZW5ndGggPD0gU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoXG4gIGUyZVRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXSxcbiAgYWRkaXRpb25hbEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncykubGVuZ3RoID4gMDtcbiAgcmV0dXJuIFsndGVzdCcsIC4uLihlMmVUYXJnZXRzLmxlbmd0aCA+IDAgfHwgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPyBbXSA6IFsndGVzdC9lMmUvJ10pLCAuLi5hZGRpdGlvbmFsQXJnc107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHMoXG4gIHRlc3RUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHsgc2hvdWxkUnVuVW5pdDogYm9vbGVhbjsgc2hvdWxkUnVuRTJlOiBib29sZWFuIH0ge1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMCAmJiBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPT09IDA7XG5cbiAgcmV0dXJuIHtcbiAgICBzaG91bGRSdW5Vbml0OiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNVbml0VGFyZ2V0cyxcbiAgICBzaG91bGRSdW5FMmU6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHMgfHwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID4gMCxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aW5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHdvcmtlcnNTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vd29ya2Vyc1NjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUgfSBmcm9tICcuL3Rlc3QuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gU3Bhd25lZCBjb21tYW5kcyByZS1kZXJpdmUgdGhlaXIgZG90ZW52IGNhc2NhZGUgZnJvbSB0aGUgZXhwb3J0ZWQgV0JfRU5WLCBzbyBhbiB1bmV4cG9ydGVkXG4gIC8vIFdCX0VOViB3b3VsZCBsZXQgYSBjb21taXR0ZWQgYC5lbnZgIChlLmcuIFdCX0VOVj1kZXZlbG9wbWVudCkgc2VsZWN0IHRoZSBkZXZlbG9wbWVudFxuICAvLyBlbnZpcm9ubWVudCDigJQgcnVubmluZyB0aGUgZGVzdHJ1Y3RpdmUgZTJlIHN1aXRlIGFnYWluc3QgdGhlIGRldmVsb3BlcidzIG93biBkYXRhYmFzZS5cbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIHByb2plY3QuZW52LkNJIHx8PSAnMSc7XG4gICAgLy8gT3ZlcndyaXRlLCBub3QgfHw9OiBwcm9qZWN0LmVudiBhbHJlYWR5IGNhcnJpZXMgdGhlIGRvdGVudi1kZXJpdmVkIHZhbHVlLlxuICAgIHByb2plY3QuZW52LldCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy52aW5leHQgfHwgZGV2RGVwcy52aW5leHQpIHtcbiAgICAgIC8vIHZpbmV4dCBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIHRoaXMgY2hlY2sgbXVzdCBjb21lIGZpcnN0LlxuICAgICAgc2NyaXB0cyA9IHZpbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCkpIHtcbiAgICAgIC8vIFBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHA7IHZpbmV4dCBhcHBzIGFyZSBkZXRlY3RlZCBhYm92ZS5cbiAgICAgIHNjcmlwdHMgPSB3b3JrZXJzU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0LW9uLWNpXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGNvbnN0IGhhc0RvY2tlcmZpbGUgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGU7XG4gICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICAvLyBDb25maXJtIGRldiBzZXJ2ZXIgc3RhcnR1cCBmb3IgY29uc2lzdGVuY3kgYWNyb3NzIHByb2plY3RzIHdpdGggRTJFIHRlc3RzLlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChhd2FpdCBzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcmlwdCA9IGhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge30pXG4gICAgICAgIDogYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCB7fSk7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIHNjcmlwdC5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHtcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5JZlBsYXl3cmlnaHRTcGVjc0FyZVVuZGlzY292ZXJhYmxlKHByb2plY3QpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdHlwZUNoZWNrKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlQ2hlY2soYXJndjogVHlwZUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goLi4uYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkpO1xuICAgIH1cbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3B5cmlnaHQnKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgfVxuICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgcHJlc2VydmVDb2xvcjogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgYHR5cGVzY3JpcHRgIChgdHNjYCk7IHdiZnkgcmVtb3ZlcyB0aGVcbiAgLy8gYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgcHJldmlldyBmcm9tIG5vbi1OZXh0LmpzIHJlcG9zIChOZXh0LmpzLWZhbWlseVxuICAvLyByZXBvcyBrZWVwIGl0IGZvciBgbmV4dCBidWlsZGApLCBzbyByZXBvcyBzdGlsbCBvbiB0aGUgcHJldmlldyBzaG91bGQgcnVuIHdiZnlcbiAgLy8gaW5zdGVhZCBvZiByZWx5aW5nIG9uIGEgdHNnbyBmYWxsYmFjayBoZXJlLlxuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCd0eXBlc2NyaXB0JykpIHtcbiAgICByZXR1cm4gWydCVU4gdHNjIC0tbm9FbWl0J107XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzLCBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2LCB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52IH0gZnJvbSAnLi90ZXN0LmpzJztcbmltcG9ydCB7IHR5cGVDaGVjaywgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiB9IGZyb20gJy4vdHlwZWNoZWNrLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xudHlwZSBQYWNrYWdlQ29tbWFuZEFyZ3YgPSBQaWNrPFZlcmlmeUNvZGVDb21tYW5kQXJndiwgJ2RyeVJ1bicgfCAndmVyYm9zZSc+O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCAoYXJndi5mdWxsID8gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YpIDogdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2KTtcbiAgICBhd2FpdCBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGluc3RhbGxgLCBwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAnY2xlYW51cCcsXG4gICAgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBMaW50Q29tbWFuZEFyZ3YpLFxuICAgIHsgc2lsZW50OiB0cnVlIH1cbiAgKTtcbiAgLy8gVHlwZS1hd2FyZSBsaW50IHJlcG9ydHMgVHlwZVNjcmlwdCBkaWFnbm9zdGljcyBvbmx5IGZvciB0aGUgZmlsZXMgb3hsaW50IGFjdHVhbGx5IGxpbnRzLCBhbmRcbiAgLy8gdGhlIHNoYXJlZCBjb25maWcgaWdub3JlcyBkaXJlY3RvcmllcyB0c2Mgc3RpbGwgY29tcGlsZXMgKGUuZy4gYF9fZ2VuZXJhdGVkX19gLCBgQHR5cGVzYCxcbiAgLy8gYGRpc3RgKS4gS2VlcCB0aGUgdHlwZWNoZWNrIGNvbW1hbmQgc28gYHZlcmlmeWAgc3RheXMgZXF1aXZhbGVudCB0byBcInRoZSByZXBvc2l0b3J5IGNvbXBpbGVzXCIuXG4gIC8vIFRoZSBvdmVybGFwIHdpdGggbGludCBpcyBkZWxpYmVyYXRlOiBgLS10eXBlLWF3YXJlYCBhbHNvIHBvd2VycyB0eXBlLWF3YXJlIGxpbnQgcnVsZXMsIGFuZFxuICAvLyBkcm9wcGluZyBvbmx5IGAtLXR5cGUtY2hlY2tgIGZyb20gbGludCBzYXZlcyB+MC4xcywgZmFyIGxlc3MgdGhhbiB0aGUgY292ZXJhZ2UgaXQgd291bGQgY29zdC5cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAndHlwZWNoZWNrJyxcbiAgICAoKSA9PiB0eXBlQ2hlY2soeyAuLi5hcmd2LCBfOiBbJ3R5cGVjaGVjayddIH0gYXMgdW5rbm93biBhcyBUeXBlQ2hlY2tDb21tYW5kQXJndiksXG4gICAgeyBzaWxlbnQ6IHRydWUgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KHtcbiAgICAuLi5hcmd2LFxuICAgIF86IFsndGVzdCddLFxuICAgIGUyZTogJ2hlYWRsZXNzJyxcbiAgICBzaWxlbnQ6IHRydWUsXG4gIH0gYXMgdW5rbm93biBhcyBUZXN0Q29tbWFuZEFyZ3YpO1xuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSByZXR1cm47XG5cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGItcmVzZXQnXSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCAndGVzdCcpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKFxuICAgIGNoYWxrLnllbGxvdygnVGVzdHMgZmFpbGVkLiBUaGlzIHByb2plY3QgZGVmaW5lcyBcImRiLXJlc2V0XCIsIHNvIHdiIHdpbGwgcmVzZXQgdGhlIGRhdGFiYXNlIG9uY2UgYW5kIHJldHJ5IHRlc3RzLicpXG4gICk7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBkYi1yZXNldGAsIGZpbmRUZXN0UHJvamVjdChwcm9qZWN0LCB0ZXN0QXJndiksIHRlc3RBcmd2LCB7XG4gICAgcHJpbnRSYXdPdXRwdXQ6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IHJldHJ5RXhpdENvZGUgPSBhd2FpdCB0ZXN0KHRlc3RBcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gIGlmIChyZXRyeUV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke3JldHJ5RXhpdENvZGV9KTpgKSwgJ3Rlc3QgYWZ0ZXIgZGItcmVzZXQgcmV0cnknKSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldHJ5RXhpdENvZGUpO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignVGVzdHMgcGFzc2VkIGFmdGVyIGRiLXJlc2V0IHJldHJ5LicpKTtcbn1cblxuZnVuY3Rpb24gZmluZFRlc3RQcm9qZWN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFByb2plY3Qge1xuICBjb25zdCB0ZXN0UHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoIXRlc3RQcm9qZWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0IG5vdCBmb3VuZDogJHtwcm9qZWN0LmRpclBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHRlc3RQcm9qZWN0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5JblByb2Nlc3NDb21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBjb21tYW5kOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkpO1xuICB9XG4gIGNvbnN0IGV4aXRDb2RlID0gKGF3YWl0IGNvbW1hbmQoKSkgPz8gMDtcbiAgaWYgKGV4aXRDb2RlID09PSAwIHx8IG9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBjb21tYW5kTmFtZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFja2FnZUNvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHByaW50UmF3T3V0cHV0PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgcHJlc2VydmVDb2xvcjogZmFsc2UgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICghb3B0aW9ucy5wcmludFJhd091dHB1dCkge1xuICAgIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZCwgZXhpdENvZGUsIHJldC5zdGRvdXQpO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUHJpbnRzIHBhY2thZ2UgY29tbWFuZCBvdXRwdXQgZm9yIGB3YiB2ZXJpZnlgLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBzbyBzdWNjZXNzZnVsIG5vaXN5XG4gKiBjb21tYW5kcyBhcmUgc3VtbWFyaXplZCB3aGlsZSBmYWlsdXJlIG91dHB1dCByZW1haW5zIGF2YWlsYWJsZSBmb3IgZGlhZ25vc2lzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIFRoZSBleGVjdXRlZCBjb21tYW5kLlxuICogQHBhcmFtIGV4aXRDb2RlIFRoZSBjb21tYW5kIGV4aXQgY29kZS5cbiAqIEBwYXJhbSBvdXRwdXQgVGhlIG1lcmdlZCBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kOiBzdHJpbmcsIGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCAmJiAvXig/OmJ1bnx5YXJuKSAoPzppbnN0YWxsfGdlbi1jb2RlKSQvdS50ZXN0KGNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWRPdXRwdXQgPSBvdXRwdXQudHJpbSgpO1xuICBpZiAodHJpbW1lZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHRyaW1tZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdDogUHJvamVjdCk6IHtcbiAgZmFpbDogKGVycm9yPzogdW5rbm93bikgPT4gdm9pZDtcbiAgZmluaXNoOiAoKSA9PiB2b2lkO1xuICBzdWNjZWVkOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHdiRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcud2InKTtcbiAgZnMubWtkaXJTeW5jKHdiRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4od2JEaXJQYXRoLCAndmVyaWZ5LWZ1bGwubG9nJyk7XG4gIGNvbnN0IGxvZ0ZpbGUgPSBmcy5vcGVuU3luYyhsb2dGaWxlUGF0aCwgJ3cnKTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRvdXRXcml0ZSA9IHByb2Nlc3Muc3Rkb3V0LndyaXRlLmJpbmQocHJvY2Vzcy5zdGRvdXQpO1xuICBjb25zdCBvcmlnaW5hbFN0ZGVycldyaXRlID0gcHJvY2Vzcy5zdGRlcnIud3JpdGUuYmluZChwcm9jZXNzLnN0ZGVycik7XG4gIGxldCBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZG91dFdyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUob3JpZ2luYWxTdGRlcnJXcml0ZSwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihjaGFsay5ib2xkKCdGdWxsIGxvZzonKSwgbG9nRmlsZVBhdGgpKTtcblxuICBjb25zdCBmaW5pc2ggPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSBvcmlnaW5hbFN0ZG91dFdyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IG9yaWdpbmFsU3RkZXJyV3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuXG4gICAgY29uc3QgZWxhcHNlZFRpbWUgPSBmb3JtYXRFbGFwc2VkVGltZShEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBzdGF0dXMgPSBzdWNjZWVkZWQgPyAnU3VjY2VlZGVkJyA6ICdGYWlsZWQnO1xuICAgIGNvbnN0IHN1bW1hcnkgPSBgJHtzdGF0dXN9IGluICR7ZWxhcHNlZFRpbWV9LiBGdWxsIGxvZzogJHtsb2dGaWxlUGF0aH1cXG5gO1xuICAgIGNvbnN0IGNvbG9yZWRTdW1tYXJ5ID0gc3VjY2VlZGVkID8gY2hhbGsuZ3JlZW4oc3VtbWFyeSkgOiBjaGFsay5yZWQoc3VtbWFyeSk7XG4gICAgb3JpZ2luYWxTdGRvdXRXcml0ZShjb2xvcmVkU3VtbWFyeSk7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIHN1bW1hcnkpO1xuICAgIGZzLmNsb3NlU3luYyhsb2dGaWxlKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCBmaW5pc2gpO1xuXG4gIHJldHVybiB7XG4gICAgZmFpbDogKGVycm9yKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbmlzaDogKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignZXhpdCcsIGZpbmlzaCk7XG4gICAgICBmaW5pc2goKTtcbiAgICB9LFxuICAgIHN1Y2NlZWQ6ICgpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGVlV3JpdGUob3JpZ2luYWxXcml0ZTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlLCBsb2dGaWxlOiBudW1iZXIpOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUge1xuICByZXR1cm4gKChcbiAgICBjaHVuazogVWludDhBcnJheSB8IHN0cmluZyxcbiAgICBlbmNvZGluZ09yQ2FsbGJhY2s/OiBCdWZmZXJFbmNvZGluZyB8ICgoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpLFxuICAgIGNhbGxiYWNrPzogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkXG4gICkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9XG4gICAgICB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnXG4gICAgICAgID8gQnVmZmVyLmZyb20oY2h1bmssIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdzdHJpbmcnID8gZW5jb2RpbmdPckNhbGxiYWNrIDogJ3V0ZjgnKVxuICAgICAgICA6IGNodW5rO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBidWZmZXIpO1xuICAgIC8vIFdyaXRlIHRvIHRoZSB0ZXJtaW5hbCB2aWEgdGhlIG9yaWdpbmFsIHN0cmVhbSBtZXRob2Q6IGEgc3luY2hyb25vdXMgZnMud3JpdGVTeW5jIG9uIHRoZVxuICAgIC8vIHN0ZG91dC9zdGRlcnIgZmQgdGhyb3dzIEVBR0FJTiBvbiBDSSdzIG5vbi1ibG9ja2luZyBwaXBlcyB3aGVuIGxhcmdlIG91dHB1dCBmbHVzaGVzIGF0IG9uY2UsXG4gICAgLy8gd2hpbGUgdGhlIHN0cmVhbSBtZXRob2QgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBoYW5kbGVzIGJhY2twcmVzc3VyZS5cbiAgICByZXR1cm4gb3JpZ2luYWxXcml0ZShidWZmZXIsIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiBjYWxsYmFjayk7XG4gIH0pIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gYCR7cmVtYWluaW5nU2Vjb25kc31zYDtcbiAgfVxuICByZXR1cm4gYCR7bWludXRlc31tICR7cmVtYWluaW5nU2Vjb25kc31zYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBjb25jdXJyZW50bHlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jb25jdXJyZW50bHkuanMnO1xuaW1wb3J0IHsgZGVwbG95Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZGVwbG95LmpzJztcbmltcG9ydCB7IGRvdGVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2RvdGVudi5qcyc7XG5pbXBvcnQgeyBnZW5Db2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuQ29kZS5qcyc7XG5pbXBvcnQgeyBnZW5EZXZWYXJzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuRGV2VmFycy5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgbWFpbnRlbmFuY2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9tYWludGVuYW5jZS5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmVsZWFzZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JlbGVhc2UuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRyZWVLaWxsQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHJlZUtpbGwuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgdmVyaWZ5Q29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeUNvZGUuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52LlBBVEg/LmluY2x1ZGVzKCcvYnVuLW5vZGUtJykpIHtcbiAgICAgIC8vIE5vdCBmaXhlZCB1cCBoZXJlOiB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KSBtYXkgaGFuZyBvclxuICAgICAgLy8gY3Jhc2ggdW5kZXIgdGhlIHNoaW0sIGFuZCBzb21lICh3cmFuZ2xlciBkZXYpIGZhaWwgc2lsZW50bHksIHNvIHN1cmZhY2UgdGhlIGNhdXNlIHVwZnJvbnQuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiV2FybmluZzogUEFUSCBjb250YWlucyBhIGJ1bi1ub2RlIHNoaW0gKGZyb20gYGJ1biAtLWJ1bmAgb3IgYnVuZmlnJ3MgYHJ1bi5idW5gKTsgXCIgK1xuICAgICAgICAgICdydW4gd2Igd2l0aG91dCBgLS1idW5gIGFuZCByZW1vdmUgYFtydW5dIGJ1bmAgZnJvbSBidW5maWcudG9tbC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKHZlcmlmeUNvZGVDb21tYW5kKVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoY29uY3VycmVudGx5Q29tbWFuZClcbiAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgLmNvbW1hbmQoZG90ZW52Q29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuQ29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkRldlZhcnNDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQobWFpbnRlbmFuY2VDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmVsZWFzZUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNyw4LDksMTAsMTFdLCJtYXBwaW5ncyI6Inl6QkFlQSxTQUFnQixFQUFvQyxFQUFtQyxFQUErQixDQUNwSCxPQUFPLEVBQ0wsRUFBdUMsQ0FBVSxDQUFDLENBQUMsT0FBUSxHQUN6RCxFQUErQixDQUFnQixDQUNqRCxFQUNBLENBQ0YsQ0FDRixDQThCQSxTQUFnQixFQUFpQyxFQUE2QixFQUErQixDQVMzRyxJQUFNLEVBQXFCLEdBQThCLENBTXZELElBQU0sRUFBc0IsRUFBRyxpQkFBaUIsQ0FBTyxFQUNqRCxFQUFjLENBQUUsSUFBSyxFQUFhLG9CQUFxQixHQUFPLE9BQVEsQ0FBQyxvQkFBb0IsQ0FBRSxFQU83RixFQUFnQixJQUFJLElBQUksRUFBRyxTQUFTLEVBQUssTUFBTSxLQUFLLEVBQVMsY0FBYyxFQUFHLENBQVcsQ0FBQyxFQUNoRyxHQUFJLEVBQVEsU0FBUyxHQUFHLEVBQ3RCLElBQUssSUFBTSxLQUFXLEVBQUcsU0FBUyxFQUFTLENBQUUsR0FBRyxFQUFhLGdCQUFpQixFQUFLLENBQUMsRUFBRyxDQUNy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TSxHQUFHLElBQUksRUFBRSxLQUFLLFVBQVUsS0FBSyxZQUFZLEVBQUUsS0FBSyxhQUFhLEdBQUcsRUFBRSxLQUFLLFlBQVksR0FBRyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEtBQUssVUFBVSxNQUFVLE1BQU0seUJBQXlCLEVBQUUsSUFBTSxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLE1BQU0sSUFBSSxLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHRixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUlBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sR0FBRyxPQUFPLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEtBQUssSUFBSSxHQUFHLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxHQUFHLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsTUFBTSxHQUFHLEtBQUssY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsRUFBRSxLQUFLLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFNLE1BQUssTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLENBQUMsRUFBRSxJQUFNLEVBQUUsS0FBSyxPQUFXLEVBQUUsS0FBSyxjQUFvQixFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEtBQUssUUFBUSxFQUFFLEdBQUcsS0FBSyxnQkFBZ0IsS0FBSyxVQUFVLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFLElBQU0sRUFBRSxLQUFLLFdBQWUsRUFBRSxLQUFLLEVBQVEsRUFBRSxLQUFLLGFBQWEsRUFBRSxLQUFLLFdBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHRCxFQUFFLEdBQUcsRUFBRSxJQUFJQSxFQUFFLEdBQUcsR0FBR0EsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEVBQUUsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFRyxHQUFFLENBQUMsRUFBRUMsR0FBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUdKLEVBQUUsR0FBRyxFQUFFLElBQUlBLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFDLE1BQU1JLEdBQUUsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssR0FBRyxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksRUFBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUcsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRSxHQUFHLEVBQUUsSUFBSSxHQUFFLEVBQUUsRUFBRSxFQ1JobEssR0FBRSxVQUFVLENBQXN5QixPQUFPLElBQUksSUFBSSxDQUFDLENBQTV5QixTQUFTLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQWdCLEVBQUUsUUFBWCxJQUFLLElBQWEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFXLEVBQUUsUUFBWCxJQUFLLEtBQXVCLEVBQUUsUUFBWCxJQUFLLElBQWEsRUFBRSxLQUFLLElBQUssRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsU0FBYSxNQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFXLElBQVQsSUFBSyxHQUFNLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFXLElBQVQsSUFBSyxLQUFRLEVBQUUsTUFBTSxFQUFFLENBQTZnQixFQUFFLENBQXpnQixTQUFTLFdBQVcsS0FBSyxHQUFHLENBQUMsS0FBS0MsR0FBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUtDLEdBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUEyYixFQUFFLENBQXZiLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxJQUFJLElBQUksU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBbVYsRUFBRSxDQUEvVSxTQUFTLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsSUFBSSxJQUFJLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFNLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQWdQLEVBQUUsQ0FBNU8sU0FBUyxLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBaUwsRUFBRSxDQUE3SyxTQUFTLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUF3RixFQUFFLENBQXBGLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUErQixDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRUEsR0FBRSxJQUFJLFlBQVlELEdBQUUsSUFBSSxZQUFZLE9BQU8sRUNBaHpCLFNBQVMsR0FBRSxFQUFFLEVBQUUsR0FBRSxDQUFDLE9BQU8sS0FBSyxVQUFVLEdBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRSxFQUFFLENBQUMsR0FBWSxJQUFULElBQUssR0FBTSxNQUFNLEdBQUcsR0FBYSxPQUFPLEdBQWpCLFNBQW1CLENBQUMsR0FBRyxPQUFPLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUUsQ0FBQyxFQUFFLFNBQVMsR0FBRSxFQUFFLEVBQUUsR0FBRSxDQUFDLElBQU0sRUFBRSxHQUFFLENBQUMsRUFBRSxHQUFVLElBQVAsS0FBUyxPQUFPLEVBQUUsSUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksSUFBSSxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBTSxFQUFFLEdBQUUsQ0FBQyxFQUFFLEdBQVUsSUFBUCxLQUFTLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFZLElBQVQsSUFBSyxHQUFNLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLE9BQU8sRUFBekIsQ0FBNEIsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxHQUFVLElBQVAsS0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsR0FBRSxPQUFPLEVBQUUsQ0FBQyxJQUFNLEVBQUUsR0FBRSxPQUFPLEdBQUUsT0FBTyxFQUFFLEdBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBSyxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQU0sRUFBRSxFQUFFLFlBQVksR0FBZSxPQUFPLEdBQW5CLFdBQXFCLENBQUMsSUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBWSxJQUFULElBQUssR0FBTSxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFNLEVBQUUsT0FBTyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENDQXZwQyxTQUFTLEdBQUUsRUFBRSxFQUFFLENBQUMsT0FBT0UsR0FBRUMsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFpQyxTQUFTLElBQUcsQ0FBQyxNQUFNLEVBQUUsQ0NBMUYsTUFBTSxFQUFFLEdBQUUsQ0FBQyxZQUFZQyxFQUFDLENBQUMsRUFBSSxHQUFFLENBQUMsWUFBWUMsRUFBQyxDQUFDLEVBQUUsU0FBUyxHQUFFLENBQUMsY0FB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
|