@willbooster/wbfy 20.20.2 → 20.20.4

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 CHANGED
@@ -97,7 +97,7 @@ ${l}
97
97
  `.replaceAll(/\.\n\n+-/g,`.
98
98
  -`).replaceAll(/\n{3,}/g,`
99
99
 
100
- `).trim()}function Wr(e){return e.some(e=>e.depending.playwrightTest)}var Gr=7,Kr=`@exercode/problem-utils.@exercode/problem-utils-browser.@exercode/problem-utils-llm.@openai/codex.@willbooster-private/agentic-workflows.@willbooster-private/ai-ocr.@willbooster-private/code-analyzer.@willbooster-private/judge.@willbooster-private/llm-proxy.@willbooster-private/review-booster.@willbooster/babel-configs.@willbooster/biome-config.@willbooster/eslint-config-blitz-next.@willbooster/eslint-config-js.@willbooster/eslint-config-js-react.@willbooster/eslint-config-next.@willbooster/eslint-config-ts.@willbooster/eslint-config-ts-react.@willbooster/monaco-loader.@willbooster/monaco-react.@willbooster/oxfmt-config.@willbooster/oxlint-config.@willbooster/prettier-config.@willbooster/react-frame-component.@willbooster/renovate-config.@willbooster/shared-lib.@willbooster/shared-lib-blitz-next.@willbooster/shared-lib-next.@willbooster/shared-lib-node.@willbooster/shared-lib-react.@willbooster/wb.@willbooster/wbfy.agent-runtime-kit.at-decorators.better-auth-email-otp-reliable.build-ts.code-gauge.code-gauge-darwin-arm64.code-gauge-darwin-x64.code-gauge-linux-arm64-gnu.code-gauge-linux-arm64-musl.code-gauge-linux-x64-gnu.code-gauge-linux-x64-musl.code-gauge-win32-x64-msvc.gen-i18n-ts.minimal-promise-pool.one-way-git-sync.slidev-check.vinext-progress.wbfy.yarn-plugin-auto-install`.split(`.`),qr={"@anthropic-ai/claude-agent-sdk":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-darwin-arm64":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-darwin-x64":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-linux-arm64":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-linux-arm64-musl":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-linux-x64":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-linux-x64-musl":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-win32-arm64":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-win32-x64":`2026-09-30`,"@openai/codex-sdk":`2026-09-30`,next:`2026-09-30`,"@next/env":`2026-09-30`,"@next/swc-darwin-arm64":`2026-09-30`,"@next/swc-darwin-x64":`2026-09-30`,"@next/swc-linux-arm64-gnu":`2026-09-30`,"@next/swc-linux-arm64-musl":`2026-09-30`,"@next/swc-linux-x64-gnu":`2026-09-30`,"@next/swc-linux-x64-musl":`2026-09-30`,"@next/swc-win32-arm64-msvc":`2026-09-30`,"@next/swc-win32-x64-msvc":`2026-09-30`};const Jr=Gr*24*60*60,Yr=new Date().toISOString().slice(0,10),Xr=[...Kr,...Object.entries(qr).filter(([,e])=>Yr<e).map(([e])=>e)];function Zr(n){let r=t.resolve(n,`bunfig.toml`);return!e.existsSync(r)||(ii(e.readFileSync(r,`utf8`))?.install?.minimumReleaseAgeExcludes)?.join(`
100
+ `).trim()}function Wr(e){return e.some(e=>e.depending.playwrightTest)}var Gr=7,Kr=`@exercode/problem-utils.@exercode/problem-utils-browser.@exercode/problem-utils-llm.@openai/codex.@willbooster-private/agentic-workflows.@willbooster-private/ai-ocr.@willbooster-private/code-analyzer.@willbooster-private/judge.@willbooster-private/llm-proxy.@willbooster-private/review-booster.@willbooster/babel-configs.@willbooster/biome-config.@willbooster/eslint-config-blitz-next.@willbooster/eslint-config-js.@willbooster/eslint-config-js-react.@willbooster/eslint-config-next.@willbooster/eslint-config-ts.@willbooster/eslint-config-ts-react.@willbooster/monaco-loader.@willbooster/monaco-react.@willbooster/oxfmt-config.@willbooster/oxlint-config.@willbooster/prettier-config.@willbooster/react-frame-component.@willbooster/renovate-config.@willbooster/shared-lib.@willbooster/shared-lib-blitz-next.@willbooster/shared-lib-next.@willbooster/shared-lib-node.@willbooster/shared-lib-react.@willbooster/tree-sitter-bash.@willbooster/wb.@willbooster/wbfy.agent-runtime-kit.at-decorators.better-auth-email-otp-reliable.build-ts.code-gauge.code-gauge-darwin-arm64.code-gauge-darwin-x64.code-gauge-linux-arm64-gnu.code-gauge-linux-arm64-musl.code-gauge-linux-x64-gnu.code-gauge-linux-x64-musl.code-gauge-win32-x64-msvc.gen-i18n-ts.minimal-promise-pool.one-way-git-sync.slidev-check.vinext-progress.wbfy.yarn-plugin-auto-install`.split(`.`),qr={"@anthropic-ai/claude-agent-sdk":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-darwin-arm64":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-darwin-x64":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-linux-arm64":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-linux-arm64-musl":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-linux-x64":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-linux-x64-musl":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-win32-arm64":`2026-09-30`,"@anthropic-ai/claude-agent-sdk-win32-x64":`2026-09-30`,"@openai/codex-sdk":`2026-09-30`,next:`2026-09-30`,"@next/env":`2026-09-30`,"@next/swc-darwin-arm64":`2026-09-30`,"@next/swc-darwin-x64":`2026-09-30`,"@next/swc-linux-arm64-gnu":`2026-09-30`,"@next/swc-linux-arm64-musl":`2026-09-30`,"@next/swc-linux-x64-gnu":`2026-09-30`,"@next/swc-linux-x64-musl":`2026-09-30`,"@next/swc-win32-arm64-msvc":`2026-09-30`,"@next/swc-win32-x64-msvc":`2026-09-30`};const Jr=Gr*24*60*60,Yr=new Date().toISOString().slice(0,10),Xr=[...Kr,...Object.entries(qr).filter(([,e])=>Yr<e).map(([e])=>e)];function Zr(n){let r=t.resolve(n,`bunfig.toml`);return!e.existsSync(r)||(ii(e.readFileSync(r,`utf8`))?.install?.minimumReleaseAgeExcludes)?.join(`
101
101
  `)===Xr.join(`
102
102
  `)}function Qr(n){let r=t.resolve(n,`bunfig.toml`);if(e.existsSync(r))return ii(e.readFileSync(r,`utf8`))?.install?.globalStore}function $r(e,t,n){let r=ei(e);return n?t??r:r}function ei(e){return!e.some(e=>e.depending.next||e.depending.blitz||e.depending.slidev)}async function ti(n,r){return k.functionIgnoringException(`generateBunfigToml`,async()=>{let i=t.resolve(n.dirPath,`bunfig.toml`),a=e.existsSync(i)?e.readFileSync(i,`utf8`):void 0,o=ni(a,r);await j.runAndWaitForReturnValue(()=>A.generateFile(i,o))})}const ni=(e,t)=>{let n=ii(e),r=t?`globalStore = true`:`globalStore = false`;return`env = false
103
103
  telemetry = false
@@ -512,4 +512,4 @@ ${oe(E)}
512
512
  `);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function du(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of su){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&fu(a)&&(mu(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function fu(e){return pu(e)||/^(?:bitbucket|gist|github|gitlab):/u.test(e)||/^https?:\/\/(?:bitbucket\.org|github\.com|gitlab\.com)\//u.test(e)||/^(?:https?|ssh):\/\/\S+\.git(?:#\S+)?$/u.test(e)||/^[^@\s]+@[^:\s]+:\S+(?:#\S+)?$/u.test(e)||e.startsWith(`git:`)||e.startsWith(`git+`)||e.startsWith(`ssh://git@`)}function pu(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function mu(e){return lu.some(t=>t.test(e))}const hu=`apply-release-age-gate`,gu=`generate-user-agent-configs`;async function _u(){let e=await o(process.argv.slice(2)).command(hu,`Apply only the organization's minimum-release-age policy to this machine's global package-manager configs`).command(gu,`Overwrite this user's agent instruction files (~/.codex/AGENTS.md, ~/.claude/CLAUDE.md, ~/.gemini/GEMINI.md) with the organization's fixed content and merge the organization's settings into ~/.claude/settings.json and ~/.gemini/settings.json`).command(`$0 [paths..]`,`Make a given project follow the WillBooster standard`,e=>{e.positional(`paths`,{describe:`project paths to be wbfied`,array:!0,type:`string`,default:[`.`]})}).options({force:{description:`Apply wbfy even when the repository already records this wbfy version`,type:`boolean`,default:!1,alias:`f`},skipDeps:{description:"Skip adding managed dependencies and the linker probe (the final `bun install` refreshing the lockfile still runs)",type:`boolean`,default:!1,alias:`d`},verbose:{description:`Whether or not to enable verbose mode`,type:`boolean`,default:!1,alias:`v`}}).version(Ei()).strict().argv;if(O.isVerbose=e.verbose,e._[0]===hu){Vi()||(process.exitCode=1);return}if(e._[0]===gu){await hl()||(process.exitCode=1);return}let t=!1;try{t=await vu(e.paths,e.skipDeps,e.force)}finally{await Me()}t&&(process.exitCode=1)}async function vu(n,r,i){Vi();let a=Bun.version;if(Bun.semver.order(a,`1.4.0`)<0)return console.error(`wbfy requires Bun >= 1.4.0 (found ${a}). Upgrade Bun and re-run.`),!0;let o=Oi(),s=!i&&o&&!o.endsWith(`-dirty-local`)?o:void 0,c=!1;for(let i of n){let n=t.resolve(i);if(A.setRootDirPath(e.existsSync(n)?n:void 0),s&&await mc(n)===s&&Zr(n)){console.info(`Skip ${n}: wbfy ${s} is already applied. Pass --force to re-apply.`);continue}let a=t.join(n,`packages`),o=(await le(()=>e.promises.readdir(a,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.resolve(a,e.name)),l=Yt({dirPath:n,packageJson:ce(()=>JSON.parse(e.readFileSync(t.resolve(n,`package.json`),`utf8`)))??{},doesContainSubPackageJsons:o.some(n=>e.existsSync(t.resolve(n,`package.json`)))}),u=[...new Set([...o,...l])].filter(e=>e!==t.resolve(n)),d=[...[`.gitattributes`,`bunfig.toml`,`lefthook.yml`,`package.json`,`tsconfig.json`].map(e=>t.resolve(n,e)),...u.flatMap(e=>[`package.json`,`tsconfig.json`].map(n=>t.resolve(e,n)))];if((await Promise.all(d.map(e=>A.isConfinedWritablePath(e)))).includes(!1)){console.error(`Skip ${n}: a managed config file is a symlink or resolves outside the repository.`),c=!0;continue}let f=[n,...u].flatMap(n=>{let r=t.resolve(n,`package.json`);if(!e.existsSync(r))return[];try{let t=ur({packageJson:JSON.parse(e.readFileSync(r,`utf8`))});return t?[`${n}: ${t}`]:[]}catch{return[`${r} is invalid`]}});if(f.length>0){console.error(`Skip ${n}:\n${f.join(`
513
513
  `)}`),c=!0;continue}let p=await cr(n);if(O.isVerbose,!p){console.error(`there is no valid package.json in ${n}`),c=!0;continue}let m=await Promise.all(u.map(e=>cr(e,{isRoot:!1}))),h=u.find((n,r)=>!m[r]&&e.existsSync(t.join(n,`package.json`)));if(h){console.error(`Skip ${n}: ${h}/package.json is invalid.`),c=!0;continue}let g=[p,...m.filter(e=>!!e)],_=g.some(e=>e.isCloudflare)?z(`git`,[`-c`,`core.quotePath=false`,`ls-files`,`--`,`.env.cloudflare`,`*/.env.cloudflare`],p.dirPath).split(`
514
514
  `).filter(Boolean).map(e=>t.resolve(p.dirPath,e)):[];if(_.length>0){console.error(`SECURITY ERROR: Cloudflare credentials must be untracked. Remove ${_.join(`, `)} from Git, purge the token from history, and rotate CLOUDFLARE_API_TOKEN before rerunning wbfy.`),c=!0;continue}let v=Nn(p);if(await Kl(g),O.isVerbose)for(let e of g)console.info(e);uu(g);let y=Qr(n),ee=$r(g,y,r);await ti(p,ee),await zl(p),await ht(p),await xl(p,g),!r&&p.doesContainPackageJson&&!yu(n,p,y,ee)&&console.warn(`bun install currently fails in ${n} under the isolated linker.`);let b=!yn(p.repository)&&(p.repository?.startsWith(`github:WillBooster/`)||p.repository?.startsWith(`github:WillBoosterLab/`)),x=!b&&!yn(p.repository)&&!!p.repository?.startsWith(`github:`)&&p.isRoot;await v,await Promise.all([hc(p),fi(p),mi(p),_i(p,g),yi(p),ou(p),Ui(p),sc(p),Ic(p),Mc(p),...b?[vn(p)]:[],...x?[Al(p,g)]:[],Jl(p),Ql(p),nu(p),...p.isRoot?[Ls(p,g)]:[]]),await Lr(p,g);let S=[];for(let e of g)e.depending.playwrightTest&&S.push(qe(e)),e.depending.next&&S.push(Fe(e)),e.depending.chakra&&S.push(He(e)),await Si(e,p),(e.isRoot||e.doesContainPackageJson)&&(Hi(e)&&await ic(e),await so(e,p,r),e.doesContainVscodeSettingsJson&&S.push(vl(e)),U(e)?(S.push(Bc(e)),S.push(Qs(e)),S.push(tc(e,p))):!e.isRoot&&e.doesContainPackageJson&&U(p)&&S.push(tc(e,p)),e.depending.pyright&&S.push(oc(e)));await Promise.all(S),bi(n);try{xu(n)}catch(e){console.error(`Failed to refresh the Bun lockfile:`,e?.message??e),c=!0}try{let e=xe(n);e&&console.info(`Removed Takumi Guard proxy URLs from ${e} to keep it registry-agnostic.`)}catch(e){console.error(`Failed to normalize the Bun lockfile:`,e?.message??e),c=!0}nr(`bun`,[`cleanup`],n)}return c}function yu(e,t,n,r){return n!==r&&bu(e,t),rr(`bun`,[`install`],e,1)===0||(bu(e,t),!1)}function bu(n,r){let i=[t.resolve(n,`node_modules`),...[...os(r).values()].map(e=>t.resolve(n,e,`node_modules`))],a=e.realpathSync(n);for(let n of i){let r=ce(()=>e.realpathSync(t.dirname(n)));r&&(r===a||r.startsWith(a+t.sep))&&e.rmSync(n,{recursive:!0,force:!0})}}function xu(e){let t=rr(`bun`,[`install`],e,1);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await _u();
515
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsImZzIiwicGFyc2VKc29uYyIsImZzcCIsInJlbGVhc2VBZ2VHYXRlLmRheXMiLCJyZWxlYXNlQWdlR2F0ZS5leGNsdWRlcyIsInJlbGVhc2VBZ2VHYXRlLnRlbXBvcmFyeUV4Y2x1ZGVzIiwibmV3Q29udGVudCIsImNvbW1vbkNvbnRlbnQiLCJuZXdDb250ZW50IiwiY2hpbGRfcHJvY2VzcyIsImNvbW1vbkNvbnRlbnQiLCJjaGlsZF9wcm9jZXNzIiwic29ydE9iamVjdEtleXMiLCJnaXRIb29rcyIsImRldGVjdE5ld2xpbmUiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJjb3JlIiwibWFuYWdlZENvbmZpZ0Jsb2NrcyIsImdldENvbmZpZ0NvbnRlbnQiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliL3NyYy9naXRodWJUZW1wbGF0ZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9zbGVlcC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvdGV4dC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3Rlc3RpbmdSdWxlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuV29ya3NwYWNlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuTG9ja2ZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2RvY2tlcmZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2dsb2IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3V0aWxzL3R5cGVzY3JpcHRBcGkudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL2NoYWtyYVRvYXN0ZXIudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9mbm94VG9tbC50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy91dGlscy93b3Jrc3BhY2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy50cyIsIi4uL3NyYy91dGlscy9zaGVsbFBhcnNlci50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93UnVubmVyUG9saWN5LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvanNvbmNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LnRzIiwiLi4vc3JjL3V0aWxzL3NwYXduVXRpbC50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYWdlbnRzLnRzIiwiLi4vY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uIiwiLi4vc3JjL2dlbmVyYXRvcnMvYnVuZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2lnbm9yZUZpbGVVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuc2lvbnMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nbG9iYWxSZWxlYXNlQWdlR2F0ZS50cyIsIi4uL3NyYy91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3Mvc29ydC1vYmplY3Qta2V5c0AyLjEuMC0xOGRmMmY4MzdlNmVjMjlhL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2RldGVjdC1pbmRlbnRANy4wLjItNmI3NWRjMGY1NjUzM2JkOS9ub2RlX21vZHVsZXMvZGV0ZWN0LWluZGVudC9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtbmV3bGluZUA0LjAuMS01ZGE5ZGY2NTEyNWVlNzk1L25vZGVfbW9kdWxlcy9kZXRlY3QtbmV3bGluZS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9naXQtaG9va3MtbGlzdEA0LjIuMS02Y2EyYjI2OWQ5MTYzMzJlL25vZGVfbW9kdWxlcy9naXQtaG9va3MtbGlzdC9pbmRleC5qc29uIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2lzLXBsYWluLW9iakA0LjEuMC00N2ZkZGQ3NzA2NDhlNTc3L25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3Mvc29ydC1wYWNrYWdlLWpzb25ANC4wLjAtODNkMGFmZmNiYjliM2M4NS9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9jb25maWdDb250ZW50LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWFuYWdlZENvbmZpZ0Jsb2NrLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hmbXRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGxpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdXNlckFnZW50Q29uZmlncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd2JFbnYudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9zZWxmQ29udGFpbmVkV29ya2Zsb3cudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9taXNlVG9tbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL25wbXJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvcnVsZXNldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHNlY3Rpb24gb2YgYSBQUiBvciBpc3N1ZSBib2R5OiBpdHMgaGVhZGluZyBhbmQgd2hhdCB0aGUgc2VjdGlvbiBtdXN0IHN0YXRlLiBgcmVxdWlyZW1lbnRgXG4gKiBzdGFydHMgbG93ZXJjYXNlIGFuZCBlbmRzIHdpdGhvdXQgcHVuY3R1YXRpb24sIHNvIHRoYXQgaXQgcmVhZHMgYm90aCBhcyBhIHBsYWNlaG9sZGVyIHNlbnRlbmNlXG4gKiAoY2FwaXRhbGl6ZWQsIHdpdGggYSBwZXJpb2QgYXBwZW5kZWQpIGFuZCBhcyBhIGNoZWNrbGlzdCBjbGF1c2UgYWZ0ZXIgdGhlIGhlYWRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVTZWN0aW9uIHtcbiAgcmVhZG9ubHkgaGVhZGluZzogc3RyaW5nO1xuICByZWFkb25seSByZXF1aXJlbWVudDogc3RyaW5nO1xufVxuXG4vKiogU2VjdGlvbnMgb2YgYSBwdWxsIHJlcXVlc3QgYm9keSwgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBQUiB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBjb25zdCBQVUxMX1JFUVVFU1RfU0VDVElPTlM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdID0gW1xuICB7XG4gICAgaGVhZGluZzogJ1doeScsXG4gICAgcmVxdWlyZW1lbnQ6ICd0aGUgcHJvYmxlbSwgd2l0aCB0aGUgbnVtYmVycyBvciBvYnNlcnZhdGlvbnMgYmVoaW5kIGl0LCBhbmQgd2h5IHRoaXMgYXBwcm9hY2ggb3ZlciB0aGUgYWx0ZXJuYXRpdmVzJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdSZXF1aXJlbWVudHMnLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgXCJ0aGUgcmVxdWlyZW1lbnRzIHRoZSBjaGFuZ2UgbXVzdCBzYXRpc2Z5IGFuZCB0aGUgZ3VhcmFudGVlcyBpdCBtdXN0IGtlZXAgYXMgdGhleSBzdGFuZCBub3csIG9uZSBwZXIgbGluZSwgZWFjaCBtYXJrZWQgYHJlcXVpcmVkYCAoYXNrZWQgZm9yIGJ5IHRoZSByZXF1ZXN0ZXIsIG9yIGFuIGV4aXN0aW5nIGNvbnRyYWN0IGNhbGxlcnMgZGVwZW5kIG9uKSBvciBgY2hvc2VuYCAodGhlIGltcGxlbWVudGVyJ3Mgb3duIGRlY2lzaW9uIHdpdGggdGhlIHJlYXNvbiB0aGF0IGRlY2lkZWQgaXQsIHdoaWNoIGEgc2ltcGxlciBkZXNpZ24gbWF5IHJlcGxhY2UpOyBzdGF0ZSB0aGUgcmVxdWVzdGVyJ3MgaW5zdHJ1Y3Rpb25zIGluIHRoZSByZXF1ZXN0ZXIncyB0ZXJtcywgd2hldGhlciB0aGV5IGNhbWUgZnJvbSBhbiBpc3N1ZSBvciBhIGNvbnZlcnNhdGlvbiwgYW5kIGtlZXAgZWFjaCBsaW5lIGFzIGl0IGlzIHVudGlsIHRoZSByZXF1ZXN0ZXIgb3ZlcnJpZGVzIG9yIHdpdGhkcmF3cyB0aGUgaW5zdHJ1Y3Rpb24gYmVoaW5kIGl0IG9yIHRoZSBkZWNpc2lvbiBiZWhpbmQgaXQgY2hhbmdlcywgYW5kIHRoZW4gcmV3cml0ZSBvciByZW1vdmUgdGhhdCBsaW5lIGluc3RlYWQgb2YgYWRkaW5nIG9uZSBiZXNpZGUgaXRcIixcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdDdXN0b21lciBTdW1tYXJ5JyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdiZWhhdmlvciwgd29ya2Zsb3csIG9yIHVzZXItdmlzaWJsZSBjaGFuZ2VzLCB3cml0dGVuIGZvciByZWFkZXJzIHdobyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGltcGxlbWVudGF0aW9uJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdUZWNobmljYWwgU3VtbWFyeScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnZGVjaXNpb25zIGFuZCB0aGVpciByZWFzb25zLCBkYXRhIGZsb3csIHdoZXJlIHRvIGxvb2sgKHRoZSBmaWxlcyB0aGF0IG1hdHRlciBtb3N0KSwgYW5kIHdoYXQgdG8gY2hlY2sgaGFyZGVzdDogdGhlIHBhcnRzIHdob3NlIGNvcnJlY3RuZXNzIGlzIGFyZ3VlZCByYXRoZXIgdGhhbiBwcm92ZW4nLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1Rlc3RpbmcnLFxuICAgIHJlcXVpcmVtZW50OiAnY29tbWFuZHMgcnVuLCB0ZXN0cyBhZGRlZCwgYW5kIHdoYXQgd2FzIE5PVCBleGVyY2lzZWQgYW5kIHdoeScsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnTm90ZXMnLFxuICAgIHJlcXVpcmVtZW50OiAna25vd24gbGltaXRhdGlvbnMsIGNvbXBhdGliaWxpdHkgYW5kIG1pZ3JhdGlvbiwgZm9sbG93LXVwIHdvcms7IGRlbGV0ZSB0aGlzIHNlY3Rpb24gaWYgdGhlcmUgaXMgbm9uZScsXG4gIH0sXG5dO1xuXG4vKipcbiAqIEhvdyBhIHRvb2wgdGhhdCB3cml0ZXMgb3IgcmV3cml0ZXMgYSBQUiBib2R5IGRlcml2ZXMgaXQgZnJvbSB0aGUgcmVwb3NpdG9yeSdzIFBSIHRlbXBsYXRlLCBhc1xuICogbWFya2Rvd24gYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnMuIFN0YXRlZCBvbmNlIGhlcmUgYW5kIHJlbmRlcmVkIGJ5IGV2ZXJ5IHdyaXRlciAodGhlXG4gKiBnZW5lcmF0ZWQgYWdlbnQgaW5zdHJ1Y3Rpb25zLCB0aGUgUFItZHJhZnRpbmcgc2tpbGxzKSBzbyB0aGUgd3JpdGVycyBjYW5ub3QgZHJpZnQgYXBhcnQ7IHRoZVxuICogdGVtcGxhdGUtbGVzcyBicmFuY2ggbGV0cyB0aGUgc2FtZSB0ZXh0IHNlcnZlIHJlcG9zaXRvcmllcyBvdXRzaWRlIHRoZSBvcmdhbml6YXRpb24uXG4gKi9cbmNvbnN0IFBVTExfUkVRVUVTVF9URU1QTEFURV9SVUxFUyA9IGAtIEJhc2UgdGhlIFBSIGJvZHkgb24gXFxgLmdpdGh1Yi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWRcXGAgd2hlbiBjcmVhdGluZyBvciB1cGRhdGluZyBhIFBSLCBldmVuIHdoZW4gYSBza2lsbCBvciB3b3JrZmxvdyBzdXBwbGllcyBpdHMgb3duIHNrZWxldG9uOiBrZWVwIHRoZSB0ZW1wbGF0ZSdzIGhlYWRpbmdzIGluIG9yZGVyLCBmaWxsIGVhY2ggc2VjdGlvbiB3aXRoIHdoYXQgaXRzIHBsYWNlaG9sZGVyIGNvbW1lbnQgYXNrcyBmb3IgYXQgYSBsZW5ndGggZml0dGluZyB0aGUgY2hhbmdlIChhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lKSwgYW5kIGRlbGV0ZSB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYW5kIGFuIGVtcHR5IE5vdGVzIHNlY3Rpb24uIFdpdGhvdXQgYSB0ZW1wbGF0ZSwgdXNlIG5vIGZpeGVkIGhlYWRpbmdzOiBzdGF0ZSB0aGUgc2NvcGUsIHRoZSBtb3RpdmF0aW9uLCBhbmQgdGhlIHZlcmlmaWNhdGlvbiBjb25jaXNlbHkuXG4tIFN0YXJ0IHRoZSBib2R5IHdpdGggXFxgQ2xvc2UgIzxuPlxcYCBvbmx5IHdoZW4gdGhlIFBSIHJlc29sdmVzIGFuIGV4aXN0aW5nIGlzc3VlLmA7XG5cbi8qKlxuICogSG93IGEgdG9vbCB0aGF0IHdyaXRlcyBvciByZXdyaXRlcyBhIFBSIGJvZHkgZmlsbHMgdGhlIFJlcXVpcmVtZW50cyBzZWN0aW9uIG9mXG4gKiBgUFVMTF9SRVFVRVNUX1NFQ1RJT05TYCwgYXMgbWFya2Rvd24gYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnMuIFNraWxscyB0aGF0IGRyYWZ0IFBSXG4gKiBib2RpZXMgcmVuZGVyIHRoaXMgdGV4dCBpbnN0ZWFkIG9mIHJlc3RhdGluZyBpdCwgc28gdGhlIHdyaXRlcnMgYW5kIHRoZSByZXZpZXdlcnMgdGhhdCByZWFkIHRoZVxuICogc2VjdGlvbiBhcyB0aGUgYm91bmRhcnkgYSBmaXggbXVzdCBrZWVwIG5ldmVyIGRpc2FncmVlIG9uIHdoYXQgYSBsaW5lIG1lYW5zLlxuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX1JFUVVJUkVNRU5UU19SVUxFUyA9IGAtIFJlcXVpcmVtZW50cyBzZWN0aW9uOiB0aGUgcmVxdWlyZW1lbnRzIGluIGZvcmNlIG5vdywgb25lIGxpbmUgcGVyIHJlcXVpcmVtZW50LCB0YWtlbiBmcm9tIHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgaW4gdGhlIHJlcXVlc3RlcidzIHRlcm1zICh0aGUgaXNzdWUsIHRoZSBjb252ZXJzYXRpb24gdGhhdCBhc2tlZCBmb3IgdGhlIGNoYW5nZSksIGVhY2ggbWFya2VkIFxcYHJlcXVpcmVkXFxgIChhc2tlZCBmb3IsIG9yIGFuIGV4aXN0aW5nIGNvbnRyYWN0IGNhbGxlcnMgZGVwZW5kIG9uKSBvciBcXGBjaG9zZW5cXGAgKHlvdXIgb3duIGRlY2lzaW9uIHdpdGggdGhlIHJlYXNvbiB0aGF0IGRlY2lkZWQgaXQsIHdoaWNoIGEgc2ltcGxlciBkZXNpZ24gbWF5IHJlcGxhY2UpLiBOZXZlciBpbmZlciBhIHJlcXVpcmVtZW50IGZyb20gdGhlIGRpZmY6IHdoZW4gbm8gaXNzdWUsIFBSIG1lc3NhZ2UsIG9yIGNvbnZlcnNhdGlvbiBzdGF0ZXMgdGhlIHJlcXVlc3QsIHdyaXRlIFxcYHJlcXVpcmVkOiBub3QgcmVjb3JkZWQg4oCUIGFzayB0aGUgcmVxdWVzdGVyXFxgIGFzIHRoZSBvbmx5IHJlcXVlc3QtZGVyaXZlZCBsaW5lIChhIFxcYHJlcXVpcmVkXFxgIGxpbmUgZm9yIGFuIGV4aXN0aW5nIGNvbnRyYWN0IGNhbGxlcnMgZGVwZW5kIG9uIG1heSBzdGlsbCBiZSBsaXN0ZWQpIGFuZCBzYXkgc28gaW4gTm90ZXMuXG4tIEN1cnJlbnQtc3RhdGUgcnVsZTogYW4gZXhpc3RpbmcgUmVxdWlyZW1lbnRzIHNlY3Rpb24gcmVjb3JkcyB3aGF0IHRoZSByZXF1ZXN0ZXIgYXNrZWQgZm9yIGFuZCB3aGF0IHdhcyBkZWNpZGVkIGFzIGl0IHN0YW5kcyBub3c7IGl0IGlzIG5laXRoZXIgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZGlmZiBub3IgYSBsb2cgb2YgaG93IHRoZSByZXF1ZXN0IGV2b2x2ZWQuIEtlZXAgZWFjaCBsaW5lIGFzIGl0IGlzIHVudGlsIHRoZSByZXF1ZXN0ZXIgb3ZlcnJpZGVzIG9yIHdpdGhkcmF3cyB0aGUgaW5zdHJ1Y3Rpb24gYmVoaW5kIGl0IG9yIHRoZSBkZWNpc2lvbiBiZWhpbmQgaXQgY2hhbmdlcywgYW5kIHRoZW4gcmV3cml0ZSBvciByZW1vdmUgdGhhdCBsaW5lIGluc3RlYWQgb2YgYXBwZW5kaW5nIGEgbGluZSBiZXNpZGUgaXQ7IHdpdGggbm8gaW5zdHJ1Y3Rpb25zIGF2YWlsYWJsZSwga2VlcCB0aGUgcmVxdWVzdGVyLWRlcml2ZWQgbGluZXMgdW5jaGFuZ2VkLiBOZXZlciBtYXJrIHdoZW4gYSBsaW5lIHdhcyBhZGRlZCAoZS5nLiwgXCIoYWRkZWQpXCIpLCBhbmQgYWRkIGEgXFxgY2hvc2VuXFxgIGxpbmUgZm9yIGVhY2ggbmV3IGRlY2lzaW9uLiBXaGVuIHRoZSBjdXJyZW50IGRlc2lnbiBjYW5ub3QgYmUgdW5kZXJzdG9vZCB3aXRob3V0IHRoZSBjaGFuZ2Ugb2YgZGlyZWN0aW9uLCBzdGF0ZSBpdCBpbiBvbmUgc2VudGVuY2UgaW4gTm90ZXMuIEEgc2VjdGlvbiB0aGF0IG1lcmVseSBkZXNjcmliZXMgdGhlIGltcGxlbWVudGF0aW9uLCBvciBob2xkcyBvbmx5IHRoZSB0ZW1wbGF0ZSdzIHBsYWNlaG9sZGVyIG9yIGEgXFxgcmVxdWlyZWQ6IG5vdCByZWNvcmRlZFxcYCBsaW5lLCBpcyBub3QgYSByZWNvcmQ6IHdyaXRlIGl0IGFmcmVzaCBieSB0aGUgcnVsZSBhYm92ZS5cbi0gUGxhY2UgdGhlIHNlY3Rpb24gd2hlcmUgdGhlIHRlbXBsYXRlIHB1dHMgaXQ7IHdoZW4gdGhlIHRlbXBsYXRlIGhhcyBubyBzdWNoIGhlYWRpbmcsIHJpZ2h0IGFmdGVyIHRoZSBpc3N1ZS1jbG9zaW5nIGxpbmUsIG9yIGF0IHRoZSB0b3Agb2YgdGhlIGJvZHkgd2hlbiB0aGVyZSBpcyBub25lLlxuLSBOZXZlciBkcm9wIG9yIHdlYWtlbiBhIFxcYHJlcXVpcmVkXFxgIGxpbmUgdG8gZml0IHdoYXQgd2FzIGltcGxlbWVudGVkOiB3aGVuIG9uZSBjYW5ub3QgaG9sZCBpbiB0aGUgZGlmZiwga2VlcCBpdCBhbmQgc2F5IHNvIGluIE5vdGVzLmA7XG5cbi8qKiBUaGUgY29tcGxldGUgcnVsZXMgZm9yIHdyaXRpbmcgYSBQUiBib2R5OiB0aGUgdGVtcGxhdGUgcnVsZXMgZm9sbG93ZWQgYnkgdGhlIFJlcXVpcmVtZW50cyBydWxlcy4gKi9cbmV4cG9ydCBjb25zdCBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUyA9IGAke1BVTExfUkVRVUVTVF9URU1QTEFURV9SVUxFU31cXG4ke1BVTExfUkVRVUVTVF9SRVFVSVJFTUVOVFNfUlVMRVN9YDtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgY3JlYXRlcyBhbiBpc3N1ZSBkZXJpdmVzIGl0IGZyb20gdGhlIHJlcG9zaXRvcnkncyBpc3N1ZSB0ZW1wbGF0ZXMsIGFzIG1hcmtkb3duXG4gKiBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9uczsgc2hhcmVkIGJ5IHRoZSBzYW1lIHdyaXRlcnMgYXMgYFBVTExfUkVRVUVTVF9CT0RZX1JVTEVTYC5cbiAqIEd1aWRhbmNlIHRoZSB0ZW1wbGF0ZXMgc3RhdGUgaW4gdGhlaXIgb3duIHBsYWNlaG9sZGVyIGNvbW1lbnRzICh3aGljaCBzZWN0aW9ucyB0byBrZWVwLCBkZWxldGluZ1xuICogdGhlIGNvbW1lbnRzKSBpcyBkZWxpYmVyYXRlbHkgbm90IHJlcGVhdGVkIGhlcmUsIHNpbmNlIHRoZSB3cml0ZXIgcmVhZHMgdGhlIHRlbXBsYXRlIGFueXdheS5cbiAqL1xuZXhwb3J0IGNvbnN0IElTU1VFX1RFTVBMQVRFX1JVTEVTID0gYC0gRm9sbG93IHRoZSBjbG9zZXN0IHRlbXBsYXRlIHVuZGVyIFxcYC5naXRodWIvSVNTVUVfVEVNUExBVEUvXFxgOiBcXGBidWcubWRcXGAgZm9yIHdyb25nIGJlaGF2aW9yLCBcXGBjaGFuZ2UubWRcXGAgZm9yIGFueXRoaW5nIHRvIGJ1aWxkIG9yIGFsdGVyOyBhIHF1ZXN0aW9uIG9yIG5vdGUgZml0dGluZyBuZWl0aGVyLCBvciBhIHJlcG9zaXRvcnkgd2l0aG91dCB0ZW1wbGF0ZXMsIG5lZWRzIG5vIHRlbXBsYXRlLlxuLSBUaXRsZTogYSBDb252ZW50aW9uYWwgQ29tbWl0cyBwcmVmaXggZm9yIHRoZSB0eXBlIHRoYXQgZml0cyB0aGUgY2hhbmdlIChcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgXFxgcmVmYWN0b3I6XFxgLCBcXGBkb2NzOlxcYCwgXFxgY2hvcmU6XFxgLCAuLi4pOyB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgdGVtcGxhdGUncyBcXGB0aXRsZVxcYCBwcmVmaXgsIHJlcGxhY2UgdGhlIHRlbXBsYXRlJ3MgdHlwZSBsYWJlbCAoXFxgdDogLi4uXFxgKSB3aXRoIHRoZSBvbmUgbWF0Y2hpbmcgdGhlIHR5cGUuXG4tIFRoZSBZQU1MIGZyb250IG1hdHRlciBiZXR3ZWVuIHRoZSBcXGAtLS1cXGAgbGluZXMgaXMgbWV0YWRhdGEsIG5vdCBib2R5IHRleHQ6IHBhc3MgaXRzIFxcYGxhYmVsc1xcYCB2aWEgXFxgLS1sYWJlbFxcYCBhbmQgc3VibWl0IG9ubHkgdGhlIGNvbnRlbnQgYmVsb3cgdGhlIGNsb3NpbmcgXFxgLS0tXFxgIGFzIHRoZSBib2R5LmA7XG5cbi8qKiBTZWN0aW9ucyBvZiBhIGJ1ZyByZXBvcnQsIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgaXNzdWUgdGVtcGxhdGUuICovXG5leHBvcnQgY29uc3QgQlVHX0lTU1VFX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAgeyBoZWFkaW5nOiAnUHJvYmxlbScsIHJlcXVpcmVtZW50OiAnd2hhdCBoYXBwZW5zLCBhbmQgd2hhdCBzaG91bGQgaGFwcGVuIGluc3RlYWQnIH0sXG4gIHsgaGVhZGluZzogJ0V2aWRlbmNlJywgcmVxdWlyZW1lbnQ6ICdyZXByb2R1Y3Rpb24gc3RlcHMsIGxvZ3MsIHJ1biBJRHMsIG9yIGxpbmtzJyB9LFxuICB7IGhlYWRpbmc6ICdJbXBhY3QnLCByZXF1aXJlbWVudDogJ3dobyBvciB3aGF0IGlzIGFmZmVjdGVkLCBhbmQgaG93IGJhZGx5JyB9LFxuICB7IGhlYWRpbmc6ICdQcm9wb3NhbCcsIHJlcXVpcmVtZW50OiAndGhlIGZpeCB5b3UgaGF2ZSBpbiBtaW5kLCBhbmQgdGhlIHJvb3QgY2F1c2UgaWYga25vd24nIH0sXG5dO1xuXG4vKipcbiAqIFNlY3Rpb25zIGEgY2hhbmdlIHNwZWNpZmljYXRpb24gbXVzdCBzZXR0bGUgYmVmb3JlIGEgdGhpcmQgcGFydHkgY2FuIGltcGxlbWVudCBpdCwgZGVmaW5lZFxuICogb25jZSBzbyB0aGF0IHRoZSBpc3N1ZSB0ZW1wbGF0ZSBhbmQgYW55IHRvb2wgdGhhdCBkcmFmdHMgb3IgcmV2aWV3cyBzcGVjaWZpY2F0aW9ucyBhZ2FpbnN0XG4gKiB0aGVzZSBzZWN0aW9ucyBjYW5ub3QgZHJpZnQgYXBhcnQ7IGNoZWNrbGlzdCBjb25zdW1lcnMgcmVuZGVyIGl0IHdpdGggYHJlbmRlclNlY3Rpb25DaGVja2xpc3RgLlxuICogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIHN1ZmZpY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBzbyB0aGV5IGNvbWUgZmlyc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFOR0VfSVNTVUVfU0VDVElPTlM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdID0gW1xuICB7XG4gICAgaGVhZGluZzogJ0JhY2tncm91bmQgYW5kIGdvYWwnLFxuICAgIHJlcXVpcmVtZW50OiAndGhlIHByb2JsZW0gYmVpbmcgc29sdmVkLCBmb3Igd2hvbSwgYW5kIHdoYXQgb3V0Y29tZSBjb3VudHMgYXMgc3VjY2VzcycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQmVoYXZpb3InLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2V2ZXJ5IHVzZXItIG9yIGNhbGxlci1vYnNlcnZhYmxlIGJlaGF2aW9yLCBpbmNsdWRpbmcgaW5wdXRzLCBvdXRwdXRzLCBlcnJvciBjYXNlcywgZWRnZSBjYXNlcywgYW5kIGludGVyYWN0aW9ucyB3aXRoIGV4aXN0aW5nIGJlaGF2aW9yLCBzdGF0ZWQgcHJlY2lzZWx5IGVub3VnaCB0aGF0IHR3byBpbXBsZW1lbnRlcnMgd291bGQgYnVpbGQgdGhlIHNhbWUgdGhpbmcnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0FjY2VwdGFuY2UgY3JpdGVyaWEnLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2NoZWNrYWJsZSBjb25kaXRpb25zIChHaXZlbi9XaGVuL1RoZW4gb3IgYW4gZXF1aXZhbGVudCkgdGhhdCBkZWNpZGUgd2hldGhlciB0aGUgaW1wbGVtZW50YXRpb24gaXMgZG9uZScsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnU2NvcGUgYW5kIG5vbi1nb2FscycsXG4gICAgcmVxdWlyZW1lbnQ6ICd3aGF0IHRoZSBjaGFuZ2UgY292ZXJzIGFuZCB3aGF0IGl0IGRlbGliZXJhdGVseSBsZWF2ZXMgb3V0LCBzbyBhbiBpbXBsZW1lbnRlciBrbm93cyB3aGVyZSB0byBzdG9wJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdEZXNpZ24gY29uc3RyYWludHMnLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ3RoZSBkYXRhLCBBUEksIHNjaGVtYSwgVUksIGFuZCBjb25maWd1cmF0aW9uIGNoYW5nZXMsIG5hbWluZywgYW5kIHRoZSBleGlzdGluZyBjb2RlIG9yIGNvbnZlbnRpb25zIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGZpdCDigJQgYXMgZmFyIGFzIHRoZSB3cml0ZXIgaW50ZW5kcyB0byBjb25zdHJhaW4gdGhlbSwgd2l0aCBldmVyeXRoaW5nIGVsc2UgZXhwbGljaXRseSBsZWZ0IHRvIHRoZSBpbXBsZW1lbnRlcicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQ29tcGF0aWJpbGl0eSBhbmQgbWlncmF0aW9uJyxcbiAgICByZXF1aXJlbWVudDogJ3doYXQgZXhpc3RpbmcgZGF0YSwgdXNlcnMsIGNhbGxlcnMsIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSBhZmZlY3RlZCBhbmQgaG93IHRoZSB0cmFuc2l0aW9uIGhhcHBlbnMnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1ZlcmlmaWNhdGlvbicsXG4gICAgcmVxdWlyZW1lbnQ6ICdob3cgdGhlIGNoYW5nZSBpcyB0ZXN0ZWQgb3IgZGVtb25zdHJhdGVkLCBpbmNsdWRpbmcgd2hhdCBuZWVkcyBubyB0ZXN0IGFuZCB3aHknLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ09wZW4gcXVlc3Rpb25zJyxcbiAgICByZXF1aXJlbWVudDogJ3VuZGVjaWRlZCBwb2ludHMsIGVhY2ggd2l0aCBpdHMgb3B0aW9uczsgZW1wdHkgb25jZSB0aGUgc3BlY2lmaWNhdGlvbiBpcyBpbXBsZW1lbnRhYmxlJyxcbiAgfSxcbl07XG5cbi8qKiBSZW5kZXJzIHNlY3Rpb25zIGFzIG1hcmtkb3duIGJ1bGxldHMgKGAtICoqSGVhZGluZyoqOiByZXF1aXJlbWVudGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNlY3Rpb25DaGVja2xpc3Qoc2VjdGlvbnM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4gYC0gKioke3NlY3Rpb24uaGVhZGluZ30qKjogJHtzZWN0aW9uLnJlcXVpcmVtZW50fWApLmpvaW4oJ1xcbicpO1xufVxuXG4vKiogUmVuZGVycyBzZWN0aW9ucyBhcyBtYXJrZG93biBoZWFkaW5ncywgZWFjaCBmb2xsb3dlZCBieSBpdHMgcmVxdWlyZW1lbnQgYXMgYSBwbGFjZWhvbGRlciBjb21tZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNlY3Rpb25UZW1wbGF0ZShzZWN0aW9uczogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnNcbiAgICAubWFwKFxuICAgICAgKHNlY3Rpb24pID0+XG4gICAgICAgIGAjIyAke3NlY3Rpb24uaGVhZGluZ31cXG5cXG48IS0tICR7c2VjdGlvbi5yZXF1aXJlbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke3NlY3Rpb24ucmVxdWlyZW1lbnQuc2xpY2UoMSl9LiAtLT5gXG4gICAgKVxuICAgIC5qb2luKCdcXG5cXG4nKTtcbn1cbiIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIC8vIGBKU09OLnN0cmluZ2lmeWAgYW5zd2VycyBgdW5kZWZpbmVkYCBmb3IgYHVuZGVmaW5lZGAsIGEgc3ltYm9sIGFuZCBhIGZ1bmN0aW9uLCBhbmQgdGhyb3dzXG4gIC8vIG9uIGEgYmlnaW50IG9yIGEgY3ljbGU7IGBuZXcgRXJyb3IodW5kZWZpbmVkKWAgaGFzIGFuIGVtcHR5IG1lc3NhZ2UsIHdoaWNoIHdvdWxkIGRyb3AgdGhlXG4gIC8vIG9ubHkgZGlhZ25vc3RpYyBhIGNhbGxlciBoYXMgYWJvdXQgc3VjaCBhIHRocm93biB2YWx1ZS4gTmVpdGhlciByZXByZXNlbnRhdGlvbiBtYXkgdGhyb3dcbiAgLy8gb3V0IG9mIGhlcmU6IHRoaXMgcnVucyBpbiBhIGNhdGNoIGJsb2NrLCB3aGVyZSBpdCB3b3VsZCByZXBsYWNlIHRoZSBlcnJvciBpdCBjb252ZXJ0cy5cbiAgcmV0dXJuIG5ldyBFcnJvcihpZ25vcmVFcnJvcigoKSA9PiBKU09OLnN0cmluZ2lmeShvYmopKSA/PyBpZ25vcmVFcnJvcigoKSA9PiBTdHJpbmcob2JqKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqXG4gICAqIERlY2lkZXMgaG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgYWZ0ZXIgYGVycm9yYCwgZ2l2ZW4gdGhlIGJhY2tvZmYgYHNsZWVwTWlsbGlzZWNvbmRzYCBpdCB3b3VsZCBvdGhlcndpc2Ugd2FpdCxcbiAgICogZS5nLiBgKGVycm9yLCBtcykgPT4gTWF0aC5tYXgobXMsIHJldHJ5QXRPZihlcnJvcikgLSBEYXRlLm5vdygpKWAgdG8gaG9ub3IgYSByZXRyeSB0aW1lIHNlbnQgYnkgYSBzZXJ2ZXIuXG4gICAqIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgYmFja29mZiB0aGF0IGB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kc2AgYWR2YW5jZXMuXG4gICAqL1xuICBnZXRTbGVlcE1pbGxpc2Vjb25kcz86IChlcnJvcjogdW5rbm93biwgc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIGdldFNsZWVwTWlsbGlzZWNvbmRzLFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRTbGVlcE1pbGxpc2Vjb25kcyA9IGdldFNsZWVwTWlsbGlzZWNvbmRzPy4oZXJyb3IsIHNsZWVwTWlsbGlzZWNvbmRzKSA/PyBzbGVlcE1pbGxpc2Vjb25kcztcbiAgICAgIGlmIChjdXJyZW50U2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKGN1cnJlbnRTbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqIEVzY2FwZXMgZXZlcnkgUmVnRXhwIG1ldGFjaGFyYWN0ZXIgc28gdGhlIHRleHQgbWF0Y2hlcyBpdHNlbGYgbGl0ZXJhbGx5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bJCgpKisuP1tcXFxcXFxdXnt8fV0vZ3UsIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG4vKiogQSBQT1NJWCBzaGVsbCB3b3JkOiBzYWZlIGNoYXJhY3RlcnMgcGFzcyB0aHJvdWdoLCBhbnl0aGluZyBlbHNlIGlzIHNpbmdsZS1xdW90ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVGb3JTaGVsbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vLV0rJC91LnRlc3QodmFsdWUpID8gdmFsdWUgOiBgJyR7dmFsdWUucmVwbGFjZUFsbChcIidcIiwgU3RyaW5nLnJhd2AnXFwnJ2ApfSdgO1xufVxuXG4vKipcbiAqIFdyYXBzIHRleHQgaW4gYSBNYXJrZG93biBjb2RlIGJsb2NrIGZlbmNlZCB3aXRoIHRpbGRlcywgd2hpY2ggYXJlIHJhcmVyIHRoYW4gYmFja3RpY2tzIGluIE1hcmtkb3duIGNvbnRlbnQuXG4gKiBUaGUgZmVuY2UgaXMgbG9uZ2VyIHRoYW4gYW55IHJ1biBvZiB0aWxkZXMgaW4gdGhlIHRleHQgc28gdGhhdCB0aGUgdGV4dCBjYW5ub3QgY2xvc2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1RpbGRlQ29kZUJsb2NrKHRleHQ6IHN0cmluZywgbGFuZ3VhZ2UgPSAnJyk6IHN0cmluZyB7XG4gIHJldHVybiB0b0ZlbmNlZENvZGVCbG9jaygnficsIHRleHQsIGxhbmd1YWdlKTtcbn1cblxuLyoqXG4gKiBXcmFwcyB0ZXh0IGluIGEgTWFya2Rvd24gY29kZSBibG9jayBmZW5jZWQgd2l0aCBiYWNrdGlja3MuXG4gKiBUaGUgZmVuY2UgaXMgbG9uZ2VyIHRoYW4gYW55IHJ1biBvZiBiYWNrdGlja3MgaW4gdGhlIHRleHQgc28gdGhhdCB0aGUgdGV4dCBjYW5ub3QgY2xvc2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NvZGVCbG9jayh0ZXh0OiBzdHJpbmcsIGxhbmd1YWdlID0gJycpOiBzdHJpbmcge1xuICByZXR1cm4gdG9GZW5jZWRDb2RlQmxvY2soJ2AnLCB0ZXh0LCBsYW5ndWFnZSk7XG59XG5cbmZ1bmN0aW9uIHRvRmVuY2VkQ29kZUJsb2NrKGZlbmNlQ2hhcjogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzaG9ydGVzdEZlbmNlID0gZmVuY2VDaGFyLnJlcGVhdCgzKTtcbiAgbGV0IGxvbmdlc3RSdW4gPSAyO1xuICBsZXQgc3RhcnQgPSB0ZXh0LmluZGV4T2Yoc2hvcnRlc3RGZW5jZSk7XG4gIHdoaWxlIChzdGFydCAhPT0gLTEpIHtcbiAgICBsZXQgZW5kID0gc3RhcnQgKyAzO1xuICAgIHdoaWxlICh0ZXh0W2VuZF0gPT09IGZlbmNlQ2hhcikgZW5kKys7XG4gICAgbG9uZ2VzdFJ1biA9IE1hdGgubWF4KGxvbmdlc3RSdW4sIGVuZCAtIHN0YXJ0KTtcbiAgICBzdGFydCA9IHRleHQuaW5kZXhPZihzaG9ydGVzdEZlbmNlLCBlbmQpO1xuICB9XG4gIGxldCBsYW5ndWFnZVN0YXJ0ID0gMDtcbiAgd2hpbGUgKGxhbmd1YWdlW2xhbmd1YWdlU3RhcnRdID09PSBmZW5jZUNoYXIpIGxhbmd1YWdlU3RhcnQrKztcbiAgY29uc3QgZmVuY2UgPSBmZW5jZUNoYXIucmVwZWF0KGxvbmdlc3RSdW4gKyAxICsgbGFuZ3VhZ2VTdGFydCk7XG4gIHJldHVybiBgJHtmZW5jZX0ke2xhbmd1YWdlLnNsaWNlKGxhbmd1YWdlU3RhcnQpfVxcbiR7dGV4dH0ke3RleHQuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJ30ke2ZlbmNlfWA7XG59XG4iLCIvKipcbiAqIFdoZW4gdG8gd3JpdGUgYSB0ZXN0IGFuZCB3aGF0IGEgdGVzdCBtYXkgYXNzZXJ0LCBhcyBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFN0YXRlZCBvbmNlIGhlcmUgYW5kIHJlbmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgYWdlbnQgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgdGVzdGluZyBza2lsbCBzbyB0aGVcbiAqIHR3byBjYW5ub3QgZHJpZnQgYXBhcnQuXG4gKi9cbmV4cG9ydCBjb25zdCBURVNUX1dSSVRJTkdfUlVMRVMgPSBgLSBXcml0ZSBhIHRlc3Qgb25seSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBvciB3aGVuIGEgYmVoYXZpb3IgaXMgbGlrZWx5IHRvIHJlZ3Jlc3MgYW5kIG5vIGV4aXN0aW5nIGF1dG9tYXRpYyBjaGVjayAodHlwZSBjaGVja2luZywgbGludGluZywgYW4gZXhpc3RpbmcgdGVzdCBvciBDSSBjaGVjaykgd291bGQgY2F0Y2ggdGhlIGJyZWFrYWdlLiBOZXZlciBhZGQgYSB0ZXN0IHRoYXQgbWVyZWx5IHJlc3RhdGVzIGEgbWFwcGluZyBmcm9tIGNvbmRpdGlvbnMgdG8gY29uc3RhbnQgb3V0cHV0cyAoaXQgZmFpbHMgb25seSBvbiBpbnRlbnRpb25hbCBlZGl0cykgb3IgdGhhdCBvbmx5IGNvbmZpcm1zIGFuIGV4dGVybmFsIGZhY3QgKGEgbGlicmFyeSdzIGJlaGF2aW9yLCB3aGV0aGVyIGEgdmVyc2lvbiBmaXhlcyBhbiBpc3N1ZSk7IHZlcmlmeSB0aG9zZSBvbmNlIG1hbnVhbGx5LlxuLSBUZXN0IGV4dGVybmFsbHkgb2JzZXJ2YWJsZSBiZWhhdmlvciAoZS5nLiwgZW1pdHRlZCBmaWxlcywgQ0xJIG91dHB1dCwgcmVuZGVyZWQgcmVzdWx0cykgYXQgdGhlIHN5c3RlbSBib3VuZGFyeSwgbm90IGltcGxlbWVudGF0aW9uIGRldGFpbHM6IGRvIG5vdCBtaXJyb3IgcHJvZHVjdGlvbiBsb2dpYywgYXNzZXJ0IHRoYXQgYSBicmFuY2ggaXMgdGFrZW4sIG9yIGZlZWQgaGFuZC1hc3NlbWJsZWQgaW50ZXJuYWwgb2JqZWN0cyB0byBpbnRlcm5hbCBmdW5jdGlvbnMuXG4tIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MsIHVubGVzcyBhY3R1YWwgY2FsbHMgYXJlIGltcHJhY3RpY2FsLCBoYXZlIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLCBvciBtb2NrcyBhcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4tIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4tIEF2b2lkIGZpeGVkIHdhaXRzIGluIEUyRSB0ZXN0czsgd2FpdCBmb3IgY29uZGl0aW9ucyBpbnN0ZWFkLmA7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBBbmNob3JlZCB0byBgXCIsIGAgc28gb25seSBhIHJlZ2lzdHJ5IGVudHJ5J3MgYHJlc29sdmVkYCBzbG90IGlzIGNsZWFyZWQuIEEgZGlyZWN0IHRhcmJhbGxcbiAqIGRlcGVuZGVuY3kgY2FycmllcyBpdHMgVVJMIGluIHRoZSB3b3Jrc3BhY2UgZGVzY3JpcHRvciBhbmQgdHVwbGUgaWRlbnRpZmllciBpbnN0ZWFkLCBhbmQgdGhvc2VcbiAqIFVSTHMgbXVzdCByZW1haW4gaW50YWN0LlxuICovXG5jb25zdCBndWFyZFJlc29sdmVkVXJsUGF0dGVybiA9IC8oXCIsIClcImh0dHBzOlxcL1xcL25wbVxcLmZsYXR0XFwudGVjaFxcL1teXCJdKlwiL2c7XG5cbi8qKlxuICogUmVtb3ZlIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGJ1bi5sb2NrLlxuICpcbiAqIEJ1biB3cml0ZXMgdGhlIHdvcmtzcGFjZSByb290J3MgbG9ja2ZpbGUgZXZlbiB3aGVuIGFuIGluc3RhbGwgcnVucyBmcm9tIGEgY2hpbGQgcGFja2FnZS4gSW4gYVxuICogR2l0IGNoZWNrb3V0IHRoZSBzZWFyY2ggY2xpbWJzIHRvIHRoYXQgcm9vdDsgd2l0aG91dCBhIGNoZWNrb3V0IGJvdW5kYXJ5IGl0IGluc3BlY3RzIG9ubHkgdGhlXG4gKiBzdGFydGluZyBkaXJlY3Rvcnkgc28gaXQgY2Fubm90IHJld3JpdGUgYW4gdW5yZWxhdGVkIGFuY2VzdG9yJ3MgbG9ja2ZpbGUuIFRoZSBwcm94eSBpc1xuICogaW5zdGFsbC10aW1lIHBvbGljeSByYXRoZXIgdGhhbiByZXBvc2l0b3J5IHN0YXRlOiBhbiBlbXB0eSByZXNvbHZlZCBzbG90IHN0aWxsIG1ha2VzIEJ1biB1c2UgdGhlXG4gKiBjb25maWd1cmVkIGRlZmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgbG9ja2ZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY2hhbmdlIHdhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4sICckMVwiXCInKTtcbiAgaWYgKG5vcm1hbGl6ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQSBzaWJsaW5nIHRlbXAgZmlsZSBtYWtlcyB0aGUgcmVwbGFjZW1lbnQgYW4gYXRvbWljIHNhbWUtZGlyZWN0b3J5IHJlbmFtZSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgLy8gd3JpdGUgY2Fubm90IGxlYXZlIGEgdHJ1bmNhdGVkIGJ1bi5sb2NrIGJlaGluZC5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke2xvY2tmaWxlUGF0aH0ubm9ybWFsaXppbmcuJHtwcm9jZXNzLnBpZH0uJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gIHRyeSB7XG4gICAgLy8gc3RhdCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGNobW9kIGlzIG5vdCBzcGVjaWZpZWQgdG8gYWNjZXB0LlxuICAgIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhsb2NrZmlsZVBhdGgpLm1vZGUgJiAwbzc3NztcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBvcmFyeVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50LCB7IG1vZGUgfSk7XG4gICAgLy8gd3JpdGVGaWxlU3luYydzIG1vZGUgaXMgbWFza2VkIGJ5IHRoZSBwcm9jZXNzIHVtYXNrOyBjaG1vZCByZXN0b3JlcyB0aGUgZXhhY3Qgb3JpZ2luYWwgYml0cy5cbiAgICBmcy5jaG1vZFN5bmModGVtcG9yYXJ5UGF0aCwgbW9kZSk7XG4gICAgZnMucmVuYW1lU3luYyh0ZW1wb3JhcnlQYXRoLCBsb2NrZmlsZVBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyh0ZW1wb3JhcnlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBsb2NrZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZFN0YXJ0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShzdGFydERpclBhdGgpO1xuICBjb25zdCByZXBvc2l0b3J5Um9vdERpclBhdGggPSBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHJlc29sdmVkU3RhcnREaXJQYXRoKTtcbiAgaWYgKCFyZXBvc2l0b3J5Um9vdERpclBhdGgpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRTdGFydERpclBhdGgsICdidW4ubG9jaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkgPyBsb2NrZmlsZVBhdGggOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgZGlyUGF0aCA9IHJlc29sdmVkU3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpKSByZXR1cm4gbG9ja2ZpbGVQYXRoO1xuICAgIGlmIChkaXJQYXRoID09PSByZXBvc2l0b3J5Um9vdERpclBhdGgpIHJldHVybjtcblxuICAgIGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkaXJQYXRoID0gc3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGRpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSByZXR1cm47XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cbiIsIi8qKiBXaGV0aGVyIGEgRG9ja2VyZmlsZSBjb25zdW1lcyB3YidzIGdlbmVyYXRlZCBub24tc2VjcmV0IGVudmlyb25tZW50IGRpcmVjdGx5IG9yIHRocm91Z2ggaXRzIGhlbHBlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0RvY2tlckVudihkb2NrZXJmaWxlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBkb2NrZXJmaWxlVGV4dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuc29tZSgobGluZSkgPT4gIS9eXFxzKiMvdS50ZXN0KGxpbmUpICYmIChsaW5lLmluY2x1ZGVzKCcuZG9ja2VyLmVudicpIHx8IGxpbmUuaW5jbHVkZXMoJ2FwcGx5LWRvY2tlci1lbnYuc2gnKSkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLmFudGlncmF2aXR5Y2xpLyoqJyxcbiAgLy8gR2l0J3Mgb2JqZWN0IHN0b3JlIGhvbGRzIGNvcGllcyBvZiB0cmFja2VkIGZpbGVzIChhbmQgYGRvdDogdHJ1ZWAgbWFrZXMgdGhlbSB2aXNpYmxlKSwgc29cbiAgLy8gc2Nhbm5pbmcgaXQgd291bGQgYm90aCBzbG93IGV2ZXJ5IGdsb2IgZG93biBhbmQgbGV0IHN0YWxlIGJsb2JzIGluZmx1ZW5jZSBkZXRlY3Rpb24uXG4gICcqKi8uZ2l0LyoqJyxcbiAgLy8gVGhlIG9yZy1zdGFuZGFyZCB0ZW1wb3JhcnkgZGlyZWN0b3J5OyBzdGFsZSBjb3BpZXMgdW5kZXIgaXQgKGUuZy4gcmV2aWV3IHNjcmF0Y2ggZGlycykgbXVzdFxuICAvLyBub3QgaW5mbHVlbmNlIGxhbmd1YWdlIGRldGVjdGlvbi5cbiAgJyoqLy50bXAvKionLFxuICAnKiovLnRtcC0qLyoqJyxcbiAgLy8gTG9jYWwgY2FjaGVzIGNhbiBjb250YWluIGNvbXBsZXRlIHRoaXJkLXBhcnR5IHNvdXJjZSBjaGVja291dHMuIFRyZWF0aW5nIHRob3NlIGFzIHJlcG9zaXRvcnlcbiAgLy8gY29kZSBnZW5lcmF0ZXMgd29ya2Zsb3dzIGZvciBwYXRocyB0aGF0IGFyZSBnaXRpZ25vcmVkIGFuZCBhYnNlbnQgZnJvbSBmcmVzaCBDSSBjaGVja291dHMuXG4gICcqKi8uY2FjaGUvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5sZXQgcmVhbFJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIC8qKiBDb25maW5lcyBnZW5lcmF0ZUZpbGUgd3JpdGVzIHRvIHRoZSByZXBvc2l0b3J5IHJvb3RlZCBhdCByb290RGlyUGF0aCAodW5kZWZpbmVkIGRpc2FibGVzIGl0KS4gKi9cbiAgc2V0Um9vdERpclBhdGgocm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHJlYWxSb290RGlyUGF0aCA9IHJvb3REaXJQYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJucyB1bmRlZmluZWQgb25seSB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LiBPdGhlciBmYWlsdXJlcyAoZS5nLiBwZXJtaXNzaW9ucykgYXJlXG4gICAqIHJldGhyb3duIHNvIGNhbGxlcnMgcmVnZW5lcmF0aW5nIGNvbmZpZyBmaWxlcyBuZXZlciBvdmVyd3JpdGUgY29udGVudCB0aGV5IGNvdWxkIG5vdCByZWFkLlxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH0sXG4gIC8qKiBUZWxscyB3aGV0aGVyIGEgd3JpdGUgdG8gZmlsZVBhdGggd291bGQgcGFzcyB0aGUgc3ltbGluay9yZXBvc2l0b3J5LWNvbnRhaW5tZW50IGd1YXJkcy4gKi9cbiAgYXN5bmMgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmVhZHMgYSBzb3VyY2UgZmlsZSwgcmV0dXJuaW5nIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IE9SIHdoZW4gaXRcbiAgICogcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSDigJQgYSBjb21taXR0ZWQgc3ltbGluayBwb2ludGluZyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IG11c3RcbiAgICogbm90IGdldCBpdHMgdGFyZ2V0J3MgY29udGVudCBjb3BpZWQgaW50byBhIHRyYWNrZWQgZmlsZS4gQSBzeW1saW5rIHdob3NlIHJlc29sdmVkIHRhcmdldFxuICAgKiBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkgaXMgbGVnaXRpbWF0ZSAoZS5nLiBgLm5vZGUtdmVyc2lvbiAtPiAubnZtcmNgKSBhbmQgaXMgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKCFzdGF0cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgbGV0IHJlYWxGaWxlUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVhbEZpbGVQYXRoID0gYXdhaXQgZnMucHJvbWlzZXMucmVhbHBhdGgoZmlsZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBkYW5nbGluZyBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICByZWFsUm9vdERpclBhdGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICByZWFsRmlsZVBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJlxuICAgICAgICAhcmVhbEZpbGVQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZXMgZmlsZVBhdGggKGZvcmNlLCBvcHRpb25hbGx5IHJlY3Vyc2l2ZSkgb25seSB3aGVuIGl0cyBQQVJFTlQgZGlyZWN0b3J5IHJlc29sdmVzIGluc2lkZVxuICAgKiB0aGUgcmVwb3NpdG9yeSwgc28gYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGEgY29tbWl0dGVkIC5naXRodWIvd29ya2Zsb3dzIGxpbmspIGNhbiBuZXZlclxuICAgKiBtYWtlIGNsZWFudXAgZGVsZXRlIGZpbGVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuIFJlbW92aW5nIGEgc3ltbGluayBlbnRyeSBpdHNlbGYgaXMgYWxsb3dlZDpcbiAgICogdGhhdCBkZWxldGVzIG9ubHkgdGhlIGxpbmssIG5ldmVyIGl0cyB0YXJnZXQuIFJldHVybnMgd2hldGhlciB0aGUgcmVtb3ZhbCB3YXMgcGVyZm9ybWVkLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlbW92aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogb3B0aW9ucz8ucmVjdXJzaXZlID8/IGZhbHNlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogV3JpdGVzIGNvbnRlbnQgdmVyYmF0aW0sIGFwcGx5aW5nIHRoZSBzYW1lIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMgYXMgZ2VuZXJhdGVGaWxlLiAqL1xuICBhc3luYyB3cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSkpIHJldHVybiBmYWxzZTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIHdhcyBhY3R1YWxseSBnZW5lcmF0ZWQgKGZhbHNlIHdoZW4gdGhlIGNvbmZpbmVtZW50IGd1YXJkcyBza2lwIGl0KS4gKi9cbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGluZUVuZGluZzogJ1xcbicgfCAnXFxyXFxuJyA9ICdcXG4nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gYHRyaW1gIHRyZWF0cyBhIEJPTSBhcyB3aGl0ZXNwYWNlLCBzbyBpdCBpcyByZWF0dGFjaGVkIGF0IHBvc2l0aW9uIDA6IGRyb3BwaW5nIGl0IHdvdWxkXG4gICAgLy8gcmV3cml0ZSB0aGUgZW5jb2RpbmcgbWFya2VyIG9mIGEgZmlsZSB0aGUgZ2VuZXJhdG9yIHdhcyBvbmx5IGFza2VkIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBieXRlT3JkZXJNYXJrID0gY29udGVudC5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCA9IGAke2J5dGVPcmRlck1hcmt9JHtub3JtYWxpemVkQ29udGVudH0ke2xpbmVFbmRpbmd9YDtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gTmV2ZXIgd3JpdGUgdGhyb3VnaCBhIHN5bWxpbms6IGEgKHBvc3NpYmx5IGRhbmdsaW5nKSBsaW5rIGNvbW1pdHRlZCBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnlcbiAgLy8gY291bGQgcmVkaXJlY3QgdGhlIHdyaXRlIG91dHNpZGUgaXQuXG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgaWYgKHN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgd3JpdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBBIHN5bWxpbmtlZCBwYXJlbnQgZGlyZWN0b3J5IHdvdWxkIHJlZGlyZWN0IHJlYWRzLCB3cml0ZXMsIGFuZCByZW1vdmFscyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LFxuLy8gc28gcmVxdWlyZSB0aGUgY2xvc2VzdCBleGlzdGluZyBhbmNlc3RvciB0byByZXNvbHZlIGluc2lkZSB0aGUgcm9vdCBzZXQgYnkgdGhlIENMSSBlbnRyeSBwb2ludC5cbmFzeW5jIGZ1bmN0aW9uIGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKHJlYWxSb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgbGV0IGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhhbmNlc3RvclBhdGgpKSB7XG4gICAgYW5jZXN0b3JQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yUGF0aCk7XG4gIH1cbiAgY29uc3QgcmVhbEFuY2VzdG9yUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGFuY2VzdG9yUGF0aCk7XG4gIHJldHVybiByZWFsQW5jZXN0b3JQYXRoID09PSByZWFsUm9vdERpclBhdGggfHwgcmVhbEFuY2VzdG9yUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcblxuLyoqXG4gKiBSdW5zIGV2ZXJ5IHRhc2sgaW4gYHByb21pc2VQb29sYCBhbmQgcmVqZWN0cyB3aXRoIHRoZSBmaXJzdCBlcnJvciBvbmx5IGFmdGVyIGFsbCBvZiB0aGVtIHNldHRsZSxcbiAqIHNvIGEgY2FsbGVyIHRoYXQgY2F0Y2hlcyB0aGUgZXJyb3IgbmV2ZXIgcHJvY2VlZHMgd2hpbGUgYSBzaWJsaW5nIHdyaXRlIGlzIHN0aWxsIHJ1bm5pbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5BbGxJblBvb2wodGFza3M6IHJlYWRvbmx5ICgoKSA9PiBQcm9taXNlPHVua25vd24+KVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGFza3MubWFwKCh0YXNrKSA9PiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUodGFzaykpKTtcbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB0aHJvdyByZXN1bHQucmVhc29uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBUEkgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzeW5jJztcbmltcG9ydCB0eXBlIHsgU291cmNlRmlsZSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgKEdvKSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYW5kIG5vXG4vLyBsb25nZXIgZXhwb3NlcyBhbiBpbi1wcm9jZXNzIHBhcnNlciBzdWNoIGFzIGB0cy5jcmVhdGVTb3VyY2VGaWxlYC4gUGFyc2luZyBub3dcbi8vIGhhcHBlbnMgaW4gYSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlciByZWFjaGVkIHRocm91Z2ggdGhlIGFzeW5jaHJvbm91cyBBUEksIHNvIHdlXG4vLyBrZWVwIGEgc2luZ2xlIGxhemlseS1jcmVhdGVkIGluc3RhbmNlIGFuZCByZXVzZSBpdCBhY3Jvc3MgZXZlcnkgZml4ZXIgdG8gYXZvaWRcbi8vIHBheWluZyB0aGUgcHJvY2Vzcy1zcGF3biBjb3N0IHBlciBmaWxlLlxubGV0IGFwaTogQVBJIHwgdW5kZWZpbmVkO1xubGV0IGNvbm5lY3RlZDogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQYXJzZXMgYSBzb3VyY2UgZmlsZSBpbnRvIGEgVHlwZVNjcmlwdCBBU1QgdXNpbmcgdGhlIGJ1bmRsZWQgbmF0aXZlIGNvbXBpbGVyLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBjb21waWxlciBjYW5ub3QgbG9hZCB0aGUgZmlsZSAoZS5nLiBpdCBpcyBtaXNzaW5nXG4gKiBvciB1bnBhcnNhYmxlKSBzbyBjYWxsZXJzIGNhbiBmYWxsIGJhY2sgdG8gY29uc2VydmF0aXZlIGJlaGF2aW9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNvdXJjZUZpbGUgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGkgPSBhd2FpdCBnZXRBcGkoKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGFwaS51cGRhdGVTbmFwc2hvdCh7IG9wZW5GaWxlczogW2ZpbGVQYXRoXSB9KTtcbiAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgc25hcHNob3QuZ2V0RGVmYXVsdFByb2plY3RGb3JGaWxlKGZpbGVQYXRoKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvamVjdD8ucHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNodXRzIGRvd24gdGhlIHNwYXduZWQgY29tcGlsZXIgc2VydmVyLiBUaGUgc2VydmVyIGtlZXBzIGFuIG9wZW4gSVBDIGNoYW5uZWxcbiAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGtlZXAgdGhlIHJ1bnRpbWUgZXZlbnQgbG9vcCBhbGl2ZSwgc28gd2JmeSBtdXN0IGNhbGwgdGhpc1xuICogb25jZSBpdHMgcnVuIGZpbmlzaGVzIGZvciB0aGUgcHJvY2VzcyB0byBleGl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwaT8uY2xvc2UoKTtcbiAgYXBpID0gdW5kZWZpbmVkO1xuICBjb25uZWN0ZWQgPSB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFwaSgpOiBQcm9taXNlPEFQST4ge1xuICBhcGkgPz89IG5ldyBBUEkoeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSk7XG4gIC8vIFRoZSBjbGllbnQgbWFya3MgaXRzZWxmIGNvbm5lY3RlZCBvbmx5IG9uY2UgaXRzIGZpcnN0IHNwYXduIGNvbXBsZXRlcywgc28gY29uY3VycmVudFxuICAvLyBmaXJzdCByZXF1ZXN0cyAodGhlIGZpeGVycyBydW4gaW4gcGFyYWxsZWwpIHdvdWxkIGVhY2ggc3Bhd24gYSBjb21waWxlciBzZXJ2ZXI7IHRoZVxuICAvLyBleHRyYSBzZXJ2ZXJzIGFyZSBuZXZlciBjbG9zZWQgYW5kIGtlZXAgdGhlIHByb2Nlc3MgYWxpdmUgYWZ0ZXIgYGRpc3Bvc2VUeXBlU2NyaXB0QXBpYC5cbiAgLy8gVGhlIGZpcnN0IHJlcXVlc3QgaXMgdGhlcmVmb3JlIGF3YWl0ZWQgb25jZSBiZWZvcmUgYW55IG90aGVyIGlzIHNlbnQ7IGEgZmFpbGVkIG9uZSBpc1xuICAvLyBmb3Jnb3R0ZW4gc28gdGhhdCB0aGUgbmV4dCByZXF1ZXN0IGNvbm5lY3RzIGFnYWluIGluc3RlYWQgb2YgZmFpbGluZyBmb3IgdGhlIHdob2xlIHJ1bi5cbiAgY29ubmVjdGVkID8/PSBhcGkudXBkYXRlU25hcHNob3QoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICBjb25uZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xuICBhd2FpdCBjb25uZWN0ZWQ7XG4gIHJldHVybiBhcGk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxuLy8gU2V0dGluZ3MgZXZlcnkgV2lsbEJvb3N0ZXIgTmV4dC5qcyBwcm9qZWN0IHNob3VsZCBjYXJyeS4gYG5hbWVgIGlzIHRoZSB0b3AtbGV2ZWxcbi8vIHByb3BlcnR5IGtleSB1c2VkIHRvIGRldGVjdCB3aGV0aGVyIHRoZSBzZXR0aW5nIGFscmVhZHkgZXhpc3RzOyBgdGV4dGAgaXMgaW5zZXJ0ZWRcbi8vIHZlcmJhdGltIChhIHdob2xlIGBrZXk6IHZhbHVlYCBwYWlyKSB3aGVuIHRoZSBrZXkgaXMgbWlzc2luZy5cbmNvbnN0IG1hbmFnZWRQcm9wZXJ0aWVzOiByZWFkb25seSB7IG5hbWU6IHN0cmluZzsgdGV4dDogc3RyaW5nIH1bXSA9IFtcbiAgeyBuYW1lOiAncmVhY3RDb21waWxlcicsIHRleHQ6ICdyZWFjdENvbXBpbGVyOiB0cnVlJyB9LFxuICB7IG5hbWU6ICdyZWFjdFN0cmljdE1vZGUnLCB0ZXh0OiAncmVhY3RTdHJpY3RNb2RlOiB0cnVlJyB9LFxuICB7IG5hbWU6ICd0eXBlc2NyaXB0JywgdGV4dDogJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfScgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsndHMnLCAnbXRzJywgJ2N0cycsICdqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFjdGVkID0gYXdhaXQgZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGgpO1xuICAgIGlmICghZXh0cmFjdGVkKSByZXR1cm47XG4gICAgY29uc3QgeyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA9IGV4dHJhY3RlZDtcblxuICAgIC8vIGBwcm9wZXJ0aWVzYCBpbmNsdWRlcyBzcHJlYWQgYXNzaWdubWVudHMgKGAuLi5yZXN0YCkgdGhhdCBjYXJyeSBubyBuYW1lLCBzbyBndWFyZCBiZWZvcmUgcmVhZGluZyBpdC5cbiAgICBjb25zdCBleGlzdGluZ1Byb3BlcnRpZXMgPSBuZXcgU2V0KFxuICAgICAgb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+XG4gICAgICAgICduYW1lJyBpbiBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5uYW1lID8gZ2V0UHJvcGVydHlLZXkocHJvcGVydHkubmFtZSwgc291cmNlKSA6IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgcHJvcGVydHlUZXh0cyA9IG1hbmFnZWRQcm9wZXJ0aWVzXG4gICAgICAuZmlsdGVyKChwcm9wZXJ0eSkgPT4gIWV4aXN0aW5nUHJvcGVydGllcy5oYXMocHJvcGVydHkubmFtZSkpXG4gICAgICAubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkudGV4dCk7XG4gICAgaWYgKHByb3BlcnR5VGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gc291cmNlLnRleHQ7XG4gICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBvYmplY3RMaXRlcmFsLmdldEVuZCgpIC0gMTtcbiAgICAvLyBUaGUgbmF0aXZlIFRTIEFTVCBkb2VzIG5vdCByZWxpYWJseSBleHBvc2UgYHByb3BlcnRpZXMuaGFzVHJhaWxpbmdDb21tYWAsIHNvIHNjYW4gdGhlIHNvdXJjZVxuICAgIC8vIGJldHdlZW4gdGhlIGxhc3QgcHJvcGVydHkgYW5kIHRoZSBjbG9zaW5nIGJyYWNlLiBTdHJpcCBjb21tZW50cyBmaXJzdCBzbyBhIGNvbW1hIGluc2lkZSBhXG4gICAgLy8gdHJhaWxpbmcgY29tbWVudCAoZS5nLiBgZm9vOiAxIC8vIGEsIGJgKSBpcyBub3QgbWlzdGFrZW4gZm9yIGEgcmVhbCB0cmFpbGluZyBjb21tYS5cbiAgICBjb25zdCBsYXN0UHJvcGVydHkgPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMuYXQoLTEpO1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ29tbWEgPSBsYXN0UHJvcGVydHlcbiAgICAgID8gc3RyaXBDb21tZW50cyhvbGRDb250ZW50LnNsaWNlKGxhc3RQcm9wZXJ0eS5nZXRFbmQoKSwgaW5zZXJ0aW9uUG9pbnQpKS5pbmNsdWRlcygnLCcpXG4gICAgICA6IGZhbHNlO1xuICAgIGNvbnN0IHByZWZpeCA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5sZW5ndGggPiAwICYmICFoYXNUcmFpbGluZ0NvbW1hID8gJywgJyA6ICcnO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIGluc2VydGlvblBvaW50KX0ke3ByZWZpeH0ke3Byb3BlcnR5VGV4dHMuam9pbignLCAnKX0ke29sZENvbnRlbnQuc2xpY2UoXG4gICAgICBpbnNlcnRpb25Qb2ludFxuICAgICl9YDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8eyBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlOyBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUaGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQgZGVjbGFyZXMgdGhlIGNvbmZpZyBhcyBgY29uc3QgbmV4dENvbmZpZzogTmV4dENvbmZpZyA9IHsgLi4uIH1gIGFuZFxuICAvLyBleHBvcnRzIGl0IChwb3NzaWJseSB3cmFwcGVkLCBlLmcuIGB3aXRoU2VudHJ5Q29uZmlnKC4uLilgKSwgc28gdGhlIG9iamVjdCBsaXRlcmFsIGlzIHJhcmVseVxuICAvLyB0aGUgZGlyZWN0IG9wZXJhbmQgb2YgYGV4cG9ydCBkZWZhdWx0YC9gbW9kdWxlLmV4cG9ydHNgLiBDb2xsZWN0IGV2ZXJ5IGNhbmRpZGF0ZSBhbmQgcGljayB0aGVcbiAgLy8gbW9zdCBhdXRob3JpdGF0aXZlIG9uZSBiZWxvdy5cbiAgbGV0IGRpcmVjdE9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgbGV0IGV4cG9ydGVkSWRlbnRpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2YXJpYWJsZU9iamVjdExpdGVyYWxzID0gbmV3IE1hcDxzdHJpbmcsIGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbj4oKTtcbiAgY29uc3QgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsczogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uW10gPSBbXTtcblxuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChhc3QuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmV4cHJlc3Npb24pO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYXN0LmlzQmluYXJ5RXhwcmVzc2lvbihub2RlKSAmJlxuICAgICAgbm9kZS5vcGVyYXRvclRva2VuLmtpbmQgPT09IGFzdC5TeW50YXhLaW5kLkVxdWFsc1Rva2VuICYmXG4gICAgICBub2RlLmxlZnQuZ2V0VGV4dChzb3VyY2UpID09PSAnbW9kdWxlLmV4cG9ydHMnXG4gICAgKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLnJpZ2h0KTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5yaWdodCkpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLnJpZ2h0LmdldFRleHQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFzdC5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkgJiYgbm9kZS5pbml0aWFsaXplcikge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5pbml0aWFsaXplcik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCAmJiBhc3QuaXNJZGVudGlmaWVyKG5vZGUubmFtZSkpIHtcbiAgICAgICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5zZXQobm9kZS5uYW1lLmdldFRleHQoc291cmNlKSwgb2JqZWN0TGl0ZXJhbCk7XG4gICAgICAgIC8vIFRoZSBgOiBOZXh0Q29uZmlnYCBhbm5vdGF0aW9uIHdiZnkgd3JpdGVzIG1hcmtzIHRoZSBjYW5vbmljYWwgY29uZmlnIG9iamVjdCAoYWNjZXB0aW5nXG4gICAgICAgIC8vIHF1YWxpZmllZCBuYW1lcyBzdWNoIGFzIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYCkuXG4gICAgICAgIGNvbnN0IGFubm90YXRpb25UeXBlID0gbm9kZS50eXBlPy5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZSAhPT0gdW5kZWZpbmVkICYmIGlzTmV4dENvbmZpZ1R5cGUoYW5ub3RhdGlvblR5cGUpKSB7XG4gICAgICAgICAgdHlwZWRDb25maWdPYmplY3RMaXRlcmFscy5wdXNoKG9iamVjdExpdGVyYWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9XG4gICAgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsc1swXSA/P1xuICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz9cbiAgICAoZXhwb3J0ZWRJZGVudGlmaWVyID8gdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoZXhwb3J0ZWRJZGVudGlmaWVyKSA6IHVuZGVmaW5lZCkgPz9cbiAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldCgnbmV4dENvbmZpZycpO1xuICByZXR1cm4gb2JqZWN0TGl0ZXJhbCA/IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVud3JhcE9iamVjdExpdGVyYWwobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBjdXJyZW50ID0gdW53cmFwUGFyZW50aGVzZXMobm9kZSk7XG4gIHJldHVybiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihjdXJyZW50KSA/IGN1cnJlbnQgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVud3JhcFBhcmVudGhlc2VzKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0LkV4cHJlc3Npb24ge1xuICBsZXQgY3VycmVudCA9IG5vZGU7XG4gIHdoaWxlIChhc3QuaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihjdXJyZW50KSkge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LmV4cHJlc3Npb247XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8vIE1hdGNoIGJvdGggdGhlIGJhcmUgYE5leHRDb25maWdgIGFuZCBxdWFsaWZpZWQgZm9ybXMgbGlrZSBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2AuXG5mdW5jdGlvbiBpc05leHRDb25maWdUeXBlKHR5cGVUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVUZXh0ID09PSAnTmV4dENvbmZpZycgfHwgdHlwZVRleHQuZW5kc1dpdGgoJy5OZXh0Q29uZmlnJyk7XG59XG5cbi8vIFJldHVybiBhIHByb3BlcnR5IGtleSB3aXRob3V0IHN1cnJvdW5kaW5nIHF1b3Rlcywgc28gYCdyZWFjdENvbXBpbGVyJ2AgbWF0Y2hlcyBgcmVhY3RDb21waWxlcmAuXG4vLyBJZGVudGlmaWVyLCBzdHJpbmctbGl0ZXJhbCBhbmQgbnVtZXJpYy1saXRlcmFsIG5hbWVzIGFsbCBleHBvc2UgdGhlIHVucXVvdGVkIHZhbHVlIHZpYSBgLnRleHRgLlxuZnVuY3Rpb24gZ2V0UHJvcGVydHlLZXkobmFtZTogYXN0LlByb3BlcnR5TmFtZSwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZyB7XG4gIHJldHVybiAndGV4dCcgaW4gbmFtZSAmJiB0eXBlb2YgbmFtZS50ZXh0ID09PSAnc3RyaW5nJyA/IG5hbWUudGV4dCA6IG5hbWUuZ2V0VGV4dChzb3VyY2UpO1xufVxuXG5mdW5jdGlvbiBzdHJpcENvbW1lbnRzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1xcL1xcL1teXFxuXSp8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4Q2hha3JhVG9hc3Rlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhDaGFrcmFUb2FzdGVyJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5jaGFrcmEpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RvYXN0ZXIue3RzLHRzeH0nLCB7XG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICBpZ25vcmU6IFsnKiovLiovKionLCAnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgY29udGVudC5pbmNsdWRlcygnQ3JlYXRlVG9hc3RlclJldHVybicpIHx8XG4gICAgICAgICFjb250ZW50LmluY2x1ZGVzKFwiZnJvbSAnQGNoYWtyYS11aS9yZWFjdCdcIikgfHxcbiAgICAgICAgIWNvbnRlbnQuaW5jbHVkZXMoJ2V4cG9ydCBjb25zdCB0b2FzdGVyID0gY3JlYXRlVG9hc3RlcignKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBjb250ZW50XG4gICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgIC9eaW1wb3J0IC4qIGZyb20gJ0BjaGFrcmEtdWlcXC9yZWFjdCc7JC9tdSxcbiAgICAgICAgICBcIiQmXFxuaW1wb3J0IHR5cGUgeyBDcmVhdGVUb2FzdGVyUmV0dXJuIH0gZnJvbSAnQGNoYWtyYS11aS9yZWFjdCc7XCJcbiAgICAgICAgKVxuICAgICAgICAucmVwbGFjZSgnZXhwb3J0IGNvbnN0IHRvYXN0ZXIgPSBjcmVhdGVUb2FzdGVyKCcsICdleHBvcnQgY29uc3QgdG9hc3RlcjogQ3JlYXRlVG9hc3RlclJldHVybiA9IGNyZWF0ZVRvYXN0ZXIoJyk7XG4gICAgICBpZiAodXBkYXRlZENvbnRlbnQgIT09IGNvbnRlbnQpIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHVwZGF0ZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIE9iamVjdE1lbWJlciA9IHsga2luZDogJ2V4dHJhJzsgaW5kZXg6IG51bWJlciB9IHwgeyBraW5kOiAncHJvcGVydHknOyBrZXk6IHN0cmluZyB9O1xuaW50ZXJmYWNlIFBhcnNlZE9iamVjdCB7XG4gIGV4dHJhTWVtYmVyczogc3RyaW5nW107XG4gIG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXTtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xufVxuaW50ZXJmYWNlIEV4dHJhY3RlZE9iamVjdExpdGVyYWwge1xuICBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlO1xuICBub2RlOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG59XG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRWYWx1ZSA9PiAoe1xuICBraW5kOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXMsIGV4dHJhTWVtYmVycyksXG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzOiBib29sZWFuKTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3QgdXNlID0gdG9QYXJzZWRPYmplY3Qoe1xuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbidcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KTtcblxuICBpZiAoc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpIHtcbiAgICB1c2UucHJvcGVydGllcy5iYXNlVVJMID0gbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKTtcbiAgICB1c2UubWVtYmVyT3JkZXIudW5zaGlmdCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleTogJ2Jhc2VVUkwnIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRvUGFyc2VkT2JqZWN0KHtcbiAgICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gICAgdXNlOiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogdXNlIH0sXG4gICAgLi4uKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzXG4gICAgICA/IHtcbiAgICAgICAgICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKCkpLFxuICAgICAgICAgICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgICAgICAgICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgICAgICAgICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgICAgICAgICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgICAgICAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9QYXJzZWRPYmplY3QocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRPYmplY3Qge1xuICByZXR1cm4ge1xuICAgIGV4dHJhTWVtYmVycyxcbiAgICBtZW1iZXJPcmRlcjogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcGVydGllcykubWFwKChrZXkpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pKSxcbiAgICAgIC4uLmV4dHJhTWVtYmVycy5tYXAoKF8sIGluZGV4KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pKSxcbiAgICBdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCA9IGF3YWl0IGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZE9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIHdiIGRlcml2ZXMgTkVYVF9QVUJMSUNfQkFTRV9VUkwgZnJvbSB0aGUgcmVzb2x2ZWQgcG9ydCBmb3IgTmV4dC5qcy92aW5leHQgYXBwcyAodmluZXh0XG4gICAgLy8gYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyBgZGVwZW5kaW5nLm5leHRgIGNvdmVycyBib3RoKSwgc28gdGhvc2UgbmVlZCBubyBkZWNsYXJlZFxuICAgIC8vIHZhcmlhYmxlOyBvdGhlciBwYWNrYWdlcyBzdGlsbCByZXF1aXJlIGEgZGVjbGFyYXRpb24uXG4gICAgY29uc3Qgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMgPVxuICAgICAgc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnLCBwYXJzZWQpICYmXG4gICAgICAoY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IChhd2FpdCBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoY29uZmlnLmRpclBhdGgpKSk7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyk7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VQYXJzZWRPYmplY3RzKGRlZmF1bHRDb25maWcsIHBhcnNlZCk7XG4gICAgYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMobWVyZ2VkLCBkZWZhdWx0Q29uZmlnKTtcbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKG1lcmdlZCk7XG5cbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5VmFsdWUoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlZCB9LCAwKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UudGV4dDtcbiAgICBjb25zdCBzdGFydCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRTdGFydChleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgY29uc3QgZW5kID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIHN0YXJ0KX0ke25ld09iamVjdExpdGVyYWx9JHtvbGRDb250ZW50LnNsaWNlKGVuZCl9YDtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZTogUGFyc2VkT2JqZWN0LCBvdmVycmlkZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wZXJ0eUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG92ZXJyaWRlLnByb3BlcnRpZXMpKTtcbiAgY29uc3QgZXh0cmFNZW1iZXJzID0gWy4uLmJhc2UuZXh0cmFNZW1iZXJzLCAuLi5vdmVycmlkZS5leHRyYU1lbWJlcnNdO1xuICAvLyBLZWVwIGRlZmF1bHQtb25seSBtZW1iZXJzIGJlZm9yZSBwYXJzZWQgbWVtYmVycyBzbyBzcHJlYWRzIGFuZCBleHBsaWNpdCBsb2NhbCBwcm9wZXJ0aWVzIHJldGFpbiBwcmVjZWRlbmNlLlxuICBjb25zdCBtZW1iZXJPcmRlciA9IFtcbiAgICAuLi5iYXNlLm1lbWJlck9yZGVyLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPT0gJ3Byb3BlcnR5JyB8fCAhb3ZlcnJpZGVQcm9wZXJ0eUtleXMuaGFzKG1lbWJlci5rZXkpKSxcbiAgICAuLi5vdmVycmlkZS5tZW1iZXJPcmRlci5tYXAoKG1lbWJlcik6IE9iamVjdE1lbWJlciA9PiB7XG4gICAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHJldHVybiBtZW1iZXI7XG4gICAgICByZXR1cm4geyBraW5kOiAnZXh0cmEnLCBpbmRleDogYmFzZS5leHRyYU1lbWJlcnMubGVuZ3RoICsgbWVtYmVyLmluZGV4IH07XG4gICAgfSksXG4gIF07XG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7IC4uLmJhc2UucHJvcGVydGllcyB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZS5wcm9wZXJ0aWVzKSkge1xuICAgIHByb3BlcnRpZXNba2V5XSA9IG1lcmdlUGFyc2VkVmFsdWUocHJvcGVydGllc1trZXldLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHsgZXh0cmFNZW1iZXJzLCBtZW1iZXJPcmRlciwgcHJvcGVydGllcyB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZFZhbHVlKGJhc2U6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkLCBvdmVycmlkZTogUGFyc2VkVmFsdWUpOiBQYXJzZWRWYWx1ZSB7XG4gIGlmIChiYXNlPy5raW5kID09PSAnb2JqZWN0JyAmJiBvdmVycmlkZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2UudmFsdWUsIG92ZXJyaWRlLnZhbHVlKSB9O1xuICB9XG4gIHJldHVybiBvdmVycmlkZTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMoY29uZmlnOiBQYXJzZWRPYmplY3QsIGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB1c2UgPSBjb25maWcucHJvcGVydGllcy51c2U7XG4gIGNvbnN0IGRlZmF1bHRVc2UgPSBkZWZhdWx0Q29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBpZiAodXNlPy5raW5kICE9PSAnb2JqZWN0JyB8fCBkZWZhdWx0VXNlPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIFsndHJhY2UnLCAnc2NyZWVuc2hvdCcsICd2aWRlbyddKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV07XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwYXJzZWQ6IFBhcnNlZE9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fFxuICAgIHBhcnNlZC5wcm9wZXJ0aWVzLndlYlNlcnZlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgZG9lc09iamVjdEhhdmVCYXNlVXJsKHBhcnNlZC5wcm9wZXJ0aWVzLnVzZSkgfHxcbiAgICBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkIH0sICdORVhUX1BVQkxJQ19CQVNFX1VSTCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRvZXNPYmplY3RIYXZlQmFzZVVybCh2YWx1ZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlPy5raW5kID09PSAnb2JqZWN0JyAmJiB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzLmJhc2VVUkwgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwodmFsdWU6IFBhcnNlZFZhbHVlLCBsaXRlcmFsVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZS5pbmNsdWRlcyhsaXRlcmFsVGV4dCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSByZXR1cm4gdmFsdWUudmFsdWUuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpO1xuICByZXR1cm4gKFxuICAgIHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVycy5zb21lKChtZW1iZXIpID0+IG1lbWJlci5pbmNsdWRlcyhsaXRlcmFsVGV4dCkpIHx8XG4gICAgT2JqZWN0LnZhbHVlcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGdldEVudkZpbGVQYXRocyhkaXJQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgLy8gU29tZSBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb25seSBkZWZpbmUgYnJvd3NlciBwcm9qZWN0cyBvciBmaXh0dXJlcyBhbmQgZG8gbm90XG4gIC8vIHN0YXJ0IGEgd2ViIGFwcC4gQXZvaWQgZm9yY2luZyBhbiBhcHAtc2VydmVyIFVSTCBpbnRvIHRob3NlIHBhY2thZ2VzLlxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEVudkZpbGVQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVudkZpbGVOYW1lcyA9IFsnZm5veC50b21sJywgJ21pc2UudG9tbCcsICdtaXNlLnRlc3QudG9tbCddO1xuICBjb25zdCBlbnZGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpKSB7XG4gICAgZW52RmlsZVBhdGhzLnB1c2goLi4uZW52RmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG5cbiAgICAvLyBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb2Z0ZW4gbGl2ZSBpbiBwYWNrYWdlcy8qIHdoaWxlIHNoYXJlZCBlbnYgZmlsZXMgbGl2ZSBhdCB0aGVcbiAgICAvLyByZXBvc2l0b3J5IHJvb3QsIHNvIHdhbGsgdXB3YXJkIHVudGlsIHRoZSB0YXJnZXQgcmVwbyBib3VuZGFyeS5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsICcuZ2l0JykpKSBicmVhaztcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZW52RmlsZVBhdGhzO1xufVxuXG5mdW5jdGlvbiBzZXRXZWJTZXJ2ZXJDb21tYW5kKG9iamVjdDogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCBjb21tYW5kID0gd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZDtcbiAgLy8gTGlicmFyaWVzIGNhbiB1c2UgUGxheXdyaWdodCdzIHdlYlNlcnZlciB0byBidWlsZCBhbmQgbGF1bmNoIGEgZml4dHVyZSBldmVuIHRob3VnaCBgd2Igc3RhcnRgXG4gIC8vIGludGVudGlvbmFsbHkgaGFzIG5vIHRlc3Qgc2VydmVyIGZvciB0aGUgbGlicmFyeSBpdHNlbGYuIFByZXNlcnZlIHRob3NlIGN1c3RvbSBsaWZlY3ljbGVcbiAgLy8gY29tbWFuZHM7IG9ubHkgYWRkIHRoZSBjb21tYW5kIHdoZW4gd2JmeSBhbHJlYWR5IG93bnMgaXQuXG4gIGlmIChjb21tYW5kICYmICFpc0dlbmVyYXRlZFdiU3RhcnRUZXN0Q29tbWFuZChjb21tYW5kKSkgcmV0dXJuO1xuXG4gIC8vIFBsYXl3cmlnaHQgcmVxdWlyZXMgYGNvbW1hbmRgIHdoZW5ldmVyIGB3ZWJTZXJ2ZXJgIGV4aXN0czsgYW4gZXh0ZXJuYWxseSBtYW5hZ2VkIHNlcnZlciBzaG91bGRcbiAgLy8gb21pdCBgd2ViU2VydmVyYCBpbnN0ZWFkLiBLZWVwIGZpbGxpbmcgdGhpcyByZXF1aXJlZCBmaWVsZCB3aGVuIGEgcGFydGlhbCBtYW5hZ2VkIGJsb2NrIGxhY2tzIGl0LlxuICB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kID0gbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkV2JTdGFydFRlc3RDb21tYW5kKGNvbW1hbmQ6IFBhcnNlZFZhbHVlKTogYm9vbGVhbiB7XG4gIGlmIChjb21tYW5kLmtpbmQgIT09ICdsaXRlcmFsJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gY29tbWFuZC52YWx1ZS50cmltKCkgPT09IGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpO1xufVxuXG5mdW5jdGlvbiBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnYnVuIHdiIHN0YXJ0IC0tbW9kZSB0ZXN0J2A7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEV4dHJhY3RlZE9iamVjdExpdGVyYWwgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVHlwZVNjcmlwdCBhbHJlYWR5IHVuZGVyc3RhbmRzIG5lc3RlZCBvYmplY3QgbGl0ZXJhbHMgYW5kIHRlbXBsYXRlIHN0cmluZ3MsIHNvIHVzZVxuICAvLyBpdHMgQVNUIHJhbmdlcyBpbnN0ZWFkIG9mIGEgcmVnZXggdGhhdCBjYW4gc3RvcCBhdCB0aGUgZmlyc3QgaW5uZXIgY2xvc2luZyBicmFjZS5cbiAgbGV0IGZvdW5kOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKGFzdC5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkgPT09ICdkZWZpbmVDb25maWcnKSB7XG4gICAgICBjb25zdCBmaXJzdEFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmd1bWVudCAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgICBmb3VuZCA9IGZpcnN0QXJndW1lbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICByZXR1cm4gZm91bmQgPyB7IHNvdXJjZSwgbm9kZTogZm91bmQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IGFzdC5FeHByZXNzaW9uLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAoYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWRPYmplY3QgfSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7IGV4dHJhTWVtYmVyczogW10sIG1lbWJlck9yZGVyOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoYXN0LmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gbGl0ZXJhbChrZXkpO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIWFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHxcbiAgICAgICghYXN0LmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VkLmV4dHJhTWVtYmVycy5wdXNoKHByb3BlcnR5LmdldFRleHQoc291cmNlKSkgLSAxO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIGlmICh2YWx1ZS52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICAgIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gICAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgZW1pdHRlZFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkodmFsdWUudmFsdWUubWVtYmVyT3JkZXIpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyLmZsYXRNYXAoKG1lbWJlciwgaW5kZXgpID0+IHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdleHRyYScpIHtcbiAgICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0TWVtYmVyKHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVyc1ttZW1iZXIuaW5kZXhdID8/ICcnLCBpbmRlbnQpXTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFByb3BlcnR5SW5kZXhCeUtleS5nZXQobWVtYmVyLmtleSkgIT09IGluZGV4KSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbSA9IHZhbHVlLnZhbHVlLnByb3BlcnRpZXNbbWVtYmVyLmtleV07XG4gICAgaWYgKCFpdGVtIHx8IGVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhtZW1iZXIua2V5KSkgcmV0dXJuIFtdO1xuICAgIGVtaXR0ZWRQcm9wZXJ0aWVzLmFkZChtZW1iZXIua2V5KTtcbiAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdFByb3BlcnR5KG1lbWJlci5rZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpXTtcbiAgfSk7XG4gIGxpbmVzLnB1c2goXG4gICAgLi4uT2JqZWN0LmVudHJpZXModmFsdWUudmFsdWUucHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhZW1pdHRlZFByb3BlcnRpZXMuaGFzKGtleSkpXG4gICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KSlcbiAgKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleShtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBtZW1iZXJdIG9mIG1lbWJlck9yZGVyLmVudHJpZXMoKSkge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgbGFzdFByb3BlcnR5SW5kZXhCeUtleS5zZXQobWVtYmVyLmtleSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGFzdFByb3BlcnR5SW5kZXhCeUtleTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5OiBzdHJpbmcsIGl0ZW06IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0TWVtYmVyKG1lbWJlcjogc3RyaW5nLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gbWVtYmVyLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBzdHJpbmdpZmllZC5lbnRyaWVzKCkpIHtcbiAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtsaW5lfWA7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbnR5cGUgV2lsbEJvb3N0ZXJPcmdhbml6YXRpb24gPSAnV2lsbEJvb3N0ZXInIHwgJ1dpbGxCb29zdGVyTGFiJztcbnR5cGUgUmVwb3NpdG9yeUZ1bGxOYW1lID0gYCR7V2lsbEJvb3N0ZXJPcmdhbml6YXRpb259LyR7c3RyaW5nfWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm5veFJlcG9zaXRvcnlTY29wZSB7XG4gIG9yZ2FuaXphdGlvbnM/OiByZWFkb25seSBXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbltdO1xuICByZXBvc2l0b3JpZXM/OiByZWFkb25seSBSZXBvc2l0b3J5RnVsbE5hbWVbXTtcbiAgLy8gUmVzdHJpY3RzIHRoZSBzY29wZSB0byByZXBvc2l0b3JpZXMgb2YgdGhlIGdpdmVuIHZpc2liaWxpdHkuIFB1YmxpYyByZXBvc2l0b3JpZXMgcHVibGlzaCB0aGVpclxuICAvLyBjaXBoZXJ0ZXh0cyB0byB0aGUgd29ybGQsIHNvIHRoZXkgbXVzdCB1c2UgYSBDSSBpZGVudGl0eSBzZXBhcmF0ZSBmcm9tIHRoZSBvcmctaW50ZXJuYWwgb25lOlxuICAvLyBsZWFraW5nIGVpdGhlciBDSSBrZXkgbXVzdCBub3QgZXhwb3NlIHRoZSBvdGhlciBzaWRlJ3Mgc2VjcmV0cy5cbiAgdmlzaWJpbGl0eT86ICdwdWJsaWMnIHwgJ3ByaXZhdGUnO1xufVxuXG5pbnRlcmZhY2UgRm5veEFnZVByaW5jaXBhbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHVibGljS2V5czogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlcG9zaXRvcnlTY29wZTogRm5veFJlcG9zaXRvcnlTY29wZTtcbiAgLy8gTWFya3MgdGhlIHByaW5jaXBhbCBhcyBhIENJIGlkZW50aXR5IGFuZCBuYW1lcyB0aGUgR2l0SHViIHNlY3JldCBob2xkaW5nIGl0cyBwcml2YXRlIGtleS5cbiAgLy8gRXZlcnkgZm5veC1tYW5hZ2VkIHJlcG9zaXRvcnkgbXVzdCByZXNvbHZlIG9uZSAoZ2VuZXJhdGVGbm94VG9tbCBmYWlscyBjbG9zZWQgb3RoZXJ3aXNlOiBhXG4gIC8vIHJvc3RlciB3aXRob3V0IGEgQ0kgcmVjaXBpZW50IHdvdWxkIHJlLWVuY3J5cHQgc2VjcmV0cyB0aGF0IENJIGNhbiBuZXZlciBkZWNyeXB0IGFnYWluKSwgYW5kXG4gIC8vIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgZGVyaXZlcyBpdHMgY2FsbGVyIG1hcHBpbmdzIGZyb20gdGhlIHNhbWUgcmVzb2x1dGlvbiBzbyB0aGUgdHdvIGNhblxuICAvLyBuZXZlciBkaXNhZ3JlZSBvbiB3aGljaCBDSSBpZGVudGl0eSBhcHBsaWVzLlxuICBjaUFnZUtleVNlY3JldE5hbWU/OiAnRk5PWF9BR0VfS0VZJyB8ICdQVUJMSUNfRk5PWF9BR0VfS0VZJztcbn1cblxuaW50ZXJmYWNlIEZub3hBZ2VSZWNpcGllbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xufVxuXG4vLyBUaGUgYWdlIHByaW5jaXBhbHMgYXV0aG9yaXplZCB0byBkZWNyeXB0IGVhY2ggZm5veC1tYW5hZ2VkIHJlcG9zaXRvcnkuIFRvIGdyYW50IGFjY2VzcywgYWRkIHRoZVxuLy8gcHJpbmNpcGFsJ3MgcHVibGljIGtleXMgYW5kIHJlcG9zaXRvcnkgc2NvcGUgaGVyZS4gT3JnYW5pemF0aW9uIHNjb3BlcyBpbmNsdWRlIGV2ZXJ5IGN1cnJlbnQgYW5kXG4vLyBmdXR1cmUgcmVwb3NpdG9yeSBpbiB0aGF0IG9yZ2FuaXphdGlvbjsgdXNlIHJlcG9zaXRvcmllcyBmb3IgZXhhY3Qgb3duZXIvcmVwb3NpdG9yeSBncmFudHMuIFRoZVxuLy8gbmV4dCB3YmZ5IHJ1biBvbiBlYWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgcmV3cml0ZXMgZXZlcnkgbWFuYWdlZCBmbm94LnRvbWwgYW5kIHJlLWVuY3J5cHRzIGl0c1xuLy8gY29tbWl0dGVkIHNlY3JldHMgZm9yIHRoZSByZXN1bHRpbmcgcmVjaXBpZW50IHNldC4gQSBzY29wZSdzIG9wdGlvbmFsIHZpc2liaWxpdHkgY29uc3RyYWludFxuLy8gc2VsZWN0cyBvbmx5IHB1YmxpYyBvciBvbmx5IHByaXZhdGUgcmVwb3NpdG9yaWVzICh1c2VkIHRvIGtlZXAgdGhlIG9yZy1pbnRlcm5hbCBhbmQgdGhlXG4vLyBwdWJsaWMtcmVwb3NpdG9yeSBDSSBpZGVudGl0aWVzIGFwYXJ0KS4gUmVtb3ZpbmcgYSBzY29wZSBjYW5ub3QgcmV2b2tlIGNpcGhlcnRleHRcbi8vIGFscmVhZHkgYXZhaWxhYmxlIGZyb20gR2l0IGhpc3RvcnksIHNvIHJvdGF0ZSB0aGUgc2VjcmV0IHZhbHVlcyB0aGF0IHByaW5jaXBhbCBjb3VsZCBkZWNyeXB0LlxuLy8gT25seSBwdWJsaWMga2V5cyBtYXkgYXBwZWFyIGhlcmU7IGEgQ0kgaWRlbnRpdHkncyBwcml2YXRlIGtleSBzdXBwbGllcyB0aGUgRk5PWF9BR0VfS0VZIChvcixcbi8vIGZvciBwdWJsaWMgcmVwb3NpdG9yaWVzLCBQVUJMSUNfRk5PWF9BR0VfS0VZKSBvcmdhbml6YXRpb24gc2VjcmV0LlxuZXhwb3J0IGNvbnN0IEZOT1hfQUdFX1BSSU5DSVBBTFMgPSBbXG4gIHtcbiAgICBuYW1lOiAnZXhrYXp1dScsXG4gICAgcHVibGljS2V5czogWydhZ2UxajIzNTR4aHZtM2Z2OXk3N3Q1ZzZ5M3E4bWV4Z2sybWYwMHRncmt6Z3A3M3R5bnJ2ejU1czhhdWF5dyddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdwb25oYXJ1JyxcbiAgICBwdWJsaWNLZXlzOiBbXG4gICAgICAnYWdlMThydWdsZGY5aHRjNnVtNWVwbHB4MjdrNTNlcDR6bjBsaHp3ZmZnbnh6aHJxMGM3emd2eXEzemNjZHknLFxuICAgICAgJ2FnZTFuejJuOTljcmpyN25wOXhqZ2x3ZmZmYzNkdWQ0NWRoZXdxenFmenB6dGtkd3U0aGo3NGdxNmVsNTMzJyxcbiAgICBdLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIC8vIFRoZSBvcmctaW50ZXJuYWwgQ0kgaWRlbnRpdHkgKHRoZSBGTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uIHNlY3JldCAvIH4vLmNvbmZpZy9mbm94L2FnZS1jaS13Yi50eHQpLlxuICAgIG5hbWU6ICdjaScsXG4gICAgcHVibGljS2V5czogWydhZ2UxYTJjNmVmNmFobDZtbWtoZ3F0eGcwbWd0ZDd5c3NwbnRxN3J4dXN2MjZlZnhobnVobGNkc3I5ZHBhayddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10sIHZpc2liaWxpdHk6ICdwcml2YXRlJyB9LFxuICAgIGNpQWdlS2V5U2VjcmV0TmFtZTogJ0ZOT1hfQUdFX0tFWScsXG4gIH0sXG4gIHtcbiAgICAvLyBUaGUgQ0kgaWRlbnRpdHkgZGVkaWNhdGVkIHRvIHB1YmxpYyByZXBvc2l0b3JpZXMgKHRoZSBQVUJMSUNfRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvblxuICAgIC8vIHNlY3JldCAvIH4vLmNvbmZpZy9mbm94L2FnZS1jaS13Yi1wdWJsaWMudHh0KS4gU2NvcGVkIHRvIFdpbGxCb29zdGVyIG9ubHkgYmVjYXVzZSB0aGVcbiAgICAvLyBQVUJMSUNfRk5PWF9BR0VfS0VZIHNlY3JldCBpcyByZWdpc3RlcmVkIGluIHRoYXQgb3JnYW5pemF0aW9uIGFsb25lOyBhIHB1YmxpY1xuICAgIC8vIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcnkgcmVzb2x2ZXMgTk8gQ0kgaWRlbnRpdHkgYW5kIGdlbmVyYXRlRm5veFRvbWwgZmFpbHMgY2xvc2VkIG9uIGl0XG4gICAgLy8gKFdpbGxCb29zdGVyTGFiIGRvZXMgb3duIHB1YmxpYyByZXBvc2l0b3JpZXMsIGUuZy4gaXRzIHJldXNhYmxlLXdvcmtmbG93cyBzeW5jIG1pcnJvciwgYnV0XG4gICAgLy8gbm9uZSBvZiB0aGVtIHVzZSBmbm94IOKAlCByZWdpc3RlciB0aGUgc2VjcmV0IHRoZXJlIGFuZCBleHRlbmQgdGhpcyBzY29wZSBpZiBvbmUgZXZlciBkb2VzKS5cbiAgICBuYW1lOiAnY2ktcHVibGljJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFmaGVhODV4andwODlsd3EzamNud2ozMnN3aDN2MjRwd3BhcnFoNWw3cWtndmM0YXgzcDBxbDZkdTM2J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInXSwgdmlzaWJpbGl0eTogJ3B1YmxpYycgfSxcbiAgICBjaUFnZUtleVNlY3JldE5hbWU6ICdQVUJMSUNfRk5PWF9BR0VfS0VZJyxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdyZW1pbicsXG4gICAgcHVibGljS2V5czogWydhZ2UxbXc0cHo5ZHVqeTlkbWhrMHBhbHFhd2prajdtNGs3eng3OHlyOWZqdDYzc2E1bDNlNDN1cTZudzAwNCddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdhcmllcycsXG4gICAgcHVibGljS2V5czogWydhZ2Uxbm4wZWh5YWVueXE4a21ucTQyOTRrenpneHY1ZG5mNnBlcDJjZGtyYXh6ZnFsazd4Z3NycXFuNm5uOSddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbXG4gICAgICAgICdXaWxsQm9vc3Rlci9hZ2VudC1jaGFsbGVuZ2VzJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2FnZW50aWMtd29ya2Zsb3dzLWRhc2hib2FyZCcsXG4gICAgICAgICdXaWxsQm9vc3Rlci9jaGVlcmxpbmdzJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2Nob2Z1LXdhbGtpbmcnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvcHJvbXB0LXN0dWR5JyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2p1ZGdlJyxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdzdW5hZ2EnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMXVseHpuNnk2OGt1MzRjcHg1ZnlhNWdmN3Jucnd6MHVmbG55ZTZ1eHVoZzM0cDJuamhna3FtZzczZzQnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogWydXaWxsQm9vc3Rlci9haS1vY3InLCAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLCAnV2lsbEJvb3N0ZXIvanVkZ2UnXSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2F5YW1lJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTF2eG0yZ3MwMDNydXdtOHA2aDNodjd4YXNqdTJzOGs0bXhtYzM0em02Z3Jkd3pucnMwOW5xNnh6NXZ6J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFsnV2lsbEJvb3N0ZXIvYWktb2NyJywgJ1dpbGxCb29zdGVyL2Nob2Z1LXdhbGtpbmcnLCAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLCAnV2lsbEJvb3N0ZXIvanVkZ2UnXSxcbiAgICB9LFxuICB9LFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgRm5veEFnZVByaW5jaXBhbFtdO1xuXG5pbnRlcmZhY2UgRm5veFRvbWwge1xuICBpbXBvcnQ/OiB1bmtub3duO1xuICBwcm92aWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD47XG4gIHByb2ZpbGVzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5sZXQgZm5veFN5bmNGYWlsZWQgPSBmYWxzZTtcbmxldCBtaWdyYXRpb25NYXJrZXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcblxuLyoqIFdoZXRoZXIgYW55IGZub3ggcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBmYWlsZWQgaW4gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeTsgc2V0dXBTZWNyZXRzIG11c3Qgbm90IHVwbG9hZCB0aGVuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zub3hTeW5jRmFpbGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZm5veFN5bmNGYWlsZWQ7XG59XG5cbi8qKlxuICogU3luY2hyb25pemVzIHRoZSBhZ2UgcmVjaXBpZW50cyBpbiBldmVyeSBmbm94LnRvbWwgd2l0aCB0aGUgcHJpbmNpcGFscyBhdXRob3JpemVkIGZvciB0aGlzXG4gKiByZXBvc2l0b3J5IGFuZCByZS1lbmNyeXB0cyB0aGUgY29tbWl0dGVkIHNlY3JldHMgd2hlbiB0aGUgcmVjaXBpZW50IHNldCBjaGFuZ2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVGbm94VG9tbChyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVGbm94VG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGUgZmFpbHVyZSBmbGFnIGlzIHBlciByZXBvc2l0b3J5OiB3YmZ5IGNhbiBwcm9jZXNzIG11bHRpcGxlIHdvcmtpbmcgZGlyZWN0b3JpZXMgaW4gb25lXG4gICAgLy8gaW52b2NhdGlvbiwgYW5kIGFuIGVhcmxpZXIgcmVwb3NpdG9yeSdzIGZhaWx1cmUgbXVzdCBub3QgdmV0byBhIGxhdGVyIHJlcG9zaXRvcnkncyB1cGxvYWQuXG4gICAgZm5veFN5bmNGYWlsZWQgPSBmYWxzZTtcbiAgICAvLyBBIHJlcG9zaXRvcnkgb3V0c2lkZSBXaWxsQm9vc3Rlci9XaWxsQm9vc3RlckxhYiBtYW5hZ2VzIGl0cyBvd24gcmVjaXBpZW50IHNldCAoZS5nLiBhXG4gICAgLy8gcGVyc29uYWwgcmVwb3NpdG9yeSB3aXRoIGl0cyBvd24gQ0kgaWRlbnRpdHkpLCBzbyByZXdyaXRpbmcgaXQgdG8gdGhlIG9yZyByb3N0ZXIgd291bGQgZ3JhbnRcbiAgICAvLyBvcmcgbWVtYmVycyBhY2Nlc3MgYW5kIHJlLWVuY3J5cHQgc2VjcmV0cyBmb3IgYSBDSSBrZXkgdGhhdCByZXBvc2l0b3J5IGRvZXMgbm90IHVzZS5cbiAgICAvLyBzZXR1cFNlY3JldHMgbmV2ZXIgdXBsb2FkcyBzZWNyZXRzIGZvciBzdWNoIHJlcG9zaXRvcmllcyBlaXRoZXIsIHNvIHNraXAgZW50aXJlbHkuXG4gICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvKSByZXR1cm47XG4gICAgY29uc3QgYWdlUmVjaXBpZW50cyA9IGdldEZub3hBZ2VSZWNpcGllbnRzKHJvb3RDb25maWcpO1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgLy8gQSBuZXN0ZWQtb25seSBmbm94IGxheW91dCBpcyB1bnN1cHBvcnRlZDogc2V0dXBTZWNyZXRzIHdvdWxkIHRha2UgdGhlIGRvdGVudiBwYXRoIGFuZFxuICAgICAgLy8gZGVsZXRlIEZOT1hfQUdFX0tFWSBldmVuIHRob3VnaCB0aGUgbmVzdGVkIGNvbmZpZydzIENJIHN0aWxsIG5lZWRzIGl0LlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gT25seSBhZ2UtdXNpbmcgY29uZmlncyBjYXJyeSB0aGF0IHJpc2suIFdpdGhvdXQgYSByb290IHByb3ZpZGluZyB0aGUgYWdlIHByb3ZpZGVyLCBhXG4gICAgICAgIC8vIHN0cmF5IGNvbmZpZyB0aGF0IGRlY2xhcmVzIG5vbmUgdXNlcyBubyBhZ2UgZW5jcnlwdGlvbiBhdCBhbGwgKGUuZy4gYSBwbGFpbnRleHQgdGVzdFxuICAgICAgICAvLyBmaXh0dXJlIG9yIGV4YW1wbGUgY29uZmlnIGFueSByZXBvc2l0b3J5IG1heSBsZWdpdGltYXRlbHkgY29tbWl0KSwgc28gaXQgbmVpdGhlciBuZWVkc1xuICAgICAgICAvLyByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIG5vciBvd25zIGFuIEZOT1hfQUdFX0tFWSBhbmQgbXVzdCBub3QgYmxvY2sgdGhlIHJ1bi5cbiAgICAgICAgY29uc3Qgc3RyYXlGaWxlUGF0aHMgPSBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGgpLmZpbHRlcigoZmlsZVBhdGgpID0+XG4gICAgICAgICAgZGVjbGFyZXNGbm94QWdlUHJvdmlkZXIoZmlsZVBhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdHJheUZpbGVQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgZm5veCBjb25maWdzIGV4aXN0IHdpdGhvdXQgYSByb290IGZub3gudG9tbDogJHtzdHJheUZpbGVQYXRocy5qb2luKCcsICcpfS4gQWRkIGEgcm9vdCBmbm94LnRvbWwuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEZhaWwgY2xvc2VkOiB3aXRob3V0IGdpdCBpbmZvcm1hdGlvbiBhIG5lc3RlZC1vbmx5IGZub3ggbGF5b3V0IGNhbm5vdCBiZSBydWxlZCBvdXQsIGFuZFxuICAgICAgICAvLyBzZXR1cFNlY3JldHMgd291bGQgb3RoZXJ3aXNlIHRha2UgdGhlIGRvdGVudiBwYXRoIGFuZCBkZWxldGUgRk5PWF9BR0VfS0VZLlxuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBjaGVjayBmb3IgbmVzdGVkIGZub3ggY29uZmlncyBkdWUgdG86ICR7KGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgZmFpbGVkIHZpc2liaWxpdHkgbG9va3VwIGNvbGxhcHNlcyBpc1B1YmxpY1JlcG8gdG8gZmFsc2UsIHdoaWNoIHdvdWxkIHNpbGVudGx5IHJlLWVuY3J5cHRcbiAgICAvLyBhIHB1YmxpYyByZXBvc2l0b3J5J3Mgd29ybGQtcmVhZGFibGUgY2lwaGVydGV4dHMgdG8gdGhlIG9yZy1pbnRlcm5hbCBDSSBpZGVudGl0eSAoYW5kIHZpY2VcbiAgICAvLyB2ZXJzYSBkcm9wIHRoZSBwdWJsaWMgb25lKS4gRmFpbCBpbnN0ZWFkIG9mIGd1ZXNzaW5nIHdoZW5ldmVyIHZpc2liaWxpdHkgY2hhbmdlcyB0aGUgcm9zdGVyLlxuICAgIGlmICghcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gJiYgZG9lc0Zub3hSZWNpcGllbnRTZXREZXBlbmRPblZpc2liaWxpdHkocm9vdENvbmZpZykpIHtcbiAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgdGhlIHZpc2liaWxpdHkgb2YgJHtyb290Q29uZmlnLnJlcG9BdXRob3J9LyR7cm9vdENvbmZpZy5yZXBvTmFtZX0gY291bGQgbm90IGJlIGRldGVybWluZWQgKEdpdEh1YiBsb29rdXAgZmFpbGVkKSBhbmQgdGhlIENJIHJlY2lwaWVudCBkZXBlbmRzIG9uIGl0LiBDaGVjayBuZXR3b3JrIGFuZCBnaCBhdXRoZW50aWNhdGlvbiwgdGhlbiByZXJ1biB3YmZ5LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEJvdGggQ0kgaWRlbnRpdGllcyBhcmUgdmlzaWJpbGl0eS1jb25zdHJhaW5lZCwgc28gYSByZXBvc2l0b3J5IGNhbiBmYWxsIHRocm91Z2ggQk9USCAoZS5nLiBhXG4gICAgLy8gcHVibGljIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcnksIHdob3NlIG9yZ2FuaXphdGlvbiBoYXMgbm8gUFVCTElDX0ZOT1hfQUdFX0tFWSBzZWNyZXQpLlxuICAgIC8vIFJlLWVuY3J5cHRpbmcgZm9yIGEgcm9zdGVyIHdpdGhvdXQgYSBDSSBpZGVudGl0eSB3b3VsZCBsZWF2ZSBDSSB1bmFibGUgdG8gZGVjcnlwdCBhbnl0aGluZyxcbiAgICAvLyBmYWlsaW5nIG9ubHkgYXQgcnVudGltZSBpbiBBY3Rpb25zOyBmYWlsIGxvdWRseSBoZXJlIGluc3RlYWQuXG4gICAgaWYgKCFyZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShyb290Q29uZmlnKSkge1xuICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBubyBDSSBpZGVudGl0eSBpcyBzY29wZWQgdG8gJHtyb290Q29uZmlnLnJlcG9BdXRob3J9LyR7cm9vdENvbmZpZy5yZXBvTmFtZX0gKHB1YmxpYyByZXBvc2l0b3JpZXMgYXJlIHN1cHBvcnRlZCBvbmx5IGluIHRoZSBXaWxsQm9vc3RlciBvcmdhbml6YXRpb24pLiBQcm92aXNpb24gdGhlIG1hdGNoaW5nIG9yZ2FuaXphdGlvbiBzZWNyZXQgYW5kIGV4dGVuZCB0aGUgQ0kgc2NvcGVzIGluIHdiZnkgZmlyc3QuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIG1pZ3JhdGlvbiBpcyB0cmFuc2FjdGlvbmFsIG92ZXIgZXZlcnkgbWFuYWdlZCBmbm94LnRvbWw6IHJlcnVucyBtdXN0IHJldHJ5IGZyb20gdGhlXG4gICAgLy8gb3JpZ2luYWwgc3RhdGUsIGFuZCBhIHBhcnRpYWxseSBtaWdyYXRlZCB0cmVlIGNvdWxkIG90aGVyd2lzZSBiZWNvbWUgdW5kZWNyeXB0YWJsZSBmb3IgdGhlXG4gICAgLy8gaWRlbnRpdHkgcGVyZm9ybWluZyBhIGxhdGVyIHJldHJ5IChlLmcuIHdoZW4gYSByZWNpcGllbnQgaXMgYmVpbmcgcmVtb3ZlZCkuXG4gICAgY29uc3Qgc25hcHNob3RzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAvLyBBIGZhaWxlZCBzeW5jaHJvbml6YXRpb24gbXVzdCBmYWlsIHRoZSB3aG9sZSB3YmZ5IHJ1bjogZXhpdGluZyB6ZXJvIHdpdGggc3RhbGUgcmVjaXBpZW50c1xuICAgIC8vIHdvdWxkIGxlYXZlIHNlY3JldHMgdW5kZWNyeXB0YWJsZSBmb3IgbmV3IHJlY2lwaWVudHMgd2hpbGUgbG9va2luZyBzdWNjZXNzZnVsLlxuICAgIHRyeSB7XG4gICAgICAvLyBBbnkgZm5veCBjb25maWcgKGluY2x1ZGluZyBhbGlhc2VzIGFuZCBsb2NhbCBvdmVycmlkZXMpIGluIGFuIGFuY2VzdG9yIGRpcmVjdG9yeSB3b3VsZFxuICAgICAgLy8gbWVyZ2UgaW50byAoYW5kIHBvc3NpYmx5IGJlIFJFV1JJVFRFTiBieSkgdGhpcyByZXBvc2l0b3J5J3MgYGZub3ggcmVlbmNyeXB0YCB0aHJvdWdoXG4gICAgICAvLyBoaWVyYXJjaGljYWwgbG9hZGluZywgdXNpbmcgdGhpcyByZXBvc2l0b3J5J3MgcmVjaXBpZW50IHNldCBmb3IgZm9yZWlnbiBzZWNyZXRzLlxuICAgICAgZm9yIChsZXQgZGlyUGF0aCA9IHBhdGguZGlybmFtZShyb290RGlyUGF0aCk7IDsgZGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKSkge1xuICAgICAgICBjb25zdCBhbmNlc3RvckZub3hGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aCk7XG4gICAgICAgIGlmIChhbmNlc3RvckZub3hGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGFuIGFuY2VzdG9yIGRpcmVjdG9yeSBjb250YWlucyBmbm94IGNvbmZpZ3MgdGhhdCBmbm94IHdvdWxkIGhpZXJhcmNoaWNhbGx5IG1lcmdlIGFuZCByZXdyaXRlOiAke2FuY2VzdG9yRm5veEZpbGVOYW1lc1xuICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfS4gUmVtb3ZlIHRoZW0gb3IgbW92ZSB0aGUgcmVwb3NpdG9yeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGguZGlybmFtZShkaXJQYXRoKSA9PT0gZGlyUGF0aCkgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBmbm94IGFsc28gbG9hZHMgY29tbWl0dGVkIGNvbmZpZyBhbGlhc2VzIHRoaXMgZ2VuZXJhdG9yIGNhbm5vdCBrZWVwIGluIHN5bmMuXG4gICAgICBjb25zdCBmbm94TGlrZUZpbGVQYXRocyA9IGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCB1bnN1cHBvcnRlZEZpbGVQYXRocyA9IGZub3hMaWtlRmlsZVBhdGhzLmZpbHRlcigoZmlsZVBhdGgpID0+IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpICE9PSAnZm5veC50b21sJyk7XG4gICAgICBpZiAodW5zdXBwb3J0ZWRGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2Ugb25seSBmbm94LnRvbWwgZmlsZXMgYXJlIHN1cHBvcnRlZDogJHt1bnN1cHBvcnRlZEZpbGVQYXRocy5qb2luKCcsICcpfS4gTWVyZ2UgdGhlbSBpbnRvIHRoZSBhZGphY2VudCBmbm94LnRvbWwuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkaXJQYXRocyA9IGxpc3RGbm94VG9tbERpclBhdGhzKGZub3hMaWtlRmlsZVBhdGhzKTtcbiAgICAgIGlmICghZGlyUGF0aHMuaW5jbHVkZXMocm9vdERpclBhdGgpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke3BhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2Zub3gudG9tbCcpfSBpcyBpbnZpc2libGUgdG8gZ2l0IChnaXRpZ25vcmVkPykuIENvbW1pdCBpdCBvciByZW1vdmUgaXQuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBHaXQtYmFzZWQgZGlzY292ZXJ5IGNhbm5vdCBzZWUgZ2l0aWdub3JlZCBmaWxlcywgc28gYWxzbyBpbnNwZWN0IGV2ZXJ5IGRpcmVjdG9yeSBpbiBlYWNoXG4gICAgICAvLyBtYW5hZ2VkIGNvbmZpZydzIGhpZXJhcmNoeSB0aHJvdWdoIHRoZSBmaWxlc3lzdGVtOiBhIGdpdGlnbm9yZWQgYWxpYXMgKGUuZy4gLmZub3gudG9tbClcbiAgICAgIC8vIG9yIGEgZ2l0aWdub3JlZCBmbm94LnRvbWwgaW4gYW4gaW50ZXJtZWRpYXRlIGRpcmVjdG9yeSB3b3VsZCBzdGlsbCBiZSBsb2FkZWQgYnkgZm5veCBhbmRcbiAgICAgIC8vIGNvdWxkIG92ZXJyaWRlIHRoZSBwcm92aWRlciB1c2VkIGZvciBuZXN0ZWQgcmUtZW5jcnlwdGlvbi5cbiAgICAgIGNvbnN0IG1hbmFnZWREaXJQYXRocyA9IG5ldyBTZXQoZGlyUGF0aHMpO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaGllcmFyY2h5RGlyUGF0aCBvZiBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoLCByb290RGlyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBzdHJheUZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhoaWVyYXJjaHlEaXJQYXRoKS5maWx0ZXIoXG4gICAgICAgICAgICAobmFtZSkgPT4gbmFtZSAhPT0gJ2Zub3gubG9jYWwudG9tbCcgJiYgIShuYW1lID09PSAnZm5veC50b21sJyAmJiBtYW5hZ2VkRGlyUGF0aHMuaGFzKGhpZXJhcmNoeURpclBhdGgpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHN0cmF5RmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgZm5veCB3b3VsZCBsb2FkIHVubWFuYWdlZCAoZ2l0aWdub3JlZD8pIGNvbmZpZ3M6ICR7c3RyYXlGaWxlTmFtZXNcbiAgICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBwYXRoLmpvaW4oaGllcmFyY2h5RGlyUGF0aCwgbmFtZSkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyl9LiBDb21taXQgdGhlbSBhcyBmbm94LnRvbWwgb3IgcmVtb3ZlIHRoZW0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQSBmbm94LmxvY2FsLnRvbWwgYW55d2hlcmUgaW4gdGhlIG1lcmdlZCBoaWVyYXJjaHkgKG5vdCBvbmx5IG5leHQgdG8gYSBtYW5hZ2VkXG4gICAgICAgICAgLy8gY29uZmlnKSBjYW4gb3ZlcnJpZGUgcHJvdmlkZXJzLlxuICAgICAgICAgIGNvbnN0IGxvY2FsSXNzdWUgPSBmaW5kRm5veExvY2FsVG9tbElzc3VlKGhpZXJhcmNoeURpclBhdGgpO1xuICAgICAgICAgIGlmIChsb2NhbElzc3VlKSB7XG4gICAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7bG9jYWxJc3N1ZX0uIEtlZXAgb25seSBtYWNoaW5lLWxvY2FsIHNlY3JldCBvdmVycmlkZXMgdGhlcmUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoZSBpbi1tZW1vcnkgc25hcHNob3RzIGRvIG5vdCBzdXJ2aXZlIGEga2lsbGVkIHByb2Nlc3MsIHNvIGEgZHVyYWJsZSBtYXJrZXIgaXMgd3JpdHRlblxuICAgICAgLy8gYmVmb3JlIHRoZSBmaXJzdCBtdXRhdGlvbiBhbmQgcmVtb3ZlZCBvbmx5IHdoZW4gdGhlIHRyZWUgaXMgY29uc2lzdGVudCBhZ2Fpbi4gQSBsZWZ0b3ZlclxuICAgICAgLy8gbWFya2VyIG1lYW5zIGEgcHJldmlvdXMgcnVuIHdhcyBraWxsZWQgbWlkLW1pZ3JhdGlvbiAob3IgY291bGQgbm90IHJlc3RvcmUpOiBzb21lXG4gICAgICAvLyBjaXBoZXJ0ZXh0cyBtYXkgbm90IG1hdGNoIHRoZSByZWNpcGllbnRzLCBvciBtYXkgZXZlbiBiZSB1bmRlY3J5cHRhYmxlIGZvciB0aGUgZXhlY3V0b3Inc1xuICAgICAgLy8gaWRlbnRpdHkgd2hlbiBhIHJlY2lwaWVudCB3YXMgYmVpbmcgcmVtb3ZlZCDigJQgc3RhdGVzIHRoaXMgY29kZSBjYW5ub3QgcmVwYWlyIHNhZmVseVxuICAgICAgLy8gYmVjYXVzZSB0aGUgd29ya2luZyB0cmVlIG1heSBoYXZlIGNoYW5nZWQgc2luY2UgKGJyYW5jaCBzd2l0Y2hlcywgbWFudWFsIGVkaXRzKS4gVGhlXG4gICAgICAvLyBmbm94LnRvbWwgZmlsZXMgYXJlIGdpdC10cmFja2VkLCBzbyB0aGUgdXNlciByZXN0b3JlcyB0aGVtIHZpYSBnaXQgYW5kIGNsZWFycyB0aGUgbWFya2VyLlxuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJy50bXAnLCAnd2JmeS1mbm94LW1pZ3JhdGlvbi1tYXJrZXInKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbk1hcmtlclBhdGgpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBhIHByZXZpb3VzIG1pZ3JhdGlvbiB3YXMgaW50ZXJydXB0ZWQuIFJlc3RvcmUgdGhlIGZub3gudG9tbCBmaWxlcyB2aWEgZ2l0IChlLmcuIFxcYGdpdCBzdGF0dXNcXGAgYW5kIFxcYGdpdCByZXN0b3JlIC0tICcqZm5veCoudG9tbCdcXGAgaWYgeW91IGhhdmUgbm8gaW50ZW50aW9uYWwgbG9jYWwgY2hhbmdlcyksIHRoZW4gZGVsZXRlICR7bWlncmF0aW9uTWFya2VyUGF0aH0gYW5kIHJlcnVuIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEEgdHJhY2tlZCBzeW1saW5rIG5hbWVkIGZub3gudG9tbCAob3IgYSBzeW1saW5rZWQgcGFyZW50IGRpcmVjdG9yeSkgd291bGQgbWFrZSB0aGVcbiAgICAgIC8vIHJld3JpdGUgYW5kIGBmbm94IHJlZW5jcnlwdGAgcmVhZCBhbmQgTU9ESUZZIGZpbGVzIG91dHNpZGUgdGhpcyByZXBvc2l0b3J5LlxuICAgICAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuICAgICAgICBjb25zdCByZWFsUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhmbm94VG9tbFBhdGgpO1xuICAgICAgICBpZiAoZnMubHN0YXRTeW5jKGZub3hUb21sUGF0aCkuaXNTeW1ib2xpY0xpbmsoKSB8fCAhcmVhbFBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2Zub3hUb21sUGF0aH0gaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkgKCR7cmVhbFBhdGh9KS4gUmVwbGFjZSBpdCB3aXRoIGEgcmVndWxhciBpbi1yZXBvc2l0b3J5IGZpbGUuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNuYXBzaG90cy5zZXQoZm5veFRvbWxQYXRoLCBmcy5yZWFkRmlsZVN5bmMoZm5veFRvbWxQYXRoLCAndXRmOCcpKTtcbiAgICAgIH1cblxuICAgICAgLy8gU29ydGVkIG9yZGVyIHByb2Nlc3NlcyBhbmNlc3RvcnMgYmVmb3JlIGRlc2NlbmRhbnRzLCBzbyBjb25maWdzIGluaGVyaXRpbmcgYW4gdXBkYXRlZFxuICAgICAgLy8gcHJvdmlkZXIgcmUtZW5jcnlwdCBhZ2FpbnN0IHRoZSBhbHJlYWR5LXVwZGF0ZWQgcmVjaXBpZW50cy5cbiAgICAgIGNvbnN0IGNoYW5nZWREaXJQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBhbnlGYWlsZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBjb25zdCBhbmNlc3RvckNoYW5nZWQgPSBjaGFuZ2VkRGlyUGF0aHMuc29tZSgoY2hhbmdlZERpclBhdGgpID0+IGRpclBhdGguc3RhcnRzV2l0aChjaGFuZ2VkRGlyUGF0aCArIHBhdGguc2VwKSk7XG4gICAgICAgIC8vIEV2ZXJ5IGRpclBhdGggd2FzIHNuYXBzaG90dGVkIGFib3ZlLiBBIG1pc3Npbmcgc25hcHNob3QgbXVzdCBmYWlsIGhhcmQ6IGZhbGxpbmcgYmFjayB0b1xuICAgICAgICAvLyBhbiBlbXB0eSBzdHJpbmcgd291bGQgZmxvdyBpbnRvIHJlcGxhY2VBZ2VSZWNpcGllbnRzIGFuZCBvdmVyd3JpdGUgdGhlIHJlYWwgZm5veC50b21sXG4gICAgICAgIC8vIHdpdGggYSByZWNpcGllbnRzLW9ubHkgZmlsZSwgZGVzdHJveWluZyBldmVyeSBjb21taXR0ZWQgc2VjcmV0LlxuICAgICAgICBjb25zdCBzbmFwc2hvdENvbnRlbnQgPSBzbmFwc2hvdHMuZ2V0KHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJykpO1xuICAgICAgICBpZiAoc25hcHNob3RDb250ZW50ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBmbm94LnRvbWwgc25hcHNob3QgZm9yICR7ZGlyUGF0aH0uYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN5bmNocm9uaXplRm5veEFnZVJlY2lwaWVudHMoXG4gICAgICAgICAgZGlyUGF0aCxcbiAgICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgICBkaXJQYXRoID09PSByb290RGlyUGF0aCxcbiAgICAgICAgICBhbmNlc3RvckNoYW5nZWQsXG4gICAgICAgICAgc25hcHNob3RDb250ZW50LFxuICAgICAgICAgIGFnZVJlY2lwaWVudHNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ2NoYW5nZWQnKSBjaGFuZ2VkRGlyUGF0aHMucHVzaChkaXJQYXRoKTtcbiAgICAgICAgYW55RmFpbGVkIHx8PSByZXN1bHQgPT09ICdmYWlsZWQnO1xuICAgICAgfVxuICAgICAgaWYgKGFueUZhaWxlZCkge1xuICAgICAgICAvLyBBIGZhaWxlZCByZS1lbmNyeXB0aW9uIG1heSBoYXZlIHJld3JpdHRlbiBzb21lIGNpcGhlcnRleHRzLCBzbyByZXN0b3JlIHVuY29uZGl0aW9uYWxseS5cbiAgICAgICAgLy8gVGhlIG1hcmtlciBpcyByZW1vdmVkIG9ubHkgd2hlbiByZXN0b3JhdGlvbiBmdWxseSBzdWNjZWVkZWQgYW5kIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuXG4gICAgICAgIC8vIFJlc3RvcmUgT05MWSB3aGVuIHRoaXMgcnVuIG93bnMgdGhlIG1hcmtlcjogZXZlcnkgY29tbWl0dGVkLWNvbmZpZyBtdXRhdGlvbiBoYXBwZW5zXG4gICAgICAgIC8vIGFmdGVyIG1hcmtlciBhY3F1aXNpdGlvbiwgc28gYSBub24tb3duZXIgKGUuZy4gbG9zaW5nIGEgcmFjZSBhZ2FpbnN0IGEgY29uY3VycmVudCB3YmZ5KVxuICAgICAgICAvLyBoYXMgY2hhbmdlZCBub3RoaW5nIGFuZCBtdXN0IG5vdCBvdmVyd3JpdGUgdGhlIG93bmVyJ3MgaW4tcHJvZ3Jlc3MgbWlncmF0aW9uLlxuICAgICAgICBpZiAobWlncmF0aW9uTWFya2VyT3duZWQgJiYgcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHMpKSByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG1pZ3JhdGlvbk1hcmtlck93bmVkICYmIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzKSkge1xuICAgICAgICByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfVxuICAgICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBkdWUgdG86ICR7KGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3J9YCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGggPSB1bmRlZmluZWQ7XG4gICAgICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN5bmNocm9uaXplRm5veEFnZVJlY2lwaWVudHMoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgaXNSb290OiBib29sZWFuLFxuICBhbmNlc3RvclJlY2lwaWVudHNDaGFuZ2VkOiBib29sZWFuLFxuICBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyxcbiAgYWdlUmVjaXBpZW50czogcmVhZG9ubHkgRm5veEFnZVJlY2lwaWVudFtdXG4pOiBQcm9taXNlPCdjaGFuZ2VkJyB8ICd1bmNoYW5nZWQnIHwgJ2ZhaWxlZCc+IHtcbiAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKTtcblxuICAvLyBSZWNpcGllbnQgc3luY2hyb25pemF0aW9uIG9ubHkgdW5kZXJzdGFuZHMgdGhlIHN0YW5kYXJkIHNpbmdsZS1maWxlIGxheW91dCB3aXRoIG9uZVxuICAvLyB0b3AtbGV2ZWwgYWdlIHByb3ZpZGVyIG5hbWVkIGBhZ2VgLiBHaXRpZ25vcmVkIGNvbmZpZyBhbGlhc2VzIChlLmcuIC5mbm94LmxvY2FsLnRvbWwpIHRoYXRcbiAgLy8gZ2l0LWJhc2VkIGRpc2NvdmVyeSBjYW5ub3Qgc2VlLCBpbXBvcnRzLCBkaWZmZXJlbnRseSBuYW1lZCBhZ2UgcHJvdmlkZXJzLCBvciBwcm92aWRlclxuICAvLyBvdmVycmlkZXMgd291bGQga2VlcCB1c2luZyByZWNpcGllbnQgc2V0cyB0aGlzIGdlbmVyYXRvciBkb2VzIG5vdCByZXdyaXRlLCBzbyB0aGVpciBzZWNyZXRzXG4gIC8vIHdvdWxkIHNpbGVudGx5IHN0YXkgdW5kZWNyeXB0YWJsZSBmb3IgbmV3IHJlY2lwaWVudHM7IGZhaWwgaW5zdGVhZCBvZiBwcm9jZWVkaW5nLiBUaGVcbiAgLy8gZ2l0aWdub3JlZCBmbm94LmxvY2FsLnRvbWwgaXMgYSBzdXBwb3J0ZWQgbWFjaGluZS1sb2NhbCBvdmVycmlkZSwgYnV0IG9ubHkgd2hpbGUgaXQgbGVhdmVzXG4gIC8vIHByb3ZpZGVycyBhbG9uZS5cbiAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aCkuZmlsdGVyKFxuICAgIChuYW1lKSA9PiBuYW1lICE9PSAnZm5veC50b21sJyAmJiBuYW1lICE9PSAnZm5veC5sb2NhbC50b21sJ1xuICApO1xuICBpZiAodW5zdXBwb3J0ZWRGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIGZhaWxGbm94U3luYyhcbiAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBpbiAke2RpclBhdGh9IGJlY2F1c2Ugb25seSBmbm94LnRvbWwgYW5kIGZub3gubG9jYWwudG9tbCBhcmUgc3VwcG9ydGVkOiAke3Vuc3VwcG9ydGVkRmlsZU5hbWVzLmpvaW4oJywgJyl9LiBNZXJnZSB0aGVtIGludG8gZm5veC50b21sLmBcbiAgICApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICAvLyBBIHN0YWxlIGJhY2t1cCBsZWZ0IGJ5IGFuIGludGVycnVwdGVkIGVhcmxpZXIgcnVuIG11c3QgYmUgcmVzdG9yZWQgc28gdGhlIHVzZXIncyBsb2NhbFxuICAvLyBvdmVycmlkZXMgYXJlIG5ldmVyIHNpbGVudGx5IGxvc3QgKHRoZSBtaWdyYXRpb24gbWFya2VyIHNlcGFyYXRlbHkgYmxvY2tzIHRoaXMgcnVuIHdoZW4gdGhlXG4gIC8vIGludGVycnVwdGlvbiBsZWZ0IHRoZSBtaWdyYXRpb24gaXRzZWxmIGluY29tcGxldGUpLlxuICByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGgsIGRpclBhdGgpO1xuXG4gIGNvbnN0IGxheW91dElzc3VlID0gZmluZEZub3hMYXlvdXRJc3N1ZShvcmlnaW5hbENvbnRlbnQpO1xuICBpZiAobGF5b3V0SXNzdWUpIHtcbiAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtmbm94VG9tbFBhdGh9ICR7bGF5b3V0SXNzdWV9LmApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKG9yaWdpbmFsQ29udGVudCkgYXMgRm5veFRvbWw7XG4gIGNvbnN0IHByb2ZpbGVOYW1lcyA9IE9iamVjdC5rZXlzKHNldHRpbmdzLnByb2ZpbGVzID8/IHt9KTtcbiAgY29uc3QgY3VycmVudFJlY2lwaWVudHMgPSByZWFkRm5veEFnZVJlY2lwaWVudHMob3JpZ2luYWxDb250ZW50KTtcblxuICAvLyBBIG5lc3RlZCBmbm94LnRvbWwgd2l0aG91dCBpdHMgb3duIGFnZSBwcm92aWRlciBpbmhlcml0cyB0aGUgbmVhcmVzdCBhbmNlc3RvcidzIG9uZSB0aHJvdWdoXG4gIC8vIGZub3gncyBoaWVyYXJjaGljYWwgbG9hZGluZywgc28gb25seSB0aGUgcm9vdCBjb25maWcgbXVzdCBkZWNsYXJlIHRoZSBwcm92aWRlciDigJQgYnV0IHRoZVxuICAvLyBuZXN0ZWQgY29uZmlnJ3Mgb3duIGNpcGhlcnRleHRzIHN0aWxsIG11c3QgYmUgcmUtZW5jcnlwdGVkIHdoZW5ldmVyIGFuIGFuY2VzdG9yJ3MgcmVjaXBpZW50c1xuICAvLyBjaGFuZ2VkLCBhbmQgdGhhdCBvbmx5IGhhcHBlbnMgd2hlbiBgZm5veCByZWVuY3J5cHRgIHJ1bnMgZnJvbSB0aGUgbmVzdGVkIGRpcmVjdG9yeS5cbiAgaWYgKCFpc1Jvb3QgJiYgIWN1cnJlbnRSZWNpcGllbnRzKSB7XG4gICAgaWYgKGFuY2VzdG9yUmVjaXBpZW50c0NoYW5nZWQpIHtcbiAgICAgIHdyaXRlTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICBpZiAoIXJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGgsIHJvb3REaXJQYXRoLCBwcm9maWxlTmFtZXMpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlLWVuY3J5cHQgZm5veCBzZWNyZXRzIGluICR7ZGlyUGF0aH0gZm9yIHRoZSB1cGRhdGVkIHJlY2lwaWVudHMuIEZpeCB0aGUgZXJyb3IgYW5kIHJlcnVuIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAndW5jaGFuZ2VkJztcbiAgfVxuXG4gIGlmIChcbiAgICBjdXJyZW50UmVjaXBpZW50cyAmJlxuICAgIGN1cnJlbnRSZWNpcGllbnRzLnNpemUgPT09IGFnZVJlY2lwaWVudHMubGVuZ3RoICYmXG4gICAgYWdlUmVjaXBpZW50cy5ldmVyeSgocmVjaXBpZW50KSA9PiBjdXJyZW50UmVjaXBpZW50cy5oYXMocmVjaXBpZW50LnB1YmxpY0tleSkpXG4gICkge1xuICAgIHJldHVybiAndW5jaGFuZ2VkJztcbiAgfVxuXG4gIC8vIFJld3JpdGUgb25seSB0aGUgcmVjaXBpZW50cyBhc3NpZ25tZW50IHNvIHVzZXItYXV0aG9yZWQgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgc3Vydml2ZS5cbiAgLy8gUmUtcGFyc2UgYmVmb3JlIHdyaXRpbmc6IGFuIHVudXN1YWwgbGF5b3V0IChlLmcuIGRvdHRlZCBrZXlzKSBjb3VsZCBtYWtlIHRoZSB0ZXh0dWFsIGVkaXRcbiAgLy8gcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZSBvciBsZWF2ZSB0aGUgb2xkIHJlY2lwaWVudHMgaW4gZWZmZWN0LlxuICBjb25zdCB1cGRhdGVkQ29udGVudCA9IHJlcGxhY2VBZ2VSZWNpcGllbnRzKG9yaWdpbmFsQ29udGVudCwgYWdlUmVjaXBpZW50cyk7XG4gIGNvbnN0IHVwZGF0ZWRSZWNpcGllbnRzID0gWy4uLihyZWFkRm5veEFnZVJlY2lwaWVudHModXBkYXRlZENvbnRlbnQpID8/IFtdKV07XG4gIGlmIChcbiAgICB1cGRhdGVkUmVjaXBpZW50cy5sZW5ndGggIT09IGFnZVJlY2lwaWVudHMubGVuZ3RoIHx8XG4gICAgIWFnZVJlY2lwaWVudHMuZXZlcnkoKHJlY2lwaWVudCkgPT4gdXBkYXRlZFJlY2lwaWVudHMuaW5jbHVkZXMocmVjaXBpZW50LnB1YmxpY0tleSkpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmV3cml0aW5nIHRoZSBhZ2UgcmVjaXBpZW50cyBpbiAke2Zub3hUb21sUGF0aH0gZGlkIG5vdCB0YWtlIGVmZmVjdDsgdXBkYXRlIHRoZW0gbWFudWFsbHkuYCk7XG4gIH1cbiAgd3JpdGVNaWdyYXRpb25NYXJrZXIoKTtcbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIHVwZGF0ZWRDb250ZW50KTtcblxuICBpZiAoIXJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGgsIHJvb3REaXJQYXRoLCBwcm9maWxlTmFtZXMpKSB7XG4gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgY29uZmlnOiBrZWVwaW5nIHRoZSBuZXcgcmVjaXBpZW50cyB3aXRoIG9sZCBjaXBoZXJ0ZXh0cyB3b3VsZCBtYWtlXG4gICAgLy8gdGhpcyBnZW5lcmF0b3Igc2tpcCByZS1lbmNyeXB0aW9uIGZvcmV2ZXIgYW5kIGxldCBzZXR1cFNlY3JldHMgdXBsb2FkIGEgQ0kga2V5IHRoYXRcbiAgICAvLyBjYW5ub3QgZGVjcnlwdCBhbnl0aGluZy4gVGhlIG9sZCBjaXBoZXJ0ZXh0cyByZW1haW4gdmFsaWQgZm9yIHRoZSBvbGQgcmVjaXBpZW50cy5cbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgb3JpZ2luYWxDb250ZW50KTtcbiAgICBmYWlsRm5veFN5bmMoXG4gICAgICBgRmFpbGVkIHRvIHJlLWVuY3J5cHQgZm5veCBzZWNyZXRzIGluICR7ZGlyUGF0aH0gZm9yIHRoZSB1cGRhdGVkIHJlY2lwaWVudHMuIEZpeCB0aGUgZXJyb3IgYW5kIHJlcnVuIHdiZnkuYFxuICAgICk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIHJldHVybiAnY2hhbmdlZCc7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIGEgZm5veC50b21sIGxheW91dCB0aGF0IHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gYW5kIHRoZSBDSS1rZXlcbiAqIHZlcmlmaWNhdGlvbiBjYW5ub3QgY292ZXIsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzdGFuZGFyZCBzaW5nbGUtZmlsZSwgc2luZ2xlLWFnZS1wcm92aWRlclxuICogbGF5b3V0IGlzIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRGbm94TGF5b3V0SXNzdWUoZm5veFRvbWxDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZm5veFRvbWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgICBpZiAoc2V0dGluZ3MuaW1wb3J0ICE9PSB1bmRlZmluZWQpIHJldHVybiAndXNlcyB0aGUgdW5zdXBwb3J0ZWQgYGltcG9ydGAgc2V0dGluZyc7XG4gICAgY29uc3Qgbm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzID0gT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MucHJvdmlkZXJzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW25hbWUsIHByb3ZpZGVyXSkgPT4gKHByb3ZpZGVyPy50eXBlID09PSAnYWdlJykgIT09IChuYW1lID09PSAnYWdlJykpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIGlmIChub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBkZWNsYXJlcyBhZ2UgcHJvdmlkZXJzIG5vdCBuYW1lZCBcXGBhZ2VcXGAgKG9yIGFuIFxcYGFnZVxcYCBwcm92aWRlciBvZiBhbm90aGVyIHR5cGUpOiAke25vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcy5qb2luKCcsICcpfWA7XG4gICAgfVxuICAgIGNvbnN0IHByb2ZpbGVzV2l0aFByb3ZpZGVycyA9IE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnByb2ZpbGVzID8/IHt9KVxuICAgICAgLmZpbHRlcigoWywgcHJvZmlsZV0pID0+IHByb2ZpbGU/LnByb3ZpZGVycylcbiAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSk7XG4gICAgaWYgKHByb2ZpbGVzV2l0aFByb3ZpZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYGRlY2xhcmVzIHVuc3VwcG9ydGVkIHByb2ZpbGUtc3BlY2lmaWMgcHJvdmlkZXJzOiAke3Byb2ZpbGVzV2l0aFByb3ZpZGVycy5qb2luKCcsICcpfWA7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnY2Fubm90IGJlIHBhcnNlZCBhcyBUT01MJztcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBbcHJvdmlkZXJzLmFnZV0ucmVjaXBpZW50cyBvZiBhIGZub3gudG9tbCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGNvbmZpZyBkZWNsYXJlcyBub1xuICogYWdlIHByb3ZpZGVyIChuZXN0ZWQgY29uZmlncyB0aGVuIGluaGVyaXQgdGhlIHJvb3Qgb25lKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGbm94QWdlUmVjaXBpZW50cyhmbm94VG9tbENvbnRlbnQ6IHN0cmluZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZub3hUb21sQ29udGVudCkgYXMgRm5veFRvbWw7XG4gICAgaWYgKCFzZXR0aW5ncy5wcm92aWRlcnM/LmFnZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWNpcGllbnRzID0gc2V0dGluZ3MucHJvdmlkZXJzLmFnZS5yZWNpcGllbnRzO1xuICAgIHJldHVybiBuZXcgU2V0KEFycmF5LmlzQXJyYXkocmVjaXBpZW50cykgPyByZWNpcGllbnRzLmZpbHRlcigocik6IHIgaXMgc3RyaW5nID0+IHR5cGVvZiByID09PSAnc3RyaW5nJykgOiBbXSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEFuIHVucGFyc2FibGUgZm5veC50b21sIHlpZWxkcyBubyByZWNpcGllbnRzLCBzbyB0aGUgY2FsbGVyIHJlcG9ydHMgYW4gZXJyb3IuXG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxufVxuXG50eXBlIEZub3hSZXBvc2l0b3J5SWRlbnRpdHkgPSBQaWNrPFBhY2thZ2VDb25maWcsICdyZXBvQXV0aG9yJyB8ICdyZXBvTmFtZScgfCAnaXNQdWJsaWNSZXBvJyB8ICdpc1JlcG9WaXNpYmlsaXR5S25vd24nPjtcblxuLyoqXG4gKiBUaGUgR2l0SHViIHNlY3JldCBob2xkaW5nIHRoZSBwcml2YXRlIGtleSBvZiB0aGUgQ0kgaWRlbnRpdHkgc2NvcGVkIHRvIHRoZSByZXBvc2l0b3J5LCBvclxuICogdW5kZWZpbmVkIHdoZW4gbm9uZSBpcyAoYW4gdW5rbm93biB2aXNpYmlsaXR5LCBvciBhIHJlcG9zaXRvcnkgbm8gQ0kgc2NvcGUgY292ZXJzKS4gVGhlIHNpbmdsZVxuICogc291cmNlIG9mIHRydXRoIHNoYXJlZCBieSB0aGUgcmVjaXBpZW50IHN5bmMgYW5kIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IncyBjYWxsZXIgbWFwcGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShcbiAgY29uZmlnOiBGbm94UmVwb3NpdG9yeUlkZW50aXR5XG4pOiAnRk5PWF9BR0VfS0VZJyB8ICdQVUJMSUNfRk5PWF9BR0VfS0VZJyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNpUHJpbmNpcGFsOiBGbm94QWdlUHJpbmNpcGFsIHwgdW5kZWZpbmVkID0gRk5PWF9BR0VfUFJJTkNJUEFMUy5maW5kKFxuICAgIChwcmluY2lwYWw6IEZub3hBZ2VQcmluY2lwYWwpID0+XG4gICAgICBwcmluY2lwYWwuY2lBZ2VLZXlTZWNyZXROYW1lICYmIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHByaW5jaXBhbC5yZXBvc2l0b3J5U2NvcGUsIGNvbmZpZylcbiAgKTtcbiAgcmV0dXJuIGNpUHJpbmNpcGFsPy5jaUFnZUtleVNlY3JldE5hbWU7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSByZWNpcGllbnQgc2V0IGRpZmZlcnMgYmV0d2VlbiB0aGUgcHVibGljIGFuZCBwcml2YXRlIHJlYWRpbmcgb2YgdGhlIHJlcG9zaXRvcnkuICovXG5leHBvcnQgZnVuY3Rpb24gZG9lc0Zub3hSZWNpcGllbnRTZXREZXBlbmRPblZpc2liaWxpdHkoXG4gIHJvb3RDb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ3JlcG9BdXRob3InIHwgJ3JlcG9OYW1lJz5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBwdWJsaWNLZXlzRm9yID0gKGlzUHVibGljUmVwbzogYm9vbGVhbik6IHN0cmluZyA9PlxuICAgIGdldEZub3hBZ2VSZWNpcGllbnRzKHsgLi4ucm9vdENvbmZpZywgaXNQdWJsaWNSZXBvLCBpc1JlcG9WaXNpYmlsaXR5S25vd246IHRydWUgfSlcbiAgICAgIC5tYXAoKHsgcHVibGljS2V5IH0pID0+IHB1YmxpY0tleSlcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIHB1YmxpY0tleXNGb3IodHJ1ZSkgIT09IHB1YmxpY0tleXNGb3IoZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm5veEFnZVJlY2lwaWVudHMocm9vdENvbmZpZzogRm5veFJlcG9zaXRvcnlJZGVudGl0eSk6IEZub3hBZ2VSZWNpcGllbnRbXSB7XG4gIHJldHVybiBGTk9YX0FHRV9QUklOQ0lQQUxTLmZpbHRlcigocHJpbmNpcGFsKSA9PlxuICAgIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHByaW5jaXBhbC5yZXBvc2l0b3J5U2NvcGUsIHJvb3RDb25maWcpXG4gICkuZmxhdE1hcCgocHJpbmNpcGFsKSA9PlxuICAgIHByaW5jaXBhbC5wdWJsaWNLZXlzLm1hcCgocHVibGljS2V5LCBpbmRleCkgPT4gKHtcbiAgICAgIG5hbWU6IHByaW5jaXBhbC5wdWJsaWNLZXlzLmxlbmd0aCA9PT0gMSA/IHByaW5jaXBhbC5uYW1lIDogYCR7cHJpbmNpcGFsLm5hbWV9JHtpbmRleCArIDF9YCxcbiAgICAgIHB1YmxpY0tleSxcbiAgICB9KSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHNjb3BlOiBGbm94UmVwb3NpdG9yeVNjb3BlLCByZXBvc2l0b3J5OiBGbm94UmVwb3NpdG9yeUlkZW50aXR5KTogYm9vbGVhbiB7XG4gIGNvbnN0IG93bmVyID0gcmVwb3NpdG9yeS5yZXBvQXV0aG9yPy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBuYW1lID0gcmVwb3NpdG9yeS5yZXBvTmFtZT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFvd25lciB8fCAhbmFtZSkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIEFuIHVua25vd24gdmlzaWJpbGl0eSAoZmFpbGVkIEdpdEh1YiBsb29rdXApIG1hdGNoZXMgbm8gdmlzaWJpbGl0eS1jb25zdHJhaW5lZCBzY29wZTogY2FsbGVyc1xuICAvLyB0aGF0IHdvdWxkIHJld3JpdGUgcmVjaXBpZW50cyBmYWlsIGluc3RlYWQgb2YgZW5jcnlwdGluZyB0byB0aGUgd3JvbmcgQ0kgaWRlbnRpdHkuXG4gIGlmIChcbiAgICBzY29wZS52aXNpYmlsaXR5ICYmXG4gICAgKCFyZXBvc2l0b3J5LmlzUmVwb1Zpc2liaWxpdHlLbm93biB8fCAoc2NvcGUudmlzaWJpbGl0eSA9PT0gJ3B1YmxpYycpICE9PSByZXBvc2l0b3J5LmlzUHVibGljUmVwbylcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICAoc2NvcGUub3JnYW5pemF0aW9ucz8uc29tZSgob3JnYW5pemF0aW9uKSA9PiBvcmdhbml6YXRpb24udG9Mb3dlckNhc2UoKSA9PT0gb3duZXIpID8/IGZhbHNlKSB8fFxuICAgIChzY29wZS5yZXBvc2l0b3JpZXM/LnNvbWUoKGZ1bGxOYW1lKSA9PiBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpID09PSBgJHtvd25lcn0vJHtuYW1lfWApID8/IGZhbHNlKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlQWdlUmVjaXBpZW50cyhjb250ZW50OiBzdHJpbmcsIGFnZVJlY2lwaWVudHM6IHJlYWRvbmx5IEZub3hBZ2VSZWNpcGllbnRbXSk6IHN0cmluZyB7XG4gIC8vIFRyYWlsaW5nIG5hbWUgY29tbWVudHMgbGV0IGh1bWFucyB0ZWxsIHdob3NlIGtleSBlYWNoIHJlY2lwaWVudCBpcyB3aXRob3V0IGNvbnN1bHRpbmcgd2JmeS5cbiAgY29uc3QgcmVjaXBpZW50c1RleHQgPSBgcmVjaXBpZW50cyA9IFtcXG4ke2FnZVJlY2lwaWVudHNcbiAgICAubWFwKChyZWNpcGllbnQpID0+IGAgIFwiJHtyZWNpcGllbnQucHVibGljS2V5fVwiLCAjICR7cmVjaXBpZW50Lm5hbWV9YClcbiAgICAuam9pbignXFxuJyl9XFxuXWA7XG4gIC8vIHdiZnkgd3JpdGVzIGEgW3Byb3ZpZGVycy5hZ2VdIHRhYmxlIChwb3NzaWJseSB3aXRoIGEgdHJhaWxpbmcgY29tbWVudCkuIFNjYW4gbGluZS13aXNlIHNvIHRoYXRcbiAgLy8gYSBgW2AgaW5zaWRlIGEgY29tbWVudCBvciBhIHN0cmluZyBuZXZlciB0ZXJtaW5hdGVzIHRoZSB0YWJsZSBlYXJseTsgdGhlIHRhYmxlIGVuZHMgYXQgdGhlXG4gIC8vIG5leHQgbGluZS1zdGFydCB0YWJsZSBoZWFkZXIuIFRoZSBhc3NpZ25tZW50IG1hdGNoIGlzIGxpbmUtYW5jaG9yZWQgc28gYSBjb21tZW50ZWQtb3V0XG4gIC8vIGAjIHJlY2lwaWVudHMgPSBbLi4uXWAgaXMgbmV2ZXIgbWlzdGFrZW4gZm9yIHRoZSByZWFsIG9uZSwgd2hpbGUgbXVsdGlsaW5lIGFycmF5cyBzdGlsbCBtYXRjaFxuICAvLyBiZWNhdXNlIHRoZSBuZWdhdGVkIGNsYXNzIFteXFxdXSAodW5saWtlIGAuYCkgc3BhbnMgbmV3bGluZXMuIEFueSBvdGhlciBzcGVsbGluZyBmYWxscyB0aHJvdWdoXG4gIC8vIHRvIHRoZSBjYWxsZXIncyByZS1wYXJzZSB2YWxpZGF0aW9uLCB3aGljaCBmYWlscyB0aGUgcnVuIHNhZmVseSB3aXRoIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mXG4gIC8vIGNvcnJ1cHRpbmcgdGhlIGZpbGUuXG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGhlYWRlckluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lKSA9PiAvXlxccypcXFtwcm92aWRlcnNcXC5hZ2VcXF1cXHMqKD86Iy4qKT8kL3UudGVzdChsaW5lKSk7XG4gIGlmIChoZWFkZXJJbmRleCAhPT0gLTEpIHtcbiAgICBsZXQgZW5kSW5kZXggPSBsaW5lcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaW5kZXggPSBoZWFkZXJJbmRleCArIDE7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoL15cXHMqXFxbL3UudGVzdChsaW5lc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICAgIGVuZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWN0aW9uID0gbGluZXMuc2xpY2UoaGVhZGVySW5kZXgsIGVuZEluZGV4KS5qb2luKCdcXG4nKTtcbiAgICBjb25zdCByZXBsYWNlZFNlY3Rpb24gPSBzZWN0aW9uLnJlcGxhY2UoL15cXHMqcmVjaXBpZW50c1xccyo9XFxzKlxcW1teXFxdXSpcXF0vbXUsIHJlY2lwaWVudHNUZXh0KTtcbiAgICBjb25zdCBuZXdTZWN0aW9uID1cbiAgICAgIHJlcGxhY2VkU2VjdGlvbiA9PT0gc2VjdGlvblxuICAgICAgICA/IFtsaW5lc1toZWFkZXJJbmRleF0sIHJlY2lwaWVudHNUZXh0LCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEsIGVuZEluZGV4KV0uam9pbignXFxuJylcbiAgICAgICAgOiByZXBsYWNlZFNlY3Rpb247XG4gICAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCksIG5ld1NlY3Rpb24sIC4uLmxpbmVzLnNsaWNlKGVuZEluZGV4KV0uam9pbignXFxuJyk7XG4gIH1cbiAgcmV0dXJuIGAke2NvbnRlbnQudHJpbUVuZCgpfVxcblxcbltwcm92aWRlcnMuYWdlXVxcbnR5cGUgPSBcImFnZVwiXFxuJHtyZWNpcGllbnRzVGV4dH1cXG5gO1xufVxuXG4vLyBSZS1lbmNyeXB0cyB0aGUgYmFzZSBzZWNyZXRzIGFuZCBlYWNoIHByb2ZpbGUncyBvd24gc2VjcmV0cyAoLS1uby1kZWZhdWx0cyBrZWVwcyB0aGUgbWVyZ2VkXG4vLyBiYXNlIHNlY3JldHMgZnJvbSBiZWluZyBkdXBsaWNhdGVkIGludG8gcHJvZmlsZSB0YWJsZXMpIGZvciB0aGUgY3VycmVudCByZWNpcGllbnQgc2V0LiBUaGVcbi8vIHNwYXduZWQgZm5veCBydW5zIHdpdGggYW4gaXNvbGF0ZWQgSE9NRS9YREdfQ09ORklHX0hPTUUgYmVjYXVzZSBmbm94IG1lcmdlcyB0aGUgdXNlci1nbG9iYWxcbi8vIH4vLmNvbmZpZy9mbm94L2NvbmZpZy50b21sIGludG8gZXZlcnkgcHJvamVjdCBjb25maWcg4oCUIGEgcGxhaW4gcmVlbmNyeXB0IHdvdWxkIHJld3JpdGUgdGhlXG4vLyB1c2VyJ3MgZ2xvYmFsIHNlY3JldHMgdG9vLiBEZWNyeXB0aW9uIHRoZXJlZm9yZSBuZWVkcyB0aGUgcGVyc29uYWwgaWRlbnRpdHkgcGFzc2VkIGV4cGxpY2l0bHlcbi8vIHZpYSBGTk9YX0FHRV9LRVk7IEZOT1hfUFJPRklMRSBpcyBzdHJpcHBlZCBzbyBpdCBjYW5ub3QgcmVkaXJlY3QgdGhlIGJhc2UgKG5vIC1QKSBydW4uXG5mdW5jdGlvbiByZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcsIHByb2ZpbGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gVGhlIGlkZW50aXR5IGlzIG9wdGlvbmFsOiBhIHBsYWludGV4dC1vbmx5IGNvbmZpZyBoYXMgbm90aGluZyB0byBkZWNyeXB0IGFuZCBmbm94IHN1Y2NlZWRzXG4gIC8vIHdpdGhvdXQgb25lLCB3aGlsZSBleGlzdGluZyBjaXBoZXJ0ZXh0cyBtYWtlIGZub3ggZmFpbCBsb3VkbHkgb24gaXRzIG93bi5cbiAgY29uc3QgaWRlbnRpdHkgPSByZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkoKSA/PyBwcm9jZXNzLmVudi5GTk9YX0FHRV9LRVk7XG4gIGNvbnN0IGZub3hDb21tYW5kID0gcmVzb2x2ZUZub3hDb21tYW5kKGRpclBhdGgpO1xuICBjb25zdCBpc29sYXRlZEhvbWVEaXJQYXRoID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnd2JmeS1mbm94LWhvbWUtJykpO1xuICB0cnkge1xuICAgIC8vIEhpZGUgdGhlIGxvY2FsIG92ZXJyaWRlcyBvZiBFVkVSWSBkaXJlY3RvcnkgZm5veCBtZXJnZXMgaGllcmFyY2hpY2FsbHkgKGZyb20gdGhlIGNvbW1hbmRcbiAgICAvLyBkaXJlY3RvcnkgdXAgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCk6IGFuIGFuY2VzdG9yJ3MgZm5veC5sb2NhbC50b21sIHdvdWxkIG90aGVyd2lzZSBzaGFkb3dcbiAgICAvLyBjb21taXR0ZWQgc2VjcmV0cyBvciBpdHNlbGYgZ2V0IHJld3JpdHRlbiBieSB0aGUgcmUtZW5jcnlwdGlvbi5cbiAgICByZXR1cm4gd2l0aEZub3hMb2NhbHNIaWRkZW4ocm9vdERpclBhdGgsIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGgsIHJvb3REaXJQYXRoKSwgKCkgPT4ge1xuICAgICAgY29uc3QgZW52ID0ge1xuICAgICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpLmZpbHRlcigoW2tleV0pID0+ICFrZXkuc3RhcnRzV2l0aCgnRk5PWF8nKSkpLFxuICAgICAgICAuLi4oaWRlbnRpdHkgPyB7IEZOT1hfQUdFX0tFWTogaWRlbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgSE9NRTogaXNvbGF0ZWRIb21lRGlyUGF0aCxcbiAgICAgICAgWERHX0NPTkZJR19IT01FOiBpc29sYXRlZEhvbWVEaXJQYXRoLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByb2ZpbGVBcmdzTGlzdCA9IFtbXSwgLi4ucHJvZmlsZU5hbWVzLm1hcCgobmFtZSkgPT4gWyctLW5vLWRlZmF1bHRzJywgYC0tcHJvZmlsZT0ke25hbWV9YF0pXTtcbiAgICAgIGZvciAoY29uc3QgcHJvZmlsZUFyZ3Mgb2YgcHJvZmlsZUFyZ3NMaXN0KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbJ3JlZW5jcnlwdCcsICctLWZvcmNlJywgJy0tbm8tZGFlbW9uJywgJy0tcHJvdmlkZXInLCAnYWdlJywgLi4ucHJvZmlsZUFyZ3NdO1xuICAgICAgICBjb25zb2xlLmxvZyhgJCAke2Zub3hDb21tYW5kfSAke2FyZ3Muam9pbignICcpfSBhdCAke2RpclBhdGh9YCk7XG4gICAgICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhmbm94Q29tbWFuZCwgYXJncywge1xuICAgICAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICAgICAgZW52LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKChwcm9jLnN0YXR1cyA/PyAxKSAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKGlzb2xhdGVkSG9tZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBhY3R1YWwgZm5veCBiaW5hcnkuIGBmbm94YCBvbiBQQVRIIGlzIG9mdGVuIGEgbWlzZSBzaGltLCBhbmQgbWlzZSByZWZ1c2VzIHRvIHJ1blxuICogb25jZSBIT01FL1hER19DT05GSUdfSE9NRSBwb2ludCBhdCB0aGUgaXNvbGF0ZWQgZGlyZWN0b3J5IChpdHMgdHJ1c3Qgc3RhdGUgZGlzYXBwZWFycyksIHNvIHRoZVxuICogaXNvbGF0ZWQgc3Bhd25zIG5lZWQgdGhlIHNoaW0gcmVzb2x2ZWQgdG8gdGhlIHJlYWwgZXhlY3V0YWJsZSBiZWZvcmVoYW5kLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRm5veENvbW1hbmQoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdtaXNlJywgWyd3aGljaCcsICdmbm94J10sIHsgY3dkOiBkaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICBjb25zdCByZXNvbHZlZCA9IHByb2Muc3RhdHVzID09PSAwID8gcHJvYy5zdGRvdXQudHJpbSgpIDogJyc7XG4gIHJldHVybiByZXNvbHZlZCB8fCAnZm5veCc7XG59XG5cbi8vIFRoZSBwZXJzb25hbCBpZGVudGl0eSBmaWxlIGlzIG1hY2hpbmUtZ2xvYmFsLCBzbyBpdCBpcyByZWFkIG9uY2UgcGVyIHByb2Nlc3MuXG5sZXQgaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gZmFsc2U7XG5sZXQgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkpIHJldHVybiBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTtcbiAgaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ2Zub3gnLCAnYWdlLnR4dCcpLCAndXRmOCcpO1xuICAgIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gY29udGVudFxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbmQoKGxpbmUpID0+IGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoJ0FHRS1TRUNSRVQtS0VZLScpKVxuICAgICAgPy50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgZnVuY3Rpb24gd2hpbGUgdGhlIG1hY2hpbmUtbG9jYWwgZm5veC5sb2NhbC50b21sIGZpbGVzIG9mIHRoZSBnaXZlbiBkaXJlY3RvcmllcyBhcmVcbiAqIHRlbXBvcmFyaWx5IG1vdmVkIGFzaWRlOiBmbm94IGxvYWRzIHRoZW0gYXQgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwsIHNvIGFcbiAqIGxvY2FsIG92ZXJyaWRlIHNoYWRvd2luZyBhIGNvbW1pdHRlZCBzZWNyZXQgd291bGQgbWFrZSBgZm5veCByZWVuY3J5cHRgIHNraXAgdGhhdCBzZWNyZXQuXG4gKi9cbmZ1bmN0aW9uIHdpdGhGbm94TG9jYWxzSGlkZGVuPFQ+KHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGhzOiBzdHJpbmdbXSwgZnVuYzogKCkgPT4gVCk6IFQge1xuICBjb25zdCBoaWRkZW5EaXJQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gICAgICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgICBjb25zdCBiYWNrdXBQYXRoID0gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gICAgICAgIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgICBmcy5yZW5hbWVTeW5jKGxvY2FsUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICAgIGhpZGRlbkRpclBhdGhzLnB1c2goZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmMoKTtcbiAgICAvLyBBIHJlc3RvcmF0aW9uIGNvbmZsaWN0IHRocm93cyBoZXJlIGFuZCB0aGVyZWJ5IGludmFsaWRhdGVzIHRoZSBzZWVtaW5nbHkgc3VjY2Vzc2Z1bCByZXN1bHQ6XG4gICAgLy8gYSByZWNyZWF0ZWQgb3ZlcnJpZGUgbWF5IGhhdmUgc2hhZG93ZWQgY29tbWl0dGVkIHNlY3JldHMgZHVyaW5nIHRoZSBmbm94IHJ1biwgc28gdGhlIG91dGVyXG4gICAgLy8gdHJhbnNhY3Rpb24gbXVzdCByZXN0b3JlIGV2ZXJ5IGNvbW1pdHRlZCBmbm94LnRvbWwgaW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBtaWdyYXRpb24uXG4gICAgcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGgsIGhpZGRlbkRpclBhdGhzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFRoZSBvcmlnaW5hbCBmYWlsdXJlIG11c3Qgd2luOyBhIHJlc3RvcmF0aW9uIGNvbmZsaWN0IG9uIHRoaXMgcGF0aCBpcyBvbmx5IHJlcG9ydGVkIHNvIGl0XG4gICAgLy8gY2Fubm90IG1hc2sgdGhlIHJvb3QgY2F1c2UuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoLCBoaWRkZW5EaXJQYXRocyk7XG4gICAgfSBjYXRjaCAocmVzdG9yZUVycm9yKSB7XG4gICAgICBmYWlsRm5veFN5bmMoKHJlc3RvcmVFcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gU3RyaW5nKHJlc3RvcmVFcnJvcikpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vLyBNb3ZlcyB0aGUgaGlkZGVuIGZub3gubG9jYWwudG9tbCBmaWxlcyBiYWNrLCBjbGVhcmluZyB0aGUgZ2l2ZW4gbGlzdCBzbyBhIHNlY29uZCBjYWxsIGlzIGFcbi8vIG5vLW9wLiBOZXZlciBjbG9iYmVycyBhIGZub3gubG9jYWwudG9tbCByZWNyZWF0ZWQgKGUuZy4gYnkgYW4gZWRpdG9yKSB3aGlsZSBmbm94IHdhcyBydW5uaW5nOlxuLy8gdGhlIGJhY2t1cCBpcyBrZXB0IGFuZCByZXBvcnRlZCBmb3IgYSBtYW51YWwgbWVyZ2UuXG5mdW5jdGlvbiByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aDogc3RyaW5nLCBoaWRkZW5EaXJQYXRoczogc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgY29uZmxpY3RpbmdMb2NhbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRpclBhdGggb2YgaGlkZGVuRGlyUGF0aHMuc3BsaWNlKDApKSB7XG4gICAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgICBjb25mbGljdGluZ0xvY2FsUGF0aHMucHVzaChsb2NhbFBhdGgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZzLnJlbmFtZVN5bmMoZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCksIGxvY2FsUGF0aCk7XG4gIH1cbiAgaWYgKGNvbmZsaWN0aW5nTG9jYWxQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBmb2xsb3dpbmcgZm5veC5sb2NhbC50b21sIGZpbGVzIHdlcmUgcmVjcmVhdGVkIHdoaWxlIGZub3ggd2FzIHJ1bm5pbmcgKG9yaWdpbmFsIGZpbGVzIGFyZSBwcmVzZXJ2ZWQgdW5kZXIgJHtwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICcudG1wJywgJ3diZnktZm5veC1sb2NhbC1iYWNrdXAnKX0g4oCUIG1lcmdlIHRoZW0gbWFudWFsbHkpOiAke2NvbmZsaWN0aW5nTG9jYWxQYXRocy5qb2luKCcsICcpfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVzdG9yZXMgYSBmbm94LmxvY2FsLnRvbWwgYmFja3VwIGxlZnQgYnkgYW4gaW50ZXJydXB0ZWQgZWFybGllciBydW4gc28gdGhlIHVzZXIncyBsb2NhbFxuICogb3ZlcnJpZGVzIGFyZSBuZXZlciBzaWxlbnRseSBsb3N0LlxuICovXG5mdW5jdGlvbiByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gIGNvbnN0IGJhY2t1cFBhdGggPSBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGJhY2t1cFBhdGgpKSByZXR1cm47XG4gIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEJvdGggJHtsb2NhbFBhdGh9IGFuZCBpdHMgYmFja3VwICR7YmFja3VwUGF0aH0gZXhpc3Q7IHJlc29sdmUgdGhlIGxlZnRvdmVyIGJhY2t1cCBtYW51YWxseS5gKTtcbiAgfVxuICBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoLCBiYWNrdXBQYXRoKTtcbiAgZnMucmVuYW1lU3luYyhiYWNrdXBQYXRoLCBsb2NhbFBhdGgpO1xufVxuXG4vLyBDcmVhdGVzIHRoZSBiYWNrdXAgZGlyZWN0b3J5IGFuZCBwcm92ZXMgbm8gcGF0aCBjb21wb25lbnQgYmVsb3cgdGhlIHJlcG9zaXRvcnkgcm9vdCBpcyBhXG4vLyBzeW1saW5rOiBhIHJlcG9zaXRvcnktY29udHJvbGxlZCBzeW1saW5rIChlLmcuIGEgdHJhY2tlZCAudG1wL3diZnktZm5veC1sb2NhbC1iYWNrdXAgbGluaylcbi8vIGNvdWxkIG90aGVyd2lzZSBtb3ZlIHRoZSBwbGFpbnRleHQgbG9jYWwgc2VjcmV0cyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBvciByZXNvbHZlIHRoZSBiYWNrdXBcbi8vIGJhY2sgb250byB0aGUgc291cmNlIGZpbGUgYW5kIHR1cm4gdGhlIGhpZGUgcmVuYW1lIGludG8gYSBuby1vcC5cbmZ1bmN0aW9uIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGg6IHN0cmluZywgYmFja3VwUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGJhY2t1cERpclBhdGggPSBwYXRoLmRpcm5hbWUoYmFja3VwUGF0aCk7XG4gIGZzLm1rZGlyU3luYyhiYWNrdXBEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZXhwZWN0ZWRSZWFsUGF0aCA9IHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpLCBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBiYWNrdXBEaXJQYXRoKSk7XG4gIGlmIChmcy5yZWFscGF0aFN5bmMoYmFja3VwRGlyUGF0aCkgIT09IGV4cGVjdGVkUmVhbFBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YmFja3VwRGlyUGF0aH0gcmVzb2x2ZXMgdGhyb3VnaCBhIHN5bWxpbms7IHJlbW92ZSB0aGUgc3ltbGlua2VkIGNvbXBvbmVudC5gKTtcbiAgfVxufVxuXG4vLyBUaGUgYmFja3VwIGxpdmVzIHVuZGVyIHRoZSBnaXRpZ25vcmVkIC50bXAgc28gYSBoaWRkZW4gZm5veC5sb2NhbC50b21sIGNhbiBuZXZlciBiZWNvbWVcbi8vIHN0YWdlYWJsZSAoYSBzaWJsaW5nIHJlbmFtZSBsaWtlIGZub3gubG9jYWwudG9tbC53YmZ5LWJhayB3b3VsZCBubyBsb25nZXIgbWF0Y2ggdGhlIGRvY3VtZW50ZWRcbi8vIGBmbm94LmxvY2FsLnRvbWxgIGlnbm9yZSBlbnRyeSBhbmQgY291bGQgYmUgY29tbWl0dGVkIGJ5IGBnaXQgYWRkIC1BYCkuXG5mdW5jdGlvbiBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnJlc29sdmUoXG4gICAgcm9vdERpclBhdGgsXG4gICAgJy50bXAnLFxuICAgICd3YmZ5LWZub3gtbG9jYWwtYmFja3VwJyxcbiAgICBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBkaXJQYXRoKSxcbiAgICAnZm5veC5sb2NhbC50b21sJ1xuICApO1xufVxuXG5mdW5jdGlvbiB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpOiB2b2lkIHtcbiAgaWYgKCFtaWdyYXRpb25NYXJrZXJQYXRoIHx8IG1pZ3JhdGlvbk1hcmtlck93bmVkKSByZXR1cm47XG4gIGNvbnN0IHRtcERpclBhdGggPSBwYXRoLmRpcm5hbWUobWlncmF0aW9uTWFya2VyUGF0aCk7XG4gIGZzLm1rZGlyU3luYyh0bXBEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgLy8gUmVmdXNlIHRvIHdyaXRlIHRocm91Z2ggc3ltbGlua3M6IGEgcmVwb3NpdG9yeS1jb250cm9sbGVkIC50bXAgc3ltbGluayBjb3VsZCBvdGhlcndpc2VcbiAgLy8gcmVkaXJlY3QgdGhlIG1hcmtlciB3cml0ZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LiBUaGUgYHd4YCBmbGFnIG1ha2VzIHRoZSBvcGVuIGl0c2VsZiBmYWlsXG4gIC8vIG9uIGFueSBwcmUtZXhpc3RpbmcgcGF0aCwgaW5jbHVkaW5nIGEgZGFuZ2xpbmcgc3ltbGluayDigJQgd2hpY2ggYWxzbyBhY3F1aXJlcyB0aGUgbWFya2VyXG4gIC8vIGF0b21pY2FsbHksIHNvIGEgY29uY3VycmVudCB3YmZ5IHJ1biBjYW5ub3Qgc3RhcnQgYSBzZWNvbmQgbWlncmF0aW9uLlxuICBpZiAoZnMubHN0YXRTeW5jKHRtcERpclBhdGgpLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dG1wRGlyUGF0aH0gaXMgYSBzeW1saW5rOyByZXBsYWNlIGl0IHdpdGggYSByZWd1bGFyIGRpcmVjdG9yeS5gKTtcbiAgfVxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoLFxuICAgICAgJ3diZnkgZm5veCBtaWdyYXRpb24gaW4gcHJvZ3Jlc3M7IGEgbGVmdG92ZXIgbWFya2VyIGJsb2NrcyBuZXcgbWlncmF0aW9uc1xcbicsXG4gICAgICB7XG4gICAgICAgIGZsYWc6ICd3eCcsXG4gICAgICB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFub3RoZXIgd2JmeSBwcm9jZXNzIGFwcGVhcnMgdG8gYmUgbWlncmF0aW5nICgke21pZ3JhdGlvbk1hcmtlclBhdGh9IGV4aXN0cyk6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgbWlncmF0aW9uTWFya2VyT3duZWQgPSB0cnVlO1xufVxuXG4vLyBPbmx5IHRoZSBydW4gdGhhdCBhY3F1aXJlZCB0aGUgbWFya2VyIG1heSByZW1vdmUgaXQ6IGRlbGV0aW5nIGEgZm9yZWlnbiBtYXJrZXIgd291bGQgZGlzYWJsZVxuLy8gaW50ZXJydXB0ZWQtbWlncmF0aW9uIGRldGVjdGlvbiBmb3IgYSBjb25jdXJyZW50bHkgcnVubmluZyB3YmZ5LlxuZnVuY3Rpb24gcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTogdm9pZCB7XG4gIGlmICghbWlncmF0aW9uTWFya2VyT3duZWQgfHwgIW1pZ3JhdGlvbk1hcmtlclBhdGgpIHJldHVybjtcbiAgZnMucm1TeW5jKG1pZ3JhdGlvbk1hcmtlclBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGxldCBzdWNjZWVkZWQgPSB0cnVlO1xuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2Ygc25hcHNob3RzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byByZXN0b3JlICR7ZmlsZVBhdGh9IGFmdGVyIGEgZmFpbGVkIG1pZ3JhdGlvbjogJHtlcnJvcn1gKTtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3VjY2VlZGVkO1xufVxuXG5mdW5jdGlvbiBmYWlsRm5veFN5bmMobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICBmbm94U3luY0ZhaWxlZCA9IHRydWU7XG59XG5cbi8vIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBhbiB1bnN1cHBvcnRlZCBmbm94LmxvY2FsLnRvbWwgaW4gdGhlIGRpcmVjdG9yeSwgb3IgdW5kZWZpbmVkLiBMb2NhbFxuLy8gb3ZlcnJpZGVzIG1heSBvbmx5IGhvbGQgbWFjaGluZS1sb2NhbCBzZWNyZXQgdmFsdWVzOyBpbXBvcnRzIG9yIHByb3ZpZGVyIChyZSlkZWZpbml0aW9ucyB3b3VsZFxuLy8gc2lsZW50bHkgY2hhbmdlIHdoaWNoIHJlY2lwaWVudCBzZXQgZ292ZXJucyByZS1lbmNyeXB0aW9uLlxuZnVuY3Rpb24gZmluZEZub3hMb2NhbFRvbWxJc3N1ZShkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NhbFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsVG9tbFBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBsb2NhbFNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsVG9tbFBhdGgsICd1dGY4JykpIGFzIEZub3hUb21sO1xuICBjb25zdCBkZWZpbmVzUHJvdmlkZXJzID1cbiAgICBsb2NhbFNldHRpbmdzLmltcG9ydCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgbG9jYWxTZXR0aW5ncy5wcm92aWRlcnMgIT09IHVuZGVmaW5lZCB8fFxuICAgIE9iamVjdC52YWx1ZXMobG9jYWxTZXR0aW5ncy5wcm9maWxlcyA/PyB7fSkuc29tZSgocHJvZmlsZSkgPT4gcHJvZmlsZT8ucHJvdmlkZXJzICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gZGVmaW5lc1Byb3ZpZGVycyA/IGAke2xvY2FsVG9tbFBhdGh9IGRlZmluZXMgaW1wb3J0cywgcHJvdmlkZXJzLCBvciBwcm9maWxlIHByb3ZpZGVyc2AgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGlzdHMgZXZlcnkgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBjb21taXR0ZWQgKG9yIGNvbW1pdHRhYmxlKSBmbm94LnRvbWwgYW1vbmcgdGhlIGdpdmVuXG4gKiBnaXQtZGlzY292ZXJlZCBjb25maWcgcGF0aHMgKHNlZSBsaXN0Rm5veExpa2VGaWxlUGF0aHM6IGdpdC1iYXNlZCBkaXNjb3ZlcnkgZXhjbHVkZXMgZ2l0aWdub3JlZFxuICogdHJlZXMgc3VjaCBhcyBub2RlX21vZHVsZXMgd2l0aG91dCBleGNsdWRpbmcgbGVnaXRpbWF0ZSBwYWNrYWdlcyBuYW1lZCBsaWtlIGJ1aWxkIG91dHB1dHMpLlxuICovXG5mdW5jdGlvbiBsaXN0Rm5veFRvbWxEaXJQYXRocyhmbm94TGlrZUZpbGVQYXRoczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGZub3hMaWtlRmlsZVBhdGhzXG4gICAgICAgIC5maWx0ZXIoKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ2Zub3gudG9tbCcpXG4gICAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZm5veCBjb25maWcgZGVjbGFyZXMgaXRzIG93biBgW3Byb3ZpZGVycy5hZ2VdYCwgaS5lLiBwYXJ0aWNpcGF0ZXMgaW4gYWdlIGVuY3J5cHRpb24uXG4gKiBBIGNvbmZpZyB3aXRob3V0IG9uZSBlaXRoZXIgaW5oZXJpdHMgYSBtYW5hZ2VkIHJvb3QncyBwcm92aWRlciAoaGFuZGxlZCBieSB0aGUgcm9vdC1leGlzdHMgcGF0aClcbiAqIG9yLCB3aGVuIG5vIHJvb3QgZXhpc3RzLCB1c2VzIG5vIGFnZSBlbmNyeXB0aW9uIGF0IGFsbCDigJQgc28gaXQgbmVlZHMgbm8gcmVjaXBpZW50IHN5bmNocm9uaXphdGlvblxuICogYW5kIG93bnMgbm8gRk5PWF9BR0VfS0VZLlxuICovXG5mdW5jdGlvbiBkZWNsYXJlc0Zub3hBZ2VQcm92aWRlcihmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGFuIHVucmVhZGFibGUgY29uZmlnIG1pZ2h0IGRlY2xhcmUgYW4gYWdlIHByb3ZpZGVyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oKEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sKS5wcm92aWRlcnM/LmFnZSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhaWwgY2xvc2VkOiBhbiB1bnBhcnNhYmxlIGNvbmZpZyBtaWdodCBkZWNsYXJlIGFuIGFnZSBwcm92aWRlci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmbm94IGNvbmZpZyBwYXRoIGxpZXMgaW5zaWRlIGEgdGVzdC1maXh0dXJlIHRyZWUgKHRlc3QvZml4dHVyZXMsIHRlc3QtZml4dHVyZXMsXG4gKiBfX3Rlc3RzX18pOiBmaXh0dXJlIGNvbmZpZ3MgYXJlIHRlc3QgSU5QVVRTLCBub3QgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uLiBmbm94IG5ldmVyIGxvYWRzXG4gKiB0aGVtIGZvciByZWFsIGNvbW1hbmRzIChoaWVyYXJjaGljYWwgbG9hZGluZyBvbmx5IHdhbGtzIGN3ZCBhbmNlc3RvcnMpLCByZWNpcGllbnRcbiAqIHN5bmNocm9uaXphdGlvbiBtdXN0IG5vdCByZXdyaXRlIG9yIHJlLWVuY3J5cHQgdGhlbSAoc2hhcmVkLWxpYi1ub2RlJ3MgdW5kZWNyeXB0YWJsZSBmaXh0dXJlXG4gKiBleGlzdHMgcHJlY2lzZWx5IHRvIHN0YXkgdW5kZWNyeXB0YWJsZSksIGFuZCBhIGZpeHR1cmUgbXVzdCBub3QgZmFpbCB0aGUgc3RyYXktbmVzdGVkLWNvbmZpZ1xuICogY2hlY2sgaW4gcmVwb3NpdG9yaWVzIHdpdGhvdXQgYSByb290IGZub3gudG9tbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGVzdEZpeHR1cmVGbm94UGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGBmaXh0dXJlc2AgY291bnRzIG9ubHkgZGlyZWN0bHkgdW5kZXIgYSB0ZXN0IGRpcmVjdG9yeTogd2JmeSBzdXBwb3J0cyBhcmJpdHJhcnkgd29ya3NwYWNlcyxcbiAgLy8gc28gYSBsZWdpdGltYXRlIGBwYWNrYWdlcy9maXh0dXJlcy9gIHdvcmtzcGFjZSBtdXN0IHN0YXkgbWFuYWdlZCBhbmQgdmVyaWZpZWQuXG4gIGNvbnN0IHNlZ21lbnRzID0gZmlsZVBhdGguc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHNlZ21lbnRzLnNvbWUoXG4gICAgKHNlZ21lbnQsIGluZGV4KSA9PlxuICAgICAgc2VnbWVudCA9PT0gJ3Rlc3QtZml4dHVyZXMnIHx8XG4gICAgICBzZWdtZW50ID09PSAnX190ZXN0c19fJyB8fFxuICAgICAgKHNlZ21lbnQgPT09ICdmaXh0dXJlcycgJiYgKHNlZ21lbnRzW2luZGV4IC0gMV0gPT09ICd0ZXN0JyB8fCBzZWdtZW50c1tpbmRleCAtIDFdID09PSAndGVzdHMnKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIC16IHByaW50cyBOVUwtZGVsaW1pdGVkIHZlcmJhdGltIHBhdGhzOyB3aXRob3V0IGl0LCBjb3JlLnF1b3RlUGF0aCBDLXF1b3RlcyBub24tQVNDSUkgcGF0aHNcbiAgLy8gKGUuZy4gXCJcXDM0NlxcMjI3XFwyNDUuLi5cIiksIHdoaWNoIHdvdWxkIG1ha2UgdGhlIGJhc2VuYW1lIGZpbHRlciBzaWxlbnRseSBza2lwIHRob3NlIGNvbmZpZ3MuXG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbJ2xzLWZpbGVzJywgJy16JywgJy0tY2FjaGVkJywgJy0tb3RoZXJzJywgJy0tZXhjbHVkZS1zdGFuZGFyZCcsICctLScsICcqZm5veCoudG9tbCddLFxuICAgIHsgY3dkOiByb290RGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9XG4gICk7XG4gIC8vIEZhaWwgY2xvc2VkOiB0cmVhdGluZyBhIGdpdCBmYWlsdXJlIGFzIFwibm8gZm5veCBjb25maWdzXCIgd291bGQgc2tpcCBzeW5jaHJvbml6YXRpb24gYW5kIGxldFxuICAvLyBzZXR1cFNlY3JldHMgdXBsb2FkIGEga2V5IHRoYXQgd2FzIG5ldmVyIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlcG9zaXRvcnkncyBjaXBoZXJ0ZXh0cy5cbiAgaWYgKHByb2Muc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBnaXQgbHMtZmlsZXMgZmFpbGVkIGluICR7cm9vdERpclBhdGh9OiAkeyhwcm9jLnN0ZGVyciB8fCBwcm9jLmVycm9yPy5tZXNzYWdlIHx8ICcnKS50cmltKCl9YCk7XG4gIH1cbiAgcmV0dXJuIHByb2Muc3Rkb3V0XG4gICAgLnNwbGl0KCdcXDAnKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IC9eXFwuP2Zub3goXFwuLispP1xcLnRvbWwkL3UudGVzdChwYXRoLmJhc2VuYW1lKGxpbmUpKSAmJiAhaXNUZXN0Rml4dHVyZUZub3hQYXRoKGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgbGluZSkpO1xufVxuXG5mdW5jdGlvbiBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKGRpclBhdGgpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAvXlxcLj9mbm94KFxcLi4rKT9cXC50b21sJC91LnRlc3QobmFtZSkpXG4gICAgICAudG9Tb3J0ZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkKT8uY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICAvLyBGYWlsIGNsb3NlZDogZm5veCBjYW4gc3RpbGwgbG9hZCBhIGNvbmZpZyBmcm9tIGEgZGlyZWN0b3J5IHRoaXMgcHJvY2VzcyBjYW5ub3QgZW51bWVyYXRlXG4gICAgLy8gKGUuZy4gZXhlY3V0ZS1vbmx5IHBlcm1pc3Npb24pLCBzbyBhbiBlbnVtZXJhdGlvbiBmYWlsdXJlIG11c3Qgbm90IHJlYWQgYXMgXCJubyBjb25maWdzXCIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaW5zcGVjdCAke2RpclBhdGh9IGZvciBmbm94IGNvbmZpZ3M6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBkaXJQYXRocyA9IFtkaXJQYXRoXTtcbiAgd2hpbGUgKGRpclBhdGhzLmF0KC0xKSAhPT0gcm9vdERpclBhdGgpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGlyUGF0aHMuYXQoLTEpID8/ICcnKTtcbiAgICBpZiAocGFyZW50ID09PSBkaXJQYXRocy5hdCgtMSkpIGJyZWFrO1xuICAgIGRpclBhdGhzLnB1c2gocGFyZW50KTtcbiAgfVxuICByZXR1cm4gZGlyUGF0aHM7XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IHVua25vd25bXSwgc291cmNlOiB1bmtub3duW10sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93bltdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChpc01lcmdlYWJsZU9iamVjdCh0YXJnZXRbaW5kZXhdLCBvcHRpb25zKSAmJiBpc01lcmdlYWJsZU9iamVjdChpdGVtLCBvcHRpb25zKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG5cbmZ1bmN0aW9uIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd24ge1xuICByZXR1cm4gaXNNZXJnZWFibGVPYmplY3QodmFsdWUsIG9wdGlvbnMpID8gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgLy8gcGFja2FnZS5qc29uLXN0eWxlIGtleXMgYXJlIG5vbi1hcnJheS1pbmRleCBrZXlzLCBzbyBKU09OLnN0cmluZ2lmeSBwcmVzZXJ2ZXMgdGhpcyBpbnNlcnRpb24gb3JkZXIuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRTZWVkZWRCYXNlbGluZUdsb2IsXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG4gIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybixcbiAgbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHksXG4gIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLy8gVGhlIEJ1bi1leGFjdCByZXNvbHV0aW9uIHByaW1pdGl2ZXMgbGl2ZSBpbiBAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlIChzcmMvYnVuV29ya3NwYWNlcy50cylcbi8vIHNvIHdiJ3MgcmVsZWFzZSBjb2RlIHNoYXJlcyB0aGVtOyByZS1leHBvcnQgdGhlIG9uZXMgd2JmeSBtb2R1bGVzIGFuZCB0ZXN0cyBjb25zdW1lLlxuZXhwb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuLyoqIFRoZSBzdWJzZXQgb2YgUGFja2FnZUNvbmZpZyB0aGF0IHdvcmtzcGFjZSBkaXNjb3ZlcnkgbmVlZHMsIHNvIGl0IGNhbiBydW4gYmVmb3JlIGNvbmZpZ3MgZXhpc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VSb290TGlrZSA9IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnIHwgJ2RvZXNDb250YWluU3ViUGFja2FnZUpzb25zJyB8ICdwYWNrYWdlSnNvbic+O1xuXG4vKipcbiAqIEV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZSBkaXJlY3RvcnkgKGFic29sdXRlLCBkZWR1cGxpY2F0ZWQpIG9mIHRoZSBtb25vcmVwbyByb290LCBjb3ZlcmluZ1xuICogbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKi4gVW5jYWNoZWQgYmVjYXVzZSBpbmRleC50cyBjYWxscyBpdCBiZWZvcmUgd2JmeSBtdXRhdGVzXG4gKiB0aGUgcm9vdCBwYWNrYWdlLmpzb24gKGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIGNhY2hlcyB0aGUgcG9zdC1tdXRhdGlvbiBzdGF0ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocm9vdExpa2UpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUocm9vdExpa2UuZGlyUGF0aCwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgICApXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlLmpzb24gcGF0aCAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QsIHNvcnRlZCksIGluY2x1ZGluZyBtYW5pZmVzdHNcbiAqIHdpdGhvdXQgYSBgbmFtZWAgZmllbGQg4oCUIHdiZnkgbmFtZXMgdGhvc2UgbGF0ZXIsIHNvIGRlcGVuZGVuY3kgc2NhbnMgbXVzdCBub3Qgc2tpcCB0aGVtLlxuICogUmVzb2x1dGlvbiBtaW1pY3MgQnVuJ3Mgc2VxdWVudGlhbCBwYXR0ZXJuIGV2YWx1YXRpb247IHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocm9vdENvbmZpZzogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290Q29uZmlnKSwgcm9vdENvbmZpZy5kaXJQYXRoKTtcbn1cblxuaW50ZXJmYWNlIFdvcmtzcGFjZURpclBhdHRlcm5zIHtcbiAgLyoqIERpcmVjdG9yeSBzdWJ0cmVlcyAob3IgcGFja2FnZS1vd25lZCBzdWJwYXRocykgbWF0Y2hlZCBieSBlZmZlY3RpdmUgbmVnYXRpb25zLCBmb3IgdHNjb25maWcgYGV4Y2x1ZGVgIGVudHJpZXMuICovXG4gIGV4Y2x1ZGVzOiBzdHJpbmdbXTtcbiAgLyoqIFBvc2l0aXZlIGRpcmVjdG9yeSBwYXR0ZXJucyAob3IgY29uY3JldGUgZGlyZWN0b3JpZXMgZm9yIEJ1bi1vbmx5IGdsb2Igc3ludGF4KS4gKi9cbiAgaW5jbHVkZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNvcnRlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IHBhdHRlcm5zIChwb3NpeCwgcmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpIGZvciBnZW5lcmF0b3JzIHRoYXRcbiAqIG5lZWQgcGF0dGVybi1zaGFwZWQgZ2xvYnMgY292ZXJpbmcgZXZlcnkgd29ya3NwYWNlIGxheW91dCDigJQgZS5nLiB0aGUgcm9vdCB0c2NvbmZpZydzIGBhcHBzLypgXG4gKiBpbmNsdWRlIGVudHJpZXMg4oCUIGluc3RlYWQgb2YgY29uY3JldGUgZGlyZWN0b3JpZXMsIHdoaWNoIHdvdWxkIGNodXJuIGdlbmVyYXRlZCBmaWxlcyB3aGVuZXZlciBhXG4gKiB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhZGRlZCBvciByZW1vdmVkLiBFdmVyeSByZXR1cm5lZCBwYXR0ZXJuIGlzIHZhbGlkIHRzY29uZmlnIGdsb2Igc3ludGF4LlxuICogQSBwYXR0ZXJuIGNhbiBtYXRjaCBhIHNpYmxpbmcgZGlyZWN0b3J5IHdpdGhvdXQgYSBwYWNrYWdlLmpzb24gKG5vdCBhIHdvcmtzcGFjZSB0byBCdW4pOyB0aGF0XG4gKiBpcyBkZWxpYmVyYXRlLCBtaXJyb3JpbmcgdGhlIGxvbmctc3RhbmRpbmcgYHBhY2thZ2VzLypgIGVudHJpZXMnIGJlaGF2aW9yIGluIGZhdm9yIG9mIHN0YWJsZVxuICogZ2VuZXJhdGVkIG91dHB1dC4gTmVnYXRpb25zIGZvbGxvdyBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyk6IGEgbmVnYXRpb24gc3RheXMgcGF0dGVybi1zaGFwZWQgd2hpbGUgaXQgZXhjbHVkZXMgZXhhY3RseVxuICogd2hhdCBpdCBtYXRjaGVzLCBidXQgaXMgY29uY3JldGl6ZWQgcGVyIG1hdGNoZWQgZGlyZWN0b3J5IHdoZW4gYSBtYXRjaGVkIGRpcmVjdG9yeSBlbmRzIHVwIGFcbiAqIHdvcmtzcGFjZSBhbnl3YXkgKHJlLWluY2x1ZGVkIGJ5IGEgbGF0ZXIgcG9zaXRpdmUsIGEgcGlubmVkIGNvbmNyZXRlIHBvc2l0aXZlLCBvciBhIHNlZWRlZFxuICogYmFzZWxpbmU7ICMxMDA1KSBvciBpcyBhbiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSBkaXJlY3RvcnksIHdoZXJlIEJ1biBleGNsdWRlcyBvbmx5IHRoZVxuICogcGFja2FnZSBBVCB0aGF0IGRpcmVjdG9yeSwgc28gb25seSBpdHMgcGFja2FnZS1vd25lZCBzdWJwYXRocyBhcmUgZXhjbHVkZWQgKCMxMDA0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZURpclBhdHRlcm5zKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IFdvcmtzcGFjZURpclBhdHRlcm5zIHtcbiAgLy8gVW5saWtlIGRpc2NvdmVyeSwgZ2VuZXJhdGVkIG91dHB1dCBtdXN0IG5vdCBjb250YWluIGEgbmV2ZXItbWF0Y2hpbmcgYHBhY2thZ2VzLypgIGZhbGxiYWNrOlxuICAvLyBhbiBhcHBzLyotb25seSBtb25vcmVwbyB3b3VsZCBnZXQgZGVhZCBnbG9icyBjb21taXR0ZWQgaW50byBpdHMgcm9vdCB0c2NvbmZpZy4gTWlycm9yXG4gIC8vIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggZm9yY2VzIGBwYWNrYWdlcy8qYCBvbmx5IHdoZW4gYSBtYW5pZmVzdCBhY3R1YWxseSBtYXRjaGVzLlxuICBjb25zdCBoYXNQYWNrYWdlc0xheW91dCA9XG4gICAgcm9vdExpa2UuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiZcbiAgICAvLyBNaXJyb3IgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zJyBiYXNlbGluZSBnYXRlIHRvbzogd2l0aCBhbiBpbXBsaWNpdCBiYXNlbGluZSBzZWVkZWQsXG4gICAgLy8gYHBhY2thZ2VzLypgIGVudHJpZXMgd291bGQgYmUgZGVhZCBnbG9icyBzdWJzdW1lZCBieSB0aGUgYmFzZWxpbmUtZGVyaXZlZCBvbmVzLlxuICAgICFoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKSAmJlxuICAgIGZnLmdsb2JTeW5jKCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIGN3ZDogcm9vdExpa2UuZGlyUGF0aCxcbiAgICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIH0pLmxlbmd0aCA+IDA7XG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID0gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMoe1xuICAgIC4uLnJvb3RMaWtlLFxuICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBoYXNQYWNrYWdlc0xheW91dCxcbiAgfSk7XG4gIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gbmV3IFNldChcbiAgICByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJucywgcm9vdExpa2UuZGlyUGF0aCkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKVxuICAgIClcbiAgKTtcbiAgY29uc3QgaW5jbHVkZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbmVnYXRpb25Cb2RpZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIC8vIEEgc2VlZGluZyBuZWdhdGlvbiBtYWtlcyBCdW4gbGluayBiYXNlbGluZS1tYXRjaGVkIGRpcmVjdG9yaWVzLCBzbyB0aGUgYmFzZWxpbmUgbXVzdFxuICAgICAgLy8gZW50ZXIgdGhlIGdlbmVyYXRlZCBpbmNsdWRlIHBhdHRlcm5zIGV2ZW4gd2hlbiBldmVyeSBkZWNsYXJlZCBwYXR0ZXJuIGlzIGEgbmVnYXRpb24uXG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSBpbmNsdWRlcy5hZGQoYmFzZWxpbmVHbG9iKTtcbiAgICAgIG5lZ2F0aW9uQm9kaWVzLnB1c2gocGF0dGVybkJvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdHRlcm4gb2YgdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhwYXR0ZXJuQm9keSwgcm9vdExpa2UuZGlyUGF0aCkpIHtcbiAgICAgICAgaW5jbHVkZXMuYWRkKGRpclBhdHRlcm4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBleGNsdWRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IG5lZ2F0aW9uQm9keSBvZiBuZWdhdGlvbkJvZGllcykge1xuICAgIGZvciAoY29uc3QgZXhjbHVkZUVudHJ5IG9mIHRvRXhjbHVkZUVudHJpZXMobmVnYXRpb25Cb2R5LCB3b3Jrc3BhY2VEaXJQYXRocywgcm9vdExpa2UuZGlyUGF0aCkpIHtcbiAgICAgIGV4Y2x1ZGVzLmFkZChleGNsdWRlRW50cnkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBleGNsdWRlczogWy4uLmV4Y2x1ZGVzXS50b1NvcnRlZCgpLCBpbmNsdWRlczogWy4uLmluY2x1ZGVzXS50b1NvcnRlZCgpIH07XG59XG5cbi8qKlxuICogdHNjb25maWcgZXhjbHVkZSBlbnRyaWVzIGZvciBvbmUgbmVnYXRpb24uIFBhdHRlcm4tc2hhcGVkIHdoZW4gdGhlIG5lZ2F0aW9uIGV4Y2x1ZGVzIGV4YWN0bHlcbiAqIHdoYXQgaXQgbWF0Y2hlcyAoc3RhYmxlIG91dHB1dCk7IHBlci1kaXJlY3Rvcnkgb3RoZXJ3aXNlOiBhIGRpcmVjdG9yeSB0aGF0IGlzIGEgd29ya3NwYWNlXG4gKiBkZXNwaXRlIHRoZSBuZWdhdGlvbiBpcyBub3QgZXhjbHVkZWQgYXQgYWxsLCBhbmQgbmVpdGhlciBpcyBhIFBMQUlOIChwYWNrYWdlLmpzb24tbGVzcylcbiAqIGRlc2NlbmRhbnQgb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5IOKAlCBuZWdhdGluZyBhIG5vbi1wYWNrYWdlIGRpcmVjdG9yeSBpcyBhIG5vLW9wIGZvciBCdW4sXG4gKiBhbmQgdGhlIGVuY2xvc2luZyB3b3Jrc3BhY2Ugc3RheXMgYWN0aXZlIChlLmcuIGBbJ2FwcHMvKionLCAnIWFwcHMvKionLCAnYXBwcy93ZWInXWBcbiAqIHJlLWluY2x1ZGVzIGFwcHMvd2ViLCB3aG9zZSBzcmMgbXVzdCBrZWVwIHR5cGUtY2hlY2tpbmc7IGEgdHNjb25maWcgZXhjbHVkZSB3b3VsZCBvdmVycmlkZVxuICogdGhlIGluY2x1ZGUpLiBBIGRlc2NlbmRhbnQgd2l0aCBpdHMgb3duIG1hbmlmZXN0IHRoYXQgdGhlIG5lZ2F0aW9uIGtlZXBzIG91dCBvZiB0aGUgd29ya3NwYWNlXG4gKiBzZXQgaXMgYW4gZXhjbHVkZWQgbmVzdGVkIHBhY2thZ2UgYW5kIHN0YXlzIGV4Y2x1ZGVkLiBBIGRpcmVjdG9yeSB0aGF0IGlzIGFuXG4gKiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSBkaXJlY3RvcnkgZ2V0cyBvbmx5IGl0cyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIGV4Y2x1ZGVkLCBiZWNhdXNlIEJ1blxuICogZXhjbHVkZXMgb25seSB0aGUgcGFja2FnZSBBVCB0aGF0IGRpcmVjdG9yeSB3aGlsZSBrZWVwaW5nIGRlc2NlbmRhbnQgd29ya3NwYWNlcyAoIzEwMDQpLlxuICovXG5mdW5jdGlvbiB0b0V4Y2x1ZGVFbnRyaWVzKG5lZ2F0aW9uQm9keTogc3RyaW5nLCB3b3Jrc3BhY2VEaXJQYXRoczogU2V0PHN0cmluZz4sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzV29ya3NwYWNlQW5jZXN0b3IgPSAoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgIFsuLi53b3Jrc3BhY2VEaXJQYXRoc10uc29tZSgod29ya3NwYWNlRGlyUGF0aCkgPT4gd29ya3NwYWNlRGlyUGF0aC5zdGFydHNXaXRoKGAke2RpclBhdGh9L2ApKTtcbiAgLy8gT25seSBQTEFJTiBkaXJlY3RvcmllcyAobm8gcGFja2FnZS5qc29uIG9mIHRoZWlyIG93bikgYXJlIHByb3RlY3RlZCBieSB0aGUgZW5jbG9zaW5nXG4gIC8vIHdvcmtzcGFjZTogYSBtYXRjaGVkIGRpcmVjdG9yeSB0aGF0IGNhcnJpZXMgaXRzIG93biBtYW5pZmVzdCB5ZXQgaXMgYWJzZW50IGZyb20gdGhlIGZpbmFsXG4gIC8vIHdvcmtzcGFjZSBzZXQgaXMgYW4gZXhjbHVkZWQgbmVzdGVkIHBhY2thZ2UsIGFuZCBpdHMgZXhjbHVzaW9uIG11c3Qgc3Vydml2ZS5cbiAgY29uc3QgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50ID0gKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBbLi4ud29ya3NwYWNlRGlyUGF0aHNdLnNvbWUoKHdvcmtzcGFjZURpclBhdGgpID0+IGRpclBhdGguc3RhcnRzV2l0aChgJHt3b3Jrc3BhY2VEaXJQYXRofS9gKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsIGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gIGNvbnN0IG1hdGNoZWREaXJQYXRocyA9IGdldE1hdGNoZWREaXJQYXRocyhuZWdhdGlvbkJvZHksIHJvb3REaXJQYXRoKTtcbiAgaWYgKFxuICAgICFtYXRjaGVkRGlyUGF0aHMuc29tZShcbiAgICAgIChkaXJQYXRoKSA9PlxuICAgICAgICB3b3Jrc3BhY2VEaXJQYXRocy5oYXMoZGlyUGF0aCkgfHwgaXNXb3Jrc3BhY2VBbmNlc3RvcihkaXJQYXRoKSB8fCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQoZGlyUGF0aClcbiAgICApXG4gICkge1xuICAgIHJldHVybiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKG5lZ2F0aW9uQm9keSwgcm9vdERpclBhdGgpO1xuICB9XG4gIHJldHVybiBtYXRjaGVkRGlyUGF0aHMuZmxhdE1hcCgoZGlyUGF0aCkgPT4ge1xuICAgIC8vIFRoZSBkZXNjZW5kYW50IGNoZWNrIHByZWNlZGVzIHRoZSBhbmNlc3RvciBvbmU6IGEgZGlyZWN0b3J5IGluc2lkZSBvbmUgd29ya3NwYWNlIGJ1dCBhYm92ZVxuICAgIC8vIGEgbmVzdGVkIG9uZSAoZS5nLiBhcHBzL3dlYi9wbHVnaW5zIGJldHdlZW4gd29ya3NwYWNlcyBhcHBzL3dlYiBhbmQgYXBwcy93ZWIvcGx1Z2lucy94KVxuICAgIC8vIHN0aWxsIGJlbG9uZ3MgdG8gdGhlIGVuY2xvc2luZyBhY3RpdmUgd29ya3NwYWNlLCBzbyBub3RoaW5nIG9mIGl0IG1heSBiZSBleGNsdWRlZC5cbiAgICBpZiAod29ya3NwYWNlRGlyUGF0aHMuaGFzKGRpclBhdGgpIHx8IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudChkaXJQYXRoKSkgcmV0dXJuIFtdO1xuICAgIGlmIChpc1dvcmtzcGFjZUFuY2VzdG9yKGRpclBhdGgpKSB7XG4gICAgICByZXR1cm4gW2Ake2RpclBhdGh9LyouY29uZmlnLnRzYCwgYCR7ZGlyUGF0aH0vc2NyaXB0c2AsIGAke2RpclBhdGh9L3NyY2AsIGAke2RpclBhdGh9L3Rlc3RgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtkaXJQYXRoXTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGlyZWN0b3JpZXMgYSBuZWdhdGlvbiBtYXRjaGVzLiBUaGUgbWFuaWZlc3QtYmFzZWQgZ2xvYiBjb21wbGVtZW50cyBvbmx5RGlyZWN0b3JpZXMgYmVjYXVzZVxuICogZmFzdC1nbG9iJ3MgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGBkaXJgIGl0c2VsZiBhcyBhIGRpcmVjdG9yeSwgd2hpbGUgYm90aCBCdW4gYW5kIHRoZVxuICogbWFuaWZlc3QgZ2xvYiB0cmVhdCBgKipgIGFzIHplcm8gb3IgbW9yZSBzZWdtZW50cyAoYGFwcHMvKipgIGNvdmVycyB0aGUgcGFja2FnZSBhdCBhcHBzKS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hlZERpclBhdGhzKG5lZ2F0aW9uQm9keTogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4uZmcuZ2xvYlN5bmMobmVnYXRpb25Cb2R5LCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSksXG4gICAgICAuLi5mZ1xuICAgICAgICAuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKG5lZ2F0aW9uQm9keSwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucylcbiAgICAgICAgLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICAgICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290IGl0c2VsZiwgd2hpY2ggaXMgbmV2ZXIgYSB3b3Jrc3BhY2UuXG4gICAgICAgIC5maWx0ZXIoKGRpclBhdGgpID0+IGRpclBhdGggIT09ICcuJyksXG4gICAgXSksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiB0c2NvbmZpZyBpbmNsdWRlL2V4Y2x1ZGUgc3VwcG9ydCBvbmx5IHRoZSBgKmAsIGA/YCwgYW5kIGAqKmAgd2lsZGNhcmRzLCB3aGlsZSBCdW4gd29ya3NwYWNlc1xuICogYWNjZXB0IGZ1bGwgZ2xvYiBzeW50YXggKGJyYWNlIGV4cGFuc2lvbiwgY2hhcmFjdGVyIGNsYXNzZXMsIOKApiksIHNvIGV4cGFuZCBCdW4tb25seSBwYXR0ZXJucyB0b1xuICogdGhlIGNvbmNyZXRlIGRpcmVjdG9yaWVzIHRoZXkgbWF0Y2ggdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIGdsb2JzIHZhbGlkIGZvciBUeXBlU2NyaXB0LlxuICovXG5mdW5jdGlvbiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKHBhdHRlcm5Cb2R5OiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghL1soKVtcXF17fV0vdS50ZXN0KHBhdHRlcm5Cb2R5KSkgcmV0dXJuIFtwYXR0ZXJuQm9keV07XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuQm9keSwge1xuICAgIGN3ZDogcm9vdERpclBhdGgsXG4gICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIG9ubHlEaXJlY3RvcmllczogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSB0aGF0IHN0YXkgaW5zaWRlIHRoZSByZXBvc2l0b3J5OiBhYnNvbHV0ZVxuICogb3IgYC4uYC10cmF2ZXJzaW5nIHBhdHRlcm5zIHdvdWxkIG1ha2UgY29uc3VtZXJzIHN1Y2ggYXMgcmVtb3ZlTm9kZU1vZHVsZXMgb3BlcmF0ZSBvbiBhbm90aGVyXG4gKiByZXBvc2l0b3J5J3MgZmlsZXMuIERlY2xhcmF0aW9uIG9yZGVyIGFuZCBkdXBsaWNhdGVzIGFyZSBwcmVzZXJ2ZWQg4oCUIEJ1biBldmFsdWF0ZXMgdGhlXG4gKiBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmZ1bmN0aW9uIGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVjbGFyZWRQYXR0ZXJucyA9IGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKTtcbiAgLy8gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIGZvcmNlcyBgcGFja2FnZXMvKmAgaW50byBhIG1vbm9yZXBvJ3Mgd29ya3NwYWNlcyB3aGVuIGFcbiAgLy8gcGFja2FnZXMvKi9wYWNrYWdlLmpzb24gYWN0dWFsbHkgbWF0Y2hlcywgYnV0IGl0IG1heSBub3QgaGF2ZSB3cml0dGVuIHRoZSByb290IHBhY2thZ2UuanNvblxuICAvLyB5ZXQsIHNvIG1pcnJvciB0aGF0IG5vcm1hbGl6YXRpb24gaGVyZSDigJQgUFJFUEVOREVEIGxpa2UgdGhlcmUsIGJlY2F1c2UgYSBwb3NpdGl2ZSBwYXR0ZXJuXG4gIC8vIHBsYWNlZCBhZnRlciBhIHVzZXIgbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcyB1bmRlciBCdW4ncyBzZXF1ZW50aWFsXG4gIC8vIGV2YWx1YXRpb24uIERpc2NvdmVyeSBjYWxsZXJzIHBhc3MgdGhlIGZhbGxiYWNrIHVuY29uZGl0aW9uYWxseSBmb3IgbW9ub3JlcG9zIOKAlCBhXG4gIC8vIG5ldmVyLW1hdGNoaW5nIHBhdHRlcm4gY29udHJpYnV0ZXMgbm8gcGF0aHMgdGhlcmUg4oCUIHdoaWxlIHBhdHRlcm4tc2hhcGVkIGNhbGxlcnNcbiAgLy8gKGdldFdvcmtzcGFjZURpclBhdHRlcm5zKSBnYXRlIGl0IG9uIGFuIGFjdHVhbCBtYXRjaC5cbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPVxuICAgIHJvb3RMaWtlLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmICFoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4ocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpXG4gICAgICA/IFsncGFja2FnZXMvKicsIC4uLmRlY2xhcmVkUGF0dGVybnNdXG4gICAgICA6IGRlY2xhcmVkUGF0dGVybnM7XG4gIHJldHVybiB3b3Jrc3BhY2VQYXR0ZXJucy5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+IGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHBvc2l0aXZlIHBhdHRlcm4gYWxyZWFkeSBjb3ZlcnMgYHBhY2thZ2VzLypgIHVuZGVyIHBhdGggbm9ybWFsaXphdGlvblxuICogKGUuZy4gYC4vcGFja2FnZXMvKmAgb3IgYSB0cmFpbGluZy1zbGFzaCBzcGVsbGluZyk6IGZvcmNpbmcgYSB0ZXh0dWFsIGBwYWNrYWdlcy8qYCBuZXh0IHRvXG4gKiBzdWNoIGEgc3BlbGxpbmcgd291bGQgcGVyc2lzdCBkdXBsaWNhdGUgZXF1aXZhbGVudCBwYXR0ZXJucyBhbmQgcmUtc2NhbiB0aGUgc2FtZSBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybih3b3Jrc3BhY2VzOiBQYWNrYWdlSnNvblsnd29ya3NwYWNlcyddKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgIXdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmXG4gICAgICAvLyBBIGAuLmAtdHJhdmVyc2luZyBvciBhYnNvbHV0ZSBzcGVsbGluZyAoZS5nLiBgeC8uLi9wYWNrYWdlcy8qYCkgaXMgZGlzY2FyZGVkIGJ5XG4gICAgICAvLyBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucywgc28gaXQgbXVzdCBub3QgY291bnQgYXMgY292ZXJpbmcgcGFja2FnZXMvKiDigJQgdGhhdCB3b3VsZFxuICAgICAgLy8gc3VwcHJlc3MgdGhlIGZhbGxiYWNrIEFORCBsb3NlIHRoZSBwYXR0ZXJuLCBsZWF2aW5nIG5vIGRpc2NvdmVyZWQgd29ya3NwYWNlcy5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKSAmJlxuICAgICAgbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkod29ya3NwYWNlUGF0dGVybikgPT09ICdwYWNrYWdlcy8qJ1xuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIH0gZnJvbSAnLi93b3Jrc3BhY2VVdGlsLmpzJztcblxuY29uc3QgUFJJVkFURV9TQ09QRSA9ICdAd2lsbGJvb3N0ZXItcHJpdmF0ZS8nO1xuXG5jb25zdCBwcml2YXRlUmVnaXN0cnlIb3N0ID0gJ3ZlcmRhY2Npby1wcm9kdWN0aW9uLWUzODkudXAucmFpbHdheS5hcHAnO1xuZXhwb3J0IGNvbnN0IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyA9IGBAd2lsbGJvb3N0ZXItcHJpdmF0ZTpyZWdpc3RyeT1odHRwczovLyR7cHJpdmF0ZVJlZ2lzdHJ5SG9zdH0vYDtcblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgcmVwb3NpdG9yeSBkZWFscyB3aXRoIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCBwYWNrYWdlcyDigJQgYnkgY29udmVudGlvbiB0aGF0IHNjb3BlXG4gKiBsaXZlcyBleGNsdXNpdmVseSBvbiB0aGUgcHJpdmF0ZSBWZXJkYWNjaW8gcmVnaXN0cnksIHNvIGV4YWN0bHkgdGhlc2UgcmVwb3NpdG9yaWVzIG5lZWQgdGhlXG4gKiBWRVJEQUNDSU9fVE9LRU4gcGFzcy10aHJvdWdoIGluIHRoZWlyIHJldXNhYmxlLXdvcmtmbG93IGNhbGxlcnMuXG4gKlxuICogQSByZXBvc2l0b3J5IHF1YWxpZmllcyB3aGVuIGFueSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIERFQ0xBUkVTIGEgZGVwZW5kZW5jeSBpbiB0aGUgc2NvcGUgKGFueVxuICogZGVwZW5kZW5jeSBmaWVsZCksIG9yIGlzIGl0c2VsZiBOQU1FRCBpbiB0aGUgc2NvcGUgKGl0IHB1Ymxpc2hlcyB0byBWZXJkYWNjaW8sIGFuZCByZWxlYXNlLnltbFxuICogZGVyaXZlcyBpdHMgbnBtIGF1dGggZnJvbSB0aGUgc2FtZSBzZWNyZXQpLiBOb3RoaW5nIGVsc2UgaXMgc2Nhbm5lZDogbG9ja2ZpbGVzIG9ubHkgbWlycm9yIHRoZVxuICogZGVjbGFyZWQgZGVwZW5kZW5jaWVzLCBhbmQgYnVuZmlnLnRvbWwncyBgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlc2AgbWVudGlvbnMgdGhlIHNjb3BlIGV2ZW4gaW5cbiAqIHJlcG9zaXRvcmllcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCcgfCAnZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMnIHwgJ3BhY2thZ2VKc29uJz5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBtYW5pZmVzdFJlbFBhdGhzID0gbmV3IFNldChbJ3BhY2thZ2UuanNvbicsIC4uLmdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoY29uZmlnKV0pO1xuICByZXR1cm4gWy4uLm1hbmlmZXN0UmVsUGF0aHNdLnNvbWUoKHJlbFBhdGgpID0+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHJlYWRQYWNrYWdlSnNvbklmRXhpc3RzKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcmVsUGF0aCkpO1xuICAgIGlmICghbWFuaWZlc3QpIHJldHVybiBmYWxzZTtcbiAgICBpZiAobWFuaWZlc3QubmFtZT8uc3RhcnRzV2l0aChQUklWQVRFX1NDT1BFKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1hbmlmZXN0LmRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0LmRldkRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0LnBlZXJEZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5vcHRpb25hbERlcGVuZGVuY2llcyxcbiAgICBdLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzID8/IHt9KS5zb21lKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoUFJJVkFURV9TQ09QRSkpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbklmRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSAnd2ViLXRyZWUtc2l0dGVyJztcbmltcG9ydCB7IExhbmd1YWdlLCBQYXJzZXIgfSBmcm9tICd3ZWItdHJlZS1zaXR0ZXInO1xuXG5sZXQgcGFyc2VyUHJvbWlzZTogUHJvbWlzZTxQYXJzZXI+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHVucXVvdGVkIHdvcmRzIChjb21tYW5kIG5hbWUgZmlyc3QpIG9mIGV2ZXJ5IHNpbXBsZSBjb21tYW5kIGluIGEgQmFzaCBzY3JpcHQsIGluY2x1ZGluZyB0aG9zZSBuZXN0ZWRcbiAqIGluIHN1YnNoZWxscywgY29tcG91bmQgc3RhdGVtZW50cywgYW5kIGNvbW1hbmQgc3Vic3RpdHV0aW9ucywgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHNjcmlwdCBkb2VzIG5vdCBwYXJzZS5cbiAqIENvbW1lbnRzIGFuZCBsaXRlcmFsIGhlcmVkb2MgdGV4dCBhcmUgbm90IGNvbW1hbmRzIChjb21tYW5kIHN1YnN0aXR1dGlvbnMgaW4gYW4gdW5xdW90ZWQgaGVyZWRvYyBhcmUpLCBhbmQgZnVuY3Rpb25cbiAqIGJvZGllcyBhcmUgc2tpcHBlZCBiZWNhdXNlIHRoZXkgcnVuIG9ubHkgd2hlbiBjYWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVNoZWxsQ29tbWFuZHMoc2NyaXB0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdW10gfCB1bmRlZmluZWQ+IHtcbiAgcGFyc2VyUHJvbWlzZSA/Pz0gY3JlYXRlUGFyc2VyKCk7XG4gIGNvbnN0IHBhcnNlciA9IGF3YWl0IHBhcnNlclByb21pc2U7XG4gIGNvbnN0IHRyZWUgPSBwYXJzZXIucGFyc2Uoc2NyaXB0KTtcbiAgaWYgKCF0cmVlKSByZXR1cm47XG4gIHRyeSB7XG4gICAgaWYgKHRyZWUucm9vdE5vZGUuaGFzRXJyb3IpIHJldHVybjtcbiAgICByZXR1cm4gdHJlZS5yb290Tm9kZS5kZXNjZW5kYW50c09mVHlwZSgnY29tbWFuZCcpLmZsYXRNYXAoKGNvbW1hbmQpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjb21tYW5kLmNoaWxkRm9yRmllbGROYW1lKCduYW1lJyk7XG4gICAgICBpZiAoIW5hbWUgfHwgaXNJbkZ1bmN0aW9uQm9keShjb21tYW5kKSkgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIFtbbmFtZSwgLi4uY29tbWFuZC5jaGlsZHJlbkZvckZpZWxkTmFtZSgnYXJndW1lbnQnKV0ubWFwKCh3b3JkKSA9PiB1bnF1b3RlV29yZCh3b3JkKSldO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIHRyZWUuZGVsZXRlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkZ1bmN0aW9uQm9keShub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGFuY2VzdG9yID0gbm9kZS5wYXJlbnQ7IGFuY2VzdG9yOyBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudCkge1xuICAgIGlmIChhbmNlc3Rvci50eXBlID09PSAnZnVuY3Rpb25fZGVmaW5pdGlvbicpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUGFyc2VyKCk6IFByb21pc2U8UGFyc2VyPiB7XG4gIGF3YWl0IFBhcnNlci5pbml0KCk7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgcGFyc2VyLnNldExhbmd1YWdlKGF3YWl0IExhbmd1YWdlLmxvYWQoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS5yZXNvbHZlKCd0cmVlLXNpdHRlci1iYXNoL3RyZWUtc2l0dGVyLWJhc2gud2FzbScpKSkpO1xuICByZXR1cm4gcGFyc2VyO1xufVxuXG5mdW5jdGlvbiB1bnF1b3RlV29yZChub2RlOiBOb2RlKTogc3RyaW5nIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlICdjb21tYW5kX25hbWUnOiB7XG4gICAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkID8gdW5xdW90ZVdvcmQobm9kZS5maXJzdENoaWxkKSA6IG5vZGUudGV4dDtcbiAgICB9XG4gICAgY2FzZSAnY29uY2F0ZW5hdGlvbic6IHtcbiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHVucXVvdGVXb3JkKGNoaWxkKSkuam9pbignJyk7XG4gICAgfVxuICAgIGNhc2UgJ3Jhd19zdHJpbmcnOiB7XG4gICAgICByZXR1cm4gbm9kZS50ZXh0LnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgcmV0dXJuIG5vZGUudGV4dFxuICAgICAgICAuc2xpY2UoMSwgLTEpXG4gICAgICAgIC5yZXBsYWNlQWxsKCdcXFxcXFxuJywgJycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXFxcKFskYFwiXFxcXF0pL2d1LCAnJDEnKTtcbiAgICB9XG4gICAgY2FzZSAnd29yZCc6IHtcbiAgICAgIHJldHVybiBub2RlLnRleHQucmVwbGFjZUFsbCgnXFxcXFxcbicsICcnKS5yZXBsYWNlQWxsKC9cXFxcKC4pL2dzdSwgJyQxJyk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vIEV4cGFuc2lvbnMgYW5kIHN1YnN0aXR1dGlvbnMgaGF2ZSBubyBzdGF0aWMgdmFsdWU7IHRoZWlyIHNvdXJjZSB0ZXh0IG5ldmVyIGVxdWFscyBhIGxpdGVyYWwgd29yZC5cbiAgICAgIHJldHVybiBub2RlLnRleHQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBydW5uZXJTY2hlbWEgPSB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSk7XG5jb25zdCB3b3JrZmxvd1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgam9iczogei5yZWNvcmQoXG4gICAgei5zdHJpbmcoKSxcbiAgICB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgJ3J1bnMtb24nOiBydW5uZXJTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgc3RyYXRlZ3k6IHoub2JqZWN0KHsgbWF0cml4OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkgfSkub3B0aW9uYWwoKSxcbiAgICAgIH0pXG4gICAgICAubnVsbGFibGUoKVxuICApLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8ICFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSByZXR1cm47XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5jYXRjaCgoZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgZm9yIChjb25zdCB7IG5hbWU6IGZpbGVOYW1lIH0gb2YgZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiAvXFwueWE/bWwkL3UudGVzdChlbnRyeS5uYW1lKSkpIHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHdvcmtmbG93U2NoZW1hLnBhcnNlKHlhbWwubG9hZChhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpKSk7XG4gICAgZm9yIChjb25zdCBbam9iTmFtZSwgam9iXSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvdy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2I/LlsncnVucy1vbiddKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IGpvYlsncnVucy1vbiddO1xuICAgICAgaWYgKGlzU2VsZkhvc3RlZChydW5uZXIpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG1hdGNoID0gdHlwZW9mIHJ1bm5lciA9PT0gJ3N0cmluZycgJiYgL15cXCRcXHtcXHtcXHMqbWF0cml4XFwuKFxcdyspXFxzKlxcfVxcfSQvdS5leGVjKHJ1bm5lcik7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzOiB1bmtub3duW10gPSBbXTtcbiAgICAgIGlmIChtYXRjaCAmJiBqb2Iuc3RyYXRlZ3kpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV0hO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBqb2Iuc3RyYXRlZ3kubWF0cml4O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB6LmFycmF5KHoudW5rbm93bigpKS5zYWZlUGFyc2UobWF0cml4W2tleV0pO1xuICAgICAgICBpZiAodmFsdWVzLnN1Y2Nlc3MpIGNhbmRpZGF0ZXMucHVzaCguLi52YWx1ZXMuZGF0YSk7XG4gICAgICAgIGNvbnN0IGluY2x1ZGUgPSB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSkuc2FmZVBhcnNlKG1hdHJpeC5pbmNsdWRlKTtcbiAgICAgICAgaWYgKGluY2x1ZGUuc3VjY2VzcylcbiAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goLi4uaW5jbHVkZS5kYXRhLm1hcCgocm93KSA9PiByb3dba2V5XSkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHJ1bm5lcik7XG4gICAgICB9XG4gICAgICBjb25zdCBhbGxvd2VkID1cbiAgICAgICAgY2FuZGlkYXRlcy5sZW5ndGggPiAwICYmXG4gICAgICAgIGNhbmRpZGF0ZXMuZXZlcnkoXG4gICAgICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgICAgIGlzU2VsZkhvc3RlZChjYW5kaWRhdGUpIHx8XG4gICAgICAgICAgICAoY29uZmlnLnJlcG9zaXRvcnk/LnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWI6d2lsbGJvb3N0ZXIvY2hlZXJsaW5ncycgJiZcbiAgICAgICAgICAgICAgZmlsZU5hbWUgPT09ICdidWlsZC1kZXNrdG9wLWFwcHMueW1sJyAmJlxuICAgICAgICAgICAgICBqb2JOYW1lID09PSAnYnVpbGQnICYmXG4gICAgICAgICAgICAgIGNhbmRpZGF0ZSA9PT0gJ3dpbmRvd3MtbGF0ZXN0JylcbiAgICAgICAgKTtcbiAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7ZmlsZU5hbWV9OiBqb2JzLiR7am9iTmFtZX0ucnVucy1vbiBtdXN0IHNlbGVjdCBzZWxmLWhvc3RlZCBydW5uZXJzIGluIGEgcHJpdmF0ZSByZXBvc2l0b3J5LiBGaXggdGhlIHdvcmtmbG93IGJlZm9yZSBydW5uaW5nIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NlbGZIb3N0ZWQocnVubmVyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxhYmVscyA9IHJ1bm5lclNjaGVtYS5zYWZlUGFyc2UocnVubmVyKTtcbiAgaWYgKCFsYWJlbHMuc3VjY2VzcykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheShsYWJlbHMuZGF0YSkpIHJldHVybiBsYWJlbHMuZGF0YS5pbmNsdWRlcygnc2VsZi1ob3N0ZWQnKTtcbiAgcmV0dXJuIGxhYmVscy5kYXRhID09PSAnc2VsZi1ob3N0ZWQnO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYXNGbm94U3luY0ZhaWxlZCwgcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgcnVuQWxsSW5Qb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTaGVsbENvbW1hbmRzIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGxQYXJzZXIuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyB9IGZyb20gJy4vd29ya2Zsb3dSdW5uZXJQb2xpY3kuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xuICBxdWV1ZT86ICdzaW5nbGUnIHwgJ21heCc7XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgJ2luaGVyaXQnO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgICAgLy8gTGV0IG1haW50YWluZXJzIHJlLXJ1biB0aGUgdGVzdHMgYnkgaGFuZC5cbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgLy8gTm9uZSBvZiB0aGVzZSBtYXkgYmUgbmFycm93ZWQganVzdCBiZWNhdXNlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IG5ldmVyIHB1c2hlczpcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHRoZSB0ZXN0IGpvYidzIHNraXAtZHVwbGljYXRlLWFjdGlvbnMgY2FsbCB3aXRoIGNhbmNlbF9vdGhlcnM6IHRydWUgKHRoZSByZXVzYWJsZVxuICAgICAgLy8gdGVzdCB3b3JrZmxvdyBkZWNsYXJlcyBubyBwZXJtaXNzaW9ucyBvZiBpdHMgb3duLCBzbyBpdHMgam9icyBydW4gb24gdGhpcyB0b2tlbilcbiAgICAgIGFjdGlvbnM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgYHNlbWFudGljLXJlbGVhc2UgLS1kcnktcnVuYCwgd2hpY2ggZG9lcyBhIGBnaXQgcHVzaCAtLWRyeS1ydW5gIHRvIHZlcmlmeSB3cml0ZVxuICAgICAgLy8gYWNjZXNzIGFuZCBhYm9ydHMgd2l0aCBFR0lUTk9QRVJNSVNTSU9OIHdpdGhvdXQgaXRcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHBrZy1wcmVmbGlnaHQgUFIgZmlsZSBsaXN0aW5nXG4gICAgICAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3Rlc3QtcnVzdCc6IHtcbiAgICBuYW1lOiAnVGVzdCBSdXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd0ZXN0LXJ1c3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC1ydXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gYHF1ZXVlOiBtYXhgIGhlcmUgdG9vICgjOTc0KTogR2l0SHViJ3MgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGNhbmNlbHMgYW4gYWxyZWFkeS1QRU5ESU5HXG4gICAgLy8gY2FsbGVyIHJ1biB3aGVuIGFub3RoZXIgb25lIHF1ZXVlcyDigJQgYmVmb3JlIGl0cyBqb2IgKGFuZCB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBvd25cbiAgICAvLyBqb2ItbGV2ZWwgYHF1ZXVlOiBtYXhgKSBldmVyIHN0YXJ0cyDigJQgc2lsZW50bHkgZHJvcHBpbmcgdGhhdCByZWxlYXNlIHRyaWdnZXIuXG4gICAgLy8gVGhlIGNhbGxlci1sZXZlbCBncm91cCBtdXN0IE5PVCByZXVzZSB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBqb2ItbGV2ZWwgZ3JvdXAgbmFtZVxuICAgIC8vIChgcmVsZWFzZS0ke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX1gKTogd29ya2Zsb3ctbGV2ZWwgYW5kIGpvYi1sZXZlbCBncm91cHMgc2hhcmUgb25lXG4gICAgLy8gcmVwb3NpdG9yeS13aWRlIG5hbWVzcGFjZSwgYW5kIGlkZW50aWNhbCBuYW1lcyBkZWFkbG9jayB0aGUgcnVuIChcIkNhbmNlbGluZyBzaW5jZSBhXG4gICAgLy8gZGVhZGxvY2sgZm9yIGNvbmN1cnJlbmN5IGdyb3VwIC4uLiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiAndG9wIGxldmVsIHdvcmtmbG93JyBhbmQgJzxqb2I+J1wiKS5cbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIHF1ZXVlOiAnbWF4JyxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JztcblxuLyoqXG4gKiBQYXJzZXMgYSBgdXNlczpgIHZhbHVlIGNhbGxpbmcgb25lIG9mIFdpbGxCb29zdGVyJ3Mgb3duIHJldXNhYmxlIHdvcmtmbG93cyAob3IgdGhlXG4gKiBXaWxsQm9vc3RlckxhYiBzeW5jIG1pcnJvcikgaW50byB0aGUgd29ya2Zsb3cgbmFtZSAod2l0aG91dCBleHRlbnNpb24pIGFuZCBnaXQgcmVmLiBPbmx5IHRob3NlXG4gKiBmb2xsb3cgdGhlIGNvbnRyYWN0IHdiZnkgZW5mb3JjZXMg4oCUIGNhbGxlcnMgb2YgYW5vdGhlciBvcmdhbml6YXRpb24ncyBzYW1lLW5hbWVkIHJlcG9zaXRvcnkgYXJlXG4gKiBsZWZ0IGFsb25lLiBHaXRIdWIgdHJlYXRzIG93bmVyL3JlcG9zaXRvcnkgbmFtZXMgY2FzZS1pbnNlbnNpdGl2ZWx5LCBzbyB0aGUgY29tcGFyaXNvbiBkb2VzXG4gKiB0b28sIHdoaWxlIHRoZSB3b3JrZmxvdyBwYXRoIGFuZCByZWYgc3RheSBjYXNlLXNlbnNpdGl2ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChcbiAgdXNlczogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiB7IHdvcmtmbG93TmFtZTogc3RyaW5nOyBleHRlbnNpb246IHN0cmluZzsgcmVmOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gL14oW14vXSspXFwvKFteL10rKVxcL1xcLmdpdGh1YlxcL3dvcmtmbG93c1xcLyhbXi9AXSs/KVxcLih5YT9tbClAKC4rKSQvdS5leGVjKHVzZXMgPz8gJycpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBvd25lciA9IG1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoKG93bmVyICE9PSAnd2lsbGJvb3N0ZXInICYmIG93bmVyICE9PSAnd2lsbGJvb3N0ZXJsYWInKSB8fCBtYXRjaFsyXSEudG9Mb3dlckNhc2UoKSAhPT0gJ3JldXNhYmxlLXdvcmtmbG93cycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IHdvcmtmbG93TmFtZTogbWF0Y2hbM10hLCBleHRlbnNpb246IG1hdGNoWzRdISwgcmVmOiBtYXRjaFs1XSEgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyb290Q29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93bikge1xuICAgIGNvbnNvbGUud2FybignU2tpcHBlZCB3b3JrZmxvdyBnZW5lcmF0aW9uIGJlY2F1c2UgcmVwb3NpdG9yeSB2aXNpYmlsaXR5IGlzIHVua25vd24uJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmIChhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICBhd2FpdCBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgpO1xuICB9XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXaXRoIC5naXRodWIgb3IgLmdpdGh1Yi93b3JrZmxvd3Mgc3ltbGlua2VkIG91dHNpZGUgdGhlIHJlcG9zaXRvcnksIHdyaXRlWWFtbCdzIGd1YXJkc1xuICAgIC8vIGFscmVhZHkgcmVmdXNlIHRoZSB3cml0ZXMsIGJ1dCByZWFkZGlyL3JtIGJlbG93IHdvdWxkIHN0aWxsIGVudW1lcmF0ZSBhbmQgREVMRVRFIGZpbGVzXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSDigJQgc28gcmVxdWlyZSB0aGUgZGlyZWN0b3J5IHRvIHJlc29sdmUgaW5zaWRlIGl0IGJlZm9yZSBhbnlcbiAgICAvLyB0cmF2ZXJzYWwsIG1rZGlyLCBvciBjbGVhbnVwLlxuICAgIGlmICghKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgd29ya2Zsb3dzIGJlY2F1c2UgJHt3b3JrZmxvd3NQYXRofSByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAvLyB3YmZ5IHdyaXRlcyAueW1sIHdvcmtmbG93cywgc28gZWFjaCBraW5kIG1hcHMgdG8gaXRzIC55bWwgZmlsZS5cbiAgICBjb25zdCBmaWxlTmFtZXNCeUtpbmQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhZW50cnkubmFtZS5lbmRzV2l0aCgnLnltbCcpKSBjb250aW51ZTtcbiAgICAgIGZpbGVOYW1lc0J5S2luZC5zZXQoZW50cnkubmFtZS5zbGljZSgwLCAtJy55bWwnLmxlbmd0aCksIGVudHJ5Lm5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBtYW5kYXRvcnlLaW5kcyA9IFsndGVzdCcsICdzZW1hbnRpYy1wcicsICdjbG9zZS1jb21tZW50J107XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgbWFuZGF0b3J5S2luZHMucHVzaCgncmVsZWFzZScpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBtYW5kYXRvcnlLaW5kcy5wdXNoKCd0ZXN0LXJ1c3QnKTtcbiAgICB9XG4gICAgLy8gQSBwcmV2aW91cyBydW4gbWF5IGhhdmUgbWlzdGFrZW4gYSBnaXRpZ25vcmVkIHRoaXJkLXBhcnR5IGNoZWNrb3V0IGZvciByZXBvc2l0b3J5IFJ1c3QgY29kZS5cbiAgICAvLyBSZW1vdmUgb25seSB0aGUgZ2VuZXJhdGVkLXN0eWxlIGNhbGxlcjogYSBzYW1lLW5hbWVkIGN1c3RvbSB3b3JrZmxvdyB3aXRoIGFueSBvdGhlciBqb2Igc3RheXMuXG4gICAgaWYgKHJvb3RDb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCB0ZXN0UnVzdEZpbGVOYW1lID0gZmlsZU5hbWVzQnlLaW5kLmdldCgndGVzdC1ydXN0Jyk7XG4gICAgICBpZiAodGVzdFJ1c3RGaWxlTmFtZSAmJiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aCwgdGVzdFJ1c3RGaWxlTmFtZSwgJ3Rlc3QtcnVzdCcpKSB7XG4gICAgICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3Rlc3QtcnVzdCcpO1xuICAgICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIHRlc3RSdXN0RmlsZU5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgnd2JmeScpO1xuICAgIGZvciAoY29uc3Qga2luZCBvZiBtYW5kYXRvcnlLaW5kcykge1xuICAgICAgaWYgKCFmaWxlTmFtZXNCeUtpbmQuaGFzKGtpbmQpKSB7XG4gICAgICAgIGZpbGVOYW1lc0J5S2luZC5zZXQoa2luZCwgYCR7a2luZH0ueW1sYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWxlTmFtZXNCeUtpbmQuaGFzKCdzeW5jJykpIHtcbiAgICAgIC8vIFRoZSBzeW5jIHdvcmtmbG93J3MgZ2VuZXJhdGlvbiBvd25zIHRoZSBmb3JjZS1zeW5jIHdvcmtmbG93LCBzbyBwcm9jZXNzaW5nIGl0IGFzIGFuXG4gICAgICAvLyBpbmRlcGVuZGVudCBraW5kIHdvdWxkIHJhY2UgY29uY3VycmVudCB3cml0ZXMgb24gdGhlIHNhbWUgcGF0aC5cbiAgICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3N5bmMtZm9yY2UnKTtcbiAgICB9XG5cbiAgICBhd2FpdCBydW5BbGxJblBvb2woXG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIFsuLi5maWxlTmFtZXNCeUtpbmRdLm1hcChcbiAgICAgICAgKFtraW5kLCBmaWxlTmFtZV0pID0+XG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQgYXMgS25vd25LaW5kLCBmaWxlTmFtZSlcbiAgICAgIClcbiAgICApO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZTogR2l0SHViIHJlcG9zaXRvcnkgbmFtZXMgYXJlLCBhbmQgYSByZW1vdGUgbWF5IHNwZWxsIHRoaXMgb25lIGFueSB3YXkuIEdldHRpbmcgaXQgd3JvbmdcbiAgLy8gbGV0cyB3YmZ5IHJld3JpdGUgdGhlIHJlcG9zaXRvcnkgdGhhdCBob3N0cyB0aGUgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gIHJldHVybiByZXBvc2l0b3J5Py50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBldmVyeSBqb2Igb2YgdGhlIHdvcmtmbG93IGZpbGUgY2FsbHMgdGhlIG5hbWVkIFdpbGxCb29zdGVyIHJldXNhYmxlIHdvcmtmbG93IChvd25lclxuICogcmVzdHJpY3RlZCB2aWEgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCkuIFVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgd2JmeSBvd25zIGEgZmlsZSBlbm91Z2ggdG9cbiAqIGRlbGV0ZSBpdDogdW5wYXJzYWJsZSBmaWxlcyBhbmQgZmlsZXMgd2l0aCBhbnkgb3RoZXIgam9iIHJldHVybiBmYWxzZSDigJQgZGVsZXRpbmcgYSB3aG9sZVxuICogd29ya2Zsb3cgb24gYSBsb29zZSBtYXRjaCB3b3VsZCBiZSB0b28gYWdncmVzc2l2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIHdvcmtmbG93TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghZmlsZU5hbWUuZW5kc1dpdGgoJy55bWwnKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGlzVGFyZ2V0Q2FsbCA9ICh1c2VzOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICAgIHR5cGVvZiB1c2VzID09PSAnc3RyaW5nJyAmJiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09IHdvcmtmbG93TmFtZTtcbiAgdHJ5IHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHlhbWwubG9hZChjb250ZW50KSBhcyBXb3JrZmxvdyB8IHVuZGVmaW5lZDtcbiAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qgam9icyA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3cuam9icyk7XG4gICAgICByZXR1cm4gam9icy5sZW5ndGggPiAwICYmIGpvYnMuZXZlcnkoKGpvYikgPT4gaXNUYXJnZXRDYWxsKGpvYj8udXNlcykpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gVW5wYXJzYWJsZSBjb250ZW50IGlzIG5vdCBwcm92YWJseSBhIGNhbGxlciBvZiB0aGUgbmFtZWQgd29ya2Zsb3cuXG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsXG4gIGtpbmQ6IEtub3duS2luZCxcbiAgZmlsZU5hbWUgPSBgJHtraW5kfS55bWxgXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWUgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpXG4gICAgPyAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ1xuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIEEgbm9uLWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sIGluIGEgcmVwbyB3aXRob3V0IFJ1c3QgY29kZSBtZXJlbHkgc2hhcmVzIHRoZSBuYW1lOyBsZWF2ZSBpdCBhbG9uZS5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnICYmIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBvbGRTZXR0aW5nczogV29ya2Zsb3c7XG4gICAgdHJ5IHtcbiAgICAgIG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQW4gZXhpc3Rpbmcgd29ya2Zsb3cgd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGUgdGVtcGxhdGVcbiAgICAgIC8vIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSByZXBvc2l0b3J5J3Mgd29ya2Zsb3cuXG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBZQU1MLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB5YW1sLmxvYWQgcmV0dXJucyB1bmRlZmluZWQgZm9yIGVtcHR5L2NvbW1lbnQtb25seSBmaWxlcyBhbmQgbm9uLW9iamVjdHMgZm9yIHNjYWxhclxuICAgIC8vIGRvY3VtZW50cyB3aXRob3V0IHRocm93aW5nOyBkZWVwbWVyZ2Ugd291bGQgY3Jhc2ggb24gdGhlbS5cbiAgICBpZiAodHlwZW9mIG9sZFNldHRpbmdzICE9PSAnb2JqZWN0JyB8fCBvbGRTZXR0aW5ncyA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSB3b3JrZmxvdy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfVxuXG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICAvLyBVbmxpa2UgdGhlIHJlbGVhc2UgY2FsbGVyLCB0aGUgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGlzIGludGVudGlvbmFsIGhlcmU6IGEgcGVuZGluZ1xuICAgICAgLy8gZGVwbG95IHRoYXQgaXMgY2FuY2VsbGVkIGFuZCByZXBsYWNlZCBieSBhIG5ld2VyIG9uZSBsb3NlcyBub3RoaW5nIOKAlCB0aGUgbmV3ZXIgZGVwbG95XG4gICAgICAvLyBjb252ZXJnZXMgdGhlIGVudmlyb25tZW50IHRvIHRoZSBsYXRlc3Qgc3RhdGUgYW55d2F5LlxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9IGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZTtcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBlbXB0eSBqb2JzIChhIGJhcmUgYGpvYk5hbWU6YCBwYXJzZXMgYXMgbnVsbCksIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3MsIGFuZCBvdGhlclxuICAgIC8vIG9yZ2FuaXphdGlvbnMnIHJldXNhYmxlIHdvcmtmbG93czogYSBzYW1lLW5hbWVkIGByZXVzYWJsZS13b3JrZmxvd3NgIHJlcG9zaXRvcnkgZWxzZXdoZXJlXG4gICAgLy8gZm9sbG93cyBhIGRpZmZlcmVudCBjb250cmFjdCwgYW5kIG5vcm1hbGl6aW5nIGl0cyBjYWxsZXJzIChzZWNyZXQgaW5qZWN0aW9uL3JlbW92YWwsXG4gICAgLy8gcGVybWlzc2lvbnMpIGNvdWxkIGJyZWFrIHRoZW0uXG4gICAgaWYgKCFqb2IgfHwgIXBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIC8vIERlcGxveSBjYWxsZXJzIG5lZWQgbm8gcmVwb3NpdG9yeSB3cml0ZXM6IHRoZSBjYWxsZWQgcmV1c2FibGUgd29ya2Zsb3cgaW5oZXJpdHMgdGhlIGNhbGxlcidzXG4gIC8vIHRva2VuIHBlcm1pc3Npb25zLCByZXBvc2l0b3JpZXMgZGVmYXVsdCB0aGUgdG9rZW4gdG8gd3JpdGUsIGFuZCB0aGUgcmV1c2FibGUgZGVwbG95IHdvcmtmbG93XG4gIC8vIGF0IG1haW4gcGVyZm9ybXMgbm8gR0lUSFVCX1RPS0VOIHdyaXRlcy4gVGhlIHJlYWQtb25seSBkZWZhdWx0IGlzIGluamVjdGVkIGF0IHRoZSBKT0IgbGV2ZWxcbiAgLy8gKGpvYiBwZXJtaXNzaW9ucyBkbyBub3QgYWZmZWN0IHNpYmxpbmcgam9icywgc28gaW5saW5lIGpvYnMgb3IgcGlubmVkIGNhbGxlZXMg4oCUIHdob3NlIHdyaXRlXG4gIC8vIG5lZWRzIGFyZSB1bmF1ZGl0ZWQg4oCUIGtlZXAgdGhlaXJzKSwgYW5kIG9ubHkgd2hlbiBuZWl0aGVyIHRoZSB3b3JrZmxvdyBub3IgdGhlIGpvYiBkZWNsYXJlc1xuICAvLyBpdHMgb3duIHBlcm1pc3Npb25zIChPSURDIGRlcGxveXMgYWx3YXlzIGRvLCBmb3IgaWQtdG9rZW4pLiBydW4tc2NyaXB0IGNhbGxlcnMgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJlY2F1c2UgYXJiaXRyYXJ5IHBhY2thZ2Ugc2NyaXB0cyBtYXkgcHVzaCBjb21taXRzLlxuICBpZiAoIW5ld1NldHRpbmdzLnBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2IpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2FsbCA9IHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpO1xuICAgICAgaWYgKCFqb2IucGVybWlzc2lvbnMgJiYgY2FsbD8ud29ya2Zsb3dOYW1lID09PSAnZGVwbG95JyAmJiBjYWxsLnJlZiA9PT0gJ21haW4nKSB7XG4gICAgICAgIGpvYi5wZXJtaXNzaW9ucyA9IHsgY29udGVudHM6ICdyZWFkJyB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6XG4gICAgY2FzZSAndGVzdC1ydXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgdGhlIGZvcmNlLXN5bmMgd29ya2Zsb3cgYmFzZWQgb24gdGhlIHN5bmMgd29ya2Zsb3cgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuLy8gd2IncyBnbG9iYWwgb3B0aW9ucyB0aGF0IGNvbnN1bWUgYSBmb2xsb3dpbmcgdmFsdWUgdG9rZW4gKGZyb20gc2hhcmVkT3B0aW9uc0J1aWxkZXIgcGx1c1xuLy8geWFyZ3NPcHRpb25zQnVpbGRlckZvckVudik7IGV2ZXJ5IG90aGVyIGAtYC1wcmVmaXhlZCB0b2tlbiBiZWZvcmUgdGhlIHN1YmNvbW1hbmQgaXMgYSBib29sZWFuLlxuY29uc3Qgd2JHbG9iYWxWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFsnLS13b3JraW5nLWRpcicsICctdycsICctLWVudicsICctLWNhc2NhZGUtZW52J10pO1xuXG4vLyBTdWJjb21tYW5kcyB0aGF0IHJ1biBhIEJJTkFSWSAoc28gdGhlIGZvbGxvd2luZyB0b2tlbiBjYW4gYmUgdGhlIHdiIGV4ZWN1dGFibGUpLCBwZXIgcnVubmVyOiBidW5cbi8vIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYSBwYWNrYWdlIHNjcmlwdCBvZiB0aGF0IG5hbWUpLCBucG0gaGFzIGBleGVjYC9geGAsXG4vLyBhbmQgcG5wbS95YXJuIChCZXJyeSkgaGF2ZSBgZXhlY2AvYGRseGAuXG5jb25zdCBydW5uZXJFeGVjdXRvclN1YmNvbW1hbmRzQnlSdW5uZXI6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHtcbiAgbnBtOiBuZXcgU2V0KFsnZXhlYycsICd4J10pLFxuICBwbnBtOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIHlhcm46IG5ldyBTZXQoWydleGVjJywgJ2RseCddKSxcbiAgYnVuOiBuZXcgU2V0KFsneCddKSxcbn07XG5cbi8vIFJ1bm5lciBvcHRpb25zIHRoYXQgY29uc3VtZSB0aGUgRk9MTE9XSU5HIHRva2VuIGFzIHRoZWlyIHZhbHVlLCBzbyBpdCBpcyBub3QgdGhlIHdiIGV4ZWN1dGFibGVcbi8vIChlLmcuIGBidW4gLS1jd2QgZGlyIHdiIGRlcGxveWAsIGBucHggLXAgcGtnIHdiIGRlcGxveWApLiBBIGNvbnNlcnZhdGl2ZSBzdXBlcnNldCBhY3Jvc3Ncbi8vIG5wbS9wbnBtL3lhcm4vYnVuIGFuZCB0aGUgbnB4L2J1bnggcGFja2FnZSBleGVjdXRvcnMuXG5jb25zdCBydW5uZXJWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgJy0tY3dkJyxcbiAgJy1DJyxcbiAgJy0tcHJlZml4JyxcbiAgJy0tZmlsdGVyJyxcbiAgJy1GJyxcbiAgJy0td29ya3NwYWNlJyxcbiAgJy13JyxcbiAgJy0tZGlyJyxcbiAgJy1wJyxcbiAgJy0tcGFja2FnZScsXG4gICctYycsXG4gICctLWNhbGwnLFxuXSk7XG5cbi8qKiBBZHZhbmNlIHBhc3QgYSBydW5uZXIncyBvcHRpb25zLCBjb25zdW1pbmcgYSBzZXBhcmF0ZSB2YWx1ZSB0b2tlbiB3aGVyZSBvbmUgYXBwbGllcy4gKi9cbmZ1bmN0aW9uIHNraXBSdW5uZXJPcHRpb25zKHRva2Vuczogc3RyaW5nW10sIHN0YXJ0SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgKHRva2Vuc1tpbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgaW5kZXgrKztcbiAgICBpZiAoIW9wdGlvbi5pbmNsdWRlcygnPScpICYmIHJ1bm5lclZhbHVlT3B0aW9ucy5oYXMob3B0aW9uKSAmJiBpbmRleCA8IHRva2Vucy5sZW5ndGgpIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZXBsb3kgc2NyaXB0IGludm9rZXMgYHdiIOKApiBkZXBsb3lgIGF0IGNvbW1hbmQgcG9zaXRpb24uIFBhY2thZ2UgcnVubmVycyBhbmQgZ2xvYmFsIHlhcmdzIG9wdGlvbnNcbiAqICh3aXRoIHRoZWlyIHZhbHVlIHRva2VucykgbWF5IHByZWNlZGUgdGhlIGRlcGxveSBjb21tYW5kLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdDogc3RyaW5nLCBzY3JpcHROYW1lczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBmb3IgKGNvbnN0IHRva2VucyBvZiAoYXdhaXQgcGFyc2VTaGVsbENvbW1hbmRzKGRlcGxveVNjcmlwdCkpID8/IFtdKSB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICAvLyBMZWFkaW5nIGxhdW5jaGVycyBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgZW52YCAod2l0aCBvcHRpb25zICsgS0VZPXZhbHVlIGFzc2lnbm1lbnRzKVxuICAgIC8vIGFuZCB0aGUgUE9TSVggYGNvbW1hbmRgIGJ1aWx0aW4gKHdpdGggaXRzIGAtcGAvYC12YC9gLVZgIG9wdGlvbnMpLiBPdGhlciBsYXVuY2hlcnMgKGB0aW1lYCxcbiAgICAvLyBgZXhlY2AsIOKApikgYXJlIE5PVCBtb2RlbGVkOiB0aGV5IGxlYXZlIGEgbm9uLWB3YmAgZmlyc3QgdG9rZW4sIHNvIHRoZSBjb21tYW5kIHNpbXBseSBkb2VzXG4gICAgLy8gbm90IG1hdGNoLiBUaGlzIGlzIGEgZGVsaWJlcmF0ZSBmYWxzZS1uZWdhdGl2ZSBmb3IgZ2VuZXJhdGVkIGd1aWRhbmNlLlxuICAgIGlmICh0b2tlbnNbaW5kZXhdID09PSAnZW52Jykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgICBpZiAoL15bQS1aYS16X11bQS1aYS16MC05X10qPS91LnRlc3QodG9rZW4pKSBpbmRleCsrO1xuICAgICAgICAvLyBlbnYncyBkaXJlY3RvcnkgdmFsdWUgbWF5IGJlIHNlcGFyYXRlIG9yIGF0dGFjaGVkIChgLUNkaXJgLCBgLS1jaGRpcj1kaXJgKS4gSXQgY2hhbmdlc1xuICAgICAgICAvLyB3aGVyZSB3YiBydW5zIGJ1dCBub3Qgd2hldGhlciB0aGUgY29tbWFuZCBpbnZva2VzIHdiIGRlcGxveS5cbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09ICctQycgfHwgdG9rZW4gPT09ICctLWNoZGlyJykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLUMnKSB8fCB0b2tlbi5zdGFydHNXaXRoKCctLWNoZGlyPScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGlmICh0b2tlbiA9PT0gJy11JykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBgY29tbWFuZCBDTURgIGV4ZWN1dGVzIENNRCwgYnV0IGBjb21tYW5kIC12YC9gLVYgQ01EYCBvbmx5IFFVRVJZIGl0cyBhdmFpbGFiaWxpdHkgd2l0aG91dFxuICAgIC8vIHJ1bm5pbmcgaXQsIHNvIGEgZGVwbG95IGJlaGluZCB0aGVtIGRvZXMgbm90IHJ1bi4gVGhlIGB2YC9gVmAgZmxhZyBtYXkgYmUgY2x1c3RlcmVkIHdpdGhcbiAgICAvLyBvdGhlciBvcHRpb24gbGV0dGVycyAoYGNvbW1hbmQgLXB2IHdiYCksIHNvIG1hdGNoIGFueSBvcHRpb24gbGV0dGVyIGNsdXN0ZXIgY29udGFpbmluZyBpdC5cbiAgICB3aGlsZSAodG9rZW5zW2luZGV4XSA9PT0gJ2NvbW1hbmQnKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgbGV0IHF1ZXJpZXNPbmx5ID0gZmFsc2U7XG4gICAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgaWYgKC9eLVtBLVphLXpdKlt2Vl1bQS1aYS16XSokL3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgcXVlcmllc09ubHkgPSB0cnVlO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHF1ZXJpZXNPbmx5KSB7XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSBjb250aW51ZTtcbiAgICAvLyBSZXNvbHZlIGEgcnVubmVyIHByZWZpeCB0byB3aGV0aGVyIHRoZSBmb2xsb3dpbmcgdG9rZW4gaXMgYSBCSU5BUlkgKHRoZSB3YiBleGVjdXRhYmxlKSBvciBhXG4gICAgLy8gcGFja2FnZSBTQ1JJUFQgbmFtZS4gYGJ1bnhgL2BucHhgIGFuZCBgPHBtPiB4fGRseHxleGVjYCBydW4gYSBiaW5hcnk7IGA8cG0+IHJ1bnxydW4tc2NyaXB0YFxuICAgIC8vIChhbmQgYmFyZSBgbnBtIDxuYW1lPmAsIG9yIGFueSBydW5uZXIgZm9sbG93ZWQgYnkgYC0tYCkgcnVuIGEgcGFja2FnZSBzY3JpcHQg4oCUIHNvXG4gICAgLy8gYG5wbSBydW4gd2IgZGVwbG95YCBleGVjdXRlcyB0aGUgc2NyaXB0IG5hbWVkIGB3YmAsIG5vdCB0aGUgd2IgYmluYXJ5LCBhbmQgbXVzdCBiZSByZWplY3RlZC5cbiAgICBpZiAoWyducG0nLCAncG5wbScsICd5YXJuJywgJ2J1biddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBjb25zdCBydW5uZXIgPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgaW5kZXggPSBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnMsIGluZGV4ICsgMSk7XG4gICAgICBjb25zdCBzdWJjb21tYW5kID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgIGlmIChbJ3J1bicsICdydW4tc2NyaXB0J10uaW5jbHVkZXMoc3ViY29tbWFuZCkpIGNvbnRpbnVlOyAvLyBydW5zIGEgcGFja2FnZSBzY3JpcHQsIG5vdCB3YlxuICAgICAgLy8gRXhlY3V0b3Igc3ViY29tbWFuZHMgYXJlIHJ1bm5lci1TUEVDSUZJQzogYnVuIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYVxuICAgICAgLy8gcGFja2FnZSBzY3JpcHQgbmFtZWQgZGx4L2V4ZWMpLiBSZWFsIGJ1aWx0LWluIGV4ZWN1dG9ycyAoYGV4ZWNgL2B4YCwgYW5kIGBkbHhgIGZvciBwbnBtKVxuICAgICAgLy8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgYSBzYW1lLW5hbWVkIHNjcmlwdCwgc28gdGhleSBhcmUgTk9UIHNoYWRvdy1jaGVja2VkLiBPbmx5IGB5YXJuIGRseGAgaXNcbiAgICAgIC8vIGFtYmlndW91cyDigJQgYSBCZXJyeSBidWlsdC1pbiBidXQgYSBwYWNrYWdlIFNDUklQVCBpbiBZYXJuIENsYXNzaWMg4oCUIHNvIGEgZGVjbGFyZWQgYGRseGBcbiAgICAgIC8vIHNjcmlwdCBtYWtlcyBgeWFybiBkbHhgIGRlY2xpbmUgKGZhbGwgdGhyb3VnaCB0byB0aGUgcGFja2FnZS1zY3JpcHQgY2hlY2tzKS5cbiAgICAgIGNvbnN0IGlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQgPSBydW5uZXIgPT09ICd5YXJuJyAmJiBzdWJjb21tYW5kID09PSAnZGx4JyAmJiBzY3JpcHROYW1lcy5oYXMoJ2RseCcpO1xuICAgICAgaWYgKHJ1bm5lckV4ZWN1dG9yU3ViY29tbWFuZHNCeVJ1bm5lcltydW5uZXJdPy5oYXMoc3ViY29tbWFuZCkgJiYgIWlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQpIHtcbiAgICAgICAgaW5kZXgrKzsgLy8gYmluYXJ5IHJ1bm5lciAocG5wbSBkbHgsIGJ1biB4LCBgbnBtIGV4ZWMgLS0gd2Ig4oCmYClcbiAgICAgICAgaWYgKHRva2Vuc1tpbmRleF0gPT09ICctLScpIGluZGV4Kys7IC8vIHRoZSBleGVjdXRvcidzIG9wdGlvbmFsIGAtLWAgYmVmb3JlIHRoZSBjb21tYW5kXG4gICAgICB9IGVsc2UgaWYgKHJ1bm5lciA9PT0gJ25wbScpIHtcbiAgICAgICAgY29udGludWU7IC8vIGJhcmUgYG5wbSB3YmAgbmV2ZXIgcnVucyBhIGJpbmFyeVxuICAgICAgfSBlbHNlIGlmICh0b2tlbnNbaW5kZXhdID09PSAnd2InICYmIHNjcmlwdE5hbWVzLmhhcygnd2InKSkge1xuICAgICAgICAvLyBCYXJlIGBidW4vcG5wbS95YXJuIHdiYCBydW5zIGEgcGFja2FnZSBTQ1JJUFQgbmFtZWQgYHdiYCB3aGVuIG9uZSBleGlzdHMgKHBhc3NpbmcgYGRlcGxveWBcbiAgICAgICAgLy8gYXMgaXRzIGFyZ3VtZW50KSwgbm90IHRoZSB3YiBiaW5hcnkuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoWydidW54JywgJ25weCddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBpbmRleCA9IHNraXBSdW5uZXJPcHRpb25zKHRva2VucywgaW5kZXggKyAxKTtcbiAgICB9XG4gICAgaWYgKHRva2Vuc1tpbmRleF0gIT09ICd3YicpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHdiQXJncyA9IHRva2Vucy5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIFNraXAgZ2xvYmFsIG9wdGlvbnMgKGFuZCBhbnkgdmFsdWUgdG9rZW4gYSB2YWx1ZS1iZWFyaW5nIG9wdGlvbiBjb25zdW1lcykgc28gdGhlIEZJUlNUXG4gICAgLy8gY29tbWFuZCB0b2tlbiBkZWNpZGVzOiBgd2IgLS1jYXNjYWRlLWVudiBwcm9kdWN0aW9uIGRlcGxveWAgYW5kIGB3YiAtdyBwYWNrYWdlcy9hcGkgZGVwbG95YFxuICAgIC8vIG1hdGNoLCB3aGlsZSBzdWJjb21tYW5kcyBvd25pbmcgdGhlaXIgb3duIGBkZXBsb3lgIChgd2IgcHJpc21hIGRlcGxveWAsIGB3YiByZXRyeSBkZXBsb3lgKVxuICAgIC8vIGRvIG5vdC4gYC0tb3B0PXZhbHVlYCBjYXJyaWVzIGl0cyB2YWx1ZSBpbmxpbmUsIHNvIG9ubHkgdGhlIHNwYWNlLXNlcGFyYXRlZCBmb3JtIHNraXBzIG9uZS5cbiAgICBsZXQgY29tbWFuZEluZGV4ID0gMDtcbiAgICB3aGlsZSAoY29tbWFuZEluZGV4IDwgd2JBcmdzLmxlbmd0aCAmJiAod2JBcmdzW2NvbW1hbmRJbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc3QgZmxhZyA9IHdiQXJnc1tjb21tYW5kSW5kZXhdID8/ICcnO1xuICAgICAgY29tbWFuZEluZGV4Kys7XG4gICAgICBpZiAod2JHbG9iYWxWYWx1ZU9wdGlvbnMuaGFzKGZsYWcpICYmIGNvbW1hbmRJbmRleCA8IHdiQXJncy5sZW5ndGgpIGNvbW1hbmRJbmRleCsrO1xuICAgIH1cbiAgICBpZiAod2JBcmdzW2NvbW1hbmRJbmRleF0gIT09ICdkZXBsb3knKSBjb250aW51ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgd29ya2Zsb3dzIGRpcmVjdG9yeSBob2xkcyBhIGxpdmUgY2FsbGVyIG9mIHRoZSByZXVzYWJsZSBDbG91ZGZsYXJlIGRlcGxveSB3b3JrZmxvdy5cbiAqIFlBTUwgaXMgcGFyc2VkIGFuZCBvbmx5IGBqb2JzLioudXNlc2AgdmFsdWVzIGFyZSBpbnNwZWN0ZWQgKGEgcmF3LXRleHQgc2VhcmNoIHdvdWxkIG1hdGNoXG4gKiBjb21tZW50cyBvciBgcnVuOmAgc3RyaW5ncyksIHdpdGggYSBgZGVwbG95KmAtZmlsZW5hbWUgc2hvcnRjdXQgYW5kIGEgY29uc2VydmF0aXZlIHJhdy10ZXh0XG4gKiBmYWxsYmFjayBmb3IgdW5wYXJzZWFibGUgZmlsZXMuIFVzZWQgYnkgdGhlIGFnZW50LWluc3RydWN0aW9uIGdlbmVyYXRvciBzbyBnZW5lcmF0ZWQgZ3VpZGFuY2VcbiAqIGRlc2NyaWJlcyBvbmx5IHdvcmtmbG93cyB0aGF0IGV4aXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ2xvdWRmbGFyZURlcGxveVdvcmtmbG93KHdvcmtmbG93c0RpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgZW50cmllczogZnMuRGlyZW50W107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENhc2UtaW5zZW5zaXRpdmUgb3duZXIvcmVwb3NpdG9yeSAoR2l0SHViIHRyZWF0cyB0aGVtIHNvKSwgY2FzZS1zZW5zaXRpdmUgcGF0aC9yZWYg4oCUIG1hdGNoaW5nXG4gIC8vIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwsIHVzZWQgZm9yIHRoZSB1bnBhcnNlYWJsZS1ZQU1MIHJhdy10ZXh0IGZhbGxiYWNrIG9ubHkuXG4gIGNvbnN0IGRlcGxveUNhbGxQYXR0ZXJuID0gL1teL10rXFwvcmV1c2FibGUtd29ya2Zsb3dzXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvZGVwbG95XFwueWE/bWxAL2l1O1xuICBjb25zdCBjYWxsc0RlcGxveVdvcmtmbG93ID0gKHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgICBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09ICdkZXBsb3knO1xuICByZXR1cm4gZW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIS9cXC55YT9tbCQvdS50ZXN0KGVudHJ5Lm5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIHJldHVybiB0cnVlO1xuICAgIGxldCBjb250ZW50OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c0RpclBhdGgsIGVudHJ5Lm5hbWUpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh3b3JrZmxvdy5qb2JzKS5zb21lKChqb2IpID0+IGNhbGxzRGVwbG95V29ya2Zsb3coam9iPy51c2VzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGVwbG95Q2FsbFBhdHRlcm4udGVzdChjb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBUaGUgcmV1c2FibGUgd29ya2Zsb3dzIHRoYXQgZGVjbGFyZSBGTk9YX0FHRV9LRVkgYW5kIFZFUkRBQ0NJT19UT0tFTiB1bmRlclxuLy8gb24ud29ya2Zsb3dfY2FsbC5zZWNyZXRzIChzZWUgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzKS4gUGFzc2luZyBlaXRoZXIgc2VjcmV0IHRvIGFueVxuLy8gb3RoZXIgY2FsbGVlIGlzIGEgR2l0SHViIGVycm9yLlxuY29uc3QgaW5zdGFsbENhcGFibGVSZXVzYWJsZVdvcmtmbG93cyA9IG5ldyBTZXQoWydkZXBsb3knLCAncmVsZWFzZScsICdydW4tc2NyaXB0JywgJ3Rlc3QnXSk7XG5jb25zdCByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICAvLyBza2lwLWR1cGxpY2F0ZS1hY3Rpb25zIHJlYWRzIHdvcmtmbG93IHJ1bnM7IGNhbmNlbF9vdGhlcnMgaXMgZmFsc2UsIHNvIHJlYWQgaXMgZW5vdWdoLlxuICAndGVzdC1ydXN0JzogeyBhY3Rpb25zOiAncmVhZCcsIGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgJ3NlbWFudGljLXByJzogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3dyaXRlJyB9LFxufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIC8vIGBzZWNyZXRzOiBpbmhlcml0YCAocGFyc2VkIGJ5IGpzLXlhbWwgYXMgYSBwbGFpbiBzdHJpbmcpIGFscmVhZHkgZm9yd2FyZHMgZXZlcnkgY2FsbGVyIHNlY3JldFxuICAvLyBpbmNsdWRpbmcgdGhlIG9uZXMgaW5qZWN0ZWQgYmVsb3csIHNvIHByZXNlcnZlIGl0IHVudG91Y2hlZCDigJQgcHJvcGVydHkgYXNzaWdubWVudHMgb24gdGhlXG4gIC8vIHN0cmluZyB3b3VsZCB0aHJvdy4gQ2F2ZWF0OiBgaW5oZXJpdGAgZm9yd2FyZHMgc2VjcmV0cyB1bmRlciB0aGVpciBleGlzdGluZyBOQU1FUywgc28gaXQgY2FuXG4gIC8vIG5ldmVyIGZlZWQgUFVCTElDX0ZOT1hfQUdFX0tFWSBpbnRvIHRoZSBjYWxsZWUncyBkZWNsYXJlZCBGTk9YX0FHRV9LRVk7IGEgaGFuZC13cml0dGVuXG4gIC8vIGluaGVyaXQgY2FsbGVyIGluIGEgUFVCTElDIGZub3ggcmVwb3NpdG9yeSBtdXN0IGJlIGNvbnZlcnRlZCB0byBhbiBleHBsaWNpdCBtYXBwaW5nIG1hbnVhbGx5XG4gIC8vICh3YmZ5IG5ldmVyIGdlbmVyYXRlcyB0aGUgaW5oZXJpdCBmb3JtLCBhbmQgaGFuZC13cml0dGVuIGRldmlhdGlvbnMgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbiAgLy8gcmVwb3NpdG9yeSBieSBwb2xpY3kpLlxuICBjb25zdCBzZWNyZXRzID0gam9iLnNlY3JldHMgPT09ICdpbmhlcml0JyA/IHVuZGVmaW5lZCA6IChqb2Iuc2VjcmV0cyA9IGpvYi5zZWNyZXRzID8/IHt9KTtcblxuICBpZiAoc2VjcmV0cyAmJiAoa2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICdyZWxlYXNlJykpIHtcbiAgICBzZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBmbm94LnRvbWwgY2FycmllcyBhZ2UtZW5jcnlwdGVkIGFwcCBzZWNyZXRzOyBDSSBkZWNyeXB0cyB0aGVtIHdpdGggdGhlIEZOT1hfQUdFX0tFWSAob3IsIGZvclxuICAvLyBwdWJsaWMgcmVwb3NpdG9yaWVzLCBQVUJMSUNfRk5PWF9BR0VfS0VZKSBvcmdhbml6YXRpb24gc2VjcmV0LlxuICAvLyBLZXkgdGhlIGluamVjdGlvbiBvbiB0aGUgKmNhbGxlZCogcmV1c2FibGUgd29ya2Zsb3csIG5vdCB0aGUgY2FsbGVyJ3MgZmlsZW5hbWU6IGNhbGxlcnMgbWF5IGhhdmVcbiAgLy8gYXJiaXRyYXJ5IG5hbWVzIChlLmcuIHNjaGVkdWxlZCBydW4tc2NyaXB0IGNhbGxlcnMpLCBhbmQgR2l0SHViIHJlamVjdHMgcGFzc2luZyBhIHNlY3JldCB0aGF0IHRoZVxuICAvLyBjYWxsZWUgZG9lcyBub3QgZGVjbGFyZS5cbiAgLy8gT25seSBhbiBAbWFpbiBjYWxsZWUgaXMga25vd24gdG8gZm9sbG93IHRoZSBjdXJyZW50IHNlY3JldCBjb250cmFjdDogYSB3b3JrZmxvdyBwaW5uZWQgdG8gYW5cbiAgLy8gb2xkZXIgdGFnIG9yIFNIQSBtYXkgc3RpbGwgZGVjbGFyZSBOUE1fVE9LRU4gKGFuZCBub3QgVkVSREFDQ0lPX1RPS0VOKSwgYW5kIEdpdEh1YiByZWplY3RzIGFcbiAgLy8gY2FsbGVyIHdob3NlIHNlY3JldHMgZG8gbm90IG1hdGNoIHRoZSBzZWxlY3RlZCByZXZpc2lvbidzIGRlY2xhcmF0aW9ucywgc28gcGlubmVkIGNhbGxlcnMga2VlcFxuICAvLyB0aGVpciBzZWNyZXRzIHVudG91Y2hlZC5cbiAgY29uc3Qgb3JnV29ya2Zsb3dDYWxsID0gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChqb2IudXNlcyk7XG4gIGNvbnN0IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPSBvcmdXb3JrZmxvd0NhbGw/LnJlZiA9PT0gJ21haW4nID8gb3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVxdWlyZWRQZXJtaXNzaW9ucyA9IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPyByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnNbY2FsbGVkUmV1c2FibGVXb3JrZmxvd10gOiB1bmRlZmluZWQ7XG4gIGlmIChyZXF1aXJlZFBlcm1pc3Npb25zKSBqb2IucGVybWlzc2lvbnMgPSB7IC4uLnJlcXVpcmVkUGVybWlzc2lvbnMgfTtcbiAgaWYgKHNlY3JldHMgJiYgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyAmJiBpbnN0YWxsQ2FwYWJsZVJldXNhYmxlV29ya2Zsb3dzLmhhcyhjYWxsZWRSZXVzYWJsZVdvcmtmbG93KSkge1xuICAgIC8vIFRoZSBjYWxsZWUgcm91dGVzIHB1YmxpYyAoZGVmYXVsdC1yZWdpc3RyeSkgaW5zdGFsbHMgdGhyb3VnaCB0aGUgVGFrdW1pIEd1YXJkXG4gICAgLy8gbWFsaWNpb3VzLXBhY2thZ2UtYmxvY2tpbmcgcHJveHkgd2hlbiB0aGlzIHRva2VuIHJlc29sdmVzOyBhbiB1bnNldCBvcmdhbml6YXRpb24gc2VjcmV0XG4gICAgLy8gZXhwYW5kcyB0byAnJyBhbmQgdGhlIGNhbGxlZSB0cmVhdHMgdGhhdCBhcyBcImZlYXR1cmUgb2ZmXCIsIHNvIHBhc3NpbmcgaXQgaXMgYWx3YXlzIHNhZmUuXG4gICAgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gPSAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JztcbiAgICAvLyBUaGUgY2FsbGVlIGdlbmVyYXRlcyB0aGUgd29ya3NwYWNlIC5ucG1yYyBmb3IgQHdpbGxib29zdGVyLXByaXZhdGUvKiBmcm9tIFZFUkRBQ0NJT19UT0tFTlxuICAgIC8vIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4gT25seSByZXBvc2l0b3JpZXMgdGhhdCBhY3R1YWxseSByZXNvbHZlIHByaXZhdGUgcGFja2FnZXNcbiAgICAvLyAob3IgcHVibGlzaCB0byBWZXJkYWNjaW8pIGdldCB0aGUgcGFzcy10aHJvdWdoOiBldmVyeXdoZXJlIGVsc2UgdGhlIGNyZWRlbnRpYWwgd291bGQgZmxvd1xuICAgIC8vIGludG8gQ0kgcnVucyB0aGF0IG5ldmVyIHVzZSBpdCwgc28gdGhlIGxpbmUgaXMgcmVtb3ZlZCBpbnN0ZWFkLiBUaGUgR2l0SHViIHNlY3JldCBpdHNlbGYgaXNcbiAgICAvLyBhbHdheXMgcmVnaXN0ZXJlZCBtYW51YWxseSBhbmQgc3RheXMgcmVnaXN0ZXJlZCBlaXRoZXIgd2F5LlxuICAgIGlmIChyZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMoY29uZmlnKSkge1xuICAgICAgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gPSAnJHt7IHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOIH19JztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIFB1YmxpYyByZXBvc2l0b3JpZXMgY29tbWl0IHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzLCBzbyB0aGV5IGRlY3J5cHQgd2l0aCBhIGRlZGljYXRlZFxuICAgICAgLy8gQ0kgaWRlbnRpdHkgKHRoZSBQVUJMSUNfRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQpIGluc3RlYWQgb2YgdGhlIG9yZy1pbnRlcm5hbFxuICAgICAgLy8gb25lOyB0aGUgY2FsbGVlIHN0aWxsIHJlY2VpdmVzIGl0IHVuZGVyIGl0cyBkZWNsYXJlZCBGTk9YX0FHRV9LRVkgbmFtZS4gV2hlbiBubyBDSVxuICAgICAgLy8gaWRlbnRpdHkgcmVzb2x2ZXMgKHNlZSBmbm94QWdlS2V5TWFwcGluZyksIGxlYXZlIGFueSBleGlzdGluZyBtYXBwaW5nIHVudG91Y2hlZCBhbmQgYWRkXG4gICAgICAvLyBub25lOiBjcmVhdGluZyBvciByZXdyaXRpbmcgb25lIG9uIGluY29tcGxldGUgaW5mb3JtYXRpb24gd291bGQgbWFwIGEgcG9zc2libHktcHVibGljXG4gICAgICAvLyByZXBvc2l0b3J5IHRvIHRoZSB3cm9uZyBpZGVudGl0eSwgYW5kIGEgZm5veCByZWNpcGllbnQgc3luYyBmYWlsdXJlIGRvZXMgbm90IHN0b3AgdGhpc1xuICAgICAgLy8gZ2VuZXJhdG9yIGZyb20gd3JpdGluZyBmaWxlcyDigJQgdGhlIGZhaWxlZCBydW4ncyByZXJ1biBmaWxscyB0aGUgbWFwcGluZyBpbi5cbiAgICAgIGNvbnN0IG1hcHBpbmcgPSBmbm94QWdlS2V5TWFwcGluZyhjb25maWcpO1xuICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgc2VjcmV0cy5GTk9YX0FHRV9LRVkgPSBtYXBwaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcpIHtcbiAgICBjb25zdCBbcnVzdERpclBhdGhdID0gY29uZmlnLmNhcmdvVG9tbERpclBhdGhzO1xuICAgIGlmIChydXN0RGlyUGF0aCAmJiBydXN0RGlyUGF0aCAhPT0gJy4nKSB7XG4gICAgICBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeSA9IHJ1c3REaXJQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLndpdGgud29ya2luZ19kaXJlY3Rvcnk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVjb25zdHJ1Y3QgZnJvbSB0aGUgcGFyc2VkIGNhbGwgc28gYSBkaWZmZXJlbnRseSBjYXNlZCBvd25lciAoR2l0SHViIGlzIGNhc2UtaW5zZW5zaXRpdmVcbiAgLy8gdGhlcmUpIGlzIGFsc28gbm9ybWFsaXplZCB0byB0aGUgcmVwb3NpdG9yeSdzIG93biBvcmdhbml6YXRpb24gLyBtaXJyb3IuXG4gIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH0gZWxzZSBpZiAob3JnV29ya2Zsb3dDYWxsICYmIGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGBXaWxsQm9vc3RlckxhYi9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvJHtvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lfS4ke29yZ1dvcmtmbG93Q2FsbC5leHRlbnNpb259QCR7b3JnV29ya2Zsb3dDYWxsLnJlZn1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIGNvbnN0IGFjY2VwdHNSdW5uZXJJbnB1dCA9IFsndGVzdCcsICd0ZXN0LXJ1c3QnLCAnZGVwbG95JywgJ3JlbGVhc2UnLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKFxuICAgIG9yZ1dvcmtmbG93Q2FsbD8ud29ya2Zsb3dOYW1lID8/ICcnXG4gICk7XG4gIGlmIChjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWNjZXB0c1J1bm5lcklucHV0KSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIGpvYi53aXRoLnJ1bnNfb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbGFiZWxzID0gelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLnRyYW5zZm9ybSgodmFsdWUsIGN0eCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgdW5rbm93bjtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7IGNvZGU6ICdjdXN0b20nLCBtZXNzYWdlOiAnRXhwZWN0ZWQgSlNPTiBydW5uZXIgbGFiZWxzJyB9KTtcbiAgICAgICAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoei5hcnJheSh6LnN0cmluZygpKSlcbiAgICAgICAgLnNhZmVQYXJzZShqb2Iud2l0aC5ydW5zX29uKTtcbiAgICAgIGlmIChsYWJlbHMuc3VjY2VzcyAmJiBsYWJlbHMuZGF0YS5pbmNsdWRlcygnc2VsZi1ob3N0ZWQnKSkge1xuICAgICAgICBqb2Iud2l0aC5ydW5zX29uID0gSlNPTi5zdHJpbmdpZnkobGFiZWxzLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZW1vdmVkIHJ1bnNfb24gZnJvbSAke2pvYi51c2VzfTogcHJpdmF0ZSByZXBvc2l0b3JpZXMgcmVxdWlyZSBhIHNlbGYtaG9zdGVkIGxhYmVsIGFycmF5LmApO1xuICAgICAgICBkZWxldGUgam9iLndpdGgucnVuc19vbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChzZWNyZXRzKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhzZWNyZXRzKTtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzZWNyZXQgZXhwcmVzc2lvbiB0aGUgY2FsbGVyIG1hcHMgaW50byB0aGUgY2FsbGVlJ3MgZGVjbGFyZWQgRk5PWF9BR0VfS0VZLCBvciB1bmRlZmluZWRcbiAqIHdoZW4gdGhlIHJlcG9zaXRvcnkgc3RhdGUgZG9lcyBub3QgaWRlbnRpZnkgYSB1c2FibGUgQ0kgaWRlbnRpdHkg4oCUIGFuIHVua25vd24gdmlzaWJpbGl0eSwgYVxuICogcmVwb3NpdG9yeSBubyBDSSBzY29wZSBjb3ZlcnMgKGRlcml2aW5nIGZyb20gdGhlIHNhbWUgcHJpbmNpcGFsIHJvc3RlciBhcyB0aGUgcmVjaXBpZW50IHN5bmNcbiAqIGtlZXBzIHRoZSB0d28gZnJvbSBldmVyIGRpc2FncmVlaW5nKSwgb3IgYSBmYWlsZWQgZm5veCByZWNpcGllbnQgc3luYywgd2hvc2UgY2lwaGVydGV4dHMgbWF5XG4gKiBzdGlsbCB0YXJnZXQgdGhlIHByZXZpb3VzIGlkZW50aXR5LiBUaGUgY2FsbGVyIG11c3QgdGhlbiBwcmVzZXJ2ZSBhbnkgZXhpc3RpbmcgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gZm5veEFnZUtleU1hcHBpbmcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duIHx8IGhhc0Zub3hTeW5jRmFpbGVkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShjb25maWcpO1xuICByZXR1cm4gc2VjcmV0TmFtZSAmJiBgXFwke3sgc2VjcmV0cy4ke3NlY3JldE5hbWV9IH19YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBIHBlcm1pc3Npb25zIG9iamVjdCBlbXB0aWVkIGJ5IHRoZSBwZXIta2luZCBkZWxldGlvbnMgKGUuZy4gYW4gZXhpc3RpbmcgdGVzdC1ydXN0IGNhbGxlclxuICAvLyB3aG9zZSBvbmx5IGVudHJ5IHdhcyBgYWN0aW9uc2ApIG11c3QgYmUgZHJvcHBlZCBlbnRpcmVseTogYHBlcm1pc3Npb25zOiB7fWAgc3RyaXBzIEVWRVJZXG4gIC8vIHRva2VuIHBlcm1pc3Npb24gZnJvbSB0aGUgd29ya2Zsb3csIHVubGlrZSB0aGUgYWJzZW50IGtleSB3aGljaCBrZWVwcyB0aGUgZGVmYXVsdHMuXG4gIGlmIChuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyAmJiBPYmplY3Qua2V5cyhuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zO1xuICB9XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJ1bkFsbEluUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZURpclBhdHRlcm5zIH0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICAvLyBmaXhUeXBvcyBydW5zIG9uY2Ugb24gdGhlIHJvb3QgY29uZmlnLCBzbyB0aGlzIGdsb2Igc2V0IG11c3QgY292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlXG4gICAgLy8gbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3Rvcnkg4oCUIHdoaWxlIGhvbm9yaW5nXG4gICAgLy8gZGVjbGFyZWQgbmVnYXRpb25zIChlLmcuIGAhYXBwcy9leGNsdWRlZGApLCB3aG9zZSBzb3VyY2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbW9ub3JlcG8uXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0dGVybnMgPSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhwYWNrYWdlQ29uZmlnKTtcbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuaW5jbHVkZXMubWFwKFxuICAgICAgICAgIChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fWBcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5leGNsdWRlcy5tYXAoKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqYCldLFxuICAgICAgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcnVuQWxsSW5Qb29sKFtcbiAgICAgIC4uLmRvY0ZpbGVzLm1hcCgoZmlsZSkgPT4gZml4RmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSksIGZpeFR5cG9zSW5UZXh0LCBwYWNrYWdlQ29uZmlnLCAnZG9jJykpLFxuICAgICAgLi4udHNGaWxlcy5tYXAoKGZpbGUpID0+IGZpeEZpbGUocGF0aC5qb2luKGRpclBhdGgsIGZpbGUpLCBmaXhUeXBvc0luQ29kZSwgcGFja2FnZUNvbmZpZywgJ3RzJykpLFxuICAgICAgLi4udGV4dEJhc2VkRmlsZXMubWFwKChmaWxlKSA9PiBmaXhGaWxlKHBhdGguam9pbihkaXJQYXRoLCBmaWxlKSwgZml4VHlwb3NJblRleHQsIHBhY2thZ2VDb25maWcsICd0ZXh0JykpLFxuICAgIF0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZml4RmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZml4VHlwb3M6IChjb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0J1xuKTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKGZpeFR5cG9zKGNvbnRlbnQpLCBwYWNrYWdlQ29uZmlnLCBwcm9wTmFtZSk7XG4gICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50XG4gICAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgICAvLyBUaGUgd29yZCBib3VuZGFyeSBhbmQgdHJhaWxpbmctd2hpdGVzcGFjZSBndWFyZCBrZWVwIHdvcmRzIG1lcmVseSBlbmRpbmcgaW4gdGhlXG4gICAgICAvLyBhYmJyZXZpYXRpb24gbGV0dGVycyAoZS5nLiBcImNvb2tpZS5cIiwgXCJsZWcuXCIpIGludGFjdC5cbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnJDEvLyQyY2YuJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJlZ1xcLig/PVxcc3wkKS9nLCAnJDEvLyQyZS5nLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiaWVcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmkuZS4nKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgLy8gVGhlIGRvdCBtdXN0IGJlIGVzY2FwZWQ6IGFuIHVuZXNjYXBlZCBgLmAgbWF0Y2hlcyBBTlkgY2hhcmFjdGVyLCBzbyBgbGVnaXRgIGxvc3QgaXRzIGBsYCBhbmQgYGVgLlxuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC9cXC5naXQkL3UsICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICByZXR1cm4gc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgc3RhdHVzID09PSA0MDQ7XG59XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICAvLyBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHNvIGNyZWRlbnRpYWwgc2VsZWN0aW9uIChhbmQgdGhlIGNhY2hlIGtleSkgbXVzdFxuICAvLyBub3QgZGVwZW5kIG9uIGhvdyBhIHJlbW90ZSBVUkwgaGFwcGVucyB0byBzcGVsbCB0aGUgb3JnYW5pemF0aW9uLlxuICBjb25zdCBrZXkgPSBvd25lcj8udG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG9uIHB1cnBvc2U6IGEgbm9uY2Fub25pY2FsbHkgY2FzZWQgcmVtb3RlIChlLmcuIGdpdGh1Yi5jb20vd2lsbGJvb3N0ZXJsYWIv4oCmKVxuICAvLyBtdXN0IHN0aWxsIHNlbGVjdCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIFBBVCDigJQgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIGJyYW5jaCB3b3VsZFxuICAvLyBwcmVmZXIgdGhlIE9USEVSIG9yZ2FuaXphdGlvbidzIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgdGhpcyBvcmdhbml6YXRpb24ncyBwcml2YXRlXG4gIC8vIHJlcG9zaXRvcmllcy5cbiAgY29uc3Qgbm9ybWFsaXplZE93bmVyID0gb3duZXI/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChub3JtYWxpemVkT3duZXIgPT09ICd3aWxsYm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXJsYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IGFwcGx5RWRpdHMsIGNyZWF0ZVNjYW5uZXIsIGZpbmROb2RlQXRMb2NhdGlvbiwgbW9kaWZ5LCBwYXJzZSBhcyBwYXJzZUpzb25jLCBwYXJzZVRyZWUgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG4vLyBqc29uYy1wYXJzZXIgZGVjbGFyZXMgU3ludGF4S2luZC9TY2FuRXJyb3IgYXMgYW1iaWVudCBjb25zdCBlbnVtcywgd2hpY2ggY2Fubm90IGJlIGltcG9ydGVkXG4vLyB1bmRlciB2ZXJiYXRpbU1vZHVsZVN5bnRheDsgbWlycm9yIHRoZSBuZWVkZWQgbWVtYmVyIHZhbHVlcyBsb2NhbGx5LlxuY29uc3Qgc3ludGF4S2luZCA9IHsgbGluZUNvbW1lbnRUcml2aWE6IDEyLCBibG9ja0NvbW1lbnRUcml2aWE6IDEzLCBsaW5lQnJlYWtUcml2aWE6IDE0LCB0cml2aWE6IDE1LCBlb2Y6IDE3IH07XG5jb25zdCBzY2FuRXJyb3JOb25lID0gMDtcblxuZXhwb3J0IGNvbnN0IGpzb25jVXRpbCA9IHtcbiAgLyoqXG4gICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaG9sZHMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwg4oCUIG9ubHkgd2hpdGVzcGFjZSwgY29tcGxldGUgY29tbWVudHMsXG4gICAqIGFuZC9vciBhIEJPTS4gdHNjIHRyZWF0cyBzdWNoIGEgdHNjb25maWcuanNvbiBhcyBhbiBlbXB0eSBjb25maWcsIHNvIGdlbmVyYXRvcnMgc2hvdWxkIHRyZWF0XG4gICAqIGl0IGxpa2UgYSBtaXNzaW5nIGZpbGUgKGFuZCBnZW5lcmF0ZSBkZWZhdWx0cykgaW5zdGVhZCBvZiByZWZ1c2luZyB0byBtYW5hZ2UgaXQuIExleGljYWxseVxuICAgKiBicm9rZW4gdHJpdmlhIChlLmcuIGFuIHVudGVybWluYXRlZCBibG9jayBjb21tZW50KSBpcyBOT1QgdHJpdmlhLW9ubHk6IHRoZSBmaWxlIG11c3QgYmUgbGVmdFxuICAgKiB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gb3ZlcndyaXR0ZW4gd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGlzVHJpdmlhT25seShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgaWYgKFxuICAgICAgICAoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSB8fFxuICAgICAgICAoa2luZCAhPT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC50cml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmxpbmVCcmVha1RyaXZpYSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUGFyc2VzIGEgSlNPTkMgKEpTT04gd2l0aCBjb21tZW50cykgb2JqZWN0IGZyb20gY29uZmlnIGZpbGVzIHN1Y2ggYXMgdHNjb25maWcuanNvbixcbiAgICogcHlyaWdodGNvbmZpZy5qc29uLCByZW5vdmF0ZS5qc29uLCAudnNjb2RlL3NldHRpbmdzLmpzb24sIGFuZCB3cmFuZ2xlci5qc29uYy5cbiAgICpcbiAgICoganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCByZXR1cm5zIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCwgd2hpY2ggbXVzdFxuICAgKiBub3QgYmUgdHJlYXRlZCBhcyB0aGUgZmlsZSdzIGNvbmZpZ3VyYXRpb247IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IgaW5zdGVhZC4gQSBsZWFkaW5nIEJPTSBpc1xuICAgKiBzdHJpcHBlZCBiZWNhdXNlIFR5cGVTY3JpcHQgYWNjZXB0cyBCT00nZCBjb25maWcgZmlsZXMgd2hpbGUganNvbmMtcGFyc2VyIHJlcG9ydHMgdGhlIEJPTSBhc1xuICAgKiBhIHBhcnNlIGVycm9yLiBDYWxsZXJzIHdob3NlIHJlYWRlciByZWplY3RzIHRyYWlsaW5nIGNvbW1hcyB0dXJuIGBhbGxvd1RyYWlsaW5nQ29tbWFgXG4gICAqIG9mZiBzbyBzdWNoIGEgZmlsZSBpcyByZXBvcnRlZCBhcyBtYWxmb3JtZWQgaGVyZSB0b28uXG4gICAqL1xuICBwYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VCBleHRlbmRzIG9iamVjdD4oY29udGVudDogc3RyaW5nLCBhbGxvd1RyYWlsaW5nQ29tbWEgPSB0cnVlKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VKc29uYyhjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpLCBwYXJzZUVycm9ycywgeyBhbGxvd1RyYWlsaW5nQ29tbWEgfSkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGFyc2VFcnJvcnMubGVuZ3RoID09PSAwICYmICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciB0aGUgY29udGVudCBjYXJyaWVzIGF0IGxlYXN0IG9uZSBjb21tZW50LCBpLmUuIGNvbnRlbnQgSlNPTi5zdHJpbmdpZnkgd291bGQgZHJvcC4gKi9cbiAgY29udGFpbnNDb21tZW50KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykpO1xuICAgIGZvciAobGV0IGtpbmQ6IG51bWJlciA9IHNjYW5uZXIuc2NhbigpOyBraW5kICE9PSBzeW50YXhLaW5kLmVvZjsga2luZCA9IHNjYW5uZXIuc2NhbigpKSB7XG4gICAgICAvLyBBIGxleGljYWwgZXJyb3IgbWVhbnMgdGhlIHJlbWFpbmluZyB0b2tlbnMgYXJlIHVucmVsaWFibGU7IHJlcG9ydCBubyBjb21tZW50IHJhdGhlciB0aGFuXG4gICAgICAvLyBndWVzc2luZy4gQSBjYWxsZXIgdGhhdCBvbmx5IHdhcm5zIGFib3V0IGRyb3BwZWQgY29tbWVudHMgbG9zZXMgbm90aGluZywgYW5kIG9uZSB0aGF0XG4gICAgICAvLyByZWZ1c2VzIGEgY29tbWVudGVkIGZpbGUgZm9yIGEgc3RyaWN0LUpTT04gcmVhZGVyIHN0aWxsIHJlamVjdHMgc3VjaCBjb250ZW50IHdoZW4gaXRcbiAgICAgIC8vIHBhcnNlcyBpdC5cbiAgICAgIGlmICgoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGtpbmQgPT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgfHwga2luZCA9PT0gc3ludGF4S2luZC5ibG9ja0NvbW1lbnRUcml2aWEpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGBzZXR0aW5nc2AgaW50byBgb2xkQ29udGVudGAsIGVkaXRpbmcgb25seSB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzXG4gICAqIGNoYW5nZWQgc28gdGhlIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIG9mIGFuIGV4aXN0aW5nIGZpbGUgc3Vydml2ZS4gQ2FsbGVycyBuZXZlciBkcm9wXG4gICAqIHByb3BlcnRpZXMgKGdlbmVyYXRlZCBzZXR0aW5ncyBhcmUgbWVyZ2VkIE9OIFRPUCBvZiB0aGUgZXhpc3Rpbmcgb25lcyksIHNvIHJlbW92YWxzIGFyZSBub3RcbiAgICogaGFuZGxlZDogYSBwcm9wZXJ0eSBtaXNzaW5nIGZyb20gYHNldHRpbmdzYCBpcyBsZWZ0IHVudG91Y2hlZCByYXRoZXIgdGhhbiBkZWxldGVkLlxuICAgKlxuICAgKiBUcml2aWEtb25seSBjb250ZW50IGtlZXBzIGl0cyBjb21tZW50cyBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdCwgcmF0aGVyIHRoYW5cbiAgICogYmVpbmcgcmVwbGFjZWQgb3V0cmlnaHQgb3IgcnVuIHRocm91Z2ggbW9kaWZ5KCkgKHdoaWNoIHdvdWxkIG1vdmUgdGhlIG9iamVjdCBpbiBmcm9udCBvZiB0aGVtKS5cbiAgICovXG4gIHN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgb2xkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB7IGNvbnRlbnQ6IHN0cmluZzsga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSB9IHtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSwga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2xkQ29udGVudCk7XG4gICAgLy8gRHJvcCBhIGxlYWRpbmcgQk9NOiBtb2RpZnkoKSBpbnNlcnRzIHRoZSBnZW5lcmF0ZWQgb2JqZWN0IEJFRk9SRSBhbnkgbGVhZGluZyB0cml2aWEsIHdoaWNoXG4gICAgLy8gd291bGQgbGVhdmUgdGhlIEJPTSBzdHJhbmRlZCBtaWQtZmlsZSB3aGVyZSBpdCBpcyBhIHN5bnRheCBlcnJvciByYXRoZXIgdGhhbiBhbiBpZ25vcmVkIG1hcmsuXG4gICAgbGV0IGNvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpO1xuICAgIGlmIChqc29uY1V0aWwuaXNUcml2aWFPbmx5KGNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBjb250ZW50LnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IGAke2hlYWRlciA/IGhlYWRlciArICdcXG4nIDogJyd9JHtKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKX1gLFxuICAgICAgICBrZXlzTG9zaW5nQ29tbWVudHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbW9kaWZ5T3B0aW9ucyA9IHsgZm9ybWF0dGluZ09wdGlvbnM6IGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQpIH07XG4gICAgY29uc3Qga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5ld0VudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncykpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkU2V0dGluZ3M/LltrZXldO1xuICAgICAgLy8gQ29tcGFyZSBzZXJpYWxpemVkIGZvcm1zIHNvIGRlZXAtZXF1YWwgdmFsdWVzIChlLmcuIGEgcmUtbWVyZ2VkIGBleHRlbmRzYCBhcnJheSkgZG8gbm90XG4gICAgICAvLyByZXdyaXRlIHRoZSBwcm9wZXJ0eSBhbmQgcmVmbG93IGl0cyBmb3JtYXR0aW5nLlxuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2luZyBhIHdob2xlIGFycmF5IHdvdWxkIGRpc2NhcmQgdGhlIGNvbW1lbnRzIGJldHdlZW4gaXRzIGVsZW1lbnRzLCBzbyBncm93IGl0IHdpdGhcbiAgICAgIC8vIHBlci1lbGVtZW50IGluc2VydGlvbnMgd2hlbmV2ZXIgdGhlIG5ldyB2YWx1ZSBvbmx5IGFkZHMgdG8gaXQuXG4gICAgICBjb25zdCBpbnNlcnRpb25zID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZSwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBpbnNlcnRpb24gb2YgaW5zZXJ0aW9ucyA/PyBbXSkge1xuICAgICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIG1vZGlmeShjb250ZW50LCBba2V5LCBpbnNlcnRpb24uaW5kZXhdLCBpbnNlcnRpb24udmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgaXNBcnJheUluc2VydGlvbjogdHJ1ZSB9KVxuICAgICAgICApO1xuICAgICAgICBjb250ZW50ID0gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50LCBrZXksIGluc2VydGlvbi5pbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zZXJ0aW9ucykgY29udGludWU7XG4gICAgICAvLyBSZXdyaXRpbmcgdGhlIHdob2xlIHZhbHVlIGlzIHRoZSBvbmx5IG9wdGlvbiBsZWZ0ICh0aGUgbmV3IG9uZSBkcm9wcyBvciByZW9yZGVycyBlbGVtZW50cyksXG4gICAgICAvLyBhbmQgaXQgdGFrZXMgYW55IGNvbW1lbnQgbmVzdGVkIGluc2lkZSBpdCBhbG9uZy4gUmVwb3J0IHRoYXQgcmF0aGVyIHRoYW4gbG9zaW5nIGl0IHF1aWV0bHkuXG4gICAgICBjb25zdCByZXBsYWNlZFRleHQgPSB2YWx1ZVRleHRPZihjb250ZW50LCBrZXkpO1xuICAgICAgaWYgKHJlcGxhY2VkVGV4dCAhPT0gdW5kZWZpbmVkICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQocmVwbGFjZWRUZXh0KSkga2V5c0xvc2luZ0NvbW1lbnRzLnB1c2goa2V5KTtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIG1vZGlmeU9wdGlvbnMpKTtcbiAgICB9XG4gICAgLy8gUHJlcGVuZCByYXRoZXIgdGhhbiBhcHBlbmQgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmV3OiBhcHBlbmRpbmcgZGV0YWNoZXMgYSB0cmFpbGluZ1xuICAgIC8vIHNhbWUtbGluZSBjb21tZW50IGZyb20gdGhlIGxhc3QgcHJvcGVydHksIGxlYXZpbmcgaXQgdG8gZGVzY3JpYmUgdGhlIGdlbmVyYXRlZCB2YWx1ZVxuICAgIC8vIGluc3RlYWQuIEluc2VydGluZyBpbiByZXZlcnNlIGtlZXBzIHRoZSBvcmRlciB0aGUgc2V0dGluZ3MgZGVjbGFyZSB0aGVtIGluLlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5ld0VudHJpZXMudG9SZXZlcnNlZCgpKSB7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGdldEluc2VydGlvbkluZGV4OiAoKSA9PiAwIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH07XG4gIH0sXG59O1xuXG4vKiogUmV0dXJucyB0aGUgc291cmNlIHRleHQgb2YgYSB0b3AtbGV2ZWwgcHJvcGVydHkncyB2YWx1ZSwgY29tbWVudHMgYW5kIGFsbC4gKi9cbmZ1bmN0aW9uIHZhbHVlVGV4dE9mKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBub2RlID0gcm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pO1xuICByZXR1cm4gbm9kZSAmJiBjb250ZW50LnNsaWNlKG5vZGUub2Zmc2V0LCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoKTtcbn1cblxuLy8gVGhlIHdob2xlIHNhbWUtbGluZSBjb21tZW50IHNlcXVlbmNlLCBub3QganVzdCB0aGUgZmlyc3Qgb25lOiBhIGxpbmUgY29tbWVudCBlbmRzIGl0IChpdCBydW5zIHRvXG4vLyB0aGUgbmV3bGluZSksIGJ1dCBhbnkgbnVtYmVyIG9mIGJsb2NrIGNvbW1lbnRzIGNhbiBwcmVjZWRlIGl0LCBhbmQgbW92aW5nIG9ubHkgdGhlIGZpcnN0IHdvdWxkXG4vLyBsZWF2ZSB0aGUgcmVzdCBkZXNjcmliaW5nIHRoZSB3cm9uZyBlbGVtZW50LlxuY29uc3QgdHJhaWxpbmdDb21tZW50UGF0dGVybiA9IC9eKD86W15cXFNcXG5dKlxcL1xcKltcXFNcXHNdKj9cXCpcXC8pKig/OlteXFxTXFxuXSpcXC9cXC9bXlxcbl0qKT8vdTtcblxuLyoqXG4gKiBSZWF0dGFjaGVzIGEgc2FtZS1saW5lIGNvbW1lbnQgdG8gdGhlIGVsZW1lbnQgaXQgZGVzY3JpYmVzLiBJbnNlcnRpbmcgaW50byBhbiBhcnJheSBwbGFjZXMgdGhlXG4gKiBuZXcgZWxlbWVudCBCRUZPUkUgdGhlIHRyaXZpYSB0aGF0IGZvbGxvd3MgaXRzIHByZWRlY2Vzc29yLCBzbyBhcHBlbmRpbmcgYWZ0ZXJcbiAqIGB7IC4uLiB9IC8vIHdoeSB0aGlzIHJ1bGUgZXhpc3RzYCBsZWF2ZXMgdGhhdCBjb21tZW50IGV4cGxhaW5pbmcgdGhlIGdlbmVyYXRlZCBlbGVtZW50IGluc3RlYWQuXG4gKiBBIGZyZXNobHkgc2VyaWFsaXplZCBlbGVtZW50IG5ldmVyIGNhcnJpZXMgYSBjb21tZW50IG9mIGl0cyBvd24sIHNvIGFueXRoaW5nIHRyYWlsaW5nIHRoZVxuICogaW5zZXJ0aW9uIGJlbG9uZ2VkIHRvIHRoZSBlbGVtZW50IGJlZm9yZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBpbnNlcnRlZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaW5zZXJ0ZWRJbmRleCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IGVsZW1lbnRzID0gKHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKSk/LmNoaWxkcmVuO1xuICBjb25zdCBpbnNlcnRlZCA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleF07XG4gIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4IC0gMV07XG4gIGlmICghaW5zZXJ0ZWQgfHwgIXByZXZpb3VzKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW5zZXJ0ZWRFbmQgPSBpbnNlcnRlZC5vZmZzZXQgKyBpbnNlcnRlZC5sZW5ndGg7XG4gIGNvbnN0IGNvbW1lbnQgPSB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuLmV4ZWMoY29udGVudC5zbGljZShpbnNlcnRlZEVuZCkpPy5bMF07XG4gIGlmICghY29tbWVudCkgcmV0dXJuIGNvbnRlbnQ7XG4gIC8vIExhbmQgdGhlIGNvbW1lbnQgYWZ0ZXIgdGhlIHNlcGFyYXRpbmcgY29tbWEgc28gdGhlIGVsZW1lbnQga2VlcHMgaXRzIG93biBsaW5lIGludGFjdC5cbiAgY29uc3QgcHJldmlvdXNFbmQgPSBwcmV2aW91cy5vZmZzZXQgKyBwcmV2aW91cy5sZW5ndGg7XG4gIGNvbnN0IHJlc3RvcmVPZmZzZXQgPSBwcmV2aW91c0VuZCArICgvXlxccyosL3UuZXhlYyhjb250ZW50LnNsaWNlKHByZXZpb3VzRW5kKSk/LlswXS5sZW5ndGggPz8gMCk7XG4gIHJldHVybiAoXG4gICAgY29udGVudC5zbGljZSgwLCByZXN0b3JlT2Zmc2V0KSArXG4gICAgY29tbWVudCArXG4gICAgY29udGVudC5zbGljZShyZXN0b3JlT2Zmc2V0LCBpbnNlcnRlZEVuZCkgK1xuICAgIGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQgKyBjb21tZW50Lmxlbmd0aClcbiAgKTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBpbmRlbnRhdGlvbiB0aGUgZmlsZSBhbHJlYWR5IHVzZXMsIHNvIGEgc2VtYW50aWMgY2hhbmdlIGRvZXMgbm90IHJlaW5kZW50IHVucmVsYXRlZFxuICogbGluZXMuIFRoZSBmaXJzdCBwcm9wZXJ0eSBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgaW5kZW50ZWQgbGluZSwgYmVjYXVzZSBhIGRlY29yYXRlZFxuICogYmxvY2sgY29tbWVudCAoYCAqIC4uLmApIHdvdWxkIG90aGVyd2lzZSBwYXNzIGZvciB0aGUgZmlsZSdzIGluZGVudGF0aW9uLiBGYWxscyBiYWNrIHRvIHRoZSB0d29cbiAqIHNwYWNlcyBldmVyeSBnZW5lcmF0ZWQgY29uZmlnIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQ6IHN0cmluZyk6IHsgaW5zZXJ0U3BhY2VzOiBib29sZWFuOyB0YWJTaXplOiBudW1iZXIgfSB7XG4gIGNvbnN0IGZpcnN0UHJvcGVydHkgPSBwYXJzZVRyZWUoY29udGVudCk/LmNoaWxkcmVuPy5bMF07XG4gIGNvbnN0IGluZGVudGF0aW9uID1cbiAgICBmaXJzdFByb3BlcnR5ICYmIGNvbnRlbnQuc2xpY2UoY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpICsgMSwgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpO1xuICBpZiAoIWluZGVudGF0aW9uIHx8ICEvXltcXHQgXSskL3UudGVzdChpbmRlbnRhdGlvbikpIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogMiB9O1xuICBpZiAoaW5kZW50YXRpb24uc3RhcnRzV2l0aCgnXFx0JykpIHJldHVybiB7IGluc2VydFNwYWNlczogZmFsc2UsIHRhYlNpemU6IDEgfTtcbiAgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiBpbmRlbnRhdGlvbi5sZW5ndGggfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBpbnNlcnQgaW50byBgb2xkVmFsdWVgIHRvIHR1cm4gaXQgaW50byBgbmV3VmFsdWVgLCBvciB1bmRlZmluZWQgd2hlblxuICogdGhhdCBpcyBpbXBvc3NpYmxlIGJlY2F1c2UgYG5ld1ZhbHVlYCBkcm9wcyBvciByZW9yZGVycyBhbiBleGlzdGluZyBlbGVtZW50ICh0aGUgY2FsbGVyIG11c3RcbiAqIHRoZW4gcmVwbGFjZSB0aGUgYXJyYXkgd2hvbGVzYWxlKS4gSW5kaWNlcyBhZGRyZXNzIHRoZSBhcnJheSBhcyBpdCBncm93cywgc28gYXBwbHlpbmcgdGhlXG4gKiBpbnNlcnRpb25zIGxlZnQgdG8gcmlnaHQgeWllbGRzIGBuZXdWYWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlOiB1bmtub3duW10sIG5ld1ZhbHVlOiB1bmtub3duW10pOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluc2VydGlvbnM6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdID0gW107XG4gIGxldCBvbGRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgW25ld0luZGV4LCBlbGVtZW50XSBvZiBuZXdWYWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAob2xkSW5kZXggPCBvbGRWYWx1ZS5sZW5ndGggJiYgSlNPTi5zdHJpbmdpZnkob2xkVmFsdWVbb2xkSW5kZXhdKSA9PT0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpIHtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaW5zZXJ0aW9ucy5wdXNoKHsgaW5kZXg6IG5ld0luZGV4LCB2YWx1ZTogZWxlbWVudCB9KTtcbiAgfVxuICByZXR1cm4gb2xkSW5kZXggPT09IG9sZFZhbHVlLmxlbmd0aCA/IGluc2VydGlvbnMgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBSZWNvZ25pemVzIHRoZSBtYW5hZ2VkIGB3YiBnZW4tY29kZWAgc2VnbWVudCwgYSBvbmUtbGV2ZWwgcGFja2FnZS1zY3JpcHQgd3JhcHBlciBhcm91bmQgaXQsIGFuZFxuICogY3VzdG9tIHNlZ21lbnRzIHRoYXQgd2JmeSBsZWF2ZXMgYWxvbmUuXG4gKi9cbnR5cGUgU2NyaXB0U2VnbWVudEtpbmQgPSAnY3VzdG9tJyB8ICdnZW5Db2RlJyB8ICdnZW5Db2RlV3JhcHBlcic7XG5cbmNvbnN0IGdlbkNvZGVTZWdtZW50UGF0dGVybiA9IC9eYnVuXFxzK3diXFxzK2dlbi1jb2RlJC91O1xuXG4vLyBBIHJ1bm5lciBkZWxlZ2F0aW5nIHRvIG9uZSBvZiB0aGlzIHBhY2thZ2UncyBvd24gc2NyaXB0cywgZS5nLiBgYnVuIHJ1biBnZW4tdHlwZXNgLlxuY29uc3Qgc2NyaXB0UnVubmVyUGF0dGVybiA9IC9eYnVuXFxzK3J1blxccysoXFxTKykkL3U7XG5cbi8vIEFueXRoaW5nIHdiZnkncyBgJiZgIHNwbGl0IGNhbm5vdCBtb2RlbCAocGlwZXMsIHNlcXVlbmNpbmcsIHJlZGlyZWN0aW9ucywgcXVvdGluZywgc3Vic3RpdHV0aW9ucywgZGlyZWN0b3J5XG4vLyBjaGFuZ2VzKS4gU2NyaXB0cyBjb250YWluaW5nIGl0IGFyZSBsZWZ0IHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG5jb25zdCB1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybiA9IC9bXFxuO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3U7XG5cbi8qKlxuICogU3BsaXRzIGEgc2NyaXB0IGludG8gYCYmYC1zZXBhcmF0ZWQgc2VnbWVudHMsIG9yIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIHNjcmlwdCB1c2VzIHNoZWxsIHN5bnRheCB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgZG9lcyBub3QgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBpZiAodW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm47XG4gIHJldHVybiBzY3JpcHRcbiAgICAuc3BsaXQoJyYmJylcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTY3JpcHRTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIGZvbGxvd3NXcmFwcGVyID0gdHJ1ZVxuKTogU2NyaXB0U2VnbWVudEtpbmQge1xuICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgaWYgKGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KG5vcm1hbGl6ZWQpKSByZXR1cm4gJ2dlbkNvZGUnO1xuICAvLyBBIG9uZS1sZXZlbCB3cmFwcGVyIGxvb2t1cCBjb3ZlcnMgYFwicG9zdGluc3RhbGxcIjogXCJidW4gcnVuIGdlbi10eXBlc1wiYCwgdGhlIHNoYXBlIHRoZXNlIHJlcG9zaXRvcmllcyB1c2U7XG4gIC8vIGRlZXBlciBjaGFpbnMgc3RheSBjdXN0b20gc28gd2JmeSBjYW5ub3QgbG9vcCBvbiBhIHNlbGYtcmVmZXJlbnRpYWwgc2NyaXB0LlxuICBjb25zdCBzY3JpcHROYW1lID0gZm9sbG93c1dyYXBwZXIgPyBzY3JpcHRSdW5uZXJQYXR0ZXJuLmV4ZWMobm9ybWFsaXplZCk/LlsxXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiAnY3VzdG9tJztcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFNjcmlwdFNlZ21lbnRzKHRhcmdldCk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgc3RpbGwgcGVyZm9ybXMgdGhlIG1hbmFnZWRcbiAgLy8gZ2VuZXJhdGlvbiwgc28gaXQgY291bnRzIGFzIGdlbi1jb2RlOyB0cmVhdGluZyBpdCBhcyBjdXN0b20gd291bGQgYXBwZW5kIGEgc2Vjb25kIGB3YiBnZW4tY29kZWAgYW5kIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuXG4gIGlmIChzZWdtZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIG1hbmFnZWQgZ2VuZXJhdGlvbiBBTkQgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IGlzIHRoZSBpbnN0YWxsLXRpbWUgZW50cnkgcG9pbnQ6IGl0IG11c3QgYmUga2VwdCBhc1xuICAgIC8vIHdyaXR0ZW4uIFJlcGxhY2luZyBpdCB3aXRoIGEgYmFyZSBgd2IgZ2VuLWNvZGVgIHdvdWxkIGRyb3AgdGhvc2Ugc3RlcHM7IGFwcGVuZGluZyBvbmUgd291bGQgcnVuIGV2ZXJ5XG4gICAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICAgIHJldHVybiBzZWdtZW50cz8uc29tZSgoaW5uZXIpID0+IGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KGlubmVyLnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpKSlcbiAgICAgID8gJ2dlbkNvZGVXcmFwcGVyJ1xuICAgICAgOiAnY3VzdG9tJztcbiAgfVxuICByZXR1cm4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnRzWzBdID8/ICcnLCBzY3JpcHRzLCBmYWxzZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZCwgYXJncywgY3dkKVsxXTtcbn1cblxuZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dCA6IHN0ZG91dC50b1N0cmluZygpO1xuICByZXR1cm4gW3Byb2Muc3RhdHVzID8/IDEsIHN0ZG91dFRleHQudHJpbSgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICAvLyBXaGV0aGVyIGlzUHVibGljUmVwbyBjb21lcyBmcm9tIGFuIGFjdHVhbCBHaXRIdWIgQVBJIHJlc3BvbnNlOiBhIGZhaWxlZCBsb29rdXAgKG9mZmxpbmUsXG4gIC8vIHJhdGUtbGltaXRlZCwgYmFkIGNyZWRlbnRpYWwpIGNvbGxhcHNlcyB0byBpc1B1YmxpY1JlcG89ZmFsc2UsIHdoaWNoIHZpc2liaWxpdHktc2Vuc2l0aXZlXG4gIC8vIGdlbmVyYXRvcnMgbXVzdCBub3QgbWlzdGFrZSBmb3IgYSBjb25maXJtZWQgcHJpdmF0ZSByZXBvc2l0b3J5LlxuICBpc1JlcG9WaXNpYmlsaXR5S25vd246IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0Nsb3VkZmxhcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW47XG4gIGlzUmFpbHdheTogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLyoqIERpcmVjdG9yaWVzIGNvbnRhaW5pbmcgQ2FyZ28udG9tbCAocmVsYXRpdmUgdG8gZGlyUGF0aCwgcm9vdC1tb3N0IGZpcnN0KS4gRW1wdHkgaWYgdGhlIHJlcG8gaGFzIG5vIFJ1c3QgY29kZS4gKi9cbiAgY2FyZ29Ub21sRGlyUGF0aHM6IHN0cmluZ1tdO1xuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgUHl0aG9uIGxvY2tmaWxlIChwb2V0cnkubG9jayAvIHV2LmxvY2spIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBNYXZlbiBwb20ueG1sIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUG9tWG1sQW55d2hlcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgU2xpZGV2IGRlY2sgKGAqLnNsaWRldi5tZGApIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluU2xpZGV2TWQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWc6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFJ1bnRpbWU6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHNsaWRldjogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgdGF1cmk6IGJvb2xlYW47XG4gICAgdmluZXh0OiBib29sZWFuO1xuICAgIHZpdGU6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gICAgY2hha3JhOiBib29sZWFuO1xuICAgIGRyaXp6bGU6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBbiBleHBsaWNpdCBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCBwbHVnaW4gZW50cnkgcHVibGlzaGVzIHRoZSByb290IG1hbmlmZXN0IGl0c2VsZlxuICAgICAqIChubyBwa2dSb290IHJlZGlyZWN0aW9uIGFuZCBucG1QdWJsaXNoIG5vdCBkaXNhYmxlZCkuXG4gICAgICovXG4gICAgbnBtUHVibGlzaGVzUm9vdDogYm9vbGVhbjtcbiAgfTtcbiAgbWlzZVRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogVGhlIHNlbWFudGljLXJlbGVhc2UgY29uZmlnIGZpbGVzIHdiZnkgZXhwZWN0cywgaW4gY29zbWljb25maWcncyByZXNvbHV0aW9uIG9yZGVyICh0aGUgbGVhZGluZ1xuICogcGFja2FnZS5qc29uIGVudHJ5IGlzIGNoZWNrZWQgYnkgdGhlIGNhbGxlcikuIHdiZnkgZ2VuZXJhdGVzIC5yZWxlYXNlcmMuanNvbjsgdGhlIG90aGVyIHNwZWxsaW5nc1xuICogYXJlIGxpc3RlZCBvbmx5IHRvIGRldGVjdCBhIGhhbmQtd3JpdHRlbiBjb25maWcsIHdob3NlIGZvcm1hdCBKU09OLnBhcnNlIGNhbm5vdCByZWFkIGFuZCB3aG9zZVxuICogcGx1Z2luIGxpc3QgaXMgdGhlcmVmb3JlIHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZS5cbiAqL1xuY29uc3Qgc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzOiB7IGZpbGVOYW1lOiBzdHJpbmc7IGpzb25QYXJzZWFibGU6IGJvb2xlYW4gfVtdID0gW1xuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYycsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnltbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IGlzUm9vdD86IGJvb2xlYW4gfVxuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gZmFsc2U7XG4gICAgbGV0IHJlbGVhc2VOcG1QbHVnaW5QdWJsaXNoZXNSb290ID0gZmFsc2U7XG4gICAgLy8gVGhlIEZJUlNUIGV4aXN0aW5nIHNlYXJjaCBwbGFjZSB3aW5zIChjb3NtaWNvbmZpZyBzaG9ydC1jaXJjdWl0cyksIHNvIGEgSlMvWUFNTC9UUyBjb25maWdcbiAgICAvLyBvciBhbiBgZXh0ZW5kc2AgcHJlc2V0IG1ha2VzIHRoZSBlZmZlY3RpdmUgcGx1Z2luIGxpc3Qgc3RhdGljYWxseSB1bmluc3BlY3RhYmxlIChtaXJyb3JzXG4gICAgLy8gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyBpbiB3YidzIHJlbGVhc2UudHMpLiBUcmVhdGluZyBpdCBhcyB1bmtub3duIGtlZXBzXG4gICAgLy8gYHJlbGVhc2UubnBtYCBjb25zZXJ2YXRpdmVseSB0cnVlLCBzbyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMgbmV2ZXIgZm9yY2VzXG4gICAgLy8gYHByaXZhdGU6IHRydWVgIG9uIGEgbW9ub3JlcG8gdGhhdCBhY3R1YWxseSBwdWJsaXNoZXMgdG8gbnBtLlxuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdHlwZSBSZWxlYXNlQ29uZmlnID1cbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlcz86IHVua25vd247XG4gICAgICAgICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+XSlbXTtcbiAgICAgICAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAvLyBjb3NtaWNvbmZpZyBzZWFyY2hlcyBwYWNrYWdlLmpzb24ncyBgcmVsZWFzZWAga2V5IEJFRk9SRSBhbnkgcmMvY29uZmlnIGZpbGVcbiAgICAgIC8vIChzZW1hbnRpYy1yZWxlYXNlIDI1IGRlbGVnYXRlcyB0byBjb3NtaWNvbmZpZyA5J3MgZGVmYXVsdCBzZWFyY2hQbGFjZXMpLlxuICAgICAgbGV0IHJlbGVhc2VDb25maWcgPSAocGFja2FnZUpzb24gYXMgeyByZWxlYXNlPzogUmVsZWFzZUNvbmZpZyB9KS5yZWxlYXNlO1xuICAgICAgaWYgKHJlbGVhc2VDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgICAgICBjb25zdCByZWxlYXNlcmNQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVsZWFzZXJjUGF0aCkpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICghanNvblBhcnNlYWJsZSkge1xuICAgICAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBgLnJlbGVhc2VyY2AgYW5kIGAuY29uZmlnL3JlbGVhc2VyY2AgbWF5IGFsc28gaG9sZCBZQU1MOyBhIEpTT04ucGFyc2UgZmFpbHVyZSBsYW5kc1xuICAgICAgICAgIC8vIGluIHRoZSBjYXRjaCBiZWxvdyBhbmQgbWFya3MgdGhlIHBsdWdpbiBsaXN0IHVua25vd24gaW5zdGVhZCBvZiBzaWxlbnRseSByZXBvcnRpbmdcbiAgICAgICAgICAvLyBcIm5vIHBsdWdpbnNcIi5cbiAgICAgICAgICByZWxlYXNlQ29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjUGF0aCwgJ3V0ZjgnKSkgYXMgUmVsZWFzZUNvbmZpZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSBhY2NlcHRzIGEgc2NhbGFyIGJyYW5jaCBvciBicmFuY2ggb2JqZWN0cyAoeyBuYW1lLCBwcmVyZWxlYXNlLCAuLi4gfSk7XG4gICAgICAvLyBub3JtYWxpemUgdG8gcGxhaW4gYnJhbmNoIG5hbWVzIGZvciBjb25zdW1lcnMgc3VjaCBhcyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yLlxuICAgICAgY29uc3QgcmF3QnJhbmNoZXMgPSByZWxlYXNlQ29uZmlnPy5icmFuY2hlcztcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IChBcnJheS5pc0FycmF5KHJhd0JyYW5jaGVzKSA/IHJhd0JyYW5jaGVzIDogcmF3QnJhbmNoZXMgPT09IHVuZGVmaW5lZCA/IFtdIDogW3Jhd0JyYW5jaGVzXSlcbiAgICAgICAgLm1hcCgoYnJhbmNoOiB1bmtub3duKSA9PlxuICAgICAgICAgIHR5cGVvZiBicmFuY2ggPT09ICdzdHJpbmcnID8gYnJhbmNoIDogKGJyYW5jaCBhcyB7IG5hbWU/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5uYW1lXG4gICAgICAgIClcbiAgICAgICAgLmZpbHRlcigoYnJhbmNoTmFtZSk6IGJyYW5jaE5hbWUgaXMgc3RyaW5nID0+IHR5cGVvZiBicmFuY2hOYW1lID09PSAnc3RyaW5nJyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxlYXNlQ29uZmlnPy5wbHVnaW5zKSkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW5FbnRyeSBvZiByZWxlYXNlQ29uZmlnLnBsdWdpbnMpIHtcbiAgICAgICAgICBjb25zdCBbcGx1Z2luTmFtZSwgcGx1Z2luT3B0aW9uc10gPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KSA/IHBsdWdpbkVudHJ5IDogW3BsdWdpbkVudHJ5LCB1bmRlZmluZWRdO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luTmFtZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLnB1c2gocGx1Z2luTmFtZSk7XG4gICAgICAgICAgaWYgKHBsdWdpbk5hbWUgIT09ICdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBXaXRoIHBrZ1Jvb3QgdGhlIHBsdWdpbiBwdWJsaXNoZXMgYW5vdGhlciBtYW5pZmVzdCAoaXQgcmVzb2x2ZXMgcGtnUm9vdCBhZ2FpbnN0IHRoZVxuICAgICAgICAgIC8vIHJlcG8gcm9vdCwgc28gYC5gIGFuZCBgLi9gIGJvdGggbWVhbiB0aGUgcm9vdCBpdHNlbGYpLCBhbmQgbnBtUHVibGlzaDogZmFsc2VcbiAgICAgICAgICAvLyBkaXNhYmxlcyBwdWJsaXNoaW5nIGVudGlyZWx5OyBvbmx5IHRoZSByZW1haW5pbmcgc2hhcGUgcHJvdmVzIHRoZSBST09UIGlzIHB1Ymxpc2hlZC5cbiAgICAgICAgICBjb25zdCBwa2dSb290ID0gcGx1Z2luT3B0aW9ucz8ucGtnUm9vdDtcbiAgICAgICAgICBjb25zdCBwdWJsaXNoZXNSb290ID1cbiAgICAgICAgICAgIHBsdWdpbk9wdGlvbnM/Lm5wbVB1Ymxpc2ggIT09IGZhbHNlICYmXG4gICAgICAgICAgICAocGtnUm9vdCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICh0eXBlb2YgcGtnUm9vdCA9PT0gJ3N0cmluZycgJiYgcGF0aC5yZXNvbHZlKGRpclBhdGgsIHBrZ1Jvb3QpID09PSBwYXRoLnJlc29sdmUoZGlyUGF0aCkpKTtcbiAgICAgICAgICByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCB8fD0gcHVibGlzaGVzUm9vdDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZWxlYXNlQ29uZmlnICYmIHJlbGVhc2VDb25maWcuZXh0ZW5kcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgIH1cbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHBsdWdpbiBsaXN0LCBzZW1hbnRpYy1yZWxlYXNlJ3MgZGVmYXVsdCBsaXN0IGFwcGxpZXMsIHdoaWNoIGluY2x1ZGVzXG4gICAgLy8gQHNlbWFudGljLXJlbGVhc2UvbnBtIGFuZCBAc2VtYW50aWMtcmVsZWFzZS9naXRodWIgKG1pcnJvcnMgcmVsZWFzZVB1Ymxpc2hlc1RvTnBtIGluIHdiJ3NcbiAgICAvLyByZWxlYXNlLnRzKS5cbiAgICBjb25zdCB1c2VzU2VtYW50aWNSZWxlYXNlID0gISEoXG4gICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICk7XG5cbiAgICAvLyBUaGUgY2FsbGVyIG1heSBjbGFzc2lmeSBleHBsaWNpdGx5IChpbmRleC50cyBwYXNzZXMgZmFsc2UgZm9yIGV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlLFxuICAgIC8vIGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKTsgdGhlIGhldXJpc3RpYyBjbGFzc2lmaWVzIHRoZSBDTEkgZW50cnlcbiAgICAvLyBwYXRoIGl0c2VsZiwgc28gYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBhbmQgYHdiZnkgPHJlcG8+L2FwcHMvPGFwcD5gIGtlZXAgdGhlaXIgY2hpbGRcbiAgICAvLyBjbGFzc2lmaWNhdGlvbi5cbiAgICBjb25zdCBpc1Jvb3QgPSBvcHRpb25zPy5pc1Jvb3QgPz8gIWlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGgpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAvLyBGZXRjaCB2aXNpYmlsaXR5IGZvciB0aGUgQ0xJIGVudHJ5IGV2ZW4gd2hlbiBpdCBpcyBhIHdvcmtzcGFjZSBjaGlsZCAoYHdiZnlcbiAgICAvLyA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKTogZ2VuZXJhdG9ycyByZWFkIGlzUHVibGljUmVwbyBmcm9tIHRoZWlyIHJvb3RDb25maWcgcGFyYW1ldGVyLFxuICAgIC8vIHdoaWNoIElTIHRoZSBjaGlsZCBjb25maWcgaW4gdGhhdCBpbnZvY2F0aW9uLCBzbyBhIHN0dWIgYGZhbHNlYCB0aGVyZSB3b3VsZCBkcm9wIHRoZVxuICAgIC8vIHB1YmxpYy1yZXBvIHB1Ymxpc2hDb25maWcgaGFuZGxpbmcuIERpc2NvdmVyZWQgY2hpbGRyZW4gKG9wdGlvbnMuaXNSb290ID09PSBmYWxzZSkgc3RpbGxcbiAgICAvLyBza2lwIHRoZSBmZXRjaCDigJQgdGhleSBpbmhlcml0IHRoZSBlbmNsb3Npbmcgcm9vdCdzIHZpc2liaWxpdHkgdmlhIHJvb3RDb25maWcgaW5zdGVhZC5cbiAgICBpZiAob3B0aW9ucz8uaXNSb290ICE9PSBmYWxzZSkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE9ubHkgdGhlIHJvb3QgZmV0Y2hlcyByZXBvIGluZm8sIGFuZCB0aGF0IGZldGNoIG5lZWRzIG5ldHdvcmsgYW5kIGEgdG9rZW4sIHNvIGlkZW50aXR5LWRlcml2ZWRcbiAgICAvLyBmbGFncyBiZWxvdyB3b3VsZCBvdGhlcndpc2UgYmUgZmFsc2UgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlIGFuZCBmb3IgZXZlcnkgb2ZmbGluZSBvclxuICAgIC8vIHJhdGUtbGltaXRlZCBydW4uIFRoZSBnaXQgcmVtb3RlIGFuc3dlcnMgdGhlIHNhbWUgcXVlc3Rpb24gbG9jYWxseSwgZm9yIGV2ZXJ5IHBhY2thZ2UuXG4gICAgaWYgKCFyZXBvQXV0aG9yIHx8ICFyZXBvTmFtZSkge1xuICAgICAgW3JlcG9BdXRob3IsIHJlcG9OYW1lXSA9IGF3YWl0IHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuICAgIC8vIEJ1aWx0IGZyb20gdGhlIFJFU09MVkVEIGlkZW50aXR5IHNvIHdvcmtzcGFjZSBwYWNrYWdlcyBhbmQgb2ZmbGluZSBydW5zIGFsc28gZ2V0IGl0OyBjb25zdW1lcnMgZGVyaXZlXG4gICAgLy8gdGhlIG93bmVyIGZyb20gdGhpcyBmaWVsZCAoZS5nLiB0byBzZXQgYGF1dGhvcmApLlxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvQXV0aG9yICYmIHJlcG9OYW1lID8gYGdpdGh1Yjoke3JlcG9BdXRob3J9LyR7cmVwb05hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICAvLyBUYXVyaSBvZmZpY2lhbGx5IHN1cHBvcnRzIEpTT04sIEpTT041LCBhbmQgVE9NTCBjb25maWd1cmF0aW9uIGZvcm1hdHMuXG4gICAgY29uc3QgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyA9IFsndGF1cmkuY29uZi5qc29uJywgJ3RhdXJpLmNvbmYuanNvbjUnLCAnVGF1cmkudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NyYy10YXVyaScsIGZpbGVOYW1lKSlcbiAgICApO1xuICAgIC8vIFJvb3QtbGV2ZWwgXCJJblBhY2thZ2VzXCIgc2lnbmFscyBtdXN0IHNlZSBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdFxuICAgIC8vIGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeSwgc28gc2NhbiBlYWNoIGRpc2NvdmVyZWQgd29ya3NwYWNlIGRpcmVjdG9yeS5cbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICB9KTtcbiAgICBjb25zdCBjb250YWluc0FueUluV29ya3NwYWNlcyA9IChwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgICB3b3Jrc3BhY2VTdWJEaXJQYXRocy5zb21lKCh3b3Jrc3BhY2VTdWJEaXJQYXRoKSA9PiBjb250YWluc0FueShwYXR0ZXJuLCB3b3Jrc3BhY2VTdWJEaXJQYXRoKSk7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyA9IGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpO1xuICAgIGNvbnN0IHdvcmtmbG93Q29udGVudHMgPSByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aCk7XG4gICAgY29uc3QgaW1wb3J0c1BsYXl3cmlnaHRBdFJ1bnRpbWUgPSBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoKTtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0eXBlb2YgcmVwb0luZm8/LnByaXZhdGUgPT09ICdib29sZWFuJyxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQ2xvdWRmbGFyZTogZGV0ZWN0Q2xvdWRmbGFyZShwYWNrYWdlSnNvbiwgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZywgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnLFxuICAgICAgaXNSYWlsd2F5OiBkZXRlY3RSYWlsd2F5KGRpclBhdGgsIHBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgsIHJlcG9OYW1lKSxcbiAgICAgIGNhcmdvVG9tbERpclBhdGhzOiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aCksXG4gICAgICAvLyBBbHNvIGhvbm9yIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyBiZXlvbmQgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0cmVhdGluZyBhblxuICAgICAgLy8gYXBwcy8qLW9ubHkgbW9ub3JlcG8gYXMgYSBwbGFpbiBwYWNrYWdlIHdvdWxkIGRlbGV0ZSBpdHMgYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uIGluXG4gICAgICAvLyBnZW5lcmF0ZVBhY2thZ2VKc29uIGFuZCBza2lwIG1vbm9yZXBvLW9ubHkgY29udmVudGlvbnMgc3VjaCBhcyByb290IGBwcml2YXRlOiB0cnVlYC5cbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCkgfHwgd29ya3NwYWNlU3ViRGlyUGF0aHMubGVuZ3RoID4gMCxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIC8vIFJlY3Vyc2l2ZSBsaWtlIGRvZXNDb250YWluSmF2YTogbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yaWVzIGtlZXAgbGFuZ3VhZ2UgZGlyZWN0b3JpZXNcbiAgICAgIC8vIChlLmcuIFB5dGhvbiB0b29saW5nIG9yIE1hdmVuIG1vZHVsZXMpIG91dHNpZGUgdGhlIHJvb3QgYW5kIG91dHNpZGUgZGVjbGFyZWQgd29ya3NwYWNlcy5cbiAgICAgIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBjb250YWluc0FueSgnKiove3BvZXRyeS5sb2NrLHV2LmxvY2t9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBjb250YWluc0FueSgnKiovcG9tLnhtbCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluU2xpZGV2TWQ6IGNvbnRhaW5zQW55KCcqKi8qLnNsaWRldi5tZCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcyhcbiAgICAgICAgJ3NyYy10YXVyaS97dGF1cmkuY29uZi5qc29uLHRhdXJpLmNvbmYuanNvbjUsVGF1cmkudG9tbH0nXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JyksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygnKiovKi5qYXZhJyksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBjaGFrcmE6ICEhZGV2RGVwZW5kZW5jaWVzWydAY2hha3JhLXVpL2NsaSddLFxuICAgICAgICBkcml6emxlOiAhIWRlcGVuZGVuY2llc1snZHJpenpsZS1vcm0nXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZHJpenpsZS1raXQnXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcGxheXdyaWdodFJ1bnRpbWU6IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBzbGlkZXY6ICEhZGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHRhdXJpOlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICAgIHZpbmV4dDogISFkZXBlbmRlbmNpZXMudmluZXh0IHx8ICEhZGV2RGVwZW5kZW5jaWVzLnZpbmV4dCxcbiAgICAgICAgdml0ZTogISFkZXBlbmRlbmNpZXMudml0ZSB8fCAhIWRldkRlcGVuZGVuY2llcy52aXRlLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHx8IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICAgICAgIDogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0XG4gICAgICAgICAgPyByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJykgfHwgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duXG4gICAgICAgICAgOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBucG1QdWJsaXNoZXNSb290OiByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCxcbiAgICAgIH0sXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwgfHxcbiAgICAgIC8vIEEgcmVwb3NpdG9yeSBjYW4gbGVnaXRpbWF0ZWx5IGNvbnRhaW4gb25seSBkb2N1bWVudGF0aW9uLiBJdHMgR2l0IG1ldGFkYXRhIGlzIGVub3VnaCB0b1xuICAgICAgLy8gZXN0YWJsaXNoIHRoYXQgdGhlIENMSSB0YXJnZXQgaXMgYSBwcm9qZWN0IHJvb3Q7IHJlcXVpcmluZyBhIGxhbmd1YWdlIG1hbmlmZXN0IGhlcmUgd291bGRcbiAgICAgIC8vIG1ha2Ugd2JmeSB1bmFibGUgdG8gY3JlYXRlIHRoZSBwYWNrYWdlLmpzb24gdGhhdCBpdCBtYW5hZ2VzIGZvciBzdWNoIHJlcG9zaXRvcmllcy4gQm90aFxuICAgICAgLy8gb3JkaW5hcnkgY2hlY2tvdXRzIChgLmdpdGAgZGlyZWN0b3J5KSBhbmQgd29ya3RyZWVzIChgLmdpdGAgZmlsZSkgc2F0aXNmeSB0aGlzIGNoZWNrLlxuICAgICAgKGNvbmZpZy5pc1Jvb3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXQnKSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB3YmZ5IG1hbmFnZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlIHBhY2thZ2UuIFRoZSBmaWxlIGlzIGdpdGlnbm9yZWQgYW5kIHVudHJhY2tlZFxuICogYmVjYXVzZSB0aGUgYHdiIGdlbi1jb2RlYCBwb3N0aW5zdGFsbCByZWdlbmVyYXRlcyBpdCBvbiBldmVyeSBpbnN0YWxsLCBzbyB0aGUgcGFja2FnZSBoYXMgdG8gb3duIGEgd3JhbmdsZXJcbiAqIGNvbmZpZyAoYHdyYW5nbGVyIHR5cGVzYCBleGl0cyBub24temVybyB3aXRob3V0IG9uZSksIHRvIGRlcGVuZCBvbiB3cmFuZ2xlciAoYSBwYWNrYWdlIGRlcGxveWluZyB2aWEgYVxuICogQ0kgYWN0aW9uIGNhbm5vdCByZXNvbHZlIHRoZSBjb21tYW5kKSwgYW5kIHRvIGNvbnN1bWUgdGhlIGdlbmVyYXRlZCBmaWxlLlxuICpcbiAqIElOVkFSSUFOVCDigJQgdGhpcyBkZWNpc2lvbiBtdXN0IGNvbnZlcmdlIGFjcm9zcyBtYWNoaW5lcyBob2xkaW5nIHRoZSBzYW1lIGNvbW1pdC4gSXQgbXVzdCBORVZFUiBjb25zdWx0XG4gKiBnaXRpZ25vcmVkIGZpbGVzIChgLmRldi52YXJzKmAsIGAuZW52KmAsIC4uLiksIHdoaWNoIGB3YiBzdGFydGAgYW5kIGB3YiBkZXBsb3lgIGNyZWF0ZSByb3V0aW5lbHkgYW5kIHdoaWNoXG4gKiB0aGVyZWZvcmUgc3RheSB1bnRyYWNrZWQgb24gZGV2IG1hY2hpbmVzIGZvcmV2ZXI6IGEgZm9ybWVyIGNoZWNrIHRoYXQgdHJlYXRlZCB0aGVtIGFzIGlycmVwcm9kdWNpYmxlIGlucHV0c1xuICogbWFkZSB3YmZ5IHJ1bnMgb24gZGV2IG1hY2hpbmVzIHJlLXRyYWNrIHRoZSB+MTVrLWxpbmUgZ2VuZXJhdGVkIGZpbGUgdGhhdCBydW5zIGZyb20gY2xlYW4gY2hlY2tvdXRzIGhhZFxuICogdW50cmFja2VkLCBvc2NpbGxhdGluZyBldGVybmFsbHkgKGUuZy4gYWktZ2FtZS1idWlsZGVyICM2ODQg4oaSICM3NDYpLiBSZWFkaW5nIGNvbW1pdHRhYmxlIHJlcG9zaXRvcnkgZmlsZXNcbiAqIGZyb20gdGhlIHdvcmtpbmcgdHJlZSAodGhlIHdyYW5nbGVyIGNvbmZpZywgcGFja2FnZS5qc29uLCB0c2NvbmZpZyDigJQgYXMgZXZlcnkgd2JmeSBnZW5lcmF0b3IgZG9lcykgaXMgZmluZTpcbiAqIGFueSBkaXZlcmdlbmNlIHRoZXJlIGlzIHRyYW5zaWVudCBhbmQgZGlzYXBwZWFycyBvbmNlIHRoZSBmaWxlIGlzIGNvbW1pdHRlZCBvciByZW1vdmVkLlxuICogVGhlIGhhemFyZCB0aGF0IGNoZWNrIGd1YXJkZWQgYWdhaW5zdCBubyBsb25nZXIgZXhpc3RzOiBgd2IgZ2VuLWNvZGVgIHJ1bnMgYHdyYW5nbGVyIHR5cGVzIC0tZW52LWZpbGVgIHdpdGhcbiAqIGEga2V5IHN0dWIgZGVyaXZlZCBzb2xlbHkgZnJvbSB0aGUgY29tbWl0dGVkIGZub3gudG9tbCAoc2VlIHdiJ3Mgd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIpLCBzbyBsb2NhbCBkb3RlbnZcbiAqIGZpbGVzIG5ldmVyIGluZmx1ZW5jZSB0aGUgZ2VuZXJhdGVkIGBFbnZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcgJiYgaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uKSAmJiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAncGFja2FnZUpzb24nPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNjcmlwdHMgPSBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHQpO1xuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSA9IHNlZ21lbnRzPy5zb21lKChzZWdtZW50KSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC9eKD86KD86YnVufGJ1bngpKD86IC0tYnVuKT8oPzogcnVuKT8gKT93YiBnZW4tY29kZSQvdS50ZXN0KG5vcm1hbGl6ZWQpICYmXG4gICAgICAgIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBzY3JpcHRzLCB0cnVlKSA9PT0gJ2N1c3RvbSdcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSkgcmV0dXJuIGAke25hbWV9IG11c3QgdXNlIHRoZSBjYW5vbmljYWwgYnVuIHdiIGdlbi1jb2RlIGNvbW1hbmRgO1xuICB9XG4gIC8vIE9ubHkgYGJ1biBydW4gPHNjcmlwdD5gIGlzIHJlY29nbml6ZWQgYXMgYSB3cmFwcGVyOyBhbm90aGVyIHJ1bm5lciBzcGVsbGluZyB3b3VsZCBnZXQgYSBtYW5hZ2VkXG4gIC8vIGdlbmVyYXRpb24gYXBwZW5kZWQgbmV4dCB0byBpdCBhbmQgcnVuIGV2ZXJ5IGdlbmVyYXRvciB0d2ljZSBwZXIgaW5zdGFsbC4gV2l0aG91dCBhIGdlbi1jb2RlXG4gIC8vIHBpcGVsaW5lIG5vdGhpbmcgaXMgYXBwZW5kZWQsIHNvIHRoZSBzcGVsbGluZyBpcyBpcnJlbGV2YW50IHRoZXJlLlxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnKSA/PyBbXSkge1xuICAgIGNvbnN0IHNjcmlwdE5hbWUgPSAvXig/OmJ1bnxidW54KSg/OlxccystLWJ1bik/KD86XFxzK3J1bik/XFxzKyhcXFMrKSQvdS5leGVjKHNlZ21lbnQpPy5bMV07XG4gICAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICBpZiAoXG4gICAgICB0YXJnZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgc2VnbWVudCAhPT0gYGJ1biBydW4gJHtzY3JpcHROYW1lfWAgJiZcbiAgICAgIChzY3JpcHRzWydnZW4tY29kZSddICE9PSB1bmRlZmluZWQgfHwgdGFyZ2V0LmluY2x1ZGVzKCd3YiBnZW4tY29kZScpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGBwb3N0aW5zdGFsbCBtdXN0IGludm9rZSB0aGUgJHtzY3JpcHROYW1lfSBzY3JpcHQgYXMgYnVuIHJ1biAke3NjcmlwdE5hbWV9YDtcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIC8oPzpefCYmKVxccyooPzpucG18bnB4fHBucG18eWFybilcXHMrKD86cnVuKD86LXNjcmlwdCk/XFxzKyk/KD86Z2VuLWNvZGV8d2JcXHMrZ2VuLWNvZGUpXFxzKig/OiYmfCQpL3UudGVzdChcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPz8gJydcbiAgICApXG4gICkge1xuICAgIHJldHVybiAncG9zdGluc3RhbGwgbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2YgYSBub24tQnVuIGdlbi1jb2RlIHJ1bm5lcic7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChzY3JpcHQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSBidW4gd2IgZ2VuLWNvZGUgaW5zdGVhZCBvZiB3cmFuZ2xlciB0eXBlc2A7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gW1xuICAgIHBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgICBwYWNrYWdlSnNvbj8ub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LnBlZXJEZXBlbmRlbmNpZXMsXG4gIF0uc29tZSgoZGVwZW5kZW5jaWVzKSA9PiBkZXBlbmRlbmNpZXM/LndyYW5nbGVyICE9PSB1bmRlZmluZWQpO1xufVxuXG5jb25zdCBzaGVsbFdvcmRQYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpcIig/OlxcXFwufFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwufFteJ1xcXFxdKSonfCg/OlxcXFwufFteXFxzXCInXFxcXF0pKylgO1xuY29uc3Qgd3JhbmdsZXJPcHRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2BcXHMrLS0/W0EtWmEtel1bXFx3LV0qKD86PSR7c2hlbGxXb3JkUGF0dGVybn18XFxzKyg/IS18dHlwZXNcXGIpJHtzaGVsbFdvcmRQYXR0ZXJufSk/YDtcbmNvbnN0IHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gIFN0cmluZy5yYXdgW1wiJ10/XFxid3JhbmdsZXIoPzpAW15cXHNcIiddKyk/XFxiW1wiJ10/KD86JHt3cmFuZ2xlck9wdGlvblBhdHRlcm59KSpcXHMrdHlwZXNcXGJgLFxuICAndSdcbik7XG5cbi8qKlxuICogQSBwYWNrYWdlIHdob3NlIFR5cGVTY3JpcHQgcHJvamVjdCBjYW5ub3QgaW5jbHVkZSB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIChlLmcuIG9uZSBvbiBhIGhhbmQtbWFpbnRhaW5lZFxuICogbWluaW1hbCBgRW52YCB3aXRoIGB0eXBlczogW1wiYnVuXCJdYCwgdGhlIHN0YW5kYXJkIGVzY2FwZSB3aGVuIHRoZSBhbWJpZW50IHdyYW5nbGVyIGdsb2JhbHMgY29uZmxpY3Qgd2l0aCB0aGVcbiAqIGBAdHlwZXMvYnVuYCBnbG9iYWxzIGl0cyB0ZXN0cyBuZWVkKSBnYWlucyBub3RoaW5nIGZyb20gcmVnZW5lcmF0aW5nIHRoZSB+NTAwS0IgZmlsZSBvbiBldmVyeSBpbnN0YWxsLCBzbyB3YmZ5XG4gKiBsZWF2ZXMgc3VjaCBwYWNrYWdlcyB1bm1hbmFnZWQgaW5zdGVhZCBvZiByZS1hZGRpbmcgdGhlIGdlbmVyYXRpb24gc3RlcC4gQ29uc3VtcHRpb24gaXMgZGV0ZWN0ZWQgdHdvIHdheXM6XG4gKiBhIHRleHR1YWwgYHdvcmtlci1jb25maWd1cmF0aW9uYCByZWZlcmVuY2UgaW4gYW55IHRyYWNrZWQgZmlsZSBvZiB0aGUgcGFja2FnZSAoY292ZXJzIGltcG9ydHMsIHRyaXBsZS1zbGFzaFxuICogcmVmZXJlbmNlcywgYW5kIGV4cGxpY2l0IHRzY29uZmlnIGVudHJpZXMpLCBvciBhIGBmaWxlc2AvYGluY2x1ZGVgL2BleGNsdWRlYCBzZXQgdGhhdCBjYW4gbWF0Y2ggdGhlIGZpbGUg4oCUXG4gKiByZXNvbHZlZCB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnMgd2l0aCBlYWNoIHBhdHRlcm4ga2VwdCByZWxhdGl2ZSB0byB0aGUgY29uZmlnIHRoYXQgZGVjbGFyZWQgaXQsXG4gKiBtYXRjaGluZyB0c2MuIFdoZW5ldmVyIHRoZSBlZmZlY3RpdmUgc2V0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIChtaXNzaW5nIG9yIHVucGFyc2VhYmxlIHRzY29uZmlnLCBwYWNrYWdlLW5hbWVcbiAqIGBleHRlbmRzYCBwcmVzZXRzLCBvciBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiksIHRoZSBjdXJyZW50IG1hbmFnZWQgYmVoYXZpb3IgaXMga2VwdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJz4pOiBib29sZWFuIHtcbiAgLy8gYGdpdCBncmVwYCBzZWFyY2hlcyB0cmFja2VkIGZpbGVzIG9ubHksIHNvIHRoZSBnaXRpZ25vcmVkIGdlbmVyYXRlZCBmaWxlIGl0c2VsZiBuZXZlciBtYXRjaGVzLlxuICAvLyB3YmZ5J3Mgb3duIG1hbmFnZWQgYXJ0aWZhY3RzIGFyZSBleGNsdWRlZDogdGhlIGAuZ2l0aWdub3JlYCBydWxlIChgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNgKVxuICAvLyB3YmZ5IGNvbW1pdHRlZCB3aGlsZSBpdCBtYW5hZ2VkIHRoZSBwYWNrYWdlIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLCBvciBhIG9uY2UtbWFuYWdlZFxuICAvLyBwYWNrYWdlIGNvdWxkIG5ldmVyIG9wdCBvdXQuXG4gIGNvbnN0IGdyZXBSZXN1bHQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ2dpdCcsXG4gICAgLy8gdHNjb25maWcgZmlsZXMgYXJlIGNsYXNzaWZpZWQgYnkgdGhlIHJlc29sdmVkIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSBsb2dpYyBiZWxvdyDigJQgYSB0ZXh0dWFsXG4gICAgLy8gaGl0IHRoZXJlIChlLmcuIGFuIGBleGNsdWRlYCBlbnRyeSkgbXVzdCBub3QgY291bnQgYXMgY29uc3VtcHRpb24uXG4gICAgW1xuICAgICAgJ2dyZXAnLFxuICAgICAgJy1sJyxcbiAgICAgICd3b3JrZXItY29uZmlndXJhdGlvbicsXG4gICAgICAnLS0nLFxuICAgICAgJy4nLFxuICAgICAgJzooZXhjbHVkZSkuZ2l0aWdub3JlJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGF0dHJpYnV0ZXMnLFxuICAgICAgU3RyaW5nLnJhd2A6KGdsb2IsZXhjbHVkZSkqKi90c2NvbmZpZyouanNvbmAsXG4gICAgXSxcbiAgICBjb25maWcuZGlyUGF0aFxuICApO1xuICBpZiAoZ3JlcFJlc3VsdC50cmltKCkpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgY29uc3QgZmlsZVNldCA9IHJlc29sdmVUc2NvbmZpZ0ZpbGVTZXQocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpLCBjb25maWcuZGlyUGF0aCwgNSk7XG4gIGlmICghZmlsZVNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1hdGNoZXMgPSAocGF0dGVyblNldDogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFwYXR0ZXJuU2V0IHx8ICFBcnJheS5pc0FycmF5KHBhdHRlcm5TZXQucGF0dGVybnMpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwYXR0ZXJuU2V0LmJhc2VEaXJQYXRoLCB3b3JrZXJUeXBlc1BhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgIHJldHVybiBwYXR0ZXJuU2V0LnBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIGAke2NvbmZpZ0Rpcn1gLXByZWZpeGVkIHBhdHRlcm5zIHdlcmUgZXhwYW5kZWQgdG8gYWJzb2x1dGUgcGF0aHMgYXQgcmVzb2x2ZSB0aW1lLlxuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgd29ya2VyVHlwZXNQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgICB9XG4gICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuLCByZWxhdGl2ZVBhdGgsIHBhdHRlcm5TZXQuZXhwYW5kc0RpcmVjdG9yaWVzKTtcbiAgICB9KTtcbiAgfTtcbiAgLy8gYGZpbGVzYCBlbnRyaWVzIGFyZSBhbHdheXMgcGFydCBvZiB0aGUgcHJvZ3JhbSwgZXZlbiB3aGVuIGBleGNsdWRlYCBtYXRjaGVzIHRoZW0uXG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZmlsZXMpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG1hdGNoZXMoZmlsZVNldC5leGNsdWRlKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBOZWl0aGVyIGluY2x1ZGUgbm9yIGZpbGVzIGRlY2xhcmVkOiBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiBjb3ZlcnMgdGhlIGZpbGUuXG4gIGlmICghZmlsZVNldC5pbmNsdWRlICYmICFmaWxlU2V0LmZpbGVzKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIG1hdGNoZXMoZmlsZVNldC5pbmNsdWRlKTtcbn1cblxuaW50ZXJmYWNlIFRzY29uZmlnUGF0dGVyblNldCB7XG4gIC8qKiBEaXJlY3Rvcnkgb2YgdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIHRoZSBwYXR0ZXJuczsgdHNjIHJlc29sdmVzIHRoZW0gcmVsYXRpdmUgdG8gaXQuICovXG4gIGJhc2VEaXJQYXRoOiBzdHJpbmc7XG4gIC8qKiBpbmNsdWRlL2V4Y2x1ZGUgdHJlYXQgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBwYXR0ZXJuIGFzIGEgZGlyZWN0b3J5IHN1YnRyZWU7IGBmaWxlc2AgZG9lcyBub3QuICovXG4gIGV4cGFuZHNEaXJlY3RvcmllczogYm9vbGVhbjtcbiAgcGF0dGVybnM6IHVua25vd247XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ0ZpbGVTZXQge1xuICBleGNsdWRlPzogVHNjb25maWdQYXR0ZXJuU2V0O1xuICBmaWxlcz86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgaW5jbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbn1cblxuLyoqIFJlc29sdmVzIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnM7IHVuZGVmaW5lZCB3aGVuIHVucmVhZGFibGUuICovXG5mdW5jdGlvbiByZXNvbHZlVHNjb25maWdGaWxlU2V0KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25zdW1lckRpclBhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nRGVwdGg6IG51bWJlclxuKTogVHNjb25maWdGaWxlU2V0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlbWFpbmluZ0RlcHRoIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCB0c2NvbmZpZyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8e1xuICAgIGV4Y2x1ZGU/OiB1bmtub3duO1xuICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIGZpbGVzPzogdW5rbm93bjtcbiAgICBpbmNsdWRlPzogdW5rbm93bjtcbiAgfT4oY29udGVudCk7XG4gIGlmICghdHNjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICAvLyBgJHtjb25maWdEaXJ9YCByZXNvbHZlcyB0byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBST09UIChjb25zdW1pbmcpIGNvbmZpZywgd2hlcmV2ZXIgaXQgYXBwZWFycy5cbiAgY29uc3QgdG9QYXR0ZXJuU2V0ID0gKHBhdHRlcm5zOiB1bmtub3duLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBUc2NvbmZpZ1BhdHRlcm5TZXQgfCB1bmRlZmluZWQgPT5cbiAgICBBcnJheS5pc0FycmF5KHBhdHRlcm5zKVxuICAgICAgPyB7XG4gICAgICAgICAgYmFzZURpclBhdGg6IGRpclBhdGgsXG4gICAgICAgICAgZXhwYW5kc0RpcmVjdG9yaWVzLFxuICAgICAgICAgIHBhdHRlcm5zOiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+XG4gICAgICAgICAgICB0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycgJiYgcGF0dGVybi5zdGFydHNXaXRoKCcke2NvbmZpZ0Rpcn0nKVxuICAgICAgICAgICAgICA/IHBhdGguam9pbihjb25zdW1lckRpclBhdGgsIHBhdHRlcm4uc2xpY2UoJyR7Y29uZmlnRGlyfScubGVuZ3RoKSlcbiAgICAgICAgICAgICAgOiBwYXR0ZXJuXG4gICAgICAgICAgKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbGVTZXQ6IFRzY29uZmlnRmlsZVNldCA9IHtcbiAgICBleGNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZXhjbHVkZSwgdHJ1ZSksXG4gICAgZmlsZXM6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5maWxlcywgZmFsc2UpLFxuICAgIGluY2x1ZGU6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5pbmNsdWRlLCB0cnVlKSxcbiAgfTtcbiAgY29uc3QgcGFyZW50cyA9XG4gICAgdHlwZW9mIHRzY29uZmlnLmV4dGVuZHMgPT09ICdzdHJpbmcnID8gW3RzY29uZmlnLmV4dGVuZHNdIDogQXJyYXkuaXNBcnJheSh0c2NvbmZpZy5leHRlbmRzKSA/IHRzY29uZmlnLmV4dGVuZHMgOiBbXTtcbiAgLy8gV2l0aCBhbiBgZXh0ZW5kc2AgYXJyYXksIGxhdGVyIGVudHJpZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzLCBhbmQgdGhlIGNoaWxkIG92ZXJyaWRlcyBhbGwg4oCUXG4gIC8vIHNvIGZpbGwgZWFjaCBzdGlsbC1taXNzaW5nIGtleSBmcm9tIHRoZSBsYXN0IHBhcmVudCB0aGF0IGRlZmluZXMgaXQuXG4gIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudHMudG9SZXZlcnNlZCgpKSB7XG4gICAgaWYgKGZpbGVTZXQuZXhjbHVkZSAmJiBmaWxlU2V0LmZpbGVzICYmIGZpbGVTZXQuaW5jbHVkZSkgYnJlYWs7XG4gICAgLy8gUGFja2FnZS1uYW1lIGV4dGVuZHMgKGUuZy4gYEB0c2NvbmZpZy9idW5gKSBhcmUgY29tcGlsZXJPcHRpb25zIHByZXNldHMgd2l0aG91dCBmaWxlIHNldHMuXG4gICAgaWYgKHR5cGVvZiBwYXJlbnQgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnQuc3RhcnRzV2l0aCgnLicpKSBjb250aW51ZTtcbiAgICBsZXQgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwYXJlbnQpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXJlbnRQYXRoKSAmJiBmcy5leGlzdHNTeW5jKGAke3BhcmVudFBhdGh9Lmpzb25gKSkgcGFyZW50UGF0aCArPSAnLmpzb24nO1xuICAgIGNvbnN0IHBhcmVudEZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhcmVudFBhdGgsIGNvbnN1bWVyRGlyUGF0aCwgcmVtYWluaW5nRGVwdGggLSAxKTtcbiAgICBpZiAoIXBhcmVudEZpbGVTZXQpIGNvbnRpbnVlO1xuICAgIGZpbGVTZXQuZXhjbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5leGNsdWRlO1xuICAgIGZpbGVTZXQuZmlsZXMgPz89IHBhcmVudEZpbGVTZXQuZmlsZXM7XG4gICAgZmlsZVNldC5pbmNsdWRlID8/PSBwYXJlbnRGaWxlU2V0LmluY2x1ZGU7XG4gIH1cbiAgcmV0dXJuIGZpbGVTZXQ7XG59XG5cbmZ1bmN0aW9uIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm46IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdHRlcm4ucmVwbGFjZSgvXlxcLlxcLy91LCAnJyk7XG4gIC8vIEEgYmFyZSBgLmAgaW5jbHVkZSBjb3ZlcnMgZXZlcnl0aGluZyB1bmRlciB0aGUgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICBpZiAobm9ybWFsaXplZCA9PT0gJycgfHwgbm9ybWFsaXplZCA9PT0gJy4nKSByZXR1cm4gdHJ1ZTtcbiAgLy8gQWJzb2x1dGUgcGF0dGVybnMgKGV4cGFuZGVkIGAke2NvbmZpZ0Rpcn1gKSBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSB0YXJnZXQ7IGRyb3AgdGhlXG4gIC8vIGxlYWRpbmcgc2xhc2hlcyBmcm9tIGJvdGggc28gdGhlIHNlZ21lbnQtYnVpbHQgcmVnZXggYW5jaG9ycyBpZGVudGljYWxseS5cbiAgdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXlxcLysvdSwgJycpO1xuICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKS5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgIT09ICcnKTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBzZWdtZW50c1xuICAgIC5tYXAoKHNlZ21lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChzZWdtZW50ID09PSAnKionKSByZXR1cm4gaXNMYXN0ID8gJy4qJyA6IFN0cmluZy5yYXdgKD86W14vXSsvKSpgO1xuICAgICAgY29uc3Qgc2VnbWVudFNvdXJjZSA9IHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgU3RyaW5nLnJhd2BbXi9dKmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgU3RyaW5nLnJhd2BbXi9dYCk7XG4gICAgICByZXR1cm4gaXNMYXN0ID8gc2VnbWVudFNvdXJjZSA6IGAke3NlZ21lbnRTb3VyY2V9L2A7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG4gIC8vIHRzYyB0cmVhdHMgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBpbmNsdWRlL2V4Y2x1ZGUgZW50cnkgYXMgYSBkaXJlY3Rvcnkgd2hvc2Ugc3VidHJlZSBpcyBpbmNsdWRlZC5cbiAgY29uc3QgbGFzdFNlZ21lbnQgPSBzZWdtZW50cy5hdCgtMSkgPz8gJyc7XG4gIGNvbnN0IGRpcmVjdG9yeVN1ZmZpeCA9XG4gICAgZXhwYW5kc0RpcmVjdG9yaWVzICYmICEvWyo/XS91LnRlc3QobGFzdFNlZ21lbnQpICYmICFsYXN0U2VnbWVudC5pbmNsdWRlcygnLicpID8gU3RyaW5nLnJhd2AoPzovLiopP2AgOiAnJztcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSR7ZGlyZWN0b3J5U3VmZml4fSRgLCAndScpLnRlc3QodGFyZ2V0UGF0aCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB0aGUgZGlyZWN0b3J5IG93bnMgYSBXb3JrZXIsIHVubGlrZSB0aGUgaXNDbG91ZGZsYXJlIGhldXJpc3RpYywgd2hpY2ggYWxzbyBtYXRjaGVzIGEgcGFja2FnZSB0aGF0XG4gKiBtZXJlbHkgbWVudGlvbnMgd3JhbmdsZXIgaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cgKGUuZy4gdGhlIHJvb3Qgb2YgYSBtb25vcmVwbyB3aG9zZSBXb3JrZXIgbGl2ZXMgaW4gYSBzdWItcGFja2FnZSkuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIGRpclBhdGggYmVsb25ncyB0byB0aGUgd2lsbGJvb3N0ZXItY29uZmlncyByZXBvc2l0b3J5LiBQcmVmZXJzIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBHaXRIdWIgcmVwbyBuYW1lLCB3aGljaCBpcyBpbW11bmUgdG8gdGhlIGxvY2FsIGRpcmVjdG9yeSBsYXlvdXQuIFRoYXQgbmFtZSBpcyBmZXRjaGVkIG9ubHkgZm9yIHRoZVxuICogcm9vdCwgc28gc3ViLXBhY2thZ2VzIChhbmQgb2ZmbGluZSByb290cykgd2FsayB1cCB0byB0aGUgbmVhcmVzdCBnaXQgcm9vdCBhbmQgbWF0Y2ggaXRzIGRpcmVjdG9yeVxuICogbmFtZTogYSBzaWJsaW5nIHJlcG8gY2xvbmVkIHVuZGVyIGEgcGFyZW50IGRpcmVjdG9yeSBuYW1lZCB3aWxsYm9vc3Rlci1jb25maWdzIHN0b3BzIGF0IGl0cyBvd25cbiAqIGAuZ2l0YCwgc28gaXQgaXMgbm90IG1pc2NsYXNzaWZpZWQuIFRoZSBwYXRoIHNlZ21lbnQgcmVtYWlucyBhIGxhc3QgcmVzb3J0IHdoZW4gbm8gZ2l0IHJvb3QgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmIChyZXBvTmFtZSkgcmV0dXJuIHJlcG9OYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgbGV0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBwYXRoLmRpcm5hbWUoY3VycmVudCkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5naXQnKSkpIHtcbiAgICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGN1cnJlbnQpLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgICB9XG4gICAgY3VycmVudCA9IHBhdGguZGlybmFtZShjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gcGFja2FnZUpzb25QYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJy93aWxsYm9vc3Rlci1jb25maWdzLycpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RDbG91ZGZsYXJlKFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW4sXG4gIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIGlmIChzY3JpcHRzICYmIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiBzY3JpcHQuaW5jbHVkZXMoJ3dyYW5nbGVyJykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL2Nsb3VkZmxhcmV8d3JhbmdsZXIvaXUudGVzdChjb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFJhaWx3YXkoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCdyYWlsd2F5JykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3JhaWx3YXkuanNvbicpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5LnRvbWwnKSlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dDb250ZW50cy5zb21lKChjb250ZW50KSA9PiAvcmFpbHdheS9pdS50ZXN0KGNvbnRlbnQpKTtcbn1cblxuLyoqIENvbnRlbnRzIG9mIHRoZSByZWFkYWJsZSAuZ2l0aHViL3dvcmtmbG93cyBZQU1MIGZpbGVzLCByZWFkIG9uY2UgZm9yIGV2ZXJ5IGRldGVjdG9yIG5lZWRpbmcgdGhlbS4gKi9cbmZ1bmN0aW9uIHJlYWRXb3JrZmxvd0ZpbGVDb250ZW50cyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzXG4gICAgICAucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aClcbiAgICAgIC5maWx0ZXIoKGZpbGVOYW1lKSA9PiAvXFwueWE/bWwkL2l1LnRlc3QoZmlsZU5hbWUpKVxuICAgICAgLmZsYXRNYXAoKGZpbGVOYW1lKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIFtmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKV07XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHsgdGFza3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnRhc2tzID8/IHt9KSkge1xuICAgICAgICB0YXNrc1tuYW1lXSA9IHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBvciB0ZW1wb3JhcmlseSBpbnZhbGlkIG1pc2UgZmlsZXMgc2hvdWxkIG5vdCBibG9jayBvdGhlciB3YmZ5IGdlbmVyYXRvcnMuXG4gICAgfVxuICB9XG4gIHJldHVybiB0YXNrcztcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gIC8vIFByZXNlcnZlIGFycmF5LWZvcm0gbWlzZSBjb21tYW5kcyBzbyByZWN1cnNpb24gY2hlY2tzIGNhbiBzdGlsbCBzZWUgcGFja2FnZSBzY3JpcHQgY2FsbHMuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmZpbHRlcigoY29tbWFuZCk6IGNvbW1hbmQgaXMgc3RyaW5nID0+IHR5cGVvZiBjb21tYW5kID09PSAnc3RyaW5nJykuam9pbignXFxuJyk7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSByZXR1cm4gcmVhZE1pc2VUYXNrQ29tbWFuZCgodmFsdWUgYXMgeyBydW4/OiB1bmtub3duIH0pLnJ1bik7XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGRpclBhdGggaXMgYSBjaGlsZCB3b3Jrc3BhY2Ugb2YgYW4gZW5jbG9zaW5nIG1vbm9yZXBvIHJvb3Q6IGVpdGhlciB0aGUgY29udmVudGlvbmFsXG4gKiBgPHJvb3Q+L3BhY2thZ2VzLzxuYW1lPmAgbGF5b3V0LCBvciBhIGRpcmVjdG9yeSBtYXRjaGluZyBhIHdvcmtzcGFjZSBwYXR0ZXJuIGRlY2xhcmVkIGJ5IGFuXG4gKiBhbmNlc3RvciBwYWNrYWdlLmpzb24gKHBhdHRlcm5zIG1heSBiZSBhcmJpdHJhcmlseSBkZWVwLCBlLmcuIGBleGFtcGxlcy8qKmApLiBUaGUgd2FsayBzdG9wc1xuICogYXQgdGhlIGZpcnN0IGdpdCByZXBvc2l0b3J5IGJvdW5kYXJ5IHNvIGFuIHVucmVsYXRlZCBlbmNsb3NpbmcgcmVwb3NpdG9yeSdzIHdvcmtzcGFjZXMgY2FuXG4gKiBuZXZlciByZWNsYXNzaWZ5IGFuIGluZGVwZW5kZW50IHJlcG9zaXRvcnkgYXMgYSBjaGlsZC5cbiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VPZkVuY2xvc2luZ1Jvb3QoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc29sdmVkRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgLy8gQSBkaXJlY3Rvcnkgd2l0aCBpdHMgb3duIC5naXQgaXMgYSByZXBvc2l0b3J5IGluIGl0cyBvd24gcmlnaHQsIG5ldmVyIGEgY2hpbGQgd29ya3NwYWNlIOKAlFxuICAvLyBjaGVja2VkIEZJUlNUIHNvIGFuIGluZGVwZW5kZW50IHJlcG9zaXRvcnkgdW5kZXIgc29tZSBgcGFja2FnZXMvYCBkaXJlY3Rvcnkgc3RheXMgYSByb290LlxuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLi4nKSkgPT09ICdwYWNrYWdlcycgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChcbiAgICBsZXQgY2FuZGlkYXRlUm9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUocmVzb2x2ZWREaXJQYXRoKTtcbiAgICA7XG4gICAgY2FuZGlkYXRlUm9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUoY2FuZGlkYXRlUm9vdERpclBhdGgpXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb290UGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICkgYXMgUGFja2FnZUpzb247XG4gICAgICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCByZXNvbHZlZERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHtcbiAgICAgICAgZGlyUGF0aDogY2FuZGlkYXRlUm9vdERpclBhdGgsXG4gICAgICAgIHBhY2thZ2VKc29uOiByb290UGFja2FnZUpzb24sXG4gICAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBmYWxzZSxcbiAgICAgIH0pLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSk7XG4gICAgICBpZiAod29ya3NwYWNlRGlyUGF0aHMuaW5jbHVkZXMocmVsYXRpdmVEaXJQYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBObyBvciB1bnBhcnNhYmxlIG1hbmlmZXN0IGF0IHRoaXMgYW5jZXN0b3I6IGtlZXAgd2Fsa2luZy5cbiAgICB9XG4gICAgY29uc3QgaXNSZXBvQm91bmRhcnkgPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgJy5naXQnKSk7XG4gICAgY29uc3QgaXNGaWxlc3lzdGVtUm9vdCA9IGNhbmRpZGF0ZVJvb3REaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoY2FuZGlkYXRlUm9vdERpclBhdGgpO1xuICAgIGlmIChpc1JlcG9Cb3VuZGFyeSB8fCBpc0ZpbGVzeXN0ZW1Sb290KSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5mdW5jdGlvbiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gZmdcbiAgICAuZ2xvYlN5bmMoJyoqL0NhcmdvLnRvbWwnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSlcbiAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEuc3BsaXQoJy8nKS5sZW5ndGggLSBiLnNwbGl0KCcvJykubGVuZ3RoIHx8IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFBsYXl3cmlnaHRSdW50aW1lSW1wb3J0KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlcyA9IGZnLmdsb2JTeW5jKCd7YXBwLHNyY30vKiovKi57Y2pzLGN0cyxqcyxqc3gsbWpzLG10cyx0cyx0c3h9Jywge1xuICAgIGRvdDogdHJ1ZSxcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgaWdub3JlOiBbLi4uZ2xvYklnbm9yZSwgJyoqL19fdGVzdHNfXy8qKicsICcqKi8qLnNwZWMuKicsICcqKi8qLnRlc3QuKicsICcqKi9wbGF5d3JpZ2h0LmNvbmZpZy4qJ10sXG4gIH0pO1xuICBjb25zdCBwbGF5d3JpZ2h0SW1wb3J0UGF0dGVybiA9IGJ1aWxkUnVudGltZUltcG9ydFJlZ0V4cCgncGxheXdyaWdodCcpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlKSwgJ3V0ZjgnKTtcbiAgICBpZiAocGxheXdyaWdodEltcG9ydFBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBidWlsZFJ1bnRpbWVJbXBvcnRSZWdFeHAocGFja2FnZU5hbWU6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIC8vIE1hdGNoIHRoZSBiYXJlIHNwZWNpZmllciBvciBhbnkgc3VicGF0aCBvZiBpdCAoYHBrZ2AgLyBgcGtnL3N1YmApLCBidXQgbmV2ZXIgYSBkaWZmZXJlbnQgcGFja2FnZVxuICAvLyB0aGF0IG1lcmVseSBzaGFyZXMgdGhlIHByZWZpeCAoYHBrZy1vdGhlcmApLCBzaW5jZSB0aGUgY2hhciBhZnRlciB0aGUgbmFtZSBtdXN0IGJlIGAvYCBvciBhIHF1b3RlLlxuICBjb25zdCBzcGVjaWZpZXIgPSBTdHJpbmcucmF3YFsnXCJdJHtlc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfSg/Oi9bXidcIl0qKT9bJ1wiXWA7XG4gIHJldHVybiBuZXcgUmVnRXhwKFxuICAgIFN0cmluZy5yYXdgXFxiZnJvbVxccyske3NwZWNpZmllcn18XFxiaW1wb3J0XFxzKlxcKFxccyoke3NwZWNpZmllcn1cXHMqXFwpfFxcYnJlcXVpcmVcXHMqXFwoXFxzKiR7c3BlY2lmaWVyfVxccypcXClgLFxuICAgICd1J1xuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZW1vdGVVcmwgPSBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aCk7XG4gIGlmIChyZW1vdGVVcmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb24uIFRoZSBvd25lciBNVVNUIGJlIHBhc3NlZDogZ2V0T2N0b2tpdCgpIHdpdGhvdXQgaXQgcHJlZmVycyB0aGVcbiAgICAvLyBXaWxsQm9vc3RlciBQQVQsIHdoaWNoIGNhbm5vdCByZWFkIHByaXZhdGUgV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yaWVzLCBjb2xsYXBzaW5nIHRoZWlyXG4gICAgLy8gdmlzaWJpbGl0eSB0byB1bmtub3duIChhbmQgZS5nLiBza2lwcGluZyB0aGUgd2JmeSBjYWxsZXIgZ2VuZXJhdGlvbiBpbmRlZmluaXRlbHkpLlxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChvcmcpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICAvLyBSZS1mZXRjaCB1bmRlciB0aGUgcmVkaXJlY3RlZCBpZGVudGl0eSBzbyBhIHJlbmFtZWQgcmVwb3NpdG9yeSBzdGlsbCBnZXRzIGNvbXBsZXRlXG4gICAgICAvLyBtZXRhZGF0YSAodmlzaWJpbGl0eSBpbmNsdWRlZCkgaW5zdGVhZCBvZiBhIGJhcmUgZnVsbF9uYW1lIHRoYXQgd291bGQgbGVhdmVcbiAgICAgIC8vIGlzUmVwb1Zpc2liaWxpdHlLbm93biBmYWxzZSBvbiBldmVyeSBzdWJzZXF1ZW50IHJ1biB3aXRoIHRoZSBzdGFsZSByZW1vdGUgVVJMLlxuICAgICAgY29uc3QgW3JlZGlyZWN0ZWRPcmcsIHJlZGlyZWN0ZWROYW1lXSA9IHJlZGlyZWN0ZWRGdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlZGlyZWN0ZWRPcmcgJiYgcmVkaXJlY3RlZE5hbWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQocmVkaXJlY3RlZE9yZykucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyOiByZWRpcmVjdGVkT3JnLFxuICAgICAgICAgICAgcmVwbzogcmVkaXJlY3RlZE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgYmFyZSBpZGVudGl0eSBiZWxvdzogdGhlIHJlcG9zaXRvcnkgaXMgc3RpbGwgY2Fub25pY2FsaXplZCwgb25seVxuICAgICAgICAgIC8vIGl0cyB2aXNpYmlsaXR5IHN0YXlzIHVua25vd24uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGZ1bGxfbmFtZTogcmVkaXJlY3RlZEZ1bGxOYW1lIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYDxvcmc+LzxuYW1lPmAgZnJvbSB0aGUgZ2l0IHJlbW90ZSAoZmFsbGluZyBiYWNrIHRvIHBhY2thZ2UuanNvbidzIGByZXBvc2l0b3J5YCkgd2l0aG91dFxuICogY2FsbGluZyB0aGUgR2l0SHViIEFQSS4gSXQgd29ya3MgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlLCBub3QganVzdCB0aGUgcm9vdCDigJQgb25seSB0aGUgcm9vdFxuICogZmV0Y2hlcyByZXBvIGluZm8g4oCUIGFuZCBpdCBrZWVwcyB3b3JraW5nIG9mZmxpbmUgb3IgcmF0ZS1saW1pdGVkLCB3aGVyZSBhbiB1bmRlZmluZWQgaWRlbnRpdHlcbiAqIHdvdWxkIHNpbGVudGx5IHJlY2xhc3NpZnkgdGhlIHJlcG9zaXRvcnkgKGUuZy4gbWFraW5nIHdiZnkgd3JpdGUgd2lsbGJvb3N0ZXItY29uZmlncycgUmVub3ZhdGVcbiAqIHByZXNldCBpbnRvIHRoZSBwcmVzZXQgaXRzZWxmIGFnYWluKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxvY2FsUmVwb0lkZW50aXR5KFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdPiB7XG4gIGNvbnN0IHJlbW90ZVVybCA9IGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoKTtcbiAgaWYgKHJlbW90ZVVybCkge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gcmVhZEdpdEh1YklkZW50aXR5KHJlbW90ZVVybCk7XG4gICAgaWYgKGlkZW50aXR5KSByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gcmVhZEdpdEh1YklkZW50aXR5KHVybCk7XG4gICAgaWYgKGlkZW50aXR5KSByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG59XG5cbmZ1bmN0aW9uIGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2NvbmZpZycsICctLWdldCcsICdyZW1vdGUub3JpZ2luLnVybCddLCBkaXJQYXRoKSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogYGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZWAgaXMgaG9zdC1hZ25vc3RpYywgc28gaXQgaGFwcGlseSB0dXJucyBhIEdpdExhYiBVUkwgaW50byBhbiBgPG9yZz4vPHJlcG8+YCBwYWlyLlxuICogRXZlcnl0aGluZyBkb3duc3RyZWFtIHRyZWF0cyB0aGUgcmVzdWx0aW5nIGlkZW50aXR5IGFzIEdpdEh1YiAodGhlIGBnaXRodWI6YCByZXBvc2l0b3J5IGZpZWxkIGlzIHJld3JpdHRlblxuICogaW50byBwYWNrYWdlLmpzb24pLCBzbyB0aGUgaG9zdCBtdXN0IGJlIHZlcmlmaWVkIGZpcnN0OyBhIG5vbi1HaXRIdWIgcmVtb3RlIHlpZWxkcyBubyBpZGVudGl0eSwgYXMgYmVmb3JlLlxuICovXG5mdW5jdGlvbiByZWFkR2l0SHViSWRlbnRpdHkodXJsOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0YXJnZXRzR2l0SHViKHVybCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybCk7XG4gIHJldHVybiBvcmcgJiYgbmFtZSA/IFtjYW5vbmljYWxpemVPd25lcihvcmcpLCBuYW1lXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBVUkwncyBIT1NUIGlzIGdpdGh1Yi5jb20uIFBhcnNlZCByYXRoZXIgdGhhbiBzdWJzdHJpbmctbWF0Y2hlZDogYSBwYXRoIHN1Y2ggYXNcbiAqIGBodHRwczovL2dpdGxhYi5jb20vZ2l0aHViLmNvbS9vd25lci9yZXBvLmdpdGAgd291bGQgb3RoZXJ3aXNlIGJlIHRha2VuIGZvciBHaXRIdWIsIGFuZCBhbiB1cHBlcmNhc2VcbiAqIGBHSVRIVUIuQ09NYCB3b3VsZCBiZSByZWplY3RlZC4gYGdpdGh1Yjpvd25lci9yZXBvYCBpcyBucG0ncyBzaG9ydGhhbmQgYW5kIG5hbWVzIG5vIGhvc3QsIHNvIGl0IGlzXG4gKiByZWNvZ25pemVkIHNlcGFyYXRlbHk7IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiBhY2NlcHRzIHRoZSBzYW1lIHNob3J0aGFuZC5cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0c0dpdEh1Yih1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoL15naXRodWI6L2l1LnRlc3QodXJsKSkgcmV0dXJuIHRydWU7XG4gIC8vIHNjcC1zdHlsZSByZW1vdGVzIChgZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwby5naXRgKSBhcmUgbm90IHZhbGlkIFVSTHMuXG4gIGNvbnN0IHNjcEhvc3QgPSAvXlteL0BdKkAoW146L10rKTovdS5leGVjKHVybCk/LlsxXTtcbiAgaWYgKHNjcEhvc3QpIHJldHVybiBzY3BIb3N0LnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJztcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwucmVwbGFjZSgvXmdpdFxcKy91LCAnJykpLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogR2l0SHViIG93bmVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgYSByZW1vdGUgb3IgbWFuaWZlc3QgVVJMIG1heSBzcGVsbCB0aGVtIGFueSB3YXksIGJ1dCB0aGUgQVBJJ3NcbiAqIGBmdWxsX25hbWVgIGFsd2F5cyByZXR1cm5lZCB0aGUgY2Fub25pY2FsIHNwZWxsaW5nIOKAlCB3aGljaCB0aGUgbWFueSBleGFjdCBgPT09ICdXaWxsQm9vc3RlcidgIHBvbGljeSBjaGVja3NcbiAqIChvcmdhbml6YXRpb24gd29ya2Zsb3dzLCBhdXRob3IgbWV0YWRhdGEsIHRoZSBXaWxsQm9vc3RlckxhYiBwcmUtcHVzaCBndWFyZCkgZGVwZW5kIG9uLiBDYW5vbmljYWxpemUgaGVyZSBzb1xuICogdGhlIGxvY2FsIGZhbGxiYWNrIHlpZWxkcyB0aGUgc2FtZSBpZGVudGl0eSB0aGUgQVBJIGRpZCwgaW5zdGVhZCBvZiBzaWxlbnRseSBza2lwcGluZyB0aG9zZSBwb2xpY2llcy5cbiAqL1xuZnVuY3Rpb24gY2Fub25pY2FsaXplT3duZXIob3duZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhbm9uaWNhbE93bmVycyA9IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXTtcbiAgcmV0dXJuIGNhbm9uaWNhbE93bmVycy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50b0xvd2VyQ2FzZSgpID09PSBvd25lci50b0xvd2VyQ2FzZSgpKSA/PyBvd25lcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IElTU1VFX1RFTVBMQVRFX1JVTEVTLCBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUywgVEVTVF9XUklUSU5HX1JVTEVTIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJ1bkFsbEluUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3csIGludm9rZXNXYkRlcGxveSB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBkZXBsb3lTY3JpcHRSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhbGxDb25maWdzLm1hcChhc3luYyAoY29uZmlnKSA9PiB7XG4gICAgICAgIGNvbnN0IHNjcmlwdHMgPSBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gICAgICAgIGNvbnN0IGRlcGxveVNjcmlwdCA9IHNjcmlwdHNbJ2RlcGxveSddO1xuICAgICAgICByZXR1cm4gdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiYgKGF3YWl0IGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQsIG5ldyBTZXQoT2JqZWN0LmtleXMoc2NyaXB0cykpKSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgdXNlc1diRGVwbG95ID0gZGVwbG95U2NyaXB0UmVzdWx0cy5pbmNsdWRlcyh0cnVlKTtcblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCB1c2VzV2JEZXBsb3ksIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcnVuQWxsSW5Qb29sKFtcbiAgICAgIC4uLihcbiAgICAgICAgW1xuICAgICAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgICAgICBdIGFzIGNvbnN0XG4gICAgICApLm1hcCgoW2ZpbGVOYW1lLCB0b29sTmFtZV0pID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgdXNlc1diRGVwbG95LCBleHRyYUNvbnRlbnQpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgICAgcmV0dXJuICgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgICAgfSksXG4gICAgICAoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSxcbiAgICBdKTtcbiAgfSk7XG59XG5cbmNvbnN0IGFnZW50c0V4dHJhQ29udGVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuLyoqXG4gKiBSZWFkcyB0aGUgcm9vdCdzIHVzZXItYXV0aG9yZWQgQUdFTlRTX0VYVFJBLm1kIG9uY2UgcGVyIHByb2Nlc3M6IHdiZnkgbmV2ZXIgcmV3cml0ZXMgdGhlIGZpbGUsXG4gKiBhbmQgYm90aCB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gYW5kIEdlbWluaSBnZW5lcmF0b3JzIG5lZWQgaXRzIGNvbnRlbnQuIENhY2hpbmcgdGhlIHJlc29sdmVkXG4gKiB2YWx1ZSAobm90IHRoZSBQcm9taXNlKSBpcyByYWNlLWZyZWUgYmVjYXVzZSB0aGUgdHdvIGNhbGxlcnMgcnVuIHNlcXVlbnRpYWxseSBpbiBpbmRleC50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICBpZiAoIWFnZW50c0V4dHJhQ29udGVudENhY2hlLmhhcyhhZ2VudHNFeHRyYVBhdGgpKSB7XG4gICAgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuc2V0KGFnZW50c0V4dHJhUGF0aCwgYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoYWdlbnRzRXh0cmFQYXRoKSk7XG4gIH1cbiAgcmV0dXJuIGFnZW50c0V4dHJhQ29udGVudENhY2hlLmdldChhZ2VudHNFeHRyYVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdXNlc1diRGVwbG95OiBib29sZWFuLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCB1c2VzV2JEZXBsb3ksIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIHVzZXNXYkRlcGxveTogYm9vbGVhbixcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9ICdidW4nO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9uO1xuICBjb25zdCBmbm94SW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSlcbiAgICA/IGBcXG4tIEVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBsaXZlIGluIFxcYGZub3gudG9tbFxcYCAobWlzZSArIGZub3gpOyBuZXZlciBjcmVhdGUgXFxgLmVudlxcYCwgXFxgLmVudi4qXFxgLCBvciBcXGAuZGV2LnZhcnNcXGAgZmlsZXMuIFJ1biBjb21tYW5kcyB0aHJvdWdoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIC4uLlxcYCBvciBcXGBmbm94IHJ1biAtUCA8cHJvZmlsZT4gLS0gPGNvbW1hbmQ+XFxgLiBQcm9maWxlIHNlY3JldHMgbG9hZCBvbmx5IHdoZW4gYSBwcm9maWxlIGlzIHNlbGVjdGVkOiBtb2RlLWF3YXJlIHdiIGNvbW1hbmRzIChlLmcuIFxcYHdiIHN0YXJ0XFxgLCBcXGB3YiB0ZXN0XFxgKSBhbmQgXFxgd2IgZG90ZW52XFxgIHNlbGVjdCBpdCB0aGVtc2VsdmVzIChcXGB3YiBkb3RlbnZcXGAgdXNlcyBcXGBXQl9FTlZcXGAsIGVsc2UgXFxgRk5PWF9QUk9GSUxFXFxgLCBlbHNlIFxcYE5PREVfRU5WXFxgLCBlbHNlIHRoZSBkZXZlbG9wbWVudCBwcm9maWxlOyBcXGBXQl9FTlZcXGAgYWNjZXB0cyBvbmx5IFxcYGRldmVsb3BtZW50XFxgL1xcYHRlc3RcXGAvXFxgc3RhZ2luZ1xcYC9cXGBwcm9kdWN0aW9uXFxgLCBzbyB1c2UgXFxgRk5PWF9QUk9GSUxFXFxgIGZvciBhbnkgb3RoZXIgcHJvZmlsZSksIHdoaWxlIGJhcmUgXFxgZm5veCBydW5cXGAgbmVlZHMgYW4gZXhwbGljaXQgXFxgLVAgPHByb2ZpbGU+XFxgLmBcbiAgICA6ICcnO1xuICAvLyBtaXNlIG93bnMgdGhlIHBpbm5lZCB0b29sIHZlcnNpb25zLCBzbyBhIHZlcnNpb24gbWlzbWF0Y2ggaXMgZml4ZWQgYnkgZWRpdGluZyBtaXNlLnRvbWwg4oCUIG5vdFxuICAvLyBieSBpbnN0YWxsaW5nIGEgZGlmZmVyZW50IHZlcnNpb24gZ2xvYmFsbHksIHdoaWNoIHRoZSBuZXh0IGBtaXNlIGluc3RhbGxgIHNpbGVudGx5IG92ZXJyaWRlcy5cbiAgY29uc3QgbWlzZUluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJykpXG4gICAgPyAnXFxuLSBUb29sIHZlcnNpb25zIChlLmcuLCBub2RlKSBhcmUgcGlubmVkIGluIGBtaXNlLnRvbWxgOyBydW4gYG1pc2UgaW5zdGFsbGAgYWZ0ZXIgY2hhbmdpbmcgaXQgYW5kIG5ldmVyIGluc3RhbGwgdGhvc2UgdG9vbHMgZ2xvYmFsbHkgaW5zdGVhZC4nXG4gICAgOiAnJztcbiAgLy8gSXNvbGF0ZWQgaW5zdGFsbHMgYXJlIHRoZSBvcmcgc3RhbmRhcmQgKHdiZnkgZ2VuZXJhdGVzIG5vIG90aGVyIGxpbmtlcikgYW5kIHRoZSBtb3N0XG4gIC8vIGFnZW50LWhvc3RpbGUgcGFydCBvZiB0aGUgc3RhY2s6IGEgcGFja2FnZSB0aGF0IGlzIG9ubHkgcmVhY2hhYmxlIGJlY2F1c2UgYSBkZXBlbmRlbmN5IGhvaXN0ZWRcbiAgLy8gaXQgbm8gbG9uZ2VyIHJlc29sdmVzLCBhbmQgdGhlIHJlZmxleCBmaXggKHN3aXRjaGluZyB0aGUgbGlua2VyIGJhY2spIHNpbGVudGx5IHJlaW50cm9kdWNlc1xuICAvLyB0aGUgcGhhbnRvbSBkZXBlbmRlbmNpZXMgdGhlIGxheW91dCBleGlzdHMgdG8gY2F0Y2guXG4gIGNvbnN0IGlzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9uID0gYFxcbi0gXFxgYnVuZmlnLnRvbWxcXGAgdXNlcyBCdW4ncyBpc29sYXRlZCBsaW5rZXIsIHNvIG9ubHkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIHJlc29sdmUuIElmIGFuIGltcG9ydCBmYWlscyB0byByZXNvbHZlLCBkZWNsYXJlIHRoYXQgcGFja2FnZSBpbiB0aGUgXFxgcGFja2FnZS5qc29uXFxgIHRoYXQgaW1wb3J0cyBpdDsgbmV2ZXIgc3dpdGNoIFxcYGxpbmtlclxcYCB0byBcXGBob2lzdGVkXFxgIG9yIGFkZCB0byBcXGBwdWJsaWNIb2lzdFBhdHRlcm5cXGAgdG8gd29yayBhcm91bmQgaXQuYDtcbiAgLy8gRXZlcnkgY2xhdXNlIHN0YXRlcyBvbmx5IGEgdmVyaWZpZWQgZmFjdCwgcmV1c2luZyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3Mgb3duIGRldGVjdG9yczogdGhlXG4gIC8vIHdyYW5nbGVyLWNvbmZpZyBjbGF1c2UgbmVlZHMgYW4gYWN0dWFsIGNvbmZpZyBmaWxlIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlclxuICAvLyBtZW50aW9uIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93KSwgdGhlIHdvcmtmbG93IGNsYXVzZSBuZWVkcyBhIGxpdmUgcmV1c2FibGUtZGVwbG95IGNhbGxlclxuICAvLyAoWUFNTC1wYXJzZWQgam9icy4qLnVzZXMsIG5vdCBhIHJhdy10ZXh0L2NvbW1lbnQgbWF0Y2gpLCBhbmQgdGhlIGB3YiBkZXBsb3lgIGNsYXVzZSBuZWVkcyBhXG4gIC8vIGRlcGxveSBzY3JpcHQgd2hvc2UgY29tbWFuZCB0b2tlbiBpcyBgd2Ig4oCmIGRlcGxveWAuXG4gIGNvbnN0IG93bnNXcmFuZ2xlckNvbmZpZyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIC8vIE9ubHkgY2xhaW0gdGhlIGZpbGUgaXMgZ2VuZXJhdGVkIHdoZXJlIGl0IGFjdHVhbGx5IGlzOiBhIHBhY2thZ2UgdGhhdCBoYW5kLW1haW50YWlucyBpdHMgYEVudmAgKGUuZy4gdW5kZXJcbiAgLy8gYHR5cGVzOiBbXCJidW5cIl1gKSBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0ZWxsaW5nIGFuIGFnZW50IHRvIHJ1biBgd2IgZ2VuLWNvZGVgIHRoZXJlIHdvdWxkIHNlbmRcbiAgLy8gaXQgYWZ0ZXIgYSBmaWxlIHRoYXQgbmV2ZXIgYXBwZWFycyDigJQgYW5kIGF3YXkgZnJvbSB0aGUgYEVudmAgaXQgc2hvdWxkIGJlIGVkaXRpbmcuXG4gIGNvbnN0IG93bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbiAgY29uc3QgaGFzRGVwbG95V29ya2Zsb3cgPSBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWIvd29ya2Zsb3dzJykpO1xuICAvLyBJbmRlcGVuZGVudCBmYWN0cyBzdGF5IHNlcGFyYXRlIHNlbnRlbmNlczogdGhlIHdvcmtmbG93J3Mgb3duIGRlcGxveSBtZWNoYW5pc20gaXMgbm90XG4gIC8vIGluc3BlY3RlZCwgc28gdGhlIHdiLWRlcGxveSBjbGF1c2UgbXVzdCBub3QgY2xhaW0gdGhlIHdvcmtmbG93IGludm9rZXMgaXQuXG4gIGNvbnN0IGNsb3VkZmxhcmVJbnN0cnVjdGlvbiA9IG93bnNXcmFuZ2xlckNvbmZpZ1xuICAgID8gYFxcbi0gVGhpcyBwcm9qZWN0IHJ1bnMgb24gQ2xvdWRmbGFyZSBXb3JrZXJzOiB0aGUgd3JhbmdsZXIgY29uZmlndXJhdGlvbiBmaWxlIGhvbGRzIHRoZSBXb3JrZXIncyBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgYmluZGluZ3MgYW5kIHBlci1lbnZpcm9ubWVudCBvdmVycmlkZXMuJHtoYXNEZXBsb3lXb3JrZmxvdyA/ICcgVGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYCBwZXJmb3JtIGRlcGxveW1lbnRzLicgOiAnJ30ke3VzZXNXYkRlcGxveSA/ICcgVGhlIGBkZXBsb3lgIHBhY2thZ2Ugc2NyaXB0IHJ1bnMgYHdiIGRlcGxveWAuJyA6ICcnfSR7b3duc0dlbmVyYXRlZFdvcmtlclR5cGVzID8gYFxcbi0gXFxgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c1xcYCBpcyBnaXRpZ25vcmVkIGFuZCBnZW5lcmF0ZWQgYnkgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgZ2VuLWNvZGVcXGA7IGFmdGVyIGNoYW5naW5nIGJpbmRpbmdzIG9yIHZhcnMgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZ3VyYXRpb24sIHJlLXJ1biBpdCBpbnN0ZWFkIG9mIGVkaXRpbmcgdGhlIGZpbGUgYnkgaGFuZC5gIDogJyd9YFxuICAgIDogJyc7XG4gIC8vIFdpbGxCb29zdGVyIFJhaWx3YXkgcHJvamVjdCBpZGVudGlmaWVycyBhcmUgbWFuYWdlZCBpbiBkZXBsb3kgd29ya2Zsb3cgc2V0dGluZ3MuXG4gIGNvbnN0IHJhaWx3YXlJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNSYWlsd2F5XG4gICAgPyAnXFxuLSBSYWlsd2F5IHByb2plY3QgaW5mb3JtYXRpb24gaXMgaW4gdGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYC4nXG4gICAgOiAnJztcbiAgY29uc3QgcGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbiA9IGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGFsbENvbmZpZ3MpXG4gICAgPyBgXFxuLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJyc7XG4gIGNvbnN0IGNvQXV0aG9ySW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuICAtIEVuZCB5b3VyIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBibGFuayBsaW5lIGZvbGxvd2VkIGJ5IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgLCB0aGUgb25seSBBSSBhdHRyaWJ1dGlvbiB0byBhZGQuYFxuICAgIDogJyc7XG4gIC8vIEtleWVkIG9uIHRoZSByZXBvc2l0b3J5IGNsYXNzaWZpY2F0aW9uIHJhdGhlciB0aGFuIG9uIHRoZSB0ZW1wbGF0ZSBmaWxlcycgcHJlc2VuY2U6IHRoZSBzYW1lXG4gIC8vIHJ1biB3cml0ZXMgdGhlIHRlbXBsYXRlcyBmb3IgV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3JpZXMgYmVmb3JlIHRoaXMgZ2VuZXJhdG9yXG4gIC8vIHJ1bnMsIGFuZCBoYW5kLWFkZGVkIHRlbXBsYXRlcyBlbHNld2hlcmUgYmVsb25nIHRvIEFHRU5UU19FWFRSQS5tZC5cbiAgY29uc3QgcHJUZW1wbGF0ZUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbiR7UFVMTF9SRVFVRVNUX0JPRFlfUlVMRVMucmVwbGFjZUFsbCgvXi9nbSwgJyAgJyl9YFxuICAgIDogJyc7XG4gIC8vIEdhdGVkIGxpa2UgcHJUZW1wbGF0ZUluc3RydWN0aW9uOiB0aGUgc2VjdGlvbiBpdCBuYW1lcyBleGlzdHMgb25seSB3aGVyZSB0aGUgdGVtcGxhdGUgaXMgZ2VuZXJhdGVkLlxuICBjb25zdCByZXF1aXJlbWVudHNFeGVtcHRpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBcIiBvdGhlciB0aGFuIHRoZSBQUiBib2R5J3MgUmVxdWlyZW1lbnRzIHNlY3Rpb24gKHdoaWNoIHN0YXRlcyB3aGF0IGlzIGN1cnJlbnRseSBhc2tlZCBmb3IgcmF0aGVyIHRoYW4gd2hhdCB0aGUgY29kZSBjb250YWlucylcIlxuICAgIDogJyc7XG4gIGNvbnN0IGlzc3VlVGVtcGxhdGVJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4tIFdoZW4gY3JlYXRpbmcgYW4gaXNzdWU6XFxuJHtJU1NVRV9URU1QTEFURV9SVUxFUy5yZXBsYWNlQWxsKC9eL2dtLCAnICAnKX1gXG4gICAgOiAnJztcbiAgY29uc3QgbGFuZ3VhZ2VJbnN0cnVjdGlvbiA9XG4gICAgZ2V0RGVmYXVsdFByb3NlTGFuZ3VhZ2Uocm9vdENvbmZpZykgPT09ICdKYXBhbmVzZSdcbiAgICAgID8gJ1xcbi0gVW5sZXNzIGluc3RydWN0ZWQgb3RoZXJ3aXNlLCB3cml0ZSBpc3N1ZXMsIFBScywgcmV2aWV3IGNvbW1lbnRzLCBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgcGVvcGxlIChSRUFETUUsIGBkb2NzL2ApIGluIEphcGFuZXNlLCBhbmQgZXZlcnkgb3RoZXIgYXJ0aWZhY3QgKGluY2x1ZGluZyBjb2RlIGNvbW1lbnRzLCBKU0RvYywgYW5kIGFnZW50IGluc3RydWN0aW9ucykgZXhjZXB0IHlvdXIgY29udmVyc2F0aW9uYWwgcmVwbGllcyBhbmQgcHJvZHVjdC1mYWNpbmcgdGV4dCBpbiBFbmdsaXNoLidcbiAgICAgIDogJ1xcbi0gVW5sZXNzIGluc3RydWN0ZWQgb3RoZXJ3aXNlLCB3cml0ZSBldmVyeSBhcnRpZmFjdCBleGNlcHQgeW91ciBjb252ZXJzYXRpb25hbCByZXBsaWVzIGFuZCBwcm9kdWN0LWZhY2luZyB0ZXh0IGluIEVuZ2xpc2guJztcbiAgY29uc3QgcnVubmVySW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyAnXFxuLSBQcml2YXRlIHJlcG9zaXRvcmllcyB1c2Ugc2VsZi1ob3N0ZWQgQ0kgcnVubmVycy4gS2VlcCBPUy9zaXplIGNvbnN0cmFpbnRzIGluIGFuIGV4cGxpY2l0IHNlbGYtaG9zdGVkIGxhYmVsIGFycmF5OyBmaXggbWlzc2luZyBydW5uZXIgY2FwYWJpbGl0aWVzIGluc3RlYWQgb2Ygc3dpdGNoaW5nIHRvIEdpdEh1Yi1ob3N0ZWQgcnVubmVycy4gVGhlIHNvbGUgYXBwcm92ZWQgZXhjZXB0aW9uIGlzIHRoZSBXaW5kb3dzIGRlc2t0b3AgYnVpbGQgaW4gV2lsbEJvb3N0ZXIvY2hlZXJsaW5ncy4nXG4gICAgOiAnJztcbiAgY29uc3QgcHJvamVjdE5hbWUgPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5uYW1lIHx8IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCkpO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Byb2plY3ROYW1lfVxcYCR7ZGVzY3JpcHRpb24gPyBgXFxuLSBEZXNjcmlwdGlvbjogJHtkZXNjcmlwdGlvbn1gIDogJyd9XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBJZiBvbiBcXGBtYWluXFxgLCBjcmVhdGUgYSBuZXcgYnJhbmNoOyBvdGhlcndpc2Ugd29yayBvbiB0aGUgY3VycmVudCBicmFuY2guXG4tIFJ1biBcXGBnaXRcXGAgY29tbWFuZHMgb25lIGF0IGEgdGltZSB0byBhdm9pZCBcXGBpbmRleC5sb2NrXFxgIGNvbmZsaWN0cy4ke2xhbmd1YWdlSW5zdHJ1Y3Rpb259XG4ke1RFU1RfV1JJVElOR19SVUxFU31cbi0gV2hlbiBmaXhpbmcgaXNzdWVzIChpbmNsdWRpbmcgdGVzdCBmYWlsdXJlcyksIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCB2aWEgZGVidWcgbG9ncyBvciBzY3JlZW5zaG90cykgYW5kIGZpeCBpdCBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY2hhbmdlcywgYXMgYSBydWxlLCBydW4gb25seSB3aGF0IGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGNoYW5nZSBsb2NhbGx5LCBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5XFxgICh0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nOyB1cCB0byAxMCBtaW51dGVzKSBhbmQgdGhlIHJlbGV2YW50IHRlc3RzLCBhbmQgbGVhdmUgdGhlIGZ1bGwgdGVzdCBzdWl0ZSAoXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHZlcmlmeS1mdWxsXFxgOyB1cCB0byAxIGhvdXIpIHRvIHRoZSBQUidzIENJLiBJZiBQUiBDSSBkb2VzIG5vdCBydW4gdGhlIGZ1bGwgc3VpdGUsIHJ1biBpdCBsb2NhbGx5LiBGaXggZXJyb3JzLCBpbmNsdWRpbmcgQ0kgZmFpbHVyZXMsIGFuZCByZS1ydW4gdW50aWwgdGhleSBwYXNzLlxuICAtIFJ1biByZWxldmFudCB0ZXN0cyB3aXRoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHRlc3QgdGVzdC91bml0L2V4YW1wbGUudGVzdC50cyAtLWdyZXAgJ2Nhc2UgbmFtZSdcXGAgKG9taXQgXFxgLS1ncmVwXFxgIGZvciB0aGUgd2hvbGUgZmlsZTsgdXNlIFxcYC13IHBhY2thZ2VzL2V4YW1wbGVcXGAgaW4gYSBtb25vcmVwbykuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHZlcmlmeSAtLWZ1bGwgPHRlc3QtcGF0aD4gLS1ncmVwICdjYXNlIG5hbWUnXFxgIGNvbWJpbmVzIHZlcmlmaWNhdGlvbiB3aXRoIHNlbGVjdGVkIHRlc3RzLlxuICAtIFdhaXQgZm9yIGl0IHRvIGZpbmlzaCB3aXRob3V0IHJlc3RhcnRpbmcgaXQ6IHByZWZlciBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbnMsIG90aGVyd2lzZSB0aGUgbG9uZ2VzdCBwZXJtaXR0ZWQgd2FpdDsgbm8gb3V0cHV0IGRvZXMgbm90IG1lYW4gaXQgaGFzIHN0b3BwZWQuIElmIHRoZSBkaXNwbGF5ZWQgZXhjZXJwdCBpcyBpbnN1ZmZpY2llbnQsIHJlYWQgdGhlIGluZGljYXRlZCBsb2cgZmlsZSBiZWZvcmUgcmVydW5uaW5nLiBJZiB0aGUgZW52aXJvbm1lbnQga2lsbHMgbG9uZy1ydW5uaW5nIGNvbW1hbmRzLCBydW4gdGhlbSBkZXRhY2hlZCB3aXRoIGEgc2F2ZWQgbG9nIGFuZCBleGl0IHN0YXR1cy5cbi0gT25jZSB2ZXJpZmllZCwgY29tbWl0IGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCBhbmQgY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgYnJhbmNoLlxuICAtIEZvbGxvdyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgZm9ybWF0IChlLmcuLCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCkuJHtjb0F1dGhvckluc3RydWN0aW9ufVxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHM7IGF2b2lkIFxcYC0tYW1lbmRcXGAuJHtwclRlbXBsYXRlSW5zdHJ1Y3Rpb259JHtpc3N1ZVRlbXBsYXRlSW5zdHJ1Y3Rpb259XG4tIEluIGFueSBleHBsYW5hdG9yeSB0ZXh0IChjb21taXQgbWVzc2FnZXMsIFBSIGRlc2NyaXB0aW9ucywgZG9jdW1lbnRhdGlvbiwgY29kZSBjb21tZW50cywgZXRjLikke3JlcXVpcmVtZW50c0V4ZW1wdGlvbn0sIGRlc2NyaWJlIG9ubHkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb246IGRyb3AgYW55IHN0YXRlbWVudCBuYW1pbmcgYW4gaWRlbnRpZmllciwgZmVhdHVyZSwgb3IgY29uY2VwdCB5b3UgY2Fubm90IGNvbmZpcm0gZXhpc3RzIGluIHRoZSBmaW5hbCBkaWZmIG9yIHRoZSBjdXJyZW50IGNvZGViYXNlIChlLmcuLCBvbmUgYWRkZWQgYW5kIGxhdGVyIHJlbW92ZWQgb3IgcmVuYW1lZCBhbG9uZyB0aGUgd2F5KS4gV2hlbmV2ZXIgZG9jdW1lbnRhdGlvbiBvciBjb21tZW50cyBubyBsb25nZXIgbWF0Y2ggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gKHJlbW92ZWQgb3B0aW9ucywgZGVwcmVjYXRlZCB1c2FnZSwgb3V0ZGF0ZWQgYmVoYXZpb3IpLCBkZWxldGUgb3IgcmV3cml0ZSB0aGVtLCBldmVuIGluIGZpbGVzIHlvdSBhcmUgbm90IG90aGVyd2lzZSBjaGFuZ2luZy4gTWVudGlvbiBhIHBhc3Qgc3RhdGUgb25seSB3aGVyZSBpdCBpcyBuZWVkZWQgdG8gdW5kZXJzdGFuZCB3aHkgdGhlIGN1cnJlbnQgZGVzaWduIGlzIGFzIGl0IGlzLCBvciB3aGVuIGV4cGxpY2l0bHkgYXNrZWQ7IGZpbGVzIHRoYXQgcmVjb3JkIGhpc3RvcnkgYnkgZGVzaWduIChlLmcuLCBhIGNoYW5nZWxvZykgYXJlIGV4ZW1wdC5cbi0gVXNlIGhlcmVkb2MgZm9yIG11bHRpLWxpbmUgY29tbWFuZCBpbnB1dCAoZS5nLiwgXFxgZ2l0IGNvbW1pdCAtRiAtXFxgLCBcXGBnaCBwciBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCwgXFxgZ2ggaXNzdWUgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uXG4tIFxcYEFHRU5UUy5tZFxcYCwgXFxgQ0xBVURFLm1kXFxgLCBcXGBHRU1JTkkubWRcXGAsIFxcYC5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGNcXGAsIGFuZCBcXGAuZ2VtaW5pL3N0eWxlZ3VpZGUubWRcXGAgYXJlIGdlbmVyYXRlZCBmcm9tIFxcYEFHRU5UU19FWFRSQS5tZFxcYCBhbmQgb3ZlcndyaXR0ZW4gb24gZXZlcnkgXFxgd2JmeVxcYCBydW47IHRvIGNoYW5nZSBhZ2VudCBpbnN0cnVjdGlvbnMsIGVkaXQgb25seSBcXGBBR0VOVFNfRVhUUkEubWRcXGAuJHttaXNlSW5zdHJ1Y3Rpb259JHtpc29sYXRlZEluc3RhbGxJbnN0cnVjdGlvbn0ke2Zub3hJbnN0cnVjdGlvbn0ke2Nsb3VkZmxhcmVJbnN0cnVjdGlvbn0ke3JhaWx3YXlJbnN0cnVjdGlvbn0ke3BsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb259JHtydW5uZXJJbnN0cnVjdGlvbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZywgYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbi8qKlxuICogVGhlIGxhbmd1YWdlIGlzc3VlcywgUFJzLCByZXZpZXcgY29tbWVudHMsIGFuZCBkb2N1bWVudGF0aW9uIGRlZmF1bHQgdG86IEphcGFuZXNlIG9ubHkgaW4gYVxuICogV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5IGNvbmZpcm1lZCBwcml2YXRlLiBBbiB1bmtub3duIHZpc2liaWxpdHkgKG9mZmxpbmUgcnVuLFxuICogZmFpbGVkIGxvb2t1cCkgeWllbGRzIEVuZ2xpc2ggc28gdGhhdCBhIEphcGFuZXNlIGRlZmF1bHQgaXMgbmV2ZXIgd3JpdHRlbiBpbnRvIGEgcHVibGljIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZShyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ0VuZ2xpc2gnIHwgJ0phcGFuZXNlJyB7XG4gIHJldHVybiByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvICYmIHJvb3RDb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duICYmICFyb290Q29uZmlnLmlzUHVibGljUmVwb1xuICAgID8gJ0phcGFuZXNlJ1xuICAgIDogJ0VuZ2xpc2gnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIFRhdXJpIGRlc2t0b3AgYXBwcyBzaGlwIFdpbmRvd3MgYnVpbGRzLCBhbmQgdGhlIGJvdW5kYXJ5IGJldHdlZW4gYXBwIGNvZGUgYW5kIHNoYXJlZCBjb2RlIGlzXG4gIC8vIHRvbyBmdXp6eSB0byBzY29wZSB0aGUgbWFjT1MvTGludXgtb25seSBydWxlIHBlciBwYWNrYWdlLCBzbyBzdWNoIHJlcG9zaXRvcmllcyB0YXJnZXQgYWxsXG4gIC8vIHRocmVlIE9TZXMgaW5zdGVhZC5cbiAgY29uc3QgaGFzRGVza3RvcEFwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcudGF1cmkgfHwgYy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcyk7XG4gIC8vIEEgcHVibGljIHJlcG9zaXRvcnkgd2l0aCBubyBgQHdpbGxib29zdGVyL2AgcGFja2FnZSBpcyBPU1MgZm9yIHRoZSBnZW5lcmFsIHB1YmxpYywgd2hvc2UgdXNlcnNcbiAgLy8gbWF5IHJ1biBXaW5kb3dzLCBzbyBubyBPUyByZXN0cmljdGlvbiBhcHBsaWVzIHRoZXJlLiBBbiB1bmtub3duIHZpc2liaWxpdHkgY29sbGFwc2VzIHRvXG4gIC8vIGlzUHVibGljUmVwbz1mYWxzZSBhbmQgdGhlcmVmb3JlIGtlZXBzIHRoZSByZXN0cmljdGl2ZSBkZWZhdWx0LlxuICBjb25zdCBpc0dlbmVyYWxQdWJsaWNPc3MgPVxuICAgIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvICYmIGFsbENvbmZpZ3MuZXZlcnkoKGMpID0+ICFjLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAvLyBPbmx5IHB1YmxpYyByZXBvc2l0b3JpZXMgcHVibGlzaCBwYWNrYWdlcyB0byB0aGUgcHVibGljIG5wbSByZWdpc3RyeSwgd2hvc2UgdXNlcnMgcmVhZCB0aGVcbiAgLy8gSlNEb2Mgd2l0aG91dCB0aGUgc291cmNlOyBwcml2YXRlIHJlcG9zaXRvcmllcyBhcmUgcmVhZCBvbmx5IGJ5IGFnZW50cyB0aGF0IGhhdmUgdGhlIHNvdXJjZS5cbiAgY29uc3QgbnBtQXBpRXhjZXB0aW9uID0gcm9vdENvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICA/ICcgRXhjZXB0aW9uOiB0aGUgZXhwb3J0ZWQgQVBJIG9mIGEgcGFja2FnZSBwdWJsaXNoZWQgdG8gbnBtIG1heSBjYXJyeSBKU0RvYyBkZXNjcmliaW5nIHdoYXQgaXQgZG9lcyBhbmQgaG93IHRvIGNhbGwgaXQsIGJlY2F1c2UgaXRzIHVzZXJzIHJlYWQgaXQgd2l0aG91dCB0aGUgc291cmNlLidcbiAgICA6ICcnO1xuICBjb25zdCBjb21tZW50SW5zdHJ1Y3Rpb24gPSBgLSBDb21tZW50cyBhbmQgSlNEb2M6IGV2ZXJ5IHJlYWRlciBoYXMgdGhlIHNvdXJjZSwgc28gbmV2ZXIgcmVzdGF0ZSB3aGF0IHRoZSBjb2RlLCBpdHMgbmFtZXMsIG9yIGl0cyB0eXBlcyBhbHJlYWR5IHNheSAoZS5nLiwgXFxgQHBhcmFtIG5hbWUgVGhlIG5hbWVcXGApLiBXcml0ZSBvbmUgb25seSB3aGVuIGEgcGxhdXNpYmxlIGVkaXQgd291bGQgYnJlYWsgc29tZXRoaW5nIHdpdGhvdXQgdGhhdCBrbm93bGVkZ2UgYW5kIG5vIHR5cGUgY2hlY2ssIGxpbnQgcnVsZSwgb3IgdGVzdCB3b3VsZCBjYXRjaCBpdDsgZmlyc3QgZW5jb2RlIHRoZSBrbm93bGVkZ2UgaW4gY29kZSAoYSBuYW1lLCBhIHR5cGUsIGFuIFxcYGFzc2VydFxcYCwgYSB0ZXN0KSBhbmQgY29tbWVudCBvbmx5IHdoYXQgY2Fubm90IGJlIGVuY29kZWQ6IGFuIG9kZC1sb29raW5nIHdvcmthcm91bmQsIGEgZGVwZW5kZW5jeSBvbiBhIGZhY3Qgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgb3IgYSByZWplY3RlZCBhbHRlcm5hdGl2ZSBhbmQgd2h5LiBQdXQgYSBjb250cmFjdCBvZiB0aGUgZGVjbGFyZWQgc3ltYm9sIGluIEpTRG9jIGFuZCBsaW5lLXNwZWNpZmljIGtub3dsZWRnZSBpbiBhbiBpbmxpbmUgY29tbWVudC4gRGVsZXRlIGNvbW1lbnRzIHRoYXQgZmFpbCB0aGlzIHRlc3QgaW4gZmlsZXMgeW91IHRvdWNoLiR7bnBtQXBpRXhjZXB0aW9ufWA7XG4gIGNvbnN0IG9zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9uID0gaXNHZW5lcmFsUHVibGljT3NzXG4gICAgPyAnJ1xuICAgIDogaGFzRGVza3RvcEFwcFxuICAgICAgPyAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MsIG1hY09TLCBhbmQgTGludXguJ1xuICAgICAgOiAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSBvbmx5IHdpdGggbWFjT1MgYW5kIExpbnV4OyBkbyBub3QgaW5jbHVkZSBXaW5kb3dzLXNwZWNpZmljIGNvZGUuJztcbiAgLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIGV4ZWN1dGUgYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzIGFuZCB0d28gcmVxdWVzdHMgYXJlIG5vdCBndWFyYW50ZWVkXG4gIC8vIHRvIGhpdCB0aGUgc2FtZSBpbnN0YW5jZSwgc28gdGhlIHNpbmdsZS1pbnN0YW5jZSBzaW1wbGlmaWNhdGlvbiBzaWxlbnRseSBsb3NlcyBzdGF0ZSB0aGVyZSDigJRcbiAgLy8gYnV0IFdvcmtlcnMgZGVsaWJlcmF0ZWx5IHJldXNlIGV4ZWN1dGlvbiBjb250ZXh0cywgc28gYmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgc3RheVxuICAvLyBsZWdpdGltYXRlIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy9yZWZlcmVuY2UvaG93LXdvcmtlcnMtd29ya3MvKS4gVGhlXG4gIC8vIHNpZ25hbHMgYXJlIGNvcnJlbGF0ZWQgUEVSIFBBQ0tBR0U6IGEgbW9ub3JlcG8gY2FuIGhvc3QgYSBzaW5nbGUtaW5zdGFuY2Ugc2VydmVyIGFwcCBuZXh0IHRvXG4gIC8vIGFuIHVucmVsYXRlZCBXb3JrZXIsIGFuZCBuZWl0aGVyIG1heSBvdmVycmlkZSB0aGUgb3RoZXIncyBydWxlLiBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnIGlzXG4gIC8vIHRoZSBhY2N1cmF0ZSBXb3JrZXJzIHNpZ25hbCAoaXNDbG91ZGZsYXJlIGFsc28gbWF0Y2hlcyBhIG1lcmUgd3JhbmdsZXIgbWVudGlvbiBpbiBhIHNjcmlwdCBvclxuICAvLyB3b3JrZmxvdykuXG4gIGNvbnN0IGhhc1dvcmtlcnNBcHAgPSBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIGNvbnN0IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwID0gYWxsQ29uZmlncy5zb21lKFxuICAgIChjKSA9PiAoYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpICYmICFjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWdcbiAgKTtcbiAgY29uc3Qgd29ya2Vyc0luc3RydWN0aW9uID1cbiAgICAnLSBDbG91ZGZsYXJlIFdvcmtlcnMgcnVuIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcywgc28gdHdvIHJlcXVlc3RzIG1heSBoaXQgZGlmZmVyZW50IGluc3RhbmNlczogbmV2ZXIgbGV0IGNvcnJlY3RuZXNzIGRlcGVuZCBvbiBtb2R1bGUtbGV2ZWwgbXV0YWJsZSBzdGF0ZTsgcGVyc2lzdCBhdXRob3JpdGF0aXZlIHNoYXJlZCBzdGF0ZSBpbiBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKS4gQmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgb2Ygbm9uLXJlcXVlc3Qtc2NvcGVkIGRhdGEgYXJlIGZpbmUuJztcbiAgY29uc3Qgc2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbiA9IGhhc1dvcmtlcnNBcHBcbiAgICA/IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwXG4gICAgICA/IGAke3dvcmtlcnNJbnN0cnVjdGlvbn0gVGhpcyBhcHBsaWVzIHRvIGFsbCBjb2RlIHJ1bm5pbmcgb24gQ2xvdWRmbGFyZSBXb3JrZXJzICh0aGUgd3JhbmdsZXItY29uZmlndXJlZCBwYWNrYWdlcyBhbmQgYW55IHdvcmtzcGFjZSBwYWNrYWdlIHRoZXkgaW1wb3J0KTsgYXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIG90aGVyIHNlcnZlciBhcHBzLmBcbiAgICAgIDogd29ya2Vyc0luc3RydWN0aW9uXG4gICAgOiBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcFxuICAgICAgPyAnLSBBc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLidcbiAgICAgIDogJyc7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZpbGUgbmFtZXMgZm9yIEphdmFTY3JpcHQvVHlwZVNjcmlwdCAoUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIG1vZHVsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGggaGlnaCBjb2hlc2lvbiBhbmQgbG93IGNvdXBsaW5nOyBzcGxpdCBsYXJnZSBtb2R1bGVzIHdoZW4gbmVlZGVkLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCAodG9wLWRvd24gb3JkZXIpOyBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgYWJvdmUgdGhlaXIgdXNhZ2UuXG4ke2NvbW1lbnRJbnN0cnVjdGlvbn1cbi0gTmV2ZXIgZXhwbGFpbiBob3cgV2lsbEJvb3N0ZXIncyBpbi1ob3VzZSB0b29scyAoZS5nLiwgXFxgd2JcXGAsIFxcYHdiZnlcXGApIHdvcmsgaW4gY29kZSBjb21tZW50cyBvciBkb2N1bWVudHMgb3V0c2lkZSB0aGUgdG9vbCdzIG93biBwYWNrYWdlLCBleGNlcHQgaW4gaW5zdHJ1Y3Rpb25zIGZvciBBSSBhZ2VudHMgKGUuZy4sIGRvIG5vdCBub3RlIHRoYXQgXFxgUE9SVFxcYCBpcyB1bnNldCBiZWNhdXNlIFxcYHdiXFxgIHBpY2tzIGEgZnJlZSBwb3J0KS5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gVmFsaWRhdGUgSmF2YVNjcmlwdCBvYmplY3RzIChlLmcuLCBwYXJzZWQgSlNPTiwgQVBJIHJlc3BvbnNlcykgd2l0aCBcXGB6b2RcXGAgd2hlbmV2ZXIgcG9zc2libGUgaW5zdGVhZCBvZiBoYW5kLXdyaXR0ZW4gY2hlY2tzIG9yIHR5cGUgYXNzZXJ0aW9ucy5cbi0gQnVpbGQgcHJvbXB0cyBhcyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIG9uIGEgcHJlLWNvbXB1dGFibGUgYXJyYXkgb2Ygc3RyaW5ncy5cbi0gQXNzdW1lIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWQ7IGlmIHZhbGlkYXRpb24gaXMgbmVlZGVkLCBcXGBhc3NlcnRcXGAgdGhlbSBhdCBzdGFydHVwIHRvIGZhaWwgZmFzdC5cbi0gQXNzdW1lIGxvY2FsIHRvb2xzIHN1Y2ggYXMgXFxgZ2l0XFxgLCBcXGBnaFxcYCwgYW5kIFxcYGdocVxcYCBhcmUgaW5zdGFsbGVkIGFuZCBhdXRoZW50aWNhdGVkLlxuJHtvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gUmVnaXN0ZXIgc3RyaW5nIGxpdGVyYWxzIGZvciBSZWFjdCBjb21wb25lbnRzIGluIHRoZSBcXGBpMThuXFxgIHJlc291cmNlIGZpbGVzIChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApIGFuZCByZWZlcmVuY2UgdGhlbSB2aWEgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eSAoZS5nLiwgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYCkuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGAtIFByZWZlciBsYW1iZGEgb3ZlciBcXGBmdW5jdGlvblxcYCBmb3IgUmVhY3QgY29tcG9uZW50cywgZS5nLiwgXFxgY29uc3QgQnV0dG9uOiBSZWFjdC5GQyA9ICgpID0+IHtcXGAuXG4tIFByZWZlciBcXGB1c2VJbW1lclxcYCBvdmVyIFxcYHVzZVN0YXRlXFxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4tIFVzZSBcXGBhdXRvRm9jdXNcXGAgd2hlcmUgaXQgcmVkdWNlcyB1c2VyIGVmZm9ydC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgLy8gdmluZXh0IGlzIHRoZSBvcmcncyBjdXJyZW50IHdlYi1hcHAgZnJhbWV3b3JrIGFuZCBlbmFibGVzIHRoZSBSZWFjdCBDb21waWxlciBqdXN0IGFzIE5leHQuanNcbiAgLy8gZG9lcywgc28gaXQgbXVzdCBub3QgbWlzcyB0aGlzIHJ1bGUuXG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpXG4gICAgPyBgXG4tIFRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgc28gXFxgdXNlQ2FsbGJhY2tcXGAgYW5kIFxcYHVzZU1lbW9cXGAgYXJlIHVubmVjZXNzYXJ5IGZvciBwZXJmb3JtYW5jZS5cbmBcbiAgICA6ICcnXG59XG4ke3NlcnZlckluc3RhbmNlSW5zdHJ1Y3Rpb259XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCk7XG59XG4iLCIiLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgcmVsZWFzZUFnZUdhdGUgZnJvbSAnLi4vLi4vY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uJyB3aXRoIHsgdHlwZTogJ2pzb24nIH07XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBCdW5maWdUb21sIHtcbiAgaW5zdGFsbD86IHtcbiAgICBleGFjdD86IGJvb2xlYW47XG4gICAgZ2xvYmFsU3RvcmU/OiBib29sZWFuO1xuICAgIGxpbmtlcj86IHN0cmluZztcbiAgICBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzPzogc3RyaW5nW107XG4gIH07XG59XG5cbi8vIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiBpcyB0aGUgb3JnYW5pemF0aW9uJ3Mgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIHBvbGljeTogdGhlXG4vLyBtYWNoaW5lcycgZ2xvYmFsIGNvbmZpZ3MgZ2V0IGl0IHRocm91Z2ggY29uZmlncy9hcHBseVJlbGVhc2VBZ2VHYXRlLnNoIChydW4gYnkgd2JmeSBpdHNlbGYsIGJ5XG4vLyByZXVzYWJsZS13b3JrZmxvd3Mgb24gQ0ksIGFuZCBieSBzZWxmLWhvc3QtdXRpbHMgb24gdGhlIHJ1bm5lcnMpLCBhbmQgcmVwb3NpdG9yaWVzIGdldCBpdCBoZXJlLlxuLy8gT3VyIG93biBwYWNrYWdlcyBhcmUgZXhlbXB0OiB3ZSBjb250cm9sIHdobyBwdWJsaXNoZXMgdGhlbSwgc28gYSBjb21wcm9taXNlZCByZWxlYXNlIGNhbm5vdFxuLy8gcmVhY2ggdXMgdGhyb3VnaCBhbiB1cHN0cmVhbSBtYWludGFpbmVyJ3Mgc3RvbGVuIGNyZWRlbnRpYWxzLiBUaGF0IGNvdmVycyBldmVyeVxuLy8gQHdpbGxib29zdGVyLXByaXZhdGUgcGFja2FnZSAodGhlIHNjb3BlIHJlc29sdmVzIG9ubHkgZnJvbSBvdXIgb3duIHJlZ2lzdHJ5KSwgYnV0IGJ1biwgbnBtLCBhbmRcbi8vIFlhcm4gbWF0Y2ggZXhjbHVkZSBlbnRyaWVzIGJ5IGV4YWN0IG5hbWUg4oCUIG5vIEBzY29wZS8qIHBhdHRlcm5zIOKAlCBzbyBlYWNoIG5ldyBwYWNrYWdlIGluIHRoZVxuLy8gc2NvcGUgbXVzdCBiZSBhZGRlZCB0byBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gd2hlbiBpdCBpcyBmaXJzdCBwdWJsaXNoZWQuIFRoZSBvbmx5IHBlcm1hbmVudFxuLy8gdGhpcmQtcGFydHkgZXhlbXB0aW9uIGlzIHRoZSBDb2RleCBDTEksIHdob3NlIG5ld2VzdCBtb2RlbHMgcnVuIG9ubHkgb24gaXRzIGxhdGVzdCByZWxlYXNlcy5cbi8vIE90aGVyIHRoaXJkLXBhcnR5IHBhY2thZ2VzIOKAlCBpbmNsdWRpbmcgdG9vbGluZyB3YmZ5IHBpbnMgaXRzZWxmIOKAlCBzdGF5IGFnZS1nYXRlZDtcbi8vIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24gaW4gcGFja2FnZUpzb24udHMgcGlucyB0aGUgbmV3ZXN0IHJlbGVhc2Ugb2xkIGVub3VnaCB0byBwYXNzXG4vLyB0aGUgZ2F0ZSwgc28gcGlubmluZyBrZWVwcyB3b3JraW5nIHdpdGhvdXQgYW4gZXhlbXB0aW9uLiBgdGVtcG9yYXJ5RXhjbHVkZXNgIGxldHMgYSB0aGlyZC1wYXJ0eVxuLy8gcmVsZWFzZSBuZWVkZWQgbm93IChhIHNlY3VyaXR5IGZpeCwgb3IgYW4gU0RLIGEgbmV3IG1vZGVsIHJlcXVpcmVzKSBpbiBpbW1lZGlhdGVseSBhbmQgZ2F0ZXMgdGhlXG4vLyBwYWNrYWdlIGFnYWluIGZyb20gdGhlIGdpdmVuIFVUQyBkYXRlLCBzbyB0aGUgbmV4dCB3YmZ5IHJ1biByZXN0b3JlcyB0aGUgZ2F0ZSB3aXRob3V0IGFueW9uZVxuLy8gaGF2aW5nIHRvIHJlbWVtYmVyIHRvIHJlbW92ZSB0aGUgZW50cnkuIExpc3QgZXZlcnkgcGFja2FnZSB0aGF0IHJlbGVhc2UgcGlucyBleGFjdGx5IGFuZFxuLy8gcHVibGlzaGVzIGFsb25nc2lkZSBpdCwgc2luY2UgZXhjbHVzaW9uIG1hdGNoZXMgZXhhY3QgbmFtZXMgb25seS5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSByZWxlYXNlQWdlR2F0ZS5kYXlzICogMjQgKiA2MCAqIDYwO1xuY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gIC4uLnJlbGVhc2VBZ2VHYXRlLmV4Y2x1ZGVzLFxuICAuLi5PYmplY3QuZW50cmllcyhyZWxlYXNlQWdlR2F0ZS50ZW1wb3JhcnlFeGNsdWRlcylcbiAgICAuZmlsdGVyKChbLCBnYXRlZEFnYWluRnJvbV0pID0+IHRvZGF5IDwgZ2F0ZWRBZ2FpbkZyb20pXG4gICAgLm1hcCgoW3BhY2thZ2VOYW1lXSkgPT4gcGFja2FnZU5hbWUpLFxuXTtcblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZXBvc2l0b3J5J3MgYnVuZmlnLnRvbWwgbGlzdHMgdG9kYXkncyBleGVtcHRpb25zLiBgdGVtcG9yYXJ5RXhjbHVkZXNgIGNoYW5nZXMgdGhlbSBieVxuICogZGF0ZSBhbG9uZSwgc28gYSByZXBvc2l0b3J5IGFscmVhZHkgY29uZmlndXJlZCBieSB0aGUgcnVubmluZyB3YmZ5IGJ1aWxkIG11c3Qgbm90IGJlIHNraXBwZWRcbiAqIG9uY2UgdGhleSBkaWZmZXIsIG9yIGFuIGV4cGlyZWQgZXhlbXB0aW9uIHdvdWxkIG91dGxpdmUgaXRzIGRhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDdXJyZW50QnVuUmVsZWFzZUFnZUV4Y2x1ZGVzKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdidW5maWcudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgZXhjbHVkZXMgPSBwYXJzZUJ1bmZpZ1RvbWwoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpKT8uaW5zdGFsbD8ubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcztcbiAgcmV0dXJuIGV4Y2x1ZGVzPy5qb2luKCdcXG4nKSA9PT0gYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5qb2luKCdcXG4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRCdW5HbG9iYWxTdG9yZShyb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHBhcnNlQnVuZmlnVG9tbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpPy5pbnN0YWxsPy5nbG9iYWxTdG9yZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5HbG9iYWxTdG9yZShcbiAgY29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBza2lwRGVwczogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSA9IHNob3VsZFVzZUJ1bkdsb2JhbFN0b3JlKGNvbmZpZ3MpO1xuICByZXR1cm4gc2tpcERlcHMgPyAocHJldmlvdXNHbG9iYWxTdG9yZSA/PyBkZWZhdWx0VXNlR2xvYmFsU3RvcmUpIDogZGVmYXVsdFVzZUdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIC8vIEJsaXR6IGJ1aWxkcyBvbiBOZXh0LmpzIGJ1dCBuZWVkIG5vdCBkZWNsYXJlIGl0IGRpcmVjdGx5LCBhbmQgaXRzIGNvZGVnZW4gYWxzbyBwYXRjaGVzIE5leHRcbiAgLy8gaW5zaWRlIG5vZGVfbW9kdWxlcy4gQm90aCBmcmFtZXdvcmtzIHRoZXJlZm9yZSByZXF1aXJlIHByb2plY3QtbG9jYWwgaXNvbGF0ZWQgaW5zdGFsbHMuXG4gIC8vIFNsaWRldiBsb2FkcyBvcHRpb25hbCBWdWUgY29tcGlsZXIgcGVlcnMgdGhyb3VnaCBsb2NhbC1wa2cuIFRoZSBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzXG4gIC8vIGxvY2FsLXBrZyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBzbyBOb2RlIGNhbm5vdCByZXNvbHZlIGEgY29tcGlsZXIgZGVjbGFyZWQgYnkgdGhlIHByb2plY3QuXG4gIHJldHVybiAhY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuc2xpZGV2KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcsIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIC8vIG1pbmltdW1SZWxlYXNlQWdlIGFuZCBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIGFyZSBvcmcgcG9saWN5LCBuZXZlciByZXBvc2l0b3J5IHBvbGljeTogYm90aFxuICAvLyBhcmUgcmV3cml0dGVuIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbidzIHZhbHVlcyBvbiBldmVyeSBydW4sIHNvIGEgaGFuZC1lZGl0ZWQgKHdlYWtlbmVkKVxuICAvLyBnYXRlIGNhbm5vdCBzdXJ2aXZlIHJlZ2VuZXJhdGlvbi4gRHJvcHBpbmcgcmVwb3NpdG9yeS1zcGVjaWZpYyBleGNsdWRlIGVudHJpZXMgaXMgZmFpbC1zYWZlIOKAlCBhblxuICAvLyB1bmNvdmVyZWQgcGFja2FnZSBiZWNvbWVzIGFnZS1nYXRlZCBhbmQgc3VyZmFjZXMgYXQgaW5zdGFsbCB0aW1lIGluc3RlYWQgb2Ygd2Vha2VuaW5nIHRoZSBnYXRlLlxuICAvLyBUdXJib3BhY2sgcmVqZWN0cyBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVjYXVzZSB0aGV5IHJlc29sdmUgb3V0c2lkZSBpdHMgZmlsZXN5c3RlbSByb290LlxuICAvLyBLZWVwaW5nIE5leHQuanMgaW5zdGFsbHMgcHJvamVjdC1sb2NhbCBhdm9pZHMgd2lkZW5pbmcgdGhhdCByb290IHRvICRIT01FIChvciBgL2AgaW4gRG9ja2VyKSxcbiAgLy8gd2hpY2ggd291bGQgZXhwYW5kIGRldmVsb3BtZW50IGZpbGVzeXN0ZW0gd2F0Y2hpbmcgYW5kIGJ5cGFzcyB0aGUgYm91bmRhcnkncyBjYWNoZSBiZW5lZml0cy5cbiAgY29uc3QgZ2xvYmFsU3RvcmVMaW5lID0gdXNlR2xvYmFsU3RvcmUgPyAnZ2xvYmFsU3RvcmUgPSB0cnVlJyA6ICdnbG9iYWxTdG9yZSA9IGZhbHNlJztcbiAgLy8gTm8gYFtydW5dIGJ1biA9IHRydWVgOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrc1xuICAvLyB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KTsgYW55IGV4aXN0aW5nIHNldHRpbmcgaXMgZHJvcHBlZC5cbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIOKAlCB0c3g6IGJ1aWxkLXRzIHVuZGVyIE5vZGUuanMgc3Bhd25zIGBub2RlIC0taW1wb3J0IHRzeGAsIHdoaWNoIHJlc29sdmVzXG4gIC8vIHRzeCBmcm9tIHRoZSBjb25zdW1lciBwYWNrYWdlJ3MgZGlyZWN0b3J5LCBub3QgZnJvbSBidWlsZC10cydzIG93biBkZXBlbmRlbmNpZXMuXG4gIC8vIHVuZGljaS10eXBlczogYnVuLXR5cGVzIHJlZmVyZW5jZXMgaXQgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSk7XG4gIC8vIGdlbmVyYXRlZCB0c2NvbmZpZ3MgYWxzbyBtYXAgdW5kaWNpLXR5cGVzIHRvIHRoZSBob2lzdGVkIGNvcHkgKHNlZSB0c2NvbmZpZy50cykgYmVjYXVzZSB0aGVcbiAgLy8gZ2xvYmFsIHN0b3JlIHJlYWxwYXRocyBidW4tdHlwZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGV4aXN0aW5nQ29udGVudCl9W2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbiR7Z2xvYmFsU3RvcmVMaW5lfVxubGlua2VyID0gXCJpc29sYXRlZFwiXG5wdWJsaWNIb2lzdFBhdHRlcm4gPSBbXCJ0c3hcIiwgXCJ1bmRpY2ktdHlwZXNcIl1cbm1pbmltdW1SZWxlYXNlQWdlID0gJHtidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHN9XG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHtidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbi8qKlxuICogUHJlc2VydmUgdGhlIHByb2plY3QncyBgW3Rlc3RdYCBzZWN0aW9ucyAoZS5nLiBwcmVsb2FkIHNjcmlwdHMgc3dhcHBpbmcgYSBDbG91ZGZsYXJlIEQxIGNsaWVudFxuICogZm9yIGEgbG9jYWwgU1FMaXRlIG9uZSkgdmVyYmF0aW0sIGNvbW1lbnRzIGluY2x1ZGVkOyB3YmZ5IG1hbmFnZXMgb25seSB0aGUgb3RoZXIgc2VjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghY29udGVudCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IHByZXNlcnZlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5UZXN0U2VjdGlvbiA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBzZWN0aW9uTWF0Y2ggPSAvXlxccypcXFsoW15cXF1dKylcXF0vLmV4ZWMobGluZSk7XG4gICAgaWYgKHNlY3Rpb25NYXRjaCkge1xuICAgICAgaW5UZXN0U2VjdGlvbiA9IHNlY3Rpb25NYXRjaFsxXSA9PT0gJ3Rlc3QnIHx8IChzZWN0aW9uTWF0Y2hbMV0gYXMgc3RyaW5nKS5zdGFydHNXaXRoKCd0ZXN0LicpO1xuICAgIH1cbiAgICBpZiAoaW5UZXN0U2VjdGlvbiAmJiBsaW5lLnRyaW0oKSkge1xuICAgICAgcHJlc2VydmVkTGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZXNlcnZlZExpbmVzLmxlbmd0aCA+IDAgPyBgJHtwcmVzZXJ2ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5cXG5gIDogJyc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGUgZGVwbG95cyBHaXQtYmFzZWQgcHJpdmF0ZSBwYWNrYWdlcyBmcm9tIG5vZGVfbW9kdWxlcywgYnV0IHRoZSBEb2NrZXIgY29udGV4dCBzaG91bGQgc3RheSBuYXJyb3cuXG5jb25zdCBpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnMgPSBbJ0B3aWxsYm9vc3RlciddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuLmVudipcbioqLy5EU19TdG9yZVxuKiovLmNhY2hlXG4qKi8uY2xhdWRlXG4qKi8uY3Vyc29yXG4qKi8uZWRpdG9yY29uZmlnXG4qKi8uZXNsaW50Y2FjaGVcbioqLy5nZW1pbmlcbioqLy5naXRcbioqLy5naXRhdHRyaWJ1dGVzXG4qKi8uZ2l0aHViXG4qKi8uZ2l0aWdub3JlXG4qKi8uaWRlYVxuKiovLmxlZnRob29rXG4qKi8ubXlweV9jYWNoZVxuKiovLm5leHQvY2FjaGVcbioqLy5ucG1cbioqLy5wYXJjZWwtY2FjaGVcbioqLy5wbnBtLXN0b3JlXG4qKi8ucHl0ZXN0X2NhY2hlXG4qKi8ucmFpbHdheWlnbm9yZVxuKiovLnJlbGVhc2VyYy5qc29uXG4qKi8ucnVmZl9jYWNoZVxuKiovLnRtcFxuKiovLnRtcC0qLyoqXG4qKi8udHVyYm9cbioqLy50b3hcbioqLy52c2NvZGVcbioqLy55YXJuL2NhY2hlXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuKiovX19weWNhY2hlX19cbioqLyoubG9nXG4qKi8qLnB5Y1xuKiovKi50c2J1aWxkaW5mb1xuKiovY292ZXJhZ2VcbioqL25vZGVfbW9kdWxlcy8qKlxuJHtpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnNcbiAgLm1hcChcbiAgICAocGF0dGVybikgPT4gYCEqKi9ub2RlX21vZHVsZXMvJHtwYXR0ZXJufVxuISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59LyoqYFxuICApXG4gIC5qb2luKCdcXG4nKX1cbioqL25vZGVfbW9kdWxlcy8uY2FjaGVcbioqL3BsYXl3cmlnaHQtcmVwb3J0XG4qKi9zdG9yeWJvb2stc3RhdGljXG4qKi90YXJnZXRcbioqL3Rlc3QtcmVzdWx0c1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBydW5BbGxJblBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSwgZ2V0RGVmYXVsdFByb3NlTGFuZ3VhZ2UsIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueWFtbCcpO1xuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG5cbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxDb25maWcgPSAhIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChub25DYW5vbmljYWxDb25maWdGaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pKTtcbiAgICBpZiAoaGFzTm9uQ2Fub25pY2FsQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtjb25maWdGaWxlUGF0aH0gYmVjYXVzZSAke25vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRofSBpcyBub3QgYSBzdXBwb3J0ZWQgR2VtaW5pIGNvbmZpZyBsb2NhdGlvbi4gUmVuYW1lIGl0IG1hbnVhbGx5LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGRlZmF1bHRDb25maWcpO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBoYXNOb25DYW5vbmljYWxDb25maWcgPyB1bmRlZmluZWQgOiBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGNvbmZpZ0ZpbGVQYXRoKTtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvbGRDb25maWcgPSBCdW4uWUFNTC5wYXJzZShvbGRDb250ZW50KTtcbiAgICAgICAgLy8gTWVyZ2Ugb25seSBhIG1hcHBpbmc6IGVtcHR5LCBjb21tZW50LW9ubHksIG9yIHNjYWxhciBZQU1MIHdvdWxkIGVpdGhlciB0aHJvdyBpblxuICAgICAgICAvLyBtZXJnZS5hbGwgb3IgcG9sbHV0ZSB0aGUgY29uZmlnIHdpdGggaW5kZXgga2V5cy5cbiAgICAgICAgaWYgKG9sZENvbmZpZyAmJiB0eXBlb2Ygb2xkQ29uZmlnID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvbGRDb25maWcpKSB7XG4gICAgICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGNhbid0IGJlIHBhcnNlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0gQnVuLllBTUwuc3RyaW5naWZ5KG5ld0NvbmZpZywgdW5kZWZpbmVkLCAyKTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQoY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnQ/LnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJyMnKSA/IHVuZGVmaW5lZCA6IGV4dHJhQ29udGVudDtcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGBSZXZpZXcgaW4gJHtnZXREZWZhdWx0UHJvc2VMYW5ndWFnZShjb25maWcpfSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuXFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoY29uZmlnLCBhbGxDb25maWdzKX0ke1xuICAgICAgY29kaW5nUnVsZUV4dHJhQ29udGVudCA/IGBcXG4ke2NvZGluZ1J1bGVFeHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgYXdhaXQgcnVuQWxsSW5Qb29sKFtcbiAgICAgIC4uLihoYXNOb25DYW5vbmljYWxDb25maWcgPyBbXSA6IFsoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCldKSxcbiAgICAgICgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZ2l0T3V0cHV0TWF4QnVmZmVyID0gNjQgKiAxMDI0ICogMTAyNDtcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuLy8gYC5naXRpZ25vcmUgLXRleHRgIGtlZXBzIHRoZSBtYWNPUyB0ZW1wbGF0ZSdzIGBJY29uXFxyXFxyYCBydWxlIGludGFjdDogYHRleHQ9YXV0b2Agbm9ybWFsaXphdGlvblxuLy8gc3RyaXBzIG9uZSBDUiBwZXIgY2hlY2tpbiwgZGVncmFkaW5nIHRoZSBydWxlIHVudGlsIGl0IG1hdGNoZXMgbm90aGluZy5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuLmdpdGlnbm9yZSAtdGV4dFxuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IG91dHB1dDogc3RyaW5nO1xuICB0cnkge1xuICAgIG91dHB1dCA9IGNoaWxkX3Byb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2xzLWZpbGVzJywgJy0tZW9sJywgJy16J10sIHtcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IGdpdE91dHB1dE1heEJ1ZmZlcixcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdHJhY2tlZCBsaW5lLWVuZGluZyByZW5vcm1hbGl6YXRpb246ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgcmVub3JtYWxpemVkQ291bnQgPSAwO1xuICBmb3IgKGNvbnN0IHJlY29yZCBvZiBvdXRwdXQuc3BsaXQoJ1xcMCcpKSB7XG4gICAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSByZWNvcmQuaW5kZXhPZignXFx0Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4ID09PSAtMSkgY29udGludWU7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gcmVjb3JkLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICBpZiAoIS9eaVxcLyg/OmNybGZ8bWl4ZWQpXFxzL3UudGVzdChhdHRyaWJ1dGVzKSB8fCAhL2F0dHJcXC8uKlxcYmVvbD0oPzpsZnxjcmxmKSg/Olxcc3wkKS91LnRlc3QoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlY29yZC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIGNvbnN0IHRyYWNrZWRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHN0YXRzID0gZnMubHN0YXRTeW5jKHRyYWNrZWRGaWxlUGF0aCwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgaWYgKCFzdGF0cz8uaXNGaWxlKCkpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2l0J3Mgc3RhdCBjYWNoZSBjYW4gaGlkZSBwcmUtZXhpc3RpbmcgQ1JMRiBibG9icyBhZnRlciB3YmZ5IGludHJvZHVjZXMgdGV4dCBhdHRyaWJ1dGVzLlxuICAgIC8vIE5vcm1hbGl6ZSBieXRlcyBpbiB0aGUgd29ya3RyZWUgc28gdGhlIGNhbGxlcidzIG5vcm1hbCBgZ2l0IGFkZCAtQWAgcmVjb3JkcyB0aGUgY2Fub25pY2FsXG4gICAgLy8gYmxvYjsgdGhpcyBhbHNvIHByZXZlbnRzIFByZXR0aWVyJ3MgbWV0YWRhdGEgY2FjaGUgZnJvbSBza2lwcGluZyB0aGUgbmV3bHkgY2hhbmdlZCBmaWxlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModHJhY2tlZEZpbGVQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCwgQnVmZmVyLmZyb20oY29udGVudC50b1N0cmluZygnYmluYXJ5JykucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLCAnYmluYXJ5JykpO1xuICAgIHJlbm9ybWFsaXplZENvdW50Kys7XG4gIH1cbiAgaWYgKHJlbm9ybWFsaXplZENvdW50ID4gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVub3JtYWxpemVkIGxpbmUgZW5kaW5ncyBpbiAke3Jlbm9ybWFsaXplZENvdW50fSB0cmFja2VkIGZpbGUocykuYCk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG5fX2dlbmVyYXRlZF9fL1xuLmFpZGVyKlxuLmFudGlncmF2aXR5Y2xpL1xuLmNsYXVkZS8qLmxvY2FsLipcbi5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2tcbi5kZXZjb250YWluZXIvXG4uZG9ja2VyLmVudlxuLmVudipcbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4ucGxheXdyaWdodC1tY3AvXG4uc2VyZW5hL1xuLnRtcC9cbi50bXAtKi9cbi50b2tlbnNhdmUvXG4ud2IvXG5Ad2lsbGJvb3N0ZXIvXG5Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9cbiovbW91bnQvKi5oYXNoXG5DTEFVREUubG9jYWwubWRcbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICAvLyBFdmVyeSBhY2NlcHRlZCByZXBvc2l0b3J5IHJvb3QgcmVjZWl2ZXMgYSBtYW5hZ2VkIHBhY2thZ2UuanNvbiBsYXRlciBpbiB0aGUgc2FtZSBydW4sIHNvIGl0c1xuICAgIC8vIGRlcGVuZGVuY3kgdHJlZSBtdXN0IGJlIGlnbm9yZWQgZXZlbiB3aGVuIHRoZSBtYW5pZmVzdCBkaWQgbm90IGV4aXN0IGF0IGNvbmZpZy1kZXRlY3Rpb24gdGltZS5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHwgY29uZmlnLmlzUm9vdCkge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3QgcG9tLnhtbCk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBpdHMgTWF2ZW5cbiAgICAvLyBtb2R1bGVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmQgZHJvcHBpbmcgdGhlIG1hdmVuIHRlbXBsYXRlIHdvdWxkIGxldCB0YXJnZXQvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnkuIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdFxuICAgIC8vIGxvY2tmaWxlKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIFB5dGhvbiBkaXJlY3RvcmllcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kXG4gICAgLy8gZHJvcHBpbmcgdGhlIHB5dGhvbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgX19weWNhY2hlX18vIGFuZCAudmVudi8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHwgY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydXN0Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZykge1xuICAgICAgLy8gIUNhcmdvLmxvY2sgb3ZlcnJpZGVzIGFueSBwcmUtZXhpc3RpbmcgdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgZnJvbSBhXG4gICAgICAvLyBwYXJlbnQgLmdpdGlnbm9yZSwgc28gdGhlIGFwcGxpY2F0aW9uIGxvY2tmaWxlIHN0YXlzIGNvbW1pdHRhYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAhQ2FyZ28ubG9ja1xuc3JjLXRhdXJpL2dlbi9zY2hlbWFzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNDbG91ZGZsYXJlIHx8IHJvb3RDb25maWcuaXNDbG91ZGZsYXJlKSB7XG4gICAgICAvLyAuZGV2LnZhcnMqIGhvbGQgbG9jYWwgc2VjcmV0cyBmb3Igd3JhbmdsZXIgZGV2IGFuZCBtdXN0IG5ldmVyIGJlIGNvbW1pdHRlZC5cbiAgICAgIC8vIC5lbnYuY2xvdWRmbGFyZSBjYXJyaWVzIENMT1VERkxBUkVfQVBJX1RPS0VOOiBDSSB3cml0ZXMgaXQgZnJvbSBhIHNlY3JldCwgYW5kIGEgbG9jYWxcbiAgICAgIC8vIGB3YiBkZXBsb3lgIG5lZWRzIGEgcmVhbCB0b2tlbiBpbiBpdCwgc28gY29tbWl0dGluZyBpdCB3b3VsZCBsZWFrIGFjY291bnQgY3JlZGVudGlhbHMuXG4gICAgICAvLyBJdCBpcyBsaXN0ZWQgZXhwbGljaXRseSBzbyB0aGUgQ2xvdWRmbGFyZS1zcGVjaWZpYyBjcmVkZW50aWFsIHBvbGljeSByZW1haW5zIHZpc2libGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi5lbnYuY2xvdWRmbGFyZVxuLndyYW5nbGVyL1xuYDtcbiAgICB9XG4gICAgLy8gSWdub3JlZCBvbmx5IHdoZXJlIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0LCBzbyB3YmZ5IG5ldmVyIGlnbm9yZXMgYSBmaWxlIHRoYXQgbm90aGluZyByZWNyZWF0ZXMuIFRoaXMga2VlcHNcbiAgICAvLyBpdHMgdGhvdXNhbmRzIG9mIGxpbmVzIG91dCBvZiBldmVyeSB3cmFuZ2xlciBidW1wJ3MgZGlmZi4gQW5jaG9yZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYmVjYXVzZSBgd3JhbmdsZXIgdHlwZXNgXG4gICAgLy8gYW5kIHRoZSBvcHQtb3V0IGRlbGV0aW9uIGJlbG93IG9ubHkgZXZlciB0b3VjaCB0aGlzIHBhY2thZ2UncyBvd24gZmlsZSwgbm90IGEgbmVzdGVkIG9uZSBhdCBhbnkgZGVwdGguXG4gICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiAhY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAvLyBPbiBhIGdlbnVpbmUgd29ya2VyLXR5cGVzIG9wdC1vdXQgKG5vdGhpbmcgY29uc3VtZXMgdGhlIGdlbmVyYXRlZCBmaWxlOyBnZW5lcmF0ZXNXb3JrZXJUeXBlc1xuICAgICAgLy8gYWxvbmUgaXMgZmFsc2UgZm9yIHVucmVsYXRlZCByZWFzb25zIHN1Y2ggYXMgYSBtaXNzaW5nIGxvY2FsIHdyYW5nbGVyIGRlcGVuZGVuY3ksIHdoZXJlIHRoZVxuICAgICAgLy8gZmlsZSBtYXkgc3RpbGwgYmUgY29uc3VtZWQpIHRoZSBpZ25vcmUgcnVsZVxuICAgICAgLy8gYWJvdmUgZGlzYXBwZWFycywgc28gYW4gYWxyZWFkeS1nZW5lcmF0ZWQgZmlsZSB3b3VsZCBzdXJmYWNlIGFzIHVudHJhY2tlZCBub2lzZSBvbiBldmVyeVxuICAgICAgLy8gY2hlY2tvdXQg4oCUIGRlbGV0ZSBpdC4gTm8gcmVwb3NpdG9yeSB0cmFja3MgdGhlIGZpbGUgKGRvY3MvZXhwZWN0ZWQtcmVwb3NpdG9yeS1ydWxlcy5tZCksXG4gICAgICAvLyBzbyBhbiBleGlzdGluZyBjb3B5IGlzIGFsd2F5cyBhIGRpc3Bvc2FibGUgZ2VuZXJhdGVkIG9uZS5cbiAgICAgIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtlclR5cGVzUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzLnByb21pc2VzLnJtKHdvcmtlclR5cGVzUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBnaXRpZ25vcmUgdHJlYXRzIGAjYCBhcyBhIGNvbW1lbnQgb25seSBhdCBsaW5lIHN0YXJ0LCBzbyBhIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4sIHZpbSdzIGAhKi5zdmcgICMgLi4uYClcbiAgICAvLyB0dXJucyB0aGUgd2hvbGUgbGluZSBpbnRvIGEgcGF0dGVybiB0aGF0IG5ldmVyIG1hdGNoZXMuXG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oW14jXFxzXS4qPylbIFxcdF0rKCMuKikkL2dtLCAnJDJcXG4kMScpO1xuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUncyB1bmFuY2hvcmVkIGRlYnVnLyB3b3VsZCBhbHNvIGhpZGUgZnJvbnRlbmQgc291cmNlXG4gICAgICAvLyBkaXJlY3RvcmllcyBzdWNoIGFzIHNyYy9kZWJ1Zy87IGNhcmdvIG91dHB1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGFyZ2V0Ly5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eZGVidWdcXC8kL2dtLCAnIyBkZWJ1Zy8nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8IGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcykge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUgaWdub3JlcyBDYXJnby5sb2NrLCBidXQgYSBzcmMtdGF1cmkgY29uZmlndXJhdGlvbiBtYXJrcyBhblxuICAgICAgLy8gYXBwbGljYXRpb24sIHdob3NlIENhcmdvLmxvY2sgbXVzdCBiZSBjb21taXR0ZWQgZm9yIHJlcHJvZHVjaWJsZSBidWlsZHMuIFRoZVxuICAgICAgLy8gcnVsZSBpcyBhbHNvIGRpc2FibGVkIHdoZW4gYSBzdWIgcGFja2FnZSBjb250YWlucyBhIFRhdXJpIGFwcGxpY2F0aW9uLCBiZWNhdXNlXG4gICAgICAvLyBhbiB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBpbiBhIHBhcmVudCAuZ2l0aWdub3JlIHdvdWxkIGhpZGUgdGhlIG5lc3RlZFxuICAgICAgLy8gYXBwbGljYXRpb24ncyBsb2NrZmlsZS4gVGF1cmkgcGx1Z2luIGxpYnJhcmllcyAoZGV0ZWN0ZWQgb25seSB2aWFcbiAgICAgIC8vIEB0YXVyaS1hcHBzLyogZGVwZW5kZW5jaWVzKSBrZWVwIHRoZSB0ZW1wbGF0ZSdzIHBvbGljeSBvZiBpZ25vcmluZyBDYXJnby5sb2NrLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15DYXJnb1xcLmxvY2skL2dtLCAnIyBDYXJnby5sb2NrJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiB3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBjYXJyaWVzIGluIHRoZSByZXBvc2l0b3J5LiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCByZXdyaXRlc1xuICogaXQgaW4gdGhlIHB1Ymxpc2hlZCB0YXJiYWxsIG9ubHkgKGl0IGlzIG5ldmVyIGNvbW1pdHRlZCBiYWNrKSwgc28gYSB3YmZ5IHJ1biBzdGFydGVkIGZyb20gYSBnaXRcbiAqIGNoZWNrb3V0IHJlcG9ydHMgdGhpcyBwbGFjZWhvbGRlciBpbnN0ZWFkIG9mIGEgcmVhbCB2ZXJzaW9uLlxuICovXG5jb25zdCB1bnJlbGVhc2VkVmVyc2lvblByZWZpeCA9ICcwLjAuMC0nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb24oKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS52ZXJzaW9uO1xufVxuXG4vKiogd2JmeSdzIGxvY2F0aW9uIGluc2lkZSBpdHMgb3duIHJlcG9zaXRvcnksIHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QuICovXG5jb25zdCB3YmZ5RGlyUGF0aEluUmVwbyA9IHBhdGguam9pbigncGFja2FnZXMnLCAnd2JmeScpO1xuXG4vKipcbiAqIElkZW50aWZpZXMgdGhlIHdiZnkgYnVpbGQgdGhhdCBwcm9kdWNlZCB0aGUgZ2VuZXJhdGVkIGZpbGVzOiB0aGUgcmVsZWFzZWQgdmVyc2lvbiwgb3JcbiAqIGA8c2hvcnQgY29tbWl0IGhhc2g+Wy1kaXJ0eV0tbG9jYWxgIHdoZW4gd2JmeSBydW5zIGZyb20gaXRzIG93biBnaXQgY2hlY2tvdXQuIFVuZGVmaW5lZCB3aGVuXG4gKiBuZWl0aGVyIGlzIGF2YWlsYWJsZSAoZS5nLiBhbiB1bnJlbGVhc2VkIGJ1aWxkIGV4dHJhY3RlZCBmcm9tIGEgc291cmNlIGFyY2hpdmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBOZWl0aGVyIHRoZSBpbnN0YWxsZWQgcGFja2FnZS5qc29uIG5vciB0aGUgZ2l0IHN0YXRlIG9mIHdiZnkncyBvd24gY2hlY2tvdXQgY2FuIGNoYW5nZVxuICAvLyBtaWQtcnVuLCBhbmQgY29tcHV0aW5nIHRoZSBsYWJlbCBzcGF3bnMgc2V2ZXJhbCBnaXQgc3VicHJvY2Vzc2VzLCBzbyBpdCBpcyBjb21wdXRlZCBvbmNlLlxuICBpZiAoIWhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsKSB7XG4gICAgY2FjaGVkVmVyc2lvbkxhYmVsID0gY29tcHV0ZVdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgICBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25MYWJlbDtcbn1cblxubGV0IGhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsID0gZmFsc2U7XG5sZXQgY2FjaGVkVmVyc2lvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiwgZGlyUGF0aCB9ID0gcmVhZFdiZnlQYWNrYWdlSnNvbigpO1xuICBpZiAoIXZlcnNpb24uc3RhcnRzV2l0aCh1bnJlbGVhc2VkVmVyc2lvblByZWZpeCkpIHJldHVybiB2ZXJzaW9uO1xuXG4gIC8vIGdpdCByZXNvbHZlcyB0aGUgTkVBUkVTVCBlbmNsb3NpbmcgcmVwb3NpdG9yeSwgd2hpY2ggZm9yIGFuIHVucmVsZWFzZWQgYnVpbGQgcGxhY2VkIHVuZGVyIGFcbiAgLy8gdGFyZ2V0IHJlcG9zaXRvcnkgKG5vZGVfbW9kdWxlcywgb3IgYSB2ZW5kb3JlZC9leHRyYWN0ZWQgc291cmNlIHRyZWUpIGlzIHRoYXQgcmVwb3NpdG9yeSDigJQgaXRzXG4gIC8vIGNvbW1pdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHdiZnkgYnVpbGQgdGhhdCByYW4uIE9ubHkgd2JmeSdzIG93biBsb2NhdGlvbiBpbnNpZGUgaXRzIG93blxuICAvLyByZXBvc2l0b3J5IGlkZW50aWZpZXMgYSBnZW51aW5lIGNoZWNrb3V0LCBzbyBhbnl0aGluZyBlbHNlIGZhbGxzIGJhY2sgdG8gdGhlIHZlcnNpb24tbGVzcyBsYWJlbC5cbiAgY29uc3QgZ2l0Um9vdERpclBhdGggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG93LXRvcGxldmVsJ10sIGRpclBhdGgpO1xuICBpZiAoXG4gICAgIWdpdFJvb3REaXJQYXRoIHx8XG4gICAgcGF0aC5yZWxhdGl2ZShnaXRSb290RGlyUGF0aCwgZGlyUGF0aCkgIT09IHdiZnlEaXJQYXRoSW5SZXBvIHx8XG4gICAgIWlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGgpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgY29tbWl0SGFzaCA9IHJ1bkdpdChbJ3Jldi1wYXJzZScsICctLXNob3J0PTgnLCAnSEVBRCddLCBkaXJQYXRoKTtcbiAgaWYgKCFjb21taXRIYXNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBUaGUgY29tbWl0IGFsb25lIHdvdWxkIG1pc2lkZW50aWZ5IGEgYnVpbGQgbWFkZSBmcm9tIGFuIGVkaXRlZCBjaGVja291dCwgc28gdW5jb21taXR0ZWQgY2hhbmdlc1xuICAvLyBhcmUgcmVwb3J0ZWQgdG9vIOKAlCBidXQgb25seSB1bmRlciBwYWNrYWdlcy8qL3NyYywgcGFja2FnZXMvKi9iaW4gYW5kIHBhY2thZ2VzLyovY29uZmlncywgdGhlXG4gIC8vIHNvdXJjZSwgZW50cnktcG9pbnQgd3JhcHBlciBhbmQgcG9saWN5IGZpbGVzIHdiZnkgYW5kIGl0cyB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IHJ1blxuICAvLyBmcm9tLiBFdmVyeXRoaW5nIHdiZnkgR0VORVJBVEVTIHdoZW4gaXQgdGFyZ2V0cyBpdHMgb3duIHJlcG9zaXRvcnkgbGl2ZXMgb3V0c2lkZSB0aG9zZSAodGhlXG4gIC8vIHJvb3QgUkVBRE1FIHRoaXMgbGFiZWwgZ29lcyBpbnRvLCBhbmQgZWFjaCBwYWNrYWdlJ3MgLmdpdGlnbm9yZSwgcGFja2FnZS5qc29uLCB0c2NvbmZpZywg4oCmKSwgc29cbiAgLy8gYSBmaXJzdCBydW4gY2Fubm90IG1ha2UgdGhlIG5leHQgb25lIHJlbGFiZWwgdGhlIGJhZGdlIGAtZGlydHktbG9jYWxgIGJ5IGl0c2VsZi5cbiAgLy8gTWFuaWZlc3RzIHN0YXkgb3V0IG9uIHB1cnBvc2UsIGV2ZW4gdGhvdWdoIGFuIGVkaXRlZCBgZXhwb3J0c2AgbWFwIGNhbiByZWRpcmVjdCB3aGljaCBjb2RlXG4gIC8vIGxvYWRzOiB3YmZ5IEdFTkVSQVRFUyBwYWNrYWdlLmpzb24sIHNvIGluY2x1ZGluZyBpdCB3b3VsZCBtYWtlIGV2ZXJ5IHJ1biByZXBvcnQgaXRzZWxmIGRpcnR5LlxuICAvLyBUaGUgbGFiZWwgaXMgYmVzdC1lZmZvcnQgYnVpbGQgcHJvdmVuYW5jZSwgbm90IGEgcmVwcm9kdWNpYmxlLWJ1aWxkIGF0dGVzdGF0aW9uLlxuICBjb25zdCBpc0RpcnR5ID0gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aCk7XG4gIGlmIChpc0RpcnR5ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpc0RpcnR5KSByZXR1cm4gYCR7Y29tbWl0SGFzaH0tZGlydHktbG9jYWxgO1xuICAvLyBBbiB1bm1vZGlmaWVkIGNoZWNrb3V0IHNpdHRpbmcgb24gYSByZWxlYXNlIHRhZyBydW5zIGV4YWN0bHkgdGhlIGNvZGUgdGhhdCB3YXMgcHVibGlzaGVkIHVuZGVyXG4gIC8vIHRoYXQgdmVyc2lvbiwgc28gaXQgaXMgbGFiZWxlZCB3aXRoIHRoZSB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGNvbW1pdCB0aGF0IG9ubHkgd2JmeSBkZXZlbG9wZXJzXG4gIC8vIGNvdWxkIHJlc29sdmUgYmFjayB0byBvbmUuXG4gIHJldHVybiBmaW5kUmVsZWFzZWRWZXJzaW9uQXRIZWFkKG5hbWUsIGRpclBhdGgpID8/IGAke2NvbW1pdEhhc2h9LWxvY2FsYDtcbn1cblxuLyoqIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHRhZ3MgZWFjaCByZWxlYXNlIGA8cGFja2FnZSBuYW1lPkA8dmVyc2lvbj5gLiAqL1xuZnVuY3Rpb24gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChwYWNrYWdlTmFtZTogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IGAke3BhY2thZ2VOYW1lfUBgO1xuICAvLyBBIGNvbW1pdCBjYXJyaWVzIGF0IG1vc3Qgb25lIHJlbGVhc2UgdGFnIHBlciBwYWNrYWdlLCBzbyB0aGUgZmlyc3QgbWF0Y2ggaXMgdGhlIG9ubHkgbWF0Y2guXG4gIHJldHVybiBydW5HaXQoWyd0YWcnLCAnLS1wb2ludHMtYXQnLCAnSEVBRCddLCBjd2QpXG4gICAgPy5zcGxpdCgnXFxuJylcbiAgICAuZmluZCgodGFnKSA9PiB0YWcuc3RhcnRzV2l0aCh0YWdQcmVmaXgpKVxuICAgID8uc2xpY2UodGFnUHJlZml4Lmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBFdmVyeSByZW1vdGUgY291bnRzLCBub3QganVzdCBgb3JpZ2luYDogYSBmb3JrIGNoZWNrb3V0IGNhcnJpZXMgdGhlIGNhbm9uaWNhbCByZXBvc2l0b3J5IGFzXG4gIC8vIGB1cHN0cmVhbWAsIGFuZCBpdCBpcyBzdGlsbCBhIGdlbnVpbmUgd2JmeSBjaGVja291dCB3aG9zZSBjb21taXQgaWRlbnRpZmllcyB0aGUgYnVpbGQuXG4gIGNvbnN0IHJlbW90ZVVybHMgPSBydW5HaXQoWydyZW1vdGUnLCAnLXYnXSwgZ2l0Um9vdERpclBhdGgpO1xuICByZXR1cm4gISFyZW1vdGVVcmxzPy5zcGxpdCgnXFxuJykuc29tZSgobGluZSkgPT4gaXNDYW5vbmljYWxSZW1vdGVVcmwobGluZS5zcGxpdCgvWyBcXHRdKy91KVsxXSA/PyAnJykpO1xufVxuXG5jb25zdCBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aCA9IC9eXFwvP1dpbGxCb29zdGVyXFwvc2hhcmVkKD86XFwuZ2l0KT8kL2l1O1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbW90ZSBVUkwgcG9pbnRzIGF0IHdiZnkncyBvd24gcmVwb3NpdG9yeS4gVGhlIGhvc3QgaXMgY29tcGFyZWQgYWZ0ZXIgUEFSU0lORyByYXRoZXJcbiAqIHRoYW4gbWF0Y2hlZCBpbnNpZGUgdGhlIHN0cmluZzogYW55IHBhdHRlcm4gbG9vc2UgZW5vdWdoIHRvIGFjY2VwdCBldmVyeSBVUkwgZm9ybSBnaXQgc3VwcG9ydHNcbiAqIGFsc28gYWNjZXB0ZWQgYSBsb29rYWxpa2UgdGhhdCBtZXJlbHkgY29udGFpbnMgdGhlIGhvc3QsIHN1Y2ggYXNcbiAqIGBodHRwczovL2V2aWwuZXhhbXBsZS8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCwgbGV0dGluZyBhbiB1bnJlbGF0ZWQgY2hlY2tvdXQgY2xhaW0gdG9cbiAqIGJlIGEgZ2VudWluZSB3YmZ5IGJ1aWxkLlxuICovXG5mdW5jdGlvbiBpc0Nhbm9uaWNhbFJlbW90ZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBzY3Atc3R5bGUgKGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCkgaXMgbm90IGEgVVJMLCBzbyBpdCBpcyBtYXRjaGVkIHNlcGFyYXRlbHkuXG4gIC8vIFRoZSBsb29rYWhlYWQga2VlcHMgYSBzY2hlbWUncyBgOi8vYCBmcm9tIGJlaW5nIHJlYWQgYXMgdGhlIGBob3N0OnBhdGhgIHNlcGFyYXRvci5cbiAgY29uc3Qgc2NwTWF0Y2ggPSAvXig/OlteQC9dK0ApPyhbXi86XSspOig/IVxcLykoLiopJC91LmV4ZWModXJsKTtcbiAgaWYgKHNjcE1hdGNoKSB7XG4gICAgcmV0dXJuIHNjcE1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbScgJiYgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGgudGVzdChzY3BNYXRjaFsyXSEpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgeyBob3N0bmFtZSwgcGF0aG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3QocGF0aG5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbXG4gICAgICAnc3RhdHVzJyxcbiAgICAgICctLXBvcmNlbGFpbicsXG4gICAgICAnLS11bnRyYWNrZWQtZmlsZXM9YWxsJyxcbiAgICAgICctLScsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9zcmMvKipgLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9LyovYmluLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2NvbmZpZ3MvKipgLFxuICAgIF0sXG4gICAgeyBjd2Q6IGdpdFJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gISFwcm9jLnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1bkdpdChhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIGFyZ3MsIHsgY3dkLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICByZXR1cm4gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkV2JmeVBhY2thZ2VKc29uOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBkaXJQYXRoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuLyoqIFJldHVybnMgd2JmeSdzIG93biBwYWNrYWdlIGRpcmVjdG9yeSwgd2hpY2ggYWxzbyBob2xkcyBpdHMgY29uZmlncyAoZS5nLiByZWxlYXNlQWdlR2F0ZS5qc29uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5RGlyUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFdiZnlQYWNrYWdlSnNvbigpLmRpclBhdGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRXYmZ5UGFja2FnZUpzb24oKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0ge1xuICBpZiAoY2FjaGVkV2JmeVBhY2thZ2VKc29uKSByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xuICAvLyBmaWxlVVJMVG9QYXRoLCBub3QgVVJMLnBhdGhuYW1lOiB0aGUgbGF0dGVyIGtlZXBzIHBlcmNlbnQtZW5jb2RpbmcsIHNvIGFuIGluc3RhbGxhdGlvbiBwYXRoXG4gIC8vIGNvbnRhaW5pbmcgZS5nLiBhIHNwYWNlIHdvdWxkIHJlc29sdmUgdG8gYSBub25leGlzdGVudCBkaXJlY3RvcnkgYW5kIHRoZSBzZWFyY2ggd291bGQgd2FsayB1cFxuICAvLyB0byBhbiB1bnJlbGF0ZWQgcGFja2FnZS5cbiAgbGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICAvLyBwYXRoLmRpcm5hbWUoJy8nKSA9PT0gJy8nLCBzbyB0aGUgc2VhcmNoIG11c3Qgc3RvcCBleHBsaWNpdGx5IGF0IHRoZSBmaWxlc3lzdGVtIHJvb3QuXG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGRpclBhdGgpIHRocm93IG5ldyBFcnJvcihcIndiZnkncyBvd24gcGFja2FnZS5qc29uIGlzIG1pc3NpbmcuXCIpO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIGNhY2hlZFdiZnlQYWNrYWdlSnNvbiA9IHsgbmFtZTogcGFja2FnZUpzb24ubmFtZSwgdmVyc2lvbjogcGFja2FnZUpzb24udmVyc2lvbiwgZGlyUGF0aCB9O1xuICByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldFdiZnlEaXJQYXRoIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbi8qKlxuICogQXBwbGllcyB0aGUgb3JnYW5pemF0aW9uJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhlIGRldmVsb3BlciBtYWNoaW5lJ3MgR0xPQkFMXG4gKiBwYWNrYWdlLW1hbmFnZXIgY29uZmlncy4gUmVwb3NpdG9yeSBjb25maWdzIGd1YXJkIG9ubHkgd2JmaWVkIHJlcG9zaXRvcmllczsgYSBicmFuZC1uZXcgbG9jYWxcbiAqIHByb2plY3QgaGFzIG5vIGJ1bmZpZy50b21sIHlldCwgc28gdGhlIGdsb2JhbCBmaWxlcyBhcmUgdGhlIG9ubHkgZ2F0ZSBiZXR3ZWVuIGBidW4gY3JlYXRlYCAvXG4gKiBgbnBtIGluaXRgIGFuZCBhIGZyZXNobHkgY29tcHJvbWlzZWQgcmVsZWFzZS4gVGhlIHNhbWUgc2NyaXB0IHJ1bnMgb24gQ0kgYW5kIG9uIHRoZSBzZWxmLWhvc3RlZFxuICogcnVubmVycywgc28gZXZlcnkgbWFjaGluZSBlbmRzIHVwIHdpdGggYnl0ZS1pZGVudGljYWwgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoJ2Jhc2gnLCBbcGF0aC5qb2luKGdldFdiZnlEaXJQYXRoKCksICdjb25maWdzJywgJ2FwcGx5UmVsZWFzZUFnZUdhdGUuc2gnKV0sIHtcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYXBwbHkgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuJyk7XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBLZWVwIHBhY2thZ2UtbWFuYWdlciBzaGltcyBpbiB0aGUgRmlsZSBXYXRjaGVyIHByb2dyYW0gZmllbGQgc28gbm9kZSBkb2VzIG5vdFxuLy8gcGFyc2Ugd3JhcHBlciBzY3JpcHRzIHBhc3NlZCB0aHJvdWdoIGFyZ3VtZW50cy5cbmNvbnN0IG94Zm10UHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL294Zm10JztcbmNvbnN0IHByZXR0aWVyUHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZylcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWcpKSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhc2tPcHRpb25zID0gW1xuICAgIHtcbiAgICAgIGFyZ3M6ICctLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLm94Zm10LFxuICAgICAgbmFtZTogJ094Zm10JyxcbiAgICAgIHByb2dyYW06IG94Zm10UHJvZ3JhbSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFyZ3M6ICctLWNhY2hlIC0td3JpdGUnLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkphdmEoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5LFxuICAgICAgbmFtZTogJ1ByZXR0aWVyJyxcbiAgICAgIHByb2dyYW06IHByZXR0aWVyUHJvZ3JhbSxcbiAgICB9LFxuICBdXG4gICAgLmZpbHRlcigodGFzaykgPT4gdGFzay5jb25kaXRpb24pXG4gICAgLmZsYXRNYXAoKHRhc2spID0+IHRhc2suZXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnModGFzay5wcm9ncmFtLCB0YXNrLmFyZ3MsIHRhc2submFtZSwgZXh0KSkpO1xuXG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4gICAgJHt0YXNrT3B0aW9ucy5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJz4sXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgIXNjcmlwdHM/LlsnZ2VuLWkxOG4tdHMnXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuICdidW4gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsJztcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/IFtdKSwgLi4uT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KHNvcnRGbildXG5cbiAgZm9yIChrZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgIGlmIChoYXMob2JqZWN0LCBrZXkpKSB7XG4gICAgICB0b3RhbFtrZXldID0gb2JqZWN0W2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxcbn1cbiIsIi8vIERldGVjdCBlaXRoZXIgc3BhY2VzIG9yIHRhYnMgYnV0IG5vdCBib3RoIHRvIHByb3Blcmx5IGhhbmRsZSB0YWJzIGZvciBpbmRlbnRhdGlvbiBhbmQgc3BhY2VzIGZvciBhbGlnbm1lbnRcbmNvbnN0IElOREVOVF9SRUdFWCA9IC9eKD86KCApK3xcXHQrKS87XG5cbmNvbnN0IElOREVOVF9UWVBFX1NQQUNFID0gJ3NwYWNlJztcbmNvbnN0IElOREVOVF9UWVBFX1RBQiA9ICd0YWInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSBzaW5nbGUgc3BhY2UgcGF0dGVybnNcbmZ1bmN0aW9uIHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgdmFsdWUpIHtcblx0cmV0dXJuIGlnbm9yZVNpbmdsZVNwYWNlcyAmJiBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSAmJiB2YWx1ZSA9PT0gMTtcbn1cblxuLyoqXG5NYWtlIGEgTWFwIHRoYXQgY291bnRzIGhvdyBtYW55IGluZGVudHMvdW5pbmRlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gc2l6ZSBhbmQgaG93IG1hbnkgbGluZXMgZm9sbG93IGEgZ2l2ZW4gaW5kZW50YXRpb24uXG5cblRoZSBrZXkgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbmRlbnRhdGlvbiB0eXBlIChzID0gc3BhY2UgYW5kIHQgPSB0YWIpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMuXG5cbmBgYFxuaW5kZW50cyA9IHtcblx0dDM6IFsxLCAwXSxcblx0dDQ6IFsxLCA1XSxcblx0czU6IFsxLCAwXSxcblx0czEyOiBbMSwgMF0sXG59XG5gYGBcbiovXG5mdW5jdGlvbiBtYWtlSW5kZW50c01hcChzdHJpbmcsIGlnbm9yZVNpbmdsZVNwYWNlcykge1xuXHRjb25zdCBpbmRlbnRzID0gbmV3IE1hcCgpO1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBzaXplIG9mIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvblxuXHRsZXQgcHJldmlvdXNTaXplID0gMDtcblx0bGV0IHByZXZpb3VzSW5kZW50VHlwZTtcblxuXHQvLyBJbmRlbnRzIGtleSAoaWRlbnQgdHlwZSArIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzKVxuXHRsZXQga2V5O1xuXG5cdGZvciAoY29uc3QgbGluZSBvZiBzdHJpbmcuc3BsaXQoL1xcbi9nKSkge1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0Ly8gSWdub3JlIGVtcHR5IGxpbmVzXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBtYXRjaGVzID0gbGluZS5tYXRjaChJTkRFTlRfUkVHRVgpO1xuXG5cdFx0aWYgKG1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaW5kZW50ID0gbWF0Y2hlc1swXS5sZW5ndGg7XG5cdFx0XHRjb25zdCBpbmRlbnRUeXBlID0gbWF0Y2hlc1sxXSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIHVubGVzcyBpdCdzIHRoZSBvbmx5IGluZGVudCBkZXRlY3RlZCB0byBwcmV2ZW50IGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXNcblx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGluZGVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRlbnRUeXBlICE9PSBwcmV2aW91c0luZGVudFR5cGUpIHtcblx0XHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdH1cblxuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gaW5kZW50VHlwZTtcblxuXHRcdFx0bGV0IHVzZSA9IDE7XG5cdFx0XHRsZXQgd2VpZ2h0ID0gMDtcblxuXHRcdFx0Y29uc3QgaW5kZW50RGlmZmVyZW5jZSA9IGluZGVudCAtIHByZXZpb3VzU2l6ZTtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IGluZGVudDtcblxuXHRcdFx0Ly8gUHJldmlvdXMgbGluZSBoYXZlIHNhbWUgaW5kZW50P1xuXHRcdFx0aWYgKGluZGVudERpZmZlcmVuY2UgPT09IDApIHtcblx0XHRcdFx0Ly8gTm90IGEgbmV3IFwidXNlXCIgb2YgdGhlIGN1cnJlbnQgaW5kZW50OlxuXHRcdFx0XHR1c2UgPSAwO1xuXHRcdFx0XHQvLyBCdXQgZG8gYWRkIGEgYml0IHRvIGl0IGZvciBicmVha2luZyB0aWVzOlxuXHRcdFx0XHR3ZWlnaHQgPSAxO1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGtleSBmcm9tIHByZXZpb3VzIGxvb3Bcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSA9IE1hdGguYWJzKGluZGVudERpZmZlcmVuY2UpO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgY2hhbmdlcyB3aGVuIGlnbm9yZVNpbmdsZVNwYWNlcyBpcyB0cnVlXG5cdFx0XHRcdC8vIFRoaXMgcHJldmVudHMgY29tbW9uIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoaW5ncyBsaWtlIGFsaWduZWQgY29tbWVudHNcblx0XHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHN0YXRzXG5cdFx0XHRjb25zdCBlbnRyeSA9IGluZGVudHMuZ2V0KGtleSk7XG5cdFx0XHRpbmRlbnRzLnNldChrZXksIGVudHJ5ID09PSB1bmRlZmluZWQgPyBbMSwgMF0gOiBbZW50cnlbMF0gKyB1c2UsIGVudHJ5WzFdICsgd2VpZ2h0XSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGluZGVudHM7XG59XG5cbi8vIEVuY29kZSB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBhcyBhIHN0cmluZyAoZS5nLiAnczQnKSBmb3IgdXNlIGFzIGEgY29tcG91bmQga2V5IGluIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgaW5kZW50QW1vdW50KSB7XG5cdGNvbnN0IHR5cGVDaGFyYWN0ZXIgPSBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICdzJyA6ICd0Jztcblx0cmV0dXJuIHR5cGVDaGFyYWN0ZXIgKyBTdHJpbmcoaW5kZW50QW1vdW50KTtcbn1cblxuLy8gRXh0cmFjdCB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBmcm9tIGEga2V5IG9mIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGRlY29kZUluZGVudHNLZXkoaW5kZW50c0tleSkge1xuXHRjb25zdCBrZXlIYXNUeXBlU3BhY2UgPSBpbmRlbnRzS2V5WzBdID09PSAncyc7XG5cdGNvbnN0IHR5cGUgPSBrZXlIYXNUeXBlU3BhY2UgPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRjb25zdCBhbW91bnQgPSBOdW1iZXIoaW5kZW50c0tleS5zbGljZSgxKSk7XG5cblx0cmV0dXJuIHt0eXBlLCBhbW91bnR9O1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSAoZS5nLiAnczQnKSBmcm9tIHRoZSBpbmRlbnRzIE1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vc3QgY29tbW9uIGluZGVudCxcbi8vIG9yIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGluZGVudHMuXG5mdW5jdGlvbiBnZXRNb3N0VXNlZEtleShpbmRlbnRzKSB7XG5cdGxldCByZXN1bHQ7XG5cdGxldCBtYXhVc2VkID0gMDtcblx0bGV0IG1heFdlaWdodCA9IDA7XG5cblx0Zm9yIChjb25zdCBba2V5LCBbdXNlZENvdW50LCB3ZWlnaHRdXSBvZiBpbmRlbnRzKSB7XG5cdFx0aWYgKHVzZWRDb3VudCA+IG1heFVzZWQgfHwgKHVzZWRDb3VudCA9PT0gbWF4VXNlZCAmJiB3ZWlnaHQgPiBtYXhXZWlnaHQpKSB7XG5cdFx0XHRtYXhVc2VkID0gdXNlZENvdW50O1xuXHRcdFx0bWF4V2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KSB7XG5cdGNvbnN0IGluZGVudENoYXJhY3RlciA9IHR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJyAnIDogJ1xcdCc7XG5cdHJldHVybiBpbmRlbnRDaGFyYWN0ZXIucmVwZWF0KGFtb3VudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIElkZW50aWZ5IGluZGVudHMgd2hpbGUgc2tpcHBpbmcgc2luZ2xlIHNwYWNlIGluZGVudHMgdG8gYXZvaWQgY29tbW9uIGVkZ2UgY2FzZXMgKGUuZy4gY29kZSBjb21tZW50cylcblx0Ly8gSWYgbm8gaW5kZW50cyBhcmUgaWRlbnRpZmllZCwgcnVuIGFnYWluIGFuZCBpbmNsdWRlIGFsbCBpbmRlbnRzIGZvciBjb21wcmVoZW5zaXZlIGRldGVjdGlvblxuXHRsZXQgaW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgdHJ1ZSk7XG5cdGlmIChpbmRlbnRzLnNpemUgPT09IDApIHtcblx0XHRpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBmYWxzZSk7XG5cdH1cblxuXHRjb25zdCBrZXlPZk1vc3RVc2VkSW5kZW50ID0gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cyk7XG5cblx0bGV0IHR5cGU7XG5cdGxldCBhbW91bnQgPSAwO1xuXHRsZXQgaW5kZW50ID0gJyc7XG5cblx0aWYgKGtleU9mTW9zdFVzZWRJbmRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdCh7dHlwZSwgYW1vdW50fSA9IGRlY29kZUluZGVudHNLZXkoa2V5T2ZNb3N0VXNlZEluZGVudCkpO1xuXHRcdGluZGVudCA9IG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YW1vdW50LFxuXHRcdHR5cGUsXG5cdFx0aW5kZW50LFxuXHR9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRjb25zdCBuZXdsaW5lcyA9IHN0cmluZy5tYXRjaCgvKD86XFxyP1xcbikvZykgfHwgW107XG5cblx0aWYgKG5ld2xpbmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNybGYgPSBuZXdsaW5lcy5maWx0ZXIobmV3bGluZSA9PiBuZXdsaW5lID09PSAnXFxyXFxuJykubGVuZ3RoO1xuXHRjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG5cblx0cmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lR3JhY2VmdWwoc3RyaW5nKSB7XG5cdHJldHVybiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0TmV3bGluZShzdHJpbmcpKSB8fCAnXFxuJztcbn1cbiIsIiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS93aXJlaXRcbmNvbnN0IHdpcmVpdFNjcmlwdFByb3BlcnRpZXMgPSBbJ2NvbW1hbmQnLCAnZGVwZW5kZW5jaWVzJywgJ2ZpbGVzJywgJ291dHB1dCddXG5jb25zdCBzb3J0V2lyZWl0U2NyaXB0ID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeSh3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdkZXBlbmRlbmNpZXMnLFxuICAgIG9uQXJyYXkoKGRlcHMpID0+IGRlcHMubWFwKHNvcnRPYmplY3RCeShbJ3NjcmlwdCcsICdjYXNjYWRlJ10pKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZW52JyxcbiAgICBvbk9iamVjdCgoZW52KSA9PlxuICAgICAgc29ydE9iamVjdEtleXMoXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhlbnYpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBzb3J0T2JqZWN0QnkoWydleHRlcm5hbCcsICdkZWZhdWx0J10pKHZhbHVlKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdzZXJ2aWNlJyxcbiAgICBwaXBlKFtzb3J0T2JqZWN0QnkoWydyZWFkeVdoZW4nXSksIG92ZXJQcm9wZXJ0eSgncmVhZHlXaGVuJywgc29ydE9iamVjdCldKSxcbiAgKSxcbl0pXG5jb25zdCBzb3J0V2lyZWl0ID0gb25PYmplY3QoKHdpcmVpdCkgPT5cbiAgc29ydE9iamVjdEtleXMoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMod2lyZWl0KS5tYXAoKFtuYW1lLCBjb25maWddKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNvcnRXaXJlaXRTY3JpcHQoY29uZmlnKSxcbiAgICAgIF0pLFxuICAgICksXG4gICksXG4pXG5jb25zdCBzb3J0RGV2RW5naW5lcyA9IG92ZXJQcm9wZXJ0eShcbiAgJ3BhY2thZ2VNYW5hZ2VyJyxcbiAgc29ydE9iamVjdEJ5KFsnbmFtZScsICd2ZXJzaW9uJywgJ29uRmFpbCddKSxcbilcblxuY29uc3QgcG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAncGVlckRlcGVuZGVuY3lSdWxlcycsXG4gICduZXZlckJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXNGaWxlJyxcbiAgJ2FsbG93ZWREZXByZWNhdGVkVmVyc2lvbnMnLFxuICAnYWxsb3dOb25BcHBsaWVkUGF0Y2hlcycsXG4gICd1cGRhdGVDb25maWcnLFxuICAnYXVkaXRDb25maWcnLFxuICAncmVxdWlyZWRTY3JpcHRzJyxcbiAgJ3N1cHBvcnRlZEFyY2hpdGVjdHVyZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ3BhdGNoZWREZXBlbmRlbmNpZXMnLFxuICAncGFja2FnZUV4dGVuc2lvbnMnLFxuXVxuXG5jb25zdCBzb3J0UG5wbUNvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkocG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzLCB0cnVlKSxcbiAgb3ZlclByb3BlcnR5KCdvdmVycmlkZXMnLCBzb3J0T2JqZWN0QnlTZW12ZXIpLFxuXSlcblxuLy8gU2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vbWlzYy9zY3JpcHRzXG5jb25zdCBkZWZhdWx0TnBtU2NyaXB0cyA9IG5ldyBTZXQoW1xuICAnaW5zdGFsbCcsXG4gICdwYWNrJyxcbiAgJ3ByZXBhcmUnLFxuICAncHVibGlzaCcsXG4gICdyZXN0YXJ0JyxcbiAgJ3Nocmlua3dyYXAnLFxuICAnc3RhcnQnLFxuICAnc3RvcCcsXG4gICd0ZXN0JyxcbiAgJ3VuaW5zdGFsbCcsXG4gICd2ZXJzaW9uJyxcbl0pXG5cbmNvbnN0IGhhc0RldkRlcGVuZGVuY3kgPSAoZGVwZW5kZW5jeSwgcGFja2FnZUpzb24pID0+IHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLCAnZGV2RGVwZW5kZW5jaWVzJykgJiZcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcywgZGVwZW5kZW5jeSlcbiAgKVxufVxuXG5jb25zdCBydW5TUmVnRXhwID1cbiAgLyg/PD1efFtcXHMmOzw+fChdKSg/OnJ1bi1zfG5wbS1ydW4tYWxsMj8gLiooPzotLXNlcXVlbnRpYWx8LS1zZXJpYWx8LXMpKSg/PSR8W1xccyY7PD58KV0pL1xuXG5jb25zdCBpc1NlcXVlbnRpYWxTY3JpcHQgPSAoY29tbWFuZCkgPT5cbiAgY29tbWFuZC5pbmNsdWRlcygnKicpICYmIHJ1blNSZWdFeHAudGVzdChjb21tYW5kKVxuXG5jb25zdCBoYXNTZXF1ZW50aWFsU2NyaXB0ID0gKHBhY2thZ2VKc29uKSA9PiB7XG4gIGlmIChcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwnLCBwYWNrYWdlSnNvbikgJiZcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwyJywgcGFja2FnZUpzb24pXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IHNjcmlwdHMgPSBbJ3NjcmlwdHMnLCAnYmV0dGVyU2NyaXB0cyddLmZsYXRNYXAoKGZpZWxkKSA9PlxuICAgIHBhY2thZ2VKc29uW2ZpZWxkXSA/IE9iamVjdC52YWx1ZXMocGFja2FnZUpzb25bZmllbGRdKSA6IFtdLFxuICApXG4gIHJldHVybiBzY3JpcHRzLnNvbWUoKHNjcmlwdCkgPT4gaXNTZXF1ZW50aWFsU2NyaXB0KHNjcmlwdCkpXG59XG5cbmZ1bmN0aW9uIHNvcnRTY3JpcHROYW1lcyhrZXlzLCBwcmVmaXggPSAnJykge1xuICBjb25zdCBncm91cE1hcCA9IG5ldyBNYXAoKVxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgcmVzdCA9IHByZWZpeCA/IGtleS5zbGljZShwcmVmaXgubGVuZ3RoICsgMSkgOiBrZXlcbiAgICBjb25zdCBpZHggPSByZXN0LmluZGV4T2YoJzonKVxuICAgIGlmIChpZHggPiAwKSB7XG4gICAgICBjb25zdCBiYXNlID0ga2V5LnNsaWNlKDAsIChwcmVmaXggPyBwcmVmaXgubGVuZ3RoICsgMSA6IDApICsgaWR4KVxuICAgICAgaWYgKCFncm91cE1hcC5oYXMoYmFzZSkpIGdyb3VwTWFwLnNldChiYXNlLCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChiYXNlKS5wdXNoKGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cE1hcC5oYXMoa2V5KSkgZ3JvdXBNYXAuc2V0KGtleSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoa2V5KS5wdXNoKGtleSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBNYXAua2V5cygpKVxuICAgIC5zb3J0KClcbiAgICAuZmxhdE1hcCgoZ3JvdXBLZXkpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ3JvdXBNYXAuZ2V0KGdyb3VwS2V5KVxuICAgICAgaWYgKFxuICAgICAgICBjaGlsZHJlbi5sZW5ndGggPiAxICYmXG4gICAgICAgIGNoaWxkcmVuLnNvbWUoKGspID0+IGsgIT09IGdyb3VwS2V5ICYmIGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGlyZWN0ID0gY2hpbGRyZW5cbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiBrID09PSBncm91cEtleSB8fCAhay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IGNoaWxkcmVuLmZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgcmV0dXJuIFsuLi5kaXJlY3QsIC4uLnNvcnRTY3JpcHROYW1lcyhuZXN0ZWQsIGdyb3VwS2V5KV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZHJlbi5zb3J0KClcbiAgICB9KVxufVxuXG5jb25zdCBzb3J0U2NyaXB0cyA9IG9uT2JqZWN0KChzY3JpcHRzLCBwYWNrYWdlSnNvbikgPT4ge1xuICBsZXQgbmFtZXMgPSBPYmplY3Qua2V5cyhzY3JpcHRzKVxuICBjb25zdCBwcmVmaXhhYmxlID0gbmV3IFNldCgpXG5cbiAgbmFtZXMgPSBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICBjb25zdCBvbWl0dGVkID0gbmFtZS5yZXBsYWNlKC9eKD86cHJlfHBvc3QpLywgJycpXG4gICAgaWYgKGRlZmF1bHROcG1TY3JpcHRzLmhhcyhvbWl0dGVkKSB8fCBuYW1lcy5pbmNsdWRlcyhvbWl0dGVkKSkge1xuICAgICAgcHJlZml4YWJsZS5hZGQob21pdHRlZClcbiAgICAgIHJldHVybiBvbWl0dGVkXG4gICAgfVxuICAgIHJldHVybiBuYW1lXG4gIH0pXG5cbiAgaWYgKCFoYXNTZXF1ZW50aWFsU2NyaXB0KHBhY2thZ2VKc29uKSkge1xuICAgIG5hbWVzID0gc29ydFNjcmlwdE5hbWVzKG5hbWVzKVxuICB9XG4gIG5hbWVzID0gbmFtZXMuZmxhdE1hcCgoa2V5KSA9PlxuICAgIHByZWZpeGFibGUuaGFzKGtleSkgPyBbYHByZSR7a2V5fWAsIGtleSwgYHBvc3Qke2tleX1gXSA6IFtrZXldLFxuICApXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhzY3JpcHRzLCBuYW1lcylcbn0pXG5cbi8qXG4tIE1vdmUgYGRlZmF1bHRgIGNvbmRpdGlvbiB0byBib3R0b21cbiovXG5jb25zdCBzb3J0Q29uZGl0aW9ucyA9IChjb25kaXRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVmYXVsdENvbmRpdGlvbnMgPSBbXSwgcmVzdENvbmRpdGlvbnMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgY29uZGl0aW9ucyxcbiAgICAoY29uZGl0aW9uKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0Q29uZGl0aW9ucydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdyZXN0Q29uZGl0aW9ucydcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIFsuLi5yZXN0Q29uZGl0aW9ucywgLi4uZGVmYXVsdENvbmRpdGlvbnNdXG59XG5cbmNvbnN0IHNvcnRFeHBvcnRzID0gb25PYmplY3QoKGV4cG9ydHMpID0+IHtcbiAgY29uc3QgeyBwYXRocyA9IFtdLCBjb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnd2lyZWl0Jywgb3Zlcjogc29ydFdpcmVpdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdsMTBuJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjb250cmlidXRlcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnYWN0aXZhdGlvbkV2ZW50cycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdodXNreScsIG92ZXI6IG92ZXJQcm9wZXJ0eSgnaG9va3MnLCBzb3J0R2l0SG9va3MpIH0sXG4gIHsga2V5OiAnc2ltcGxlLWdpdC1ob29rcycsIG92ZXI6IHNvcnRHaXRIb29rcyB9LFxuICB7IGtleTogJ3ByZS1jb21taXQnIH0sXG4gIHsga2V5OiAnY29tbWl0bGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdsaW50LXN0YWdlZCcgfSxcbiAgeyBrZXk6ICduYW5vLXN0YWdlZCcgfSxcbiAgeyBrZXk6ICdjb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbm9kZW1vbkNvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2VyaWZ5Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2JhYmVsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJzbGlzdCcgfSxcbiAgeyBrZXk6ICd4bycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwcmV0dGllcicsIG92ZXI6IHNvcnRQcmV0dGllckNvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludENvbmZpZycsIG92ZXI6IHNvcnRFc2xpbnRDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRJZ25vcmUnIH0sXG4gIHsga2V5OiAnbnBtcGtnanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtUGFja2FnZUpzb25MaW50Q29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbXBhY2thZ2Vqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZWxlYXNlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbWFya0NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdzdHlsZWxpbnQnIH0sXG4gIHsga2V5OiAnYXZhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1qdW5pdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LXN0YXJlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21vY2hhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ255YycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdjOCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICd0YXAnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb2NsaWYnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ3Jlc29sdXRpb25zJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ292ZXJyaWRlcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGV2RGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0Qnkoc29ydE9iamVjdEJ5SWRlbnQsIHRydWUpIH0sXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgLy8gVE9ETzogb25seSBzb3J0IGRlcHRoID0gMlxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdvcHRpb25hbERlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdidW5kbGVkRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2J1bmRsZURlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uUGFjaycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2ZsYXQnIH0sXG4gIHsga2V5OiAncGFja2FnZU1hbmFnZXInIH0sXG4gIHsga2V5OiAnZW5naW5lcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdlbmdpbmVTdHJpY3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZGV2RW5naW5lcycsIG92ZXI6IHNvcnREZXZFbmdpbmVzIH0sXG4gIHsga2V5OiAndm9sdGEnLCBvdmVyOiBzb3J0Vm9sdGEgfSxcbiAgeyBrZXk6ICdsYW5ndWFnZU5hbWUnIH0sXG4gIHsga2V5OiAnb3MnIH0sXG4gIHsga2V5OiAnY3B1JyB9LFxuICB7IGtleTogJ3ByZWZlckdsb2JhbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwdWJsaXNoQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdpY29uJyB9LFxuICAvKiB2c2NvZGUgKi8ge1xuICAgIGtleTogJ2JhZGdlcycsXG4gICAgb3Zlcjogb25BcnJheSgoYmFkZ2UpID0+IGJhZGdlLm1hcChzb3J0VlNDb2RlQmFkZ2VPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZ2FsbGVyeUJhbm5lcicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHJldmlldycgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbWFya2Rvd24nIH0sXG4gIHsga2V5OiAncG5wbScsIG92ZXI6IHNvcnRQbnBtQ29uZmlnIH0sXG5dXG5cbmNvbnN0IGRlZmF1bHRTb3J0T3JkZXIgPSBmaWVsZHMubWFwKCh7IGtleSB9KSA9PiBrZXkpXG5jb25zdCBvdmVyRmllbGRzID0gcGlwZShcbiAgZmllbGRzXG4gICAgLm1hcCgoeyBrZXksIG92ZXIgfSkgPT4gKG92ZXIgPyBvdmVyUHJvcGVydHkoa2V5LCBvdmVyKSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbilcblxuZnVuY3Rpb24gZWRpdFN0cmluZ0pTT04oanNvbiwgb3Zlcikge1xuICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeyBpbmRlbnQsIHR5cGUgfSA9IGRldGVjdEluZGVudChqc29uKVxuICAgIGNvbnN0IGVuZENoYXJhY3RlcnMgPSBqc29uLnNsaWNlKC0xKSA9PT0gJ1xcbicgPyAnXFxuJyA6ICcnXG4gICAgY29uc3QgbmV3bGluZSA9IGRldGVjdE5ld2xpbmUoanNvbilcbiAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKVxuXG4gICAgbGV0IHJlc3VsdCA9XG4gICAgICBKU09OLnN0cmluZ2lmeShvdmVyKGpzb24pLCBudWxsLCB0eXBlID09PSAndGFiJyA/ICdcXHQnIDogaW5kZW50KSArXG4gICAgICBlbmRDaGFyYWN0ZXJzXG4gICAgaWYgKG5ld2xpbmUgPT09ICdcXHJcXG4nKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFxuL2csIG5ld2xpbmUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHJldHVybiBvdmVyKGpzb24pXG59XG5cbmZ1bmN0aW9uIHNvcnRQYWNrYWdlSnNvbihqc29uSXNoLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGVkaXRTdHJpbmdKU09OKFxuICAgIGpzb25Jc2gsXG4gICAgb25PYmplY3QoKGpzb24pID0+IHtcbiAgICAgIGxldCBzb3J0T3JkZXIgPSBvcHRpb25zLnNvcnRPcmRlciB8fCBkZWZhdWx0U29ydE9yZGVyXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvcnRPcmRlcikpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGpzb24pXG4gICAgICAgIGNvbnN0IHsgcHJpdmF0ZUtleXMgPSBbXSwgcHVibGljS2V5cyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIChrZXkpID0+IChrZXlbMF0gPT09ICdfJyA/ICdwcml2YXRlS2V5cycgOiAncHVibGljS2V5cycpLFxuICAgICAgICApXG4gICAgICAgIHNvcnRPcmRlciA9IFtcbiAgICAgICAgICAuLi5zb3J0T3JkZXIsXG4gICAgICAgICAgLi4uZGVmYXVsdFNvcnRPcmRlcixcbiAgICAgICAgICAuLi5wdWJsaWNLZXlzLnNvcnQoKSxcbiAgICAgICAgICAuLi5wcml2YXRlS2V5cy5zb3J0KCksXG4gICAgICAgIF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG92ZXJGaWVsZHMoc29ydE9iamVjdEtleXMoanNvbiwgc29ydE9yZGVyKSwganNvbilcbiAgICB9KSxcbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0UGFja2FnZUpzb25cbmV4cG9ydCB7IHNvcnRQYWNrYWdlSnNvbiwgZGVmYXVsdFNvcnRPcmRlciBhcyBzb3J0T3JkZXIgfVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBbXG4gICdAdHNjb25maWcvYnVuJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLWx0cycsXG4gICdAdHNjb25maWcvbm9kZS10cycsXG4gICdAdHNjb25maWcvcmVhY3QtbmF0aXZlJyxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAvLyBSZWFjdCBOYXRpdmUgbmVlZHMgTWV0cm8tY29tcGF0aWJsZSBzZXR0aW5ncyAoanN4OiByZWFjdC1uYXRpdmUsIG5vZGUgcmVzb2x1dGlvbiksIHdoaWNoXG4gIC8vIEB0c2NvbmZpZy9idW4gd291bGQgb3ZlcnJpZGUgZXZlbiB0aG91Z2ggdGhlIHJlcG8gdXNlcyBCdW4gYXMgaXRzIHBhY2thZ2UgbWFuYWdlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSddO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9idW4nXTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1vZHVsZSBzcGVjaWZpZXIgYSBnZW5lcmF0ZWQgY29uZmlnIGZpbGUgc2hvdWxkIHVzZSB0byBsb2FkIGFcbiAqIHdpbGxib29zdGVyLWNvbmZpZ3MgY29uZmlnIHBhY2thZ2Ugc3VjaCBhcyBgQHdpbGxib29zdGVyL294bGludC1jb25maWdgLlxuICpcbiAqIE91dHNpZGUgd2lsbGJvb3N0ZXItY29uZmlncyB0aGlzIGlzIHNpbXBseSB0aGUgcHVibGlzaGVkIHBhY2thZ2UgbmFtZS4gSW5zaWRlXG4gKiB3aWxsYm9vc3Rlci1jb25maWdzIHRoZSBwYWNrYWdlIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGEgZGVwZW5kZW5jeTogdGhlXG4gKiBjb25maWcgcGFja2FnZXMgaW1wb3J0IG9uZSBhbm90aGVyIChlLmcuIG94Zm10LWNvbmZpZydzIG94bGludC5jb25maWcudHNcbiAqIGltcG9ydHMgb3hsaW50LWNvbmZpZyBhbmQgdmljZSB2ZXJzYSksIHNvIGEgZGVjbGFyZWQgZWRnZSB3b3VsZCBmb3JtIGFcbiAqIGRlcGVuZGVuY3kgY3ljbGUgdGhhdCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIGNhbm5vdCB0b3BvbG9naWNhbGx5IHNvcnQuIFNpbmNlXG4gKiB0aGUgZWRnZSBpcyBhYnNlbnQsIGlzb2xhdGVkIGluc3RhbGxzIGNhbm5vdCByZXNvbHZlIHRoZSBiYXJlIHBhY2thZ2UgbmFtZSwgc29cbiAqIGltcG9ydCB0aGUgY29tbWl0dGVkIGBjb25maWcubWpzYCBidWlsZCBvdXRwdXQgdGhyb3VnaCBhIHJlbGF0aXZlIHBhdGggaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWc6IFBhY2thZ2VDb25maWcsIGNvbmZpZ1BhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuIGNvbmZpZ1BhY2thZ2VOYW1lO1xuXG4gIC8vIGUuZy4gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyAtPiAnb3hsaW50LWNvbmZpZycsIHdoaWNoIGlzIGl0cyBkaXJlY3RvcnkgdW5kZXIgYHBhY2thZ2VzL2AuXG4gIGNvbnN0IGNvbmZpZ1BhY2thZ2VEaXIgPSBjb25maWdQYWNrYWdlTmFtZS5zcGxpdCgnLycpLnBvcCgpID8/ICcnO1xuICAvLyBEZXJpdmUgdGhlIHdpbGxib29zdGVyLWNvbmZpZ3Mgcm9vdCBmcm9tIHRoZSBwYWNrYWdlIGJlaW5nIGdlbmVyYXRlZCwgbm90IGZyb20gdGhlIENMSSBlbnRyeVxuICAvLyBwYXRoOiBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPHBrZz5gIGlzIGEgc3VwcG9ydGVkIGludm9jYXRpb24gd2hvc2UgZW50cnkgY29uZmlnIGlzIHRoZSBjaGlsZFxuICAvLyBwYWNrYWdlIHJhdGhlciB0aGFuIHRoZSByZXBvIHJvb3QsIHNvIHJlbHlpbmcgb24gdGhlIGVudHJ5IHdvdWxkIGVtaXQgYSBuZXN0ZWQsIHVucmVzb2x2YWJsZVxuICAvLyBwYXRoIGZvciBhIGRpcmVjdGx5IHRhcmdldGVkIGNvbmZpZyBwYWNrYWdlLiBFdmVyeSB3aWxsYm9vc3Rlci1jb25maWdzIHBhY2thZ2UgaXMgZWl0aGVyIHRoZVxuICAvLyByb290IG9yIGEgZGlyZWN0IGNoaWxkIHVuZGVyIGBwYWNrYWdlcy9gLCBzbyB0aGUgcm9vdCBpcyB0aGUgcGFja2FnZSBkaXIgaXRzZWxmIG9yIGl0cyBncmFuZHBhcmVudC5cbiAgY29uc3QgcmVwb1Jvb3REaXJQYXRoID0gY29uZmlnLmlzUm9vdCA/IGNvbmZpZy5kaXJQYXRoIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgY29uc3QgbG9jYWxFbnRyeSA9IHBhdGgucmVzb2x2ZShyZXBvUm9vdERpclBhdGgsICdwYWNrYWdlcycsIGNvbmZpZ1BhY2thZ2VEaXIsICdjb25maWcubWpzJyk7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGxvY2FsRW50cnkpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmXG4gICAgIWNvbmZpZy5pc1Jvb3QgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24/LnByaXZhdGUgIT09IHRydWUgJiZcbiAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5wYWNrYWdlSnNvbj8uZmlsZXMpICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uLmZpbGVzLmxlbmd0aCA+IDBcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCwgcXVvdGVGb3JTaGVsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvciwgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuLi91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxuICBoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4sXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuaW1wb3J0IHsgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcywgYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzIH0gZnJvbSAnLi9idW5maWcuanMnO1xuXG5jb25zdCBveGxpbnREZXBzID0gWydAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ294Zm10JywgJ294bGludCcsICdveGxpbnQtdHNnb2xpbnQnXTtcbmNvbnN0IHR5cGVzY3JpcHREZXBlbmRlbmN5ID0gJ3R5cGVzY3JpcHQnO1xuLy8gVHlwZVNjcmlwdCA3J3MgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gbmF0aXZlIGNvbXBpbGVyIGFuZCBleHBvc2VzIG5vXG4vLyBwcm9ncmFtbWF0aWMgQVBJLiBOZXh0LmpzJ3MgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCBuZWVkcyB0aGF0IEFQSSwgc29cbi8vIGBuZXh0IGJ1aWxkYCBmYWlscyAoXCJ0cnlpbmcgdG8gdXNlIFR5cGVTY3JpcHQgYnV0IGRvIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwYWNrYWdlKHMpXCIpXG4vLyB3aXRoIG9ubHkgYHR5cGVzY3JpcHRgIHY3IGluc3RhbGxlZC4gTmV4dC5qcyByZXNvbHZlcyB0aGUgdHNnbyBiaW5hcnkgdGhyb3VnaCB0aGVcbi8vIHNlcGFyYXRlIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgcGFja2FnZSwgc28gTmV4dC5qcy1mYW1pbHkgcmVwb3MgbXVzdCBpbnN0YWxsXG4vLyBib3RoOyBvdGhlciByZXBvcyBvbmx5IG5lZWQgYHR5cGVzY3JpcHRgIGZvciBgdHNjYCB0eXBlY2hlY2tzLlxuY29uc3QgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA9ICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldyc7XG5jb25zdCB3YkRlcGVuZGVuY3kgPSAnQHdpbGxib29zdGVyL3diJztcbmNvbnN0IGJ1aWxkVHNEZXBlbmRlbmN5ID0gJ2J1aWxkLXRzJztcbmNvbnN0IGxlZnRob29rRGVwZW5kZW5jeSA9ICdsZWZ0aG9vayc7XG5jb25zdCBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzID0gbmV3IFNldChbXG4gIHdiRGVwZW5kZW5jeSxcbiAgYnVpbGRUc0RlcGVuZGVuY3ksXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdERlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3ksXG4gICdzb3J0LXBhY2thZ2UtanNvbicsXG4gIC8vIE1peGVkIEB0eXBlcy9idW4gdmVyc2lvbnMgYWNyb3NzIGEgbW9ub3JlcG8gbG9hZCB0d28gYnVuLXR5cGVzIGNvcGllcywgd2hpY2hcbiAgLy8gYnJlYWtzIGdsb2JhbCBpbnRlcmZhY2UgbWVyZ2luZyAoZS5nLiBSZXNwb25zZS9IZWFkZXJzKSBkdXJpbmcgdHlwZSBjaGVja2luZy5cbiAgJ0B0eXBlcy9idW4nLFxuICAuLi5veGxpbnREZXBzLFxuXSk7XG5jb25zdCBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbmNvbnN0IHBhY2thZ2VBZ2VHYXRlTXMgPSBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgKiAxMDAwO1xuY29uc3QgbnBtUGFja2FnZVRpbWVzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB3b3JrZXJUeXBlc1NjcmlwdEVycm9yID0gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcihjb25maWcpO1xuICBpZiAod29ya2VyVHlwZXNTY3JpcHRFcnJvcikgdGhyb3cgbmV3IEVycm9yKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpO1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgdXBkYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBlbnN1cmVUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBwcnVuZUNhcGFiaWxpdHlEZXBlbmRlbnRDb21waWxlckRlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGF3YWl0IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIC8vIE9uIGEgZmlyc3QgcnVuIHRoZXJlIGlzIG5vIG1hbmlmZXN0IGZvciBgYnVuIGFkZGAgdG8gdXBkYXRlIHJlbGlhYmx5LiBXcml0ZSB0aGUgcmVzb2x2ZWRcbiAgLy8gZGVwZW5kZW5jeSB2ZXJzaW9ucyBpbnRvIHRoZSBuZXcgbWFuaWZlc3QgZGlyZWN0bHk7IHRoZSBmaW5hbCByZXBvc2l0b3J5LXdpZGUgYGJ1biBpbnN0YWxsYFxuICAvLyB0aGVuIGluc3RhbGxzIHRoZW0gYW5kIHJlbWFpbnMgdGhlIGF1dGhvcml0YXRpdmUgZmFpbHVyZSBjaGVjay5cbiAgYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIGRlcGVuZGVuY3lVcGRhdGVzLFxuICAgIHNraXBBZGRpbmdEZXBzIHx8ICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvblxuICApO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICAvLyBZYXJuIHJlYWRzIHBhY2thZ2UuanNvbiBmcm9tIGRpc2sgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgYHlhcm4gYWRkIC1EYFxuICAvLyBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyByZWd1bGFyIGRlcGVuZGVuY3ksIHNvIHRoaXMgd3JpdGUgbXVzdCBmaW5pc2hcbiAgLy8gYmVmb3JlIGluc3RhbGxpbmcgdGhlIG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGVzIGJlbG93LiBLZWVwIHRoaXMgZ2VuZXJhdGVkXG4gIC8vIGZpbGUgc29ydGVkIGV2ZW4gd2hlbiB3ZSBsYXRlciBydW4gdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgZm9ybWF0dGVyIHNvIGFcbiAgLy8gbWlkLXJ1biBpbnRlcnJ1cHRpb24gbmV2ZXIgbGVhdmVzIHBhY2thZ2UuanNvbiBpbiBhIHBhcnRpYWxseSBtYW5hZ2VkIG9yZGVyLlxuICAvLyBBIHJlZnVzZWQgd3JpdGUgKGUuZy4gYSBzeW1saW5rZWQgcGFja2FnZS5qc29uKSBtdXN0IGFsc28gYWJvcnQgdGhlIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uXG4gIC8vIGJlbG93OiBgYnVuIGFkZGAgZm9sbG93cyB0aGUgc3ltbGluayBhbmQgd291bGQgbW9kaWZ5IHRoZSBmaWxlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmopKSkpIHJldHVybjtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAgIC8vIEEgbmV3bHkgY3JlYXRlZCBtYW5pZmVzdCBpcyBhbHJlYWR5IHNvcnRlZCBieSB3YmZ5J3MgYnVuZGxlZCBzZXJpYWxpemVyOyB0aGUgdGFyZ2V0IGZvcm1hdHRlclxuICAgIC8vIGlzIGF2YWlsYWJsZSB3aXRob3V0IGFuIGV4dHJhIGZldGNoIG9ubHkgd2hlbiB0aGlzIHJ1biBzdGFydGVkIHdpdGggcGFja2FnZS5qc29uLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWcsIGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHN0cmluZyB7XG4gIC8vIGZzVXRpbC5nZW5lcmF0ZUZpbGUoKSBub3JtYWxpemVzIHRoZSB0cmFpbGluZyBuZXdsaW5lLCBzbyBrZWVwIHRoZSBzZXJpYWxpemVyXG4gIC8vIGZvY3VzZWQgb24gdGhlIEpTT04gcGF5bG9hZCBpdHNlbGYuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24oanNvbk9iaiksIHVuZGVmaW5lZCwgMik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxXcml0YWJsZVBhY2thZ2VKc29uPiB7XG4gIGxldCBqc29uT2JqOiBQYWNrYWdlSnNvbiA9IHt9O1xuICB0cnkge1xuICAgIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIERvY3VtZW50YXRpb24tb25seSByZXBvc2l0b3JpZXMgaGF2ZSBubyBtYW5pZmVzdCBvbiB0aGVpciBmaXJzdCB3YmZ5IHJ1bi4gU3RhcnRpbmcgZnJvbSBhblxuICAgIC8vIGVtcHR5IG9iamVjdCBsZXRzIHRoZSBub3JtYWwgZ2VuZXJhdG9yIGVzdGFibGlzaCB0aGUgc2FtZSBtYW5hZ2VkIGJhc2VsaW5lIGFzIGV2ZXJ5IG90aGVyXG4gICAgLy8gcmVwb3NpdG9yeTsgbWFsZm9ybWVkIG9yIHVucmVhZGFibGUgZXhpc3RpbmcgbWFuaWZlc3RzIG11c3Qgc3RpbGwgZmFpbCBsb3VkbHkuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB0aHJvdyBlcnJvcjtcbiAgfVxuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuZnVuY3Rpb24gcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIC8vIFJ1biBiZWZvcmUgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zLCB3aGljaCByZS1hZGRzIHRzZ28gb25seSBmb3IgY3VycmVudCBOZXh0LmpzLWZhbWlseSByZXBvc2l0b3JpZXMuXG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGpzb25PYmouc2NyaXB0cyA9IHsgLi4uanNvbk9iai5zY3JpcHRzLCAuLi5nZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpIH07XG59XG5cbi8qKlxuICogS2VlcHMgdGhlIHByb2plY3QncyBvd24gc2VnbWVudHMgaW4gb3JkZXIsIHJlcGxhY2luZyB0aGUgZmlyc3QgbWFuYWdlZCBnZW4tY29kZSBzcGVsbGluZyB3aXRoXG4gKiBgYnVuIHdiIGdlbi1jb2RlYCBhbmQgZHJvcHBpbmcgbGF0ZXIgZHVwbGljYXRlcy4gQXBwZW5kcyBnZW5lcmF0aW9uIG9ubHkgd2hlbiB0aGUgc2NyaXB0XG4gKiBjb250YWluZWQgbm9uZSwgc28gbm90aGluZyBpcyByZW9yZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIHJlYnVpbGRQb3N0aW5zdGFsbFNlZ21lbnRzKHNlZ21lbnRzOiBzdHJpbmdbXSwgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2luZHMgPSBzZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBzY3JpcHRzLCB0cnVlKSk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgZ2VuZXJhdGVzOyBhZGRpbmcgYW5vdGhlciBpbnZvY2F0aW9uIHdvdWxkIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UuXG4gIGxldCBnZW5lcmF0aW9uUGxhY2VkID0ga2luZHMuaW5jbHVkZXMoJ2dlbkNvZGVXcmFwcGVyJyk7XG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIHNlZ21lbnRdIG9mIHNlZ21lbnRzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGtpbmQgPSBraW5kc1tpbmRleF07XG4gICAgaWYgKGtpbmQgPT09ICdjdXN0b20nIHx8IGtpbmQgPT09ICdnZW5Db2RlV3JhcHBlcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHNlZ21lbnQpO1xuICAgIH0gZWxzZSBpZiAoIWdlbmVyYXRpb25QbGFjZWQpIHtcbiAgICAgIHJlc3VsdC5wdXNoKCdidW4gd2IgZ2VuLWNvZGUnKTtcbiAgICAgIGdlbmVyYXRpb25QbGFjZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoIWdlbmVyYXRpb25QbGFjZWQpIHJlc3VsdC5wdXNoKCdidW4gd2IgZ2VuLWNvZGUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIG1hbmFnZWQgZ2VuLWNvZGUgc2VnbWVudHMgd2hpbGUga2VlcGluZyB0aGUgZmlyc3Qgc2VnbWVudCdzIHBvc2l0aW9uIHNvIGEgY3VzdG9tXG4gKiBzdGVwIHRoYXQgY29uc3VtZXMgZ2VuZXJhdGVkIG91dHB1dCBzdGlsbCBydW5zIGFmdGVyIGl0LiBSZXR1cm5zIHdpdGhvdXQgY2hhbmdpbmcgYW5cbiAqIHVucGFyc2VhYmxlIHNjcmlwdC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cywgbWFuYWdlc1dvcmtlclR5cGVzOiBib29sZWFuKTogdm9pZCB7XG4gIC8vIGBidW4gd2IgZ2VuLWNvZGVgIHJlZ2VuZXJhdGVzIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgaXRzZWxmLCBzbyBhIHBhY2thZ2Ugd2l0aCBhXG4gIC8vIGNvZGUtZ2VuZXJhdGlvbiBvciB3b3JrZXItdHlwZXMgcGlwZWxpbmUgZ2V0cyBvbmUgbWFuYWdlZCBnZW5lcmF0aW9uIHNlZ21lbnQuXG4gIGlmIChzY3JpcHRzWydnZW4tY29kZSddIHx8IG1hbmFnZXNXb3JrZXJUeXBlcykge1xuICAgIC8vIFByb2plY3Qtb3duZWQgc3RlcHMgYXJlIG5ldmVyIGRyb3BwZWQsIGFuZCB0aGVpciBQT1NJVElPTiByZWxhdGl2ZSB0byBnZW5lcmF0aW9uIGlzIHByZXNlcnZlZDogYSBzdGVwXG4gICAgLy8gYmVmb3JlIGl0IG1heSBwcm9kdWNlIGB3cmFuZ2xlciB0eXBlc2AnIGlucHV0cyAoYSB3cmFuZ2xlciBjb25maWcsIGAuZGV2LnZhcnNgKSwgd2hpbGUgb25lIGFmdGVyIGl0IG1heVxuICAgIC8vIGNvbnN1bWUgdGhlIGdlbmVyYXRlZCB0eXBlcy4gU28gdGhlIG1hbmFnZWQgZ2VuZXJhdGlvbiByZXBsYWNlcyB0aGUgZmlyc3QgbWFuYWdlZCBzZWdtZW50IGluIHBsYWNlLCBhbmQgaXNcbiAgICAvLyBhcHBlbmRlZCBvbmx5IHdoZW4gdGhlIHNjcmlwdCBoYWQgbm9uZS4gQSB3cmFwcGVyIGFyb3VuZCBhIGN1c3RvbWl6ZWQgZ2VuLWNvZGUgYWxyZWFkeSBwZXJmb3JtcyB0aGVcbiAgICAvLyBnZW5lcmF0aW9uIHBsdXMgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IHN1cHByZXNzZXMgdGhlIHJlcGxhY2VtZW50IGVudGlyZWx5LlxuICAgIGNvbnN0IHNlZ21lbnRzID0gc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gdW5kZWZpbmVkID8gW10gOiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdHMucG9zdGluc3RhbGwpO1xuICAgIGNvbnN0IGtlcHRTZWdtZW50cyA9IHNlZ21lbnRzICYmIHJlYnVpbGRQb3N0aW5zdGFsbFNlZ21lbnRzKHNlZ21lbnRzLCBzY3JpcHRzKTtcbiAgICBpZiAoa2VwdFNlZ21lbnRzKSB7XG4gICAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID0ga2VwdFNlZ21lbnRzLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gICAgLy8gQW55IG90aGVyIHVucGFyc2VhYmxlIHBvc3RpbnN0YWxsIGlzIGxlZnQgdG8gYSBodW1hbiByYXRoZXIgdGhhbiByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPERlcGVuZGVuY3lVcGRhdGVzPiB7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICBpZiAoXG4gICAgaGFzSmF2YSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXInKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgLy8gTGVmdGhvb2sgZ2VuZXJhdGlvbiBpcyBiZXN0LWVmZm9ydCBhbmQgLmxlZnRob29rIGlzIGFic2VudCBmcm9tIERvY2tlciBidWlsZCBjb250ZXh0cywgc28gYVxuICAgIC8vIG1pc3Npbmcgbm9ybWFsaXplciBpcyB2YWxpZC4gT25jZSBwcmVzZW50LCBpdHMgZmFpbHVyZSBtdXN0IGFib3J0IGluc3RhbGwgcmF0aGVyIHRoYW4gbGVhdmUgYVxuICAgIC8vIEd1YXJkLXBpbm5lZCBsb2NrZmlsZSBiZWhpbmQ7IGtlZXAgdGhhdCBmYWlsLWZhc3QgZ3JvdXBpbmcgZXhwbGljaXQgYmVmb3JlIGFueSB3b3Jrc3BhY2UgYnVpbGQuXG4gICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPVxuICAgICAgJyhidW4gbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlKSAmJiAodGVzdCAhIC1mIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHx8IGJhc2ggLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gpJztcbiAgICAvLyBXaGVuIEB3aWxsYm9vc3Rlci93YiBpcyBhIHdvcmtzcGFjZSBvZiB0aGlzIHJlcG9zaXRvcnksIHRoZSBnZW5lcmF0ZWQgYGJ1biB3YiDigKZgIHNjcmlwdHMgcnVuXG4gICAgLy8gaXRzIGdpdGlnbm9yZWQgZGlzdCBidWlsZCAoYmluL2luZGV4LmpzIGltcG9ydHMgLi4vZGlzdC9pbmRleC5qcyksIHNvIGEgZnJlc2ggY2hlY2tvdXQgbXVzdFxuICAgIC8vIGJ1aWxkIGl0IGR1cmluZyBpbnN0YWxsOyByZWdpc3RyeSBpbnN0YWxscyBzaGlwIGEgcHJlYnVpbHQgZGlzdCBhbmQgbmVlZCBubyBleHRyYSBzdGVwLlxuICAgIGNvbnN0IHdiV29ya3NwYWNlRGlyID0gZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykuZ2V0KHdiRGVwZW5kZW5jeSk7XG4gICAgaWYgKHdiV29ya3NwYWNlRGlyKSB7XG4gICAgICAvLyBRdW90ZWQgdW5sZXNzIHRoZSBuYW1lIGNhcnJpZXMgbm8gc2hlbGwgbWVhbmluZywgc28gdGhhdCBgJCjigKYpYCBvciBhIHZhcmlhYmxlIGEgaG9zdGlsZVxuICAgICAgLy8gZGlyZWN0b3J5IG5hbWUgY291bGQgc211Z2dsZSBpbnRvIHRoZSBnZW5lcmF0ZWQgc2NyaXB0IG5ldmVyIHJlYWNoZXMgdGhlIHNoZWxsIHVucXVvdGVkLlxuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgKz0gYCAmJiBidW4gcnVuIC0tY3dkICR7cXVvdGVGb3JTaGVsbCh3YldvcmtzcGFjZURpcil9IGJ1aWxkYDtcbiAgICB9XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2gobGVmdGhvb2tEZXBlbmRlbmN5KTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShqc29uT2JqLnNjcmlwdHMucmVsZWFzZSkpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ107XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0UnVudGltZSkge1xuICAgICAgICAvLyBSdW50aW1lIGltcG9ydHMgbmVlZCB0aGUgc3RhbmRhbG9uZSBwYWNrYWdlIGFmdGVyIERvY2tlciBwcnVuaW5nIHJlbW92ZXMgZGV2RGVwZW5kZW5jaWVzLlxuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/PVxuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz9cbiAgICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddID8/XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ3BsYXl3cmlnaHQnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uIFlhcm4gdjEncyBvYmplY3QgZm9ybSBrZWVwcyBpdHNcbiAgICAgIC8vIGRlY2xhcmVkIHBhdHRlcm5zICh3b3Jrc3BhY2VzLnBhY2thZ2VzKTsgb25seSBleHRyYXMgc3VjaCBhcyBub2hvaXN0IGFyZSBkcm9wcGVkLlxuICAgICAgLy8gRm9yY2UgYHBhY2thZ2VzLypgIG9ubHkgd2hlbiBpdCBhY3R1YWxseSBtYXRjaGVzIGEgd29ya3NwYWNlIG1hbmlmZXN0OiBhbiBhcHBzLyotb25seVxuICAgICAgLy8gbW9ub3JlcG8gbXVzdCBub3QgZ2V0IGEgbmV2ZXItbWF0Y2hpbmcgcGF0dGVybiBhcHBlbmRlZCB0byBpdHMgZGVjbGFyYXRpb24uIEFcbiAgICAgIC8vIGJhc2VsaW5lLXNlZWRpbmcgZGVjbGFyYXRpb24gbmVlZHMgbm8gZm9yY2VkIHBhdHRlcm4gYXQgYWxsIOKAlCB0aGUgc2VlZGVkIGJhc2VsaW5lXG4gICAgICAvLyAoYCovKmAgb3IgYCoqYCkgYWxyZWFkeSBjb3ZlcnMgcGFja2FnZXMvKi4gVGhlIGZvcmNlZCBwYXR0ZXJuIGlzIFBSRVBFTkRFRDogQnVuXG4gICAgICAvLyBldmFsdWF0ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gYSBwb3NpdGl2ZSBwYXR0ZXJuIHBsYWNlZCBhZnRlciBhIHVzZXJcbiAgICAgIC8vIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMuIEEgZGVjbGFyYXRpb24gdGhhdCBhbHJlYWR5IGNvdmVyc1xuICAgICAgLy8gcGFja2FnZXMvKiB1bmRlciBub3JtYWxpemF0aW9uIChlLmcuIGAuL3BhY2thZ2VzLypgKSBpcyBrZXB0IHZlcmJhdGltOiBmb3JjaW5nIGEgdGV4dHVhbFxuICAgICAgLy8gYHBhY2thZ2VzLypgIG5leHQgdG8gaXQgd291bGQgcGVyc2lzdCBhIGR1cGxpY2F0ZSBlcXVpdmFsZW50IHBhdHRlcm4uXG4gICAgICBjb25zdCBmb3JjZWRQYXR0ZXJucyA9XG4gICAgICAgICFoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgIWhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybihqc29uT2JqLndvcmtzcGFjZXMpICYmXG4gICAgICAgIGZnLmdsb2JTeW5jKCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIHsgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH0pLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFsncGFja2FnZXMvKiddXG4gICAgICAgICAgOiBbXTtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IG1lcmdlLmFsbChbZm9yY2VkUGF0dGVybnMsIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMoanNvbk9iai53b3Jrc3BhY2VzKV0sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgfSk7XG4gICAgICAvLyBCb3RoIGlucHV0cyBjYW4gYmUgZW1wdHkgKGUuZy4gcGFja2FnZXMvcGFja2FnZS5qc29uIHdpdGhvdXQgYW55IHBhY2thZ2VzLyovcGFja2FnZS5qc29uXG4gICAgICAvLyBhbmQgbm8gZGVjbGFyZWQgd29ya3NwYWNlcyk7IGRvIG5vdCBwZXJzaXN0IGEgbWVhbmluZ2xlc3MgYHdvcmtzcGFjZXM6IFtdYC5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykgJiYganNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaXhlcnMvbmV4dENvbmZpZy50cyBlbmFibGVzIGByZWFjdENvbXBpbGVyOiB0cnVlYCBmb3IgZXZlcnkgTmV4dC5qcyBwcm9qZWN0LCBhbmQgTmV4dC5qc1xuICAvLyByZXNvbHZlcyBgYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyYCBhdCBidWlsZCB0aW1lIHdoZW4gUmVhY3QgQ29tcGlsZXIgaXMgb24uIEFkZCBpdCBoZXJlIHNvXG4gIC8vIHRoZSBtYW5hZ2VkIG5leHQuY29uZmlnIG5ldmVyIGJyZWFrcyBgbmV4dCBidWlsZGAgd2l0aCBhbiB1bnJlc29sdmVkLXBhY2thZ2UgZXJyb3IuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyk7XG4gIH1cblxuICAvLyBgd2IgdmVyaWZ5IC0tZnVsbGAgYXVkaXRzIGV2ZXJ5IGAqLnNsaWRldi5tZGAgZGVjayB3aXRoIHNsaWRldi1jaGVjaywgc28gdGhlIGNoZWNrZXIgaGFzIHRvIGJlXG4gIC8vIGluc3RhbGxlZCB3aGVyZXZlciBhIGRlY2sgbGl2ZXMuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TbGlkZXZNZCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzbGlkZXYtY2hlY2snKTtcbiAgfVxuXG4gIGlmICghaXNXYlBhY2thZ2UoanNvbk9iaikpIHtcbiAgICAvLyBBIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgZGVwZW5kcyBvbiB0aGUgd2IgZGV2ZWxvcGVkIGluIHRoaXMgcmVwb3NpdG9yeSAoZS5nLlxuICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBpdHNlbGYpOyBpbnN0YWxsaW5nIHRoZSBsYXRlc3QgcmVnaXN0cnkgcmVsZWFzZSBvdmVyIGl0IHdvdWxkIHNpbGVudGx5XG4gICAgLy8gcmVwbGFjZSB0aGUgbG9jYWwgYnVpbGQgd2l0aCBhIHB1Ymxpc2hlZCBvbmUsIHNvIGxlYXZlIHN1Y2ggYSBkZWNsYXJhdGlvbiB1bnRvdWNoZWQuXG4gICAgY29uc3Qgd2JTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1t3YkRlcGVuZGVuY3ldID8/IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV07XG4gICAgaWYgKCF3YlNwZWNpZmllcj8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgaWYgKHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gICAgLy8gVGhlIGdlbmVyYXRlZCAqLmNvbmZpZy50cyBmaWxlcyBhcmUgdHlwZS1jaGVja2VkIGJ5IHRoZSBsaW50IHByb2plY3QgZXZlbiBpbiBKYXZhU2NyaXB0LW9ubHlcbiAgICAvLyByZXBvc2l0b3JpZXMuIFJlYWN0IE5hdGl2ZSByZWxpZXMgb24gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSdzIGFtYmllbnQgdHlwZXMgaW5zdGVhZC5cbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSA/IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpIDogW107XG4gIGF3YWl0IHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmosIHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLnRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UsIHNvIGl0IGlzXG4gICAgLy8gbm93IHRoZSBtYW5hZ2VkIGNvbXBpbGVyIGZvciBldmVyeSBUeXBlU2NyaXB0IHJlcG8gKHR5cGVjaGVja2luZyBydW5zIGB0c2NgKS5cbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0RGVwZW5kZW5jeSk7XG4gICAgLy8gTmV4dC5qcydzIGBuZXh0IGJ1aWxkYCBpbnNwZWN0cyBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSB0byBydW4gaXRzIHR5cGVcbiAgICAvLyBjaGVjazsgdGhlIGB0eXBlc2NyaXB0YCB2NyBwYWNrYWdlIGFsb25lIGxhY2tzIHRoZSBBUEkgbmV4dCBuZWVkcywgc28ga2VlcCBib3RoXG4gICAgLy8gaW5zdGFsbGVkIGZvciBOZXh0LmpzLWZhbWlseSByZXBvcy4gU2VlIHRoZSB0eXBlc2NyaXB0R29EZXBlbmRlbmN5IGNvbW1lbnQgYWJvdmUuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0R29EZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvXFxiKD86YnVueHxucHh8cG5wbVxccytkbHh8eWFyblxccytkbHgpXFxzK3NlbWFudGljLXJlbGVhc2UoPzpAXFxTKyk/XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIGtlZXBBc1J1bnRpbWVdIG9mIFtcbiAgICBbd2JEZXBlbmRlbmN5LCBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgICBbYnVpbGRUc0RlcGVuZGVuY3ksIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAoa2VlcEFzUnVudGltZSkge1xuICAgICAgY29uc3QgZGV2VmVyc2lvbiA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFkZXZWZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIXJ1bnRpbWVWZXJzaW9uIHx8IGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihkZXZWZXJzaW9uLCBydW50aW1lVmVyc2lvbikpIHtcbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBkZXZWZXJzaW9uO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH0gZWxzZSBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHtcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIGltYWdlcyBydW4gbWlncmF0aW9ucyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCwganVzdCBhcyBwYWNrYWdlIG1hbmFnZXJzXG4gIC8vIHJ1biBwb3N0aW5zdGFsbCBkdXJpbmcgcHJvZHVjdGlvbiBpbnN0YWxscywgc28gYm90aCBlbnRyeSBwb2ludHMgbXVzdCByZXRhaW4gdGhlIHdiIGJpbmFyeS5cbiAgLy8gS2VlcCB0aGUgd29yZCBtYXRjaCBjb25zZXJ2YXRpdmU6IHN1cHBvcnRlZCBjdXN0b20gd3JhcHBlcnMgY2FuIHB1dCB3YiBpbnNpZGUgc2hlbGwgbG9vcHMgdGhhdFxuICAvLyB0aGUgY29tbWFuZC1wb3NpdGlvbiBwYXJzZXIgY2Fubm90IGNsYXNzaWZ5LCB3aGlsZSBhIGZhbHNlIHBvc2l0aXZlIG9ubHkgcmV0YWlucyB0aGUgQ0xJLlxuICByZXR1cm4gW2pzb25PYmouc2NyaXB0cz8ucG9zdGluc3RhbGwsIGpzb25PYmouc2NyaXB0cz8uWydkYi1taWdyYXRlJ11dLnNvbWUoXG4gICAgKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiXFxiL3UudGVzdChzY3JpcHQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmlzbWEgPSBqc29uT2JqLnByaXNtYSBhcyB7IHNlZWQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHByaXNtYT8uc2VlZCkgfHwgZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhqc29uT2JqLnNjcmlwdHM/LnNlZWQpO1xufVxuXG5mdW5jdGlvbiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHNlZWRDb21tYW5kOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gRG9ja2VyIGltYWdlcyBydW4gc2VlZCBzY3JpcHRzIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLFxuICAvLyBzbyBUeXBlU2NyaXB0IHNlZWQgcnVubmVycyBtdXN0IHJlbWFpbiBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAgcmV0dXJuIHR5cGVvZiBzZWVkQ29tbWFuZCA9PT0gJ3N0cmluZycgJiYgLyg/PCFbXFx3LV0pYnVpbGQtdHMoPyFbXFx3LV0pL3UudGVzdChzZWVkQ29tbWFuZCk7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zID0gW1xuICAnZGVwZW5kZW5jaWVzJyxcbiAgJ2RldkRlcGVuZGVuY2llcycsXG4gICdvcHRpb25hbERlcGVuZGVuY2llcycsXG4gICdwZWVyRGVwZW5kZW5jaWVzJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9yY2VzIHN0b3JlLWluY29tcGF0aWJsZSBwYWNrYWdlcyB0byBzdGF5IHByb2plY3QtbG9jYWwgd2hlbiB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGVuYWJsZXNcbiAqIEJ1bidzIGdsb2JhbCBzdG9yZTogYGNoYWtyYSB0eXBlZ2VuYCAocnVuIGJ5IGB3YiBnZW4tY29kZWApXG4gKiB3cml0ZXMgZ2VuZXJhdGVkIHR5cGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0IHBhY2thZ2UsIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogbXV0YXRlIHRoZSBtYWNoaW5lLXdpZGUgc3RvcmUgc2hhcmVkIGFjcm9zcyByZXBvc2l0b3JpZXMsIGFuZCBkcml6emxlLWtpdCByZXF1aXJlcyBkcml6emxlLW9ybVxuICogd2l0aG91dCBkZWNsYXJpbmcgaXQsIHdoaWNoIHRoZSBzdG9yZSByZWFscGF0aCBwbGFjZXMgYmV5b25kIGEgcGxhaW4gbm9kZV9tb2R1bGVzIHdhbGstdXAuXG4gKiBMaXN0aW5nIHRoZW0gaW4gYHRydXN0ZWREZXBlbmRlbmNpZXNgIG1ha2VzIEJ1biBtYXRlcmlhbGl6ZSBhIHBlci1wcm9qZWN0IGNvcHkgdW5kZXJcbiAqIGBub2RlX21vZHVsZXMvLmJ1bi9gLCB3aG9zZSBzaWJsaW5nIGBub2RlX21vZHVsZXMvLmJ1bi9ub2RlX21vZHVsZXMvYCBsaW5rcyBldmVyeSBpbnN0YWxsZWRcbiAqIHBhY2thZ2UgYW5kIHRoZXJlZm9yZSByZXNvbHZlcyB0aGUgdW5kZWNsYXJlZCByZXF1aXJlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQnVuIGNvbnN1bHRzIHRydXN0ZWREZXBlbmRlbmNpZXMgaW4gdGhlIHdvcmtzcGFjZSByb290J3MgcGFja2FnZS5qc29uIG9ubHksIHNvIHRoZSBsaXN0IGlzXG4gIC8vIG1hbmFnZWQgdGhlcmUgYW5kIG11c3QgY292ZXIgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIGFueXdoZXJlIGluIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcbiAgY29uc3QgYnVuSnNvbk9iaiA9IGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbiAmIHsgdHJ1c3RlZERlcGVuZGVuY2llcz86IHN0cmluZ1tdIH07XG4gIC8vIEJ1biBpbnN0YWxscyBvcHRpb25hbCBhbmQgcGVlciBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdCwgc28gYWxsIGRlY2xhcmF0aW9uIHNlY3Rpb25zIGNvdW50LlxuICAvLyBFdmVyeSBkZWNsYXJlZCByYW5nZSBpcyBrZXB0IHBlciBwYWNrYWdlOiBhIHJvb3QgZGVjbGFyYXRpb24gbXVzdCBub3QgbWFzayBhIHdvcmtzcGFjZSBvbmVcbiAgLy8gKGUuZy4gcm9vdCBAY2hha3JhLXVpL2NsaSB2MiBhbG9uZ3NpZGUgYSB3b3Jrc3BhY2Ugb24gdjMpLlxuICBjb25zdCBkZWNsYXJlZERlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMgPSAocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgdmVyc2lvblJhbmdlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltzZWN0aW9uXSA/PyB7fSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uUmFuZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgdmVyc2lvblJhbmdlcyA9IGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldChkZXBlbmRlbmN5TmFtZSk7XG4gICAgICAgICAgaWYgKHZlcnNpb25SYW5nZXMpIHtcbiAgICAgICAgICAgIHZlcnNpb25SYW5nZXMucHVzaCh2ZXJzaW9uUmFuZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWNsYXJlZERlcGVuZGVuY2llcy5zZXQoZGVwZW5kZW5jeU5hbWUsIFt2ZXJzaW9uUmFuZ2VdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZykpIHtcbiAgICB0cnkge1xuICAgICAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoXG4gICAgICAgIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvblxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB1bnJlYWRhYmxlIHdvcmtzcGFjZSBwYWNrYWdlLmpzb25cbiAgICB9XG4gIH1cbiAgLy8gT25seSBAY2hha3JhLXVpL2NsaSB2MydzIGBjaGFrcmEgdHlwZWdlbmAgd3JpdGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0O1xuICAvLyB2MidzIGBjaGFrcmEtY2xpIHRva2Vuc2Agd3JpdGVzIGludG8gQGNoYWtyYS11aS9zdHlsZWQtc3lzdGVtIGluc3RlYWQsIHNvIHRydXN0aW5nXG4gIC8vIEBjaGFrcmEtdWkvcmVhY3QgdGhlcmUgd291bGQgZm9yY2UgYSB1c2VsZXNzIHByb2plY3QtbG9jYWwgY29weSB3aXRob3V0IGZpeGluZyBnZW4tY29kZS5cbiAgLy8gTWlycm9yIHdiIGdlbi1jb2RlJ3MgY2xhc3NpZmljYXRpb246IG9ubHkgYSByYW5nZSB3aG9zZSBsZWFkaW5nIG1ham9yIHBhcnNlcyB0byAyIHNlbGVjdHMgdGhlXG4gIC8vIHYyIGNvbW1hbmQsIHNvIGRpZ2l0bGVzcyBzcGVjcyBsaWtlIGBsYXRlc3RgIG9yIGNhdGFsb2cgcmVmZXJlbmNlcyBjb3VudCBhcyB2My5cbiAgY29uc3QgaGFzQ2hha3JhQ2xpVjMgPSAoZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KCdAY2hha3JhLXVpL2NsaScpID8/IFtdKS5zb21lKFxuICAgICh2ZXJzaW9uUmFuZ2UpID0+IC9cXGQrL3UuZXhlYyh2ZXJzaW9uUmFuZ2UpPy5bMF0gIT09ICcyJ1xuICApO1xuICBjb25zdCByZXF1aXJlZFdiZnlQYWNrYWdlcyA9IFtcbiAgICAuLi4oaGFzQ2hha3JhQ2xpVjMgJiYgZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAY2hha3JhLXVpL3JlYWN0JykgPyBbJ0BjaGFrcmEtdWkvcmVhY3QnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdkcml6emxlLWtpdCcpID8gWydkcml6emxlLWtpdCddIDogW10pLFxuICAgIC8vIFRoZXNlIGdpdC1kZXBlbmRlbmN5IGJ1aWxkcyBpbXBvcnQgcGFja2FnZXMgdGhleSBkbyBub3QgZGVjbGFyZSAoZS5nLiB6b2QpLCB3aGljaCB0aGVcbiAgICAvLyBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cDsgYSBwcm9qZWN0LWxvY2FsIGNvcHkgdW5kZXJcbiAgICAvLyBub2RlX21vZHVsZXMvLmJ1biByZXNvbHZlcyB0aGVtIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHkpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpID8gWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgPyBbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA6IFtdKSxcbiAgICAvLyBibGl0eiBhbmQgQGJsaXR6anMvYXV0aCByZXF1aXJlIHJlYWN0IChhbmQgb3RoZXIgcGVlcnMpIHdpdGhvdXQgZGVjbGFyaW5nIHRoZW0sIHJlbHlpbmcgb25cbiAgICAvLyBob2lzdGluZywgd2hpY2ggdGhlIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwIChvYnNlcnZlZCBpblxuICAgIC8vIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW06IGBuZXh0IGJ1aWxkYCBwYWdlLWRhdGEgY29sbGVjdGlvbiBkaWVzIHdpdGggXCJDYW5ub3QgZmluZCBtb2R1bGVcbiAgICAvLyAncmVhY3QnXCIgZnJvbSBAYmxpdHpqcy9hdXRoKS4gQGJsaXR6anMvcnBjIGlzIE5PVCBsaXN0ZWQgYmVjYXVzZSBpdCBwcm9wZXJseSBkZWNsYXJlcyBpdHNcbiAgICAvLyByZWFjdC9AdGFuc3RhY2sgcGVlcnMsIHNvIEJ1biBsaW5rcyB0aGVtIGludG8gaXRzIHN0b3JlIGVudHJ5LiBAYmxpdHpqcy9uZXh0IGlzXG4gICAgLy8gZGVsaWJlcmF0ZWx5IE5PVCBsaXN0ZWQgZWl0aGVyOiB0cnVzdGluZyBpdCB3b3VsZCBydW4gaXRzIHBvc3RpbnN0YWxsIChgYmxpdHogY29kZWdlbmApLFxuICAgIC8vIHdoaWNoIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2Ug4oCUIHJlcG9zaXRvcmllcyBwYXRjaCBvdXQgdGhhdCBwb3N0aW5zdGFsbFxuICAgIC8vIHdpdGggYGJ1biBwYXRjaGAgaW5zdGVhZCwgd2hpY2ggYWxzbyBrZWVwcyB0aGUgcGFja2FnZSBwcm9qZWN0LWxvY2FsLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2JsaXR6JykgPyBbJ2JsaXR6J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGJsaXR6anMvYXV0aCcpID8gWydAYmxpdHpqcy9hdXRoJ10gOiBbXSksXG4gICAgLy8gQnVuIGRvZXMgbm90IGxpbmsgQGhvb2tmb3JtL3Jlc29sdmVycycgT1BUSU9OQUwgdmFsaWRhdG9yIHBlZXJzIChlLmcuIHpvZCkgaW50byBpdHNcbiAgICAvLyBnbG9iYWwtc3RvcmUgZW50cnkgZXZlbiB3aGVuIHRoZSBwcm9qZWN0IGluc3RhbGxzIHRoZW0sIHNvIGl0cyBzZXJ2ZXItc2lkZVxuICAgIC8vIGBpbXBvcnQgJ3pvZCdgIGZhaWxzIGZyb20gdGhlIHN0b3JlIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAaG9va2Zvcm0vcmVzb2x2ZXJzJykgPyBbJ0Bob29rZm9ybS9yZXNvbHZlcnMnXSA6IFtdKSxcbiAgICAvLyBAem9vbS9ydG1zIGluc3RhbGxzIGl0cyBuYXRpdmUgcnRtcy5ub2RlIGJpbmRpbmcgaW4gYSBsaWZlY3ljbGUgc2NyaXB0LiBXaXRob3V0IGV4cGxpY2l0XG4gICAgLy8gdHJ1c3QsIEJ1biBza2lwcyB0aGF0IHNjcmlwdCBhbmQgdGhlIHBhY2thZ2UgZmFpbHMgYXMgc29vbiBhcyB0aGUgWm9vbSBib3QgaW1wb3J0cyBpdFxuICAgIC8vIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zbWFydHNlLXpvb20tYm90KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAem9vbS9ydG1zJykgPyBbJ0B6b29tL3J0bXMnXSA6IFtdKSxcbiAgXTtcblxuICAvLyB3YmZ5IGZ1bGx5IG93bnMgdGhpcyBmaWVsZDogYSBwYWNrYWdlIHdob3NlIGxpZmVjeWNsZSBzY3JpcHRzIG11c3QgcnVuIGdldHMgYWRkZWQgdG8gd2JmeVxuICAvLyBpdHNlbGYgaW5zdGVhZCBvZiB0byBpbmRpdmlkdWFsIHJlcG9zaXRvcmllcywgc28gdW5tYW5hZ2VkIGVudHJpZXMgYXJlIGFsd2F5cyByZW1vdmVkIOKAlFxuICAvLyBpbmNsdWRpbmcgYW4gZXhwbGljaXRseSBlbXB0eSBkZW55LWFsbCBsaXN0LCB3aG9zZSBkZWxldGlvbiBkZWxpYmVyYXRlbHkgcmVzdG9yZXMgQnVuJ3NcbiAgLy8gZGVmYXVsdCBhbGxvdy1saXN0ICh0aGUgb3duZXJzaGlwIHBvbGljeSBjaG9zZW4gaW4gIzk3NSkuXG4gIGNvbnN0IGV4aXN0aW5nVHJ1c3RlZCA9IGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgaWYgKHJlcXVpcmVkV2JmeVBhY2thZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChleGlzdGluZ1RydXN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRGVsZXRpbmcgdGhlIGZpZWxkIHJlc3RvcmVzIEJ1bidzIGZ1bGwgZGVmYXVsdCBhbGxvdy1saXN0LCBzbyBvbmx5IGVudHJpZXMgb3V0c2lkZSB0aGF0XG4gICAgICAvLyBsaXN0IGFjdHVhbGx5IGxvc2UgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMuXG4gICAgICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCwgbmV3IFNldCgpKTtcbiAgICAgIGRlbGV0ZSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFuIGV4cGxpY2l0IHRydXN0ZWREZXBlbmRlbmNpZXMgbGlzdCBSRVBMQUNFUyBCdW4ncyBkZWZhdWx0IGFsbG93LWxpc3QgaW5zdGVhZCBvZiBleHRlbmRpbmdcbiAgLy8gaXQsIGFuZCBCdW4gcHJpbnRzIG5vIHdhcm5pbmcgZm9yIHRoZSBwb3N0aW5zdGFsbHMgaXQgY29uc2VxdWVudGx5IHNraXBzIChlLmcuIEByYWlsd2F5L2NsaVxuICAvLyBkb3dubG9hZHMgaXRzIGJpbmFyeSBpbiBwb3N0aW5zdGFsbCBhbmQgZXhpdHMgMSB3aXRob3V0IG9uZSkuIEluY2x1ZGUgdGhlIEVOVElSRSBkZWZhdWx0IGxpc3Q6XG4gIC8vIGVudHJpZXMgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQgYXJlIGluZXJ0LCBhbmQgdGhpcyBpcyB0aGUgb25seSByZXByZXNlbnRhdGlvblxuICAvLyB0aGF0IHN0YXlzIGNvcnJlY3QgZm9yIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlc29sdmVzIGFmdGVyIHRoaXNcbiAgLy8gcnVucyDigJQgYW4gaW50ZXJzZWN0aW9uIHdpdGggYSBtaXNzaW5nIG9yIHN0YWxlIGxvY2tmaWxlIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhlbS5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICAvLyBsZWZ0aG9vayBpcyBhcHBlbmRlZCBleHBsaWNpdGx5IHNvIHRoZSBkZWZhdWx0LWxpc3QgbG9va3VwIGZhaWxpbmcgY2Fubm90IGRyb3AgaXQ6IGl0IGlzXG4gIC8vIHJlcXVpcmVkIGluIGV2ZXJ5IG1hbmFnZWQgcmVwb3NpdG9yeS5cbiAgY29uc3QgbmV3VHJ1c3RlZFBhY2thZ2VzID0gbmV3IFNldChbXG4gICAgLi4ucmVxdWlyZWRXYmZ5UGFja2FnZXMsXG4gICAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICAgIC4uLihkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA/PyBbXSksXG4gIF0pO1xuICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCA/PyBbXSwgbmV3VHJ1c3RlZFBhY2thZ2VzKTtcbiAgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzID0gWy4uLm5ld1RydXN0ZWRQYWNrYWdlc10udG9Tb3J0ZWQoKTtcbn1cblxuLy8gVGhlIHBhY2thZ2VzIHdiZnkgaXRzZWxmIG1heSB3cml0ZSBpbnRvIHRydXN0ZWREZXBlbmRlbmNpZXM7IHRoZWlyIHJlbW92YWwgaXMgbWFuYWdlZCBjbGVhbnVwLFxuLy8gbmV2ZXIgYSBsb3NzIG9mIHVzZXIgcG9saWN5LlxuY29uc3Qgd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbXG4gICdAYmxpdHpqcy9hdXRoJyxcbiAgJ0BjaGFrcmEtdWkvcmVhY3QnLFxuICAnQGhvb2tmb3JtL3Jlc29sdmVycycsXG4gICdAd2lsbGJvb3N0ZXIvanVkZ2UnLFxuICAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsXG4gICdAem9vbS9ydG1zJyxcbiAgJ2JsaXR6JyxcbiAgJ2RyaXp6bGUta2l0JyxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuXSk7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGV4aXN0aW5nVHJ1c3RlZDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtlcHRQYWNrYWdlczogUmVhZG9ubHlTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIC8vIEEgZGVmYXVsdC10cnVzdGVkIGVudHJ5IG5ldmVyIGxvc2VzIGFueXRoaW5nIGJ5IHJlbW92YWw6IHdoaWxlIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCB0aGVcbiAgLy8ga2VwdCBsaXN0IChvciwgd2hlbiB0aGUgZmllbGQgaXMgZGVsZXRlZCwgQnVuJ3Mgb3duIGRlZmF1bHQgbGlzdCkgc3RpbGwgdHJ1c3RzIGl0LlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGNvbnN0IHJlbW92ZWRQYWNrYWdlcyA9IGV4aXN0aW5nVHJ1c3RlZC5maWx0ZXIoXG4gICAgKHBrZykgPT4gIWtlcHRQYWNrYWdlcy5oYXMocGtnKSAmJiAhd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzLmhhcyhwa2cpICYmICFkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcz8uaGFzKHBrZylcbiAgKTtcbiAgaWYgKHJlbW92ZWRQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFJlbW92aW5nIHVubWFuYWdlZCB0cnVzdGVkRGVwZW5kZW5jaWVzIGVudHJpZXM6ICR7cmVtb3ZlZFBhY2thZ2VzLmpvaW4oJywgJyl9LiB3YmZ5IG93bnMgdGhpcyBmaWVsZDsgaWYgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMgYXJlIHJlcXVpcmVkLCBhZGQgdGhlIHBhY2thZ2VzIHRvIHdiZnkgaXRzZWxmLmBcbiAgICApO1xuICB9XG59XG5cbmxldCBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbi8qKiBGZXRjaGVzIEJ1bidzIGRlZmF1bHQgdHJ1c3RlZC1kZXBlbmRlbmN5IGFsbG93LWxpc3QgZnJvbSB0aGUgQnVuIHZlcnNpb24gaW5zdGFsbGluZyB0aGUgcmVwb3NpdG9yeS4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcykge1xuICAgIC8vIEJ1biBjb2xvcml6ZXMgdGhlIGxpc3QgbWFya2VycyB3aGVuIEZPUkNFX0NPTE9SIGlzIHNldCAoZS5nLiBieSB0ZXN0IHJ1bm5lcnMgb24gQ0kpLCBzb1xuICAgIC8vIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBtdXN0IGJlIHN0cmlwcGVkIGJlZm9yZSBwYXJzaW5nLlxuICAgIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnYnVuJywgWydwbScsICdkZWZhdWx0LXRydXN0ZWQnXSwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoXG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBtYXRjaGluZyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgcmVxdWlyZXMgdGhlIEVTQyBjb250cm9sIGNoYXJhY3RlclxuICAgICAgL1xcdTAwMUJcXFtbMC05O10qbS9ndSxcbiAgICAgICcnXG4gICAgKTtcbiAgICBjb25zdCBwYXJzZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFsuLi5zdGRvdXQubWF0Y2hBbGwoL15cXHMqLVxccysoXFxTKykkL2dtdSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdIGFzIHN0cmluZykpO1xuICAgIGlmIChwYXJzZWREZXBlbmRlbmNpZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gRG8gbm90IGNhY2hlIHRoZSBmYWlsdXJlOiBhIHRhcmdldC1sb2NhbCBwcm9ibGVtIChlLmcuIGFuIHVucmVhZGFibGUgcGFja2FnZS5qc29uKSBtdXN0XG4gICAgICAvLyBub3QgZGVueSB0aGUgZGVmYXVsdCBsaXN0IHRvIGV2ZXJ5IGxhdGVyIHRhcmdldCBvZiBhIG11bHRpLXBhdGggcnVuLlxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVhZCB0aGUgZGVmYXVsdCBhbGxvdy1saXN0IHZpYSBgYnVuIHBtIGRlZmF1bHQtdHJ1c3RlZGAuJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IHBhcnNlZERlcGVuZGVuY2llcztcbiAgfVxuICByZXR1cm4gY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgLy8gRXhwbGljaXQgcm9vdCBwdWJsaXNoaW5nIGludGVudCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgd2JmeSdzIHByaXZhdGUgbW9ub3JlcG8tcm9vdCBkZWZhdWx0LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmIChjb25maWcucmVsZWFzZS5ucG1QdWJsaXNoZXNSb290IHx8IGpzb25PYmoucHVibGlzaENvbmZpZykpIHtcbiAgICBkZWxldGUganNvbk9iai5wcml2YXRlO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhY29uZmlnLnJlbGVhc2UubnBtICYmICFqc29uT2JqLnB1Ymxpc2hDb25maWcpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJlZ2lzdHJ5LCBucG0gcmVzb2x2ZXMgdGhlIHB1Ymxpc2ggdGFyZ2V0IGZyb20gdGhlIHdvcmtzcGFjZSAubnBtcmMsXG4gICAgLy8gd2hvc2UgZGVmYXVsdCByZWdpc3RyeSBvbiBDSSBtYXkgYmUgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHByb3h5IOKAlCB3aGljaCByZWplY3RzXG4gICAgLy8gYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSAoc2hhcmVkIzEwNzIpLiBgPz89YCBrZWVwcyBhIGRlbGliZXJhdGVseSBkaWZmZXJlbnQgcmVnaXN0cnkuXG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLnJlZ2lzdHJ5ID8/PSAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJztcbiAgfVxuICBjb25zdCBvd25lciA9IGNvbmZpZy5yZXBvQXV0aG9yO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ2J1biBydW4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgY29uc3Qgc2NyaXB0UnVubmVyID0gJ2J1biBydW4nO1xuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGAke3NjcmlwdFJ1bm5lcn0gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBgJHtzY3JpcHRSdW5uZXJ9IGxpbnRgO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgaWYgKHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZykpIHtcbiAgICAvLyBQcmVzZXJ2ZSBwcm9qZWN0LXNwZWNpZmljIHN0ZXBzIGEgcmVwbyBhcHBlbmRlZCB0byB0aGUgbWFuYWdlZCBgYnVuIHdiIGdlbi1jb2RlYCAoZS5nLiBidWlsZGluZyBleHRyYSBkZXBsb3lcbiAgICAvLyBhc3NldHMpIGluc3RlYWQgb2YgZGlzY2FyZGluZyB0aGVtOyBvbmx5IHRoZSBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnQgaXMgd2JmeSdzIHRvXG4gICAgLy8gcmVnZW5lcmF0ZS4gQW4gdW5wYXJzZWFibGUgc2NyaXB0IGlzIGxlZnQgYWxvbmUgcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgICBjb25zdCBzZWdtZW50cyA9IGdlbkNvZGVTY3JpcHQgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhnZW5Db2RlU2NyaXB0KTtcbiAgICBjb25zdCBjdXN0b21TZWdtZW50cyA9IHNlZ21lbnRzPy5maWx0ZXIoXG4gICAgICAoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIGpzb25PYmouc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgKTtcbiAgICBpZiAoY3VzdG9tU2VnbWVudHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IFsnYnVuIHdiIGdlbi1jb2RlJywgLi4uY3VzdG9tU2VnbWVudHNdLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoanNvbk9iai5zY3JpcHRzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhIHx8IGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8IGNvbmZpZy5kZXBlbmRpbmcucHJpc21hO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChmb3JtYXRTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmIGJ1biBydW4gZm9ybWF0LWNvZGVgIDogJ2J1biBydW4gZm9ybWF0LWNvZGUnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PlxuICAgIGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQubXRzJyksIGNvbmZpZ0RtdHNDb250ZW50KVxuICApO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBqc29uT2JqOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpLmZpbHRlcihcbiAgICAoZGVwZW5kZW5jeSkgPT5cbiAgICAgIG1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpICYmXG4gICAgICAvLyBBIHB1YmxpYyBwYWNrYWdlJ3MgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBtdXN0IG5ldmVyIGJlIHJlLW1hbmFnZWQgdmlhIGEgcmVnaXN0cnkgaW5zdGFsbFxuICAgICAgLy8gKHByaXZhdGUgb25lcyBhcmUgbm9ybWFsaXplZCB0byBgd29ya3NwYWNlOipgIGxhdGVyKS4gVGhpcyBhbHNvIGNvdmVycyBydW5uaW5nIHdiZnkgb24gYVxuICAgICAgLy8gbW9ub3JlcG8gU1VCRElSRUNUT1JZLCB3aGVyZSB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcyBhcmUgaW52aXNpYmxlIGFuZCB0aGUgd29ya3NwYWNlLW1hcFxuICAgICAgLy8gZ3VhcmQgaW4gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMgY2Fubm90IHByb3RlY3QgdGhlIHNwZWNpZmllci5cbiAgICAgIChqc29uT2JqLnByaXZhdGUgfHwgIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiB2b2lkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuICB9XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgLy8gYG1pc2Ugd2hpY2ggcHl0aG9uYCB5aWVsZHMgdGhlIHNpbmdsZSBhY3RpdmUgaW50ZXJwcmV0ZXIgcGF0aDsgYG1pc2UgY3VycmVudCBweXRob25gIGNhblxuICAvLyBwcmludCBtdWx0aXBsZSBzcGFjZS1zZXBhcmF0ZWQgdmVyc2lvbnMgKG1pc2Ugc3VwcG9ydHMgbXVsdGktdmVyc2lvbiBwaW5zKSwgd2hpY2ggd291bGQgcGFzc1xuICAvLyBleHRyYSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBgcG9ldHJ5IGVudiB1c2VgLiBXaGVuIG1pc2UgaXMgbWlzc2luZyBvciBweXRob24gaXNcbiAgLy8gdW5jb25maWd1cmVkLCBza2lwIGBwb2V0cnkgZW52IHVzZWAgYW5kIGZhbGwgYmFjayB0byBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyIGluc3RlYWQgb2ZcbiAgLy8gYWJvcnRpbmcgdGhlIGNoYWluLlxuICAvLyBUaGUgYHx8IHRydWVgIGNvdmVycyBvbmx5IHRoZSBtaXNlIHJlc29sdXRpb246IGEgbWlzc2luZy91bmNvbmZpZ3VyZWQgbWlzZSBmYWxscyBiYWNrIHRvXG4gIC8vIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIsIHdoaWxlIGEgZmFpbGluZyBgcG9ldHJ5IGVudiB1c2VgIHN0aWxsIGFib3J0cyB0aGUgY2hhaW4uXG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgeyBweXRob25fcGF0aD1cIiQobWlzZSB3aGljaCBweXRob24gMj4vZGV2L251bGwpXCIgfHwgdHJ1ZTsgfSAmJiB7IFsgLXogXCIkcHl0aG9uX3BhdGhcIiBdIHx8IHBvZXRyeSBlbnYgdXNlIFwiJHB5dGhvbl9wYXRoXCI7IH0gJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KSkpLFxuICBdO1xuICBzcGF3blN5bmMoJ2J1bicsIFsnYWRkJywgLi4uKGRldiA/IFsnLUQnXSA6IFtdKSwgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIC8vIEEgcHJpdmF0ZSBwYWNrYWdlIHdob3NlIG1vbm9yZXBvIGNvbnRhaW5zIHRoaXMgZGVwZW5kZW5jeSBhcyBhIHdvcmtzcGFjZSBtdXN0IHJlZmVyZW5jZSBpdFxuICAgIC8vIHZpYSB0aGUgd29ya3NwYWNlIHByb3RvY29sOiBwaW5uaW5nIGEgcmVnaXN0cnkgdmVyc2lvbiBtYWtlcyBCdW4gc2hhZG93IHRoZSBzYW1lLW5hbWVcbiAgICAvLyB3b3Jrc3BhY2UgYW5kIHNraXAgaW5zdGFsbGluZyB0aGUgd29ya3NwYWNlJ3Mgb3duIGRlcGVuZGVuY2llcy4gKFB1Ymxpc2hlZCBwYWNrYWdlcyBpbnN0ZWFkXG4gICAgLy8gcGluIGEgY29uY3JldGUgdmVyc2lvbiBiZWNhdXNlIGBucG0gcHVibGlzaGAgcmVqZWN0cyBgd29ya3NwYWNlOipgIHNwZWNpZmllcnMg4oCUIGJ1dCBhblxuICAgIC8vIEVYSVNUSU5HIGB3b3Jrc3BhY2U6YCBkZWNsYXJhdGlvbiBpcyBhbHdheXMga2VwdDogb3ZlcndyaXRpbmcgaXQgd2l0aCBhIHJlZ2lzdHJ5IHJlbGVhc2VcbiAgICAvLyB3b3VsZCBzaWxlbnRseSBicmVhayB0aGUgbG9jYWwgd29ya3NwYWNlIGxpbmsuKVxuXG4gICAgLy8gQSBkZWNsYXJlZCBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGFsd2F5cyB3aW5zLCB3aGV0aGVyIG9yIG5vdCB0aGUgd29ya3NwYWNlIG1hcCBzZWVzIHRoZVxuICAgIC8vIHBhY2thZ2U6IHJ1bm5pbmcgd2JmeSBvbiBhIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSBoaWRlcyB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcywgc28gdGhlIG1hcFxuICAgIC8vIGFsb25lIGNhbm5vdCBiZSB0cnVzdGVkIHRvIGRldGVjdCBhIGxvY2FsIHdvcmtzcGFjZSBsaW5rLlxuICAgIGlmIChwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoanNvbk9iai5wcml2YXRlKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoanNvbk9iai5wcml2YXRlICYmIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmhhcyhkZXBlbmRlbmN5KSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZXhpc3RpbmdTcGVjaWZpZXIgfHwgZXhpc3RpbmdTcGVjaWZpZXIuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBBbiBleGlzdGluZyBDT05DUkVURSBwaW4gb24gYSB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhIGRlbGliZXJhdGUgY2hvaWNlIGFuZCBtdXN0IG5vdCBiZVxuICAgICAgLy8gY29udmVydGVkIHRvIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2wuIE5vdGUgdGhlIHRyYWRlLW9mZiBlaXRoZXIgd2F5OiBucG0gKHdoaWNoXG4gICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlXG4gICAgICAvLyBhIHJlZ2lzdHJ5IHBpbiBtYWtlcyBhIGNvbGQgYnVuIGluc3RhbGwgc2hhZG93IHRoZSB3b3Jrc3BhY2UgYW5kIHNraXAgaXRzIGRlcGVuZGVuY2llcyDigJRcbiAgICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBrZWVwcyBgd29ya3NwYWNlOipgIGFuZCBzdHJpcHMgdGhlIHByb3RvY29sIG9uIHRoZSBDSSBjaGVja291dCByaWdodFxuICAgICAgLy8gYmVmb3JlIHJlbGVhc2luZyAoc2NyaXB0cy9zdHJpcFdvcmtzcGFjZVByb3RvY29sLm1qcykuIEZhbGwgdGhyb3VnaCBzbyBhIGNvbmNyZXRlIHBpblxuICAgICAgLy8ga2VlcHMgYmVpbmcgYnVtcGVkIGxpa2UgYW55IG1hbmFnZWQgZGVwZW5kZW5jeS5cbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHJvb3RDb25maWcsXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGNvbnN0IG1hbmFnZWRWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSwgbWFuYWdlZFZlcnNpb24pKSB7XG4gICAgICAgIC8vIGBidW4gYWRkIGRlcGVuZGVuY3lgIHByZXNlcnZlcyBhbiBleGlzdGluZyBleGFjdCBwaW4sIHNvIHdyaXRlIHRoZSBhZ2UtY2xlYXJlZCB2ZXJzaW9uXG4gICAgICAgIC8vIGRpcmVjdGx5LiBUaGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGluc3RhbGwgcmVmcmVzaGVzIHRoZSBsb2NrZmlsZSBhZnRlciBldmVyeSBwYWNrYWdlXG4gICAgICAgIC8vIG1hbmlmZXN0IGhhcyBjb252ZXJnZWQgb24gdGhlIGdlbmVyYXRlZCByZWxlYXNlLWFnZSBwb2xpY3kuXG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbWFuYWdlZFZlcnNpb247XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoIXNraXBBZGRpbmdEZXBzKSBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgaWYgKGxhdGVzdFZlcnNpb24gPT09ICcqJyAmJiBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBsYXRlc3RWZXJzaW9uO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgc3Bhd25TeW5jKCdidW54JywgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICAvLyBUeXBlU2NyaXB0IDcncyBuYXRpdmUgY29tcGlsZXIgZHJvcHBlZCB0aGUgaW4tcHJvY2VzcyBgcGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbmBcbiAgICAvLyBoZWxwZXIsIHNvIHBhcnNlIHRoZSB0c2NvbmZpZyBpbnRvIGFuIEFTVCBhbmQgcmVhZCBpdHMgdG9wLWxldmVsIGBleHRlbmRzYCBkaXJlY3RseS5cbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoYWJzb2x1dGVGaWxlUGF0aCk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcGFyc2VkLmApO1xuICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2UpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodmFsdWUgPT09IGRlcGVuZGVuY3kgfHwgdmFsdWUuc3RhcnRzV2l0aChgJHtkZXBlbmRlbmN5fS9gKSkge1xuICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuLyoqIFJlYWRzIHRoZSB0b3AtbGV2ZWwgYGV4dGVuZHNgIGVudHJpZXMgKGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MpIGZyb20gYSBwYXJzZWQgdHNjb25maWcuICovXG5mdW5jdGlvbiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZSkpIHtcbiAgICBpZiAoYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSAmJiBhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpICYmIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ2V4dGVuZHMnKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhwcm9wZXJ0eS5pbml0aWFsaXplciwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogcmVhZG9ubHkgYXN0Lk9iamVjdExpdGVyYWxFbGVtZW50TGlrZVtdIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoYXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChzdGF0ZW1lbnQpICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uLnByb3BlcnRpZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMobm9kZTogYXN0LkV4cHJlc3Npb24sIHZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGFzdC5pc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICB2YWx1ZXMucHVzaChub2RlLnRleHQpO1xuICB9IGVsc2UgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygbm9kZS5lbGVtZW50cykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMoZWxlbWVudCwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PltdIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5c1xuICAgIC5tYXAoKGtleSkgPT4ganNvbk9ialtrZXldKVxuICAgIC5maWx0ZXIoKHNlY3Rpb24pOiBzZWN0aW9uIGlzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gISFzZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVkVmVyc2lvbiA9IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuZ2V0KGRlcGVuZGVuY3kpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpKSB7XG4gICAgcmV0dXJuIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzID0gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3kpO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBpZiAobGF0ZXN0VmVyc2lvbiAhPT0gJyonICYmIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZSh0aW1lc1tsYXRlc3RWZXJzaW9uXSkpIHtcbiAgICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuXG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lcylbMF0gPz8gJyonO1xufVxuXG4vKiogRXZlcnkgc3RhYmxlIHJlbGVhc2UgaW4gYHRpbWVzYCB0aGF0IGFscmVhZHkgY2xlYXJlZCB0aGUgYWdlIGdhdGUsIG5ld2VzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nW10ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModGltZXMpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiBzZW12ZXIudmFsaWQodmVyc2lvbikpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiAoc2VtdmVyLnByZXJlbGVhc2UodmVyc2lvbik/Lmxlbmd0aCA/PyAwKSA9PT0gMClcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IE51bWJlci5pc0Zpbml0ZShEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSkpXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBub3cgLSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSA+PSBwYWNrYWdlQWdlR2F0ZU1zKVxuICAgIC50b1NvcnRlZCgoW3ZlcnNpb25BXSwgW3ZlcnNpb25CXSkgPT4gc2VtdmVyLnJjb21wYXJlKHZlcnNpb25BLCB2ZXJzaW9uQikpXG4gICAgLm1hcCgoW3ZlcnNpb25dKSA9PiB2ZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHB1Ymxpc2hlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaXNoZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwdWJsaXNoZWRUaW1lID0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHVibGlzaGVkVGltZSkgJiYgRGF0ZS5ub3coKSAtIHB1Ymxpc2hlZFRpbWUgPj0gcGFja2FnZUFnZUdhdGVNcztcbn1cblxuZnVuY3Rpb24gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3k6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGRlcGVuZGVuY3kucmVwbGFjZSgvQFteQC9dKyQvdSwgJycpO1xuICBjb25zdCBjYWNoZWRUaW1lcyA9IG5wbVBhY2thZ2VUaW1lc0NhY2hlLmdldChwYWNrYWdlTmFtZSk7XG4gIGlmIChjYWNoZWRUaW1lcykgcmV0dXJuIGNhY2hlZFRpbWVzO1xuXG4gIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnbnBtJyxcbiAgICBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3RpbWUnLCAnLS1qc29uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLFxuICAgIHByb2Nlc3MuY3dkKClcbiAgKTtcbiAgaWYgKCFzdGRvdXQpIHJldHVybiB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgW1JlY29yZDxzdHJpbmcsIHN0cmluZz5dO1xuICAgIGNvbnN0IHRpbWVzID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkWzBdIDogcGFyc2VkO1xuICAgIGlmICghdGltZXMpIHJldHVybiB7fTtcbiAgICBucG1QYWNrYWdlVGltZXNDYWNoZS5zZXQocGFja2FnZU5hbWUsIHRpbWVzKTtcbiAgICByZXR1cm4gdGltZXM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBLZWVwIHBpbm5pbmcgYWxpZ25lZCB3aXRoIEJ1bidzIGV4ZW1wdGlvbnMuIHdiZnkncyBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbiBjYW4gcmVseSBvbiB0aGVcbiAgLy8gY3VycmVudCB3YiBjb250cmFjdCwgc28gaW5kZXBlbmRlbnRseSBzb2FraW5nIG9yIGRvd25ncmFkaW5nIHdiIHdvdWxkIHBhaXIgbmV3IGdlbmVyYXRlZCBmaWxlc1xuICAvLyB3aXRoIGFuIGluY29tcGF0aWJsZSBvbGQgQ0xJLCBhbmQgYSB0ZW1wb3JhcmlseSBleGVtcHRlZCBwYWNrYWdlIG11c3QgcmVhY2ggaXRzIHNlY3VyaXR5IGZpeC5cbiAgLy8gT25seSBwYWNrYWdlcyBCdW4gaXRzZWxmIGdhdGVzIG1heSBiZSBzZWxlY3RlZCBmcm9tIG9sZGVyIHRhZ3MuXG4gIHJldHVybiAhYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5zb21lKChwYXR0ZXJuKSA9PiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuLCBkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJuID09PSBkZXBlbmRlbmN5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApLnJlcGxhY2VBbGwoJyonLCAnLionKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgLCAndScpLnRlc3QoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBObyBjYWNoZSBoZXJlOiB0aGUgb25seSBjYWxsZXIgY2hhaW4gZ29lcyB0aHJvdWdoIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uLCB3aGljaCBhbHJlYWR5XG4gIC8vIG1lbW9pemVzIHBlciBkZXBlbmRlbmN5LCBzbyB0aGlzIGNhbiBydW4gYXQgbW9zdCBvbmNlIHBlciBkZXBlbmRlbmN5LlxuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBkZXBlbmRlbmN5LCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSwgcHJvY2Vzcy5jd2QoKSkgfHwgJyonO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFR5cGVTY3JpcHQgaXMgdmVyc2lvbi1jYXBwZWQgaW4gQmxpdHogcmVwb3NpdG9yaWVzLCBzbyBpdHMgaW5zdGFsbCBzcGVjaWZpZXIgbXVzdCBjYXJyeSB0aGVcbiAgLy8gbWFuYWdlZCB2ZXJzaW9uIOKAlCBhIGJhcmUgYGJ1biBhZGRgIHdvdWxkIGluc3RhbGwgdGhlIGluY29tcGF0aWJsZSBsYXRlc3QuXG4gIGlmIChkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Z2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSl9YDtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jeTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYSBCbGl0eiBhcHAgKHRoZSBjdXJyZW50IHBhY2thZ2Ugb3IgdGhlIHdvcmtzcGFjZSByb290KS4gKi9cbmZ1bmN0aW9uIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCByb290Q29uZmlnLmRlcGVuZGluZy5ibGl0ejtcbn1cblxuY29uc3Qgd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4vKiogTWFwIGZyb20gZWFjaCB3b3Jrc3BhY2UgcGFja2FnZSdzIG5hbWUgdG8gaXRzIGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZS5nZXQocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCB3b3Jrc3BhY2VEaXJzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgaWYgKHdvcmtzcGFjZVBhY2thZ2VKc29uLm5hbWUpIHtcbiAgICAgICAgd29ya3NwYWNlRGlyc0J5TmFtZS5zZXQod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucGFyc2FibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLnNldChyb290Q29uZmlnLmRpclBhdGgsIHdvcmtzcGFjZURpcnNCeU5hbWUpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyc0J5TmFtZTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGN1cnJlbnRWZXJzaW9uID09PSAnKicpIHJldHVybiB0cnVlO1xuICBpZiAoaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkgcmV0dXJuIHRydWU7XG4gIGlmICghbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgY29uc3QgY3VycmVudFZhbGlkVmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIC8vIEEgVHlwZVNjcmlwdCA3IHBpbiBpbiBhIEJsaXR6IHJlcG9zaXRvcnkgaXMgbGlrZXdpc2UgaW5jb21wYXRpYmxlIChgbmV4dCBidWlsZGAgZmFpbHMgb25cbiAgLy8gdGhlIE5leHQuanMgMTUgdGhhdCBCbGl0eiBwaW5zIOKAlCBzZWUgZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKSwgc28gcmV3cml0ZSBpdCB0byB0aGVcbiAgLy8gY2FwcGVkIHJlbGVhc2UgaW5zdGVhZCBvZiBwcmVzZXJ2aW5nIGl0IHZpYSB0aGUgbm8tZG93bmdyYWRlIHJ1bGUgYmVsb3cuIFRoZSBwaW4gbWF5IGJlIGFcbiAgLy8gUkFOR0UgKGUuZy4gYF43LjAuMGApLCB3aGljaCBzZW12ZXIudmFsaWQgcmVqZWN0cyDigJQganVkZ2UgdGhlIG1ham9yIGZyb20gdGhlIHJhbmdlIG1pbmltdW0uXG4gIGNvbnN0IGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiA9XG4gICAgY3VycmVudFZhbGlkVmVyc2lvbiA/PyAoc2VtdmVyLnZhbGlkUmFuZ2UoY3VycmVudFZlcnNpb24pID8gc2VtdmVyLm1pblZlcnNpb24oY3VycmVudFZlcnNpb24pPy52ZXJzaW9uIDogdW5kZWZpbmVkKTtcbiAgaWYgKFxuICAgIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmXG4gICAgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSAmJlxuICAgIGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiAmJlxuICAgIHNlbXZlci5tYWpvcihjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24pID49IDcgJiZcbiAgICBzZW12ZXIudmFsaWQobWFuYWdlZFZlcnNpb24pICYmXG4gICAgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gVGhlIGdlbmVyYXRlZCBidW5maWcgYXBwbGllcyB0aGUgb3JnYW5pemF0aW9uIGFnZSBnYXRlIGV2ZW4gdG8gZXhhY3QgcGlucy4gSWYgYSBtYW5hZ2VkXG4gIC8vIHRoaXJkLXBhcnR5IHRvb2wgaXMgbmV3ZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UgdGhhdCBjbGVhcmVkIHRoYXQgZ2F0ZSwgcHJlc2VydmluZyB0aGUgcGluXG4gIC8vIHByb2R1Y2VzIGEgcGFja2FnZS5qc29uIHRoYXQgYSBmcmVzaCBpbnN0YWxsIHdpdGhvdXQgdGhlIG9sZCBsb2NrZmlsZSBjYW5ub3QgcmVzb2x2ZSAobm90YWJseVxuICAvLyBvcHRpbWl6ZWQgRG9ja2VyIGJ1aWxkcykuIEtlZXAgdGhlIG5vLWRvd25ncmFkZSBwb2xpY3kgb25seSB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIGV4ZW1wdCBmcm9tXG4gIC8vIHRoZSBnYXRlOyBhZ2UtZ2F0ZWQgbWFuYWdlZCB0b29scyBtdXN0IGNvbnZlcmdlIG9uIHRoZSB2ZXJzaW9uIHRoZSBnZW5lcmF0ZWQgYnVuZmlnIGFjY2VwdHMuXG4gIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyB3YmZ5IG93bnMgdGhlc2UgdG9vbCBkZXBlbmRlbmNpZXMsIGJ1dCBhcHBseWluZyB3YmZ5IHNob3VsZCBub3QgZG93bmdyYWRlIGFcbiAgLy8gcmVwb3NpdG9yeSB0aGF0IGFscmVhZHkgcGlucyBhIG5ld2VyIHJldmlld2VkIHJlbGVhc2Ugd2hlbiB0aGUgb3JnIHBvbGljeSBleGVtcHRzIGl0LlxuICByZXR1cm4gaXNOZXdlclBhY2thZ2VWZXJzaW9uKG1hbmFnZWRWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWFuYWdlZFZlcnNpb246IHN0cmluZ1xuKTogY3VycmVudFZlcnNpb24gaXMgc3RyaW5nIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRNYW5hZ2VkVmVyc2lvbiA9IHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbik7XG4gIHJldHVybiAoXG4gICAgc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSAmJlxuICAgIHZhbGlkQ3VycmVudFZlcnNpb24gIT09IG51bGwgJiZcbiAgICB2YWxpZE1hbmFnZWRWZXJzaW9uICE9PSBudWxsICYmXG4gICAgc2VtdmVyLmd0KHZhbGlkQ3VycmVudFZlcnNpb24sIHZhbGlkTWFuYWdlZFZlcnNpb24pXG4gICk7XG59XG5cbi8vIFRoZSBuZXdlc3QgVHlwZVNjcmlwdCA2IHJlbGVhc2UgYXQgdGhlIHRpbWUgdGhlIEJsaXR6IGNhcCBzaGlwcGVkOyB1c2VkIG9ubHkgd2hlbiB0aGUgcmVnaXN0cnlcbi8vIGxvb2t1cCBmb3IgdGhlIGFjdHVhbCBuZXdlc3QgcHJlLXY3IHJlbGVhc2UgZmFpbHMgKHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLlxuY29uc3QgbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbiA9ICc2LjAuMyc7XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICAvLyBCbGl0eiBwaW5zIE5leHQuanMgMTUsIHdob3NlIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgcmVxdWlyZXMgdGhlIGNsYXNzaWNcbiAgICAvLyBgdHlwZXNjcmlwdGAgY29tcGlsZXIgQVBJOyB0aGUgVHlwZVNjcmlwdCA3IGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIGJpbmFyeVxuICAgIC8vIHdpdGhvdXQgdGhhdCBBUEksIHNvIGBuZXh0IGJ1aWxkYCBhYm9ydHMgd2l0aCBcIkZhaWxlZCB0byBpbnN0YWxsIHJlcXVpcmVkIFR5cGVTY3JpcHRcbiAgICAvLyBkZXBlbmRlbmNpZXNcIiAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuIENhcCBgdHlwZXNjcmlwdGAgYmVsb3cgNyB1bnRpbFxuICAgIC8vIEJsaXR6IHN1cHBvcnRzIGEgTmV4dC5qcyByZWxlYXNlIHRoYXQgdW5kZXJzdGFuZHMgdHNnby4gQSBmYWlsZWQgcmVnaXN0cnkgbG9va3VwIG11c3RcbiAgICAvLyByZXNvbHZlIHRvIGEga25vd24tY29tcGF0aWJsZSByZWxlYXNlIOKAlCBmYWxsaW5nIGJhY2sgdG8gbGF0ZXN0VmVyc2lvbiB3b3VsZCByZWluc3RhbGwgdGhlXG4gICAgLy8gaW5jb21wYXRpYmxlIFR5cGVTY3JpcHQgNy5cbiAgICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbik7XG4gICAgaWYgKHZhbGlkTGF0ZXN0VmVyc2lvbiAmJiBzZW12ZXIubWFqb3IodmFsaWRMYXRlc3RWZXJzaW9uKSA8IDcpIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICAgIC8vIFRoZSBjYXBwZWQgbG9va3VwIG11c3QgcmVzcGVjdCB0aGUgYWdlIGdhdGUgdG9vOiB0aGlzIHZlcnNpb24gaXMgd3JpdHRlbiBhcyBhbiBleGFjdCBwaW4sXG4gICAgLy8gYW5kIEJ1biByZWZ1c2VzIHRvIHJlc29sdmUgb25lIHB1Ymxpc2hlZCBpbnNpZGUgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93LiBUaGVyZSBpcyBub1xuICAgIC8vIHVuZ2F0ZWQgZmFsbGJhY2sg4oCUIHdpdGhvdXQgcHVibGljYXRpb24gbWV0YWRhdGEgdGhlIGFnZSBvZiBhIHJhbmdlIHJlc3VsdCBpcyB1bmtub3duLCBzbyBhXG4gICAgLy8gcGFydGlhbCByZWdpc3RyeSBmYWlsdXJlIHdvdWxkIG90aGVyd2lzZSB3cml0ZSBhIHZlcnNpb24gQnVuIHRoZW4gcmVmdXNlcyB0byBpbnN0YWxsLlxuICAgIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZFZlcnNpb25CZWxvdyh0eXBlc2NyaXB0RGVwZW5kZW5jeSwgJzcuMC4wJykgPz8gbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBUaGUgaGlnaGVzdCByZWxlYXNlIG9mIGBwYWNrYWdlTmFtZWAgYmVsb3cgYGV4Y2x1c2l2ZVVwcGVyQm91bmRgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2VcbiAqIGdhdGUsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSByZWdpc3RyeSBsb29rdXAgZmFpbHMgb3Igbm8gc3VjaCByZWxlYXNlIGV4aXN0cyB5ZXQuXG4gKi9cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHBhY2thZ2VOYW1lOiBzdHJpbmcsIGV4Y2x1c2l2ZVVwcGVyQm91bmQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyhnZXROcG1QYWNrYWdlVGltZXMocGFja2FnZU5hbWUpKS5maW5kKCh2ZXJzaW9uKSA9PlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBleGNsdXNpdmVVcHBlckJvdW5kKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyUGFja2FnZVZlcnNpb24oY2FuZGlkYXRlVmVyc2lvbjogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChjYW5kaWRhdGVWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIHJldHVybiAhdmFsaWRMYXRlc3RWZXJzaW9uIHx8ICF2YWxpZEN1cnJlbnRWZXJzaW9uIHx8IHNlbXZlci5ndCh2YWxpZExhdGVzdFZlcnNpb24sIHZhbGlkQ3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHNcbiAgICAvLyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgICBjbGVhbnVwOiAnYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgIGZvcm1hdDogYGJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICBsaW50OiBgYnVuIHdiIGxpbnRgLFxuICAgICdsaW50LWZpeCc6ICdidW4gd2IgbGludCAtLWZpeCcsXG4gICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICB0eXBlY2hlY2s6ICdidW4gd2IgdHlwZWNoZWNrJyxcbiAgICB2ZXJpZnk6ICdidW4gd2IgdmVyaWZ5JyxcbiAgICAndmVyaWZ5LWZ1bGwnOiAnYnVuIHdiIHZlcmlmeSAtLWZ1bGwnLFxuICB9O1xuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGFwcGx5VGVzdE9uQ2lTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIH1cbiAgYXBwbHlUZXN0U2NyaXB0KGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ3Rlc3QnLCAndmVyaWZ5LWZ1bGwnXSk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgYGJ1biAke2dldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyl9YCk7XG4gIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbi8vIENJIHdvcmtmbG93cyAoYm90aCB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBhbmQgdGhlIHNlbGYtY29udGFpbmVkIHZhcmlhbnQgZm9yIG5vbi1XaWxsQm9vc3RlclxuLy8gcmVwb3NpdG9yaWVzKSBwcmVmZXIgYHRlc3QvY2lgIG92ZXIgYHRlc3RgLCBzbyBzdGFuZGFyZGl6ZSBpdCBvbiBgd2IgdGVzdC1vbi1jaWAgYXQgdGhlIHJvb3Qg4oCUXG4vLyBgd2IgdGVzdC1vbi1jaWAgYWxyZWFkeSBpdGVyYXRlcyB3b3Jrc3BhY2UgcGFja2FnZXMgaXRzZWxmLlxuZnVuY3Rpb24gYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbJ3Rlc3QvY2knXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBDSSB0ZXN0cyB3aXRoIGV4dHJhIHN0ZXBzIChlLmcuIHNlbGVjdGluZyBzcGVjIGZpbGVzIG9yIHJ1bm5pbmcgcmF3XG4gIC8vIFBsYXl3cmlnaHQpIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5OyBzdWNoIHdyYXBwZXJzIGFyZSBwcmVzZXJ2ZWQuXG4gIHNjcmlwdHNbJ3Rlc3QvY2knXSA9IG9sZFNjcmlwdCAmJiAhaXNHZW5lcmF0ZWRUZXN0T25DaVNjcmlwdChvbGRTY3JpcHQpID8gb2xkU2NyaXB0IDogJ2J1biB3YiB0ZXN0LW9uLWNpJztcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIGdlbmVyYXRlZCBgd2IgdGVzdC1vbi1jaWAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKipcbiAqIGB3YiB0ZXN0YCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCB0ZXN0IHJ1bm5lcnMgb25seSwgc28gcmVwbGFjaW5nIHRoZSBgdGVzdGAgc2NyaXB0IG9mIGFcbiAqIHBhY2thZ2Ugd3JpdHRlbiBpbiBhbm90aGVyIGxhbmd1YWdlIChlLmcuIGEgTWF2ZW4gb3IgYW4gUlNwZWMgcGFja2FnZSBpbiBhIHBvbHlnbG90IG1vbm9yZXBvKVxuICogc2lsZW50bHkgZHJvcHMgaXRzIHdob2xlIHN1aXRlOiB0aGUgZ2VuZXJhdGVkIHNjcmlwdCB0aGVuIHN1Y2NlZWRzIHdpdGhvdXQgcnVubmluZyBhbnl0aGluZy5cbiAqIFN1Y2ggYSBwYWNrYWdlIGtlZXBzIGl0cyBvd24gYHRlc3RgIHNjcmlwdDsgSlMvVFMgcGFja2FnZXMgYXJlIHN0YW5kYXJkaXplZCBhcyB1c3VhbC5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUZXN0U2NyaXB0KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHNcbik6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzLnRlc3Q/LnRyaW0oKTtcbiAgaWYgKCFvbGRTY3JpcHQgfHwgZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBpc0dlbmVyYXRlZFRlc3RTY3JpcHQob2xkU2NyaXB0KSkgcmV0dXJuO1xuICBzY3JpcHRzLnRlc3QgPSBvbGRTY3JpcHQ7XG59XG5cbi8qKiBXaGV0aGVyIGEgc2NyaXB0IGJvZHkgaXMgb25lIG9mIHRoZSBLTk9XTiBnZW5lcmF0ZWQgYHdiIHRlc3RgIGludm9jYXRpb25zLiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0U2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3QnO1xufVxuXG4vKipcbiAqIEtlZXBzIGEgc2NyaXB0IHRoYXQgQ0hBSU5TIGV4dHJhIGNvbW1hbmRzIG9udG8gdGhlIGdlbmVyYXRlZCBvbmUgKGUuZy4gYSBwb2x5Z2xvdCBtb25vcmVwb1xuICogYXBwZW5kaW5nIGl0cyBNYXZlbiBhbmQgUlNwZWMgc3VpdGVzIHRvIGB3YiB0ZXN0YCwgd2hpY2ggcnVucyBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgcnVubmVyc1xuICogb25seSkuIFN1Y2ggYSB3cmFwcGVyIHN0aWxsIHJ1bnMgdGhlIGdlbmVyYXRlZCBjb21tYW5kLCBzbyByZXBsYWNpbmcgaXQgd291bGQgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJlcG9zaXRvcnkncyBvd24gc3RlcHMg4oCUIHRoZSBzYW1lIHJlYXNvbmluZyBhcyBgYXBwbHlUZXN0T25DaVNjcmlwdGAuIEFuIHVucmVjb2duaXplZCBjaGFpbmVkXG4gKiBzY3JpcHQgaXMga2VwdCB3aG9sZXNhbGUgcmF0aGVyIHRoYW4gbG9zaW5nIGl0cyBwcm9qZWN0LW93bmVkIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBrZWVwR2VuZXJhdGVkU2NyaXB0V3JhcHBlcnMoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHNjcmlwdE5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBzY3JpcHROYW1lcykge1xuICAgIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbc2NyaXB0TmFtZV0/LnRyaW0oKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRTY3JpcHQgPSBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgIGlmICghb2xkU2NyaXB0IHx8ICFnZW5lcmF0ZWRTY3JpcHQgfHwgb2xkU2NyaXB0ID09PSBnZW5lcmF0ZWRTY3JpcHQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRSZWdFeHAgPSBuZXcgUmVnRXhwKFxuICAgICAgYF4ke2VzY2FwZVJlZ0V4cChnZW5lcmF0ZWRTY3JpcHQpLnJlcGxhY2VBbGwoJyAnLCBTdHJpbmcucmF3YFsgXFx0XStgKX0oPz1bIFxcXFx0XSooPzomJnxcXFxcfFxcXFx8fDt8XFxcXG4pKWAsXG4gICAgICAndSdcbiAgICApO1xuICAgIC8vIEEgbmV3bGluZSBzZXBhcmF0ZXMgc2hlbGwgY29tbWFuZHMganVzdCBsaWtlICYmLCB8fCBhbmQgOy5cbiAgICBpZiAoaGVhZFJlZ0V4cC50ZXN0KG9sZFNjcmlwdCkpIHtcbiAgICAgIC8vIEEgZnVuY3Rpb24gcmVwbGFjZW1lbnQga2VlcHMgYCRgLXNoYXBlZCBjaGFyYWN0ZXJzIGluIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCBsaXRlcmFsLlxuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdC5yZXBsYWNlKGhlYWRSZWdFeHAsICgpID0+IGdlbmVyYXRlZFNjcmlwdCk7XG4gICAgfSBlbHNlIGlmICgvKD86JiZ8XFx8XFx8fDt8XFxuKS91LnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgd2JEYkNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuO1xuXG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLWNyZWF0ZS1taWdyYXRpb24nLCBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZS1kZXZgLCAnbWlncmF0ZS1kZXYnKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgICBzY3JpcHRzLFxuICAgIG9sZFNjcmlwdHMsXG4gICAgJ2RiLW1pZ3JhdGUnLFxuICAgIGAke3diRGJDb21tYW5kfSBtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3lgLFxuICAgICdtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3knXG4gICk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLXZpZXcnLCBgJHt3YkRiQ29tbWFuZH0gc3R1ZGlvYCwgJ3N0dWRpbycpO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0KFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lOiBzdHJpbmcsXG4gIGdlbmVyYXRlZFNjcmlwdDogc3RyaW5nLFxuICBnZW5lcmF0ZWRBcmd1bWVudHM6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbbmFtZV07XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgbWlncmF0aW9uIGNvbW1hbmRzIHRvIHByZXBhcmUgU1FMaXRlIGRpcmVjdG9yaWVzLFxuICAvLyBmYW4gb3V0IG92ZXIgdGVuYW50cywgb3IgcGVyZm9ybSBjbGVhbnVwIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5LlxuICBjb25zdCBnZW5lcmF0ZWRCb2RpZXMgPSBbYGJ1biB3YiBkYiAke2dlbmVyYXRlZEFyZ3VtZW50c31gLCBgYnVuIHdiIHByaXNtYSAke2dlbmVyYXRlZEFyZ3VtZW50c31gXTtcbiAgc2NyaXB0c1tuYW1lXSA9IG9sZFNjcmlwdCAmJiAhZ2VuZXJhdGVkQm9kaWVzLmluY2x1ZGVzKG9sZFNjcmlwdC50cmltKCkpID8gb2xkU2NyaXB0IDogZ2VuZXJhdGVkU2NyaXB0O1xufVxuXG5mdW5jdGlvbiBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgcmV0dXJuICd3YiBkYic7XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgLy8gUHJlc2VydmUgYSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYgcHJlZml4IChlLmcuIGBNSVNFX0VOVj10ZXN0YCkgb24gYW4gZXhpc3RpbmcgbWlzZSBicmlkZ2UuXG4gICAgLy8gU3VjaCBhIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgbWlzZSBjb25maWcgZW52aXJvbm1lbnRzIChtaXNlLjxNSVNFX0VOVj4udG9tbCksIHdoaWNoIGFyZVxuICAgIC8vIHNlbGVjdGVkIGZyb20gTUlTRV9FTlYgKmJlZm9yZSogbWlzZSBzdGFydHMgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCBmcm9tIGluc2lkZSBhIHRhc2s7IGRyb3BwaW5nXG4gICAgLy8gaXQgd291bGQgc2lsZW50bHkgcnVuIHRoZSB0YXNrIGluIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LlxuICAgIGNvbnN0IGVudlByZWZpeCA9IGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpO1xuICAgIGlmIChlbnZQcmVmaXggPT09IHVuZGVmaW5lZCAmJiBvbGRTY3JpcHRzW25hbWVdICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGAke2VudlByZWZpeCA/PyAnJ31taXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudi12YXIgcHJlZml4IG9mIGFuIGV4aXN0aW5nIGBtaXNlIHJ1biA8bmFtZT5gIGJyaWRnZSBzY3JpcHRcbiAqIChwb3NzaWJseSBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYnJpZGdlIGhhcyBubyBwcmVmaXgpLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzY3JpcHQgaXMgbm90IGFcbiAqIG1pc2UgYnJpZGdlIGZvciB0aGUgZ2l2ZW4gdGFzay5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEVhY2ggYXNzaWdubWVudCB2YWx1ZSBtYXkgYmUgZG91YmxlLXF1b3RlZCwgc2luZ2xlLXF1b3RlZCwgb3IgYW4gdW5xdW90ZWQgcnVuIG9mIG5vbi13aGl0ZXNwYWNlLFxuICAvLyBzbyBwcmVmaXhlcyBsaWtlIGBNSVNFX0VOVj1cImEgYlwiYCAod2hvc2UgdmFsdWUgY29udGFpbnMgc3BhY2VzKSBhcmUgbWF0Y2hlZCBpbnN0ZWFkIG9mIGRyb3BwZWQuXG4gIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF4oKD86XFx3Kz0oPzpcIlteXCJdKlwifCdbXiddKid8XFxTKylcXHMrKSopbWlzZSBydW4gJHtlc2NhcGVSZWdFeHAobmFtZSl9JGAsICd1JykuZXhlYyhcbiAgICBzY3JpcHQudHJpbSgpXG4gICk7XG4gIHJldHVybiBtYXRjaD8uWzFdO1xufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIG9yZzogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCBvcmc6ICdXaWxsQm9vc3RlcicsIHJlcG86ICdjb2RlLWFuYWx5emVyJywgdGFyZ2V0OiAnZGV2RGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvanVkZ2UnLCBvcmc6ICdXaWxsQm9vc3RlckxhYicsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IG9yZywgcGFja2FnZU5hbWUsIHJlcG8sIHRhcmdldCB9KSA9PiB7XG4gICAgICBpZiAoIXBhY2thZ2VOYW1lcy5oYXMocGFja2FnZU5hbWUpIHx8IGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCBwYWNrYWdlTmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdO1xuICAgICAgY29uc3Qgb3RoZXJUYXJnZXQgPSB0YXJnZXQgPT09ICdkZXBlbmRlbmNpZXMnID8gJ2RldkRlcGVuZGVuY2llcycgOiAnZGVwZW5kZW5jaWVzJztcbiAgICAgIC8vIFRoZSBsaW50IHJ1bGUgZGlzYWxsb3dzIGBkZWxldGVgIHdpdGggY29tcHV0ZWQgcGFja2FnZSBuYW1lczsgUmVmbGVjdCBoYXMgdGhlIHNhbWUgZGVsZXRpb24gc2VtYW50aWNzIGhlcmUuXG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmpbb3RoZXJUYXJnZXRdLCBwYWNrYWdlTmFtZSk7XG4gICAgICBqc29uT2JqW3RhcmdldF1bcGFja2FnZU5hbWVdID0gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihleGlzdGluZ1NwZWNpZmllciwgb3JnLCByZXBvKVxuICAgICAgICA/IGV4aXN0aW5nU3BlY2lmaWVyXG4gICAgICAgIDogYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIob3JnLCByZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGV4aXN0aW5nIHNwZWNpZmllciBhbHJlYWR5IHBpbnMgYSBnaXQgcmVmIG9mIHRoZSBleHBlY3RlZCBwcml2YXRlIHJlcG9zaXRvcnkuXG4gKiB3YmZ5IG11c3Qgbm90IGJ1bXAgc3VjaCBwaW5zOiBhIHJ1biBpbnRlbmRlZCBhcyBjb25maWd1cmF0aW9uL3BhY2thZ2UtbWFuYWdlciBtYWludGVuYW5jZVxuICogd291bGQgb3RoZXJ3aXNlIGNoYW5nZSB0aGUgZGVwZW5kZW5jeSdzIHZlcnNpb24gYXMgYSBzaWRlIGVmZmVjdCAodXBkYXRpbmcgcGlucyBpcyBSZW5vdmF0ZSdzXG4gKiBqb2IpLCBwb3NzaWJseSB0byBhIGNvbW1pdCB3aG9zZSBwcmVidWlsdCBhcnRpZmFjdHMgYXJlIG1pc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzUGlubmVkUHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoXG4gIHNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcmc6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nXG4pOiBzcGVjaWZpZXIgaXMgc3RyaW5nIHtcbiAgaWYgKCFzcGVjaWZpZXIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2AoPzpefFs6L10pJHtvcmd9LyR7cmVwb30oPzpcXC5naXQpPyNcXFMrJGAsICd1JykudGVzdChzcGVjaWZpZXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmc6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2gob3JnLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbToke29yZ30vJHtyZXBvfS5naXQjJHtjb21taXRIYXNofWA7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBxdW90ZUZvclNoZWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuLy8gTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHRoZSB1bnF1b3RlZCBsb29wcyBiZWxvdyBrZWVwIHBhdGhzXG4vLyB3aXRoIHNwYWNlcyBpbnRhY3QuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGJ1biByZWNvcmRzIGFuIGFic29sdXRlIGByZXNvbHZlZGAgVVJMIGZvciBhbiBhbHJlYWR5LWxvY2tlZCBwYWNrYWdlIHdoZW5ldmVyIHRoZVxuICAgICAgLy8gY29uZmlndXJlZCByZWdpc3RyeSBkb2VzIG5vdCBzZXJ2ZSB0aGUgdGFyYmFsbCBob3N0IGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhIOKAlCB3aGljaCBpc1xuICAgICAgLy8gZXhhY3RseSB3aGF0IHRoZSBUYWt1bWkgR3VhcmQgcHJveHkgZG9lcy4gU28gYW4gaW5zdGFsbCBydW4gd2l0aCBHdWFyZCBhcyB0aGUgZGVmYXVsdFxuICAgICAgLy8gcmVnaXN0cnkgKENJLCBvciBhIGRldmVsb3BlciB3aG8gcHV0IGl0IGluIH4vLm5wbXJjKSBiYWtlcyBucG0uZmxhdHQudGVjaCBVUkxzIGludG9cbiAgICAgIC8vIGJ1bi5sb2NrLCBhbmQgY29tbWl0dGluZyB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeVxuICAgICAgLy8gbGF0ZXIgaW5zdGFsbCBkb3dubG9hZHMgdGhyb3VnaCB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoXG4gICAgICAvLyA0MDEgZm9yIGFueW9uZSB3aG9zZSBucG1yYyBjYXJyaWVzIGEgcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmVnaXN0cnkncyBjcmVkZW50aWFscyB0byB3aGF0ZXZlciBob3N0IHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lc1xuICAgICAgLy8gbm90IGRlcGVuZCBvbiB0aGVzZSBVUkxzIOKAlCB3aXRoIGFuIGVtcHR5IGByZXNvbHZlZGAsIGJ1biBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbVxuICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgcmVnaXN0cnkg4oCUIHNvIHN0cmlwIHRoZW0uIE9ubHkgdGhlIEd1YXJkIGhvc3QgaXMgc3RyaXBwZWQ6IGEgc2NvcGVkXG4gICAgICAvLyByZWdpc3RyeSBzdWNoIGFzIFZlcmRhY2NpbyBsZWdpdGltYXRlbHkgcmVjb3JkcyBpdHMgb3duIFVSTCBmb3IgcHJpdmF0ZSBwYWNrYWdlcy5cbiAgICAgIG5hbWU6ICdub3JtYWxpemUtYnVuLWxvY2tmaWxlJyxcbiAgICAgIGdsb2I6ICdidW4ubG9jaycsXG4gICAgICBydW46ICdiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gT25seSB3aWxsYm9vc3Rlci1jb25maWdzIGdldHMgdGhpcyBqb2I6IGV2ZXJ5IG90aGVyIHJlcG9zaXRvcnkncyByZW5vdmF0ZS5qc29uYyBtZXJlbHlcbiAgICAgIC8vIGV4dGVuZHMgdGhlIHNoYXJlZCBwcmVzZXQsIGFuZCB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IHJlc29sdmUgcmVtb3RlIHByZXNldHMsIHNvIHJ1bm5pbmcgaXRcbiAgICAgIC8vIHRoZXJlIHdvdWxkIHZhbGlkYXRlIHR3byBsaW5lcyBhbmQgY2F0Y2ggbm90aGluZy4gYC0tbm8tZ2xvYmFsYCB2YWxpZGF0ZXMgdGhlIHByZXNldCBhcyBhXG4gICAgICAvLyByZXBvIGNvbmZpZyBpbnN0ZWFkIG9mIGEgc2VsZi1ob3N0ZWQgZ2xvYmFsIGNvbmZpZywgYW5kIGBAbGF0ZXN0YCBrZWVwcyBucG0gZnJvbSBzaWxlbnRseVxuICAgICAgLy8gaW5zdGFsbGluZyBhbiBhbmNpZW50IFJlbm92YXRlIHRoYXQgY2Fubm90IGV2ZW4gcGFyc2UgSlNPTkMgd2hlbiB0aGUgbG9jYWwgTm9kZSBsYWdzIGJlaGluZC5cbiAgICAgIC8vIFN0YWdpbmcgYSBkZWxldGlvbiBvZiByZW5vdmF0ZS5qc29uYyBsZWF2ZXMgbm8gZmlsZSBmb3IgaW5zcGVjdGlvbiwgc28gTGVmdGhvb2sgc2tpcHMgdGhpc1xuICAgICAgLy8gam9iIGluc3RlYWQgb2YgcnVubmluZyB0aGUgdmFsaWRhdG9yIG9uIGEgbWlzc2luZyBwYXRoIOKAlCBkZWxpYmVyYXRlbHksIGJlY2F1c2UgZGVsZXRpbmcgdGhlXG4gICAgICAvLyBzaGFyZWQgcHJlc2V0IGlzIG5vdCBhbiBvcGVyYXRpb24gdGhpcyBob29rIG5lZWRzIHRvIGd1YXJkLlxuICAgICAgbmFtZTogJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycsXG4gICAgICBnbG9iOiAncmVub3ZhdGUuanNvbmMnLFxuICAgICAgcnVuOiAnbnB4IC0teWVzIC0tcGFja2FnZSByZW5vdmF0ZUBsYXRlc3QgLS0gcmVub3ZhdGUtY29uZmlnLXZhbGlkYXRvciAtLXN0cmljdCAtLW5vLWdsb2JhbCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIC8vIHByZXBhcmUgY2FsbHMgdGhpcyB3aXRob3V0IGFyZ3VtZW50cyBhZnRlciBCdW4gc2F2ZXMgdGhlIHJvb3QgbG9ja2ZpbGU7IExlZnRob29rIHBhc3NlcyBpdHNcbiAgLy8gc3RhZ2VkIHBhdGguIFRoZSB1bnByZWRpY3RhYmxlIHNpYmxpbmcgZmlsZSBtYWtlcyByZXBsYWNlbWVudCBhdG9taWMsIGBjcCAtcGAgcHJlc2VydmVzIGl0c1xuICAvLyBtb2RlLCBhbmQgdGhlIGFuY2hvcmVkIHBhdHRlcm4gY2Fubm90IGVyYXNlIGEgZGlyZWN0IHRhcmJhbGwgZGVwZW5kZW5jeSBVUkwuXG4gIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlOiBgXG4jIS9iaW4vYmFzaFxuc2V0IC1lXG5cbmlmIFtbIFwiJCNcIiAtZXEgMCBdXTsgdGhlblxuICBzZXQgLS0gYnVuLmxvY2tcbmZpXG5cbm5vcm1hbGl6ZWQ9XCJcIlxudHJhcCAnW1sgLXogXCIkbm9ybWFsaXplZFwiIF1dIHx8IHJtIC1mIFwiJG5vcm1hbGl6ZWRcIicgRVhJVFxuZm9yIGZpbGUgaW4gXCIkQFwiOyBkb1xuICBbWyAtZiBcIiRmaWxlXCIgXV0gfHwgY29udGludWVcbiAgbm9ybWFsaXplZD1cIiQobWt0ZW1wIFwiJGZpbGUud2JmeS1ub3JtYWxpemluZy5YWFhYWFhcIilcIlxuICBjcCAtcCBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiXG4gIHNlZCAtRSAncyMoXCIsIClcImh0dHBzOi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC9bXlwiXSpcIiNcXFxcMVwiXCIjZycgXCIkZmlsZVwiID4gXCIkbm9ybWFsaXplZFwiXG4gIGlmICEgY21wIC1zIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCI7IHRoZW5cbiAgICBtdiBcIiRub3JtYWxpemVkXCIgXCIkZmlsZVwiXG4gICAgZWNobyBcIlJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAkZmlsZSBzbyB0aGUgbG9ja2ZpbGUgc3RheXMgcmVnaXN0cnktYWdub3N0aWMuXCJcbiAgZmlcbiAgcm0gLWYgXCIkbm9ybWFsaXplZFwiXG4gIG5vcm1hbGl6ZWQ9XCJcIlxuZG9uZVxuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbY29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2snLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIGFsbENvbmZpZ3MpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnLCBhbGxDb25maWdzKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gnKSwgc2NyaXB0cy5ub3JtYWxpemVCdW5Mb2NrZmlsZSArICdcXG4nLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9ICdidW4gd2IgbGludCAtLXF1aWV0JztcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzXG4gICAgLmZpbHRlcigoam9iKSA9PiBqb2IubmFtZSAhPT0gJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycgfHwgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKVxuICAgIC5tYXAoKGpvYikgPT5cbiAgICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogam9iXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIExldCBgd2IgbGludCAtLWZvcm1hdGAgZGVjaWRlIHdoZXRoZXIgUHJldHRpZXIgaXMgYXZhaWxhYmxlOyB0aGUgaG9va1xuICAvLyBzdGlsbCBuZWVkcyB0byB0cmlnZ2VyIHdoZW4gYWRkaW5nIHRoZSBmaXJzdCBwcmV0dGllci1vbmx5IGZpbGUuXG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPSBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdweScpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnZGFydCcpO1xuICB9XG4gIGNvbnN0IGZpbHRlcmVkRXh0ZW5zaW9ucyA9IFsuLi5uZXcgU2V0KHN1cHBvcnRlZEV4dGVuc2lvbnMpXS50b1NvcnRlZCgpO1xuICByZXR1cm4gYCoqLyoueyR7ZmlsdGVyZWRFeHRlbnNpb25zLmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnKSkge1xuICAgIHJldHVybiBTdHJpbmcucmF3YFxuYnVuIHJ1biAtLWN3ZCBwYWNrYWdlcy93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmIChjYW5Vc2VXYkZvclN0YWdlZEZpbGVzKSB7XG4gICAgcmV0dXJuIGBcbmJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcucmF3YFxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgYnVuIHNvcnQtcGFja2FnZS1qc29uICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8cnVzdC10b29sY2hhaW4oXFwudG9tbCk/KWA7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIiR7dG9vbHNDaGFuZ2VkUGF0dGVybn1cIiBcIm1pc2UgaW5zdGFsbFwiYCk7XG4gIC8vIGBtaXNlIGFjdGl2YXRlYCB1cGRhdGVzIFBBVEggb25seSB3aGVuIHRoZSBwcm9tcHQgaXMgZHJhd24sIHNvIHRoZSBob29rIGluaGVyaXRzIHRoZSB0b29sXG4gIC8vIHZlcnNpb25zIHBpbm5lZCBiZWZvcmUgdGhlIG1lcmdlOyByZWZyZXNoIFBBVEggc28gYSBwdWxsZWQgQnVuIHBpbiBpbnN0YWxscyB3aXRoIHRoYXQgQnVuLlxuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKCdldmFsIFwiJChtaXNlIGVudiAtcyBiYXNoKVwiJyk7XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gJ2J1biBpbnN0YWxsJztcbiAgLy8gRG8gTk9UIGFkZCBgLnZpbmV4dGAgaGVyZTogaXQgaG9sZHMgb25seSB2aW5leHQncyBjb250ZW50LWhhc2hlZCBmb250IGNhY2hlIGFuZCB0aGUgZGV2XG4gIC8vIHNlcnZlcidzIGxvY2sgZmlsZSAoZGVsZXRpbmcgdGhlIGxvY2sgZGlzYWJsZXMgdGhlIGR1cGxpY2F0ZS1kZXYtc2VydmVyIGd1YXJkIGZvciBhIHJ1bm5pbmdcbiAgLy8gc2VydmVyKS4gdmluZXh0J3MgYnVpbGQgb3V0cHV0IGdvZXMgdG8gYGRpc3QvYCwgYW5kIFZpdGUncyBkZXBlbmRlbmN5IGNhY2hlIGlzIGhhbmRsZWQgYnlcbiAgLy8gdGhlIHNlcGFyYXRlIGluc3RhbGwtbGF5b3V0IGhvb2sgYmVsb3cuXG4gIC8vIFNjYW4gZXZlcnkgd29ya3NwYWNlIGNvbmZpZyAobm90IGp1c3QgdGhlIHJvb3QpOiBpbiBhIG1vbm9yZXBvIHRoZSBhcHAgdXN1YWxseSBsaXZlcyBpblxuICAvLyBwYWNrYWdlcy88YXBwPiBvciBhcHBzLzxhcHA+LCBhbmQgdGhlIGNhY2hlIGRpcmVjdG9yaWVzIGFyZSB3b3Jrc3BhY2UtcmVsYXRpdmUuXG4gIGNvbnN0IG5leHRDYWNoZURpclBhdGhzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gICAgY29uZmlnLFxuICAgIGFsbENvbmZpZ3MsXG4gICAgKHdvcmtzcGFjZUNvbmZpZykgPT4gd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLm5leHQsXG4gICAgJy5uZXh0J1xuICApO1xuICBjb25zdCBybU5leHREaXJlY3RvcmllcyA9XG4gICAgbmV4dENhY2hlRGlyUGF0aHMubGVuZ3RoID4gMCA/IGAgJiYgcm0gLVJmIC0tICR7bmV4dENhY2hlRGlyUGF0aHMubWFwKHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwpLmpvaW4oJyAnKX1gIDogJyc7XG4gIC8vIEJ1biBkb2VzIG5vdCByZWxpbmsgYW4gZXhpc3RpbmcgaXNvbGF0ZWQgdHJlZSB3aGVuIGdsb2JhbFN0b3JlL2xpbmtlciBzZXR0aW5ncyBjaGFuZ2UuIEluc3BlY3RcbiAgLy8gdGhvc2Uga2V5cyByYXRoZXIgdGhhbiBldmVyeSBidW5maWcgY2hhbmdlOiBtaW5pbXVtUmVsZWFzZUFnZSB1cGRhdGVzIG11c3Qgbm90IGRlc3Ryb3kgYVxuICAvLyBjb250cmlidXRvcidzIHdvcmtpbmcgaW5zdGFsbCBiZWZvcmUgYSBwb3RlbnRpYWxseSBuZXR3b3JrLWRlcGVuZGVudCByZXBsYWNlbWVudCBzdWNjZWVkcy5cbiAgY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKGNvbmZpZywgYWxsQ29uZmlncywgKCkgPT4gdHJ1ZSwgJ25vZGVfbW9kdWxlcycpO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgIFN0cmluZy5yYXdgaWYgZ2l0IGRpZmYgLS1uby1jb2xvciAtVTAgT1JJR19IRUFEIEhFQUQgLS0gJypidW5maWcudG9tbCcgfCBncmVwIC0tcXVpZXQgLUUgJ15bKy1dICooZ2xvYmFsU3RvcmV8bGlua2VyfHB1YmxpY0hvaXN0UGF0dGVybiknOyB0aGVuIHJtIC1SZiAtLSAke25vZGVNb2R1bGVzRGlyUGF0aHMubWFwKHF1b3RlRm9yU2hlbGwpLmpvaW4oJyAnKX07IGZpYFxuICApO1xuICAvLyBidW4ubG9jay1vbmx5IG1lcmdlcyAoUmVub3ZhdGUgbG9ja2ZpbGUgbWFpbnRlbmFuY2UpLCBidW5maWcudG9tbCAvIC5ucG1yYyBjaGFuZ2VzIChsaW5rZXIsXG4gIC8vIHJlZ2lzdHJ5LCBob2lzdGluZyksIGFuZCBwYXRjaCBlZGl0cyBhbGwgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0IHRvdWNoaW5nIHBhY2thZ2UuanNvbi5cbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKHBhY2thZ2VcXC5qc29ufGJ1blxcLmxvY2t8YnVuZmlnXFwudG9tbHxcXC5ucG1yY3xwYXRjaGVzLylcIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcmllc31cImBcbiAgKTtcbiAgLy8gVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaW4gbm9kZV9tb2R1bGVzLy52aXRlIHNlbGYtaW52YWxpZGF0ZXMgb24gbG9ja2ZpbGUgLyBwYXRjaGVzIC9cbiAgLy8gY29uZmlnIC8gTk9ERV9FTlYgY2hhbmdlcyAoc2VlIFZpdGUncyBkZXAgcHJlLWJ1bmRsaW5nIGRvY3MpLCBzbyB0aGUgcmVzaWR1YWwgc3RhbGUgY2FzZSBpc1xuICAvLyBpbnN0YWxsLWxheW91dCBjaGFuZ2VzIChidW5maWcudG9tbCBsaW5rZXIsIC5ucG1yYyk6IHRoZXkgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0XG4gIC8vIHRvdWNoaW5nIHRoZSBsb2NrZmlsZSwgYW5kIHRoZXkgYXJlIGFic2VudCBmcm9tIFZpdGUncyBjYWNoZSBrZXkuXG4gIGNvbnN0IHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpbmV4dCB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpdGUsXG4gICAgJ25vZGVfbW9kdWxlcy8udml0ZSdcbiAgKTtcbiAgaWYgKHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMubGVuZ3RoID4gMCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmMpXCIgXCJybSAtUmYgLS0gJHtybVZpdGVDYWNoZURpcmVjdG9yaWVzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9XCJgXG4gICAgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICAvLyBCbGl0eiByZXBvc2l0b3JpZXMgZGVsaWJlcmF0ZWx5IGdldCB0aGUgc2FtZSB3Yi1kcml2ZW4gcHJpc21hIGNvbW1hbmRzIGFzIGV2ZXJ5b25lIGVsc2U6XG4gIC8vIHRoZSBibGl0eiBDTEkncyBjb2RlZ2VuIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2UsIHdoaWNoIG11c3QgbmV2ZXIgcnVuXG4gIC8vIHVuZGVyIEJ1bidzIHNoYXJlZCBnbG9iYWwgc3RvcmUuIFlhcm4tZXJhIEJsaXR6IHJlcG9zIGdldCB0aGVpciByb3V0ZSBtYW5pZmVzdCBmcm9tXG4gIC8vIGB3YiBnZW4tY29kZWAncyBgYmxpdHogY29kZWdlbmAgc3RlcCwgYW5kIGN1cnJlbnQgd2Igcm91dGVzIG9ubHkgYHdiIHByaXNtYSBzZWVkYCB0aHJvdWdoXG4gIC8vIHRoZSBibGl0eiBDTEksIG9ubHkgZm9yIG5vbi1CdW4gcmVwb3MgKHNlZSBwYWNrYWdlcy93Yi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzKTsgdGhlXG4gIC8vIHBvc3QtbWVyZ2UgaG9va3Mgc3RheSB3Yi1kcml2ZW4gYmVjYXVzZSBgcHJpc21hIGRlcGxveWAvYGdlbmVyYXRlYCBuZWVkIG5vIGJsaXR6IGxvYWRlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuLy8gVGhlIGdlbmVyYXRlZCBjb21tYW5kIHBhc3NlcyB0aHJvdWdoIFRXTyBzaGVsbCBwYXJzaW5nIHN0YWdlczogdGhlIHByZXBhcmUuc2ggbGluZSBwYXJzZXMgaXQgYXNcbi8vIGEgZG91YmxlLXF1b3RlZCBhcmd1bWVudCAocHJvY2Vzc2luZyBcXCwgYCwgJCBhbmQgXCIgaW1tZWRpYXRlbHkpLCBhbmQgcnVuX2lmX2NoYW5nZWQgdGhlbiBldmFsJ3Ncbi8vIGl0ICh3b3JkLXNwbGl0dGluZyBhbmQgZ2xvYmJpbmcpLiBBbiB1bnF1b3RlZCBwYXRoIGNvbnRhaW5pbmcgc3BhY2VzIChlLmcuIGBhcHBzL215IGFwcC8ubmV4dGApXG4vLyB3b3VsZCB3b3JkLXNwbGl0IGludG8gdW5yZWxhdGVkIHJtIHRhcmdldHMsIGFuZCBgJGAvYmFja3RpY2sgd291bGQgZXhwYW5kIGF0IHRoZSBmaXJzdCBzdGFnZS5cbi8vIFNvOiBxdW90ZSBmb3IgdGhlIGV2YWwgc3RhZ2Ug4oCUIGBxdW90ZUZvclNoZWxsYCBsZWF2ZXMgb25seSB3b3JkcyB0aGF0IGNhcnJ5IG5vIHNoZWxsIG1lYW5pbmdcbi8vIHVucXVvdGVkIOKAlCB0aGVuIGJhY2tzbGFzaC1lc2NhcGUgdGhlIGRvdWJsZS1xdW90ZS1jb250ZXh0IHNwZWNpYWxzLlxuZnVuY3Rpb24gcXVvdGVGb3JFdmFsdWF0ZWRTaGVsbChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXZhbFF1b3RlZCA9IHF1b3RlRm9yU2hlbGwoZmlsZVBhdGgpO1xuICByZXR1cm4gZXZhbFF1b3RlZC5yZXBsYWNlQWxsKC9bXFxcXGAkXCJdL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlLXJlbGF0aXZlIGRpcmVjdG9yaWVzIChyb290IGZpcnN0LCBkZWR1cGxpY2F0ZWQsIGA8c3ViRGlyTmFtZT5gIGFwcGVuZGVkKSBvZiBldmVyeVxuICogd29ya3NwYWNlIHdob3NlIGNvbmZpZyBtYXRjaGVzIHRoZSBwcmVkaWNhdGUuIFRoZSBob29rIHNjcmlwdCBydW5zIGF0IHRoZSByZXBvc2l0b3J5IHJvb3QsIHNvXG4gKiBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmVkaWNhdGU6IChjb25maWc6IFBhY2thZ2VDb25maWcpID0+IGJvb2xlYW4sXG4gIHN1YkRpck5hbWU6IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBhbGxDb25maWdzXG4gICAgICAgIC5maWx0ZXIoKGNvbmZpZykgPT4gcHJlZGljYXRlKGNvbmZpZykpXG4gICAgICAgIC5tYXAoKGNvbmZpZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdENvbmZpZy5kaXJQYXRoLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgICAgcmV0dXJuIHJlbGF0aXZlRGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihyZWxhdGl2ZURpclBhdGgsIHN1YkRpck5hbWUpIDogc3ViRGlyTmFtZTtcbiAgICAgICAgfSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJpbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuZXhwb3J0IHR5cGUgQ29uZmlnQmxvY2tOYW1lID0gJ2Jhc2UnIHwgJ2V4cG9ydCc7XG5cbmludGVyZmFjZSBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucyB7XG4gIGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuICBtYXJrZXJQcmVmaXg6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgZGVzaXJlZENvbnRlbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQ29uZmlnQmxvY2tzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlclByZWZpeDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucykge1xuICAgIHRoaXMuYmxvY2tOYW1lcyA9IG9wdGlvbnMuYmxvY2tOYW1lcztcbiAgICB0aGlzLm1hcmtlclByZWZpeCA9IG9wdGlvbnMubWFya2VyUHJlZml4O1xuICAgIHRoaXMudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICB9XG5cbiAgZ2V0Q29uZmlnQ29udGVudChvcHRpb25zOiBHZXRDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFvcHRpb25zLmV4aXN0aW5nQ29udGVudCkgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gICAgaWYgKHRoaXMuaGFzTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50LCBvcHRpb25zLmRlc2lyZWRDb250ZW50LCBvcHRpb25zLmZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gIH1cblxuICBnZXRCbG9jayhibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHt0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG4gIH1cblxuICBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJsb2NrTmFtZXMuc29tZSgoYmxvY2tOYW1lKSA9PiBjb250ZW50LmluY2x1ZGVzKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgdGhpcy5ibG9ja05hbWVzKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRoaXMuZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMucmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluICR7dGhpcy50b29sTmFtZX0gY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgICAgfVxuICAgICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBgJHtlc2NhcGVSZWdFeHAodGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0ICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OmVuZCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgIGZpbGVQYXRoLFxuICAgIH0pO1xuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBveGZtdEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hmbXQgY29uZmlnIGZpbGVzIGFyZSBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGZtdENvbmZpZyA9IHJlcXVpcmUoJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IG94Zm10Q29uZmlnLmRlZmF1bHQgPz8gb3hmbXRDb25maWc7YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9JztcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBjb25maWc7YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UsXG4gIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSxcbn0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGxpbnQnLFxuICB0b29sTmFtZTogJ294bGludCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBnZW5lcmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVwbGFjZSBwYWNrYWdlLXByb3ZpZGVkIGxpbnRlciBzZXR0aW5ncy4gR2VuZXJhdGVkIGZpbGVzIHdpdGhcbiAgICAvLyBtYW5hZ2VkIGJsb2NrcyBhcmUgc3RpbGwgc2FmZSB0byB1cGRhdGUuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnQgPVxuICAgICAgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgJiYgZXhpc3RpbmdDb250ZW50ICYmICFtYW5hZ2VkQ29uZmlnQmxvY2tzLmhhc01hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50KTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50XG4gICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgOiBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICB9KTtcblxuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBpc1Jvb3RDb25maWcgPSBjb25maWcuaXNSb290O1xuICBjb25zdCBveGxpbnRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyk7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hsaW50IG9ubHkgYXV0by1kaXNjb3ZlcnMgLnRzIGNvbmZpZyBmaWxlcywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94bGludEJhc2VDb25maWcgPSByZXF1aXJlKCcke294bGludEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnLmRlZmF1bHQgPz8gb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbmltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG5cbi8vIHN0cnVjdHVyZWRDbG9uZSBrZWVwcyBhIHBhY2thZ2UtbG9jYWwgY29weSBzbyByZXBvc2l0b3JpZXMgY2FuIGFkZCBzZXR0aW5ncyBvdXRzaWRlIG1hbmFnZWRcbi8vIGJsb2NrcyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgaW1wb3J0ZWQgY29uZmlnIG9iamVjdC4gVGhlIHJvb3QgY29uZmlnIGZvcmNlcyB0aGUgdHlwZS1hd2FyZVxuLy8gb3B0aW9ucyBvbiBpbnNpZGUgdGhlIG1hbmFnZWQgYmxvY2sgc28gbm8gY3VzdG9taXphdGlvbiBjYW4gc2lsZW50bHkgZGlzYWJsZSB0eXBlIGNoZWNraW5nOyBldmVyeVxuLy8gb3RoZXIgY29uZmlnIGRlbGV0ZXMgdGhlbSBiZWNhdXNlIE94bGludCByZWplY3RzIHRob3NlIHJvb3Qtb25seSBvcHRpb25zIGVsc2V3aGVyZSAodHlwZSBjaGVja2luZ1xuLy8gc3Vydml2ZXM6IHRoZSBsaW50IGNvbW1hbmRzIHBhc3MgLS10eXBlLWF3YXJlIGFuZCAtLXR5cGUtY2hlY2sgZXhwbGljaXRseSkuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zID0geyAuLi5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zLCB0eXBlQXdhcmU6IHRydWUsIHR5cGVDaGVjazogdHJ1ZSB9O2A7XG4gIH1cblxuICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuZGVsZXRlIG94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnM7YDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICAvLyBweXJpZ2h0Y29uZmlnLmpzb24gYWxsb3dzIEpTT05DOyBhbiBleGlzdGluZyBmaWxlIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdFxuICAgICAgLy8gdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYmFyZSB0ZW1wbGF0ZS5cbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHB5cmlnaHRjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShuZXdTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25zdW1lc0RvY2tlckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBtYW5hZ2VkU2NyaXB0c0Jsb2NrID0gYHNjcmlwdHMvKipcbiFzY3JpcHRzL1xuIXNjcmlwdHMvKi5zaGA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhSYWlsd2F5aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFJhaWx3YXlpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmFpbHdheWlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgdXNlc0RvY2tlckVudiA9IGNvbnN1bWVzRG9ja2VyRW52KGNvbmZpZy5kb2NrZXJmaWxlKTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIGlmIChjb25maWcuaXNSYWlsd2F5ICYmIHVzZXNEb2NrZXJFbnYpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsICchLmRvY2tlci5lbnZcXG4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15zY3JpcHRzXFwvJC9tLCBtYW5hZ2VkU2NyaXB0c0Jsb2NrKTtcbiAgICAvLyBgcmFpbHdheSB1cGAgc3RyaXBzIGdpdGlnbm9yZWQgZmlsZXMgZnJvbSB0aGUgdXBsb2FkZWQgYnVpbGQgY29udGV4dCwgc28gdGhlIGdlbmVyYXRlZFxuICAgIC8vIG5vbi1zZWNyZXQgLmRvY2tlci5lbnYgKGB3YiBnZW4tZG9ja2VyLWVudmAgb3V0cHV0KSBuZWVkcyBhbiBleHBsaWNpdCB1bi1pZ25vcmUgdG8gcmVhY2hcbiAgICAvLyB0aGUgcmVtb3RlIERvY2tlciBidWlsZC4gQXBwZW5kZWQsIG5vdCBwcmVwZW5kZWQ6IGlnbm9yZSBmaWxlcyBhcmUgbGFzdC1tYXRjaC13aW5zLCBzbyBhXG4gICAgLy8gaGFuZC13cml0dGVuIHBhdHRlcm4gc3VjaCBhcyBgKi5lbnZgIGVhcmxpZXIgaW4gdGhlIGZpbGUgbXVzdCBub3Qgc2lsZW50bHkgcmUtZXhjbHVkZSBpdC5cbiAgICBpZiAodXNlc0RvY2tlckVudiAmJiAhL14hXFwuZG9ja2VyXFwuZW52JC9tLnRlc3QobmV3Q29udGVudCkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBgJHtuZXdDb250ZW50LnJlcGxhY2UoL1xcbj8kLywgJ1xcbicpfSEuZG9ja2VyLmVudlxcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9ja2VyZmlsZSAmJiAhdXNlc0RvY2tlckVudikge1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXiFcXC5kb2NrZXJcXC5lbnZcXG4/L20sICcnKTtcbiAgICB9XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PlxuICAgICAgbmV3Q29udGVudCA/IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpIDogZnNVdGlsLnJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoKVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbWFnZSwgTGluaywgUGFyYWdyYXBoLCBQaHJhc2luZ0NvbnRlbnQsIFJvb3RDb250ZW50IH0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHsgZnJvbU1hcmtkb3duIH0gZnJvbSAnbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmNvbnN0IHdiZnlCYWRnZVVybFByZWZpeCA9ICdodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3diZnktJztcbmNvbnN0IHdiZnlCYWRnZVVybFN1ZmZpeCA9ICctMWU5MGZmLnN2Zyc7XG5jb25zdCB3YmZ5QmFkZ2VMaW5rID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvdHJlZS9tYWluL3BhY2thZ2VzL3diZnknO1xuXG5jb25zdCBucG1QYWNrYWdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlLyc7XG5jb25zdCBucG1MaWNlbnNlQmFkZ2VQYXR0ZXJuID0gL15cXFshXFxbW15cXF1dKlxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL25wbVxcL2xcXC9bXilcXHNdK1xcKVxcXVxcKFteKVxcc10rXFwpJC91O1xuXG5jb25zdCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucyA9IFtcbiAgL15cXFshXFxbd2JmeVxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL2JhZGdlXFwvd2JmeS1bXilcXHNdKy0xZTkwZmZcXC5zdmdcXClcXF1cXChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9XaWxsQm9vc3RlclxcL3NoYXJlZFxcL3RyZWVcXC9tYWluXFwvcGFja2FnZXNcXC93YmZ5XFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1teKVxcc10rXFwvYWN0aW9uc1xcL3dvcmtmbG93c1xcL1teKVxcc10rKVxcL2JhZGdlXFwuc3ZnXFwpXFxdXFwoXFwxXFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoW14pXFxzXStcXClcXF1cXChodHRwcz86XFwvXFwvKD86d3d3XFwuKT9ucG1qc1xcLmNvbVxcL3BhY2thZ2VcXC9bXilcXHNdKlxcKSQvdSxcbiAgbnBtTGljZW5zZUJhZGdlUGF0dGVybixcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkV2JmeUJhZGdlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIeXBoZW5zIGFyZSBlc2NhcGVkIGFzIGAtLWAgcGVyIHNoaWVsZHMuaW8ncyBiYWRnZSBwYXRoIHN5bnRheCwgc28gYHYxLjIuMy1yYy4xYCBzdGF5cyBpbnRhY3QuXG4gIHJldHVybiBgWyFbd2JmeV0oJHt3YmZ5QmFkZ2VVcmxQcmVmaXh9JHtsYWJlbC5yZXBsYWNlQWxsKCctJywgJy0tJyl9JHt3YmZ5QmFkZ2VVcmxTdWZmaXh9KV0oJHt3YmZ5QmFkZ2VMaW5rfSlgO1xufVxuXG4vKiogVGhlIHZlcnNpb24gbGFiZWwgdGhlIHdiZnkgYmFkZ2UgaW4gdGhlIHJlcG9zaXRvcnkncyBSRUFETUUgcmVjb3JkcywgaS5lLiB0aGUgYnVpbGQgdGhhdCB3YmZpZWQgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIENvbmZpbmVkLCBhbmQgdG9sZXJhbnQgb2YgYW55IHJlYWQgZmFpbHVyZTogYSBSRUFETUUgdGhhdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IChhXG4gIC8vIGNvbW1pdHRlZCBzeW1saW5rKSBvciBjYW5ub3QgYmUgcmVhZCBhdCBhbGwgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoIGJ1aWxkIGNvbmZpZ3VyZWQgVEhJU1xuICAvLyByZXBvc2l0b3J5LCBhbmQgdGhlIGFuc3dlciBvbmx5IGV2ZXIgc3VwcHJlc3NlcyB3b3JrIOKAlCBzbyBhbnl0aGluZyBidXQgYSByZWFkYWJsZSBpbi1yZXBvc2l0b3J5XG4gIC8vIFJFQURNRSBtZWFucyBcIm5vdCBrbm93biB0byBiZSBhcHBsaWVkXCIgYW5kIHRoZSBydW4gcHJvY2VlZHMuXG4gIGNvbnN0IHJlYWRtZSA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdSRUFETUUubWQnKSkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAocmVhZG1lID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFJFQURNRSBpcyBwYXJzZWQgcmF0aGVyIHRoYW4gc2Nhbm5lZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3cml0ZUJhZGdlQmxvY2sgcGFyc2VzIGl0LCBhbmRcbiAgLy8gb25seSB0aGUgc2hhcGUgd3JpdGVCYWRnZUJsb2NrIGl0c2VsZiB3cml0ZXMgY291bnRzIGFzIGFuIGFwcGxpZWQgYmFkZ2U6IGEgdG9wLWxldmVsIHBhcmFncmFwaFxuICAvLyBvZiBiYWRnZXMuIEEgYmFkZ2UgYW55d2hlcmUgZWxzZSBpcyBjb250ZW50IHRoYXQgbWVyZWx5IG1lbnRpb25zIG9uZSDigJQgYSBmZW5jZWQgZXhhbXBsZSAod2JmeSdzXG4gIC8vIG93biBkb2N1bWVudGF0aW9uIGhhcyB0aG9zZSksIGEgYmxvY2sgcXVvdGUsIGEgbGlzdCBpdGVtIOKAlCBhbmQgcmVhZGluZyBpdCBhcyBhcHBsaWVkIHdvdWxkIHNraXBcbiAgLy8gZXZlcnkgZml4ZXIgZm9yIHRoZSByZXBvc2l0b3J5LlxuICBmb3IgKGNvbnN0IG5vZGUgb2YgZnJvbU1hcmtkb3duKHJlYWRtZSkuY2hpbGRyZW4pIHtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYmFkZ2Ugb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKCFpc0JhZGdlTm9kZShiYWRnZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyB1cmwgfSA9IGJhZGdlLmNoaWxkcmVuWzBdO1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHdiZnlCYWRnZVVybFByZWZpeCkgJiYgdXJsLmVuZHNXaXRoKHdiZnlCYWRnZVVybFN1ZmZpeCkpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zbGljZSh3YmZ5QmFkZ2VVcmxQcmVmaXgubGVuZ3RoLCAtd2JmeUJhZGdlVXJsU3VmZml4Lmxlbmd0aCkucmVwbGFjZUFsbCgnLS0nLCAnLScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICAvLyBUaGUgd2JmeSBiYWRnZSBtYXJrcyBhIHJlcG9zaXRvcnkgYXMgd2JmaWVkLCBzbyBhIHJlcG9zaXRvcnkgd2l0aG91dCBhIFJFQURNRSBzdGlsbCBnZXRzIG9uZS5cbiAgICAvLyByZWFkRmlsZUlmRXhpc3RzIGZhbGxzIGJhY2sgT05MWSBvbiBFTk9FTlQ6IGEgUkVBRE1FIHRoYXQgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZCAoZS5nLlxuICAgIC8vIHBlcm1pc3Npb25zLCBFTUZJTEUpIG11c3QgYWJvcnQgdGhlIGdlbmVyYXRvciBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIHN0dWIuXG4gICAgbGV0IG5ld0NvbnRlbnQgPVxuICAgICAgKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz9cbiAgICAgIGAjICR7Y29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID8/IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSl9XFxuYDtcblxuICAgIC8vIE9yZGVyZWQgYnkgd2hhdCBhIHJlYWRlciBjYXJlcyBhYm91dCBtb3N0OiB0aGUgbnBtIGJhZGdlIG5hbWVzIHRoZSBwYWNrYWdlIGEgcmVhZGVyIGluc3RhbGxzLFxuICAgIC8vIHRoZW4gdGhlIHdvcmtmbG93IGJhZGdlcyByZXBvcnQgd2hldGhlciB0aGUgY29kZSBpcyBjdXJyZW50bHkgaGVhbHRoeSwgdGhlbiBob3cgaXQgaXNcbiAgICAvLyByZWxlYXNlZCwgYW5kIGxhc3QgdGhlIHdiZnkgYnVpbGQgdGhhdCBjb25maWd1cmVkIGl0LlxuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGF3YWl0IGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZyk7XG4gICAgaWYgKHBhY2thZ2VOYW1lKSB7XG4gICAgICBiYWRnZXMucHVzaChidWlsZE5wbUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICBjb25zdCBsaWNlbnNlID0gY29uZmlnLnBhY2thZ2VKc29uPy5saWNlbnNlO1xuICAgICAgaWYgKGxpY2Vuc2UgJiYgbGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnKSB7XG4gICAgICAgIGJhZGdlcy5wdXNoKGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGJhZGdlcy5wdXNoKC4uLihhd2FpdCBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZykpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIGJhZGdlcy5wdXNoKHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICBiYWRnZXMucHVzaChidWlsZFdiZnlCYWRnZShnZXRXYmZ5VmVyc2lvbkxhYmVsKCkgPz8gJ2FwcGxpZWQnKSk7XG5cbiAgICAvLyBUaGUgYmxvY2sgaXMgd3JpdHRlbiBpbiBvbmUgcGFzcyBmcm9tIHRoZSBiYWRnZXMgd2JmeSBtYW5hZ2VzIHJpZ2h0IG5vdy4gQSBiYWRnZSB0aGF0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIHdhbnRlZCDigJQgYSBzdXBlcnNlZGVkIHZlcnNpb24sIG9yIG9uZSB3aG9zZSB3b3JrZmxvdyBpcyBnb25lIOKAlCBzaW1wbHkgaXMgbm90IGluIHRoZVxuICAgIC8vIGxpc3QsIHNvIG5vdGhpbmcgaGFzIHRvIHJlbW92ZSBpdC5cbiAgICBuZXdDb250ZW50ID0gd3JpdGVCYWRnZUJsb2NrKG5ld0NvbnRlbnQsIGJhZGdlcyk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT5cbiAgICAgIGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQsIGdldExpbmVFbmRpbmcobmV3Q29udGVudCkpXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICAvLyBBIG1vbm9yZXBvIGhhcyBubyBzaW5nbGUgbnBtIHZlcnNpb24gcmVwcmVzZW50aW5nIHRoZSB3aG9sZSByZXBvc2l0b3J5LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIHx8ICFjb25maWcucmVsZWFzZS5ucG0gfHwgIXBhY2thZ2VKc29uPy5uYW1lIHx8IHBhY2thZ2VKc29uLnByaXZhdGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiAoYXdhaXQgaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VKc29uLm5hbWUpKSA/IHVuZGVmaW5lZCA6IHBhY2thZ2VKc29uLm5hbWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVnaXN0cnkgYW5zd2VycyB0aGF0IGl0IGhhcyBubyBzdWNoIHBhY2thZ2Ug4oCUIHRoZSBPTkxZIGFuc3dlciB0aGF0IHJlbW92ZXMgYSBiYWRnZS5cbiAqIEEgY2hlY2sgdGhhdCBjYW5ub3QgcnVuIChvZmZsaW5lLCBhbiBvdXRhZ2UsIGEgdGltZW91dCkgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBwYWNrYWdlLCBhbmRcbiAqIHRyZWF0aW5nIGl0IGFzIGFic2VudCB3b3VsZCBzdHJpcCB0aGUgYmFkZ2Ugb3V0IG9mIGV2ZXJ5IHB1Ymxpc2hlZCByZXBvc2l0b3J5IHdiZnkgdG91Y2hlc1xuICogZHVyaW5nIHRoZSBvdXRhZ2UgYW5kIHB1dCBpdCBiYWNrIGFmdGVyd2FyZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgLy8gVGhlIHNjb3BlIHNlcGFyYXRvciBtdXN0IHN1cnZpdmUgYXMgYSBwYXRoIHNlZ21lbnQsIHNvIHRoZSBuYW1lIGlzIGVuY29kZWQgcGllY2V3aXNlLlxuICAgIGNvbnN0IGVuY29kZWROYW1lID0gcGFja2FnZU5hbWUuc3BsaXQoJy8nKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcvJyk7XG4gICAgLy8gQSBiYWRnZSBpcyBkZWNvcmF0aW9uOiBhIHN0YWxsZWQgcmVnaXN0cnkgY29ubmVjdGlvbiBtdXN0IG5vdCBob2xkIHRoZSB3aG9sZSBydW4gZm9yIGhvd2V2ZXJcbiAgICAvLyBsb25nIHRoZSBuZXR3b3JraW5nIHN0YWNrIHdvdWxkIHdhaXQuIFRoZSBidWRnZXQgaXMgZ2VuZXJvdXMgYmVjYXVzZSBhIHRpbWVvdXQgYW5zd2Vyc1xuICAgIC8vIFwidW5rbm93blwiLCB3aGljaCBrZWVwcyB0aGUgYmFkZ2Ug4oCUIGFuZCBvbiBhIHJlcG9zaXRvcnkgdGhhdCBpcyBub3Qgb24gbnBtIHRoYXQgbWVhbnMgd3JpdGluZ1xuICAgIC8vIG9uZSBpdCBzaG91bGQgbm90IGhhdmU7IGEgd2JmeSBydW4gYWxyZWFkeSBzcGVuZHMgbWludXRlcyBvbiBpbnN0YWxscywgc28gd2FpdGluZyBhIGxpdHRsZVxuICAgIC8vIGxvbmdlciBmb3IgYSByZWFsIGFuc3dlciBjb3N0cyBsZXNzIHRoYW4gYWN0aW5nIG9uIGEgbWlzc2luZyBvbmUuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVkTmFtZX1gLCB7XG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMF8wMDApLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDQwNDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTnBtQmFkZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWyFbbnBtIHZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL3YvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFshW2xpY2Vuc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL2wvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFyZXBvc2l0b3J5IHx8ICFmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpKSByZXR1cm4gW107XG5cbiAgLy8gV29ya2Zsb3cgYW5kIFJFQURNRSBnZW5lcmF0aW9uIHJ1biBjb25jdXJyZW50bHkuIERvIG5vdCByZXRhaW4gYSBzdGFsZSBSdXN0IGJhZGdlIHdoaWxlIHRoZVxuICAvLyB3b3JrZmxvdyBnZW5lcmF0b3IgcmVtb3ZlcyBhIGNhbGxlciBjcmVhdGVkIGZyb20gYSBmb3JtZXJseSBtaXNkZXRlY3RlZCBsb2NhbCBjYWNoZSDigJQgYnV0XG4gIC8vIG1pcnJvciBpdHMgb3duZXJzaGlwIGNoZWNrOiBhIGN1c3RvbSBzYW1lLW5hbWVkIHdvcmtmbG93IHN1cnZpdmVzLCBzbyBpdHMgYmFkZ2UgbXVzdCB0b28uXG4gIC8vIERlY2lkZWQgc3luY2hyb25vdXNseSBiZWZvcmUgdGhlIGxvb3AncyBmaXJzdCBhd2FpdDogdGhlIGdlbmVyYXRvcidzIGRlbGV0ZSBjYW4gb25seSBsYW5kIGF0XG4gIC8vIGFuIGF3YWl0IHBvaW50LCBhbmQgYSBwb3N0LWRlbGV0ZSByZWFkIHdvdWxkIG1pc3JlcG9ydCB0aGUgd2JmeS1vd25lZCBjYWxsZXIgYXMgY3VzdG9tLlxuICAvLyBObyBleGlzdHNTeW5jIHByZS1jaGVjazogdGhlIGhlbHBlciBhbHJlYWR5IHRyZWF0cyBhIG1pc3NpbmcgZmlsZSBhcyBub3Qgb3duZWQsIGFuZCB0aGlzIHJ1bnNcbiAgLy8gb25jZSBwZXIgcmVwb3NpdG9yeSwgc28gdGhlIGV4Y2VwdGlvbmFsIEVOT0VOVCByZWFkIGNvc3RzIG5vdGhpbmcgd29ydGggYSByZWR1bmRhbnQgc3RhdC5cbiAgY29uc3QgZHJvcHNUZXN0UnVzdEJhZGdlID1cbiAgICBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCAndGVzdC1ydXN0LnltbCcsICd0ZXN0LXJ1c3QnKTtcblxuICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkpIHtcbiAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuICAgIGlmIChmaWxlTmFtZSA9PT0gJ3Rlc3QtcnVzdC55bWwnICYmIGRyb3BzVGVzdFJ1c3RCYWRnZSkgY29udGludWU7XG4gICAgLy8gR2l0SHViJ3MgYmFkZ2UgZW5kcG9pbnQgcmV0dXJucyA0MDQgdW50aWwgdGhlIHdvcmtmbG93IGhhcyBhdCBsZWFzdCBvbmUgcnVuLCBzbyBhIGJhZGdlIGZvciBhXG4gICAgLy8gZGlzcGF0Y2gtb25seSBkZXBsb3kgd29ya2Zsb3cgdGhhdCBoYXMgbmV2ZXIgcnVuIHJlbmRlcnMgYXMgYSBicm9rZW4gaW1hZ2UuIFRlc3Qgd29ya2Zsb3dzIHJ1blxuICAgIC8vIG9uIGV2ZXJ5IFBSLCBzbyBvbmx5IGRlcGxveSBiYWRnZXMgbmVlZCB0aGUgZ3VhcmQuXG4gICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmICEoYXdhaXQgaGFzQW55V29ya2Zsb3dSdW4ocmVwb3NpdG9yeSwgZmlsZU5hbWUsIGNvbmZpZy5pc1B1YmxpY1JlcG8pKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGJhZGdlTmFtZSA9IChmaWxlTmFtZVswXSA/PyAnJykudG9VcHBlckNhc2UoKSArIGZpbGVOYW1lLnNsaWNlKDEsIGZpbGVOYW1lLmluZGV4T2YoJy4nKSkucmVwbGFjZSgnLScsICcgJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtlbmNvZGVVcmxQYXRoKGZpbGVOYW1lKX1gO1xuICAgIGJhZGdlcy5wdXNoKGBbIVske2JhZGdlTmFtZX1dKCR7d29ya2Zsb3dVcmx9L2JhZGdlLnN2ZyldKCR7d29ya2Zsb3dVcmx9KWApO1xuICB9XG4gIHJldHVybiBiYWRnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FueVdvcmtmbG93UnVuKFxuICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gIHdvcmtmbG93RmlsZU5hbWU6IHN0cmluZyxcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IHJlcG9zaXRvcnkuc3BsaXQoJy8nKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG93bmVyKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vcnVucycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIHdvcmtmbG93X2lkOiB3b3JrZmxvd0ZpbGVOYW1lLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZvciBhIFBVQkxJQyByZXBvc2l0b3J5IHRoZSBydW5zIGVuZHBvaW50IG5lZWRzIG5vIGF1dGhvcml6YXRpb24sIHNvIDQwNCByZWxpYWJseSBtZWFucyB0aGVcbiAgICAvLyB3b3JrZmxvdyBpcyBhYnNlbnQgZnJvbSB0aGUgcmVtb3RlIChlLmcuIGFkZGVkIGxvY2FsbHksIG5ldmVyIHB1c2hlZCkg4oCUIGxpa2UgemVybyBydW5zLCBpdHNcbiAgICAvLyBiYWRnZSB3b3VsZCByZW5kZXIgYnJva2VuLiBGb3IgYSBQUklWQVRFIHJlcG9zaXRvcnkgR2l0SHViIGFsc28gYW5zd2VycyA0MDQgd2hlbiB0aGUgdG9rZW5cbiAgICAvLyBpcyBtaXNzaW5nIG9yIHVuZGVyLXNjb3BlZCwgc28gNDA0IGlzIGFtYmlndW91cyB0aGVyZSBhbmQgdGhlIGJhZGdlIGlzIGtlcHQuXG4gICAgaWYgKChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwNCAmJiBpc1B1YmxpY1JlcG8pIHJldHVybiBmYWxzZTtcbiAgICAvLyBLZWVwIHRoZSBwcmUtZ3VhcmQgYmVoYXZpb3IgKGluc2VydCB0aGUgYmFkZ2UpIHdoZW4gdGhlIGNoZWNrIGl0c2VsZiBjYW5ub3QgcnVuLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGJhZGdlIGJsb2NrcyBkaXJlY3RseSB1bmRlciB0aGUgdGl0bGUgd2l0aCBgbWFuYWdlZEJhZGdlc2AsIGtlZXBpbmcgYW55IGJhZGdlIHRoZXJlXG4gKiB0aGF0IHdiZnkgZG9lcyBub3QgbWFuYWdlLCBhbmQgcmVhc3NlbWJsZXMgdGhlIFJFQURNRSBhcm91bmQgdGhlbSB3aXRoIGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgb25cbiAqIGVhY2ggc2lkZS5cbiAqXG4gKiBCb3RoIHRoZSB0aXRsZSBhbmQgdGhlIGJsb2NrIGFyZSBsb2NhdGVkIGluIGEgQ29tbW9uTWFyayBzeW50YXggdHJlZSByYXRoZXIgdGhhbiBieSBzY2FubmluZ1xuICogbGluZXM6IG9ubHkgYSByZWFsIHBhcnNlciBrbm93cyB3aGV0aGVyIGEgbGluZSB0aGF0IGxvb2tzIGxpa2UgYSBiYWRnZSBpcyBhIGJhZGdlIChhIHBhcmFncmFwaCBvZlxuICogbGlua2VkIGltYWdlcykgb3IgY29udGVudCB0aGF0IG1lcmVseSByZWFkcyBsaWtlIG9uZSAoYW4gaW5kZW50ZWQgY29kZSBibG9jaywgYSBibG9jayBxdW90ZSwgYVxuICogZmVuY2VkIGV4YW1wbGUsIGEgbXVsdGlsaW5lIGNvZGUgc3BhbiwgYW4gSFRNTCBibG9jaykuIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgYmxvY2sgaXMgY29waWVkIGJhY2tcbiAqIHZlcmJhdGltIGZyb20gdGhlIG9yaWdpbmFsIHRleHQgdGhyb3VnaCB0aGUgcGFyc2VyJ3MgcG9zaXRpb25hbCBvZmZzZXRzLCBzbyBubyByZWZvcm1hdHRpbmcgb2YgdGhlXG4gKiB1c2VyJ3MgY29udGVudCBpcyBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQmFkZ2VCbG9jayhyZWFkbWU6IHN0cmluZywgbWFuYWdlZEJhZGdlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lRW5kaW5nID0gZ2V0TGluZUVuZGluZyhyZWFkbWUpO1xuICAvLyBBIEJPTSBpcyBub3QgTWFya2Rvd246IGxlZnQgaW4gdGhlIHRleHQgaXQgaGlkZXMgdGhlIGAjYCBvZiB0aGUgdGl0bGUgZnJvbSB0aGUgcGFyc2VyLCBhbmRcbiAgLy8gcHJlcGVuZGluZyB0aGUgYmxvY2sgYWhlYWQgb2YgaXQgd291bGQgc3RyaXAgdGhlIG1hcmtlciBmcm9tIHRoZSBmaWxlJ3MgZmlyc3QgYnl0ZS5cbiAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IHJlYWRtZS5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gIC8vIEZyb250IG1hdHRlciBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNhbWUgYC0tLWAgYSBTZXRleHQgaGVhZGluZyBhbmQgYSB0aGVtYXRpYyBicmVhayB1c2UsIHNvIGl0IGlzXG4gIC8vIGRldGFjaGVkIGJlZm9yZSBwYXJzaW5nIGluc3RlYWQgb2YgYmVpbmcgdG9sZCBhcGFydCBhZnRlcndhcmRzOyBpdCBhbHNvIGhhcyB0byBzdGF5IGZpcnN0IGluIHRoZVxuICAvLyBmaWxlLCB3aGljaCBtYWtlcyBpdCBhIHByZWZpeCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGUgQk9NIGlzLlxuICBjb25zdCB3aXRob3V0TWFyayA9IHJlYWRtZS5zbGljZShieXRlT3JkZXJNYXJrLmxlbmd0aCk7XG4gIGNvbnN0IGZyb250TWF0dGVyID0gd2l0aG91dE1hcmsuc3RhcnRzV2l0aCgnLS0tJylcbiAgICA/ICgvXi0tLVsgXFx0XSpcXHI/XFxuW1xcc1xcU10qP14tLS1bIFxcdF0qKD86XFxyP1xcbnwkKS9tdS5leGVjKHdpdGhvdXRNYXJrKT8uWzBdID8/ICcnKVxuICAgIDogJyc7XG4gIGNvbnN0IHByZWZpeCA9IGAke2J5dGVPcmRlck1hcmt9JHtmcm9udE1hdHRlcn1gO1xuICAvLyBUaGUgZmluYWwgbmV3bGluZSBpcyBzZXQgYXNpZGUgcmF0aGVyIHRoYW4gcGFyc2VkIGFzIHRyYWlsaW5nIGJsYW5rIHNwYWNlLCB3aGljaCB0aGUgYmxhbmstbGluZVxuICAvLyB0cmltbWluZyBiZWxvdyB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdy5cbiAgY29uc3QgZW5kc1dpdGhOZXdsaW5lID0gL1xccj9cXG4kL3UudGVzdChyZWFkbWUpO1xuICBjb25zdCBjb250ZW50ID0gd2l0aG91dE1hcmsuc2xpY2UoZnJvbnRNYXR0ZXIubGVuZ3RoKS5yZXBsYWNlKC9cXHI/XFxuJC91LCAnJyk7XG5cbiAgY29uc3Qgbm9kZXMgPSBmcm9tTWFya2Rvd24oY29udGVudCkuY2hpbGRyZW47XG4gIC8vIEEgbGVhZGluZyBiYWRnZSBibG9jayBpcyB0aGUgdXNlcidzIG93biBsYXlvdXQ6IGl0IHN0YXlzIGFib3ZlIHRoZSB0aXRsZSwgYW5kIHdiZnkncyBibG9jayBnb2VzIGJlbG93LlxuICBjb25zdCBrZWVwc0xlYWRpbmdCbG9jayA9ICEhbm9kZXNbMF0gJiYgaXNCYWRnZUJsb2NrTm9kZShub2Rlc1swXSkgJiYgaXNUaXRsZU5vZGUobm9kZXNbMV0pO1xuICBjb25zdCB0aXRsZUluZGV4ID0ga2VlcHNMZWFkaW5nQmxvY2sgPyAxIDogaXNUaXRsZU5vZGUobm9kZXNbMF0pID8gMCA6IC0xO1xuICAvLyBXaXRob3V0IGEgcmVjb2duaXphYmxlIHRpdGxlIHRoZSBibG9jayBzaXRzIGF0IHRoZSB2ZXJ5IHRvcCwgYWJvdmUgZXZlcnl0aGluZy5cbiAgY29uc3QgaGVhZFN0YXJ0Tm9kZSA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gbm9kZXNbMF0hIDogbm9kZXNbdGl0bGVJbmRleF07XG4gIGNvbnN0IGhlYWQgPVxuICAgIHRpdGxlSW5kZXggPT09IC0xXG4gICAgICA/ICcnXG4gICAgICA6IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGhlYWRTdGFydE5vZGUhKSwgbm9kZXNbdGl0bGVJbmRleF0hLnBvc2l0aW9uIS5lbmQub2Zmc2V0KTtcblxuICBjb25zdCBiYWRnZUJsb2NrTm9kZXM6IFBhcmFncmFwaFtdID0gW107XG4gIGZvciAobGV0IG5vZGVJbmRleCA9IHRpdGxlSW5kZXggKyAxOyA7IG5vZGVJbmRleCsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW25vZGVJbmRleF07XG4gICAgaWYgKCFpc0JhZGdlQmxvY2tOb2RlKG5vZGUpKSBicmVhaztcbiAgICBiYWRnZUJsb2NrTm9kZXMucHVzaChub2RlKTtcbiAgICAvLyBXaXRob3V0IGEgdGl0bGUsIG1lcmdpbmcgbGVhZGluZyBibG9ja3MgY291bGQgY2hhbmdlIHdoaWNoIG5vZGUgaXMgcmVjb2duaXplZCBhcyB0aGUgdGl0bGUgb24gdGhlIG5leHQgcnVuLlxuICAgIGlmICh0aXRsZUluZGV4ID09PSAtMSkgYnJlYWs7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmcgPSBiYWRnZUJsb2NrTm9kZXMuZmxhdE1hcCgobm9kZSkgPT4gcmVhZEJhZGdlcyhub2RlLCBjb250ZW50KSk7XG4gIGNvbnN0IGJvZHlOb2RlID0gbm9kZXNbdGl0bGVJbmRleCArIDEgKyBiYWRnZUJsb2NrTm9kZXMubGVuZ3RoXTtcbiAgY29uc3QgYm9keSA9IGJvZHlOb2RlID8gY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgYm9keU5vZGUpKSA6ICcnO1xuXG4gIC8vIFN1cGVyc2VkaW5nIGEgbWFuYWdlZCBiYWRnZSBpcyBqdXN0IGRyb3BwaW5nIHRoZSBvbGQgb25lOiBhIHZlcnNpb24sIHdvcmtmbG93LCBucG0sIG9yIGxpY2Vuc2VcbiAgLy8gY2hhbmdlIGxlYXZlcyBubyBzdGFsZSBjb3B5LCB3aGlsZSBhbnkgb3RoZXIgYmFkZ2UgaW4gdGhlIG1hbmFnZWQgcmVnaW9uIGlzIGtlcHQuXG4gIGNvbnN0IGJhZGdlcyA9IFsuLi5tYW5hZ2VkQmFkZ2VzLCAuLi5leGlzdGluZy5maWx0ZXIoKGJhZGdlKSA9PiAhaXNNYW5hZ2VkQmFkZ2UoYmFkZ2UpKV07XG4gIC8vIENvbnRlbnQgaXMgc2xpY2VkIGZyb20gaXRzIG5vZGUncyBzdGFydCBvZmZzZXQsIHNvIHdoYXRldmVyIGJsYW5rIHNwYWNlIGZvbGxvd2VkIHRoZSBmcm9udFxuICAvLyBtYXR0ZXIgaXMgZ29uZTsgZXhhY3RseSBvbmUgYmxhbmsgbGluZSBpcyByZXN0b3JlZCBoZXJlLiBBIGNsb3NpbmcgZGVsaW1pdGVyIHRoYXQgZW5kZWQgYXQgRU9GXG4gIC8vIGNhcnJpZXMgbm8gbmV3bGluZSBvZiBpdHMgb3duIGFuZCBuZWVkcyBib3RoLCBvciBgLS0tYCB3b3VsZCBmdXNlIHdpdGggdGhlIGZpcnN0IGJhZGdlIGFuZFxuICAvLyBkZXN0cm95IHRoZW0gYm90aC4gQSBCT00gbmVlZHMgbm8gc2VwYXJhdG9yOiBpdCBpcyBhIGJ5dGUgbWFya2VyLCBub3QgYSBsaW5lLlxuICBjb25zdCBzZXBhcmF0b3IgPSBmcm9udE1hdHRlciA/ICgvXFxyP1xcbiQvdS50ZXN0KGZyb250TWF0dGVyKSA/IGxpbmVFbmRpbmcgOiBgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKSA6ICcnO1xuICBjb25zdCByZXN1bHQgPVxuICAgIHByZWZpeCArIHNlcGFyYXRvciArIFtoZWFkLCBiYWRnZXMuam9pbihsaW5lRW5kaW5nKSwgYm9keV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCk7XG4gIHJldHVybiBlbmRzV2l0aE5ld2xpbmUgPyBgJHtyZXN1bHR9JHtsaW5lRW5kaW5nfWAgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQSBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBleHRlbmRlZCBiYWNrIG92ZXIgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBpdHMgb3duIGxpbmUuIENvbW1vbk1hcmtcbiAqIGFsbG93cyBvbmUgdG8gdGhyZWUgc3BhY2VzIG9mIGluZGVudGF0aW9uIGJlZm9yZSBhIGJsb2NrLCBhbmQgbWRhc3QgcmVwb3J0cyB0aGUgb2Zmc2V0IEFGVEVSXG4gKiB0aGVtIOKAlCBzbyBzbGljaW5nIGZyb20gaXQgc2lsZW50bHkgcmVpbmRlbnRzIGNvbnRlbnQgdGhpcyBnZW5lcmF0b3IgcHJvbWlzZXMgdG8gY29weSB2ZXJiYXRpbS5cbiAqL1xuZnVuY3Rpb24gc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQ6IHN0cmluZywgbm9kZTogUm9vdENvbnRlbnQpOiBudW1iZXIge1xuICBjb25zdCBzdGFydCA9IG5vZGUucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCE7XG4gIGNvbnN0IGxpbmVTdGFydCA9IGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIHN0YXJ0IC0gMSkgKyAxO1xuICByZXR1cm4gL15bIFxcdF0qJC91LnRlc3QoY29udGVudC5zbGljZShsaW5lU3RhcnQsIHN0YXJ0KSkgPyBsaW5lU3RhcnQgOiBzdGFydDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBub2RlIG9wZW5zIHRoZSBSRUFETUUgd2l0aCBhIHRpdGxlLiBPbmx5IHRoZSBGSVJTVCBwaWVjZSBvZiBjb250ZW50IGNhbiBiZSBvbmU6IGFcbiAqIHRpdGxlIGlzIHdoYXQgYSBSRUFETUUgb3BlbnMgd2l0aCwgYW5kIGFuY2hvcmluZyB0aGUgYmFkZ2VzIHRvIGEgaGVhZGluZyBmdXJ0aGVyIGRvd24gd291bGQgYnVyeVxuICogdGhlbSBiZWxvdyBjb250ZW50IHRoZSBhdXRob3IgcHV0IGZpcnN0LlxuICovXG5mdW5jdGlvbiBpc1RpdGxlTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ2hlYWRpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgLy8gTWFueSBSRUFETUVzIGNlbnRlciB0aGVpciB0aXRsZSBpbiBIVE1MIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLCB3aGljaCB0aGVcbiAgLy8gcGFyc2VyIHJlcG9ydHMgYXMgb25lIG9wYXF1ZSBIVE1MIGJsb2NrOyB0aGUgYmFkZ2VzIGdvIGFmdGVyIHRoZSB3aG9sZSBibG9jay5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2h0bWwnICYmIGNvbnRhaW5zUmVuZGVyZWRIMShub2RlLnZhbHVlKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBIVE1MIGJsb2NrIHVuYW1iaWd1b3VzbHkgUkVOREVSUyBhbiBgPGgxPmAg4oCUIHRoZSBjZW50ZXJlZC10aXRsZSBsYXlvdXQgbWFueSBSRUFETUVzXG4gKiB1c2UgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBhIGdlbmVyYWwgSFRNTCBwYXJzZXIuIERlY2lkaW5nIHRoaXMgZXhhY3RseSByZXF1aXJlcyB0aGUgcmVhbCB0b2tlbml6ZXInc1xuICogc3RhdGVzIOKAlCByYXcgdGV4dCwgUkNEQVRBLCBzY3JpcHQgZGF0YSwgYXR0cmlidXRlIHZhbHVlcywgdGVtcGxhdGUgY29udGVudHMsIGRlY2xhcmF0aW9ucyDigJQgYW5kXG4gKiBhcHByb3hpbWF0aW5nIHRoZW0gd2l0aCByZWdleGVzIGlzIHRoZSBzYW1lIGxvc2luZyBnYW1lIHRoZSBNYXJrZG93biBzY2FubmluZyB0aGlzIG1vZHVsZVxuICogcmVwbGFjZWQgd2FzIHBsYXlpbmcuIFNvIHRoZSBydWxlIGlzOiB0b2tlbml6ZSBvbmx5IHRoZSBzaW1wbGUgY2FzZSwgYW5kIHRyZWF0IGFueXRoaW5nIGNhcnJ5aW5nXG4gKiBhIGNvbnN0cnVjdCB3aG9zZSBwYXJzaW5nIGRlcGVuZHMgb24gdGhvc2Ugc3RhdGVzIGFzIE5PVCBhIHRpdGxlLiBCZWluZyB3cm9uZyB0aGF0IHdheSBwdXRzIHRoZVxuICogYmFkZ2VzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIHdoaWNoIGlzIG1lcmVseSB1bmhlbHBmdWw7IGJlaW5nIHdyb25nIHRoZSBvdGhlciB3YXkgcmV3cml0ZXMgdGhlXG4gKiB1c2VyJ3MgUkVBRE1FIGFyb3VuZCB0aGUgd3JvbmcgYW5jaG9yLlxuICovXG5mdW5jdGlvbiBjb250YWluc1JlbmRlcmVkSDEoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbW1lbnRzIGNhbm5vdCBuZXN0IGFuZCBlbmQgdW5hbWJpZ3VvdXNseSwgc28gdGhleSBhcmUgc2ltcGx5IHJlbW92ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZy5cbiAgY29uc3Qgd2l0aG91dENvbW1lbnRzID0gaHRtbC5yZXBsYWNlQWxsKC88IS0tW1xcc1xcU10qPyg/Oi0tPnwkKS9ndSwgJycpO1xuICAvLyBDREFUQSwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGRlY2xhcmF0aW9ucywgZWxlbWVudHMgd2hvc2UgY29udGVudCBpcyByYXcgdGV4dCAvIFJDREFUQSAvXG4gIC8vIHNjcmlwdCBkYXRhLCBhbmQgYDx0ZW1wbGF0ZT5gICh3aG9zZSBjb250ZW50cyBhcmUgaW5lcnQpLiBBIHF1b3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyBgPGBcbiAgLy8gbWFrZXMgZXZlbiBsb2NhdGluZyB0aGVzZSB1bnJlbGlhYmxlLCBzbyBpdCBkaXNxdWFsaWZpZXMgdGhlIGJsb2NrIHRvby5cbiAgY29uc3QgYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybiA9XG4gICAgLzwhXFxbQ0RBVEFcXFt8PFxcP3w8IVthLXpBLVpdfDxcXC8/KD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlfGlmcmFtZXxub2ZyYW1lc3xub2VtYmVkfHhtcHx0ZW1wbGF0ZSlcXGJ8XCJbXlwiXSo8W15cIl0qXCJ8J1teJ10qPFteJ10qJy9pdTtcbiAgaWYgKGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4udGVzdCh3aXRob3V0Q29tbWVudHMpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFF1b3RpbmcgaXMgc2lnbmlmaWNhbnQgb25seSBpbnNpZGUgYSBzdGFydCB0YWcsIHNvIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyBjb25zdW1lZCB3aXRoIGl0cyBvd25cbiAgLy8gdGFnIHdoaWxlIHF1b3RhdGlvbiBtYXJrcyBpbiBvcmRpbmFyeSB0ZXh0IHN0YXkgdGV4dDogYDxkaXYgdGl0bGU9XCImbHQ7aDEmZ3Q7XCI+YCBkb2VzIG5vdCBjb3VudCxcbiAgLy8gYFwiPGgxPlByb2plY3Q8L2gxPlwiYCBkb2VzLlxuICBjb25zdCBzdGFydFRhZ1BhdHRlcm4gPSAvPChbYS16QS1aXVteXFxzLz5dKikoPzpcIlteXCJdKlwifCdbXiddKid8W14+XCInXSkqPi9ndTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB3aXRob3V0Q29tbWVudHMubWF0Y2hBbGwoc3RhcnRUYWdQYXR0ZXJuKSkge1xuICAgIGlmIChtYXRjaFsxXT8udG9Mb3dlckNhc2UoKSA9PT0gJ2gxJykgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogV2hldGhlciB0aGUgbm9kZSBpcyBhIHBhcmFncmFwaCBvZiBiYWRnZXMgYW5kIG5vdGhpbmcgZWxzZSDigJQgdGhlIG9ubHkgY29udGVudCB3YmZ5IHB1dHMgaW4gdGhlIGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNCYWRnZUJsb2NrTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IG5vZGUgaXMgUGFyYWdyYXBoIHtcbiAgcmV0dXJuIChcbiAgICAhIW5vZGUgJiZcbiAgICBub2RlLnR5cGUgPT09ICdwYXJhZ3JhcGgnICYmXG4gICAgbm9kZS5jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKSAmJlxuICAgIG5vZGUuY2hpbGRyZW4uZXZlcnkoXG4gICAgICAoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSB8fCBjaGlsZC50eXBlID09PSAnYnJlYWsnIHx8IChjaGlsZC50eXBlID09PSAndGV4dCcgJiYgIWNoaWxkLnZhbHVlLnRyaW0oKSlcbiAgICApXG4gICk7XG59XG5cbi8qKiBBIGJhZGdlIGlzIG9uZSBgWyFbYWx0XShpbWFnZSldKGxpbmspYCwgdGhlIG9ubHkgc2hhcGUgd2JmeSBldmVyIHdyaXRlcy4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgUGhyYXNpbmdDb250ZW50KTogbm9kZSBpcyBMaW5rICYgeyBjaGlsZHJlbjogW0ltYWdlXSB9IHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2xpbmsnICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG5vZGUuY2hpbGRyZW5bMF0/LnR5cGUgPT09ICdpbWFnZSc7XG59XG5cbi8qKlxuICogVGhlIGJhZGdlcyBpbiB0aGUgYmxvY2ssIGFzIHRoZSBleGFjdCBzb3VyY2UgdGV4dCB0aGF0IHByb2R1Y2VkIHRoZW06IGEgYmFkZ2Ugd2JmeSBkb2VzIG5vdCBtYW5hZ2VcbiAqIGlzIHdyaXR0ZW4gYmFjayBieXRlIGZvciBieXRlIGluc3RlYWQgb2YgYmVpbmcgcmUtc2VyaWFsaXplZCBmcm9tIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiByZWFkQmFkZ2VzKG5vZGU6IFBhcmFncmFwaCwgY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpXG4gICAgLm1hcCgoY2hpbGQpID0+IGNvbnRlbnQuc2xpY2UoY2hpbGQucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCwgY2hpbGQucG9zaXRpb24hLmVuZC5vZmZzZXQpKTtcbn1cblxuLyoqXG4gKiBQZXJjZW50LWVuY29kZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBlbmQgYSBNYXJrZG93biBkZXN0aW5hdGlvbiBlYXJseS4gQSB3b3JrZmxvdyBmaWxlIG1heSBiZVxuICogbmFtZWQgYW55dGhpbmcgd2l0aCBhIGAueW1sYCBleHRlbnNpb24sIGFuZCBvbmUgY29udGFpbmluZyBgKGAgb3IgYClgIHByb2R1Y2VkIGEgYmFkZ2UgdGhhdCB3YmZ5J3NcbiAqIG93biBiYWRnZSBwYXR0ZXJuIGNvdWxkIG5vdCByZWFkIGJhY2sg4oCUIHNvIHRoZSBsaW5lIGxlZnQgdGhlIGJsb2NrIGFuZCB0aGUgYmFkZ2Ugd2FzIGR1cGxpY2F0ZWQuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVybFBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bKClcXHNdL2d1LCAoY2hhcmFjdGVyKSA9PiBgJSR7Y2hhcmFjdGVyLmNvZGVQb2ludEF0KDApIS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGlzIG9uZSB3YmZ5IHdyaXRlcyBpdHNlbGYsIGFuZCBzbyBtYXkgYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgYmxvY2suICovXG5mdW5jdGlvbiBpc01hbmFnZWRCYWRnZShiYWRnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBiYWRnZSA9PT0gc2VtYW50aWNSZWxlYXNlQmFkZ2UgfHwgbWFuYWdlZEJhZGdlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGJhZGdlKSk7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVFbmRpbmcoY29udGVudDogc3RyaW5nKTogJ1xcbicgfCAnXFxyXFxuJyB7XG4gIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXHJcXG4nKSA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuXG5jb25zdCBzaGFyZWRQcmVzZXQgPSAnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbmMnO1xuY29uc3QgZ2VuZXJhdGVkU2V0dGluZ3MgPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogW3NoYXJlZFByZXNldF0sXG59O1xuXG50eXBlIFNldHRpbmdzID0gUGFydGlhbDx0eXBlb2YgZ2VuZXJhdGVkU2V0dGluZ3M+ICYge1xuICBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdO1xufTtcblxuY29uc3QgbWFuYWdlZEZpbGVOYW1lID0gJ3Jlbm92YXRlLmpzb25jJztcblxuLy8gd2JmeSBzdXBwb3J0cyBvbmUgY2Fub25pY2FsIFJlbm92YXRlIGxvY2F0aW9uLiBOb24tY2Fub25pY2FsIGNvbmZpZ3MgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbi8vIHJlcG9zaXRvcnkgaW5zdGVhZCBvZiBiZWluZyBwYXJzZWQsIG1lcmdlZCwgb3IgZGVsZXRlZCBoZXJlLlxuY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMgPSBbXG4gICdyZW5vdmF0ZS5qc29uJyxcbiAgJ3Jlbm92YXRlLmpzb241JyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbicsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb25jJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbjUnLFxuICAnLnJlbm92YXRlcmMnLFxuICAnLnJlbm92YXRlcmMuanNvbicsXG4gICcucmVub3ZhdGVyYy5qc29uNScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgbWFuYWdlZEZpbGVOYW1lKTtcbiAgICBjb25zdCBtYW5hZ2VkRmlsZVN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAobWFuYWdlZEZpbGVTdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMubWFwKGFzeW5jIChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGNhbmRpZGF0ZSkuY2F0Y2goKCkgPT4ge30pKSA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdQYXRoID0gbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAobm9uQ2Fub25pY2FsQ29uZmlnUGF0aCB8fCBjb25maWcucGFja2FnZUpzb24/LnJlbm92YXRlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgcmVwb3NpdG9yeSBoYXMgYSBub24tY2Fub25pY2FsIFJlbm92YXRlIGNvbmZpZyR7XG4gICAgICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA/IGAgYXQgJHtub25DYW5vbmljYWxDb25maWdQYXRofWAgOiAnIGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgfS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8U2V0dGluZ3M+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbGRTZXR0aW5ncz8uZXh0ZW5kcyAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4dGVuZHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiZXh0ZW5kc1wiIGlzIG5vdCBhbiBhcnJheS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZFByZXNldCA9IG9sZFNldHRpbmdzPy5leHRlbmRzPy5maW5kKFxuICAgICAgKHByZXNldCkgPT4gcHJlc2V0LnN0YXJ0c1dpdGgoJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOicpICYmIHByZXNldCAhPT0gc2hhcmVkUHJlc2V0XG4gICAgKTtcbiAgICBpZiAocmVtb3ZlZFByZXNldCkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcIiR7cmVtb3ZlZFByZXNldH1cIiBubyBsb25nZXIgZXhpc3RzOyByZW1vdmUgaXQgbWFudWFsbHkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSBidWlsZFNldHRpbmdzKGNvbmZpZywgb2xkU2V0dGluZ3MpO1xuICAgIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICAgIG9sZENvbnRlbnQsXG4gICAgICBuZXdTZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICk7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBub3JtYWxpemUoY29udGVudCkgPT09IG5vcm1hbGl6ZShvbGRDb250ZW50KSkgcmV0dXJuO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IFNldHRpbmdzIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBvbGRTZXR0aW5nc1xuICAgID8gKG1lcmdlLmFsbChbZ2VuZXJhdGVkU2V0dGluZ3MsIG9sZFNldHRpbmdzLCBnZW5lcmF0ZWRTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncylcbiAgICA6IHN0cnVjdHVyZWRDbG9uZShnZW5lcmF0ZWRTZXR0aW5ncyk7XG4gIGNvbnN0IGV4aXN0aW5nRXh0ZW5kcyA9IG9sZFNldHRpbmdzPy5leHRlbmRzID8/IFtdO1xuICBzZXR0aW5ncy5leHRlbmRzID0gY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzXG4gICAgPyBleGlzdGluZ0V4dGVuZHMuZmlsdGVyKChwcmVzZXQpID0+IHByZXNldCAhPT0gc2hhcmVkUHJlc2V0KVxuICAgIDogZXhpc3RpbmdFeHRlbmRzLmluY2x1ZGVzKHNoYXJlZFByZXNldClcbiAgICAgID8gZXhpc3RpbmdFeHRlbmRzXG4gICAgICA6IFtzaGFyZWRQcmVzZXQsIC4uLmV4aXN0aW5nRXh0ZW5kc107XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gIHJldHVybiB0cmltbWVkQ29udGVudCA/IHRyaW1tZWRDb250ZW50ICsgJ1xcbicgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgLy8gYGFwcC8qKmAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBldmVuIHRob3VnaCB0aGUgZG9lc0NvbnRhaW4qU2NyaXB0IHNpZ25hbHMgc2NhbiBpdDogYXBwXG4gIC8vIGRpcmVjdG9yaWVzIGJlbG9uZyB0byBmcmFtZXdvcmsgcGFja2FnZXMgKE5leHQuanMvQmxpdHopLCB3aGljaCBvd24gdGhlaXIgdHNjb25maWdcbiAgLy8gKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSksIGFuZCBjaGVja2luZyBmcmFtZXdvcmsgc291cmNlcyB1bmRlciB0aGlzIHByb2plY3QncyBjb21waWxlclxuICAvLyBvcHRpb25zIHdvdWxkIHByb2R1Y2UgZmFsc2UgZXJyb3JzLlxuICBpbmNsdWRlOiBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gdmluZXh0IGlzIHRoZSBvcmcncyBOZXh0LmpzLWVxdWl2YWxlbnQgZnJhbWV3b3JrIGFuZCBvd25zIGl0cyB0c2NvbmZpZyBqdXN0IGxpa2UgTmV4dC9CbGl0eixcbiAgICAvLyBzbyBpdCBtdXN0IHNraXAgdGhlIHN0YW5kYXJkIGdlbmVyYXRpb24gdGhhdCB3b3VsZCBvdmVyd3JpdGUgdGhlIGZyYW1ld29yaydzIG93biBzZXR0aW5ncy5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGF3YWl0IG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gKGNvbmZpZy5pc1Jvb3QgPyBidWlsZFJvb3RKc29uT2JqKGNvbmZpZykgOiBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRUeXBlcyA9IGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnJvb3REaXIgPSBnZXRSb290RGlyKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgLy8gUHJpc21hIHNlZWRzIGFuZCBtaWdyYXRpb24gaGVscGVyIHNjcmlwdHMgb2Z0ZW4gbGl2ZSBvdXRzaWRlIHNyYywgYnV0XG4gICAgICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgc3RpbGwgbmVlZHMgdGhlbSBjb3ZlcmVkIGJ5IHRoZSBwcm9qZWN0IGNvbmZpZy5cbiAgICAgIGFkZEluY2x1ZGVQYXRoKG5ld1NldHRpbmdzLCAncHJpc21hLyoqLyonKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9yaWdpbmFsU2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLy8gQSBmaWxlIHdpdGggbm8gY29uZmlndXJhdGlvbiAoZW1wdHkgb3IgY29tbWVudC1vbmx5KSBpcyB0cmVhdGVkIGxpa2UgYSBtaXNzaW5nIG9uZSwgYXMgdHNjIGRvZXMuXG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgICAvLyBBbiBleGlzdGluZyB0c2NvbmZpZy5qc29uIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlXG4gICAgICAvLyBnZW5lcmF0ZWQgc2V0dGluZ3Mgd2l0aG91dCBtZXJnaW5nIHdvdWxkIHNpbGVudGx5IGRpc2NhcmQgdGhlIHByb2plY3QncyBjb25maWd1cmF0aW9uLlxuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpKSk7XG4gICAgICBjb25zdCBleGlzdGluZ1R5cGVzID0gbm9ybWFsaXplU3RyaW5nQXJyYXkob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcyk7XG4gICAgICBjb25zdCBleGlzdGluZ0VtaXRNZXRhZGF0YSA9IHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgICAgICByZW1vdmVTdGFsZU1hbmFnZWRXb3Jrc3BhY2VFbnRyaWVzKGNvbmZpZywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgICAgIH1cbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICAvLyB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZy5qc29uIGlzIGEgbGludC90eXBlY2hlY2sgcHJvamVjdCwgbm90IHRoZSBlbWl0XG4gICAgICAvLyBjb250cmFjdC4gSXQgbXVzdCBrZWVwIHJvb3REaXIgYnJvYWQgZW5vdWdoIGZvciByb290IGNvbmZpZyBmaWxlcyxcbiAgICAgIC8vIHNjcmlwdHMsIHNyYywgYW5kIHRlc3RzLiBidWlsZC10cyBvd25zIGVtaXQgYW5kIGNyZWF0ZXMgYSB0ZW1wb3JhcnlcbiAgICAgIC8vIHNyYy1vbmx5IHRzY29uZmlnIHdpdGggbm9FbWl0PWZhbHNlLCBlbWl0RGVjbGFyYXRpb25Pbmx5PXRydWUsXG4gICAgICAvLyByb290RGlyPVwic3JjXCIsIGFuZCBpbmNsdWRlPVtcInNyYy8qKi8qXCJdLCBzbyBwcmVzZXJ2aW5nIG5vRW1pdD1mYWxzZSBvclxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiIGhlcmUgd291bGQgb25seSBicmVhayBub24tc3JjIHR5cGUtYXdhcmUgbGludCBjb3ZlcmFnZS5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRNZXRhZGF0YSB9O1xuXG4gICAgICBjb25zdCBtZXJnZWRUeXBlcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXMsIGdlbmVyYXRlZFR5cGVzKSwgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9XG4gICAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhuZXdTZXR0aW5ncywgY29uZmlnKTtcbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS11cC10by1kYXRlIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKG9yaWdpbmFsU2V0dGluZ3NKc29uID09PSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncykpIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIG1vbm9yZXBvLXJvb3QgdHNjb25maWcsIHdob3NlIGluY2x1ZGUvZXhjbHVkZSBjb3ZlciBldmVyeSBERUNMQVJFRCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuXG4gKiBgYXBwcy8qYCBhbG9uZ3NpZGUgYHBhY2thZ2VzLypgKSBzbyB0eXBlLWF3YXJlIGxpbnRpbmcgcnVuIGZyb20gdGhlIHJvb3Qgc2VlcyBhbGwgd29ya3NwYWNlXG4gKiBzb3VyY2VzLCBub3QganVzdCB0aGUgY29udmVudGlvbmFsIHBhY2thZ2VzLyogZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBidWlsZFJvb3RKc29uT2JqKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFRzQ29uZmlnSnNvbiB7XG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID0gY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zXG4gICAgPyBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhjb25maWcpXG4gICAgOiB7IGV4Y2x1ZGVzOiBbXSwgaW5jbHVkZXM6IFtdIH07XG4gIGNvbnN0IHNldHRpbmdzID0gc3RydWN0dXJlZENsb25lKHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgc2V0dGluZ3MuZXhjbHVkZSA9IFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmluY2x1ZGVzLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gYCR7d29ya3NwYWNlUGF0dGVybn0vdGVzdC9maXh0dXJlc2ApLFxuICAgICAgLy8gTmVnYXRpdmUgd29ya3NwYWNlIHBhdHRlcm5zIChlLmcuIGAhcGFja2FnZXMvZXhjbHVkZWRgKSBvcHQgd29ya3NwYWNlIHN1YnRyZWVzIG91dCBvZiB0aGVcbiAgICAgIC8vIG1vbm9yZXBvLCBzbyB0aGVpciBzb3VyY2VzIG11c3Qgbm90IGVudGVyIHRoZSByb290IHR5cGUtY2hlY2sgcHJvamVjdCBlaXRoZXIuIEEgbmVnYXRpb25cbiAgICAgIC8vIHdob3NlIGRpcmVjdG9yeSBpcyBhbiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSB5aWVsZHMgcGFja2FnZS1vd25lZCBzdWJwYXRoIGVudHJpZXNcbiAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHdob2xlIHN1YnRyZWUgKHNlZSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykuXG4gICAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5leGNsdWRlcyxcbiAgICAgIC8vIFRoZSBtYW5hZ2VkIGluY2x1ZGVzIGFib3ZlIGRlbGliZXJhdGVseSBvbWl0IGZyYW1ld29yayBgYXBwLyoqYCBkaXJlY3RvcmllcyAoc2VlXG4gICAgICAvLyBzdWJKc29uT2JqLmluY2x1ZGUncyBjb21tZW50KSwgYnV0IGEgcmVwby1hdXRob3JlZCBicm9hZCBpbmNsdWRlIHN1Y2ggYXMgYGUyZS8qKlxcLypgXG4gICAgICAvLyBjYW4gc3RpbGwgZHJhZyBhIGZyYW1ld29yayB3b3Jrc3BhY2UncyBhcHAgc291cmNlcyBpbnRvIHRoZSByb290IHByb2plY3QsIHdoZXJlIHRoZXlcbiAgICAgIC8vIGZhaWwgdW5kZXIgdGhlIHJvb3QgY29tcGlsZXIgb3B0aW9ucyDigJQgdGhlaXIgYmFyZSBgbmV4dC8qYCBpbXBvcnRzIHJlc29sdmUgb25seSB0aHJvdWdoXG4gICAgICAvLyB0aGUgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIG93biB0c2NvbmZpZyBgcGF0aHNgLiBFeGNsdWRlIHRob3NlIGFwcCBkaXJlY3RvcmllcyBzbyB0aGVcbiAgICAgIC8vIHJvb3QgcHJvamVjdCBuZXZlciB0eXBlLWNoZWNrcyB0aGVtLCBubyBtYXR0ZXIgaG93IGJyb2FkIHRoZSByZXBvJ3MgaW5jbHVkZSBnbG9icyBhcmUuXG4gICAgICAuLi5nZXRGcmFtZXdvcmtXb3Jrc3BhY2VBcHBFeGNsdWRlcyhjb25maWcpLFxuICAgICAgLi4uKHNldHRpbmdzLmV4Y2x1ZGUgPz8gW10pLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG4gIHNldHRpbmdzLmluY2x1ZGUgPSBbXG4gICAgLi4uKHNldHRpbmdzLmluY2x1ZGUgPz8gW10pLFxuICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmluY2x1ZGVzLmZsYXRNYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IFtcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59LyouY29uZmlnLnRzYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NjcmlwdHMvKiovKmAsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS9zcmMvKiovKmAsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0LyoqLypgLFxuICAgIF0pLFxuICBdO1xuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbi8vIEZyYW1ld29yayBwYWNrYWdlcyBvd24gdGhlaXIgdHNjb25maWcgKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSkgYW5kIHNoaW0gYmFyZSBpbXBvcnRzIHN1Y2ggYXNcbi8vIGBuZXh0L25hdmlnYXRpb25gIHRocm91Z2ggcGFja2FnZS1sb2NhbCBgcGF0aHNgOyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmtcbi8vIGFuZCBiZWhhdmVzIHRoZSBzYW1lLiBUaGVpciBhcHAgc291cmNlcyB0aGVyZWZvcmUgb25seSB0eXBlLWNoZWNrIHVuZGVyIHRoZWlyIG93biBjb25maWcuXG5jb25zdCBmcmFtZXdvcmtEZXBlbmRlbmN5TmFtZXMgPSBbJ2JsaXR6JywgJ25leHQnLCAndmluZXh0J107XG5cbi8vIEEgZnJhbWV3b3JrIGFwcCBsaXZlcyBpbiBgYXBwL2Agb3IsIHVuZGVyIHRoZSBzcmMtZGlyZWN0b3J5IGxheW91dCwgYHNyYy9hcHAvYC4gVGhlIHJvb3QgcHJvamVjdFxuLy8gaW5jbHVkZXMgYDx3b3Jrc3BhY2U+L3NyYy8qKi8qYCwgc28gYHNyYy9hcHBgIGxlYWtzIGluIGp1c3QgYXMgYSByZXBvLXdpZGUgZ2xvYiBjYW4gcHVsbCBpbiBgYXBwYC5cbmNvbnN0IGZyYW1ld29ya0FwcERpck5hbWVzID0gWydhcHAnLCAnc3JjL2FwcCddO1xuXG4vKiogUm9vdCBgZXhjbHVkZWAgZW50cmllcyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSByb290KSBmb3IgZXZlcnkgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBkaXJlY3RvcnkuICovXG5mdW5jdGlvbiBnZXRGcmFtZXdvcmtXb3Jrc3BhY2VBcHBFeGNsdWRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSByZXR1cm4gW107XG4gIGNvbnN0IGV4Y2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZURpclBhdGggb2YgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKSkge1xuICAgIGlmICghZGVwZW5kc09uRnJhbWV3b3JrKHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGFwcERpck5hbWUgb2YgZnJhbWV3b3JrQXBwRGlyTmFtZXMpIHtcbiAgICAgIGNvbnN0IGFwcERpclBhdGggPSBwYXRoLnJlc29sdmUod29ya3NwYWNlRGlyUGF0aCwgYXBwRGlyTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhhcHBEaXJQYXRoKSkgZXhjbHVkZXMucHVzaChwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBhcHBEaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBleGNsdWRlcztcbn1cblxuZnVuY3Rpb24gZGVwZW5kc09uRnJhbWV3b3JrKG1hbmlmZXN0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBtYW5pZmVzdDogUGFja2FnZUpzb24gfCBudWxsO1xuICB0cnkge1xuICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBBIG1hbmlmZXN0IHRoYXQgcGFyc2VzIHRvIGEgbm9uLW9iamVjdCAoZS5nLiBhIGZpbGUgbGl0ZXJhbGx5IGNvbnRhaW5pbmcgYG51bGxgKSBkZWNsYXJlcyBub1xuICAvLyBkZXBlbmRlbmNpZXM7IGd1YXJkIHRoZSBwcm9wZXJ0eSBhY2Nlc3MsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSB0aHJvdyBvdXRzaWRlIHRoZSB0cnkgYWJvdmUuXG4gIGlmICghbWFuaWZlc3QgfHwgdHlwZW9mIG1hbmlmZXN0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7IC4uLm1hbmlmZXN0LmRlcGVuZGVuY2llcywgLi4ubWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzIH07XG4gIHJldHVybiBmcmFtZXdvcmtEZXBlbmRlbmN5TmFtZXMuc29tZSgoZGVwZW5kZW5jeU5hbWUpID0+IGRlcGVuZGVuY2llc1tkZXBlbmRlbmN5TmFtZV0pO1xufVxuXG5jb25zdCBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzID0gWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ107XG5cbi8qKlxuICogUm9vdCBpbmNsdWRlL2V4Y2x1ZGUgZW50cmllcyB3YmZ5IGdlbmVyYXRlZCBmb3IgYW4gZWFybGllciB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGBwYWNrYWdlcy8qYFxuICogZ2xvYnMgaW4gYSByZXBvIHRoYXQgbm93IGRlY2xhcmVzIG9ubHkgYGFwcHMvKmApIG11c3Qgbm90IHN1cnZpdmUgdGhlIG1lcmdlIHdpdGggdGhlIGV4aXN0aW5nXG4gKiB0c2NvbmZpZywgb3IgdGhlIG9ic29sZXRlIGRpcmVjdG9yaWVzIHdvdWxkIGtlZXAgZW50ZXJpbmcgcm9vdCB0eXBlIGNoZWNraW5nIGZvcmV2ZXIuIEEgcHJlZml4XG4gKiBjb3VudHMgYXMgd2JmeS1tYW5hZ2VkIG9ubHkgd2hlbiB0aGUgQ09NUExFVEUgZ2VuZXJhdGVkIGluY2x1ZGUgc2V0IGZvciBpdCBpcyBwcmVzZW50IGFuZCBub1xuICogbG9uZ2VyIGdlbmVyYXRlZCDigJQgYSB1c2VyLWF1dGhvcmVkIGVudHJ5IHN1Y2ggYXMgYSBsb25lIGB0b29scy8qXFwvc3JjLyoqXFwvKmAgbmV2ZXIgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiByZW1vdmVTdGFsZU1hbmFnZWRXb3Jrc3BhY2VFbnRyaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIG9sZFNldHRpbmdzOiBUc0NvbmZpZ0pzb24sXG4gIG5ld1NldHRpbmdzOiBUc0NvbmZpZ0pzb25cbik6IHZvaWQge1xuICBjb25zdCBzdGFsZVByZWZpeGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmluY2x1ZGUpKSB7XG4gICAgY29uc3Qgb2xkSW5jbHVkZSA9IG9sZFNldHRpbmdzLmluY2x1ZGUuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRJbmNsdWRlID0gbmV3IFNldChuZXdTZXR0aW5ncy5pbmNsdWRlKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG9sZEluY2x1ZGUpIHtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpO1xuICAgICAgaWYgKHdvcmtzcGFjZVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8IHN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaXNDb21wbGV0ZSA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuZXZlcnkoKHN1ZmZpeCkgPT5cbiAgICAgICAgb2xkSW5jbHVkZS5pbmNsdWRlcyhgJHt3b3Jrc3BhY2VQcmVmaXh9LyR7c3VmZml4fWApXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTdGlsbEdlbmVyYXRlZCA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuc29tZSgoc3VmZml4KSA9PlxuICAgICAgICBnZW5lcmF0ZWRJbmNsdWRlLmhhcyhgJHt3b3Jrc3BhY2VQcmVmaXh9LyR7c3VmZml4fWApXG4gICAgICApO1xuICAgICAgaWYgKGlzQ29tcGxldGUgJiYgIWlzU3RpbGxHZW5lcmF0ZWQpIHN0YWxlUHJlZml4ZXMuYWRkKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgfVxuICAgIGlmIChzdGFsZVByZWZpeGVzLnNpemUgPiAwKSB7XG4gICAgICBvbGRTZXR0aW5ncy5pbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgPyBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8ICFzdGFsZVByZWZpeGVzLmhhcyh3b3Jrc3BhY2VQcmVmaXgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5leGNsdWRlKSkgcmV0dXJuO1xuICBjb25zdCBnZW5lcmF0ZWRFeGNsdWRlID0gbmV3IFNldChuZXdTZXR0aW5ncy5leGNsdWRlKTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKGNvbmZpZykubWFwKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PlxuICAgICAgICBwYXRoLnJlbGF0aXZlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCksIHdvcmtzcGFjZURpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpXG4gICAgICApXG4gICAgOiBbXTtcbiAgb2xkU2V0dGluZ3MuZXhjbHVkZSA9IG9sZFNldHRpbmdzLmV4Y2x1ZGUuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdzdHJpbmcnIHx8IGdlbmVyYXRlZEV4Y2x1ZGUuaGFzKGVudHJ5KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGVudHJ5LmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpKSB7XG4gICAgICByZXR1cm4gIXN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0nL3Rlc3QvZml4dHVyZXMnLmxlbmd0aCkpO1xuICAgIH1cbiAgICAvLyBBIGZyYW1ld29yayBhcHAgZXhjbHVkZSAoYDx3b3Jrc3BhY2U+L2FwcGAsIGA8d29ya3NwYWNlPi9zcmMvYXBwYCkgZm9yIGEgc3RpbGwtZGVjbGFyZWRcbiAgICAvLyB3b3Jrc3BhY2UgaXMgcHJ1bmVkIGJ5IGNvdmVyc1dvcmtzcGFjZURpciBiZWxvdyB3aGVuIG5vIGxvbmdlciBnZW5lcmF0ZWQ7IHRoaXMgY2F0Y2hlcyB0aGVcbiAgICAvLyByZW1haW5pbmcgY2FzZSwgd2hlcmUgdGhlIHdvcmtzcGFjZSBpdHNlbGYgd2FzIHJlbW92ZWQgYW5kIGl0cyBwcmVmaXggaXMgdGhlcmVmb3JlIHN0YWxlLlxuICAgIC8vIChBIHdyb25nIHN1ZmZpeCBzdHJpcCB5aWVsZHMgYSBwcmVmaXggYWJzZW50IGZyb20gc3RhbGVQcmVmaXhlcywgc28gdGVzdGluZyBldmVyeSBuYW1lIGlzIHNhZmUuKVxuICAgIGlmIChcbiAgICAgIGZyYW1ld29ya0FwcERpck5hbWVzLnNvbWUoXG4gICAgICAgIChhcHBEaXJOYW1lKSA9PiBlbnRyeS5lbmRzV2l0aChgLyR7YXBwRGlyTmFtZX1gKSAmJiBzdGFsZVByZWZpeGVzLmhhcyhlbnRyeS5zbGljZSgwLCAtKGFwcERpck5hbWUubGVuZ3RoICsgMSkpKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIWNvdmVyc1dvcmtzcGFjZURpcihlbnRyeSwgd29ya3NwYWNlRGlyUGF0aHMpO1xuICB9KTtcbn1cblxuLy8gV2hldGhlciBhbiBleGNsdWRlIGVudHJ5IGlzIGEgd29ya3NwYWNlIG5lZ2F0aW9uIChgIWFwcHMvZXhjbHVkZWRgKSB3aG9zZSBuZWdhdGlvbiBpcyBnb25lOiB0aGVcbi8vIGRpcmVjdG9yeSBpcyBhIHdvcmtzcGFjZSBhZ2FpbiBhbmQgbXVzdCByZS1lbnRlciB0aGUgcm9vdCBwcm9qZWN0LiB3YmZ5IHdyaXRlcyBzdWNoIGEgbmVnYXRpb24gYXNcbi8vIGEgZGlyZWN0b3J5IHBhdGgsIGFzIGEgZGlyZWN0b3J5IFBBVFRFUk4gd2hlbiBpdCBleGNsdWRlcyBleGFjdGx5IHdoYXQgaXQgbWF0Y2hlcyAoYGFwcHMvKmJgKSwgb3Jcbi8vIGFzIGFuIGFuY2VzdG9yJ3MgcGFja2FnZS1vd25lZCBzdWJwYXRocyAoYGFwcHMveC9zcmNgKSDigJQgc28gdGhlIGVudHJ5IG1heSBjb3ZlciBhIGRpc2NvdmVyZWRcbi8vIHdvcmtzcGFjZSBkaXJlY3Rvcnkgb3Igc2l0IHVuZGVyIG9uZS4gQSBnbG9ic3RhciBzZWdtZW50IG1hcmtzIGEgaHlnaWVuZSBnbG9iIChub2RlX21vZHVsZXMsIGUyZVxuLy8gYW5kIGZyaWVuZHMpLCB3aGljaCBpcyBuZXZlciBuZWdhdGlvbi1kZXJpdmVkIGFuZCBtdXN0IHN1cnZpdmUuXG5mdW5jdGlvbiBjb3ZlcnNXb3Jrc3BhY2VEaXIoZW50cnk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChlbnRyeS5zcGxpdCgnLycpLmluY2x1ZGVzKCcqKicpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gZW50cnlcbiAgICAuc3BsaXQoJy8nKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+XG4gICAgICBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsICdbXi9dKicpXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgJ1teL10nKVxuICAgIClcbiAgICAuam9pbignLycpO1xuICBjb25zdCBlbnRyeVBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0oPzovLiopPyRgLCAndScpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyUGF0aHMuc29tZShcbiAgICAod29ya3NwYWNlRGlyUGF0aCkgPT4gZW50cnlQYXR0ZXJuLnRlc3Qod29ya3NwYWNlRGlyUGF0aCkgfHwgZW50cnkuc3RhcnRzV2l0aChgJHt3b3Jrc3BhY2VEaXJQYXRofS9gKVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkU3VmZml4ID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5maW5kKChzdWZmaXgpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHtzdWZmaXh9YCkpO1xuICBpZiAoIW1hdGNoZWRTdWZmaXgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IGVudHJ5LnNsaWNlKDAsIC0obWF0Y2hlZFN1ZmZpeC5sZW5ndGggKyAxKSk7XG4gIHJldHVybiB3b3Jrc3BhY2VQcmVmaXggPT09ICcnID8gdW5kZWZpbmVkIDogd29ya3NwYWNlUHJlZml4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVGcmFtZXdvcmtUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gTmV4dC9CbGl0eiBvd24gdGhlaXIgdHNjb25maWcgc2hhcGUsIGJ1dCBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGFjY2VwdHNcbiAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICBjb25zdCBzZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VHNDb25maWdKc29uPihleGlzdGluZ0NvbnRlbnQpO1xuICBpZiAoIXNldHRpbmdzKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGNsZWFuaW5nIHVwICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3MpO1xuICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzLCBjb25maWcpO1xuICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gIC8vIGFscmVhZHktY2xlYW4gdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+XG4gICAgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpXG4gICk7XG59XG5cbi8qKlxuICogYnVuLXR5cGVzIHJlZmVyZW5jZXMgdW5kaWNpLXR5cGVzIHdpdGhvdXQgZGVjbGFyaW5nIGl0IGFzIGEgZGVwZW5kZW5jeSAob3Zlbi1zaC9idW4jMjI4MDUpLCBzb1xuICogQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIChlc3BlY2lhbGx5IHdpdGggdGhlIGdsb2JhbCBzdG9yZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5KSBjYW5ub3QgcmVzb2x2ZVxuICogaXQgZnJvbSBidW4tdHlwZXMnIGxvY2F0aW9uLCB3aGljaCBzaWxlbnRseSBkZWdyYWRlcyBnbG9iYWwgZmV0Y2ggdHlwZXMgc3VjaCBhcyBSZXNwb25zZS4gTWFwIGl0XG4gKiB0byB0aGUgY29weSB0aGF0IGJ1bmZpZy50b21sJ3MgcHVibGljSG9pc3RQYXR0ZXJuIHBsYWNlcyBpbiB0aGUgcm9vdCBub2RlX21vZHVsZXMuXG4gKi9cbmZ1bmN0aW9uIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIE1hcCB1bmRpY2ktdHlwZXMgb25seSB3aGVuIGJ1bi10eXBlcyBhY3R1YWxseSBsb2FkczogYW4gZXhwbGljaXQgYHR5cGVzYCBsaXN0IGxvYWRzIGl0IGlmZiBpdFxuICAvLyBjb250YWlucyBcImJ1blwiIChldmVuIG9uIFJlYWN0IE5hdGl2ZSwgd2hvc2UgcHJvamVjdHMgbWF5IG9wdCBpbiBieSBoYW5kKTsgd2l0aCBgdHlwZXNgXG4gIC8vIG9taXR0ZWQsIFR5cGVTY3JpcHQncyBhdXRvbWF0aWMgQHR5cGVzIGluY2x1c2lvbiBsb2FkcyBpdCBiZWNhdXNlIHdiZnkgaW5zdGFsbHMgQHR5cGVzL2J1blxuICAvLyBmb3IgZXZlcnkgSmF2YVNjcmlwdCBvciBUeXBlU2NyaXB0IHByb2plY3QgZXhjZXB0IFJlYWN0IE5hdGl2ZSwgd2hpY2ggdXNlc1xuICAvLyBAdHNjb25maWcvcmVhY3QtbmF0aXZlIGluc3RlYWQuXG4gIGNvbnN0IHR5cGVzID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcztcbiAgaWYgKHR5cGVzID8gIXR5cGVzLmluY2x1ZGVzKCdidW4nKSA6IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHJldHVybjtcbiAgY29uc3QgY29ycmVjdE1hcHBpbmcgPSBgJHtnZXRSb290RGlyKGNvbmZpZyl9L25vZGVfbW9kdWxlcy91bmRpY2ktdHlwZXMvaW5kZXguZC50c2A7XG4gIGNvbnN0IGV4aXN0aW5nTWFwcGluZyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ucGF0aHM/LlsndW5kaWNpLXR5cGVzJ107XG4gIGlmIChleGlzdGluZ01hcHBpbmcpIHtcbiAgICAvLyBSZXdyaXRlIHRoZSBnZW5lcmF0ZWQgbWFwcGluZyB3aGVuIGEgd29ya3NwYWNlIG1vdmVzIHRvIGEgZGlmZmVyZW50IHJvb3QgZGVwdGguIEFueSBvdGhlclxuICAgIC8vIHZhbHVlIGlzIGEgZGVsaWJlcmF0ZSByZXBvLWxvY2FsIG1hcHBpbmcgKGUuZy4gcGF0Y2hlZCB0eXBlcykgYW5kIG11c3QgYmUga2VwdC5cbiAgICBpZiAoXG4gICAgICBleGlzdGluZ01hcHBpbmcubGVuZ3RoID09PSAxICYmXG4gICAgICB0eXBlb2YgZXhpc3RpbmdNYXBwaW5nWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgLyg/Ol58XFwvKW5vZGVfbW9kdWxlc1xcL3VuZGljaS10eXBlc1xcL2luZGV4XFwuZFxcLnRzJC91LnRlc3QoZXhpc3RpbmdNYXBwaW5nWzBdKVxuICAgICkge1xuICAgICAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zIS5wYXRocyFbJ3VuZGljaS10eXBlcyddID0gW2NvcnJlY3RNYXBwaW5nXTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnBhdGhzID0ge1xuICAgIC4uLnNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyxcbiAgICAndW5kaWNpLXR5cGVzJzogW2NvcnJlY3RNYXBwaW5nXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGlmIChzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKCdzY3JpcHRzLyoqLyonKSkgcmV0dXJuO1xuXG4gIHNldHRpbmdzLmluY2x1ZGUucHVzaCgnc2NyaXB0cy8qKi8qJyk7XG4gIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIC8vIFRoZSB1bmRpY2ktdHlwZXMgcGF0aCBtYXBwaW5nIG11c3QgcmVhY2ggdGhlIG1vbm9yZXBvIHJvb3QncyBub2RlX21vZHVsZXMgKGJ1bmZpZy50b21sJ3NcbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIGhvaXN0cyB0aGUgcGFja2FnZSB0aGVyZSksIGFuZCB3b3Jrc3BhY2UgcGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXBcbiAgLy8gKGUuZy4gYGV4YW1wbGVzLyoqYCksIHNvIGEgZml4ZWQgdHdvLWxldmVsIHByb2JlIGlzIG5vdCBlbm91Z2guIFByZWZlciB0aGUgbmVhcmVzdCBhbmNlc3RvclxuICAvLyBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIHdvcmtzcGFjZXMgKHRoZSBtb25vcmVwbyByb290KTsgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbmVhcmVzdFxuICAvLyBhbmNlc3RvciBtYW5pZmVzdC4gU3RvcCBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZ1xuICAvLyByZXBvc2l0b3J5J3MgbWFuaWZlc3QgY2FuIG5ldmVyIGJlIGNob3Nlbi5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCk7XG4gIGxldCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7IDsgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCkpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgcm9vdERpclBhdGggPz89IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgICAgLy8gQnVuIG5vLW9wIHBhdHRlcm5zIChlLmcuIGB3b3Jrc3BhY2VzOiBbXCJcIl1gKSBkbyBub3QgbWFrZSBhIG1hbmlmZXN0IGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICAgIGlmIChnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhtYW5pZmVzdC53b3Jrc3BhY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcm9vdERpclBhdGggPSBhbmNlc3RvckRpclBhdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBbiB1bnBhcnNhYmxlIG1hbmlmZXN0IHN0aWxsIG1hcmtzIGEgcHJvamVjdCBkaXJlY3Rvcnk7IGtlZXAgY2xpbWJpbmcgZm9yIGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gYW5jZXN0b3JEaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgYnJlYWs7XG4gIH1cbiAgaWYgKCFyb290RGlyUGF0aCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgcm9vdERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpIHx8ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VTZXR0aW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIFJlYWN0IE5hdGl2ZSBnZXRzIGl0cyBhbWJpZW50IHR5cGVzIGZyb20gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSAocmVhY3QtbmF0aXZlLCBqZXN0KS5cbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGUgb2YgZWFjaCBzdXBwb3J0ZWQgYWdlbnQsIHJlbGF0aXZlIHRvIHRoZSBob21lIGRpcmVjdG9yeS4gVGhlc2VcbiAqIGFwcGx5IHRvIGV2ZXJ5IHJlcG9zaXRvcnkgdGhlIGFnZW50IHdvcmtzIGluLCBzbyB0aGV5IGhvbGQgb25seSB0aGUgY29udmVudGlvbnMgdGhhdCBhcmUgdHJ1ZSBvblxuICogZXZlcnkgV2lsbEJvb3N0ZXIgZGV2ZWxvcGVyIG1hY2hpbmUgcmF0aGVyIHRoYW4gaW4gYSBwYXJ0aWN1bGFyIHJlcG9zaXRvcnkuXG4gKi9cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzID0gWycuY29kZXgvQUdFTlRTLm1kJywgJy5jbGF1ZGUvQ0xBVURFLm1kJywgJy5nZW1pbmkvR0VNSU5JLm1kJ10gYXMgY29uc3Q7XG5cbi8vIFRoaXMgY29udGVudCBpcyBsb2FkZWQgaW50byBldmVyeSBhZ2VudCBzZXNzaW9uLCBzbyBpdCBpcyBrZXB0IGFzIHNob3J0IGFzIGl0IGNhbiBiZSB3aGlsZVxuLy8gc3RheWluZyB1bmFtYmlndW91czogZS5nLiwgdGhlIGV4Y2x1ZGVkIG9yZ2FuaXphdGlvbnMgYXJlIHdyaXR0ZW4gYXMgc2hlbGwgYnJhY2UgZXhwYW5zaW9uLCB3aGljaFxuLy8gdGhlIGFnZW50cyByZWFkIGFzIGEgcGF0aCBjb25kaXRpb24gd2l0aG91dCBhbnkgcnVudGltZSBtYXRjaGluZy5cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCA9IGAtIFJlcG9zIGxpdmUgdW5kZXIgXFxgfi9naHEvZ2l0aHViLmNvbVxcYDsgYWx3YXlzIGNsb25lIHdpdGggXFxgZ2hxIGdldCAtcFxcYCwgbmV2ZXIgXFxgZ2l0IGNsb25lXFxgLlxuLSBMTE0vQUkgYWdlbnQgcmVzcG9uc2VzIG1heSB0YWtlIDHigJMyIGhvdXJzOyB3YWl0IHBhdGllbnRseSwgZG9uJ3QgYXNzdW1lIGZhaWx1cmUuXG4tIE5vIEFJIGF0dHJpYnV0aW9uIChlLmcuLCBcXGBDby1BdXRob3JlZC1CeVxcYCB0cmFpbGVycywgXCJHZW5lcmF0ZWQgd2l0aCAuLi5cIiBmb290ZXJzKSBpbiBjb21taXRzLCBpc3N1ZXMsIG9yIFBScyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgaGlkZXMgbm90aGluZzogaWYgYXNrZWQgd2hpY2ggQUkgYWdlbnQgZGlkIHRoZSB3b3JrLCBhbnN3ZXIgdHJ1dGhmdWxseS5cbi0gT3V0c2lkZSBcXGB+L2docS9naXRodWIuY29tL3tXaWxsQm9vc3RlcixXaWxsQm9vc3RlckxhYn0vXFxgLCBmb2xsb3cgdGhlIHJlcG9zaXRvcnkncyBjb250cmlidXRpb24gZ3VpZGUgKGUuZy4sIENPTlRSSUJVVElORy5tZCwgXFxgLmdpdGh1Yi9cXGApIGFuZCBpc3N1ZS9QUiB0ZW1wbGF0ZXMsIG1hdGNoIGl0cyBjb21taXQgYW5kIGNvZGUgY29udmVudGlvbnMsIGFuZCBob25vciBpdHMgcnVsZXMgb24gQUktYXNzaXN0ZWQgY29udHJpYnV0aW9ucy4gV3JpdGUgaXRzIGlzc3VlcyBhbmQgUFJzIHdpdGggb25seSB3aGF0IGEgcmV2aWV3ZXIgdW5mYW1pbGlhciB3aXRoIHRoZSB3b3JrIG5lZWRzIHRvIHVuZGVyc3RhbmQgYW5kIGFzc2VzcyBpdCwgYXMgY29uY2lzZWx5IGFzIHRoYXQgY29udGV4dCBhbGxvd3MuXG5gO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIHNldHRpbmdzIG1lcmdlZCBpbnRvIGVhY2ggYWdlbnQncyBKU09OIHNldHRpbmdzIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSBob21lXG4gKiBkaXJlY3RvcnkuXG4gKlxuICogRXZlcnkgYWdlbnQgdGhhdCBjYXJyaWVzIGZhY3RzIGZyb20gb25lIHNlc3Npb24gaW50byB0aGUgbmV4dCBpcyB0dXJuZWQgb2ZmIGhlcmUgYmVjYXVzZSBzdWNoXG4gKiBtZW1vcnkgbWFrZXMgYSBzZXNzaW9uIGRlcGVuZCBvbiBpbnZpc2libGUgbWFjaGluZS1sb2NhbCBzdGF0ZTogaXRzIGJlaGF2aW9yIHN0b3BzIGJlaW5nXG4gKiByZXByb2R1Y2libGUgYWNyb3NzIGRldmVsb3BlcnMgYW5kIENJLCBhbmQgYSBzdGFsZSBvciB3cm9uZyBtZW1vcnkgc2lsZW50bHkgb3ZlcnJpZGVzIHRoZVxuICogaW5zdHJ1Y3Rpb24gZmlsZXMgYWJvdmUuIENvZGV4IG5lZWRzIG5vIGVudHJ5IGJlY2F1c2UgaXRzIG1lbW9yaWVzIGFyZSBvcHQtaW5cbiAqIChgW2ZlYXR1cmVzXSBtZW1vcmllcyA9IHRydWVgIGluIGB+Ly5jb2RleC9jb25maWcudG9tbGApLCBzbyBsZWF2aW5nIHRoYXQgZmxhZyB1bnNldCBpcyBlbm91Z2guXG4gKi9cbmNvbnN0IGFnZW50U2V0dGluZ3MgPSBbXG4gIHtcbiAgICByZWxhdGl2ZVBhdGg6ICcuY2xhdWRlL3NldHRpbmdzLmpzb24nLFxuICAgIGFjY2VwdHNDb21tZW50czogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQ2xhdWRlIENvZGUgaW5qZWN0cyBpdHMgb3duIGF0dHJpYnV0aW9uIGRpcmVjdGl2ZSAoYSBgQ28tQXV0aG9yZWQtQnlgIHRyYWlsZXIsIGEgXCJHZW5lcmF0ZWRcbiAgICAgKiB3aXRoXCIgZm9vdGVyLCBhbmQgYSBzZXNzaW9uIGxpbmspIGludG8gdGhlIHRvb2wgZGVzY3JpcHRpb25zIGFuZCBtaWQtc2Vzc2lvbiByZW1pbmRlcnMsIGFuZFxuICAgICAqIHRoYXQgZGlyZWN0aXZlIGRlY2xhcmVzIGl0c2VsZiB0byByZXBsYWNlIGVhcmxpZXIgZ3VpZGFuY2UsIHNvIHRoZSBpbnN0cnVjdGlvbiBmaWxlIGFsb25lXG4gICAgICogY2Fubm90IHN1cHByZXNzIGl0LiBPbmx5IHRoaXMgc2V0dGluZyByZW1vdmVzIHRoZSBkaXJlY3RpdmUgYXQgaXRzIHNvdXJjZS4gQXV0byBtZW1vcnkgaXMgb25cbiAgICAgKiBieSBkZWZhdWx0LCBzbyBpdCBtdXN0IGJlIHR1cm5lZCBvZmYgZXhwbGljaXRseS5cbiAgICAgKi9cbiAgICBzZXR0aW5nczoge1xuICAgICAgYXR0cmlidXRpb246IHtcbiAgICAgICAgY29tbWl0OiAnJyxcbiAgICAgICAgcHI6ICcnLFxuICAgICAgICBzZXNzaW9uVXJsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBhdXRvTWVtb3J5RW5hYmxlZDogZmFsc2UsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHJlbGF0aXZlUGF0aDogJy5nZW1pbmkvc2V0dGluZ3MuanNvbicsXG4gICAgLy8gR2VtaW5pIENMSSBzdHJpcHMgY29tbWVudHMgYmVmb3JlIHBhcnNpbmcgaXRzIHNldHRpbmdzIGZpbGUsIHVubGlrZSBDbGF1ZGUgQ29kZSwgd2hpY2hcbiAgICAvLyByZWplY3RzIGEgY29tbWVudGVkIGZpbGUgYXMgbWFsZm9ybWVkLlxuICAgIGFjY2VwdHNDb21tZW50czogdHJ1ZSxcbiAgICBzZXR0aW5nczoge1xuICAgICAgZXhwZXJpbWVudGFsOiB7XG4gICAgICAgIGF1dG9NZW1vcnk6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBPdmVyd3JpdGVzIHRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGVzIG9mIGV2ZXJ5IHN1cHBvcnRlZCBhZ2VudCB3aXRoIHRoZSBmaXhlZCBjb250ZW50IGFuZFxuICogbWVyZ2VzIHRoZSBmaXhlZCBzZXR0aW5ncyBpbnRvIGVhY2ggYWdlbnQncyB1c2VyIHNldHRpbmdzLiBSZXR1cm5zIGZhbHNlIHdoZW4gYW55IGZpbGUgd2FzXG4gKiBza2lwcGVkIChlLmcuIGEgc3ltbGlua2VkIG9yIHVucGFyc2FibGUgZmlsZSksIHNvIHRoZSBjb21tYW5kIGNhbiBmYWlsIGxvdWRseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgbGV0IGhhc1dyaXR0ZW5BbGwgPSB0cnVlO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiB1c2VyQWdlbnRJbnN0cnVjdGlvbkZpbGVQYXRocykge1xuICAgIGNvbnN0IGhhc1dyaXR0ZW4gPSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCksIHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzV3JpdHRlbjtcbiAgfVxuICBmb3IgKGNvbnN0IHsgYWNjZXB0c0NvbW1lbnRzLCByZWxhdGl2ZVBhdGgsIHNldHRpbmdzIH0gb2YgYWdlbnRTZXR0aW5ncykge1xuICAgIC8vIEF3YWl0ZWQgc2VwYXJhdGVseTogYCYmPWAgd291bGQgc2tpcCB0aGUgbWVyZ2Ugb25jZSBhbiBlYXJsaWVyIGZpbGUgd2FzIHNraXBwZWQuXG4gICAgY29uc3QgaGFzTWVyZ2VkID0gYXdhaXQgbWVyZ2VBZ2VudFNldHRpbmdzKHJlbGF0aXZlUGF0aCwgc2V0dGluZ3MsIGFjY2VwdHNDb21tZW50cyk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzTWVyZ2VkO1xuICB9XG4gIHJldHVybiBoYXNXcml0dGVuQWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtZXJnZUFnZW50U2V0dGluZ3MoXG4gIHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuICBuZXdTZXR0aW5nczogb2JqZWN0LFxuICBhY2NlcHRzQ29tbWVudHM6IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgbGV0IGV4aXN0aW5nU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEFuIGFnZW50IGlnbm9yZXMgaXRzIHdob2xlIHNldHRpbmdzIGZpbGUgd2hlbiB0aGUgZmlsZSBicmVha3MgdGhlIGdyYW1tYXIgdGhlIGFnZW50IHJlYWRzIGl0XG4gICAgLy8gd2l0aCwgc28gd2JmeSBsZWF2ZXMgc3VjaCBhIGZpbGUgdG8gdGhlIGRldmVsb3BlciB0byByZXBhaXIgcmF0aGVyIHRoYW4gcmV3cml0aW5nIGl0IGludG8gYVxuICAgIC8vIGZpbGUgdGhlIGFnZW50IHN0aWxsIGlnbm9yZXM6IGNvbW1lbnRzIGFyZSB0b2xlcmF0ZWQgb25seSB3aGVyZSB0aGUgYWdlbnQgc3RyaXBzIHRoZW0sIGFuZFxuICAgIC8vIHRyYWlsaW5nIGNvbW1hcyBub3doZXJlLCBzaW5jZSBib3RoIGFnZW50cyBwYXJzZSB3aXRoIEpTT04ucGFyc2UgaW4gdGhlIGVuZC4gQ29tbWVudC1vbmx5XG4gICAgLy8gY29udGVudCBpcyBjaGVja2VkIHRvbywgYmVjYXVzZSBpdCBpcyBrZXB0IGFzIGEgaGVhZGVyIGFib3ZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LlxuICAgIGlmICghYWNjZXB0c0NvbW1lbnRzICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhpcyBhZ2VudCByZWFkcyBpdCBhcyBzdHJpY3QgSlNPTiwgY29tbWVudHMgYW5kIGFsbC5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oZXhpc3RpbmdDb250ZW50LCBmYWxzZSk7XG4gICAgICBpZiAoIXBhcnNlZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBhIHN0cmljdCBKU09OIG9iamVjdCAoYSB0cmFpbGluZyBjb21tYSwgZm9yIGV4YW1wbGUsIGlzIG5vdCBhbGxvd2VkKS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nU2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBtZXJnZShleGlzdGluZ1NldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gIC8vIE9ubHkgdGhlIHByb3BlcnRpZXMgd2hvc2UgdmFsdWUgY2hhbmdlcyBhcmUgcmV3cml0dGVuLCBzbyB0aGUgZmlsZSBrZWVwcyBpdHMgb3duIGZvcm1hdHRpbmdcbiAgLy8gYW5kLCB3aGVyZSB0aGUgYWdlbnQgYWxsb3dzIHRoZW0sIGl0cyBjb21tZW50cy5cbiAgY29uc3QgeyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfSA9IGpzb25jVXRpbC5zdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKGV4aXN0aW5nQ29udGVudCwgc2V0dGluZ3MpO1xuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzTG9zaW5nQ29tbWVudHMpIHtcbiAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICAgIC8vIC52c2NvZGUvc2V0dGluZ3MuanNvbiBpcyBKU09OQyBieSBkZWZpbml0aW9uOyBKU09OLnBhcnNlIHdvdWxkIG1ha2Ugd2JmeSBzaWxlbnRseSBza2lwXG4gICAgLy8gY29tbWVudGVkIGZpbGVzLlxuICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShwYXJzZWRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICBsZXQgc2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICB9XG4gICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHNldHRpbmdzLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuaW50ZXJmYWNlIEZub3hUb21sU3VidHJlZSB7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgdW5kZWZpbmVkPjtcbn1cblxuLy8gVGhlIGZvdXIgc3RhbmRhcmQgV0JfRU5WIG1vZGVzOyBzdGFnaW5nIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGNvbXBsZXRlZCB3aGVuIHRoZSByZXBvc2l0b3J5XG4vLyBhbHJlYWR5IGRlY2xhcmVzIHRoZSBzdGFnaW5nIHByb2ZpbGUuXG5jb25zdCB3YkVudk1vZGVzID0gWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddIGFzIGNvbnN0O1xudHlwZSBXYkVudk1vZGUgPSAodHlwZW9mIHdiRW52TW9kZXMpW251bWJlcl07XG5cbi8qKlxuICogRW5zdXJlcyBhIGZub3ggcmVwb3NpdG9yeSBkZWZpbmVzIFdCX0VOViBmb3IgZXZlcnkgc3RhbmRhcmQgbW9kZSAoYW5kIE5FWFRfUFVCTElDX1dCX0VOViB3aGVuXG4gKiBhbnkgd29ya3NwYWNlIGRlcGVuZHMgb24gTmV4dC5qcyBvciB2aW5leHQpIGluIGZub3gudG9tbCBwcm9maWxlcy4gRXhpc3RpbmcgZGVmaW5pdGlvbnMgYXJlXG4gKiBhbHdheXMgbGVmdCB1bnRvdWNoZWQuIE5vbi1mbm94IHJlcG9zaXRvcmllcyBhcmUgc2tpcHBlZDogLmVudiBmaWxlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2Vuc3VyZVdiRW52RGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmVlZHNOZXh0UHVibGljID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZykpO1xuICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAvLyBsc3RhdCwgbm90IGV4aXN0c1N5bmM6IGV4aXN0c1N5bmMgaXMgZmFsc2UgZm9yIGEgREFOR0xJTkcgZm5veC50b21sIHN5bWxpbms7IGFueSBmbm94LnRvbWxcbiAgICAvLyBkaXJlY3RvcnkgZW50cnkgbWFya3MgYSBmbm94IHJlcG9zaXRvcnksIGFuZCBhIHJlZnVzZWQvZGFuZ2xpbmcgb25lIGFib3J0cyBpbnN0ZWFkIG9mXG4gICAgLy8gYmVpbmcgdHJlYXRlZCBhcyBhIG5vbi1mbm94IHJlcG9zaXRvcnkgd2hpbGUgdGhlIGZub3ggc3luY2hyb25pemF0aW9uIGlzIGZhaWxpbmcuXG4gICAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZm5veFRvbWxQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZm5veFRvbWxQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50LCBuZWVkc05leHRQdWJsaWMpO1xuICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWlycm9ycyB3YidzIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52IGNvbnRyYWN0IChwYWNrYWdlcy93Yi9zcmMvcHJvamVjdC50cyk6IHRoZSBmcmFtZXdvcmsgbWF5XG4gKiBiZSBkZWNsYXJlZCBpbiBBTlkgb2YgdGhlIGZvdXIgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBgbmV4dGAgYXMgYSBkZXZEZXBlbmRlbmN5IGluIGEgc2hhcmVkXG4gKiBjb21wb25lbnQgbGlicmFyeSksIHdoaWxlIHdiZnkncyBgZGVwZW5kaW5nLm5leHRgIGxvb2tzIG9ubHkgYXQgcmVndWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXS5zb21lKChzZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gY29uZmlnLnBhY2thZ2VKc29uPy5bc2VjdGlvbiBhcyAnZGVwZW5kZW5jaWVzJ107XG4gICAgcmV0dXJuICEhZGVwZW5kZW5jaWVzPy5bJ25leHQnXSB8fCAhIWRlcGVuZGVuY2llcz8uWyd2aW5leHQnXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBtaXNzaW5nIFdCX0VOViAoYW5kIG9wdGlvbmFsbHkgTkVYVF9QVUJMSUNfV0JfRU5WKSBlbnRyaWVzIGludG8gYSBmbm94LnRvbWw6IHRoZSBiYXNlXG4gKiBgW3NlY3JldHNdYCB0YWJsZSBjYXJyaWVzIHRoZSBkZXZlbG9wbWVudCBkZWZhdWx0cyBhbmQgYFtwcm9maWxlcy48bW9kZT4uc2VjcmV0c11gIG92ZXJsYXlzXG4gKiBlYWNoIG90aGVyIG1vZGUsIG1hdGNoaW5nIHRoZSBvcmctc3RhbmRhcmQgbGF5b3V0LiBGb3JtYXR0aW5nIGFuZCBjb21tZW50cyBhcmUgcHJlc2VydmVkOyBvbmx5XG4gKiBtaXNzaW5nIGxpbmVzIGFyZSBpbnNlcnRlZCBvciBtaXNzaW5nIHNlY3Rpb25zIGFwcGVuZGVkLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjb250ZW50XG4gKiBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZCAodW5wYXJzYWJsZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGVkaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudDogc3RyaW5nLCBuZWVkc05leHRQdWJsaWM6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2V0dGluZ3M6IEZub3hUb21sU3VidHJlZTtcbiAgdHJ5IHtcbiAgICBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSBpdCBpcyBub3QgcGFyc2FibGUgYXMgVE9NTC4nKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qga2V5TmFtZXMgPSBuZWVkc05leHRQdWJsaWMgPyBbJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSA6IFsnV0JfRU5WJ107XG4gIGxldCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgLy8gVGhlIHN0YWdpbmcgbW9kZSBpcyBvcHRpb25hbDogY29tcGxldGUgaXQgb25seSB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgZGVjbGFyZXMgdGhlIHByb2ZpbGUuXG4gICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHNldHRpbmdzLnNlY3JldHMgOiBzZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBrZXlOYW1lcykge1xuICAgICAgY29uc3QgZGVmaW5lZCA9IGRlZmluZWRLZXlzPy5ba2V5TmFtZV07XG4gICAgICBjb25zdCBkZWZpbmVkVmFsdWUgPVxuICAgICAgICB0eXBlb2YgZGVmaW5lZCA9PT0gJ3N0cmluZycgPyBkZWZpbmVkIDogKGRlZmluZWQgYXMgeyBkZWZhdWx0PzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZGVmYXVsdDtcbiAgICAgIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWUsIGRlZmluZWRWYWx1ZSwgbW9kZSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmdMaW5lcyA9IGtleU5hbWVzXG4gICAgICAuZmlsdGVyKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChrZXlOYW1lKSA9PiBgJHtrZXlOYW1lfSA9IHsgZGVmYXVsdCA9IFwiJHttb2RlfVwiIH1gKTtcbiAgICBpZiAobWlzc2luZ0xpbmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRJbnRvRm5veFNlY3Rpb24oXG4gICAgICB1cGRhdGVkQ29udGVudCxcbiAgICAgIG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyAnc2VjcmV0cycgOiBgcHJvZmlsZXMuJHttb2RlfS5zZWNyZXRzYCxcbiAgICAgIG1pc3NpbmdMaW5lc1xuICAgICk7XG4gIH1cbiAgaWYgKHVwZGF0ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm4gY29udGVudDtcblxuICAvLyBSZS1wYXJzZSBiZWZvcmUgcmV0dXJuaW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cyB3aXRob3V0IGEgdGFibGUgaGVhZGVyKSBjb3VsZFxuICAvLyBtYWtlIHRoZSB0ZXh0dWFsIGVkaXQgcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZTsgZmFpbCBzYWZlbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKHVwZGF0ZWRDb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHVwZGF0ZWRTZXR0aW5ncy5zZWNyZXRzIDogdXBkYXRlZFNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgICBpZiAoa2V5TmFtZXMuc29tZSgoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnNlcnRlZCAke21vZGV9IGVudHJpZXMgZGlkIG5vdCB0YWtlIGVmZmVjdGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQ29udGVudDtcbn1cblxuLyoqXG4gKiBXYXJucyB3aGVuIGFuIGV4aXN0aW5nIFdCX0VOVi1mYW1pbHkgZGVmaW5pdGlvbiBuYW1lcyBhIGRpZmZlcmVudCBtb2RlIHRoYW4gdGhlIG9uZSBpdCBpc1xuICogZGVmaW5lZCBmb3IgKGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCBvciBgcHJvZHVjdGlvbjFgLCBvciBhIGNvcHktcGFzdGVkIHdyb25nIG1vZGUpOiB3YlxuICogcmVqZWN0cyBub24tc3RhbmRhcmQgdmFsdWVzIGF0IHJ1bnRpbWUsIHNvIHN1cmZhY2luZyB0aGUgbWlzbWF0Y2ggZHVyaW5nIHdiZnkgaXMgdGhlIGVhcmxpZXN0XG4gKiBwb3NzaWJsZSBzaWduYWwuIFRoZSBwYXNzZWQgdmFsdWUgaXMgYWx3YXlzIHBsYWludGV4dCAoYSBmbm94IGBkZWZhdWx0YCBmaWVsZCkg4oCUIGVuY3J5cHRlZFxuICogZm5veCBlbnRyaWVzIGFyZSBgeyBwcm92aWRlciwgdmFsdWUgfWAgb2JqZWN0cyB3aG9zZSBgZGVmYXVsdGAgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBtb2RlOiBXYkVudk1vZGUpOiB2b2lkIHtcbiAgLy8gQW4gRU1QVFkgdmFsdWUgY291bnRzIGFzIHVuc2V0ICh3YiBzdXBwbGllcyB0aGUgZmFsbGJhY2sgbW9kZSksIG5vdCBhcyBhIG1pc21hdGNoaW5nIG1vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbW9kZSkgcmV0dXJuO1xuICAvLyBBIGR5bmFtaWMgdmFsdWUgKGUuZy4gYE5FWFRfUFVCTElDX1dCX0VOVj0ke1dCX0VOVn1gKSBtYXkgbGVnaXRpbWF0ZWx5IHJlc29sdmUgdG8gdGhlIG1vZGVcbiAgLy8gdGhyb3VnaCBleHBhbnNpb24sIHdoaWNoIHRoaXMgc3RhdGljIGNoZWNrIGNhbm5vdCBldmFsdWF0ZSDigJQgc2tpcCBpbnN0ZWFkIG9mIG1pc2ZpcmluZy5cbiAgLy8gZm5veCBleHBhbmRzIG9ubHkgYCR7Li4ufWAgKGEgYmFyZSBgJFVOU0VUYCBzdGF5cyBsaXRlcmFsKS5cbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCckeycpKSByZXR1cm47XG4gIGlmIChrZXlOYW1lID09PSAnTkVYVF9QVUJMSUNfV0JfRU5WJykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2Igb3ZlcnJpZGVzIGl0IHdpdGggV0JfRU5WLCBidXQgYSBkaXJlY3QgZnJhbWV3b3JrIGJ1aWxkIHdvdWxkIGlubGluZSB0aGlzIHZhbHVlLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiByZWplY3RzIHZhbHVlcyBvdXRzaWRlIGRldmVsb3BtZW50L3Rlc3Qvc3RhZ2luZy9wcm9kdWN0aW9uLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGxpbmVzIGF0IHRoZSB0b3Agb2YgYSBUT01MIHNlY3Rpb24sIHJpZ2h0IGFmdGVyIGl0cyBgW2hlYWRlcl1gIGxpbmUgc28gcHJvZmlsZS1zcGVjaWZpY1xuICogZW50cmllcyBzdGF5IGdyb3VwZWQgd2l0aCB0aGVpciBoZWFkZXI7IHRoZSBzZWN0aW9uIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQgd2hlbiBpdCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEludG9Gbm94U2VjdGlvbihjb250ZW50OiBzdHJpbmcsIHNlY3Rpb25OYW1lOiBzdHJpbmcsIGluc2VydGVkTGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgLy8gd2JmeSB3cml0ZXMgdGhlIGhlYWRlciB3aXRob3V0IHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkb3R0ZWQta2V5IGNvbXBvbmVudHMuXG4gIGNvbnN0IGhlYWRlclBhdHRlcm4gPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXlxccypcXFske3NlY3Rpb25OYW1lLnJlcGxhY2VBbGwoJy4nLCBTdHJpbmcucmF3YFxcLmApfVxcXVxccyooPzojLiopPyRgLCAndScpO1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gaGVhZGVyUGF0dGVybi50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bJHtzZWN0aW9uTmFtZX1dXFxuJHtpbnNlcnRlZExpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCArIDEpLCAuLi5pbnNlcnRlZExpbmVzLCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEpXS5qb2luKCdcXG4nKTtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBydW5BbGxJblBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8qKlxuICogUmVwb3NpdG9yaWVzIG91dHNpZGUgV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGVcbiAqIHdvcmtmbG93czogdGhvc2Ugd29ya2Zsb3dzIGRlcGVuZCBvbiBvcmdhbml6YXRpb24gc2VjcmV0cyAoVkVSREFDQ0lPX1RPS0VOLCBEaXNjb3JkIHdlYmhvb2tzKVxuICogYW5kIHNlbGYtaG9zdGVkIHJ1bm5lcnMgdGhhdCBvdGhlciBvd25lcnMgZG8gbm90IGhhdmUuIFRoaXMgZ2VuZXJhdG9yIGluc3RlYWQgZW1pdHNcbiAqIHNlbGYtY29udGFpbmVkIHdvcmtmbG93cyBidWlsdCBvbmx5IGZyb20gd2hhdCBhbnkgcmVwb3NpdG9yeSBvd25lciBjYW4gcHJvdmlkZTogdGhlIHJlcG9zaXRvcnlcbiAqIGNvbnRlbnRzIChtaXNlLnRvbWwsIHBhY2thZ2UuanNvbiBzY3JpcHRzKSBhbmQgdGhlIHNpbmdsZSBgRk5PWF9BR0VfS0VZYCByZXBvc2l0b3J5IHNlY3JldCB3aGVuXG4gKiB0aGUgcmVwb3NpdG9yeSB1c2VzIGZub3guIEdlbmVyYXRpb24gaXMga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3NcbiAqIGlkZW50aXR5LCBzbyBpdCB3b3JrcyBmb3IgYXJiaXRyYXJ5IHBlcnNvbmFsIHJlcG9zaXRvcmllcy5cbiAqL1xuXG4vKiogRmlyc3QgbGluZSBvZiBldmVyeSBnZW5lcmF0ZWQgZmlsZTsgZmlsZXMgd2l0aG91dCBpdCBhcmUgaGFuZC13cml0dGVuIGFuZCBuZXZlciB0b3VjaGVkLiAqL1xuZXhwb3J0IGNvbnN0IHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5Lic7XG5cbi8vIFNhbWUgcGlucyBhcyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzIC8gdGhlaXIgY29uc3VtZXJzOyBSZW5vdmF0ZSB1cGRhdGVzIHRoZW0gaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5LlxuY29uc3QgY2hlY2tvdXRBY3Rpb24gPSAnYWN0aW9ucy9jaGVja291dEB2Ny4wLjEnO1xuY29uc3QgbWlzZUFjdGlvbiA9ICdqZHgvbWlzZS1hY3Rpb25AdjQuMi4zJztcbmNvbnN0IGNhY2hlQWN0aW9uID0gJ2FjdGlvbnMvY2FjaGVAdjYuMS4wJztcbmNvbnN0IHVwbG9hZEFydGlmYWN0QWN0aW9uID0gJ2FjdGlvbnMvdXBsb2FkLWFydGlmYWN0QHY3LjAuMSc7XG4vLyB2Ni4xLjE7IHRoZSBzYW1lIHBpbiBhcyB0aGUgcmV1c2FibGUgc2VtYW50aWMtcHIgd29ya2Zsb3cuXG5jb25zdCBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uID0gJ2FtYW5ubi9hY3Rpb24tc2VtYW50aWMtcHVsbC1yZXF1ZXN0QDQ1YjllZDdjZjI0MDg3YTJmNzc4NWJmNTViZTk3Mzk0YmE4N2UxYzInO1xuLy8gdjMuMC4zOyBkZXBsb3lzIGFyZSBuZXR3b3JrLWhlYXZ5IGFuZCBiZW5lZml0IGZyb20gcmV0cmllcyB3aXRoIGEgbG9uZyB0aW1lb3V0LlxuY29uc3QgcmV0cnlBY3Rpb24gPSAnbmljay1maWVsZHMvcmV0cnlAZGQ1NmYxY2E4Y2E5OTFlMjM4NWMxOGFiNmRkMzZlYTdmOWZkYjU1Zic7XG5cbi8qKlxuICogSm9iLWxldmVsIGVudiB0aGF0IHR1cm5zIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwYXRoIG9uLCBtaXJyb3JpbmcgdGhlIHJldXNhYmxlIHdvcmtmbG93cy5cbiAqXG4gKiBgc2VjcmV0c2AgaXMgdW5hdmFpbGFibGUgaW4gYSBzdGVwLWxldmVsIGBpZjpgLCBzbyB0aGUgcHJlc2VuY2Ugb2YgdGhlIHRva2VuIGlzIGV4cG9zZWQgYXMgYVxuICogbm9uLXNlY3JldCBzaWduYWw7IGFuIHVuc2V0IHNlY3JldCBleHBhbmRzIHRvIGBmYWxzZWAgYW5kIGxlYXZlcyBldmVyeSBHdWFyZCBzdGVwIHNraXBwZWQsIHdoaWNoXG4gKiBpcyB3aGF0IGtlZXBzIHRoZSBnZW5lcmF0ZWQgd29ya2Zsb3dzIHJ1bm5hYmxlIGluIGEgcmVwb3NpdG9yeSB0aGF0IG5ldmVyIHJlZ2lzdGVycyB0aGUgc2VjcmV0LlxuICogVEFLVU1JX0dVQVJEX1RPS0VOIGl0c2VsZiBpcyBkZWZpbmVkLWJ1dC1FTVBUWSBqb2Itd2lkZSBzbyB0aGUgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlXG4gKiBpbiB0aGUgZ2VuZXJhdGVkIC5ucG1yYyBzdGlsbCBleHBhbmRzICh0byAnJykgaW4gdGhlIHN0ZXBzIHRoYXQgZGVsaWJlcmF0ZWx5IHJ1biB3aXRob3V0IHRoZVxuICogdG9rZW47IGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZCB2YXJpYWJsZSBpcyB3aGF0IGJyZWFrcyBhbiBpbnN0YWxsLCBhbiBlbXB0eSBvbmUgaXMgZmluZS5cbiAqL1xuY29uc3QgZ3VhcmRKb2JFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEhBU19UQUtVTUlfR1VBUkRfVE9LRU46ICcke3sgISFzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScsXG4gIFRBS1VNSV9HVUFSRF9UT0tFTjogJycsXG59O1xuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgdXNlcz86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICAnd29ya2luZy1kaXJlY3RvcnknPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25jdXJyZW5jeT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgeyAncnVucy1vbic6IHN0cmluZzsgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBzdGVwczogU3RlcFtdIH1cbiAgPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtyb290Q29uZmlnXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCB1c2VzRm5veCA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICBjb25zdCB3b3JrZmxvd0J5RmlsZU5hbWU6IFJlY29yZDxzdHJpbmcsIFdvcmtmbG93PiA9IHtcbiAgICAgICd0ZXN0LnltbCc6IGJ1aWxkVGVzdFdvcmtmbG93KHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzLCB1c2VzRm5veCksXG4gICAgICAnc2VtYW50aWMtcHIueW1sJzogYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKSxcbiAgICB9O1xuICAgIC8vIERlcGxveSB3b3JrZmxvd3MgYXJlIGdlbmVyYXRlZCBwZXIgZGVwbG95IHNjcmlwdCB0aGUgcmVwb3NpdG9yeSBkZWNsYXJlcywgc28gYSByZXBvc2l0b3J5XG4gICAgLy8gd2l0aG91dCBhIHN0YWdpbmcgZW52aXJvbm1lbnQgc2ltcGx5IGdldHMgbm8gc3RhZ2luZyB3b3JrZmxvdy4gT25seSBzY3JpcHRzIHRoYXQgaW52b2tlXG4gICAgLy8gYHdiIGRlcGxveWAgcXVhbGlmeTogYSBiZXNwb2tlIGRlcGxveSBzY3JpcHQgbWF5IG5vdCBiZSBzYWZlIHRvIHRyaWdnZXIgYXV0b21hdGljYWxseVxuICAgIC8vIChkZXBsb3ktc3RhZ2luZyBydW5zIG9uIGV2ZXJ5IHB1c2ggdG8gdGhlIGRlZmF1bHQgYnJhbmNoKS5cbiAgICBjb25zdCBzY3JpcHRzID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPSBpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveSddKTtcbiAgICBpZiAoaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93KSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1wcm9kdWN0aW9uLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygncHJvZHVjdGlvbicsICdkZXBsb3knLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveTpzdGFnaW5nJ10pKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1zdGFnaW5nLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygnc3RhZ2luZycsICdkZXBsb3k6c3RhZ2luZycsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSAmJiByb290Q29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydyZWxlYXNlLnltbCddID0gYnVpbGRSZWxlYXNlV29ya2Zsb3cocm9vdENvbmZpZywgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93LCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGF3YWl0IHJ1bkFsbEluUG9vbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdvcmtmbG93QnlGaWxlTmFtZSkubWFwKFxuICAgICAgICAoW2ZpbGVOYW1lLCB3b3JrZmxvd10pID0+XG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksIHdvcmtmbG93KVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhmaWxlUGF0aDogc3RyaW5nLCB3b3JrZmxvdzogV29ya2Zsb3cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgLy8gVW5saWtlIFdpbGxCb29zdGVyLW9yZ2FuaXphdGlvbiByZXBvc2l0b3JpZXMsIHdiZnkgZG9lcyBub3Qgb3duIGFyYml0cmFyeSByZXBvc2l0b3JpZXMnIENJOlxuICAvLyBvbmx5IGZpbGVzIGl0IGdlbmVyYXRlZCAoaWRlbnRpZmllZCBieSB0aGUgbWFya2VyKSBhcmUgcmVnZW5lcmF0ZWQsIGFuZCBoYW5kLXdyaXR0ZW5cbiAgLy8gd29ya2Zsb3dzIGFyZSBuZXZlciB0b3VjaGVkLiBPd25lcnMgb3B0IG91dCBwZXJtYW5lbnRseSBieSByZW1vdmluZyB0aGUgbWFya2VyIGxpbmUuXG4gIC8vIEFuIGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSBmaWxlIGNhcnJpZXMgbm8gaGFuZC13cml0dGVuIGNvbnRlbnQsIHNvIGl0IGlzIHRyZWF0ZWQgYXMgYWJzZW50LlxuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG9sZENvbnRlbnQudHJpbSgpICE9PSAnJyAmJiAhb2xkQ29udGVudC5zdGFydHNXaXRoKHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBgJHtzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXJ9IFJlbW92ZSB0aGlzIGxpbmUgdG8gc3RvcCB3YmZ5IGZyb20gb3ZlcndyaXRpbmcgdGhpcyBmaWxlLlxcbmA7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKHdvcmtmbG93LCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgaGVhZGVyICsgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiB3b3JraW5nRGlyKGRpclBhdGg6IHN0cmluZyk6IFBpY2s8U3RlcCwgJ3dvcmtpbmctZGlyZWN0b3J5Jz4ge1xuICByZXR1cm4gZGlyUGF0aCA/IHsgJ3dvcmtpbmctZGlyZWN0b3J5JzogZGlyUGF0aCB9IDoge307XG59XG5cbmZ1bmN0aW9uIGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2IgZGVwbG95XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBidWlsZFRlc3RXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbFBhY2thZ2VDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sIHVzZXNGbm94OiBib29sZWFuKTogV29ya2Zsb3cge1xuICAvLyBQbGF5d3JpZ2h0IG1heSBiZSBkZWNsYXJlZCBvbmx5IGluIHdvcmtzcGFjZSBwYWNrYWdlczsgYHdiIHRlc3Qtb24tY2lgIHJ1bnMgZXZlcnkgZGVjbGFyaW5nXG4gIC8vIHBhY2thZ2UncyBlMmUgdGVzdHMsIHNvIHRoZSB3b3JrZmxvdyBtdXN0IGluc3RhbGwgYnJvd3NlcnMgZm9yIGVhY2ggb2YgdGhlbSAodGhlaXIgdmVyc2lvbnNcbiAgLy8gbWF5IGRpZmZlciwgYW5kIGVhY2ggbGlicmFyeSB2ZXJzaW9uIHJlcXVpcmVzIGl0cyBtYXRjaGluZyBicm93c2VyIGJpbmFyaWVzKS4gQnVuJ3MgaXNvbGF0ZWRcbiAgLy8gbGlua2VyIHJlc29sdmVzIHRoZSBwbGF5d3JpZ2h0IGJpbmFyeSBvbmx5IGZyb20gdGhlIGRlY2xhcmluZyBwYWNrYWdlLCBoZW5jZSB0aGVcbiAgLy8gd29ya2luZy1kaXJlY3Rvcnkgb24gZXZlcnkgc3RlcC4gVGhlIGJyb3dzZXJzIGxhbmQgaW4gfi8uY2FjaGUvbXMtcGxheXdyaWdodCwgc2hhcmVkIGFjcm9zc1xuICAvLyB3b3Jrc3BhY2VzLCBzbyBzYW1lLXZlcnNpb24gaW5zdGFsbHMgbmF0dXJhbGx5IGRlZHVwbGljYXRlLlxuICBjb25zdCBwbGF5d3JpZ2h0RGlyUGF0aHMgPSBbLi4uYWxsUGFja2FnZUNvbmZpZ3NdXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLmRpclBhdGgubG9jYWxlQ29tcGFyZShiLmRpclBhdGgpKVxuICAgIC5maWx0ZXIoKHBhY2thZ2VDb25maWcpID0+IHBhY2thZ2VDb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KVxuICAgIC5tYXAoKHBhY2thZ2VDb25maWcpID0+IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VDb25maWcuZGlyUGF0aCkpO1xuICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieSBgYnVuIGluc3RhbGxgXG4gIC8vIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gIGNvbnN0IGZub3hFbnY6IFBpY2s8U3RlcCwgJ2Vudic+ID0gdXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9O1xuXG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiB9LFxuICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKHRydWUpLFxuICAgIC4uLihwbGF5d3JpZ2h0RGlyUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyAoW1xuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgsIGluZGV4KTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgbmFtZTogYEdldCBQbGF5d3JpZ2h0IHZlcnNpb24ke2RpclBhdGggPyBgICgke2RpclBhdGh9KWAgOiAnJ31gLFxuICAgICAgICAgICAgLy8gVGhlIElOU1RBTExFRCB2ZXJzaW9uLCBub3QgdGhlIHBhY2thZ2UuanNvbiBzcGVjaWZpZXI6IGEgcmFuZ2UgbGlrZSBgXjEuNDUuMGBcbiAgICAgICAgICAgIC8vIHN0YXlzIHVuY2hhbmdlZCBhY3Jvc3MgbG9ja2ZpbGUgdXBkYXRlcywgc28ga2V5aW5nIHRoZSBjYWNoZSBvbiBpdCB3b3VsZCByZXN0b3JlXG4gICAgICAgICAgICAvLyBzdGFsZSBicm93c2VycyB0aGF0IG5vIGxvbmdlciBtYXRjaCB0aGUgbGlicmFyeS4gUnVucyBhZnRlciBgYnVuIGluc3RhbGxgLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIHBhY2thZ2UgaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSdzIGRpcmVjdG9yeS5cbiAgICAgICAgICAgIGlkOiBgcGxheXdyaWdodC12ZXJzaW9uLSR7aW5kZXh9YCxcbiAgICAgICAgICAgIHJ1bjogJ2VjaG8gXCJ2ZXJzaW9uPSQoYnVuIC1lIFwidHJ5IHsgY29uc29sZS5sb2cocmVxdWlyZShcXCdAcGxheXdyaWdodC90ZXN0L3BhY2thZ2UuanNvblxcJykudmVyc2lvbikgfSBjYXRjaCB7fVwiKVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQ2FjaGUgUGxheXdyaWdodCBicm93c2VycycsXG4gICAgICAgICAgICBpZDogJ3BsYXl3cmlnaHQtY2FjaGUnLFxuICAgICAgICAgICAgdXNlczogY2FjaGVBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHBhdGg6ICd+Ly5jYWNoZS9tcy1wbGF5d3JpZ2h0JyxcbiAgICAgICAgICAgICAga2V5OiBgcGxheXdyaWdodC1cXCR7eyBydW5uZXIub3MgfX0tJHtwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChfLCBpbmRleCkgPT4gYFxcJHt7IHN0ZXBzLnBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fS5vdXRwdXRzLnZlcnNpb24gfX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCctJyl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoKTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCAhPSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgYnJvd3NlcnMgc3RpbGwgbmVlZCB0aGVpciBzeXN0ZW0gZGVwZW5kZW5jaWVzIG9uIGEgZnJlc2ggcnVubmVyLlxuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwtZGVwcycsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgOiBbXSksXG4gICAgLi4uKGhhc1R5cGVjaGVjayA/IFt7IHJ1bjogJ2J1biBydW4gdHlwZWNoZWNrJywgLi4uZm5veEVudiB9XSA6IFtdKSxcbiAgICB7IHJ1bjogJ2J1biBydW4gbGludCcsIC4uLmZub3hFbnYgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVGVzdCcsXG4gICAgICBpZDogJ3Rlc3QnLFxuICAgICAgcnVuOiBgaWYgW1sgXCIkVVBMT0FEX1RFU1RfTE9HXCIgIT0gXCJ0cnVlXCIgXV07IHRoZW5cbiAgZXhlYyBidW4gcnVuIHRlc3QvY2lcbmZpXG5sb2dfZGlyPSQobWt0ZW1wIC1kIFwiJFJVTk5FUl9URU1QL3Rlc3Qtb3V0cHV0LlhYWFhYWFwiKVxuZWNobyBcImxvZ19wYXRoPSRsb2dfZGlyL3Rlc3QubG9nXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXG4jIEtlZXAgZHJhaW5pbmcgdGVzdCBvdXRwdXQgd2hlbiB0aGUgbG9nIHJlYWNoZXMgYSBmaWxlLXNpemUgbGltaXQuXG5zZXQgK2VcbmJ1biBydW4gdGVzdC9jaSAyPiYxIHwgKHRyYXAgJycgWEZTWjsgdGVlIFwiJGxvZ19kaXIvdGVzdC5sb2dcIilcbnRlc3Rfc3RhdHVzPShcIlxcJHtQSVBFU1RBVFVTW0BdfVwiKVxuaWYgKCggdGVzdF9zdGF0dXNbMF0gIT0gMCApKTsgdGhlbiBleGl0IFwiXFwke3Rlc3Rfc3RhdHVzWzBdfVwiOyBmaVxuZXhpdCBcIlxcJHt0ZXN0X3N0YXR1c1sxXX1cImAsXG4gICAgICBlbnY6IHsgLi4uZm5veEVudi5lbnYsIFVQTE9BRF9URVNUX0xPRzogJyR7eyB2YXJzLlVQTE9BRF9URVNUX0xPRyB9fScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCBsb2cnLFxuICAgICAgaWY6IFwiJHt7IGFsd2F5cygpICYmIHZhcnMuVVBMT0FEX1RFU1RfTE9HID09ICd0cnVlJyAmJiBzdGVwcy50ZXN0Lm91dHB1dHMubG9nX3BhdGggIT0gJycgfX1cIixcbiAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgd2l0aDoge1xuICAgICAgICBuYW1lOiAndGVzdC1vdXRwdXQtJHt7IHJ1bm5lci5vcyB9fS0ke3sgam9iLmNoZWNrX3J1bl9pZCB9fS0ke3sgZ2l0aHViLnJ1bl9hdHRlbXB0IH19JyxcbiAgICAgICAgcGF0aDogJyR7eyBzdGVwcy50ZXN0Lm91dHB1dHMubG9nX3BhdGggfX0nLFxuICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgJ2lmLW5vLWZpbGVzLWZvdW5kJzogJ2Vycm9yJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCByZXN1bHRzJyxcbiAgICAgICAgICAgIGlmOiAnJHt7IGFsd2F5cygpIH19JyxcbiAgICAgICAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBuYW1lOiAndGVzdC1yZXN1bHRzJyxcbiAgICAgICAgICAgICAgLy8gRXZlcnkgZGVjbGFyaW5nIHBhY2thZ2Ugd3JpdGVzIGl0cyBvd24gdGVzdC1yZXN1bHRzIGRpcmVjdG9yeTsgYSBuZXdsaW5lLXNlcGFyYXRlZFxuICAgICAgICAgICAgICAvLyBsaXN0IHVwbG9hZHMgdGhlbSBhbGwuXG4gICAgICAgICAgICAgIHBhdGg6IHBsYXl3cmlnaHREaXJQYXRoc1xuICAgICAgICAgICAgICAgIC5tYXAoKGRpclBhdGgpID0+IChkaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICd0ZXN0LXJlc3VsdHMnKSA6ICd0ZXN0LXJlc3VsdHMnKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdpZ25vcmUnLFxuICAgICAgICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgOiBbXSksXG4gIF07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6ICdyZWFkJyB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBGT1JDRV9DT0xPUjogJzMnLCBXQl9FTlY6ICd0ZXN0JywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHMsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95V29ya2Zsb3coZW52aXJvbm1lbnQ6ICdzdGFnaW5nJyB8ICdwcm9kdWN0aW9uJywgc2NyaXB0TmFtZTogc3RyaW5nLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBgRGVwbG95IGFwcCBvbiAke2Vudmlyb25tZW50fWAsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgICAgLy8gUHJvZHVjdGlvbiBkZXBsb3lzIGZvbGxvdyBwdWJsaXNoZWQgcmVsZWFzZXMgKHNlZSB0aGUgcmVsZWFzZSB3b3JrZmxvdydzIHRyaWdnZXIgc3RlcCk7XG4gICAgICAvLyBzdGFnaW5nIGNvbnZlcmdlcyBvbiBldmVyeSBkZWZhdWx0LWJyYW5jaCBwdXNoLlxuICAgICAgLi4uKGVudmlyb25tZW50ID09PSAncHJvZHVjdGlvbidcbiAgICAgICAgPyB7IHJlbGVhc2U6IHsgdHlwZXM6IFsncHVibGlzaGVkJ10gfSB9XG4gICAgICAgIDogeyBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSwgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddIH0gfSksXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICBkZXBsb3k6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBXQl9FTlY6IGVudmlyb25tZW50LCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIC8vIGZldGNoLWRlcHRoIDAgc28gYGdpdCBkZXNjcmliZWAgc2VlcyB0aGUgdGFncyBXQl9WRVJTSU9OIGlzIGRlcml2ZWQgZnJvbS5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZXQgV0JfVkVSU0lPTicsXG4gICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbldCX1ZFUlNJT049JChnaXQgZGVzY3JpYmUgLS1hbHdheXMgLS10YWdzKVxcbmVjaG8gXCJXQl9WRVJTSU9OPSRXQl9WRVJTSU9OXCIgPj4gXCIkR0lUSFVCX0VOVlwiJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnRGVwbG95JyxcbiAgICAgICAgICAgIHVzZXM6IHJldHJ5QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICB0aW1lb3V0X21pbnV0ZXM6IDYwLFxuICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHM6IDUsXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFN0ZXAtc2NvcGVkIGxpa2UgdGhlIHRlc3Qgd29ya2Zsb3c6IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgcnVuIGJ5XG4gICAgICAgICAgICAvLyBgYnVuIGluc3RhbGxgIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gICAgICAgICAgICAuLi4odXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbGVhc2VXb3JrZmxvdyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3c6IGJvb2xlYW4sXG4gIHVzZXNGbm94OiBib29sZWFuXG4pOiBXb3JrZmxvdyB7XG4gIGNvbnN0IGZub3hFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB1c2VzRm5veCA/IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IDoge307XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbLi4uY29uZmlnLnJlbGVhc2UuYnJhbmNoZXNdIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgZGlzcGF0Y2hpbmcgdGhlIHByb2R1Y3Rpb24gZGVwbG95IHdvcmtmbG93IGFmdGVyIGEgcmVsZWFzZVxuICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA/IHsgYWN0aW9uczogJ3dyaXRlJyB9IDoge30pLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gUmVsZWFzZXMgYnVpbGQgcHJvZHVjdGlvbiBhcnRpZmFjdHMsIGhlbmNlIHRoZSBlbnZpcm9ubWVudCDigJQgdGhlIHNhbWUgZGVmYXVsdCBhcyB0aGVcbiAgICAgICAgLy8gcmV1c2FibGUgcmVsZWFzZSB3b3JrZmxvdy4gd2IncyBDSSBndWFyZCBhbHNvIHJlcXVpcmVzIGFuIGV4cG9ydGVkIFdCX0VOViwgc28gd2l0aG91dFxuICAgICAgICAvLyBpdCBhIGBwb3N0aW5zdGFsbGAgdGhhdCBjYWxscyB3YiAoZS5nLiBgd2IgZ2VuLWNvZGVgKSBleGl0cyAxIGJlZm9yZSBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICAgIC8vIHJ1bnMuXG4gICAgICAgIGVudjogeyBXQl9FTlY6ICdwcm9kdWN0aW9uJywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwOiBzZW1hbnRpYy1yZWxlYXNlIHJlYWRzIHRoZSBmdWxsIGhpc3RvcnkgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLlxuICAgICAgICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24sIHdpdGg6IHsgJ2ZldGNoLWRlcHRoJzogMCB9IH0sXG4gICAgICAgICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgICAgICAgLi4uYnVpbGRJbnN0YWxsU3RlcHMoZmFsc2UpLFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdHZXQgY3VycmVudCBsYXRlc3QgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncHJlLXJlbGVhc2UtdGFnJyxcbiAgICAgICAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuZWNobyBcInRhZz0kKGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCAyPi9kZXYvbnVsbCB8fCBlY2hvIFxcJ1xcJylcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICAgICAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgY2hlY2tzIE5vZGUuanMgcnVudGltZSByZXF1aXJlbWVudHM7IGBidW4gPGJpbj5gIHJlc3BlY3RzIGl0c1xuICAgICAgICAgICAgLy8gYCMhL3Vzci9iaW4vZW52IG5vZGVgIHNoZWJhbmcsIHNvIGl0IHN0aWxsIHJ1bnMgdW5kZXIgcmVhbCBOb2RlLlxuICAgICAgICAgICAgcnVuOiAnYnVuIHNlbWFudGljLXJlbGVhc2UnLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgICAgIExFRlRIT09LOiAnMCcsXG4gICAgICAgICAgICAgIC4uLmZub3hFbnYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd1xuICAgICAgICAgICAgPyAoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVjayBmb3IgbmV3IHJlbGVhc2UgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncG9zdC1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmdpdCBmZXRjaCAtLXRhZ3MgLS1mb3JjZVxcbk5FV19UQUc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXFxuZWNobyBcInRhZz0kTkVXX1RBR1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxcbmlmIFtbIC1uIFwiJE5FV19UQUdcIiAmJiBcIiRORVdfVEFHXCIgIT0gXCIke3sgc3RlcHMucHJlLXJlbGVhc2UtdGFnLm91dHB1dHMudGFnIH19XCIgXV07IHRoZW5cXG4gIGVjaG8gXCJjcmVhdGVkPXRydWVcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5maScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZjogXCJzdGVwcy5wb3N0LXJlbGVhc2UtdGFnLm91dHB1dHMuY3JlYXRlZCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdUcmlnZ2VyIHByb2R1Y3Rpb24gZGVwbG95JyxcbiAgICAgICAgICAgICAgICAgIC8vIEEgR0lUSFVCX1RPS0VOLWNyZWF0ZWQgcmVsZWFzZSBkb2VzIG5vdCBmaXJlIHRoZSBkZXBsb3kgd29ya2Zsb3cnc1xuICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZS1wdWJsaXNoZWQgdHJpZ2dlciwgc28gZGlzcGF0Y2ggaXQgZXhwbGljaXRseSBvbiB0aGUgbmV3IHRhZy5cbiAgICAgICAgICAgICAgICAgIHJ1bjogJ2doIHdvcmtmbG93IHJ1biBkZXBsb3ktcHJvZHVjdGlvbi55bWwgLS1yZWYgXCIke3sgc3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiJyxcbiAgICAgICAgICAgICAgICAgIGVudjogeyBHSF9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdIHNhdGlzZmllcyBTdGVwW10pXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbCBzZXF1ZW5jZSBldmVyeSBnZW5lcmF0ZWQgd29ya2Zsb3cgc2hhcmVzOiBgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVgLCBoYXJkZW5lZCBpbnRvIHRoZVxuICogcmV1c2FibGUgd29ya2Zsb3dzJyB0aHJlZS1zdGVwIGRhbmNlIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVnaXN0ZXJzIGEgVEFLVU1JX0dVQVJEX1RPS0VOIHNlY3JldC5cbiAqXG4gKiBUYWt1bWkgR3VhcmQgKGh0dHBzOi8vZmxhdHQudGVjaC90YWt1bWkvZmVhdHVyZXMvZ3VhcmQpIGlzIGEgcmVnaXN0cnkgcHJveHkgdGhhdCBibG9ja3NcbiAqIGtub3duLW1hbGljaW91cyBwYWNrYWdlcy4gUm91dGluZyB0aGUgREVGQVVMVCByZWdpc3RyeSB0aHJvdWdoIGl0IGlzIHdoYXQgcHJvdGVjdHMgdGhlIGluc3RhbGwsXG4gKiBhbmQgdGhlIHRva2VuIGF1dGhlbnRpY2F0ZXMgdGhhdCBwcm94eSDigJQgc28gdGhlIHRva2VuIGhhcyB0byBiZSBwcmVzZW50IHdoaWxlIGRlcGVuZGVuY2llcyBhcmVcbiAqIHJlc29sdmVkLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gYSBjb21wcm9taXNlZCBkZXBlbmRlbmN5J3MgbGlmZWN5Y2xlIHNjcmlwdCB3b3VsZCBydW4uIEhlbmNlIHRoZVxuICogc3BsaXQ6IHJlc29sdmUgYW5kIGRvd25sb2FkIHdpdGggYC0taWdub3JlLXNjcmlwdHNgIGFuZCB0aGUgdG9rZW4sIHRoZW4gcmVwbGF5IHRoZSBza2lwcGVkXG4gKiBsaWZlY3ljbGUgc2NyaXB0cyBpbiBhIHNlY29uZCBpbnN0YWxsIHRoYXQgaGFzIG5vIHRva2VuIChldmVyeSBwYWNrYWdlIGlzIGFscmVhZHkgY2FjaGVkLCBhbmRcbiAqIEd1YXJkIHNlcnZlcyBhbm9ueW1vdXNseSBhbnl3YXkpLiBPbmx5IGJ1biBpcyBnZW5lcmF0ZWQgaGVyZSwgYW5kIGJ1biByZWFkcyAubnBtcmMsIHNvIG5vXG4gKiBwYWNrYWdlLW1hbmFnZXIgYnJhbmNoaW5nIGlzIG5lZWRlZC5cbiAqXG4gKiBUaGUgc2hlbGwgZGV0YWlscyBkZWxpYmVyYXRlbHkgbWlycm9yIHJldXNhYmxlLXdvcmtmbG93cycgcHJvZHVjdGlvbi1wcm92ZW4gaW5zdGFsbCBzdGVwczogYmFyZVxuICogYCRSVU5ORVJfVEVNUGAgKHNldCBieSB0aGUgcnVubmVyIGFwcGxpY2F0aW9uIG9uIGV2ZXJ5IHJ1bm5lciwgYW5kIGBzZXQgLXVgIGZhaWxzIGxvdWRseSBpZiBub3QpLFxuICogYFtbIC1lIC5ucG1yYyBdXWAsIGFuZCB0aGUgc2Vjb25kIGBybSAtcmYgbm9kZV9tb2R1bGVzYCBpbiB0aGUgZmFsbGJhY2sgKGFuIGludGVycnVwdGVkIGxpZmVjeWNsZVxuICogcnVuIG1heSBsZWF2ZSBub2RlX21vZHVsZXMgaW5jb25zaXN0ZW50LCBzbyB0aGUgcmV0cnkgc3RhcnRzIGNsZWFuIHJhdGhlciB0aGFuIHRydXN0aW5nIGEgcmVwYWlyKS5cbiAqXG4gKiBgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlYCBkZWNpZGVzIHdoYXQgYSBmYWlsaW5nIGxpZmVjeWNsZS1zY3JpcHQgcmVwbGF5IGRvZXMuIEV2ZXJ5XG4gKiByZXBsYXkgcnVucyB0b2tlbmxlc3MgYW5kIHdpdGhvdXQgRk5PWF9BR0VfS0VZICh0aGUga2V5IGlzIHNjb3BlZCB0byB0aGUgbGF0ZXIgRGVwbG95L1JlbGVhc2VcbiAqIHN0ZXApLCBzbyBhIHBvc3RpbnN0YWxsIHRoYXQgbmVlZHMgZGVjcnlwdGVkIHNlY3JldHMgaXMgdW5zdXBwb3J0ZWQgaW4gYWxsIG9mIHRoZW0gYnkgZGVzaWduLlxuICogVGhlIHRlc3Qgd29ya2Zsb3cgdG9sZXJhdGVzIHRoZSBmYWlsdXJlIGJlY2F1c2UgdHlwZWNoZWNrL2xpbnQvdGVzdCBmYWlsIGxvdWRseSBvbiBhIGRlZ3JhZGVkXG4gKiB0cmVlIGFueXdheS4gRGVwbG95IGFuZCByZWxlYXNlIHdvcmtmbG93cyBtdXN0IG5vdDogYSBgOjp3YXJuaW5nOjpgIGRvZXMgbm90IGZhaWwgdGhlIGpvYiwgc29cbiAqIHRoZSBmYWxsYmFjayB3b3VsZCBzaGlwIGEgdHJlZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyAoZS5nLiBhIGBwb3N0aW5zdGFsbDogd2IgZ2VuLWNvZGVgKVxuICogbmV2ZXIgcmFuLCBzaWxlbnRseSBkZXBsb3lpbmcgZGVncmFkZWQgb3V0cHV0ICgjMTEyNykuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbFN0ZXBzKHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZTogYm9vbGVhbik6IFN0ZXBbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ0dlbmVyYXRlIC5ucG1yYyBmb3IgVGFrdW1pIEd1YXJkJyxcbiAgICAgIC8vIFRoZSB0b2tlbiBpcyB3cml0dGVuIGFzIGEgbGl0ZXJhbCBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2UgdGhhdCBidW4gZXhwYW5kcyBhdFxuICAgICAgLy8gaW5zdGFsbCB0aW1lLCBzbyB0aGUgc2VjcmV0IGl0c2VsZiBuZXZlciBsYW5kcyBpbiBhIGZpbGUuIFRoZSBtYW5hZ2VkIGxpbmVzIGFyZSBzdHJpcHBlZFxuICAgICAgLy8gZnJvbSBhbiBleGlzdGluZyAubnBtcmMgZmlyc3Q6IGEgcmVwb3NpdG9yeSBvdXRzaWRlIHRoZSBvcmdhbml6YXRpb25zIG1heSBsZWdpdGltYXRlbHlcbiAgICAgIC8vIGNvbW1pdCBvbmUgKHNjb3BlIG1hcHBpbmdzIGZvciBhbm90aGVyIHJlZ2lzdHJ5KSwgYW5kIGRyb3BwaW5nIG9ubHkgdGhlc2UgdHdvIGxpbmVzIGtlZXBzXG4gICAgICAvLyB0aGUgcmVzdCBvZiBpdCBpbiBlZmZlY3QuIFJlcGxhY2luZyB0aGUgZmlsZSB3aXRoIGBtdmAgcmF0aGVyIHRoYW4gYXBwZW5kaW5nIGluIHBsYWNlIHN0b3BzXG4gICAgICAvLyBhIGNvbW1pdHRlZCBzeW1saW5rIGZyb20gcmVkaXJlY3RpbmcgdGhlIHdyaXRlIGludG8sIHNheSwgYSBwZXJzaXN0ZW50IGhvbWUgbnBtcmMuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuTlBNUkM9XCIkKG1rdGVtcCBcIiRSVU5ORVJfVEVNUC9ucG1yYy5YWFhYWFhcIilcIlxuaWYgW1sgLWUgLm5wbXJjIF1dOyB0aGVuXG4gIGdyZXAgLXZFICdecmVnaXN0cnk9fF4vL25wbVxcXFwuZmxhdHRcXFxcLnRlY2gvOl9hdXRoVG9rZW4nIC5ucG1yYyA+IFwiJE5QTVJDXCIgfHwgdHJ1ZVxuZmlcbmVjaG8gJ3JlZ2lzdHJ5PWh0dHBzOi8vbnBtLmZsYXR0LnRlY2gvJyA+PiBcIiROUE1SQ1wiXG5lY2hvICcvL25wbS5mbGF0dC50ZWNoLzpfYXV0aFRva2VuPVxcJHtUQUtVTUlfR1VBUkRfVE9LRU59JyA+PiBcIiROUE1SQ1wiXG5ybSAtZiAubnBtcmNcbm12IFwiJE5QTVJDXCIgLm5wbXJjYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAvLyAtLWZyb3plbi1sb2NrZmlsZTogYSBwbGFpbiBgYnVuIGluc3RhbGxgIHNpbGVudGx5IHJlcGFpcnMgYSBidW4ubG9jayB0aGF0IGlzIHN0YWxlIGFnYWluc3RcbiAgICAgIC8vIHBhY2thZ2UuanNvbiwgc28gQ0kgd291bGQgcnVuIGRlcGVuZGVuY3kgcmVzb2x1dGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHJldmlld2VkICgjMTEyNikuXG4gICAgICAvLyBXaXRoIE5PIGJ1bi5sb2NrIGF0IGFsbCwgLS1mcm96ZW4tbG9ja2ZpbGUgc2lsZW50bHkgaW5zdGFsbHMgZnJlc2gsIHVucGlubmVkIHJlc29sdXRpb25zXG4gICAgICAvLyAoQnVuIDEuMy4xNCBleGl0cyAwIGFuZCB3cml0ZXMgbm8gbG9ja2ZpbGUpLCBzbyBhIG1pc3NpbmcgbG9ja2ZpbGUgbXVzdCBmYWlsIGV4cGxpY2l0bHkuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgW1sgISAtZSBidW4ubG9jayBdXTsgdGhlblxuICBlY2hvIFwiOjplcnJvcjo6YnVuLmxvY2sgaXMgbWlzc2luZzsgY29tbWl0IGl0IHNvIENJIGluc3RhbGxzIHN0YXkgcmVwcm9kdWNpYmxlXCJcbiAgZXhpdCAxXG5maVxuaWYgW1sgXCIkSEFTX1RBS1VNSV9HVUFSRF9UT0tFTlwiID09IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIC0taWdub3JlLXNjcmlwdHNcbmVsc2VcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVcbmZpYCxcbiAgICAgIC8vIFN0ZXAtc2NvcGVkOiBhIGpvYi1sZXZlbCB0b2tlbiB3b3VsZCBiZSByZWFkYWJsZSBieSBldmVyeSBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHQgdGhlXG4gICAgICAvLyB0b2tlbmxlc3MgcmVwbGF5IGJlbG93IHJ1bnMuXG4gICAgICBlbnY6IHsgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1J1biBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMnLFxuICAgICAgLy8gQSByZXBlYXRlZCBgYnVuIGluc3RhbGxgIGlzIGEgbm8tb3AgdGhhdCByZXBsYXlzIG5vdGhpbmcsIHNvIG5vZGVfbW9kdWxlcyBoYXMgdG8gZ28gZmlyc3QuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxucm0gLXJmIG5vZGVfbW9kdWxlc1xuYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUke1xuICAgICAgICB0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmVcbiAgICAgICAgICA/IGAgfHwge1xuICBlY2hvIFwiOjp3YXJuaW5nOjpMaWZlY3ljbGUgc2NyaXB0cyBmYWlsZWQ7IGNvbXBsZXRpbmcgdGhlIGluc3RhbGwgd2l0aG91dCB0aGVtXCJcbiAgcm0gLXJmIG5vZGVfbW9kdWxlc1xuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG59YFxuICAgICAgICAgIDogJydcbiAgICAgIH1gLFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1JlbW92ZSB0aGUgZ2VuZXJhdGVkIC5ucG1yYycsXG4gICAgICAvLyBOb3RoaW5nIGFmdGVyIHRoZSBpbnN0YWxsIG5lZWRzIHRoZSBwcm94eSwgYW5kIGxlYXZpbmcgaXQgaW4gcGxhY2Ugd291bGQgYnJlYWsgdGhlIG9uZVxuICAgICAgLy8gdGhpbmcgR3VhcmQgcmVmdXNlcyB0byBzZXJ2ZTogaXQgYW5zd2VycyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1LCBzbyBhIHJlbGVhc2Ugd29ya2Zsb3dcbiAgICAgIC8vIHdob3NlIHBhY2thZ2UgbGFja3MgYW4gZXhwbGljaXQgcHVibGlzaENvbmZpZy5yZWdpc3RyeSB3b3VsZCBmYWlsIHRvIHB1Ymxpc2guXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAtLSAubnBtcmMgPiAvZGV2L251bGwgMj4mMTsgdGhlblxuICBnaXQgY2hlY2tvdXQgLS0gLm5wbXJjXG5lbHNlXG4gIHJtIC1mIC5ucG1yY1xuZmlgLFxuICAgIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VtYW50aWNQcldvcmtmbG93KCk6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHsgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAvLyBUaGUgYWN0aW9uIHJlYWRzIHRoZSBwdWxsIHJlcXVlc3QsIGFuZCBpdHMgYHdpcGAgc3VwcG9ydCBwb3N0cyBhIGNvbW1pdCBzdGF0dXM7IG5laXRoZXJcbiAgICAgICAgLy8gcGVybWlzc2lvbiBpcyBncmFudGVkIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVzdHJpY3RzIGRlZmF1bHQgd29ya2Zsb3cgcGVybWlzc2lvbnMuXG4gICAgICAgIHBlcm1pc3Npb25zOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXM6IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7IHdpcDogdHJ1ZSB9LFxuICAgICAgICAgICAgZW52OiB7IEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbnRlcmZhY2UgTWlzZVRvbWwge1xuICB0b29scz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vLyBUaGUgb2xkZXN0IEJ1biBydW50aW1lIHdiZnkgc3VwcG9ydHMuXG5leHBvcnQgY29uc3QgbWluaW11bUJ1blZlcnNpb24gPSAnMS40LjAnO1xuXG4vKipcbiAqIFBpbnMgTm9kZS5qcyBhbmQgdGhlIGxhdGVzdCBCdW4gYW5kICh3aGVuIGZub3gudG9tbCBleGlzdHMpIGZub3ggdmVyc2lvbnMuIE9ubHkgdGhlIGNoYW5nZWQgcGluXG4gKiBsaW5lcyBhcmUgZWRpdGVkIGluIHBsYWNlOiByZS1zZXJpYWxpemluZyB0aGUgcGFyc2VkIFRPTUwgd291bGQgZHJvcCBldmVyeSBjb21tZW50IGFuZCBjb2xsYXBzZVxuICogbXVsdGktbGluZSBzdHJpbmdzIChlLmcuIG1pc2UgdGFzayBzY3JpcHRzKSBpbiB0aGUgcmVzdCBvZiB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTWlzZVRvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVNaXNlVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtaXNlVG9tbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdtaXNlLnRvbWwnKTtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZE1pc2VUb21sKG1pc2VUb21sUGF0aCk7XG4gICAgLy8gQSBwYXJzZSBmYWlsdXJlIG11c3QgYWJvcnQ6IGVkaXRpbmcgcGlucyBpbiBhIGJyb2tlbiBtaXNlLnRvbWwgd291bGQgaGlkZSB0aGUgYnJlYWthZ2UuXG4gICAgY29uc3QgdG9vbHMgPSAoQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgTWlzZVRvbWwpLnRvb2xzID8/IHt9O1xuXG4gICAgY29uc3QgcGluczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAvLyBFbnN1cmUgTm9kZS5qcyBpcyBhbHdheXMgcGlubmVkOiBnZW5lcmF0ZWQgaG9va3MgYW5kIENJIHJ1biBgbWlzZSBpbnN0YWxsYCwgYW5kIGFuIHVucGlubmVkXG4gICAgICAvLyBOb2RlIHdvdWxkIGNvbWUgZnJvbSB3aGF0ZXZlciBoYXBwZW5zIHRvIGJlIG9uIFBBVEguXG4gICAgICAvLyBMaWZ0LXRoZW4tcGluOiB0aGUgbGlmdCBvbmx5IHRvdWNoZXMgZXhhY3QgcGlucyBhbmQgdGhlIHBpbiBvbmx5IHRvdWNoZXMgc2VsZWN0b3JzLCBzb1xuICAgICAgLy8gb3JkZXJpbmcgdGhlIGxpZnQgZmlyc3QgYXZvaWRzIHJlc29sdmluZyBgbWlzZSBsYXRlc3Qgbm9kZUBsdHNgIHR3aWNlIGZvciB1bnBpbm5lZCByZXBvcy5cbiAgICAgIG5vZGU6IHBpbkNvbmNyZXRlVG9vbFZlcnNpb24oXG4gICAgICAgICdub2RlJyxcbiAgICAgICAgbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcignbm9kZUBsdHMnLCB0b29scy5ub2RlLCBjb25maWcuZGlyUGF0aCksXG4gICAgICAgIGNvbmZpZy5kaXJQYXRoXG4gICAgICApLFxuICAgICAgYnVuOiBwaW5MYXRlc3RUb29sVmVyc2lvbignYnVuJywgdG9vbHMuYnVuLCBjb25maWcuZGlyUGF0aCksXG4gICAgfTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIHBpbnMuZm5veCA9IHBpbkxhdGVzdFRvb2xWZXJzaW9uKCdmbm94JywgdG9vbHMuZm5veCwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cblxuICAgIGxldCBuZXdDb250ZW50ID0gY29udGVudDtcbiAgICBmb3IgKGNvbnN0IFt0b29sLCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhwaW5zKSkge1xuICAgICAgaWYgKHZlcnNpb24gPT09IHRvb2xzW3Rvb2xdKSBjb250aW51ZTtcbiAgICAgIGFzc2VydC5vayh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycsIGBUaGUgcmVzb2x2ZWQgJHt0b29sfSBwaW4gbXVzdCBiZSBhIHZlcnNpb24gc3RyaW5nLmApO1xuICAgICAgbmV3Q29udGVudCA9IHNldFRvb2xWZXJzaW9uKG5ld0NvbnRlbnQsIHRvb2wsIHZlcnNpb24pO1xuICAgICAgLy8gQSBsaW5lIGVkaXQgYnJlYWtzIHBpbnMgd3JpdHRlbiBpbiBhbnkgb3RoZXIgZm9ybSAoYSBtdWx0aS1saW5lIHZhbHVlLCBhIGB0b29scy5idW5gXG4gICAgICAvLyBkb3R0ZWQga2V5LCBhIGBbdG9vbHMuYnVuXWAgc3ViLXRhYmxlKSwgc28gbmV2ZXIgd3JpdGUgYSByZXN1bHQgdGhlIHBhcnNlciBkaXNhZ3JlZXMgd2l0aC5cbiAgICAgIGFzc2VydC5vayhcbiAgICAgICAgcGFyc2VUb29scyhuZXdDb250ZW50KT8uW3Rvb2xdID09PSB2ZXJzaW9uLFxuICAgICAgICBgV3JpdGUgdGhlICR7dG9vbH0gcGluIGluIG1pc2UudG9tbCBhcyBvbmUgXFxgJHt0b29sfSA9IC4uLlxcYCBsaW5lIHVuZGVyIFt0b29sc10uYFxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShtaXNlVG9tbFBhdGgsIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0VG9vbFZlcnNpb24oY29udGVudDogc3RyaW5nLCB0b29sOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBpbiA9IGAke3Rvb2x9ID0gXCIke3ZlcnNpb259XCJgO1xuICBjb25zdCBzZWN0aW9uID0gL15cXFt0b29sc1xcXSg/IVteXFxuXSkoPzpcXG4oPyFcXFspLiopKi9tdS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIGlmIChzZWN0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiBgJHtjb250ZW50ICYmIGAke2NvbnRlbnQudHJpbUVuZCgpfVxcblxcbmB9W3Rvb2xzXVxcbiR7cGlufVxcbmA7XG5cbiAgY29uc3QgcGluUGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3Rvb2x9ID0gLio/KFxcXFxzKiMuKik/JGAsICdtdScpO1xuICAvLyBCbGFuayBsaW5lcyBhbmQgY29tbWVudHMgdGhhdCBlbmQgdGhlIHNlY3Rpb24gbGVhZCB0aGUgbmV4dCB0YWJsZSwgc28gYSBuZXcgcGluIGdvZXMgYWJvdmUgdGhlbS5cbiAgY29uc3QgcGluc0VuZCA9IC8oPzpcXG5bXFx0IF0qKD86Iy4qKT8pKiQvdS5leGVjKHNlY3Rpb24pPy5pbmRleCA/PyBzZWN0aW9uLmxlbmd0aDtcbiAgY29uc3QgbmV3U2VjdGlvbiA9IHBpblBhdHRlcm4udGVzdChzZWN0aW9uKVxuICAgID8gc2VjdGlvbi5yZXBsYWNlKHBpblBhdHRlcm4sIGAke3Bpbn0kMWApXG4gICAgOiBgJHtzZWN0aW9uLnNsaWNlKDAsIHBpbnNFbmQpfVxcbiR7cGlufSR7c2VjdGlvbi5zbGljZShwaW5zRW5kKX1gO1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlKHNlY3Rpb24sICgpID0+IG5ld1NlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRvb2xzKGNvbnRlbnQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sKS50b29scztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogVXBkYXRlcyB0byB0aGUgbGF0ZXN0IHJlbGVhc2UgYWNyb3NzIG1ham9yIHZlcnNpb25zIHdpdGhvdXQgZG93bmdyYWRpbmcgZXhpc3RpbmcgZXhhY3QgcGlucy4gKi9cbmZ1bmN0aW9uIHBpbkxhdGVzdFRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgLy8gUmVzb2x2ZSBpbmRlcGVuZGVudGx5IG9mIHRoZSB0YXJnZXQncyB0cnVzdCBzdGF0ZSBhbmQgdG9vbCBhbGlhc2VzLlxuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJy0tbm8tY29uZmlnJywgJ2xhdGVzdCcsIHRvb2xdLCBjd2QpO1xuICBpZiAoIXNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pKSByZXR1cm4gdmVyc2lvbiA/PyAnbGF0ZXN0JztcbiAgLy8gQSBjYWNoZWQgcmVsZWFzZSBsaXN0aW5nIGNhbiBsYWcgYmVoaW5kIGFub3RoZXIgbWFjaGluZSB0aGF0IGFscmVhZHkgdXBkYXRlZCB0aGUgcGluLlxuICByZXR1cm4gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnICYmIHNlbXZlci52YWxpZCh2ZXJzaW9uKSAmJiBzZW12ZXIuZ3QodmVyc2lvbiwgcmVzb2x2ZWRWZXJzaW9uKVxuICAgID8gdmVyc2lvblxuICAgIDogcmVzb2x2ZWRWZXJzaW9uO1xufVxuXG4vKipcbiAqIExpZnRzIGFuIGV4YWN0IHRvb2wgcGluIGJlbG93IHRoZSBsYXRlc3QgcmVzb2x2YWJsZSB2ZXJzaW9uIOKAlCB3aXRoaW4gdGhlIFNBTUUgbWFqb3Ig4oCUIHRvIHRoYXRcbiAqIHZlcnNpb24gKE5vZGUuanMgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgbGF0ZXN0IExUUyk6IHRoZSByZXBvc2l0b3J5LXN0cnVjdHVyZSBzdGFuZGFyZCB0cmFja3MgdGhlXG4gKiBjdXJyZW50IHRvb2xjaGFpbiBhY3Jvc3MgcmVwb3NpdG9yaWVzIGFuZCBSZW5vdmF0ZSBkb2VzIG5vdCBtYW5hZ2UgbWlzZS50b21sIHBpbnMsIHNvXG4gKiBwYXRjaC9taW5vciBkcmlmdCAoZS5nLiBub2RlIDI0LjE2LjAgdnMgMjQuMTguMCkgbmV2ZXIgc2VsZi1oZWFscy4gQSBwaW5cbiAqIG9uIGFuIG9sZGVyIG1ham9yIGlzIGEgZGVsaWJlcmF0ZSBjb21wYXRpYmlsaXR5IGNob2ljZSBhbmQgaXMga2VwdCwgYXMgYXJlIG5vbi1leGFjdCBhbmRcbiAqIG5vbi1zdHJpbmcgZm9ybXMuIFdoZW4gbWlzZSBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBwaW4gaXMga2VwdC5cbiAqL1xuZnVuY3Rpb24gbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcihzZWxlY3Rvcjogc3RyaW5nLCB2ZXJzaW9uOiB1bmtub3duLCBjd2Q6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8ICFzZW12ZXIudmFsaWQodmVyc2lvbikpIHJldHVybiB2ZXJzaW9uO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbikgJiZcbiAgICBzZW12ZXIubWFqb3IobGF0ZXN0VmVyc2lvbikgPT09IHNlbXZlci5tYWpvcih2ZXJzaW9uKSAmJlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBsYXRlc3RWZXJzaW9uKVxuICAgID8gbGF0ZXN0VmVyc2lvblxuICAgIDogdmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbiB1bnBpbm5lZCBzZWxlY3RvciAoYGxhdGVzdGAsIGEgcmFuZ2Ugc3VjaCBhcyBcIjI0XCIsIGFuIGFsaWFzLCBvciBhIG1pc3NpbmcgZW50cnkpXG4gKiB3aXRoIHRoZSBuZXdlc3QgY29uY3JldGUgdmVyc2lvbiBtaXNlIHJlc29sdmVzIGZvciBpdCwgYmVjYXVzZSB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmVcbiAqIHN0YW5kYXJkIHJlcXVpcmVzIGNvbmNyZXRlIHBpbnM6IENJIGluc3RhbGxzIHdoYXRldmVyIGFuIHVucGlubmVkIHNlbGVjdG9yIHJlc29sdmVzIHRvIGF0IHJ1blxuICogdGltZSwgc28gYnVpbGRzIGRyaWZ0IGFjcm9zcyBydW5zLiBFeGFjdCB2ZXJzaW9ucyBhcmUga2VwdCBhcy1pcywgYW5kIG5vbi1zdHJpbmcgZm9ybXMgKG1pc2Unc1xuICogYXJyYXkgYW5kIGB7IHZlcnNpb24gPSBcIuKAplwiIH1gIGZvcm1zKSBhcmUgdXNlci1tYW5hZ2VkIGFuZCBsZWZ0IHVudG91Y2hlZC4gV2hlbiBtaXNlIGlzXG4gKiB1bmF2YWlsYWJsZSBvciBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBpcyBrZXB0IOKAlFxuICogYW4gdW5waW5uZWQgdG9vbCBpcyBiZXR0ZXIgdGhhbiBhIGJyb2tlbiBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8IHNlbXZlci52YWxpZCh2ZXJzaW9uKSkpIHJldHVybiB2ZXJzaW9uO1xuICAvLyBOb3JtYWxpemUgc2VsZWN0b3IgZm9ybXMgYG1pc2UgbGF0ZXN0YCBjYW5ub3QgcmVzb2x2ZSBldmVuIHRob3VnaCBtaXNlIGNvbmZpZ3VyYXRpb24gYWNjZXB0c1xuICAvLyB0aGVtOiBgcHJlZml4OjI0YCBpcyByZWplY3RlZCBvdXRyaWdodCB3aGlsZSBgMjRgIHJlc29sdmVzLCBhbmQgYGx0cy8qYCB5aWVsZHMgZW1wdHkgb3V0cHV0XG4gIC8vIHdoaWxlIGBsdHNgIHJlc29sdmVzLiBNb2RpZmllciBzZWxlY3RvcnMgc3VjaCBhcyBgc3ViLTI6bHRzYCBzdGF5IHVucmVzb2x2YWJsZSBhbmQgZmFsbCBiYWNrXG4gIC8vIHRvIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBiZWxvdy5cbiAgY29uc3QgcmFuZ2UgPSB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgPyB2ZXJzaW9uLnJlcGxhY2UoL15wcmVmaXg6L3UsICcnKS5yZXBsYWNlKC9cXC9cXCokL3UsICcnKSA6IHVuZGVmaW5lZDtcbiAgLy8gV2l0aCBubyBtZWFuaW5nZnVsIHNlbGVjdG9yLCBOb2RlLmpzIHBpbnMgdG8gdGhlIGxhdGVzdCBMVFMgKG1hdGNoaW5nIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MnXG4gIC8vIGBsdHMvKmAgZmFsbGJhY2spIHJhdGhlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZS5cbiAgY29uc3QgZGVmYXVsdFNlbGVjdG9yID0gdG9vbCA9PT0gJ25vZGUnID8gJ25vZGVAbHRzJyA6IHRvb2w7XG4gIGNvbnN0IHNlbGVjdG9yID0gcmFuZ2UgJiYgcmFuZ2UgIT09ICdsYXRlc3QnID8gYCR7dG9vbH1AJHtyYW5nZX1gIDogZGVmYXVsdFNlbGVjdG9yO1xuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJ2xhdGVzdCcsIHNlbGVjdG9yXSwgY3dkKTtcbiAgcmV0dXJuIHNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pID8gcmVzb2x2ZWRWZXJzaW9uIDogKHZlcnNpb24gPz8gJ2xhdGVzdCcpO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRvbWwobWlzZVRvbWxQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMobWlzZVRvbWxQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE9ubHkgYSByZXBvc2l0b3J5IHdpdGhvdXQgbWlzZS50b21sIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IGNvbmZpZ3VyYXRpb247IGFuIHVucmVhZGFibGUgZmlsZVxuICAgIC8vIChlLmcuIHBlcm1pc3Npb25zKSBtdXN0IGFib3J0IGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCBnZW5lcmF0ZWQgc2V0dGluZ3MuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gJyc7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZywgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLmpzJztcblxuLyoqXG4gKiBCdW4gcmVhZHMgcmVnaXN0cnkgc2NvcGUgbWFwcGluZ3MgZnJvbSBhIHBoeXNpY2FsIHJlcG9zaXRvcnkgLm5wbXJjIGR1cmluZyBSZW5vdmF0ZSBhcnRpZmFjdFxuICogdXBkYXRlczsgUmVub3ZhdGUncyBucG1yYyBzZXR0aW5nIGlzIHVzZWQgb25seSBieSBpdHMgZGF0YXNvdXJjZSBsYXllci4gS2VlcCB0aGUgbm9uLXNlY3JldFxuICogbWFwcGluZyBpbiByZXBvc2l0b3JpZXMgdGhhdCByZXNvbHZlIHByaXZhdGUgcGFja2FnZXMsIHdoaWxlIGF1dGhlbnRpY2F0aW9uIHJlbWFpbnMgaW4gdGhlXG4gKiBkZXZlbG9wZXIncyB+Ly5ucG1yYyBsb2NhbGx5IGFuZCBpbiB0ZW1wb3JhcnkgQ0kgb3IgTWVuZCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9BdXRob3IgPSBjb25maWdzWzBdPy5yZXBvQXV0aG9yO1xuICBpZiAocmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyJyAmJiByZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgY29uc3QgbnBtcmNQYXRocyA9IG5ldyBTZXQoY29uZmlncy5tYXAoKGNvbmZpZykgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJykpKTtcbiAgY29uc3Qgcm9vdENvbmZpZyA9IGNvbmZpZ3MuZmluZCgoY29uZmlnKSA9PiBjb25maWcuaXNSb290KTtcbiAgaWYgKHJvb3RDb25maWcgJiYgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKHJvb3RDb25maWcpKSB7XG4gICAgY29uc3Qgcm9vdE5wbXJjUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcubnBtcmMnKTtcbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHJvb3ROcG1yY1BhdGgsIHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyk7XG4gICAgbnBtcmNQYXRocy5kZWxldGUocm9vdE5wbXJjUGF0aCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSBhd2FpdCByZW1vdmVOcG1yYyhucG1yY1BhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVOcG1yYyhucG1yY1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChucG1yY1BhdGgpLmNhdGNoKCgpID0+IHt9KSkpIHJldHVybjtcbiAgaWYgKGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChucG1yY1BhdGgpKSB7XG4gICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIG5vbi1jYW5vbmljYWwgcmVwb3NpdG9yeSBucG1yYyAke25wbXJjUGF0aH0uYCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0OiAnYnJhbmNoJztcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnO1xuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGluY2x1ZGU6IHN0cmluZ1tdO1xuICAgICAgZXhjbHVkZTogc3RyaW5nW107XG4gICAgfTtcbiAgfTtcbiAgcnVsZXM6IChcbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2RlbGV0aW9uJyB8ICdub25fZmFzdF9mb3J3YXJkJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBib29sZWFuO1xuICAgICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiB7XG4gICAgICAgICAgICBjb250ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogbnVtYmVyO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiBudW1iZXI7XG4gICAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXTtcbiAgICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogYm9vbGVhbjtcbiAgICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ107XG4gICAgICAgIH07XG4gICAgICB9XG4gIClbXTtcbiAgYnlwYXNzX2FjdG9yczoge1xuICAgIGFjdG9yX2lkOiBudW1iZXI7XG4gICAgYWN0b3JfdHlwZTogJ1RlYW0nO1xuICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JztcbiAgfVtdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNvdXJjZV90eXBlPzogc3RyaW5nO1xufVxuXG5jb25zdCBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSID0ge1xuICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCA9IDE1XzM2ODtcblxuY29uc3QgUFJPVEVDVF9NQUlOX1JVTEVTRVQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCA9IHtcbiAgbmFtZTogJ1Byb3RlY3QgbWFpbicsXG4gIHRhcmdldDogJ2JyYW5jaCcsXG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJyxcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBleGNsdWRlOiBbXSxcbiAgICAgIGluY2x1ZGU6IFsnfkRFRkFVTFRfQlJBTkNIJ10sXG4gICAgfSxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZGVsZXRpb24nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGZhbHNlLFxuICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAndGVzdCAvIHRlc3QnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3NlbWFudGljLXByIC8gc2VtYW50aWMtcHInLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ25vbl9mYXN0X2ZvcndhcmQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IDAsXG4gICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXSxcbiAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBmYWxzZSxcbiAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBieXBhc3NfYWN0b3JzOiBbXG4gICAge1xuICAgICAgYWN0b3JfaWQ6IDE3Xzc3N180OTUsXG4gICAgICBhY3Rvcl90eXBlOiAnVGVhbScsXG4gICAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicpIHJldHVybjtcbiAgICAvLyBUaGUgcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gaG9zdHMgd29ya2Zsb3dfY2FsbCBkZWZpbml0aW9ucywgc28gdGhlXG4gICAgLy8gUHJvdGVjdCBtYWluIHJ1bGVzZXQgd291bGQgcmVxdWlyZSB0ZXN0L3NlbWFudGljLXByIGNoZWNrcyB0aGF0IG5ldmVyIHJ1biB0aGVyZS5cbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8oY29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIFJlcG9zaXRvcnkgcnVsZXNldHMgcmVxdWlyZSBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB3aGljaCBsb2NhbCBydW5zXG4gICAgICAvLyBtYXkgbm90IGhhdmUgZXZlbiB3aGVuIGZpbGUtZ2VuZXJhdGlvbiBhbmQgcHVzaGVzIGFyZSBhbGxvd2VkLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgY29uc3QgcnVsZXNldCA9IHN0cnVjdHVyZWRDbG9uZShQUk9URUNUX01BSU5fUlVMRVNFVCk7XG4gIGlmIChjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlc2V0LnJ1bGVzKSB7XG4gICAgICBpZiAocnVsZS50eXBlICE9PSAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIGNvbnRleHQgaXMgYDxjYWxsZXIgam9iIGlkPiAvIDxyZXVzYWJsZSBqb2IgaWQ+YCBvZiB0aGUgd2JmeS1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbC5cbiAgICAgIHJ1bGUucGFyYW1ldGVycy5yZXF1aXJlZF9zdGF0dXNfY2hlY2tzLnB1c2goe1xuICAgICAgICBjb250ZXh0OiAndGVzdC1ydXN0IC8gdGVzdC1ydXN0JyxcbiAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydWxlc2V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0ID0gYXdhaXQgZmluZFJlcG9zaXRvcnlSdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBydWxlc2V0Lm5hbWUpO1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXRJZCA9IGV4aXN0aW5nUnVsZXNldD8uaWQ7XG5cbiAgYXdhaXQgd2l0aFJldHJ5KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChleGlzdGluZ1J1bGVzZXRJZCkge1xuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgcnVsZXNldF9pZDogZXhpc3RpbmdSdWxlc2V0SWQsXG4gICAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5UnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdpdGhSZXRyeShcbiAgICAoKSA9PlxuICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgaW5jbHVkZXNfcGFyZW50czogZmFsc2UsXG4gICAgICAgIHRhcmdldHM6ICdicmFuY2gnLFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSksXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG4gIGNvbnN0IHJ1bGVzZXRzID0gcmVzcG9uc2UuZGF0YTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzZXRzKSkgcmV0dXJuO1xuICByZXR1cm4gcnVsZXNldHMuZmluZCgocnVsZXNldCkgPT4gcnVsZXNldC5uYW1lID09PSBydWxlc2V0TmFtZSAmJiBydWxlc2V0LnNvdXJjZV90eXBlID09PSAnUmVwb3NpdG9yeScpO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwR2l0SHViU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgaGFzX3dpa2k6IGZhbHNlLFxuICAgICAgICAgICAgaGFzX3Byb2plY3RzOiBmYWxzZSxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBMb2NhbCB3YmZ5IHJ1bnMgb2Z0ZW4gaGF2ZSBwdXNoIHBlcm1pc3Npb24gd2l0aG91dCBhZG1pbiBwZXJtaXNzaW9uLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwR2l0SHViU2V0dGluZ3MgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2l0aFJldHJ5KCgpID0+IGRpc2FibGVEaXNjdXNzaW9ucyhvY3Rva2l0LCBvd25lciwgcmVwbyksIHtcbiAgICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViU2V0dGluZ3NFcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBkaXNhYmxpbmcgR2l0SHViIERpc2N1c3Npb25zIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzYWJsZURpc2N1c3Npb25zKG9jdG9raXQ6IFJldHVyblR5cGU8dHlwZW9mIGdldE9jdG9raXQ+LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3NpdG9yeVJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5ncmFwaHFsPHsgcmVwb3NpdG9yeT86IHsgaWQ/OiBzdHJpbmcgfSB9PihcbiAgICBgcXVlcnkoJG93bmVyOiBTdHJpbmchLCAkcmVwbzogU3RyaW5nISkge1xuICAgICAgcmVwb3NpdG9yeShvd25lcjogJG93bmVyLCBuYW1lOiAkcmVwbykgeyBpZCB9XG4gICAgfWAsXG4gICAgeyBvd25lciwgcmVwbyB9XG4gICk7XG4gIGNvbnN0IHJlcG9zaXRvcnlJZCA9IHJlcG9zaXRvcnlSZXNwb25zZS5yZXBvc2l0b3J5Py5pZDtcbiAgaWYgKCFyZXBvc2l0b3J5SWQpIHJldHVybjtcbiAgYXdhaXQgb2N0b2tpdC5ncmFwaHFsKFxuICAgIGBtdXRhdGlvbigkaW5wdXQ6IFVwZGF0ZVJlcG9zaXRvcnlJbnB1dCEpIHtcbiAgICAgIHVwZGF0ZVJlcG9zaXRvcnkoaW5wdXQ6ICRpbnB1dCkgeyByZXBvc2l0b3J5IHsgaWQgfSB9XG4gICAgfWAsXG4gICAgeyBpbnB1dDogeyByZXBvc2l0b3J5SWQsIGhhc0Rpc2N1c3Npb25zRW5hYmxlZDogZmFsc2UgfSB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2V0dGluZ3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8ICEoJ2Vycm9ycycgaW4gZXJyb3IpIHx8ICFBcnJheS5pc0FycmF5KGVycm9yLmVycm9ycykpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVycm9yLmVycm9ycy5zb21lKFxuICAgIChncmFwaHFsRXJyb3I6IHVua25vd24pID0+XG4gICAgICAhIWdyYXBocWxFcnJvciAmJlxuICAgICAgdHlwZW9mIGdyYXBocWxFcnJvciA9PT0gJ29iamVjdCcgJiZcbiAgICAgICd0eXBlJyBpbiBncmFwaHFsRXJyb3IgJiZcbiAgICAgIFsnRk9SQklEREVOJywgJ0lOU1VGRklDSUVOVF9TQ09QRVMnLCAnTk9UX0ZPVU5EJ10uaW5jbHVkZXMoZ3JhcGhxbEVycm9yLnR5cGUgYXMgc3RyaW5nKVxuICApO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLy8gVGhlIGAvc3JjYCBlbnRyeSAoYSBkZWNsYXJlZCBleHBvcnQpIGxldHMgdGhpcyB3b3Jrc3BhY2UgY29uc3VtZXIgdXNlIHRoZSBzb3VyY2VzIHdpdGhvdXRcbi8vIGJ1aWxkaW5nIHNoYXJlZC1saWIgZmlyc3QsIGFzIGV2ZXJ5IG90aGVyIGltcG9ydCBvZiBpdCBpbiB0aGlzIHBhY2thZ2UgZG9lcy5cbmltcG9ydCB7XG4gIEJVR19JU1NVRV9TRUNUSU9OUyxcbiAgQ0hBTkdFX0lTU1VFX1NFQ1RJT05TLFxuICBQVUxMX1JFUVVFU1RfU0VDVElPTlMsXG4gIHJlbmRlclNlY3Rpb25UZW1wbGF0ZSxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgZ2V0RGVmYXVsdFByb3NlTGFuZ3VhZ2UgfSBmcm9tICcuLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcnVuQWxsSW5Qb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBnZW5lcmF0ZVRlbXBsYXRlcyA9IChsYW5ndWFnZU5vdGU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4gKHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbjwhLS0gV3JpdGUgZm9yIGEgcmV2aWV3ZXIgd2hvIGhhcyBub3QgZm9sbG93ZWQgdGhlIHdvcmsuJHtsYW5ndWFnZU5vdGV9IFNjYWxlIGVhY2ggc2VjdGlvbiB0byB0aGUgY2hhbmdlOiBhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lLiBEZWxldGUgdGhpcyBjb21tZW50IGFuZCB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYmVsb3cuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShQVUxMX1JFUVVFU1RfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9idWcubWQnOiBgXG4tLS1cbm5hbWU6IEJ1ZyAvIFByb2JsZW1cbmFib3V0OiBTb21ldGhpbmcgYmVoYXZlcyB3cm9uZ2x5XG50aXRsZTogJ2ZpeDogJ1xubGFiZWxzOiAndDogZml4IDpidWc6J1xuLS0tXG5cbjwhLS0gS2VlcCBQcm9ibGVtIGFuZCBQcm9wb3NhbDsgZGVsZXRlIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuJHtsYW5ndWFnZU5vdGV9IERlbGV0ZSB0aGVzZSBjb21tZW50cy4gLS0+XG5cbiR7cmVuZGVyU2VjdGlvblRlbXBsYXRlKEJVR19JU1NVRV9TRUNUSU9OUyl9XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2NoYW5nZS5tZCc6IGBcbi0tLVxubmFtZTogQ2hhbmdlIC8gRmVhdHVyZVxuYWJvdXQ6IFByb3Bvc2UgYSBjaGFuZ2UgdGhhdCBhIHRoaXJkIHBhcnR5IGNvdWxkIGltcGxlbWVudCB3aXRob3V0IGFza2luZyBhIHF1ZXN0aW9uXG50aXRsZTogJ2ZlYXQ6ICdcbmxhYmVsczogJ3Q6IGZlYXQgOnNwYXJrbGVzOidcbi0tLVxuXG48IS0tIEtlZXAgdGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGZvciBhbnkgY2hhbmdlIGFuZCBhZGQgdGhlIG90aGVycyBhcyB0aGUgY2hhbmdlIGdyb3dzOyBhIGxhcmdlIGNoYW5nZSBmaWxscyBhbGwgb2YgdGhlbSAoc3BlYy1ib29zdGVyIHJldmlld3MgYWdhaW5zdCB0aGlzIGxpc3QpLiR7bGFuZ3VhZ2VOb3RlfSBEZWxldGUgdGhlc2UgY29tbWVudHMuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShDSEFOR0VfSVNTVUVfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9jb25maWcueW1sJzogJ2JsYW5rX2lzc3Vlc19lbmFibGVkOiB0cnVlJyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGVtcGxhdGVzIGFyZSByZXBvc2l0b3J5LWxldmVsIGZpbGVzLCBzbyBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCBjcmVhdGUgdGhlbS5cbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyB8fCAhY29uZmlnLmlzUm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhbmd1YWdlTm90ZSA9XG4gICAgICBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZShjb25maWcpID09PSAnSmFwYW5lc2UnID8gJyBXcml0ZSBpbiBKYXBhbmVzZSwga2VlcGluZyB0aGUgaGVhZGluZ3MgYXMgdGhleSBhcmUuJyA6ICcnO1xuICAgIGF3YWl0IHJ1bkFsbEluUG9vbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdlbmVyYXRlVGVtcGxhdGVzKGxhbmd1YWdlTm90ZSkpLm1hcCgoW2ZpbGVOYW1lLCBjb250ZW50XSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IGFsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilgO1xuY29uc3QgYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucyA9IFtcbiAgbmV3IFJlZ0V4cChgXiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChgXmdpdGh1Yjoke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/aHR0cHM6Ly9naXRodWJcXFxcLmNvbS8ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP3NzaDovL2dpdEBnaXRodWJcXFxcLmNvbVs6L10ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKGBeKD86Z2l0XFxcXCspP2dpdEBnaXRodWJcXFxcLmNvbToke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLCAndScpLFxuXTtcblxuaW50ZXJmYWNlIERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlIHtcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZztcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBzZWN0aW9uTmFtZTogKHR5cGVvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpW251bWJlcl07XG4gIHNwZWNpZmllcjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHZvaWQge1xuICBjb25zdCBkaXNhbGxvd2VkU291cmNlcyA9IGNvbmZpZ3MuZmxhdE1hcChnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMpO1xuICBpZiAoZGlzYWxsb3dlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlscyA9IGRpc2FsbG93ZWRTb3VyY2VzXG4gICAgLm1hcChcbiAgICAgICh7IGRlcGVuZGVuY3lOYW1lLCBkaXJQYXRoLCBzZWN0aW9uTmFtZSwgc3BlY2lmaWVyIH0pID0+XG4gICAgICAgIGAtICR7cGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKX06ICR7c2VjdGlvbk5hbWV9LiR7ZGVwZW5kZW5jeU5hbWV9IHVzZXMgJHtzcGVjaWZpZXJ9YFxuICAgIClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEaXNhbGxvd2VkIEdpdCBkZXBlbmRlbmN5IHNvdXJjZXMgZm91bmQuXFxuT25seSBXaWxsQm9vc3RlciBhbmQgV2lsbEJvb3N0ZXJMYWIgR2l0SHViIGRlcGVuZGVuY2llcyBhcmUgYWxsb3dlZC5cXG4ke2RldGFpbHN9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm4gW107XG5cbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXM6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uTmFtZSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFja2FnZUpzb25bc2VjdGlvbk5hbWVdO1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgc3BlY2lmaWVyXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCFzcGVjaWZpZXIpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAoaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcblxuICAgICAgZGlzYWxsb3dlZFNvdXJjZXMucHVzaCh7XG4gICAgICAgIGRlcGVuZGVuY3lOYW1lLFxuICAgICAgICBkaXJQYXRoOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgc2VjdGlvbk5hbWUsXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlzYWxsb3dlZFNvdXJjZXM7XG59XG5cbmZ1bmN0aW9uIGlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcikgfHxcbiAgICAvXig/OmJpdGJ1Y2tldHxnaXN0fGdpdGh1YnxnaXRsYWIpOi91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eaHR0cHM/OlxcL1xcLyg/OmJpdGJ1Y2tldFxcLm9yZ3xnaXRodWJcXC5jb218Z2l0bGFiXFwuY29tKVxcLy91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86aHR0cHM/fHNzaCk6XFwvXFwvXFxTK1xcLmdpdCg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15bXkBcXHNdK0BbXjpcXHNdKzpcXFMrKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0OicpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdCsnKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdzc2g6Ly9naXRAJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eW2EtekEtWjAtOV1bXFx3Li1dKlxcL1tcXHcuLV0rKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmZ1bmN0aW9uIGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHNwZWNpZmllcikpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3IsIGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4Q2hha3JhVG9hc3RlciB9IGZyb20gJy4vZml4ZXJzL2NoYWtyYVRvYXN0ZXIuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQge1xuICBnZW5lcmF0ZUJ1bmZpZ1RvbWwsXG4gIGhhc0N1cnJlbnRCdW5SZWxlYXNlQWdlRXhjbHVkZXMsXG4gIHJlYWRCdW5HbG9iYWxTdG9yZSxcbiAgcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlLFxufSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVGbm94VG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9mbm94VG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdlbWluaUNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzLCByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dsb2JhbFJlbGVhc2VBZ2VHYXRlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9vayB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uLCBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhSYWlsd2F5aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUsIHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb25jLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBlbnN1cmVXYkVudkRlZmluaXRpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3diRW52LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9zZWxmQ29udGFpbmVkV29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWlzZVRvbWwsIG1pbmltdW1CdW5WZXJzaW9uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL21pc2VUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL25wbXJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgfSBmcm9tICcuL2dpdGh1Yi9ydWxlc2V0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcsIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzIH0gZnJvbSAnLi91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VUeXBlU2NyaXB0QXBpIH0gZnJvbSAnLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGdldFdiZnlWZXJzaW9uLCBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi91dGlscy92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuLyoqXG4gKiBBcHBsaWVzIG9ubHkgdGhlIGdsb2JhbCByZWxlYXNlLWFnZSBnYXRlLCB3aXRob3V0IHRvdWNoaW5nIGFueSByZXBvc2l0b3J5LiBTcGVsbGVkIG91dCBpbiBmdWxsXG4gKiByYXRoZXIgdGhhbiBzaG9ydGVuZWQgKGUuZy4gYGdhdGVgKSBiZWNhdXNlIHRoZSBkZWZhdWx0IGNvbW1hbmQgdGFrZXMgcG9zaXRpb25hbCBwYXRoczogYSBzaG9ydFxuICogbmFtZSB3b3VsZCBzd2FsbG93IGEgZGlyZWN0b3J5IHRoYXQgaGFwcGVucyB0byBzaGFyZSBpdC5cbiAqL1xuY29uc3QgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQgPSAnYXBwbHktcmVsZWFzZS1hZ2UtZ2F0ZSc7XG4vKiogU2FtZSBuYW1pbmcgcmF0aW9uYWxlIGFzIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLiAqL1xuY29uc3QgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCA9ICdnZW5lcmF0ZS11c2VyLWFnZW50LWNvbmZpZ3MnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKFxuICAgICAgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQsXG4gICAgICBcIkFwcGx5IG9ubHkgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoaXMgbWFjaGluZSdzIGdsb2JhbCBwYWNrYWdlLW1hbmFnZXIgY29uZmlnc1wiXG4gICAgKVxuICAgIC5jb21tYW5kKFxuICAgICAgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCxcbiAgICAgIFwiT3ZlcndyaXRlIHRoaXMgdXNlcidzIGFnZW50IGluc3RydWN0aW9uIGZpbGVzICh+Ly5jb2RleC9BR0VOVFMubWQsIH4vLmNsYXVkZS9DTEFVREUubWQsIH4vLmdlbWluaS9HRU1JTkkubWQpIHdpdGggdGhlIG9yZ2FuaXphdGlvbidzIGZpeGVkIGNvbnRlbnQgYW5kIG1lcmdlIHRoZSBvcmdhbml6YXRpb24ncyBzZXR0aW5ncyBpbnRvIH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uIGFuZCB+Ly5nZW1pbmkvc2V0dGluZ3MuanNvblwiXG4gICAgKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBmb3JjZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGx5IHdiZnkgZXZlbiB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgcmVjb3JkcyB0aGlzIHdiZnkgdmVyc2lvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZicsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ1NraXAgYWRkaW5nIG1hbmFnZWQgZGVwZW5kZW5jaWVzIGFuZCB0aGUgbGlua2VyIHByb2JlICh0aGUgZmluYWwgYGJ1biBpbnN0YWxsYCByZWZyZXNoaW5nIHRoZSBsb2NrZmlsZSBzdGlsbCBydW5zKScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFdiZnlWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuXG4gIC8vIERlbGliZXJhdGVseSBiZWZvcmUgdGhlIEJ1biBjaGVjayBpbiB3aWxsYm9vc3RlcmlmeVBhdGhzKCk6IHRoZSBnYXRlIG11c3QgYmUgYXBwbGlhYmxlIG9uIGFcbiAgLy8gbWFjaGluZSB3aG9zZSBCdW4gaXMgb3V0ZGF0ZWQsIHdoaWNoIGlzIGV4YWN0bHkgYSBtYWNoaW5lIHRoYXQgc3RpbGwgbmVlZHMgZ2F0aW5nLlxuICBpZiAoYXJndi5fWzBdID09PSBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCkge1xuICAgIGlmICghZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCkpIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYXJndi5fWzBdID09PSBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kKSB7XG4gICAgaWYgKCEoYXdhaXQgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzKCkpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGF3YWl0IHdpbGxib29zdGVyaWZ5UGF0aHMoYXJndi5wYXRocyBhcyBzdHJpbmdbXSwgYXJndi5za2lwRGVwcywgYXJndi5mb3JjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgY29tcGlsZXIgc2VydmVyIHNwYXduZWQgZm9yIEFTVCBwYXJzaW5nIGtlZXBzIGFuIG9wZW4gSVBDXG4gICAgLy8gY2hhbm5lbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBwcmV2ZW50IHRoZSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAgIGF3YWl0IGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk7XG4gIH1cbiAgaWYgKGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnKSB7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2lsbGJvb3N0ZXJpZnlQYXRocyhwYXRoczogc3RyaW5nW10sIHNraXBEZXBzOiBib29sZWFuLCBmb3JjZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBCZWZvcmUgYW55dGhpbmcgZWxzZSDigJQgZXZlbiB0aGUgQnVuIGNoZWNrIGJlbG93OiB0aGUgZGV2ZWxvcGVyIG1hY2hpbmUncyBnbG9iYWxcbiAgLy8gcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MgbXVzdCByZWNlaXZlIHRoZSBvcmcncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSBvbiBFVkVSWSBydW4sXG4gIC8vIGJlY2F1c2UgdGhleSBhcmUgd2hhdCBndWFyZHMgYnJhbmQtbmV3IGxvY2FsIHByb2plY3RzIHRoYXQgaGF2ZSBubyB3YmZ5LWdlbmVyYXRlZCByZXBvc2l0b3J5XG4gIC8vIGNvbmZpZyB5ZXQsIGFuZCB0aGF0IHByb3RlY3Rpb24gbXVzdCB3b3JrIGJlZm9yZSB0aGUgc3VwcG9ydGVkLXZlcnNpb24gY2hlY2suXG4gIGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpO1xuXG4gIC8vIHdiZnkgbWFuYWdlcyByZXBvc2l0b3JpZXMgdGhyb3VnaCBCdW4gKyBtaXNlIGFuZCB1c2VzIEJ1biAxLjQgcnVudGltZSBBUElzLiBUaGUgdmVyc2lvbiBmbG9vclxuICAvLyBhbHNvIGVuc3VyZXMgdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBvcHRpb25zIHByb2R1Y2UgdGhlIGluc3RhbGwgbGF5b3V0IHdiZnkgdmFsaWRhdGVzLiBJdFxuICAvLyBzdGF5cyB1bmNvbmRpdGlvbmFsIGV2ZW4gdGhvdWdoIHRoZSBhbHJlYWR5LWFwcGxpZWQgY2hlY2sgYmVsb3cgY2FuIG1ha2UgYSBydW4gYSBuby1vcDogYW5cbiAgLy8gb3V0ZGF0ZWQgQnVuIGlzIGEgYnJva2VuIGVudmlyb25tZW50IHdiZnkgbXVzdCByZXBvcnQsIGFuZCBoaWRpbmcgaXQgd2hlbmV2ZXIgZXZlcnkgcGF0aFxuICAvLyBoYXBwZW5zIHRvIGJlIHNraXBwZWQgd291bGQgc3VyZmFjZSBpdCBvbmx5IGxhdGVyLlxuICBjb25zdCBidW5WZXJzaW9uID0gQnVuLnZlcnNpb247XG4gIGlmIChCdW4uc2VtdmVyLm9yZGVyKGJ1blZlcnNpb24sIG1pbmltdW1CdW5WZXJzaW9uKSA8IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGB3YmZ5IHJlcXVpcmVzIEJ1biA+PSAke21pbmltdW1CdW5WZXJzaW9ufSAoZm91bmQgJHtidW5WZXJzaW9ufSkuIFVwZ3JhZGUgQnVuIGFuZCByZS1ydW4uYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBBIGAtZGlydHktbG9jYWxgIGxhYmVsIGlkZW50aWZpZXMgYW4gZWRpdGVkIGNoZWNrb3V0LCB3aG9zZSBuZXh0IGJ1aWxkIHByb2R1Y2VzIGRpZmZlcmVudCBmaWxlc1xuICAvLyB1bmRlciB0aGUgc2FtZSBsYWJlbCwgc28gc3VjaCBhIHJ1biBpcyBuZXZlciB0cmVhdGVkIGFzIGFscmVhZHkgYXBwbGllZC5cbiAgY29uc3QgdmVyc2lvbkxhYmVsID0gZ2V0V2JmeVZlcnNpb25MYWJlbCgpO1xuICBjb25zdCBza2lwcGFibGVWZXJzaW9uTGFiZWwgPVxuICAgICFmb3JjZSAmJiB2ZXJzaW9uTGFiZWwgJiYgIXZlcnNpb25MYWJlbC5lbmRzV2l0aCgnLWRpcnR5LWxvY2FsJykgPyB2ZXJzaW9uTGFiZWwgOiB1bmRlZmluZWQ7XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIGZvciAoY29uc3QgaW5wdXREaXJQYXRoIG9mIHBhdGhzKSB7XG4gICAgLy8gTm9ybWFsaXplIG9uY2UgYXQgdGhlIENMSSBib3VuZGFyeS4gR2VuZXJhdG9ycyB1c2UgZGlyUGF0aCBmb3IgY3dkIGFuZCBiYXNlbmFtZSBkZWNpc2lvbnM7XG4gICAgLy8gbGVhdmluZyB0aGUgc3VwcG9ydGVkIGRlZmF1bHQgYC5gIHVucmVzb2x2ZWQgd291bGQgZ2VuZXJhdGUgYW4gaW52YWxpZCBwYWNrYWdlIG5hbWUgb2YgYC5gLlxuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGlucHV0RGlyUGF0aCk7XG4gICAgLy8gQ29uZmluZSBldmVyeSBnZW5lcmF0ZWQgZmlsZSB0byB0aGlzIHJlcG9zaXRvcnkgKHNlZSBmc1V0aWwuZ2VuZXJhdGVGaWxlKS4gU2V0IEJFRk9SRSBhbnlcbiAgICAvLyBmaXhlciB3cml0ZXMsIGFuZCByZXNldCBvbiBldmVyeSBpdGVyYXRpb24gc28gYSBtdWx0aS1wYXRoIHJ1biBuZXZlciBrZWVwcyB0aGUgcHJldmlvdXMgcm9vdC5cbiAgICBmc1V0aWwuc2V0Um9vdERpclBhdGgoZnMuZXhpc3RzU3luYyhyb290RGlyUGF0aCkgPyByb290RGlyUGF0aCA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBUaGUgYmFkZ2UgcmVjb3JkcyB0aGUgYnVpbGQgdGhhdCBnZW5lcmF0ZWQgdGhlIHJlcG9zaXRvcnkncyBjb25maWd1cmF0aW9uLCBzbyB0aGUgc2FtZSBidWlsZFxuICAgIC8vIHdvdWxkIG9ubHkgcmV3cml0ZSB3aGF0IGlzIGFscmVhZHkgdGhlcmUuIFNraXBwaW5nIGlzIGEgZGVsaWJlcmF0ZSB0cmFkZTogdGhlIHBhcnRzIG9mIGEgcnVuXG4gICAgLy8gdGhhdCBkZXBlbmQgb24gc3RhdGUgT1VUU0lERSB0aGUgcmVwb3NpdG9yeSAoR2l0SHViIHNldHRpbmdzLCBkZXBlbmRlbmN5IHVwZGF0ZXMsIHRoZSBmZXRjaGVkXG4gICAgLy8gLmdpdGlnbm9yZSkgZG8gZ2V0IHNraXBwZWQgdG9vLCB3aGljaCBpcyB3aGF0IC0tZm9yY2UgaXMgZm9yLiBUaGUgcmVsZWFzZS1hZ2UgZXhlbXB0aW9ucyBhcmVcbiAgICAvLyB0aGUgZXhjZXB0aW9uOiB0aGV5IGV4cGlyZSBieSBkYXRlLCBhbmQgcmVzdG9yaW5nIHRoZSBnYXRlIG11c3Qgbm90IHdhaXQgZm9yIGEgbmV3IGJ1aWxkLlxuICAgIGlmIChcbiAgICAgIHNraXBwYWJsZVZlcnNpb25MYWJlbCAmJlxuICAgICAgKGF3YWl0IHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChyb290RGlyUGF0aCkpID09PSBza2lwcGFibGVWZXJzaW9uTGFiZWwgJiZcbiAgICAgIGhhc0N1cnJlbnRCdW5SZWxlYXNlQWdlRXhjbHVkZXMocm9vdERpclBhdGgpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgJHtyb290RGlyUGF0aH06IHdiZnkgJHtza2lwcGFibGVWZXJzaW9uTGFiZWx9IGlzIGFscmVhZHkgYXBwbGllZC4gUGFzcyAtLWZvcmNlIHRvIHJlLWFwcGx5LmApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBwYWNrYWdlc1N1YkRpclBhdGhzID0gZGlyZW50c1xuICAgICAgLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKVxuICAgICAgLm1hcCgoZCkgPT4gcGF0aC5yZXNvbHZlKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG4gICAgLy8gQWxzbyBjb3ZlciB3b3Jrc3BhY2VzIGRlY2xhcmVkIG91dHNpZGUgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0aGV5IHJlY2VpdmUgdGhlIHNhbWVcbiAgICAvLyBtYW5hZ2VkIGNvbmZpZ3MgKHRzY29uZmlnLmpzb24sIHBhY2thZ2UuanNvbiBjb252ZW50aW9ucywg4oCmKSBhcyBwYWNrYWdlcy8qIGNoaWxkcmVuLlxuICAgIGNvbnN0IHJvb3RQYWNrYWdlSnNvbiA9XG4gICAgICBpZ25vcmVFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXVxuICAgICAgKSA/PyB7fTtcbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGg6IHJvb3REaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb246IHJvb3RQYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBwYWNrYWdlc1N1YkRpclBhdGhzLnNvbWUoKHN1YkRpclBhdGgpID0+XG4gICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgICksXG4gICAgfSk7XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBbLi4ubmV3IFNldChbLi4ucGFja2FnZXNTdWJEaXJQYXRocywgLi4ud29ya3NwYWNlU3ViRGlyUGF0aHNdKV0uZmlsdGVyKFxuICAgICAgKHN1YkRpclBhdGgpID0+IHN1YkRpclBhdGggIT09IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aClcbiAgICApO1xuXG4gICAgLy8gUmVmdXNlZCB3cml0ZXMgb24gY29yZSBtYW5hZ2VkIGZpbGVzIHdvdWxkIGxlYXZlIHRoZSByZXBvc2l0b3J5IHBhcnRpYWxseSB1cGRhdGVkLCBzbyBza2lwXG4gICAgLy8gaXQgQkVGT1JFIGFueSBtdXRhdGlvbiB3aGVuIG9uZSBvZiB0aGVtIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICAgIGNvbnN0IG1hbmFnZWRGaWxlUGF0aHMgPSBbXG4gICAgICAuLi5bJy5naXRhdHRyaWJ1dGVzJywgJ2J1bmZpZy50b21sJywgJ2xlZnRob29rLnltbCcsICdwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCBuYW1lKVxuICAgICAgKSxcbiAgICAgIC4uLnN1YkRpclBhdGhzLmZsYXRNYXAoKHN1YkRpclBhdGgpID0+XG4gICAgICAgIFsncGFja2FnZS5qc29uJywgJ3RzY29uZmlnLmpzb24nXS5tYXAoKG5hbWUpID0+IHBhdGgucmVzb2x2ZShzdWJEaXJQYXRoLCBuYW1lKSlcbiAgICAgICksXG4gICAgXTtcbiAgICBjb25zdCB3cml0YWJsZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hbmFnZWRGaWxlUGF0aHMubWFwKChmaWxlUGF0aCkgPT4gZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKVxuICAgICk7XG4gICAgaWYgKHdyaXRhYmxlUmVzdWx0cy5pbmNsdWRlcyhmYWxzZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06IGEgbWFuYWdlZCBjb25maWcgZmlsZSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZsaWdodEVycm9ycyA9IFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VDb25maWdbJ3BhY2thZ2VKc29uJ107XG4gICAgICAgIGNvbnN0IGVycm9yID0gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcih7IHBhY2thZ2VKc29uIH0pO1xuICAgICAgICByZXR1cm4gZXJyb3IgPyBbYCR7ZGlyUGF0aH06ICR7ZXJyb3J9YF0gOiBbXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW2Ake3BhY2thZ2VKc29uUGF0aH0gaXMgaW52YWxpZGBdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChwcmVmbGlnaHRFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTpcXG4ke3ByZWZsaWdodEVycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIExldCBnZXRQYWNrYWdlQ29uZmlnIGRlcml2ZSBpc1Jvb3QgZm9yIHRoZSBlbnRyeSBwYXRoOiBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gIGlzIGFcbiAgICAvLyBzdXBwb3J0ZWQgaW52b2NhdGlvbiB3aG9zZSB0YXJnZXQgbXVzdCBrZWVwIGl0cyBjaGlsZCBjbGFzc2lmaWNhdGlvbiwgc28gZm9yY2luZ1xuICAgIC8vIGBpc1Jvb3Q6IHRydWVgIGhlcmUgd291bGQgYXBwbHkgcm9vdC1vbmx5IHByb2Nlc3NpbmcgKGxlZnRob29rIGluc3RhbGwsIHJvb3QgdHNjb25maWcsXG4gICAgLy8gQUdFTlRTLm1kLCDigKYpIHRvIGEgc3VicGFja2FnZS5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBFdmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSAoaW5jbHVkaW5nIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyopIGlzIGEgY2hpbGRcbiAgICAvLyBwYWNrYWdlOyB0aGUgcGFja2FnZXMvKiBoZXVyaXN0aWMgaW5zaWRlIGdldFBhY2thZ2VDb25maWcgd291bGQgbWlzY2xhc3NpZnkgYXBwcy8qIGFzIHJvb3RzLlxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCB7IGlzUm9vdDogZmFsc2UgfSkpXG4gICAgKTtcbiAgICBjb25zdCBpbnZhbGlkU3ViUGFja2FnZURpclBhdGggPSBzdWJEaXJQYXRocy5maW5kKFxuICAgICAgKHN1YkRpclBhdGgsIGluZGV4KSA9PiAhbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlnc1tpbmRleF0gJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICk7XG4gICAgaWYgKGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogJHtpbnZhbGlkU3ViUGFja2FnZURpclBhdGh9L3BhY2thZ2UuanNvbiBpcyBpbnZhbGlkLmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcbiAgICAvLyBUaGUgbWFuYWdlZCBpZ25vcmUgcnVsZSBpcyB1bmFuY2hvcmVkLCBzbyBhIG5lc3RlZCBjb3B5IChlLmcuIHdvcmtlcnMvYXBpLy5lbnYuY2xvdWRmbGFyZSkgaXNcbiAgICAvLyBhcyBtdWNoIGEgbGVhayBhcyBhIHJvb3Qgb25lOyB0aGUgd2lsZGNhcmQgcGF0aHNwZWMgY292ZXJzIGV2ZXJ5IGRlcHRoIGluIG9uZSBxdWVyeS5cbiAgICBjb25zdCB0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzID0gYWxsUGFja2FnZUNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuaXNDbG91ZGZsYXJlKVxuICAgICAgPyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgICAgICAgJ2dpdCcsXG4gICAgICAgICAgWyctYycsICdjb3JlLnF1b3RlUGF0aD1mYWxzZScsICdscy1maWxlcycsICctLScsICcuZW52LmNsb3VkZmxhcmUnLCAnKi8uZW52LmNsb3VkZmxhcmUnXSxcbiAgICAgICAgICByb290Q29uZmlnLmRpclBhdGhcbiAgICAgICAgKVxuICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKSlcbiAgICAgIDogW107XG4gICAgaWYgKHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFNFQ1VSSVRZIEVSUk9SOiBDbG91ZGZsYXJlIGNyZWRlbnRpYWxzIG11c3QgYmUgdW50cmFja2VkLiBSZW1vdmUgJHt0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzLmpvaW4oXG4gICAgICAgICAgJywgJ1xuICAgICAgICApfSBmcm9tIEdpdCwgcHVyZ2UgdGhlIHRva2VuIGZyb20gaGlzdG9yeSwgYW5kIHJvdGF0ZSBDTE9VREZMQVJFX0FQSV9UT0tFTiBiZWZvcmUgcmVydW5uaW5nIHdiZnkuYFxuICAgICAgKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBmaXhUeXBvc1Byb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGF3YWl0IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gTWFuYWdlZCByZXBvc2l0b3JpZXMgdXNlIEJ1biB3aXRoIG1pc2UgKGFuZCBvcHRpb25hbGx5IGZub3gpLlxuICAgIGNvbnN0IHByZXZpb3VzQnVuR2xvYmFsU3RvcmUgPSByZWFkQnVuR2xvYmFsU3RvcmUocm9vdERpclBhdGgpO1xuICAgIC8vIFJvb3QtbGV2ZWwgaW5zdGFsbCBsYXlvdXQgbXVzdCBjb3ZlciB3b3Jrc3BhY2UgYXBwcyB0b286IE5leHQuanMgY29tbW9ubHkgbGl2ZXMgdW5kZXJcbiAgICAvLyBwYWNrYWdlcy8qIG9yIGFwcHMvKiB3aGlsZSBidW5maWcudG9tbCBleGlzdHMgb25seSBhdCB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgIGNvbnN0IHVzZUdsb2JhbFN0b3JlID0gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKGFsbFBhY2thZ2VDb25maWdzLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCBza2lwRGVwcyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBnZW5lcmF0ZU1pc2VUb21sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZyk7XG4gICAgLy8gUnVuIGFmdGVyIGdlbmVyYXRlRm5veFRvbWwgc28gaXRzIHRyYW5zYWN0aW9uYWwgcmVjaXBpZW50IHN5bmMgY2Fubm90IHJlc3RvcmUgYSBzbmFwc2hvdFxuICAgIC8vIG92ZXIgZGVmaW5pdGlvbnMgaW5zZXJ0ZWQgaGVyZS5cbiAgICBhd2FpdCBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIC8vIFRoZSBsYXlvdXQgbXVzdCBiZSB2ZXJpZmllZCBpbnN0YWxsYWJsZSBCRUZPUkUgYW55IGBidW4gYWRkYCBtdXRhdGVzIHBhY2thZ2UuanNvbiBmaWxlczpcbiAgICAvLyBwZXItcGFja2FnZSBpbnN0YWxscyB0b2xlcmF0ZSBmYWlsdXJlcyAoc3Bhd25TeW5jIGRpc2NhcmRzIHRoZWlyIHN0YXR1cyksIHNvIGEgbGF5b3V0IHRoYXRcbiAgICAvLyBjYW5ub3QgaW5zdGFsbCB3b3VsZCBzaWxlbnRseSBkcm9wIGV2ZXJ5IG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGUgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4uXG4gICAgLy8gQSBkb2NzLW9ubHkgcmVwb3NpdG9yeSBoYXMgbm8gbWFuaWZlc3QgdG8gcHJvYmUgb24gaXRzIGZpcnN0IHJ1bjsgZ2VuZXJhdGVQYWNrYWdlSnNvbiBiZWxvd1xuICAgIC8vIGNyZWF0ZXMgaXQgYmVmb3JlIHRoZSBhdXRob3JpdGF0aXZlIHJlZnJlc2hCdW5Mb2NrIGNoZWNrLlxuICAgIGlmIChcbiAgICAgICFza2lwRGVwcyAmJlxuICAgICAgcm9vdENvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmXG4gICAgICAhcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwocm9vdERpclBhdGgsIHJvb3RDb25maWcsIHByZXZpb3VzQnVuR2xvYmFsU3RvcmUsIHVzZUdsb2JhbFN0b3JlKVxuICAgICkge1xuICAgICAgLy8gcmVmcmVzaEJ1bkxvY2sgYmVsb3cgaXMgdGhlIGF1dGhvcml0eSBvbiB3aGV0aGVyIHRoZSBmaW5hbCBpbnN0YWxsIGZhaWxlZC5cbiAgICAgIGNvbnNvbGUud2FybihgYnVuIGluc3RhbGwgY3VycmVudGx5IGZhaWxzIGluICR7cm9vdERpclBhdGh9IHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIC8vIE90aGVyIG93bmVycyBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGUgd29ya2Zsb3dzICh0aGVpciBzZWNyZXRzIGFuZCBydW5uZXJzXG4gICAgLy8gZG8gbm90IGV4aXN0IHRoZXJlKSwgc28gYW55IG90aGVyIEdpdEh1Yi1ob3N0ZWQgTm9kZS5qcyByZXBvc2l0b3J5IGdldHMgc2VsZi1jb250YWluZWRcbiAgICAvLyB3b3JrZmxvd3MgaW5zdGVhZCDigJQga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3MgaWRlbnRpdHkuXG4gICAgLy8gcm9vdENvbmZpZy5pc1Jvb3Q6IGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIChgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKSBrZWVwc1xuICAgIC8vIGlzUm9vdCBmYWxzZSwgYW5kIEdpdEh1YiBpZ25vcmVzIHdvcmtmbG93IGZpbGVzIG5lc3RlZCB1bmRlciBhIHBhY2thZ2UgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHNob3VsZFJ1blNlbGZDb250YWluZWRXb3JrZmxvd3MgPVxuICAgICAgIXNob3VsZFJ1bldvcmtmbG93cyAmJlxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgICEhcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6JykgJiZcbiAgICAgIHJvb3RDb25maWcuaXNSb290O1xuICAgIC8vIGZpeFR5cG9zIHJlYWQtbW9kaWZ5LXdyaXRlcyB0aGUgTWFya2Rvd24gYW5kIFlBTUwgZmlsZXMgdGhhdCB0aGUgZ2VuZXJhdG9ycyBiZWxvdyByZXdyaXRlLlxuICAgIGF3YWl0IGZpeFR5cG9zUHJvbWlzZTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZml4UmFpbHdheWlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICAuLi4oc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA/IFtnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3Mocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgLy8gR2l0IGhvb2tzIGFyZSByZXBvc2l0b3J5LWxldmVsIHN0YXRlOiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCB3cml0ZSBhXG4gICAgICAvLyBjaGlsZCBsZWZ0aG9vay55bWwgb3IgcmVwbGFjZSB0aGUgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyBob29rIGluc3RhbGxhdGlvbi5cbiAgICAgIC4uLihyb290Q29uZmlnLmlzUm9vdCA/IFtnZW5lcmF0ZUxlZnRob29rKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgXSk7XG4gICAgLy8gQWZ0ZXIgdGhlIHdvcmtmbG93IGdlbmVyYXRvciAoYW5kIGl0cyBwb29sZWQgd3JpdGVzKSBzbyB0aGUgaW5zdHJ1Y3Rpb24gZmlsZXMgZGVzY3JpYmUgdGhlXG4gICAgLy8gZmluYWxpemVkIHdvcmtmbG93IGZpbGVzIGluc3RlYWQgb2YgbGFnZ2luZyBvbmUgcnVuIGJlaGluZC5cbiAgICBhd2FpdCBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4Q2hha3JhVG9hc3Rlcihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSmF2YShjb25maWcpKSBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcERlcHMpO1xuXG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJiBkb2VzQ29udGFpbkpzT3JUcyhyb290Q29uZmlnKSkge1xuICAgICAgICAvLyBNb25vcmVwbyB2ZXJpZmljYXRpb24gY2FuIGludm9rZSBveGxpbnQgZnJvbSBldmVyeSB3b3Jrc3BhY2UuIEdpdmVcbiAgICAgICAgLy8gbm9uLWNvZGUgcGFja2FnZXMgYSBsb2NhbCBjb25maWcgc28gb3hsaW50IGRvZXMgbm90IGNsaW1iIHRvIHRoZVxuICAgICAgICAvLyByb290IGNvbmZpZyBhbmQgcmVqZWN0IHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMgZnJvbSBhIHBhY2thZ2UgY3dkLlxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAvLyBSdW4gYWZ0ZXIgZXZlcnkgcG9vbGVkIGdlbmVyYXRvciB3cml0ZSBzbyBub3JtYWxpemF0aW9uIGNhbm5vdCBvdmVyd3JpdGUgYSBjb25jdXJyZW50XG4gICAgLy8gdXBkYXRlLCBhbmQgYmVmb3JlIGNsZWFudXAgc28gZm9ybWF0dGVyIG1ldGFkYXRhIGNhY2hlcyBvYnNlcnZlIHRoZSBjaGFuZ2VkIGZpbGVzLlxuICAgIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhyb290RGlyUGF0aCk7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBmYWlsZWQgaW5zdGFsbCBtdXN0IGZhaWwgdGhlIENMSTogZXhpdGluZyAwIHdpdGggYSBzdGFsZSBvciBtaXNzaW5nIEJ1biBsb2NrZmlsZSB3b3VsZFxuICAgICAgLy8gaGlkZSBhIGJyb2tlbiBtYW5hZ2VkIGNvbmZpZ3VyYXRpb24uXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gQnVuIHdyaXRlcyBidW4ubG9jayBiZWZvcmUgbGlmZWN5Y2xlIHNjcmlwdHMsIHNvIGEgZmFpbGVkIGluc3RhbGwgY2FuIHN0aWxsIGxlYXZlIEd1YXJkXG4gICAgICAvLyBVUkxzIGJlaGluZC4gTm9ybWFsaXplIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBvdXRwdXQgd2l0aG91dCByZXBsYWNpbmcgdGhlIGluc3RhbGwgZXJyb3IuXG4gICAgICBjb25zdCBub3JtYWxpemVkTG9ja2ZpbGVQYXRoID0gbm9ybWFsaXplQnVuTG9ja2ZpbGUocm9vdERpclBhdGgpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRMb2NrZmlsZVBhdGgpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtub3JtYWxpemVkTG9ja2ZpbGVQYXRofSB0byBrZWVwIGl0IHJlZ2lzdHJ5LWFnbm9zdGljLmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbm9ybWFsaXplIHRoZSBCdW4gbG9ja2ZpbGU6JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcik7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgfVxuICAgIHNwYXduU3luYygnYnVuJywgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gaGFzSW52YWxpZFBhY2thZ2VDb25maWc7XG59XG5cbi8qKlxuICogUHJvYmVzIGBidW4gaW5zdGFsbGAgdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci4gQW4gaW5jb21wYXRpYmlsaXR5IG11c3QgYmUgZml4ZWQgaW4gdGhlXG4gKiByZXBvc2l0b3J5IG9yIGluIHdiZnkncyBtYW5hZ2VkIGxpc3RzLCBuZXZlciBieSBzd2l0Y2hpbmcgdGhlIGxpbmtlci4gUmV0dXJucyBmYWxzZSB3aGVuIHRoZVxuICogaW5zdGFsbCBmYWlscy5cbiAqL1xuZnVuY3Rpb24gcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgLy8gQSBsYXlvdXQgc3dpdGNoIG11c3QgcHJvYmUgZnJvbSBhIGNsZWFuIHRyZWUgYmVjYXVzZSBCdW4gZG9lcyBub3QgcmVtb3ZlIHRoZSBwcmV2aW91cyBsYXlvdXQncyBsZWZ0b3ZlcnMuXG4gIGlmIChwcmV2aW91c0dsb2JhbFN0b3JlICE9PSB1c2VHbG9iYWxTdG9yZSkge1xuICAgIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgfVxuICAvLyBSZXRyeSBvbmNlIHNvIGEgdHJhbnNpZW50IGZhaWx1cmUgKHJlZ2lzdHJ5IGhpY2N1cCwgZmxha3kgbGlmZWN5Y2xlIHNjcmlwdCkgZG9lcyBub3RcbiAgLy8gbWFzcXVlcmFkZSBhcyBhIGxheW91dCBpbmNvbXBhdGliaWxpdHkuXG4gIGlmIChzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCwgMSkgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIC8vIENsZWFuIHVwIHRoZSBmYWlsZWQgYXR0ZW1wdCBzbyBsYXRlciBpbnN0YWxscyBkbyBub3QgcnVuIG9uIGEgcG9sbHV0ZWQgdHJlZS5cbiAgcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGgsIHJvb3RDb25maWcpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoOiBzdHJpbmcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gQ292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlOiBsZWZ0b3ZlcnMgY2FuIGtlZXAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgcmVzb2x2YWJsZS5cbiAgY29uc3Qgbm9kZU1vZHVsZXNQYXRocyA9IFtcbiAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnKSxcbiAgICAuLi5bLi4uZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykudmFsdWVzKCldLm1hcCgod29ya3NwYWNlRGlyKSA9PlxuICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCB3b3Jrc3BhY2VEaXIsICdub2RlX21vZHVsZXMnKVxuICAgICksXG4gIF07XG4gIC8vIE5ldmVyIGRlbGV0ZSB0aHJvdWdoIGEgd29ya3NwYWNlIHN5bWxpbmsgdGhhdCBlc2NhcGVzIHRoaXMgcmVwb3NpdG9yeS5cbiAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2Ygbm9kZU1vZHVsZXNQYXRocykge1xuICAgIGNvbnN0IHJlYWxQYXJlbnREaXJQYXRoID0gaWdub3JlRXJyb3IoKCkgPT4gZnMucmVhbHBhdGhTeW5jKHBhdGguZGlybmFtZShub2RlTW9kdWxlc1BhdGgpKSk7XG4gICAgaWYgKFxuICAgICAgIXJlYWxQYXJlbnREaXJQYXRoIHx8XG4gICAgICAocmVhbFBhcmVudERpclBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJiAhcmVhbFBhcmVudERpclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpO1xuICBpZiAoc3RhdHVzID09PSAwKSByZXR1cm47XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNDYsNDcsNDgsNDksNTAsNTFdLCJtYXBwaW5ncyI6Imk0QkFXQSxNQUFhLEdBQW9ELENBQy9ELENBQ0UsUUFBUyxNQUNULFlBQWEsc0dBQ2YsRUFDQSxDQUNFLFFBQVMsZUFDVCxZQUNFLHFuQkFDSixFQUNBLENBQ0UsUUFBUyxtQkFDVCxZQUNFLDRHQUNKLEVBQ0EsQ0FDRSxRQUFTLG9CQUNULFlBQ0UseUtBQ0osRUFDQSxDQUNFLFFBQVMsVUFDVCxZQUFhLCtEQUNmLEVBQ0EsQ0FDRSxRQUFTLFFBQ1QsWUFBYSxzR0FDZixDQUNGLEVBb0NhLEdBQWlELENBQzVELENBQUUsUUFBUyxVQUFXLFlBQWEsOENBQStDLEVBQ2xGLENBQUUsUUFBUyxXQUFZLFlBQWEsNkNBQThDLEVBQ2xGLENBQUUsUUFBUyxTQUFVLFlBQWEsd0NBQXlDLEVBQzNFLENBQUUsUUFBUyxXQUFZLFlBQWEsdURBQXdELENBQzlGLEVBUWEsRUFBb0QsQ0FDL0QsQ0FDRSxRQUFTLHNCQUNULFlBQWEsd0VBQ2YsRUFDQSxDQUNFLFFBQVMsV0FDVCxZQUNFLGtOQUNKLEVBQ0EsQ0FDRSxRQUFTLHNCQUNULFlBQ0Usd0dBQ0osRUFDQSxDQUNFLFFBQVMsc0JBQ1QsWUFBYSxtR0FDZixFQUNBLENBQ0UsUUFBUyxxQkFDVCxZQUNFLDBPQUNKLEVBQ0EsQ0FDRSxRQUFTLDhCQUNULFlBQWEsbUdBQ2YsRUFDQSxDQUNFLFFBQVMsZUFDVCxZQUFhLGdGQUNmLEVBQ0EsQ0FDRSxRQUFTLGlCQUNULFlBQWEsd0ZBQ2YsQ0FDRixFQVFBLFNBQWdCLEdBQXNCLEVBQThDLENBQ2xGLE9BQU8sRUFDSixJQUNFLEdBQ0MsTUFBTSxFQUFRLFFBQVEsV0FBVyxFQUFRLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBUSxZQUFZ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
515
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsImZzIiwicGFyc2VKc29uYyIsImZzcCIsInJlbGVhc2VBZ2VHYXRlLmRheXMiLCJyZWxlYXNlQWdlR2F0ZS5leGNsdWRlcyIsInJlbGVhc2VBZ2VHYXRlLnRlbXBvcmFyeUV4Y2x1ZGVzIiwibmV3Q29udGVudCIsImNvbW1vbkNvbnRlbnQiLCJuZXdDb250ZW50IiwiY2hpbGRfcHJvY2VzcyIsImNvbW1vbkNvbnRlbnQiLCJjaGlsZF9wcm9jZXNzIiwic29ydE9iamVjdEtleXMiLCJnaXRIb29rcyIsImRldGVjdE5ld2xpbmUiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJjb3JlIiwibWFuYWdlZENvbmZpZ0Jsb2NrcyIsImdldENvbmZpZ0NvbnRlbnQiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliL3NyYy9naXRodWJUZW1wbGF0ZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9zbGVlcC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvdGV4dC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3Rlc3RpbmdSdWxlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuV29ya3NwYWNlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuTG9ja2ZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2RvY2tlcmZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2dsb2IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3V0aWxzL3R5cGVzY3JpcHRBcGkudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL2NoYWtyYVRvYXN0ZXIudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9mbm94VG9tbC50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy91dGlscy93b3Jrc3BhY2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy50cyIsIi4uL3NyYy91dGlscy9zaGVsbFBhcnNlci50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93UnVubmVyUG9saWN5LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvanNvbmNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LnRzIiwiLi4vc3JjL3V0aWxzL3NwYXduVXRpbC50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYWdlbnRzLnRzIiwiLi4vY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uIiwiLi4vc3JjL2dlbmVyYXRvcnMvYnVuZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2lnbm9yZUZpbGVVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuc2lvbnMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nbG9iYWxSZWxlYXNlQWdlR2F0ZS50cyIsIi4uL3NyYy91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3Mvc29ydC1vYmplY3Qta2V5c0AyLjEuMC0xOGRmMmY4MzdlNmVjMjlhL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2RldGVjdC1pbmRlbnRANy4wLjItNmI3NWRjMGY1NjUzM2JkOS9ub2RlX21vZHVsZXMvZGV0ZWN0LWluZGVudC9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtbmV3bGluZUA0LjAuMS01ZGE5ZGY2NTEyNWVlNzk1L25vZGVfbW9kdWxlcy9kZXRlY3QtbmV3bGluZS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9naXQtaG9va3MtbGlzdEA0LjIuMS02Y2EyYjI2OWQ5MTYzMzJlL25vZGVfbW9kdWxlcy9naXQtaG9va3MtbGlzdC9pbmRleC5qc29uIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2lzLXBsYWluLW9iakA0LjEuMC00N2ZkZGQ3NzA2NDhlNTc3L25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3Mvc29ydC1wYWNrYWdlLWpzb25ANC4wLjAtODNkMGFmZmNiYjliM2M4NS9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9jb25maWdDb250ZW50LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWFuYWdlZENvbmZpZ0Jsb2NrLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hmbXRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGxpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdXNlckFnZW50Q29uZmlncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd2JFbnYudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9zZWxmQ29udGFpbmVkV29ya2Zsb3cudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9taXNlVG9tbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL25wbXJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvcnVsZXNldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHNlY3Rpb24gb2YgYSBQUiBvciBpc3N1ZSBib2R5OiBpdHMgaGVhZGluZyBhbmQgd2hhdCB0aGUgc2VjdGlvbiBtdXN0IHN0YXRlLiBgcmVxdWlyZW1lbnRgXG4gKiBzdGFydHMgbG93ZXJjYXNlIGFuZCBlbmRzIHdpdGhvdXQgcHVuY3R1YXRpb24sIHNvIHRoYXQgaXQgcmVhZHMgYm90aCBhcyBhIHBsYWNlaG9sZGVyIHNlbnRlbmNlXG4gKiAoY2FwaXRhbGl6ZWQsIHdpdGggYSBwZXJpb2QgYXBwZW5kZWQpIGFuZCBhcyBhIGNoZWNrbGlzdCBjbGF1c2UgYWZ0ZXIgdGhlIGhlYWRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVTZWN0aW9uIHtcbiAgcmVhZG9ubHkgaGVhZGluZzogc3RyaW5nO1xuICByZWFkb25seSByZXF1aXJlbWVudDogc3RyaW5nO1xufVxuXG4vKiogU2VjdGlvbnMgb2YgYSBwdWxsIHJlcXVlc3QgYm9keSwgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBQUiB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBjb25zdCBQVUxMX1JFUVVFU1RfU0VDVElPTlM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdID0gW1xuICB7XG4gICAgaGVhZGluZzogJ1doeScsXG4gICAgcmVxdWlyZW1lbnQ6ICd0aGUgcHJvYmxlbSwgd2l0aCB0aGUgbnVtYmVycyBvciBvYnNlcnZhdGlvbnMgYmVoaW5kIGl0LCBhbmQgd2h5IHRoaXMgYXBwcm9hY2ggb3ZlciB0aGUgYWx0ZXJuYXRpdmVzJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdSZXF1aXJlbWVudHMnLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgXCJ0aGUgcmVxdWlyZW1lbnRzIHRoZSBjaGFuZ2UgbXVzdCBzYXRpc2Z5IGFuZCB0aGUgZ3VhcmFudGVlcyBpdCBtdXN0IGtlZXAgYXMgdGhleSBzdGFuZCBub3csIG9uZSBwZXIgbGluZSwgZWFjaCBtYXJrZWQgYHJlcXVpcmVkYCAoYXNrZWQgZm9yIGJ5IHRoZSByZXF1ZXN0ZXIsIG9yIGFuIGV4aXN0aW5nIGNvbnRyYWN0IGNhbGxlcnMgZGVwZW5kIG9uKSBvciBgY2hvc2VuYCAodGhlIGltcGxlbWVudGVyJ3Mgb3duIGRlY2lzaW9uIHdpdGggdGhlIHJlYXNvbiB0aGF0IGRlY2lkZWQgaXQsIHdoaWNoIGEgc2ltcGxlciBkZXNpZ24gbWF5IHJlcGxhY2UpOyBzdGF0ZSB0aGUgcmVxdWVzdGVyJ3MgaW5zdHJ1Y3Rpb25zIGluIHRoZSByZXF1ZXN0ZXIncyB0ZXJtcywgd2hldGhlciB0aGV5IGNhbWUgZnJvbSBhbiBpc3N1ZSBvciBhIGNvbnZlcnNhdGlvbiwgYW5kIGtlZXAgZWFjaCBsaW5lIGFzIGl0IGlzIHVudGlsIHRoZSByZXF1ZXN0ZXIgb3ZlcnJpZGVzIG9yIHdpdGhkcmF3cyB0aGUgaW5zdHJ1Y3Rpb24gYmVoaW5kIGl0IG9yIHRoZSBkZWNpc2lvbiBiZWhpbmQgaXQgY2hhbmdlcywgYW5kIHRoZW4gcmV3cml0ZSBvciByZW1vdmUgdGhhdCBsaW5lIGluc3RlYWQgb2YgYWRkaW5nIG9uZSBiZXNpZGUgaXRcIixcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdDdXN0b21lciBTdW1tYXJ5JyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdiZWhhdmlvciwgd29ya2Zsb3csIG9yIHVzZXItdmlzaWJsZSBjaGFuZ2VzLCB3cml0dGVuIGZvciByZWFkZXJzIHdobyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGltcGxlbWVudGF0aW9uJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdUZWNobmljYWwgU3VtbWFyeScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnZGVjaXNpb25zIGFuZCB0aGVpciByZWFzb25zLCBkYXRhIGZsb3csIHdoZXJlIHRvIGxvb2sgKHRoZSBmaWxlcyB0aGF0IG1hdHRlciBtb3N0KSwgYW5kIHdoYXQgdG8gY2hlY2sgaGFyZGVzdDogdGhlIHBhcnRzIHdob3NlIGNvcnJlY3RuZXNzIGlzIGFyZ3VlZCByYXRoZXIgdGhhbiBwcm92ZW4nLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1Rlc3RpbmcnLFxuICAgIHJlcXVpcmVtZW50OiAnY29tbWFuZHMgcnVuLCB0ZXN0cyBhZGRlZCwgYW5kIHdoYXQgd2FzIE5PVCBleGVyY2lzZWQgYW5kIHdoeScsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnTm90ZXMnLFxuICAgIHJlcXVpcmVtZW50OiAna25vd24gbGltaXRhdGlvbnMsIGNvbXBhdGliaWxpdHkgYW5kIG1pZ3JhdGlvbiwgZm9sbG93LXVwIHdvcms7IGRlbGV0ZSB0aGlzIHNlY3Rpb24gaWYgdGhlcmUgaXMgbm9uZScsXG4gIH0sXG5dO1xuXG4vKipcbiAqIEhvdyBhIHRvb2wgdGhhdCB3cml0ZXMgb3IgcmV3cml0ZXMgYSBQUiBib2R5IGRlcml2ZXMgaXQgZnJvbSB0aGUgcmVwb3NpdG9yeSdzIFBSIHRlbXBsYXRlLCBhc1xuICogbWFya2Rvd24gYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnMuIFN0YXRlZCBvbmNlIGhlcmUgYW5kIHJlbmRlcmVkIGJ5IGV2ZXJ5IHdyaXRlciAodGhlXG4gKiBnZW5lcmF0ZWQgYWdlbnQgaW5zdHJ1Y3Rpb25zLCB0aGUgUFItZHJhZnRpbmcgc2tpbGxzKSBzbyB0aGUgd3JpdGVycyBjYW5ub3QgZHJpZnQgYXBhcnQ7IHRoZVxuICogdGVtcGxhdGUtbGVzcyBicmFuY2ggbGV0cyB0aGUgc2FtZSB0ZXh0IHNlcnZlIHJlcG9zaXRvcmllcyBvdXRzaWRlIHRoZSBvcmdhbml6YXRpb24uXG4gKi9cbmNvbnN0IFBVTExfUkVRVUVTVF9URU1QTEFURV9SVUxFUyA9IGAtIEJhc2UgdGhlIFBSIGJvZHkgb24gXFxgLmdpdGh1Yi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWRcXGAgd2hlbiBjcmVhdGluZyBvciB1cGRhdGluZyBhIFBSLCBldmVuIHdoZW4gYSBza2lsbCBvciB3b3JrZmxvdyBzdXBwbGllcyBpdHMgb3duIHNrZWxldG9uOiBrZWVwIHRoZSB0ZW1wbGF0ZSdzIGhlYWRpbmdzIGluIG9yZGVyLCBmaWxsIGVhY2ggc2VjdGlvbiB3aXRoIHdoYXQgaXRzIHBsYWNlaG9sZGVyIGNvbW1lbnQgYXNrcyBmb3IgYXQgYSBsZW5ndGggZml0dGluZyB0aGUgY2hhbmdlIChhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lKSwgYW5kIGRlbGV0ZSB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYW5kIGFuIGVtcHR5IE5vdGVzIHNlY3Rpb24uIFdpdGhvdXQgYSB0ZW1wbGF0ZSwgdXNlIG5vIGZpeGVkIGhlYWRpbmdzOiBzdGF0ZSB0aGUgc2NvcGUsIHRoZSBtb3RpdmF0aW9uLCBhbmQgdGhlIHZlcmlmaWNhdGlvbiBjb25jaXNlbHkuXG4tIFN0YXJ0IHRoZSBib2R5IHdpdGggXFxgQ2xvc2UgIzxuPlxcYCBvbmx5IHdoZW4gdGhlIFBSIHJlc29sdmVzIGFuIGV4aXN0aW5nIGlzc3VlLmA7XG5cbi8qKlxuICogSG93IGEgdG9vbCB0aGF0IHdyaXRlcyBvciByZXdyaXRlcyBhIFBSIGJvZHkgZmlsbHMgdGhlIFJlcXVpcmVtZW50cyBzZWN0aW9uIG9mXG4gKiBgUFVMTF9SRVFVRVNUX1NFQ1RJT05TYCwgYXMgbWFya2Rvd24gYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnMuIFNraWxscyB0aGF0IGRyYWZ0IFBSXG4gKiBib2RpZXMgcmVuZGVyIHRoaXMgdGV4dCBpbnN0ZWFkIG9mIHJlc3RhdGluZyBpdCwgc28gdGhlIHdyaXRlcnMgYW5kIHRoZSByZXZpZXdlcnMgdGhhdCByZWFkIHRoZVxuICogc2VjdGlvbiBhcyB0aGUgYm91bmRhcnkgYSBmaXggbXVzdCBrZWVwIG5ldmVyIGRpc2FncmVlIG9uIHdoYXQgYSBsaW5lIG1lYW5zLlxuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX1JFUVVJUkVNRU5UU19SVUxFUyA9IGAtIFJlcXVpcmVtZW50cyBzZWN0aW9uOiB0aGUgcmVxdWlyZW1lbnRzIGluIGZvcmNlIG5vdywgb25lIGxpbmUgcGVyIHJlcXVpcmVtZW50LCB0YWtlbiBmcm9tIHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgaW4gdGhlIHJlcXVlc3RlcidzIHRlcm1zICh0aGUgaXNzdWUsIHRoZSBjb252ZXJzYXRpb24gdGhhdCBhc2tlZCBmb3IgdGhlIGNoYW5nZSksIGVhY2ggbWFya2VkIFxcYHJlcXVpcmVkXFxgIChhc2tlZCBmb3IsIG9yIGFuIGV4aXN0aW5nIGNvbnRyYWN0IGNhbGxlcnMgZGVwZW5kIG9uKSBvciBcXGBjaG9zZW5cXGAgKHlvdXIgb3duIGRlY2lzaW9uIHdpdGggdGhlIHJlYXNvbiB0aGF0IGRlY2lkZWQgaXQsIHdoaWNoIGEgc2ltcGxlciBkZXNpZ24gbWF5IHJlcGxhY2UpLiBOZXZlciBpbmZlciBhIHJlcXVpcmVtZW50IGZyb20gdGhlIGRpZmY6IHdoZW4gbm8gaXNzdWUsIFBSIG1lc3NhZ2UsIG9yIGNvbnZlcnNhdGlvbiBzdGF0ZXMgdGhlIHJlcXVlc3QsIHdyaXRlIFxcYHJlcXVpcmVkOiBub3QgcmVjb3JkZWQg4oCUIGFzayB0aGUgcmVxdWVzdGVyXFxgIGFzIHRoZSBvbmx5IHJlcXVlc3QtZGVyaXZlZCBsaW5lIChhIFxcYHJlcXVpcmVkXFxgIGxpbmUgZm9yIGFuIGV4aXN0aW5nIGNvbnRyYWN0IGNhbGxlcnMgZGVwZW5kIG9uIG1heSBzdGlsbCBiZSBsaXN0ZWQpIGFuZCBzYXkgc28gaW4gTm90ZXMuXG4tIEN1cnJlbnQtc3RhdGUgcnVsZTogYW4gZXhpc3RpbmcgUmVxdWlyZW1lbnRzIHNlY3Rpb24gcmVjb3JkcyB3aGF0IHRoZSByZXF1ZXN0ZXIgYXNrZWQgZm9yIGFuZCB3aGF0IHdhcyBkZWNpZGVkIGFzIGl0IHN0YW5kcyBub3c7IGl0IGlzIG5laXRoZXIgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZGlmZiBub3IgYSBsb2cgb2YgaG93IHRoZSByZXF1ZXN0IGV2b2x2ZWQuIEtlZXAgZWFjaCBsaW5lIGFzIGl0IGlzIHVudGlsIHRoZSByZXF1ZXN0ZXIgb3ZlcnJpZGVzIG9yIHdpdGhkcmF3cyB0aGUgaW5zdHJ1Y3Rpb24gYmVoaW5kIGl0IG9yIHRoZSBkZWNpc2lvbiBiZWhpbmQgaXQgY2hhbmdlcywgYW5kIHRoZW4gcmV3cml0ZSBvciByZW1vdmUgdGhhdCBsaW5lIGluc3RlYWQgb2YgYXBwZW5kaW5nIGEgbGluZSBiZXNpZGUgaXQ7IHdpdGggbm8gaW5zdHJ1Y3Rpb25zIGF2YWlsYWJsZSwga2VlcCB0aGUgcmVxdWVzdGVyLWRlcml2ZWQgbGluZXMgdW5jaGFuZ2VkLiBOZXZlciBtYXJrIHdoZW4gYSBsaW5lIHdhcyBhZGRlZCAoZS5nLiwgXCIoYWRkZWQpXCIpLCBhbmQgYWRkIGEgXFxgY2hvc2VuXFxgIGxpbmUgZm9yIGVhY2ggbmV3IGRlY2lzaW9uLiBXaGVuIHRoZSBjdXJyZW50IGRlc2lnbiBjYW5ub3QgYmUgdW5kZXJzdG9vZCB3aXRob3V0IHRoZSBjaGFuZ2Ugb2YgZGlyZWN0aW9uLCBzdGF0ZSBpdCBpbiBvbmUgc2VudGVuY2UgaW4gTm90ZXMuIEEgc2VjdGlvbiB0aGF0IG1lcmVseSBkZXNjcmliZXMgdGhlIGltcGxlbWVudGF0aW9uLCBvciBob2xkcyBvbmx5IHRoZSB0ZW1wbGF0ZSdzIHBsYWNlaG9sZGVyIG9yIGEgXFxgcmVxdWlyZWQ6IG5vdCByZWNvcmRlZFxcYCBsaW5lLCBpcyBub3QgYSByZWNvcmQ6IHdyaXRlIGl0IGFmcmVzaCBieSB0aGUgcnVsZSBhYm92ZS5cbi0gUGxhY2UgdGhlIHNlY3Rpb24gd2hlcmUgdGhlIHRlbXBsYXRlIHB1dHMgaXQ7IHdoZW4gdGhlIHRlbXBsYXRlIGhhcyBubyBzdWNoIGhlYWRpbmcsIHJpZ2h0IGFmdGVyIHRoZSBpc3N1ZS1jbG9zaW5nIGxpbmUsIG9yIGF0IHRoZSB0b3Agb2YgdGhlIGJvZHkgd2hlbiB0aGVyZSBpcyBub25lLlxuLSBOZXZlciBkcm9wIG9yIHdlYWtlbiBhIFxcYHJlcXVpcmVkXFxgIGxpbmUgdG8gZml0IHdoYXQgd2FzIGltcGxlbWVudGVkOiB3aGVuIG9uZSBjYW5ub3QgaG9sZCBpbiB0aGUgZGlmZiwga2VlcCBpdCBhbmQgc2F5IHNvIGluIE5vdGVzLmA7XG5cbi8qKiBUaGUgY29tcGxldGUgcnVsZXMgZm9yIHdyaXRpbmcgYSBQUiBib2R5OiB0aGUgdGVtcGxhdGUgcnVsZXMgZm9sbG93ZWQgYnkgdGhlIFJlcXVpcmVtZW50cyBydWxlcy4gKi9cbmV4cG9ydCBjb25zdCBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUyA9IGAke1BVTExfUkVRVUVTVF9URU1QTEFURV9SVUxFU31cXG4ke1BVTExfUkVRVUVTVF9SRVFVSVJFTUVOVFNfUlVMRVN9YDtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgY3JlYXRlcyBhbiBpc3N1ZSBkZXJpdmVzIGl0IGZyb20gdGhlIHJlcG9zaXRvcnkncyBpc3N1ZSB0ZW1wbGF0ZXMsIGFzIG1hcmtkb3duXG4gKiBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9uczsgc2hhcmVkIGJ5IHRoZSBzYW1lIHdyaXRlcnMgYXMgYFBVTExfUkVRVUVTVF9CT0RZX1JVTEVTYC5cbiAqIEd1aWRhbmNlIHRoZSB0ZW1wbGF0ZXMgc3RhdGUgaW4gdGhlaXIgb3duIHBsYWNlaG9sZGVyIGNvbW1lbnRzICh3aGljaCBzZWN0aW9ucyB0byBrZWVwLCBkZWxldGluZ1xuICogdGhlIGNvbW1lbnRzKSBpcyBkZWxpYmVyYXRlbHkgbm90IHJlcGVhdGVkIGhlcmUsIHNpbmNlIHRoZSB3cml0ZXIgcmVhZHMgdGhlIHRlbXBsYXRlIGFueXdheS5cbiAqL1xuZXhwb3J0IGNvbnN0IElTU1VFX1RFTVBMQVRFX1JVTEVTID0gYC0gRm9sbG93IHRoZSBjbG9zZXN0IHRlbXBsYXRlIHVuZGVyIFxcYC5naXRodWIvSVNTVUVfVEVNUExBVEUvXFxgOiBcXGBidWcubWRcXGAgZm9yIHdyb25nIGJlaGF2aW9yLCBcXGBjaGFuZ2UubWRcXGAgZm9yIGFueXRoaW5nIHRvIGJ1aWxkIG9yIGFsdGVyOyBhIHF1ZXN0aW9uIG9yIG5vdGUgZml0dGluZyBuZWl0aGVyLCBvciBhIHJlcG9zaXRvcnkgd2l0aG91dCB0ZW1wbGF0ZXMsIG5lZWRzIG5vIHRlbXBsYXRlLlxuLSBUaXRsZTogYSBDb252ZW50aW9uYWwgQ29tbWl0cyBwcmVmaXggZm9yIHRoZSB0eXBlIHRoYXQgZml0cyB0aGUgY2hhbmdlIChcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgXFxgcmVmYWN0b3I6XFxgLCBcXGBkb2NzOlxcYCwgXFxgY2hvcmU6XFxgLCAuLi4pOyB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgdGVtcGxhdGUncyBcXGB0aXRsZVxcYCBwcmVmaXgsIHJlcGxhY2UgdGhlIHRlbXBsYXRlJ3MgdHlwZSBsYWJlbCAoXFxgdDogLi4uXFxgKSB3aXRoIHRoZSBvbmUgbWF0Y2hpbmcgdGhlIHR5cGUuXG4tIFRoZSBZQU1MIGZyb250IG1hdHRlciBiZXR3ZWVuIHRoZSBcXGAtLS1cXGAgbGluZXMgaXMgbWV0YWRhdGEsIG5vdCBib2R5IHRleHQ6IHBhc3MgaXRzIFxcYGxhYmVsc1xcYCB2aWEgXFxgLS1sYWJlbFxcYCBhbmQgc3VibWl0IG9ubHkgdGhlIGNvbnRlbnQgYmVsb3cgdGhlIGNsb3NpbmcgXFxgLS0tXFxgIGFzIHRoZSBib2R5LmA7XG5cbi8qKiBTZWN0aW9ucyBvZiBhIGJ1ZyByZXBvcnQsIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgaXNzdWUgdGVtcGxhdGUuICovXG5leHBvcnQgY29uc3QgQlVHX0lTU1VFX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAgeyBoZWFkaW5nOiAnUHJvYmxlbScsIHJlcXVpcmVtZW50OiAnd2hhdCBoYXBwZW5zLCBhbmQgd2hhdCBzaG91bGQgaGFwcGVuIGluc3RlYWQnIH0sXG4gIHsgaGVhZGluZzogJ0V2aWRlbmNlJywgcmVxdWlyZW1lbnQ6ICdyZXByb2R1Y3Rpb24gc3RlcHMsIGxvZ3MsIHJ1biBJRHMsIG9yIGxpbmtzJyB9LFxuICB7IGhlYWRpbmc6ICdJbXBhY3QnLCByZXF1aXJlbWVudDogJ3dobyBvciB3aGF0IGlzIGFmZmVjdGVkLCBhbmQgaG93IGJhZGx5JyB9LFxuICB7IGhlYWRpbmc6ICdQcm9wb3NhbCcsIHJlcXVpcmVtZW50OiAndGhlIGZpeCB5b3UgaGF2ZSBpbiBtaW5kLCBhbmQgdGhlIHJvb3QgY2F1c2UgaWYga25vd24nIH0sXG5dO1xuXG4vKipcbiAqIFNlY3Rpb25zIGEgY2hhbmdlIHNwZWNpZmljYXRpb24gbXVzdCBzZXR0bGUgYmVmb3JlIGEgdGhpcmQgcGFydHkgY2FuIGltcGxlbWVudCBpdCwgZGVmaW5lZFxuICogb25jZSBzbyB0aGF0IHRoZSBpc3N1ZSB0ZW1wbGF0ZSBhbmQgYW55IHRvb2wgdGhhdCBkcmFmdHMgb3IgcmV2aWV3cyBzcGVjaWZpY2F0aW9ucyBhZ2FpbnN0XG4gKiB0aGVzZSBzZWN0aW9ucyBjYW5ub3QgZHJpZnQgYXBhcnQ7IGNoZWNrbGlzdCBjb25zdW1lcnMgcmVuZGVyIGl0IHdpdGggYHJlbmRlclNlY3Rpb25DaGVja2xpc3RgLlxuICogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIHN1ZmZpY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBzbyB0aGV5IGNvbWUgZmlyc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFOR0VfSVNTVUVfU0VDVElPTlM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdID0gW1xuICB7XG4gICAgaGVhZGluZzogJ0JhY2tncm91bmQgYW5kIGdvYWwnLFxuICAgIHJlcXVpcmVtZW50OiAndGhlIHByb2JsZW0gYmVpbmcgc29sdmVkLCBmb3Igd2hvbSwgYW5kIHdoYXQgb3V0Y29tZSBjb3VudHMgYXMgc3VjY2VzcycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQmVoYXZpb3InLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2V2ZXJ5IHVzZXItIG9yIGNhbGxlci1vYnNlcnZhYmxlIGJlaGF2aW9yLCBpbmNsdWRpbmcgaW5wdXRzLCBvdXRwdXRzLCBlcnJvciBjYXNlcywgZWRnZSBjYXNlcywgYW5kIGludGVyYWN0aW9ucyB3aXRoIGV4aXN0aW5nIGJlaGF2aW9yLCBzdGF0ZWQgcHJlY2lzZWx5IGVub3VnaCB0aGF0IHR3byBpbXBsZW1lbnRlcnMgd291bGQgYnVpbGQgdGhlIHNhbWUgdGhpbmcnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0FjY2VwdGFuY2UgY3JpdGVyaWEnLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2NoZWNrYWJsZSBjb25kaXRpb25zIChHaXZlbi9XaGVuL1RoZW4gb3IgYW4gZXF1aXZhbGVudCkgdGhhdCBkZWNpZGUgd2hldGhlciB0aGUgaW1wbGVtZW50YXRpb24gaXMgZG9uZScsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnU2NvcGUgYW5kIG5vbi1nb2FscycsXG4gICAgcmVxdWlyZW1lbnQ6ICd3aGF0IHRoZSBjaGFuZ2UgY292ZXJzIGFuZCB3aGF0IGl0IGRlbGliZXJhdGVseSBsZWF2ZXMgb3V0LCBzbyBhbiBpbXBsZW1lbnRlciBrbm93cyB3aGVyZSB0byBzdG9wJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdEZXNpZ24gY29uc3RyYWludHMnLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ3RoZSBkYXRhLCBBUEksIHNjaGVtYSwgVUksIGFuZCBjb25maWd1cmF0aW9uIGNoYW5nZXMsIG5hbWluZywgYW5kIHRoZSBleGlzdGluZyBjb2RlIG9yIGNvbnZlbnRpb25zIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGZpdCDigJQgYXMgZmFyIGFzIHRoZSB3cml0ZXIgaW50ZW5kcyB0byBjb25zdHJhaW4gdGhlbSwgd2l0aCBldmVyeXRoaW5nIGVsc2UgZXhwbGljaXRseSBsZWZ0IHRvIHRoZSBpbXBsZW1lbnRlcicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQ29tcGF0aWJpbGl0eSBhbmQgbWlncmF0aW9uJyxcbiAgICByZXF1aXJlbWVudDogJ3doYXQgZXhpc3RpbmcgZGF0YSwgdXNlcnMsIGNhbGxlcnMsIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSBhZmZlY3RlZCBhbmQgaG93IHRoZSB0cmFuc2l0aW9uIGhhcHBlbnMnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1ZlcmlmaWNhdGlvbicsXG4gICAgcmVxdWlyZW1lbnQ6ICdob3cgdGhlIGNoYW5nZSBpcyB0ZXN0ZWQgb3IgZGVtb25zdHJhdGVkLCBpbmNsdWRpbmcgd2hhdCBuZWVkcyBubyB0ZXN0IGFuZCB3aHknLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ09wZW4gcXVlc3Rpb25zJyxcbiAgICByZXF1aXJlbWVudDogJ3VuZGVjaWRlZCBwb2ludHMsIGVhY2ggd2l0aCBpdHMgb3B0aW9uczsgZW1wdHkgb25jZSB0aGUgc3BlY2lmaWNhdGlvbiBpcyBpbXBsZW1lbnRhYmxlJyxcbiAgfSxcbl07XG5cbi8qKiBSZW5kZXJzIHNlY3Rpb25zIGFzIG1hcmtkb3duIGJ1bGxldHMgKGAtICoqSGVhZGluZyoqOiByZXF1aXJlbWVudGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNlY3Rpb25DaGVja2xpc3Qoc2VjdGlvbnM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4gYC0gKioke3NlY3Rpb24uaGVhZGluZ30qKjogJHtzZWN0aW9uLnJlcXVpcmVtZW50fWApLmpvaW4oJ1xcbicpO1xufVxuXG4vKiogUmVuZGVycyBzZWN0aW9ucyBhcyBtYXJrZG93biBoZWFkaW5ncywgZWFjaCBmb2xsb3dlZCBieSBpdHMgcmVxdWlyZW1lbnQgYXMgYSBwbGFjZWhvbGRlciBjb21tZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNlY3Rpb25UZW1wbGF0ZShzZWN0aW9uczogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnNcbiAgICAubWFwKFxuICAgICAgKHNlY3Rpb24pID0+XG4gICAgICAgIGAjIyAke3NlY3Rpb24uaGVhZGluZ31cXG5cXG48IS0tICR7c2VjdGlvbi5yZXF1aXJlbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke3NlY3Rpb24ucmVxdWlyZW1lbnQuc2xpY2UoMSl9LiAtLT5gXG4gICAgKVxuICAgIC5qb2luKCdcXG5cXG4nKTtcbn1cbiIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIC8vIGBKU09OLnN0cmluZ2lmeWAgYW5zd2VycyBgdW5kZWZpbmVkYCBmb3IgYHVuZGVmaW5lZGAsIGEgc3ltYm9sIGFuZCBhIGZ1bmN0aW9uLCBhbmQgdGhyb3dzXG4gIC8vIG9uIGEgYmlnaW50IG9yIGEgY3ljbGU7IGBuZXcgRXJyb3IodW5kZWZpbmVkKWAgaGFzIGFuIGVtcHR5IG1lc3NhZ2UsIHdoaWNoIHdvdWxkIGRyb3AgdGhlXG4gIC8vIG9ubHkgZGlhZ25vc3RpYyBhIGNhbGxlciBoYXMgYWJvdXQgc3VjaCBhIHRocm93biB2YWx1ZS4gTmVpdGhlciByZXByZXNlbnRhdGlvbiBtYXkgdGhyb3dcbiAgLy8gb3V0IG9mIGhlcmU6IHRoaXMgcnVucyBpbiBhIGNhdGNoIGJsb2NrLCB3aGVyZSBpdCB3b3VsZCByZXBsYWNlIHRoZSBlcnJvciBpdCBjb252ZXJ0cy5cbiAgcmV0dXJuIG5ldyBFcnJvcihpZ25vcmVFcnJvcigoKSA9PiBKU09OLnN0cmluZ2lmeShvYmopKSA/PyBpZ25vcmVFcnJvcigoKSA9PiBTdHJpbmcob2JqKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqXG4gICAqIERlY2lkZXMgaG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgYWZ0ZXIgYGVycm9yYCwgZ2l2ZW4gdGhlIGJhY2tvZmYgYHNsZWVwTWlsbGlzZWNvbmRzYCBpdCB3b3VsZCBvdGhlcndpc2Ugd2FpdCxcbiAgICogZS5nLiBgKGVycm9yLCBtcykgPT4gTWF0aC5tYXgobXMsIHJldHJ5QXRPZihlcnJvcikgLSBEYXRlLm5vdygpKWAgdG8gaG9ub3IgYSByZXRyeSB0aW1lIHNlbnQgYnkgYSBzZXJ2ZXIuXG4gICAqIEl0IGRvZXMgbm90IGFmZmVjdCB0aGUgYmFja29mZiB0aGF0IGB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kc2AgYWR2YW5jZXMuXG4gICAqL1xuICBnZXRTbGVlcE1pbGxpc2Vjb25kcz86IChlcnJvcjogdW5rbm93biwgc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIGdldFNsZWVwTWlsbGlzZWNvbmRzLFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRTbGVlcE1pbGxpc2Vjb25kcyA9IGdldFNsZWVwTWlsbGlzZWNvbmRzPy4oZXJyb3IsIHNsZWVwTWlsbGlzZWNvbmRzKSA/PyBzbGVlcE1pbGxpc2Vjb25kcztcbiAgICAgIGlmIChjdXJyZW50U2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKGN1cnJlbnRTbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqIEVzY2FwZXMgZXZlcnkgUmVnRXhwIG1ldGFjaGFyYWN0ZXIgc28gdGhlIHRleHQgbWF0Y2hlcyBpdHNlbGYgbGl0ZXJhbGx5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bJCgpKisuP1tcXFxcXFxdXnt8fV0vZ3UsIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG4vKiogQSBQT1NJWCBzaGVsbCB3b3JkOiBzYWZlIGNoYXJhY3RlcnMgcGFzcyB0aHJvdWdoLCBhbnl0aGluZyBlbHNlIGlzIHNpbmdsZS1xdW90ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVGb3JTaGVsbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vLV0rJC91LnRlc3QodmFsdWUpID8gdmFsdWUgOiBgJyR7dmFsdWUucmVwbGFjZUFsbChcIidcIiwgU3RyaW5nLnJhd2AnXFwnJ2ApfSdgO1xufVxuXG4vKipcbiAqIFdyYXBzIHRleHQgaW4gYSBNYXJrZG93biBjb2RlIGJsb2NrIGZlbmNlZCB3aXRoIHRpbGRlcywgd2hpY2ggYXJlIHJhcmVyIHRoYW4gYmFja3RpY2tzIGluIE1hcmtkb3duIGNvbnRlbnQuXG4gKiBUaGUgZmVuY2UgaXMgbG9uZ2VyIHRoYW4gYW55IHJ1biBvZiB0aWxkZXMgaW4gdGhlIHRleHQgc28gdGhhdCB0aGUgdGV4dCBjYW5ub3QgY2xvc2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1RpbGRlQ29kZUJsb2NrKHRleHQ6IHN0cmluZywgbGFuZ3VhZ2UgPSAnJyk6IHN0cmluZyB7XG4gIHJldHVybiB0b0ZlbmNlZENvZGVCbG9jaygnficsIHRleHQsIGxhbmd1YWdlKTtcbn1cblxuLyoqXG4gKiBXcmFwcyB0ZXh0IGluIGEgTWFya2Rvd24gY29kZSBibG9jayBmZW5jZWQgd2l0aCBiYWNrdGlja3MuXG4gKiBUaGUgZmVuY2UgaXMgbG9uZ2VyIHRoYW4gYW55IHJ1biBvZiBiYWNrdGlja3MgaW4gdGhlIHRleHQgc28gdGhhdCB0aGUgdGV4dCBjYW5ub3QgY2xvc2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NvZGVCbG9jayh0ZXh0OiBzdHJpbmcsIGxhbmd1YWdlID0gJycpOiBzdHJpbmcge1xuICByZXR1cm4gdG9GZW5jZWRDb2RlQmxvY2soJ2AnLCB0ZXh0LCBsYW5ndWFnZSk7XG59XG5cbmZ1bmN0aW9uIHRvRmVuY2VkQ29kZUJsb2NrKGZlbmNlQ2hhcjogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzaG9ydGVzdEZlbmNlID0gZmVuY2VDaGFyLnJlcGVhdCgzKTtcbiAgbGV0IGxvbmdlc3RSdW4gPSAyO1xuICBsZXQgc3RhcnQgPSB0ZXh0LmluZGV4T2Yoc2hvcnRlc3RGZW5jZSk7XG4gIHdoaWxlIChzdGFydCAhPT0gLTEpIHtcbiAgICBsZXQgZW5kID0gc3RhcnQgKyAzO1xuICAgIHdoaWxlICh0ZXh0W2VuZF0gPT09IGZlbmNlQ2hhcikgZW5kKys7XG4gICAgbG9uZ2VzdFJ1biA9IE1hdGgubWF4KGxvbmdlc3RSdW4sIGVuZCAtIHN0YXJ0KTtcbiAgICBzdGFydCA9IHRleHQuaW5kZXhPZihzaG9ydGVzdEZlbmNlLCBlbmQpO1xuICB9XG4gIGxldCBsYW5ndWFnZVN0YXJ0ID0gMDtcbiAgd2hpbGUgKGxhbmd1YWdlW2xhbmd1YWdlU3RhcnRdID09PSBmZW5jZUNoYXIpIGxhbmd1YWdlU3RhcnQrKztcbiAgY29uc3QgZmVuY2UgPSBmZW5jZUNoYXIucmVwZWF0KGxvbmdlc3RSdW4gKyAxICsgbGFuZ3VhZ2VTdGFydCk7XG4gIHJldHVybiBgJHtmZW5jZX0ke2xhbmd1YWdlLnNsaWNlKGxhbmd1YWdlU3RhcnQpfVxcbiR7dGV4dH0ke3RleHQuZW5kc1dpdGgoJ1xcbicpID8gJycgOiAnXFxuJ30ke2ZlbmNlfWA7XG59XG4iLCIvKipcbiAqIFdoZW4gdG8gd3JpdGUgYSB0ZXN0IGFuZCB3aGF0IGEgdGVzdCBtYXkgYXNzZXJ0LCBhcyBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFN0YXRlZCBvbmNlIGhlcmUgYW5kIHJlbmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgYWdlbnQgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgdGVzdGluZyBza2lsbCBzbyB0aGVcbiAqIHR3byBjYW5ub3QgZHJpZnQgYXBhcnQuXG4gKi9cbmV4cG9ydCBjb25zdCBURVNUX1dSSVRJTkdfUlVMRVMgPSBgLSBXcml0ZSBhIHRlc3Qgb25seSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBvciB3aGVuIGEgYmVoYXZpb3IgaXMgbGlrZWx5IHRvIHJlZ3Jlc3MgYW5kIG5vIGV4aXN0aW5nIGF1dG9tYXRpYyBjaGVjayAodHlwZSBjaGVja2luZywgbGludGluZywgYW4gZXhpc3RpbmcgdGVzdCBvciBDSSBjaGVjaykgd291bGQgY2F0Y2ggdGhlIGJyZWFrYWdlLiBOZXZlciBhZGQgYSB0ZXN0IHRoYXQgbWVyZWx5IHJlc3RhdGVzIGEgbWFwcGluZyBmcm9tIGNvbmRpdGlvbnMgdG8gY29uc3RhbnQgb3V0cHV0cyAoaXQgZmFpbHMgb25seSBvbiBpbnRlbnRpb25hbCBlZGl0cykgb3IgdGhhdCBvbmx5IGNvbmZpcm1zIGFuIGV4dGVybmFsIGZhY3QgKGEgbGlicmFyeSdzIGJlaGF2aW9yLCB3aGV0aGVyIGEgdmVyc2lvbiBmaXhlcyBhbiBpc3N1ZSk7IHZlcmlmeSB0aG9zZSBvbmNlIG1hbnVhbGx5LlxuLSBUZXN0IGV4dGVybmFsbHkgb2JzZXJ2YWJsZSBiZWhhdmlvciAoZS5nLiwgZW1pdHRlZCBmaWxlcywgQ0xJIG91dHB1dCwgcmVuZGVyZWQgcmVzdWx0cykgYXQgdGhlIHN5c3RlbSBib3VuZGFyeSwgbm90IGltcGxlbWVudGF0aW9uIGRldGFpbHM6IGRvIG5vdCBtaXJyb3IgcHJvZHVjdGlvbiBsb2dpYywgYXNzZXJ0IHRoYXQgYSBicmFuY2ggaXMgdGFrZW4sIG9yIGZlZWQgaGFuZC1hc3NlbWJsZWQgaW50ZXJuYWwgb2JqZWN0cyB0byBpbnRlcm5hbCBmdW5jdGlvbnMuXG4tIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MsIHVubGVzcyBhY3R1YWwgY2FsbHMgYXJlIGltcHJhY3RpY2FsLCBoYXZlIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLCBvciBtb2NrcyBhcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4tIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4tIEF2b2lkIGZpeGVkIHdhaXRzIGluIEUyRSB0ZXN0czsgd2FpdCBmb3IgY29uZGl0aW9ucyBpbnN0ZWFkLmA7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBBbmNob3JlZCB0byBgXCIsIGAgc28gb25seSBhIHJlZ2lzdHJ5IGVudHJ5J3MgYHJlc29sdmVkYCBzbG90IGlzIGNsZWFyZWQuIEEgZGlyZWN0IHRhcmJhbGxcbiAqIGRlcGVuZGVuY3kgY2FycmllcyBpdHMgVVJMIGluIHRoZSB3b3Jrc3BhY2UgZGVzY3JpcHRvciBhbmQgdHVwbGUgaWRlbnRpZmllciBpbnN0ZWFkLCBhbmQgdGhvc2VcbiAqIFVSTHMgbXVzdCByZW1haW4gaW50YWN0LlxuICovXG5jb25zdCBndWFyZFJlc29sdmVkVXJsUGF0dGVybiA9IC8oXCIsIClcImh0dHBzOlxcL1xcL25wbVxcLmZsYXR0XFwudGVjaFxcL1teXCJdKlwiL2c7XG5cbi8qKlxuICogUmVtb3ZlIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGJ1bi5sb2NrLlxuICpcbiAqIEJ1biB3cml0ZXMgdGhlIHdvcmtzcGFjZSByb290J3MgbG9ja2ZpbGUgZXZlbiB3aGVuIGFuIGluc3RhbGwgcnVucyBmcm9tIGEgY2hpbGQgcGFja2FnZS4gSW4gYVxuICogR2l0IGNoZWNrb3V0IHRoZSBzZWFyY2ggY2xpbWJzIHRvIHRoYXQgcm9vdDsgd2l0aG91dCBhIGNoZWNrb3V0IGJvdW5kYXJ5IGl0IGluc3BlY3RzIG9ubHkgdGhlXG4gKiBzdGFydGluZyBkaXJlY3Rvcnkgc28gaXQgY2Fubm90IHJld3JpdGUgYW4gdW5yZWxhdGVkIGFuY2VzdG9yJ3MgbG9ja2ZpbGUuIFRoZSBwcm94eSBpc1xuICogaW5zdGFsbC10aW1lIHBvbGljeSByYXRoZXIgdGhhbiByZXBvc2l0b3J5IHN0YXRlOiBhbiBlbXB0eSByZXNvbHZlZCBzbG90IHN0aWxsIG1ha2VzIEJ1biB1c2UgdGhlXG4gKiBjb25maWd1cmVkIGRlZmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgbG9ja2ZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY2hhbmdlIHdhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4sICckMVwiXCInKTtcbiAgaWYgKG5vcm1hbGl6ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQSBzaWJsaW5nIHRlbXAgZmlsZSBtYWtlcyB0aGUgcmVwbGFjZW1lbnQgYW4gYXRvbWljIHNhbWUtZGlyZWN0b3J5IHJlbmFtZSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgLy8gd3JpdGUgY2Fubm90IGxlYXZlIGEgdHJ1bmNhdGVkIGJ1bi5sb2NrIGJlaGluZC5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke2xvY2tmaWxlUGF0aH0ubm9ybWFsaXppbmcuJHtwcm9jZXNzLnBpZH0uJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gIHRyeSB7XG4gICAgLy8gc3RhdCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGNobW9kIGlzIG5vdCBzcGVjaWZpZWQgdG8gYWNjZXB0LlxuICAgIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhsb2NrZmlsZVBhdGgpLm1vZGUgJiAwbzc3NztcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBvcmFyeVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50LCB7IG1vZGUgfSk7XG4gICAgLy8gd3JpdGVGaWxlU3luYydzIG1vZGUgaXMgbWFza2VkIGJ5IHRoZSBwcm9jZXNzIHVtYXNrOyBjaG1vZCByZXN0b3JlcyB0aGUgZXhhY3Qgb3JpZ2luYWwgYml0cy5cbiAgICBmcy5jaG1vZFN5bmModGVtcG9yYXJ5UGF0aCwgbW9kZSk7XG4gICAgZnMucmVuYW1lU3luYyh0ZW1wb3JhcnlQYXRoLCBsb2NrZmlsZVBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyh0ZW1wb3JhcnlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBsb2NrZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZFN0YXJ0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShzdGFydERpclBhdGgpO1xuICBjb25zdCByZXBvc2l0b3J5Um9vdERpclBhdGggPSBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHJlc29sdmVkU3RhcnREaXJQYXRoKTtcbiAgaWYgKCFyZXBvc2l0b3J5Um9vdERpclBhdGgpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRTdGFydERpclBhdGgsICdidW4ubG9jaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkgPyBsb2NrZmlsZVBhdGggOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgZGlyUGF0aCA9IHJlc29sdmVkU3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpKSByZXR1cm4gbG9ja2ZpbGVQYXRoO1xuICAgIGlmIChkaXJQYXRoID09PSByZXBvc2l0b3J5Um9vdERpclBhdGgpIHJldHVybjtcblxuICAgIGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkaXJQYXRoID0gc3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGRpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSByZXR1cm47XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cbiIsIi8qKiBXaGV0aGVyIGEgRG9ja2VyZmlsZSBjb25zdW1lcyB3YidzIGdlbmVyYXRlZCBub24tc2VjcmV0IGVudmlyb25tZW50IGRpcmVjdGx5IG9yIHRocm91Z2ggaXRzIGhlbHBlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0RvY2tlckVudihkb2NrZXJmaWxlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBkb2NrZXJmaWxlVGV4dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuc29tZSgobGluZSkgPT4gIS9eXFxzKiMvdS50ZXN0KGxpbmUpICYmIChsaW5lLmluY2x1ZGVzKCcuZG9ja2VyLmVudicpIHx8IGxpbmUuaW5jbHVkZXMoJ2FwcGx5LWRvY2tlci1lbnYuc2gnKSkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLmFudGlncmF2aXR5Y2xpLyoqJyxcbiAgLy8gR2l0J3Mgb2JqZWN0IHN0b3JlIGhvbGRzIGNvcGllcyBvZiB0cmFja2VkIGZpbGVzIChhbmQgYGRvdDogdHJ1ZWAgbWFrZXMgdGhlbSB2aXNpYmxlKSwgc29cbiAgLy8gc2Nhbm5pbmcgaXQgd291bGQgYm90aCBzbG93IGV2ZXJ5IGdsb2IgZG93biBhbmQgbGV0IHN0YWxlIGJsb2JzIGluZmx1ZW5jZSBkZXRlY3Rpb24uXG4gICcqKi8uZ2l0LyoqJyxcbiAgLy8gVGhlIG9yZy1zdGFuZGFyZCB0ZW1wb3JhcnkgZGlyZWN0b3J5OyBzdGFsZSBjb3BpZXMgdW5kZXIgaXQgKGUuZy4gcmV2aWV3IHNjcmF0Y2ggZGlycykgbXVzdFxuICAvLyBub3QgaW5mbHVlbmNlIGxhbmd1YWdlIGRldGVjdGlvbi5cbiAgJyoqLy50bXAvKionLFxuICAnKiovLnRtcC0qLyoqJyxcbiAgLy8gTG9jYWwgY2FjaGVzIGNhbiBjb250YWluIGNvbXBsZXRlIHRoaXJkLXBhcnR5IHNvdXJjZSBjaGVja291dHMuIFRyZWF0aW5nIHRob3NlIGFzIHJlcG9zaXRvcnlcbiAgLy8gY29kZSBnZW5lcmF0ZXMgd29ya2Zsb3dzIGZvciBwYXRocyB0aGF0IGFyZSBnaXRpZ25vcmVkIGFuZCBhYnNlbnQgZnJvbSBmcmVzaCBDSSBjaGVja291dHMuXG4gICcqKi8uY2FjaGUvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5sZXQgcmVhbFJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIC8qKiBDb25maW5lcyBnZW5lcmF0ZUZpbGUgd3JpdGVzIHRvIHRoZSByZXBvc2l0b3J5IHJvb3RlZCBhdCByb290RGlyUGF0aCAodW5kZWZpbmVkIGRpc2FibGVzIGl0KS4gKi9cbiAgc2V0Um9vdERpclBhdGgocm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHJlYWxSb290RGlyUGF0aCA9IHJvb3REaXJQYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJucyB1bmRlZmluZWQgb25seSB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LiBPdGhlciBmYWlsdXJlcyAoZS5nLiBwZXJtaXNzaW9ucykgYXJlXG4gICAqIHJldGhyb3duIHNvIGNhbGxlcnMgcmVnZW5lcmF0aW5nIGNvbmZpZyBmaWxlcyBuZXZlciBvdmVyd3JpdGUgY29udGVudCB0aGV5IGNvdWxkIG5vdCByZWFkLlxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH0sXG4gIC8qKiBUZWxscyB3aGV0aGVyIGEgd3JpdGUgdG8gZmlsZVBhdGggd291bGQgcGFzcyB0aGUgc3ltbGluay9yZXBvc2l0b3J5LWNvbnRhaW5tZW50IGd1YXJkcy4gKi9cbiAgYXN5bmMgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmVhZHMgYSBzb3VyY2UgZmlsZSwgcmV0dXJuaW5nIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IE9SIHdoZW4gaXRcbiAgICogcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSDigJQgYSBjb21taXR0ZWQgc3ltbGluayBwb2ludGluZyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IG11c3RcbiAgICogbm90IGdldCBpdHMgdGFyZ2V0J3MgY29udGVudCBjb3BpZWQgaW50byBhIHRyYWNrZWQgZmlsZS4gQSBzeW1saW5rIHdob3NlIHJlc29sdmVkIHRhcmdldFxuICAgKiBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkgaXMgbGVnaXRpbWF0ZSAoZS5nLiBgLm5vZGUtdmVyc2lvbiAtPiAubnZtcmNgKSBhbmQgaXMgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKCFzdGF0cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgbGV0IHJlYWxGaWxlUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVhbEZpbGVQYXRoID0gYXdhaXQgZnMucHJvbWlzZXMucmVhbHBhdGgoZmlsZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBkYW5nbGluZyBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICByZWFsUm9vdERpclBhdGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICByZWFsRmlsZVBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJlxuICAgICAgICAhcmVhbEZpbGVQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZXMgZmlsZVBhdGggKGZvcmNlLCBvcHRpb25hbGx5IHJlY3Vyc2l2ZSkgb25seSB3aGVuIGl0cyBQQVJFTlQgZGlyZWN0b3J5IHJlc29sdmVzIGluc2lkZVxuICAgKiB0aGUgcmVwb3NpdG9yeSwgc28gYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGEgY29tbWl0dGVkIC5naXRodWIvd29ya2Zsb3dzIGxpbmspIGNhbiBuZXZlclxuICAgKiBtYWtlIGNsZWFudXAgZGVsZXRlIGZpbGVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuIFJlbW92aW5nIGEgc3ltbGluayBlbnRyeSBpdHNlbGYgaXMgYWxsb3dlZDpcbiAgICogdGhhdCBkZWxldGVzIG9ubHkgdGhlIGxpbmssIG5ldmVyIGl0cyB0YXJnZXQuIFJldHVybnMgd2hldGhlciB0aGUgcmVtb3ZhbCB3YXMgcGVyZm9ybWVkLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlbW92aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogb3B0aW9ucz8ucmVjdXJzaXZlID8/IGZhbHNlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogV3JpdGVzIGNvbnRlbnQgdmVyYmF0aW0sIGFwcGx5aW5nIHRoZSBzYW1lIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMgYXMgZ2VuZXJhdGVGaWxlLiAqL1xuICBhc3luYyB3cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSkpIHJldHVybiBmYWxzZTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIHdhcyBhY3R1YWxseSBnZW5lcmF0ZWQgKGZhbHNlIHdoZW4gdGhlIGNvbmZpbmVtZW50IGd1YXJkcyBza2lwIGl0KS4gKi9cbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGluZUVuZGluZzogJ1xcbicgfCAnXFxyXFxuJyA9ICdcXG4nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gYHRyaW1gIHRyZWF0cyBhIEJPTSBhcyB3aGl0ZXNwYWNlLCBzbyBpdCBpcyByZWF0dGFjaGVkIGF0IHBvc2l0aW9uIDA6IGRyb3BwaW5nIGl0IHdvdWxkXG4gICAgLy8gcmV3cml0ZSB0aGUgZW5jb2RpbmcgbWFya2VyIG9mIGEgZmlsZSB0aGUgZ2VuZXJhdG9yIHdhcyBvbmx5IGFza2VkIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBieXRlT3JkZXJNYXJrID0gY29udGVudC5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCA9IGAke2J5dGVPcmRlck1hcmt9JHtub3JtYWxpemVkQ29udGVudH0ke2xpbmVFbmRpbmd9YDtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gTmV2ZXIgd3JpdGUgdGhyb3VnaCBhIHN5bWxpbms6IGEgKHBvc3NpYmx5IGRhbmdsaW5nKSBsaW5rIGNvbW1pdHRlZCBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnlcbiAgLy8gY291bGQgcmVkaXJlY3QgdGhlIHdyaXRlIG91dHNpZGUgaXQuXG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgaWYgKHN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgd3JpdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBBIHN5bWxpbmtlZCBwYXJlbnQgZGlyZWN0b3J5IHdvdWxkIHJlZGlyZWN0IHJlYWRzLCB3cml0ZXMsIGFuZCByZW1vdmFscyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LFxuLy8gc28gcmVxdWlyZSB0aGUgY2xvc2VzdCBleGlzdGluZyBhbmNlc3RvciB0byByZXNvbHZlIGluc2lkZSB0aGUgcm9vdCBzZXQgYnkgdGhlIENMSSBlbnRyeSBwb2ludC5cbmFzeW5jIGZ1bmN0aW9uIGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKHJlYWxSb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgbGV0IGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhhbmNlc3RvclBhdGgpKSB7XG4gICAgYW5jZXN0b3JQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yUGF0aCk7XG4gIH1cbiAgY29uc3QgcmVhbEFuY2VzdG9yUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGFuY2VzdG9yUGF0aCk7XG4gIHJldHVybiByZWFsQW5jZXN0b3JQYXRoID09PSByZWFsUm9vdERpclBhdGggfHwgcmVhbEFuY2VzdG9yUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcblxuLyoqXG4gKiBSdW5zIGV2ZXJ5IHRhc2sgaW4gYHByb21pc2VQb29sYCBhbmQgcmVqZWN0cyB3aXRoIHRoZSBmaXJzdCBlcnJvciBvbmx5IGFmdGVyIGFsbCBvZiB0aGVtIHNldHRsZSxcbiAqIHNvIGEgY2FsbGVyIHRoYXQgY2F0Y2hlcyB0aGUgZXJyb3IgbmV2ZXIgcHJvY2VlZHMgd2hpbGUgYSBzaWJsaW5nIHdyaXRlIGlzIHN0aWxsIHJ1bm5pbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5BbGxJblBvb2wodGFza3M6IHJlYWRvbmx5ICgoKSA9PiBQcm9taXNlPHVua25vd24+KVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGFza3MubWFwKCh0YXNrKSA9PiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUodGFzaykpKTtcbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB0aHJvdyByZXN1bHQucmVhc29uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBUEkgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzeW5jJztcbmltcG9ydCB0eXBlIHsgU291cmNlRmlsZSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgKEdvKSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYW5kIG5vXG4vLyBsb25nZXIgZXhwb3NlcyBhbiBpbi1wcm9jZXNzIHBhcnNlciBzdWNoIGFzIGB0cy5jcmVhdGVTb3VyY2VGaWxlYC4gUGFyc2luZyBub3dcbi8vIGhhcHBlbnMgaW4gYSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlciByZWFjaGVkIHRocm91Z2ggdGhlIGFzeW5jaHJvbm91cyBBUEksIHNvIHdlXG4vLyBrZWVwIGEgc2luZ2xlIGxhemlseS1jcmVhdGVkIGluc3RhbmNlIGFuZCByZXVzZSBpdCBhY3Jvc3MgZXZlcnkgZml4ZXIgdG8gYXZvaWRcbi8vIHBheWluZyB0aGUgcHJvY2Vzcy1zcGF3biBjb3N0IHBlciBmaWxlLlxubGV0IGFwaTogQVBJIHwgdW5kZWZpbmVkO1xubGV0IGNvbm5lY3RlZDogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQYXJzZXMgYSBzb3VyY2UgZmlsZSBpbnRvIGEgVHlwZVNjcmlwdCBBU1QgdXNpbmcgdGhlIGJ1bmRsZWQgbmF0aXZlIGNvbXBpbGVyLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBjb21waWxlciBjYW5ub3QgbG9hZCB0aGUgZmlsZSAoZS5nLiBpdCBpcyBtaXNzaW5nXG4gKiBvciB1bnBhcnNhYmxlKSBzbyBjYWxsZXJzIGNhbiBmYWxsIGJhY2sgdG8gY29uc2VydmF0aXZlIGJlaGF2aW9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNvdXJjZUZpbGUgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGkgPSBhd2FpdCBnZXRBcGkoKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGFwaS51cGRhdGVTbmFwc2hvdCh7IG9wZW5GaWxlczogW2ZpbGVQYXRoXSB9KTtcbiAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgc25hcHNob3QuZ2V0RGVmYXVsdFByb2plY3RGb3JGaWxlKGZpbGVQYXRoKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvamVjdD8ucHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNodXRzIGRvd24gdGhlIHNwYXduZWQgY29tcGlsZXIgc2VydmVyLiBUaGUgc2VydmVyIGtlZXBzIGFuIG9wZW4gSVBDIGNoYW5uZWxcbiAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGtlZXAgdGhlIHJ1bnRpbWUgZXZlbnQgbG9vcCBhbGl2ZSwgc28gd2JmeSBtdXN0IGNhbGwgdGhpc1xuICogb25jZSBpdHMgcnVuIGZpbmlzaGVzIGZvciB0aGUgcHJvY2VzcyB0byBleGl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwaT8uY2xvc2UoKTtcbiAgYXBpID0gdW5kZWZpbmVkO1xuICBjb25uZWN0ZWQgPSB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFwaSgpOiBQcm9taXNlPEFQST4ge1xuICBhcGkgPz89IG5ldyBBUEkoeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSk7XG4gIC8vIFRoZSBjbGllbnQgbWFya3MgaXRzZWxmIGNvbm5lY3RlZCBvbmx5IG9uY2UgaXRzIGZpcnN0IHNwYXduIGNvbXBsZXRlcywgc28gY29uY3VycmVudFxuICAvLyBmaXJzdCByZXF1ZXN0cyAodGhlIGZpeGVycyBydW4gaW4gcGFyYWxsZWwpIHdvdWxkIGVhY2ggc3Bhd24gYSBjb21waWxlciBzZXJ2ZXI7IHRoZVxuICAvLyBleHRyYSBzZXJ2ZXJzIGFyZSBuZXZlciBjbG9zZWQgYW5kIGtlZXAgdGhlIHByb2Nlc3MgYWxpdmUgYWZ0ZXIgYGRpc3Bvc2VUeXBlU2NyaXB0QXBpYC5cbiAgLy8gVGhlIGZpcnN0IHJlcXVlc3QgaXMgdGhlcmVmb3JlIGF3YWl0ZWQgb25jZSBiZWZvcmUgYW55IG90aGVyIGlzIHNlbnQ7IGEgZmFpbGVkIG9uZSBpc1xuICAvLyBmb3Jnb3R0ZW4gc28gdGhhdCB0aGUgbmV4dCByZXF1ZXN0IGNvbm5lY3RzIGFnYWluIGluc3RlYWQgb2YgZmFpbGluZyBmb3IgdGhlIHdob2xlIHJ1bi5cbiAgY29ubmVjdGVkID8/PSBhcGkudXBkYXRlU25hcHNob3QoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICBjb25uZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xuICBhd2FpdCBjb25uZWN0ZWQ7XG4gIHJldHVybiBhcGk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxuLy8gU2V0dGluZ3MgZXZlcnkgV2lsbEJvb3N0ZXIgTmV4dC5qcyBwcm9qZWN0IHNob3VsZCBjYXJyeS4gYG5hbWVgIGlzIHRoZSB0b3AtbGV2ZWxcbi8vIHByb3BlcnR5IGtleSB1c2VkIHRvIGRldGVjdCB3aGV0aGVyIHRoZSBzZXR0aW5nIGFscmVhZHkgZXhpc3RzOyBgdGV4dGAgaXMgaW5zZXJ0ZWRcbi8vIHZlcmJhdGltIChhIHdob2xlIGBrZXk6IHZhbHVlYCBwYWlyKSB3aGVuIHRoZSBrZXkgaXMgbWlzc2luZy5cbmNvbnN0IG1hbmFnZWRQcm9wZXJ0aWVzOiByZWFkb25seSB7IG5hbWU6IHN0cmluZzsgdGV4dDogc3RyaW5nIH1bXSA9IFtcbiAgeyBuYW1lOiAncmVhY3RDb21waWxlcicsIHRleHQ6ICdyZWFjdENvbXBpbGVyOiB0cnVlJyB9LFxuICB7IG5hbWU6ICdyZWFjdFN0cmljdE1vZGUnLCB0ZXh0OiAncmVhY3RTdHJpY3RNb2RlOiB0cnVlJyB9LFxuICB7IG5hbWU6ICd0eXBlc2NyaXB0JywgdGV4dDogJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfScgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsndHMnLCAnbXRzJywgJ2N0cycsICdqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFjdGVkID0gYXdhaXQgZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGgpO1xuICAgIGlmICghZXh0cmFjdGVkKSByZXR1cm47XG4gICAgY29uc3QgeyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA9IGV4dHJhY3RlZDtcblxuICAgIC8vIGBwcm9wZXJ0aWVzYCBpbmNsdWRlcyBzcHJlYWQgYXNzaWdubWVudHMgKGAuLi5yZXN0YCkgdGhhdCBjYXJyeSBubyBuYW1lLCBzbyBndWFyZCBiZWZvcmUgcmVhZGluZyBpdC5cbiAgICBjb25zdCBleGlzdGluZ1Byb3BlcnRpZXMgPSBuZXcgU2V0KFxuICAgICAgb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+XG4gICAgICAgICduYW1lJyBpbiBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5uYW1lID8gZ2V0UHJvcGVydHlLZXkocHJvcGVydHkubmFtZSwgc291cmNlKSA6IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgcHJvcGVydHlUZXh0cyA9IG1hbmFnZWRQcm9wZXJ0aWVzXG4gICAgICAuZmlsdGVyKChwcm9wZXJ0eSkgPT4gIWV4aXN0aW5nUHJvcGVydGllcy5oYXMocHJvcGVydHkubmFtZSkpXG4gICAgICAubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkudGV4dCk7XG4gICAgaWYgKHByb3BlcnR5VGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gc291cmNlLnRleHQ7XG4gICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBvYmplY3RMaXRlcmFsLmdldEVuZCgpIC0gMTtcbiAgICAvLyBUaGUgbmF0aXZlIFRTIEFTVCBkb2VzIG5vdCByZWxpYWJseSBleHBvc2UgYHByb3BlcnRpZXMuaGFzVHJhaWxpbmdDb21tYWAsIHNvIHNjYW4gdGhlIHNvdXJjZVxuICAgIC8vIGJldHdlZW4gdGhlIGxhc3QgcHJvcGVydHkgYW5kIHRoZSBjbG9zaW5nIGJyYWNlLiBTdHJpcCBjb21tZW50cyBmaXJzdCBzbyBhIGNvbW1hIGluc2lkZSBhXG4gICAgLy8gdHJhaWxpbmcgY29tbWVudCAoZS5nLiBgZm9vOiAxIC8vIGEsIGJgKSBpcyBub3QgbWlzdGFrZW4gZm9yIGEgcmVhbCB0cmFpbGluZyBjb21tYS5cbiAgICBjb25zdCBsYXN0UHJvcGVydHkgPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMuYXQoLTEpO1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ29tbWEgPSBsYXN0UHJvcGVydHlcbiAgICAgID8gc3RyaXBDb21tZW50cyhvbGRDb250ZW50LnNsaWNlKGxhc3RQcm9wZXJ0eS5nZXRFbmQoKSwgaW5zZXJ0aW9uUG9pbnQpKS5pbmNsdWRlcygnLCcpXG4gICAgICA6IGZhbHNlO1xuICAgIGNvbnN0IHByZWZpeCA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5sZW5ndGggPiAwICYmICFoYXNUcmFpbGluZ0NvbW1hID8gJywgJyA6ICcnO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIGluc2VydGlvblBvaW50KX0ke3ByZWZpeH0ke3Byb3BlcnR5VGV4dHMuam9pbignLCAnKX0ke29sZENvbnRlbnQuc2xpY2UoXG4gICAgICBpbnNlcnRpb25Qb2ludFxuICAgICl9YDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8eyBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlOyBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUaGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQgZGVjbGFyZXMgdGhlIGNvbmZpZyBhcyBgY29uc3QgbmV4dENvbmZpZzogTmV4dENvbmZpZyA9IHsgLi4uIH1gIGFuZFxuICAvLyBleHBvcnRzIGl0IChwb3NzaWJseSB3cmFwcGVkLCBlLmcuIGB3aXRoU2VudHJ5Q29uZmlnKC4uLilgKSwgc28gdGhlIG9iamVjdCBsaXRlcmFsIGlzIHJhcmVseVxuICAvLyB0aGUgZGlyZWN0IG9wZXJhbmQgb2YgYGV4cG9ydCBkZWZhdWx0YC9gbW9kdWxlLmV4cG9ydHNgLiBDb2xsZWN0IGV2ZXJ5IGNhbmRpZGF0ZSBhbmQgcGljayB0aGVcbiAgLy8gbW9zdCBhdXRob3JpdGF0aXZlIG9uZSBiZWxvdy5cbiAgbGV0IGRpcmVjdE9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgbGV0IGV4cG9ydGVkSWRlbnRpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2YXJpYWJsZU9iamVjdExpdGVyYWxzID0gbmV3IE1hcDxzdHJpbmcsIGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbj4oKTtcbiAgY29uc3QgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsczogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uW10gPSBbXTtcblxuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChhc3QuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmV4cHJlc3Npb24pO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYXN0LmlzQmluYXJ5RXhwcmVzc2lvbihub2RlKSAmJlxuICAgICAgbm9kZS5vcGVyYXRvclRva2VuLmtpbmQgPT09IGFzdC5TeW50YXhLaW5kLkVxdWFsc1Rva2VuICYmXG4gICAgICBub2RlLmxlZnQuZ2V0VGV4dChzb3VyY2UpID09PSAnbW9kdWxlLmV4cG9ydHMnXG4gICAgKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLnJpZ2h0KTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5yaWdodCkpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLnJpZ2h0LmdldFRleHQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFzdC5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkgJiYgbm9kZS5pbml0aWFsaXplcikge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5pbml0aWFsaXplcik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCAmJiBhc3QuaXNJZGVudGlmaWVyKG5vZGUubmFtZSkpIHtcbiAgICAgICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5zZXQobm9kZS5uYW1lLmdldFRleHQoc291cmNlKSwgb2JqZWN0TGl0ZXJhbCk7XG4gICAgICAgIC8vIFRoZSBgOiBOZXh0Q29uZmlnYCBhbm5vdGF0aW9uIHdiZnkgd3JpdGVzIG1hcmtzIHRoZSBjYW5vbmljYWwgY29uZmlnIG9iamVjdCAoYWNjZXB0aW5nXG4gICAgICAgIC8vIHF1YWxpZmllZCBuYW1lcyBzdWNoIGFzIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYCkuXG4gICAgICAgIGNvbnN0IGFubm90YXRpb25UeXBlID0gbm9kZS50eXBlPy5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZSAhPT0gdW5kZWZpbmVkICYmIGlzTmV4dENvbmZpZ1R5cGUoYW5ub3RhdGlvblR5cGUpKSB7XG4gICAgICAgICAgdHlwZWRDb25maWdPYmplY3RMaXRlcmFscy5wdXNoKG9iamVjdExpdGVyYWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9XG4gICAgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsc1swXSA/P1xuICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz9cbiAgICAoZXhwb3J0ZWRJZGVudGlmaWVyID8gdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoZXhwb3J0ZWRJZGVudGlmaWVyKSA6IHVuZGVmaW5lZCkgPz9cbiAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldCgnbmV4dENvbmZpZycpO1xuICByZXR1cm4gb2JqZWN0TGl0ZXJhbCA/IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVud3JhcE9iamVjdExpdGVyYWwobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBjdXJyZW50ID0gdW53cmFwUGFyZW50aGVzZXMobm9kZSk7XG4gIHJldHVybiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihjdXJyZW50KSA/IGN1cnJlbnQgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVud3JhcFBhcmVudGhlc2VzKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0LkV4cHJlc3Npb24ge1xuICBsZXQgY3VycmVudCA9IG5vZGU7XG4gIHdoaWxlIChhc3QuaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihjdXJyZW50KSkge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LmV4cHJlc3Npb247XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8vIE1hdGNoIGJvdGggdGhlIGJhcmUgYE5leHRDb25maWdgIGFuZCBxdWFsaWZpZWQgZm9ybXMgbGlrZSBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2AuXG5mdW5jdGlvbiBpc05leHRDb25maWdUeXBlKHR5cGVUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVUZXh0ID09PSAnTmV4dENvbmZpZycgfHwgdHlwZVRleHQuZW5kc1dpdGgoJy5OZXh0Q29uZmlnJyk7XG59XG5cbi8vIFJldHVybiBhIHByb3BlcnR5IGtleSB3aXRob3V0IHN1cnJvdW5kaW5nIHF1b3Rlcywgc28gYCdyZWFjdENvbXBpbGVyJ2AgbWF0Y2hlcyBgcmVhY3RDb21waWxlcmAuXG4vLyBJZGVudGlmaWVyLCBzdHJpbmctbGl0ZXJhbCBhbmQgbnVtZXJpYy1saXRlcmFsIG5hbWVzIGFsbCBleHBvc2UgdGhlIHVucXVvdGVkIHZhbHVlIHZpYSBgLnRleHRgLlxuZnVuY3Rpb24gZ2V0UHJvcGVydHlLZXkobmFtZTogYXN0LlByb3BlcnR5TmFtZSwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZyB7XG4gIHJldHVybiAndGV4dCcgaW4gbmFtZSAmJiB0eXBlb2YgbmFtZS50ZXh0ID09PSAnc3RyaW5nJyA/IG5hbWUudGV4dCA6IG5hbWUuZ2V0VGV4dChzb3VyY2UpO1xufVxuXG5mdW5jdGlvbiBzdHJpcENvbW1lbnRzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1xcL1xcL1teXFxuXSp8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4Q2hha3JhVG9hc3Rlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhDaGFrcmFUb2FzdGVyJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5jaGFrcmEpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RvYXN0ZXIue3RzLHRzeH0nLCB7XG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICBpZ25vcmU6IFsnKiovLiovKionLCAnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgY29udGVudC5pbmNsdWRlcygnQ3JlYXRlVG9hc3RlclJldHVybicpIHx8XG4gICAgICAgICFjb250ZW50LmluY2x1ZGVzKFwiZnJvbSAnQGNoYWtyYS11aS9yZWFjdCdcIikgfHxcbiAgICAgICAgIWNvbnRlbnQuaW5jbHVkZXMoJ2V4cG9ydCBjb25zdCB0b2FzdGVyID0gY3JlYXRlVG9hc3RlcignKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBjb250ZW50XG4gICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgIC9eaW1wb3J0IC4qIGZyb20gJ0BjaGFrcmEtdWlcXC9yZWFjdCc7JC9tdSxcbiAgICAgICAgICBcIiQmXFxuaW1wb3J0IHR5cGUgeyBDcmVhdGVUb2FzdGVyUmV0dXJuIH0gZnJvbSAnQGNoYWtyYS11aS9yZWFjdCc7XCJcbiAgICAgICAgKVxuICAgICAgICAucmVwbGFjZSgnZXhwb3J0IGNvbnN0IHRvYXN0ZXIgPSBjcmVhdGVUb2FzdGVyKCcsICdleHBvcnQgY29uc3QgdG9hc3RlcjogQ3JlYXRlVG9hc3RlclJldHVybiA9IGNyZWF0ZVRvYXN0ZXIoJyk7XG4gICAgICBpZiAodXBkYXRlZENvbnRlbnQgIT09IGNvbnRlbnQpIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHVwZGF0ZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIE9iamVjdE1lbWJlciA9IHsga2luZDogJ2V4dHJhJzsgaW5kZXg6IG51bWJlciB9IHwgeyBraW5kOiAncHJvcGVydHknOyBrZXk6IHN0cmluZyB9O1xuaW50ZXJmYWNlIFBhcnNlZE9iamVjdCB7XG4gIGV4dHJhTWVtYmVyczogc3RyaW5nW107XG4gIG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXTtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xufVxuaW50ZXJmYWNlIEV4dHJhY3RlZE9iamVjdExpdGVyYWwge1xuICBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlO1xuICBub2RlOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG59XG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRWYWx1ZSA9PiAoe1xuICBraW5kOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXMsIGV4dHJhTWVtYmVycyksXG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzOiBib29sZWFuKTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3QgdXNlID0gdG9QYXJzZWRPYmplY3Qoe1xuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbidcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KTtcblxuICBpZiAoc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpIHtcbiAgICB1c2UucHJvcGVydGllcy5iYXNlVVJMID0gbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKTtcbiAgICB1c2UubWVtYmVyT3JkZXIudW5zaGlmdCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleTogJ2Jhc2VVUkwnIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRvUGFyc2VkT2JqZWN0KHtcbiAgICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gICAgdXNlOiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogdXNlIH0sXG4gICAgLi4uKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzXG4gICAgICA/IHtcbiAgICAgICAgICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKCkpLFxuICAgICAgICAgICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgICAgICAgICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgICAgICAgICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgICAgICAgICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgICAgICAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9QYXJzZWRPYmplY3QocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRPYmplY3Qge1xuICByZXR1cm4ge1xuICAgIGV4dHJhTWVtYmVycyxcbiAgICBtZW1iZXJPcmRlcjogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcGVydGllcykubWFwKChrZXkpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pKSxcbiAgICAgIC4uLmV4dHJhTWVtYmVycy5tYXAoKF8sIGluZGV4KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pKSxcbiAgICBdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCA9IGF3YWl0IGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZE9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIHdiIGRlcml2ZXMgTkVYVF9QVUJMSUNfQkFTRV9VUkwgZnJvbSB0aGUgcmVzb2x2ZWQgcG9ydCBmb3IgTmV4dC5qcy92aW5leHQgYXBwcyAodmluZXh0XG4gICAgLy8gYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyBgZGVwZW5kaW5nLm5leHRgIGNvdmVycyBib3RoKSwgc28gdGhvc2UgbmVlZCBubyBkZWNsYXJlZFxuICAgIC8vIHZhcmlhYmxlOyBvdGhlciBwYWNrYWdlcyBzdGlsbCByZXF1aXJlIGEgZGVjbGFyYXRpb24uXG4gICAgY29uc3Qgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMgPVxuICAgICAgc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnLCBwYXJzZWQpICYmXG4gICAgICAoY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IChhd2FpdCBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoY29uZmlnLmRpclBhdGgpKSk7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyk7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VQYXJzZWRPYmplY3RzKGRlZmF1bHRDb25maWcsIHBhcnNlZCk7XG4gICAgYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMobWVyZ2VkLCBkZWZhdWx0Q29uZmlnKTtcbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKG1lcmdlZCk7XG5cbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5VmFsdWUoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlZCB9LCAwKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UudGV4dDtcbiAgICBjb25zdCBzdGFydCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRTdGFydChleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgY29uc3QgZW5kID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIHN0YXJ0KX0ke25ld09iamVjdExpdGVyYWx9JHtvbGRDb250ZW50LnNsaWNlKGVuZCl9YDtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZTogUGFyc2VkT2JqZWN0LCBvdmVycmlkZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wZXJ0eUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG92ZXJyaWRlLnByb3BlcnRpZXMpKTtcbiAgY29uc3QgZXh0cmFNZW1iZXJzID0gWy4uLmJhc2UuZXh0cmFNZW1iZXJzLCAuLi5vdmVycmlkZS5leHRyYU1lbWJlcnNdO1xuICAvLyBLZWVwIGRlZmF1bHQtb25seSBtZW1iZXJzIGJlZm9yZSBwYXJzZWQgbWVtYmVycyBzbyBzcHJlYWRzIGFuZCBleHBsaWNpdCBsb2NhbCBwcm9wZXJ0aWVzIHJldGFpbiBwcmVjZWRlbmNlLlxuICBjb25zdCBtZW1iZXJPcmRlciA9IFtcbiAgICAuLi5iYXNlLm1lbWJlck9yZGVyLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPT0gJ3Byb3BlcnR5JyB8fCAhb3ZlcnJpZGVQcm9wZXJ0eUtleXMuaGFzKG1lbWJlci5rZXkpKSxcbiAgICAuLi5vdmVycmlkZS5tZW1iZXJPcmRlci5tYXAoKG1lbWJlcik6IE9iamVjdE1lbWJlciA9PiB7XG4gICAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHJldHVybiBtZW1iZXI7XG4gICAgICByZXR1cm4geyBraW5kOiAnZXh0cmEnLCBpbmRleDogYmFzZS5leHRyYU1lbWJlcnMubGVuZ3RoICsgbWVtYmVyLmluZGV4IH07XG4gICAgfSksXG4gIF07XG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7IC4uLmJhc2UucHJvcGVydGllcyB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZS5wcm9wZXJ0aWVzKSkge1xuICAgIHByb3BlcnRpZXNba2V5XSA9IG1lcmdlUGFyc2VkVmFsdWUocHJvcGVydGllc1trZXldLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHsgZXh0cmFNZW1iZXJzLCBtZW1iZXJPcmRlciwgcHJvcGVydGllcyB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZFZhbHVlKGJhc2U6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkLCBvdmVycmlkZTogUGFyc2VkVmFsdWUpOiBQYXJzZWRWYWx1ZSB7XG4gIGlmIChiYXNlPy5raW5kID09PSAnb2JqZWN0JyAmJiBvdmVycmlkZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2UudmFsdWUsIG92ZXJyaWRlLnZhbHVlKSB9O1xuICB9XG4gIHJldHVybiBvdmVycmlkZTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMoY29uZmlnOiBQYXJzZWRPYmplY3QsIGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB1c2UgPSBjb25maWcucHJvcGVydGllcy51c2U7XG4gIGNvbnN0IGRlZmF1bHRVc2UgPSBkZWZhdWx0Q29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBpZiAodXNlPy5raW5kICE9PSAnb2JqZWN0JyB8fCBkZWZhdWx0VXNlPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIFsndHJhY2UnLCAnc2NyZWVuc2hvdCcsICd2aWRlbyddKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV07XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwYXJzZWQ6IFBhcnNlZE9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fFxuICAgIHBhcnNlZC5wcm9wZXJ0aWVzLndlYlNlcnZlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgZG9lc09iamVjdEhhdmVCYXNlVXJsKHBhcnNlZC5wcm9wZXJ0aWVzLnVzZSkgfHxcbiAgICBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkIH0sICdORVhUX1BVQkxJQ19CQVNFX1VSTCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRvZXNPYmplY3RIYXZlQmFzZVVybCh2YWx1ZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlPy5raW5kID09PSAnb2JqZWN0JyAmJiB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzLmJhc2VVUkwgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwodmFsdWU6IFBhcnNlZFZhbHVlLCBsaXRlcmFsVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZS5pbmNsdWRlcyhsaXRlcmFsVGV4dCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSByZXR1cm4gdmFsdWUudmFsdWUuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpO1xuICByZXR1cm4gKFxuICAgIHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVycy5zb21lKChtZW1iZXIpID0+IG1lbWJlci5pbmNsdWRlcyhsaXRlcmFsVGV4dCkpIHx8XG4gICAgT2JqZWN0LnZhbHVlcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGdldEVudkZpbGVQYXRocyhkaXJQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgLy8gU29tZSBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb25seSBkZWZpbmUgYnJvd3NlciBwcm9qZWN0cyBvciBmaXh0dXJlcyBhbmQgZG8gbm90XG4gIC8vIHN0YXJ0IGEgd2ViIGFwcC4gQXZvaWQgZm9yY2luZyBhbiBhcHAtc2VydmVyIFVSTCBpbnRvIHRob3NlIHBhY2thZ2VzLlxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEVudkZpbGVQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVudkZpbGVOYW1lcyA9IFsnZm5veC50b21sJywgJ21pc2UudG9tbCcsICdtaXNlLnRlc3QudG9tbCddO1xuICBjb25zdCBlbnZGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpKSB7XG4gICAgZW52RmlsZVBhdGhzLnB1c2goLi4uZW52RmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG5cbiAgICAvLyBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb2Z0ZW4gbGl2ZSBpbiBwYWNrYWdlcy8qIHdoaWxlIHNoYXJlZCBlbnYgZmlsZXMgbGl2ZSBhdCB0aGVcbiAgICAvLyByZXBvc2l0b3J5IHJvb3QsIHNvIHdhbGsgdXB3YXJkIHVudGlsIHRoZSB0YXJnZXQgcmVwbyBib3VuZGFyeS5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsICcuZ2l0JykpKSBicmVhaztcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZW52RmlsZVBhdGhzO1xufVxuXG5mdW5jdGlvbiBzZXRXZWJTZXJ2ZXJDb21tYW5kKG9iamVjdDogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCBjb21tYW5kID0gd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZDtcbiAgLy8gTGlicmFyaWVzIGNhbiB1c2UgUGxheXdyaWdodCdzIHdlYlNlcnZlciB0byBidWlsZCBhbmQgbGF1bmNoIGEgZml4dHVyZSBldmVuIHRob3VnaCBgd2Igc3RhcnRgXG4gIC8vIGludGVudGlvbmFsbHkgaGFzIG5vIHRlc3Qgc2VydmVyIGZvciB0aGUgbGlicmFyeSBpdHNlbGYuIFByZXNlcnZlIHRob3NlIGN1c3RvbSBsaWZlY3ljbGVcbiAgLy8gY29tbWFuZHM7IG9ubHkgYWRkIHRoZSBjb21tYW5kIHdoZW4gd2JmeSBhbHJlYWR5IG93bnMgaXQuXG4gIGlmIChjb21tYW5kICYmICFpc0dlbmVyYXRlZFdiU3RhcnRUZXN0Q29tbWFuZChjb21tYW5kKSkgcmV0dXJuO1xuXG4gIC8vIFBsYXl3cmlnaHQgcmVxdWlyZXMgYGNvbW1hbmRgIHdoZW5ldmVyIGB3ZWJTZXJ2ZXJgIGV4aXN0czsgYW4gZXh0ZXJuYWxseSBtYW5hZ2VkIHNlcnZlciBzaG91bGRcbiAgLy8gb21pdCBgd2ViU2VydmVyYCBpbnN0ZWFkLiBLZWVwIGZpbGxpbmcgdGhpcyByZXF1aXJlZCBmaWVsZCB3aGVuIGEgcGFydGlhbCBtYW5hZ2VkIGJsb2NrIGxhY2tzIGl0LlxuICB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kID0gbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkV2JTdGFydFRlc3RDb21tYW5kKGNvbW1hbmQ6IFBhcnNlZFZhbHVlKTogYm9vbGVhbiB7XG4gIGlmIChjb21tYW5kLmtpbmQgIT09ICdsaXRlcmFsJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gY29tbWFuZC52YWx1ZS50cmltKCkgPT09IGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpO1xufVxuXG5mdW5jdGlvbiBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnYnVuIHdiIHN0YXJ0IC0tbW9kZSB0ZXN0J2A7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEV4dHJhY3RlZE9iamVjdExpdGVyYWwgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVHlwZVNjcmlwdCBhbHJlYWR5IHVuZGVyc3RhbmRzIG5lc3RlZCBvYmplY3QgbGl0ZXJhbHMgYW5kIHRlbXBsYXRlIHN0cmluZ3MsIHNvIHVzZVxuICAvLyBpdHMgQVNUIHJhbmdlcyBpbnN0ZWFkIG9mIGEgcmVnZXggdGhhdCBjYW4gc3RvcCBhdCB0aGUgZmlyc3QgaW5uZXIgY2xvc2luZyBicmFjZS5cbiAgbGV0IGZvdW5kOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKGFzdC5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkgPT09ICdkZWZpbmVDb25maWcnKSB7XG4gICAgICBjb25zdCBmaXJzdEFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmd1bWVudCAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgICBmb3VuZCA9IGZpcnN0QXJndW1lbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICByZXR1cm4gZm91bmQgPyB7IHNvdXJjZSwgbm9kZTogZm91bmQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IGFzdC5FeHByZXNzaW9uLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAoYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWRPYmplY3QgfSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7IGV4dHJhTWVtYmVyczogW10sIG1lbWJlck9yZGVyOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoYXN0LmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gbGl0ZXJhbChrZXkpO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIWFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHxcbiAgICAgICghYXN0LmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VkLmV4dHJhTWVtYmVycy5wdXNoKHByb3BlcnR5LmdldFRleHQoc291cmNlKSkgLSAxO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIGlmICh2YWx1ZS52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICAgIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gICAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgZW1pdHRlZFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkodmFsdWUudmFsdWUubWVtYmVyT3JkZXIpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyLmZsYXRNYXAoKG1lbWJlciwgaW5kZXgpID0+IHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdleHRyYScpIHtcbiAgICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0TWVtYmVyKHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVyc1ttZW1iZXIuaW5kZXhdID8/ICcnLCBpbmRlbnQpXTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFByb3BlcnR5SW5kZXhCeUtleS5nZXQobWVtYmVyLmtleSkgIT09IGluZGV4KSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbSA9IHZhbHVlLnZhbHVlLnByb3BlcnRpZXNbbWVtYmVyLmtleV07XG4gICAgaWYgKCFpdGVtIHx8IGVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhtZW1iZXIua2V5KSkgcmV0dXJuIFtdO1xuICAgIGVtaXR0ZWRQcm9wZXJ0aWVzLmFkZChtZW1iZXIua2V5KTtcbiAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdFByb3BlcnR5KG1lbWJlci5rZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpXTtcbiAgfSk7XG4gIGxpbmVzLnB1c2goXG4gICAgLi4uT2JqZWN0LmVudHJpZXModmFsdWUudmFsdWUucHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhZW1pdHRlZFByb3BlcnRpZXMuaGFzKGtleSkpXG4gICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KSlcbiAgKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleShtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBtZW1iZXJdIG9mIG1lbWJlck9yZGVyLmVudHJpZXMoKSkge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgbGFzdFByb3BlcnR5SW5kZXhCeUtleS5zZXQobWVtYmVyLmtleSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGFzdFByb3BlcnR5SW5kZXhCeUtleTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5OiBzdHJpbmcsIGl0ZW06IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0TWVtYmVyKG1lbWJlcjogc3RyaW5nLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gbWVtYmVyLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBzdHJpbmdpZmllZC5lbnRyaWVzKCkpIHtcbiAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtsaW5lfWA7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbnR5cGUgV2lsbEJvb3N0ZXJPcmdhbml6YXRpb24gPSAnV2lsbEJvb3N0ZXInIHwgJ1dpbGxCb29zdGVyTGFiJztcbnR5cGUgUmVwb3NpdG9yeUZ1bGxOYW1lID0gYCR7V2lsbEJvb3N0ZXJPcmdhbml6YXRpb259LyR7c3RyaW5nfWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm5veFJlcG9zaXRvcnlTY29wZSB7XG4gIG9yZ2FuaXphdGlvbnM/OiByZWFkb25seSBXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbltdO1xuICByZXBvc2l0b3JpZXM/OiByZWFkb25seSBSZXBvc2l0b3J5RnVsbE5hbWVbXTtcbiAgLy8gUmVzdHJpY3RzIHRoZSBzY29wZSB0byByZXBvc2l0b3JpZXMgb2YgdGhlIGdpdmVuIHZpc2liaWxpdHkuIFB1YmxpYyByZXBvc2l0b3JpZXMgcHVibGlzaCB0aGVpclxuICAvLyBjaXBoZXJ0ZXh0cyB0byB0aGUgd29ybGQsIHNvIHRoZXkgbXVzdCB1c2UgYSBDSSBpZGVudGl0eSBzZXBhcmF0ZSBmcm9tIHRoZSBvcmctaW50ZXJuYWwgb25lOlxuICAvLyBsZWFraW5nIGVpdGhlciBDSSBrZXkgbXVzdCBub3QgZXhwb3NlIHRoZSBvdGhlciBzaWRlJ3Mgc2VjcmV0cy5cbiAgdmlzaWJpbGl0eT86ICdwdWJsaWMnIHwgJ3ByaXZhdGUnO1xufVxuXG5pbnRlcmZhY2UgRm5veEFnZVByaW5jaXBhbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHVibGljS2V5czogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlcG9zaXRvcnlTY29wZTogRm5veFJlcG9zaXRvcnlTY29wZTtcbiAgLy8gTWFya3MgdGhlIHByaW5jaXBhbCBhcyBhIENJIGlkZW50aXR5IGFuZCBuYW1lcyB0aGUgR2l0SHViIHNlY3JldCBob2xkaW5nIGl0cyBwcml2YXRlIGtleS5cbiAgLy8gRXZlcnkgZm5veC1tYW5hZ2VkIHJlcG9zaXRvcnkgbXVzdCByZXNvbHZlIG9uZSAoZ2VuZXJhdGVGbm94VG9tbCBmYWlscyBjbG9zZWQgb3RoZXJ3aXNlOiBhXG4gIC8vIHJvc3RlciB3aXRob3V0IGEgQ0kgcmVjaXBpZW50IHdvdWxkIHJlLWVuY3J5cHQgc2VjcmV0cyB0aGF0IENJIGNhbiBuZXZlciBkZWNyeXB0IGFnYWluKSwgYW5kXG4gIC8vIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgZGVyaXZlcyBpdHMgY2FsbGVyIG1hcHBpbmdzIGZyb20gdGhlIHNhbWUgcmVzb2x1dGlvbiBzbyB0aGUgdHdvIGNhblxuICAvLyBuZXZlciBkaXNhZ3JlZSBvbiB3aGljaCBDSSBpZGVudGl0eSBhcHBsaWVzLlxuICBjaUFnZUtleVNlY3JldE5hbWU/OiAnRk5PWF9BR0VfS0VZJyB8ICdQVUJMSUNfRk5PWF9BR0VfS0VZJztcbn1cblxuaW50ZXJmYWNlIEZub3hBZ2VSZWNpcGllbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xufVxuXG4vLyBUaGUgYWdlIHByaW5jaXBhbHMgYXV0aG9yaXplZCB0byBkZWNyeXB0IGVhY2ggZm5veC1tYW5hZ2VkIHJlcG9zaXRvcnkuIFRvIGdyYW50IGFjY2VzcywgYWRkIHRoZVxuLy8gcHJpbmNpcGFsJ3MgcHVibGljIGtleXMgYW5kIHJlcG9zaXRvcnkgc2NvcGUgaGVyZS4gT3JnYW5pemF0aW9uIHNjb3BlcyBpbmNsdWRlIGV2ZXJ5IGN1cnJlbnQgYW5kXG4vLyBmdXR1cmUgcmVwb3NpdG9yeSBpbiB0aGF0IG9yZ2FuaXphdGlvbjsgdXNlIHJlcG9zaXRvcmllcyBmb3IgZXhhY3Qgb3duZXIvcmVwb3NpdG9yeSBncmFudHMuIFRoZVxuLy8gbmV4dCB3YmZ5IHJ1biBvbiBlYWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgcmV3cml0ZXMgZXZlcnkgbWFuYWdlZCBmbm94LnRvbWwgYW5kIHJlLWVuY3J5cHRzIGl0c1xuLy8gY29tbWl0dGVkIHNlY3JldHMgZm9yIHRoZSByZXN1bHRpbmcgcmVjaXBpZW50IHNldC4gQSBzY29wZSdzIG9wdGlvbmFsIHZpc2liaWxpdHkgY29uc3RyYWludFxuLy8gc2VsZWN0cyBvbmx5IHB1YmxpYyBvciBvbmx5IHByaXZhdGUgcmVwb3NpdG9yaWVzICh1c2VkIHRvIGtlZXAgdGhlIG9yZy1pbnRlcm5hbCBhbmQgdGhlXG4vLyBwdWJsaWMtcmVwb3NpdG9yeSBDSSBpZGVudGl0aWVzIGFwYXJ0KS4gUmVtb3ZpbmcgYSBzY29wZSBjYW5ub3QgcmV2b2tlIGNpcGhlcnRleHRcbi8vIGFscmVhZHkgYXZhaWxhYmxlIGZyb20gR2l0IGhpc3RvcnksIHNvIHJvdGF0ZSB0aGUgc2VjcmV0IHZhbHVlcyB0aGF0IHByaW5jaXBhbCBjb3VsZCBkZWNyeXB0LlxuLy8gT25seSBwdWJsaWMga2V5cyBtYXkgYXBwZWFyIGhlcmU7IGEgQ0kgaWRlbnRpdHkncyBwcml2YXRlIGtleSBzdXBwbGllcyB0aGUgRk5PWF9BR0VfS0VZIChvcixcbi8vIGZvciBwdWJsaWMgcmVwb3NpdG9yaWVzLCBQVUJMSUNfRk5PWF9BR0VfS0VZKSBvcmdhbml6YXRpb24gc2VjcmV0LlxuZXhwb3J0IGNvbnN0IEZOT1hfQUdFX1BSSU5DSVBBTFMgPSBbXG4gIHtcbiAgICBuYW1lOiAnZXhrYXp1dScsXG4gICAgcHVibGljS2V5czogWydhZ2UxajIzNTR4aHZtM2Z2OXk3N3Q1ZzZ5M3E4bWV4Z2sybWYwMHRncmt6Z3A3M3R5bnJ2ejU1czhhdWF5dyddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdwb25oYXJ1JyxcbiAgICBwdWJsaWNLZXlzOiBbXG4gICAgICAnYWdlMThydWdsZGY5aHRjNnVtNWVwbHB4MjdrNTNlcDR6bjBsaHp3ZmZnbnh6aHJxMGM3emd2eXEzemNjZHknLFxuICAgICAgJ2FnZTFuejJuOTljcmpyN25wOXhqZ2x3ZmZmYzNkdWQ0NWRoZXdxenFmenB6dGtkd3U0aGo3NGdxNmVsNTMzJyxcbiAgICBdLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIC8vIFRoZSBvcmctaW50ZXJuYWwgQ0kgaWRlbnRpdHkgKHRoZSBGTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uIHNlY3JldCAvIH4vLmNvbmZpZy9mbm94L2FnZS1jaS13Yi50eHQpLlxuICAgIG5hbWU6ICdjaScsXG4gICAgcHVibGljS2V5czogWydhZ2UxYTJjNmVmNmFobDZtbWtoZ3F0eGcwbWd0ZDd5c3NwbnRxN3J4dXN2MjZlZnhobnVobGNkc3I5ZHBhayddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10sIHZpc2liaWxpdHk6ICdwcml2YXRlJyB9LFxuICAgIGNpQWdlS2V5U2VjcmV0TmFtZTogJ0ZOT1hfQUdFX0tFWScsXG4gIH0sXG4gIHtcbiAgICAvLyBUaGUgQ0kgaWRlbnRpdHkgZGVkaWNhdGVkIHRvIHB1YmxpYyByZXBvc2l0b3JpZXMgKHRoZSBQVUJMSUNfRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvblxuICAgIC8vIHNlY3JldCAvIH4vLmNvbmZpZy9mbm94L2FnZS1jaS13Yi1wdWJsaWMudHh0KS4gU2NvcGVkIHRvIFdpbGxCb29zdGVyIG9ubHkgYmVjYXVzZSB0aGVcbiAgICAvLyBQVUJMSUNfRk5PWF9BR0VfS0VZIHNlY3JldCBpcyByZWdpc3RlcmVkIGluIHRoYXQgb3JnYW5pemF0aW9uIGFsb25lOyBhIHB1YmxpY1xuICAgIC8vIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcnkgcmVzb2x2ZXMgTk8gQ0kgaWRlbnRpdHkgYW5kIGdlbmVyYXRlRm5veFRvbWwgZmFpbHMgY2xvc2VkIG9uIGl0XG4gICAgLy8gKFdpbGxCb29zdGVyTGFiIGRvZXMgb3duIHB1YmxpYyByZXBvc2l0b3JpZXMsIGUuZy4gaXRzIHJldXNhYmxlLXdvcmtmbG93cyBzeW5jIG1pcnJvciwgYnV0XG4gICAgLy8gbm9uZSBvZiB0aGVtIHVzZSBmbm94IOKAlCByZWdpc3RlciB0aGUgc2VjcmV0IHRoZXJlIGFuZCBleHRlbmQgdGhpcyBzY29wZSBpZiBvbmUgZXZlciBkb2VzKS5cbiAgICBuYW1lOiAnY2ktcHVibGljJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFmaGVhODV4andwODlsd3EzamNud2ozMnN3aDN2MjRwd3BhcnFoNWw3cWtndmM0YXgzcDBxbDZkdTM2J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInXSwgdmlzaWJpbGl0eTogJ3B1YmxpYycgfSxcbiAgICBjaUFnZUtleVNlY3JldE5hbWU6ICdQVUJMSUNfRk5PWF9BR0VfS0VZJyxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdyZW1pbicsXG4gICAgcHVibGljS2V5czogWydhZ2UxbXc0cHo5ZHVqeTlkbWhrMHBhbHFhd2prajdtNGs3eng3OHlyOWZqdDYzc2E1bDNlNDN1cTZudzAwNCddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdhcmllcycsXG4gICAgcHVibGljS2V5czogWydhZ2Uxbm4wZWh5YWVueXE4a21ucTQyOTRrenpneHY1ZG5mNnBlcDJjZGtyYXh6ZnFsazd4Z3NycXFuNm5uOSddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbXG4gICAgICAgICdXaWxsQm9vc3Rlci9hZ2VudC1jaGFsbGVuZ2VzJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2FnZW50aWMtd29ya2Zsb3dzLWRhc2hib2FyZCcsXG4gICAgICAgICdXaWxsQm9vc3Rlci9jaGVlcmxpbmdzJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2Nob2Z1LXdhbGtpbmcnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvcHJvbXB0LXN0dWR5JyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2p1ZGdlJyxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdzdW5hZ2EnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMXVseHpuNnk2OGt1MzRjcHg1ZnlhNWdmN3Jucnd6MHVmbG55ZTZ1eHVoZzM0cDJuamhna3FtZzczZzQnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogWydXaWxsQm9vc3Rlci9haS1vY3InLCAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLCAnV2lsbEJvb3N0ZXIvanVkZ2UnXSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2F5YW1lJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTF2eG0yZ3MwMDNydXdtOHA2aDNodjd4YXNqdTJzOGs0bXhtYzM0em02Z3Jkd3pucnMwOW5xNnh6NXZ6J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFsnV2lsbEJvb3N0ZXIvYWktb2NyJywgJ1dpbGxCb29zdGVyL2Nob2Z1LXdhbGtpbmcnLCAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLCAnV2lsbEJvb3N0ZXIvanVkZ2UnXSxcbiAgICB9LFxuICB9LFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgRm5veEFnZVByaW5jaXBhbFtdO1xuXG5pbnRlcmZhY2UgRm5veFRvbWwge1xuICBpbXBvcnQ/OiB1bmtub3duO1xuICBwcm92aWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD47XG4gIHByb2ZpbGVzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5sZXQgZm5veFN5bmNGYWlsZWQgPSBmYWxzZTtcbmxldCBtaWdyYXRpb25NYXJrZXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcblxuLyoqIFdoZXRoZXIgYW55IGZub3ggcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBmYWlsZWQgaW4gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeTsgc2V0dXBTZWNyZXRzIG11c3Qgbm90IHVwbG9hZCB0aGVuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zub3hTeW5jRmFpbGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZm5veFN5bmNGYWlsZWQ7XG59XG5cbi8qKlxuICogU3luY2hyb25pemVzIHRoZSBhZ2UgcmVjaXBpZW50cyBpbiBldmVyeSBmbm94LnRvbWwgd2l0aCB0aGUgcHJpbmNpcGFscyBhdXRob3JpemVkIGZvciB0aGlzXG4gKiByZXBvc2l0b3J5IGFuZCByZS1lbmNyeXB0cyB0aGUgY29tbWl0dGVkIHNlY3JldHMgd2hlbiB0aGUgcmVjaXBpZW50IHNldCBjaGFuZ2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVGbm94VG9tbChyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVGbm94VG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGUgZmFpbHVyZSBmbGFnIGlzIHBlciByZXBvc2l0b3J5OiB3YmZ5IGNhbiBwcm9jZXNzIG11bHRpcGxlIHdvcmtpbmcgZGlyZWN0b3JpZXMgaW4gb25lXG4gICAgLy8gaW52b2NhdGlvbiwgYW5kIGFuIGVhcmxpZXIgcmVwb3NpdG9yeSdzIGZhaWx1cmUgbXVzdCBub3QgdmV0byBhIGxhdGVyIHJlcG9zaXRvcnkncyB1cGxvYWQuXG4gICAgZm5veFN5bmNGYWlsZWQgPSBmYWxzZTtcbiAgICAvLyBBIHJlcG9zaXRvcnkgb3V0c2lkZSBXaWxsQm9vc3Rlci9XaWxsQm9vc3RlckxhYiBtYW5hZ2VzIGl0cyBvd24gcmVjaXBpZW50IHNldCAoZS5nLiBhXG4gICAgLy8gcGVyc29uYWwgcmVwb3NpdG9yeSB3aXRoIGl0cyBvd24gQ0kgaWRlbnRpdHkpLCBzbyByZXdyaXRpbmcgaXQgdG8gdGhlIG9yZyByb3N0ZXIgd291bGQgZ3JhbnRcbiAgICAvLyBvcmcgbWVtYmVycyBhY2Nlc3MgYW5kIHJlLWVuY3J5cHQgc2VjcmV0cyBmb3IgYSBDSSBrZXkgdGhhdCByZXBvc2l0b3J5IGRvZXMgbm90IHVzZS5cbiAgICAvLyBzZXR1cFNlY3JldHMgbmV2ZXIgdXBsb2FkcyBzZWNyZXRzIGZvciBzdWNoIHJlcG9zaXRvcmllcyBlaXRoZXIsIHNvIHNraXAgZW50aXJlbHkuXG4gICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvKSByZXR1cm47XG4gICAgY29uc3QgYWdlUmVjaXBpZW50cyA9IGdldEZub3hBZ2VSZWNpcGllbnRzKHJvb3RDb25maWcpO1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgLy8gQSBuZXN0ZWQtb25seSBmbm94IGxheW91dCBpcyB1bnN1cHBvcnRlZDogc2V0dXBTZWNyZXRzIHdvdWxkIHRha2UgdGhlIGRvdGVudiBwYXRoIGFuZFxuICAgICAgLy8gZGVsZXRlIEZOT1hfQUdFX0tFWSBldmVuIHRob3VnaCB0aGUgbmVzdGVkIGNvbmZpZydzIENJIHN0aWxsIG5lZWRzIGl0LlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gT25seSBhZ2UtdXNpbmcgY29uZmlncyBjYXJyeSB0aGF0IHJpc2suIFdpdGhvdXQgYSByb290IHByb3ZpZGluZyB0aGUgYWdlIHByb3ZpZGVyLCBhXG4gICAgICAgIC8vIHN0cmF5IGNvbmZpZyB0aGF0IGRlY2xhcmVzIG5vbmUgdXNlcyBubyBhZ2UgZW5jcnlwdGlvbiBhdCBhbGwgKGUuZy4gYSBwbGFpbnRleHQgdGVzdFxuICAgICAgICAvLyBmaXh0dXJlIG9yIGV4YW1wbGUgY29uZmlnIGFueSByZXBvc2l0b3J5IG1heSBsZWdpdGltYXRlbHkgY29tbWl0KSwgc28gaXQgbmVpdGhlciBuZWVkc1xuICAgICAgICAvLyByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIG5vciBvd25zIGFuIEZOT1hfQUdFX0tFWSBhbmQgbXVzdCBub3QgYmxvY2sgdGhlIHJ1bi5cbiAgICAgICAgY29uc3Qgc3RyYXlGaWxlUGF0aHMgPSBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGgpLmZpbHRlcigoZmlsZVBhdGgpID0+XG4gICAgICAgICAgZGVjbGFyZXNGbm94QWdlUHJvdmlkZXIoZmlsZVBhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdHJheUZpbGVQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgZm5veCBjb25maWdzIGV4aXN0IHdpdGhvdXQgYSByb290IGZub3gudG9tbDogJHtzdHJheUZpbGVQYXRocy5qb2luKCcsICcpfS4gQWRkIGEgcm9vdCBmbm94LnRvbWwuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEZhaWwgY2xvc2VkOiB3aXRob3V0IGdpdCBpbmZvcm1hdGlvbiBhIG5lc3RlZC1vbmx5IGZub3ggbGF5b3V0IGNhbm5vdCBiZSBydWxlZCBvdXQsIGFuZFxuICAgICAgICAvLyBzZXR1cFNlY3JldHMgd291bGQgb3RoZXJ3aXNlIHRha2UgdGhlIGRvdGVudiBwYXRoIGFuZCBkZWxldGUgRk5PWF9BR0VfS0VZLlxuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBjaGVjayBmb3IgbmVzdGVkIGZub3ggY29uZmlncyBkdWUgdG86ICR7KGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgZmFpbGVkIHZpc2liaWxpdHkgbG9va3VwIGNvbGxhcHNlcyBpc1B1YmxpY1JlcG8gdG8gZmFsc2UsIHdoaWNoIHdvdWxkIHNpbGVudGx5IHJlLWVuY3J5cHRcbiAgICAvLyBhIHB1YmxpYyByZXBvc2l0b3J5J3Mgd29ybGQtcmVhZGFibGUgY2lwaGVydGV4dHMgdG8gdGhlIG9yZy1pbnRlcm5hbCBDSSBpZGVudGl0eSAoYW5kIHZpY2VcbiAgICAvLyB2ZXJzYSBkcm9wIHRoZSBwdWJsaWMgb25lKS4gRmFpbCBpbnN0ZWFkIG9mIGd1ZXNzaW5nIHdoZW5ldmVyIHZpc2liaWxpdHkgY2hhbmdlcyB0aGUgcm9zdGVyLlxuICAgIGlmICghcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gJiYgZG9lc0Zub3hSZWNpcGllbnRTZXREZXBlbmRPblZpc2liaWxpdHkocm9vdENvbmZpZykpIHtcbiAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgdGhlIHZpc2liaWxpdHkgb2YgJHtyb290Q29uZmlnLnJlcG9BdXRob3J9LyR7cm9vdENvbmZpZy5yZXBvTmFtZX0gY291bGQgbm90IGJlIGRldGVybWluZWQgKEdpdEh1YiBsb29rdXAgZmFpbGVkKSBhbmQgdGhlIENJIHJlY2lwaWVudCBkZXBlbmRzIG9uIGl0LiBDaGVjayBuZXR3b3JrIGFuZCBnaCBhdXRoZW50aWNhdGlvbiwgdGhlbiByZXJ1biB3YmZ5LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEJvdGggQ0kgaWRlbnRpdGllcyBhcmUgdmlzaWJpbGl0eS1jb25zdHJhaW5lZCwgc28gYSByZXBvc2l0b3J5IGNhbiBmYWxsIHRocm91Z2ggQk9USCAoZS5nLiBhXG4gICAgLy8gcHVibGljIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcnksIHdob3NlIG9yZ2FuaXphdGlvbiBoYXMgbm8gUFVCTElDX0ZOT1hfQUdFX0tFWSBzZWNyZXQpLlxuICAgIC8vIFJlLWVuY3J5cHRpbmcgZm9yIGEgcm9zdGVyIHdpdGhvdXQgYSBDSSBpZGVudGl0eSB3b3VsZCBsZWF2ZSBDSSB1bmFibGUgdG8gZGVjcnlwdCBhbnl0aGluZyxcbiAgICAvLyBmYWlsaW5nIG9ubHkgYXQgcnVudGltZSBpbiBBY3Rpb25zOyBmYWlsIGxvdWRseSBoZXJlIGluc3RlYWQuXG4gICAgaWYgKCFyZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShyb290Q29uZmlnKSkge1xuICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBubyBDSSBpZGVudGl0eSBpcyBzY29wZWQgdG8gJHtyb290Q29uZmlnLnJlcG9BdXRob3J9LyR7cm9vdENvbmZpZy5yZXBvTmFtZX0gKHB1YmxpYyByZXBvc2l0b3JpZXMgYXJlIHN1cHBvcnRlZCBvbmx5IGluIHRoZSBXaWxsQm9vc3RlciBvcmdhbml6YXRpb24pLiBQcm92aXNpb24gdGhlIG1hdGNoaW5nIG9yZ2FuaXphdGlvbiBzZWNyZXQgYW5kIGV4dGVuZCB0aGUgQ0kgc2NvcGVzIGluIHdiZnkgZmlyc3QuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIG1pZ3JhdGlvbiBpcyB0cmFuc2FjdGlvbmFsIG92ZXIgZXZlcnkgbWFuYWdlZCBmbm94LnRvbWw6IHJlcnVucyBtdXN0IHJldHJ5IGZyb20gdGhlXG4gICAgLy8gb3JpZ2luYWwgc3RhdGUsIGFuZCBhIHBhcnRpYWxseSBtaWdyYXRlZCB0cmVlIGNvdWxkIG90aGVyd2lzZSBiZWNvbWUgdW5kZWNyeXB0YWJsZSBmb3IgdGhlXG4gICAgLy8gaWRlbnRpdHkgcGVyZm9ybWluZyBhIGxhdGVyIHJldHJ5IChlLmcuIHdoZW4gYSByZWNpcGllbnQgaXMgYmVpbmcgcmVtb3ZlZCkuXG4gICAgY29uc3Qgc25hcHNob3RzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAvLyBBIGZhaWxlZCBzeW5jaHJvbml6YXRpb24gbXVzdCBmYWlsIHRoZSB3aG9sZSB3YmZ5IHJ1bjogZXhpdGluZyB6ZXJvIHdpdGggc3RhbGUgcmVjaXBpZW50c1xuICAgIC8vIHdvdWxkIGxlYXZlIHNlY3JldHMgdW5kZWNyeXB0YWJsZSBmb3IgbmV3IHJlY2lwaWVudHMgd2hpbGUgbG9va2luZyBzdWNjZXNzZnVsLlxuICAgIHRyeSB7XG4gICAgICAvLyBBbnkgZm5veCBjb25maWcgKGluY2x1ZGluZyBhbGlhc2VzIGFuZCBsb2NhbCBvdmVycmlkZXMpIGluIGFuIGFuY2VzdG9yIGRpcmVjdG9yeSB3b3VsZFxuICAgICAgLy8gbWVyZ2UgaW50byAoYW5kIHBvc3NpYmx5IGJlIFJFV1JJVFRFTiBieSkgdGhpcyByZXBvc2l0b3J5J3MgYGZub3ggcmVlbmNyeXB0YCB0aHJvdWdoXG4gICAgICAvLyBoaWVyYXJjaGljYWwgbG9hZGluZywgdXNpbmcgdGhpcyByZXBvc2l0b3J5J3MgcmVjaXBpZW50IHNldCBmb3IgZm9yZWlnbiBzZWNyZXRzLlxuICAgICAgZm9yIChsZXQgZGlyUGF0aCA9IHBhdGguZGlybmFtZShyb290RGlyUGF0aCk7IDsgZGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKSkge1xuICAgICAgICBjb25zdCBhbmNlc3RvckZub3hGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aCk7XG4gICAgICAgIGlmIChhbmNlc3RvckZub3hGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGFuIGFuY2VzdG9yIGRpcmVjdG9yeSBjb250YWlucyBmbm94IGNvbmZpZ3MgdGhhdCBmbm94IHdvdWxkIGhpZXJhcmNoaWNhbGx5IG1lcmdlIGFuZCByZXdyaXRlOiAke2FuY2VzdG9yRm5veEZpbGVOYW1lc1xuICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfS4gUmVtb3ZlIHRoZW0gb3IgbW92ZSB0aGUgcmVwb3NpdG9yeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGguZGlybmFtZShkaXJQYXRoKSA9PT0gZGlyUGF0aCkgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBmbm94IGFsc28gbG9hZHMgY29tbWl0dGVkIGNvbmZpZyBhbGlhc2VzIHRoaXMgZ2VuZXJhdG9yIGNhbm5vdCBrZWVwIGluIHN5bmMuXG4gICAgICBjb25zdCBmbm94TGlrZUZpbGVQYXRocyA9IGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCB1bnN1cHBvcnRlZEZpbGVQYXRocyA9IGZub3hMaWtlRmlsZVBhdGhzLmZpbHRlcigoZmlsZVBhdGgpID0+IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpICE9PSAnZm5veC50b21sJyk7XG4gICAgICBpZiAodW5zdXBwb3J0ZWRGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2Ugb25seSBmbm94LnRvbWwgZmlsZXMgYXJlIHN1cHBvcnRlZDogJHt1bnN1cHBvcnRlZEZpbGVQYXRocy5qb2luKCcsICcpfS4gTWVyZ2UgdGhlbSBpbnRvIHRoZSBhZGphY2VudCBmbm94LnRvbWwuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkaXJQYXRocyA9IGxpc3RGbm94VG9tbERpclBhdGhzKGZub3hMaWtlRmlsZVBhdGhzKTtcbiAgICAgIGlmICghZGlyUGF0aHMuaW5jbHVkZXMocm9vdERpclBhdGgpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke3BhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2Zub3gudG9tbCcpfSBpcyBpbnZpc2libGUgdG8gZ2l0IChnaXRpZ25vcmVkPykuIENvbW1pdCBpdCBvciByZW1vdmUgaXQuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBHaXQtYmFzZWQgZGlzY292ZXJ5IGNhbm5vdCBzZWUgZ2l0aWdub3JlZCBmaWxlcywgc28gYWxzbyBpbnNwZWN0IGV2ZXJ5IGRpcmVjdG9yeSBpbiBlYWNoXG4gICAgICAvLyBtYW5hZ2VkIGNvbmZpZydzIGhpZXJhcmNoeSB0aHJvdWdoIHRoZSBmaWxlc3lzdGVtOiBhIGdpdGlnbm9yZWQgYWxpYXMgKGUuZy4gLmZub3gudG9tbClcbiAgICAgIC8vIG9yIGEgZ2l0aWdub3JlZCBmbm94LnRvbWwgaW4gYW4gaW50ZXJtZWRpYXRlIGRpcmVjdG9yeSB3b3VsZCBzdGlsbCBiZSBsb2FkZWQgYnkgZm5veCBhbmRcbiAgICAgIC8vIGNvdWxkIG92ZXJyaWRlIHRoZSBwcm92aWRlciB1c2VkIGZvciBuZXN0ZWQgcmUtZW5jcnlwdGlvbi5cbiAgICAgIGNvbnN0IG1hbmFnZWREaXJQYXRocyA9IG5ldyBTZXQoZGlyUGF0aHMpO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaGllcmFyY2h5RGlyUGF0aCBvZiBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoLCByb290RGlyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBzdHJheUZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhoaWVyYXJjaHlEaXJQYXRoKS5maWx0ZXIoXG4gICAgICAgICAgICAobmFtZSkgPT4gbmFtZSAhPT0gJ2Zub3gubG9jYWwudG9tbCcgJiYgIShuYW1lID09PSAnZm5veC50b21sJyAmJiBtYW5hZ2VkRGlyUGF0aHMuaGFzKGhpZXJhcmNoeURpclBhdGgpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHN0cmF5RmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgZm5veCB3b3VsZCBsb2FkIHVubWFuYWdlZCAoZ2l0aWdub3JlZD8pIGNvbmZpZ3M6ICR7c3RyYXlGaWxlTmFtZXNcbiAgICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBwYXRoLmpvaW4oaGllcmFyY2h5RGlyUGF0aCwgbmFtZSkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyl9LiBDb21taXQgdGhlbSBhcyBmbm94LnRvbWwgb3IgcmVtb3ZlIHRoZW0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQSBmbm94LmxvY2FsLnRvbWwgYW55d2hlcmUgaW4gdGhlIG1lcmdlZCBoaWVyYXJjaHkgKG5vdCBvbmx5IG5leHQgdG8gYSBtYW5hZ2VkXG4gICAgICAgICAgLy8gY29uZmlnKSBjYW4gb3ZlcnJpZGUgcHJvdmlkZXJzLlxuICAgICAgICAgIGNvbnN0IGxvY2FsSXNzdWUgPSBmaW5kRm5veExvY2FsVG9tbElzc3VlKGhpZXJhcmNoeURpclBhdGgpO1xuICAgICAgICAgIGlmIChsb2NhbElzc3VlKSB7XG4gICAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7bG9jYWxJc3N1ZX0uIEtlZXAgb25seSBtYWNoaW5lLWxvY2FsIHNlY3JldCBvdmVycmlkZXMgdGhlcmUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoZSBpbi1tZW1vcnkgc25hcHNob3RzIGRvIG5vdCBzdXJ2aXZlIGEga2lsbGVkIHByb2Nlc3MsIHNvIGEgZHVyYWJsZSBtYXJrZXIgaXMgd3JpdHRlblxuICAgICAgLy8gYmVmb3JlIHRoZSBmaXJzdCBtdXRhdGlvbiBhbmQgcmVtb3ZlZCBvbmx5IHdoZW4gdGhlIHRyZWUgaXMgY29uc2lzdGVudCBhZ2Fpbi4gQSBsZWZ0b3ZlclxuICAgICAgLy8gbWFya2VyIG1lYW5zIGEgcHJldmlvdXMgcnVuIHdhcyBraWxsZWQgbWlkLW1pZ3JhdGlvbiAob3IgY291bGQgbm90IHJlc3RvcmUpOiBzb21lXG4gICAgICAvLyBjaXBoZXJ0ZXh0cyBtYXkgbm90IG1hdGNoIHRoZSByZWNpcGllbnRzLCBvciBtYXkgZXZlbiBiZSB1bmRlY3J5cHRhYmxlIGZvciB0aGUgZXhlY3V0b3Inc1xuICAgICAgLy8gaWRlbnRpdHkgd2hlbiBhIHJlY2lwaWVudCB3YXMgYmVpbmcgcmVtb3ZlZCDigJQgc3RhdGVzIHRoaXMgY29kZSBjYW5ub3QgcmVwYWlyIHNhZmVseVxuICAgICAgLy8gYmVjYXVzZSB0aGUgd29ya2luZyB0cmVlIG1heSBoYXZlIGNoYW5nZWQgc2luY2UgKGJyYW5jaCBzd2l0Y2hlcywgbWFudWFsIGVkaXRzKS4gVGhlXG4gICAgICAvLyBmbm94LnRvbWwgZmlsZXMgYXJlIGdpdC10cmFja2VkLCBzbyB0aGUgdXNlciByZXN0b3JlcyB0aGVtIHZpYSBnaXQgYW5kIGNsZWFycyB0aGUgbWFya2VyLlxuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJy50bXAnLCAnd2JmeS1mbm94LW1pZ3JhdGlvbi1tYXJrZXInKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbk1hcmtlclBhdGgpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBhIHByZXZpb3VzIG1pZ3JhdGlvbiB3YXMgaW50ZXJydXB0ZWQuIFJlc3RvcmUgdGhlIGZub3gudG9tbCBmaWxlcyB2aWEgZ2l0IChlLmcuIFxcYGdpdCBzdGF0dXNcXGAgYW5kIFxcYGdpdCByZXN0b3JlIC0tICcqZm5veCoudG9tbCdcXGAgaWYgeW91IGhhdmUgbm8gaW50ZW50aW9uYWwgbG9jYWwgY2hhbmdlcyksIHRoZW4gZGVsZXRlICR7bWlncmF0aW9uTWFya2VyUGF0aH0gYW5kIHJlcnVuIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEEgdHJhY2tlZCBzeW1saW5rIG5hbWVkIGZub3gudG9tbCAob3IgYSBzeW1saW5rZWQgcGFyZW50IGRpcmVjdG9yeSkgd291bGQgbWFrZSB0aGVcbiAgICAgIC8vIHJld3JpdGUgYW5kIGBmbm94IHJlZW5jcnlwdGAgcmVhZCBhbmQgTU9ESUZZIGZpbGVzIG91dHNpZGUgdGhpcyByZXBvc2l0b3J5LlxuICAgICAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuICAgICAgICBjb25zdCByZWFsUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhmbm94VG9tbFBhdGgpO1xuICAgICAgICBpZiAoZnMubHN0YXRTeW5jKGZub3hUb21sUGF0aCkuaXNTeW1ib2xpY0xpbmsoKSB8fCAhcmVhbFBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2Zub3hUb21sUGF0aH0gaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkgKCR7cmVhbFBhdGh9KS4gUmVwbGFjZSBpdCB3aXRoIGEgcmVndWxhciBpbi1yZXBvc2l0b3J5IGZpbGUuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNuYXBzaG90cy5zZXQoZm5veFRvbWxQYXRoLCBmcy5yZWFkRmlsZVN5bmMoZm5veFRvbWxQYXRoLCAndXRmOCcpKTtcbiAgICAgIH1cblxuICAgICAgLy8gU29ydGVkIG9yZGVyIHByb2Nlc3NlcyBhbmNlc3RvcnMgYmVmb3JlIGRlc2NlbmRhbnRzLCBzbyBjb25maWdzIGluaGVyaXRpbmcgYW4gdXBkYXRlZFxuICAgICAgLy8gcHJvdmlkZXIgcmUtZW5jcnlwdCBhZ2FpbnN0IHRoZSBhbHJlYWR5LXVwZGF0ZWQgcmVjaXBpZW50cy5cbiAgICAgIGNvbnN0IGNoYW5nZWREaXJQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBhbnlGYWlsZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBjb25zdCBhbmNlc3RvckNoYW5nZWQgPSBjaGFuZ2VkRGlyUGF0aHMuc29tZSgoY2hhbmdlZERpclBhdGgpID0+IGRpclBhdGguc3RhcnRzV2l0aChjaGFuZ2VkRGlyUGF0aCArIHBhdGguc2VwKSk7XG4gICAgICAgIC8vIEV2ZXJ5IGRpclBhdGggd2FzIHNuYXBzaG90dGVkIGFib3ZlLiBBIG1pc3Npbmcgc25hcHNob3QgbXVzdCBmYWlsIGhhcmQ6IGZhbGxpbmcgYmFjayB0b1xuICAgICAgICAvLyBhbiBlbXB0eSBzdHJpbmcgd291bGQgZmxvdyBpbnRvIHJlcGxhY2VBZ2VSZWNpcGllbnRzIGFuZCBvdmVyd3JpdGUgdGhlIHJlYWwgZm5veC50b21sXG4gICAgICAgIC8vIHdpdGggYSByZWNpcGllbnRzLW9ubHkgZmlsZSwgZGVzdHJveWluZyBldmVyeSBjb21taXR0ZWQgc2VjcmV0LlxuICAgICAgICBjb25zdCBzbmFwc2hvdENvbnRlbnQgPSBzbmFwc2hvdHMuZ2V0KHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJykpO1xuICAgICAgICBpZiAoc25hcHNob3RDb250ZW50ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBmbm94LnRvbWwgc25hcHNob3QgZm9yICR7ZGlyUGF0aH0uYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN5bmNocm9uaXplRm5veEFnZVJlY2lwaWVudHMoXG4gICAgICAgICAgZGlyUGF0aCxcbiAgICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgICBkaXJQYXRoID09PSByb290RGlyUGF0aCxcbiAgICAgICAgICBhbmNlc3RvckNoYW5nZWQsXG4gICAgICAgICAgc25hcHNob3RDb250ZW50LFxuICAgICAgICAgIGFnZVJlY2lwaWVudHNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ2NoYW5nZWQnKSBjaGFuZ2VkRGlyUGF0aHMucHVzaChkaXJQYXRoKTtcbiAgICAgICAgYW55RmFpbGVkIHx8PSByZXN1bHQgPT09ICdmYWlsZWQnO1xuICAgICAgfVxuICAgICAgaWYgKGFueUZhaWxlZCkge1xuICAgICAgICAvLyBBIGZhaWxlZCByZS1lbmNyeXB0aW9uIG1heSBoYXZlIHJld3JpdHRlbiBzb21lIGNpcGhlcnRleHRzLCBzbyByZXN0b3JlIHVuY29uZGl0aW9uYWxseS5cbiAgICAgICAgLy8gVGhlIG1hcmtlciBpcyByZW1vdmVkIG9ubHkgd2hlbiByZXN0b3JhdGlvbiBmdWxseSBzdWNjZWVkZWQgYW5kIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuXG4gICAgICAgIC8vIFJlc3RvcmUgT05MWSB3aGVuIHRoaXMgcnVuIG93bnMgdGhlIG1hcmtlcjogZXZlcnkgY29tbWl0dGVkLWNvbmZpZyBtdXRhdGlvbiBoYXBwZW5zXG4gICAgICAgIC8vIGFmdGVyIG1hcmtlciBhY3F1aXNpdGlvbiwgc28gYSBub24tb3duZXIgKGUuZy4gbG9zaW5nIGEgcmFjZSBhZ2FpbnN0IGEgY29uY3VycmVudCB3YmZ5KVxuICAgICAgICAvLyBoYXMgY2hhbmdlZCBub3RoaW5nIGFuZCBtdXN0IG5vdCBvdmVyd3JpdGUgdGhlIG93bmVyJ3MgaW4tcHJvZ3Jlc3MgbWlncmF0aW9uLlxuICAgICAgICBpZiAobWlncmF0aW9uTWFya2VyT3duZWQgJiYgcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHMpKSByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG1pZ3JhdGlvbk1hcmtlck93bmVkICYmIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzKSkge1xuICAgICAgICByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfVxuICAgICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBkdWUgdG86ICR7KGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3J9YCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGggPSB1bmRlZmluZWQ7XG4gICAgICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN5bmNocm9uaXplRm5veEFnZVJlY2lwaWVudHMoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgaXNSb290OiBib29sZWFuLFxuICBhbmNlc3RvclJlY2lwaWVudHNDaGFuZ2VkOiBib29sZWFuLFxuICBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyxcbiAgYWdlUmVjaXBpZW50czogcmVhZG9ubHkgRm5veEFnZVJlY2lwaWVudFtdXG4pOiBQcm9taXNlPCdjaGFuZ2VkJyB8ICd1bmNoYW5nZWQnIHwgJ2ZhaWxlZCc+IHtcbiAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKTtcblxuICAvLyBSZWNpcGllbnQgc3luY2hyb25pemF0aW9uIG9ubHkgdW5kZXJzdGFuZHMgdGhlIHN0YW5kYXJkIHNpbmdsZS1maWxlIGxheW91dCB3aXRoIG9uZVxuICAvLyB0b3AtbGV2ZWwgYWdlIHByb3ZpZGVyIG5hbWVkIGBhZ2VgLiBHaXRpZ25vcmVkIGNvbmZpZyBhbGlhc2VzIChlLmcuIC5mbm94LmxvY2FsLnRvbWwpIHRoYXRcbiAgLy8gZ2l0LWJhc2VkIGRpc2NvdmVyeSBjYW5ub3Qgc2VlLCBpbXBvcnRzLCBkaWZmZXJlbnRseSBuYW1lZCBhZ2UgcHJvdmlkZXJzLCBvciBwcm92aWRlclxuICAvLyBvdmVycmlkZXMgd291bGQga2VlcCB1c2luZyByZWNpcGllbnQgc2V0cyB0aGlzIGdlbmVyYXRvciBkb2VzIG5vdCByZXdyaXRlLCBzbyB0aGVpciBzZWNyZXRzXG4gIC8vIHdvdWxkIHNpbGVudGx5IHN0YXkgdW5kZWNyeXB0YWJsZSBmb3IgbmV3IHJlY2lwaWVudHM7IGZhaWwgaW5zdGVhZCBvZiBwcm9jZWVkaW5nLiBUaGVcbiAgLy8gZ2l0aWdub3JlZCBmbm94LmxvY2FsLnRvbWwgaXMgYSBzdXBwb3J0ZWQgbWFjaGluZS1sb2NhbCBvdmVycmlkZSwgYnV0IG9ubHkgd2hpbGUgaXQgbGVhdmVzXG4gIC8vIHByb3ZpZGVycyBhbG9uZS5cbiAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aCkuZmlsdGVyKFxuICAgIChuYW1lKSA9PiBuYW1lICE9PSAnZm5veC50b21sJyAmJiBuYW1lICE9PSAnZm5veC5sb2NhbC50b21sJ1xuICApO1xuICBpZiAodW5zdXBwb3J0ZWRGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIGZhaWxGbm94U3luYyhcbiAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBpbiAke2RpclBhdGh9IGJlY2F1c2Ugb25seSBmbm94LnRvbWwgYW5kIGZub3gubG9jYWwudG9tbCBhcmUgc3VwcG9ydGVkOiAke3Vuc3VwcG9ydGVkRmlsZU5hbWVzLmpvaW4oJywgJyl9LiBNZXJnZSB0aGVtIGludG8gZm5veC50b21sLmBcbiAgICApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICAvLyBBIHN0YWxlIGJhY2t1cCBsZWZ0IGJ5IGFuIGludGVycnVwdGVkIGVhcmxpZXIgcnVuIG11c3QgYmUgcmVzdG9yZWQgc28gdGhlIHVzZXIncyBsb2NhbFxuICAvLyBvdmVycmlkZXMgYXJlIG5ldmVyIHNpbGVudGx5IGxvc3QgKHRoZSBtaWdyYXRpb24gbWFya2VyIHNlcGFyYXRlbHkgYmxvY2tzIHRoaXMgcnVuIHdoZW4gdGhlXG4gIC8vIGludGVycnVwdGlvbiBsZWZ0IHRoZSBtaWdyYXRpb24gaXRzZWxmIGluY29tcGxldGUpLlxuICByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGgsIGRpclBhdGgpO1xuXG4gIGNvbnN0IGxheW91dElzc3VlID0gZmluZEZub3hMYXlvdXRJc3N1ZShvcmlnaW5hbENvbnRlbnQpO1xuICBpZiAobGF5b3V0SXNzdWUpIHtcbiAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtmbm94VG9tbFBhdGh9ICR7bGF5b3V0SXNzdWV9LmApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKG9yaWdpbmFsQ29udGVudCkgYXMgRm5veFRvbWw7XG4gIGNvbnN0IHByb2ZpbGVOYW1lcyA9IE9iamVjdC5rZXlzKHNldHRpbmdzLnByb2ZpbGVzID8/IHt9KTtcbiAgY29uc3QgY3VycmVudFJlY2lwaWVudHMgPSByZWFkRm5veEFnZVJlY2lwaWVudHMob3JpZ2luYWxDb250ZW50KTtcblxuICAvLyBBIG5lc3RlZCBmbm94LnRvbWwgd2l0aG91dCBpdHMgb3duIGFnZSBwcm92aWRlciBpbmhlcml0cyB0aGUgbmVhcmVzdCBhbmNlc3RvcidzIG9uZSB0aHJvdWdoXG4gIC8vIGZub3gncyBoaWVyYXJjaGljYWwgbG9hZGluZywgc28gb25seSB0aGUgcm9vdCBjb25maWcgbXVzdCBkZWNsYXJlIHRoZSBwcm92aWRlciDigJQgYnV0IHRoZVxuICAvLyBuZXN0ZWQgY29uZmlnJ3Mgb3duIGNpcGhlcnRleHRzIHN0aWxsIG11c3QgYmUgcmUtZW5jcnlwdGVkIHdoZW5ldmVyIGFuIGFuY2VzdG9yJ3MgcmVjaXBpZW50c1xuICAvLyBjaGFuZ2VkLCBhbmQgdGhhdCBvbmx5IGhhcHBlbnMgd2hlbiBgZm5veCByZWVuY3J5cHRgIHJ1bnMgZnJvbSB0aGUgbmVzdGVkIGRpcmVjdG9yeS5cbiAgaWYgKCFpc1Jvb3QgJiYgIWN1cnJlbnRSZWNpcGllbnRzKSB7XG4gICAgaWYgKGFuY2VzdG9yUmVjaXBpZW50c0NoYW5nZWQpIHtcbiAgICAgIHdyaXRlTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICBpZiAoIXJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGgsIHJvb3REaXJQYXRoLCBwcm9maWxlTmFtZXMpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlLWVuY3J5cHQgZm5veCBzZWNyZXRzIGluICR7ZGlyUGF0aH0gZm9yIHRoZSB1cGRhdGVkIHJlY2lwaWVudHMuIEZpeCB0aGUgZXJyb3IgYW5kIHJlcnVuIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAndW5jaGFuZ2VkJztcbiAgfVxuXG4gIGlmIChcbiAgICBjdXJyZW50UmVjaXBpZW50cyAmJlxuICAgIGN1cnJlbnRSZWNpcGllbnRzLnNpemUgPT09IGFnZVJlY2lwaWVudHMubGVuZ3RoICYmXG4gICAgYWdlUmVjaXBpZW50cy5ldmVyeSgocmVjaXBpZW50KSA9PiBjdXJyZW50UmVjaXBpZW50cy5oYXMocmVjaXBpZW50LnB1YmxpY0tleSkpXG4gICkge1xuICAgIHJldHVybiAndW5jaGFuZ2VkJztcbiAgfVxuXG4gIC8vIFJld3JpdGUgb25seSB0aGUgcmVjaXBpZW50cyBhc3NpZ25tZW50IHNvIHVzZXItYXV0aG9yZWQgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgc3Vydml2ZS5cbiAgLy8gUmUtcGFyc2UgYmVmb3JlIHdyaXRpbmc6IGFuIHVudXN1YWwgbGF5b3V0IChlLmcuIGRvdHRlZCBrZXlzKSBjb3VsZCBtYWtlIHRoZSB0ZXh0dWFsIGVkaXRcbiAgLy8gcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZSBvciBsZWF2ZSB0aGUgb2xkIHJlY2lwaWVudHMgaW4gZWZmZWN0LlxuICBjb25zdCB1cGRhdGVkQ29udGVudCA9IHJlcGxhY2VBZ2VSZWNpcGllbnRzKG9yaWdpbmFsQ29udGVudCwgYWdlUmVjaXBpZW50cyk7XG4gIGNvbnN0IHVwZGF0ZWRSZWNpcGllbnRzID0gWy4uLihyZWFkRm5veEFnZVJlY2lwaWVudHModXBkYXRlZENvbnRlbnQpID8/IFtdKV07XG4gIGlmIChcbiAgICB1cGRhdGVkUmVjaXBpZW50cy5sZW5ndGggIT09IGFnZVJlY2lwaWVudHMubGVuZ3RoIHx8XG4gICAgIWFnZVJlY2lwaWVudHMuZXZlcnkoKHJlY2lwaWVudCkgPT4gdXBkYXRlZFJlY2lwaWVudHMuaW5jbHVkZXMocmVjaXBpZW50LnB1YmxpY0tleSkpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmV3cml0aW5nIHRoZSBhZ2UgcmVjaXBpZW50cyBpbiAke2Zub3hUb21sUGF0aH0gZGlkIG5vdCB0YWtlIGVmZmVjdDsgdXBkYXRlIHRoZW0gbWFudWFsbHkuYCk7XG4gIH1cbiAgd3JpdGVNaWdyYXRpb25NYXJrZXIoKTtcbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIHVwZGF0ZWRDb250ZW50KTtcblxuICBpZiAoIXJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGgsIHJvb3REaXJQYXRoLCBwcm9maWxlTmFtZXMpKSB7XG4gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgY29uZmlnOiBrZWVwaW5nIHRoZSBuZXcgcmVjaXBpZW50cyB3aXRoIG9sZCBjaXBoZXJ0ZXh0cyB3b3VsZCBtYWtlXG4gICAgLy8gdGhpcyBnZW5lcmF0b3Igc2tpcCByZS1lbmNyeXB0aW9uIGZvcmV2ZXIgYW5kIGxldCBzZXR1cFNlY3JldHMgdXBsb2FkIGEgQ0kga2V5IHRoYXRcbiAgICAvLyBjYW5ub3QgZGVjcnlwdCBhbnl0aGluZy4gVGhlIG9sZCBjaXBoZXJ0ZXh0cyByZW1haW4gdmFsaWQgZm9yIHRoZSBvbGQgcmVjaXBpZW50cy5cbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgb3JpZ2luYWxDb250ZW50KTtcbiAgICBmYWlsRm5veFN5bmMoXG4gICAgICBgRmFpbGVkIHRvIHJlLWVuY3J5cHQgZm5veCBzZWNyZXRzIGluICR7ZGlyUGF0aH0gZm9yIHRoZSB1cGRhdGVkIHJlY2lwaWVudHMuIEZpeCB0aGUgZXJyb3IgYW5kIHJlcnVuIHdiZnkuYFxuICAgICk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIHJldHVybiAnY2hhbmdlZCc7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIGEgZm5veC50b21sIGxheW91dCB0aGF0IHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gYW5kIHRoZSBDSS1rZXlcbiAqIHZlcmlmaWNhdGlvbiBjYW5ub3QgY292ZXIsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzdGFuZGFyZCBzaW5nbGUtZmlsZSwgc2luZ2xlLWFnZS1wcm92aWRlclxuICogbGF5b3V0IGlzIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRGbm94TGF5b3V0SXNzdWUoZm5veFRvbWxDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZm5veFRvbWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgICBpZiAoc2V0dGluZ3MuaW1wb3J0ICE9PSB1bmRlZmluZWQpIHJldHVybiAndXNlcyB0aGUgdW5zdXBwb3J0ZWQgYGltcG9ydGAgc2V0dGluZyc7XG4gICAgY29uc3Qgbm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzID0gT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MucHJvdmlkZXJzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW25hbWUsIHByb3ZpZGVyXSkgPT4gKHByb3ZpZGVyPy50eXBlID09PSAnYWdlJykgIT09IChuYW1lID09PSAnYWdlJykpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIGlmIChub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBkZWNsYXJlcyBhZ2UgcHJvdmlkZXJzIG5vdCBuYW1lZCBcXGBhZ2VcXGAgKG9yIGFuIFxcYGFnZVxcYCBwcm92aWRlciBvZiBhbm90aGVyIHR5cGUpOiAke25vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcy5qb2luKCcsICcpfWA7XG4gICAgfVxuICAgIGNvbnN0IHByb2ZpbGVzV2l0aFByb3ZpZGVycyA9IE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnByb2ZpbGVzID8/IHt9KVxuICAgICAgLmZpbHRlcigoWywgcHJvZmlsZV0pID0+IHByb2ZpbGU/LnByb3ZpZGVycylcbiAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSk7XG4gICAgaWYgKHByb2ZpbGVzV2l0aFByb3ZpZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYGRlY2xhcmVzIHVuc3VwcG9ydGVkIHByb2ZpbGUtc3BlY2lmaWMgcHJvdmlkZXJzOiAke3Byb2ZpbGVzV2l0aFByb3ZpZGVycy5qb2luKCcsICcpfWA7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnY2Fubm90IGJlIHBhcnNlZCBhcyBUT01MJztcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBbcHJvdmlkZXJzLmFnZV0ucmVjaXBpZW50cyBvZiBhIGZub3gudG9tbCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGNvbmZpZyBkZWNsYXJlcyBub1xuICogYWdlIHByb3ZpZGVyIChuZXN0ZWQgY29uZmlncyB0aGVuIGluaGVyaXQgdGhlIHJvb3Qgb25lKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGbm94QWdlUmVjaXBpZW50cyhmbm94VG9tbENvbnRlbnQ6IHN0cmluZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZub3hUb21sQ29udGVudCkgYXMgRm5veFRvbWw7XG4gICAgaWYgKCFzZXR0aW5ncy5wcm92aWRlcnM/LmFnZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWNpcGllbnRzID0gc2V0dGluZ3MucHJvdmlkZXJzLmFnZS5yZWNpcGllbnRzO1xuICAgIHJldHVybiBuZXcgU2V0KEFycmF5LmlzQXJyYXkocmVjaXBpZW50cykgPyByZWNpcGllbnRzLmZpbHRlcigocik6IHIgaXMgc3RyaW5nID0+IHR5cGVvZiByID09PSAnc3RyaW5nJykgOiBbXSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEFuIHVucGFyc2FibGUgZm5veC50b21sIHlpZWxkcyBubyByZWNpcGllbnRzLCBzbyB0aGUgY2FsbGVyIHJlcG9ydHMgYW4gZXJyb3IuXG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxufVxuXG50eXBlIEZub3hSZXBvc2l0b3J5SWRlbnRpdHkgPSBQaWNrPFBhY2thZ2VDb25maWcsICdyZXBvQXV0aG9yJyB8ICdyZXBvTmFtZScgfCAnaXNQdWJsaWNSZXBvJyB8ICdpc1JlcG9WaXNpYmlsaXR5S25vd24nPjtcblxuLyoqXG4gKiBUaGUgR2l0SHViIHNlY3JldCBob2xkaW5nIHRoZSBwcml2YXRlIGtleSBvZiB0aGUgQ0kgaWRlbnRpdHkgc2NvcGVkIHRvIHRoZSByZXBvc2l0b3J5LCBvclxuICogdW5kZWZpbmVkIHdoZW4gbm9uZSBpcyAoYW4gdW5rbm93biB2aXNpYmlsaXR5LCBvciBhIHJlcG9zaXRvcnkgbm8gQ0kgc2NvcGUgY292ZXJzKS4gVGhlIHNpbmdsZVxuICogc291cmNlIG9mIHRydXRoIHNoYXJlZCBieSB0aGUgcmVjaXBpZW50IHN5bmMgYW5kIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IncyBjYWxsZXIgbWFwcGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShcbiAgY29uZmlnOiBGbm94UmVwb3NpdG9yeUlkZW50aXR5XG4pOiAnRk5PWF9BR0VfS0VZJyB8ICdQVUJMSUNfRk5PWF9BR0VfS0VZJyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNpUHJpbmNpcGFsOiBGbm94QWdlUHJpbmNpcGFsIHwgdW5kZWZpbmVkID0gRk5PWF9BR0VfUFJJTkNJUEFMUy5maW5kKFxuICAgIChwcmluY2lwYWw6IEZub3hBZ2VQcmluY2lwYWwpID0+XG4gICAgICBwcmluY2lwYWwuY2lBZ2VLZXlTZWNyZXROYW1lICYmIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHByaW5jaXBhbC5yZXBvc2l0b3J5U2NvcGUsIGNvbmZpZylcbiAgKTtcbiAgcmV0dXJuIGNpUHJpbmNpcGFsPy5jaUFnZUtleVNlY3JldE5hbWU7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSByZWNpcGllbnQgc2V0IGRpZmZlcnMgYmV0d2VlbiB0aGUgcHVibGljIGFuZCBwcml2YXRlIHJlYWRpbmcgb2YgdGhlIHJlcG9zaXRvcnkuICovXG5leHBvcnQgZnVuY3Rpb24gZG9lc0Zub3hSZWNpcGllbnRTZXREZXBlbmRPblZpc2liaWxpdHkoXG4gIHJvb3RDb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ3JlcG9BdXRob3InIHwgJ3JlcG9OYW1lJz5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBwdWJsaWNLZXlzRm9yID0gKGlzUHVibGljUmVwbzogYm9vbGVhbik6IHN0cmluZyA9PlxuICAgIGdldEZub3hBZ2VSZWNpcGllbnRzKHsgLi4ucm9vdENvbmZpZywgaXNQdWJsaWNSZXBvLCBpc1JlcG9WaXNpYmlsaXR5S25vd246IHRydWUgfSlcbiAgICAgIC5tYXAoKHsgcHVibGljS2V5IH0pID0+IHB1YmxpY0tleSlcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIHB1YmxpY0tleXNGb3IodHJ1ZSkgIT09IHB1YmxpY0tleXNGb3IoZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm5veEFnZVJlY2lwaWVudHMocm9vdENvbmZpZzogRm5veFJlcG9zaXRvcnlJZGVudGl0eSk6IEZub3hBZ2VSZWNpcGllbnRbXSB7XG4gIHJldHVybiBGTk9YX0FHRV9QUklOQ0lQQUxTLmZpbHRlcigocHJpbmNpcGFsKSA9PlxuICAgIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHByaW5jaXBhbC5yZXBvc2l0b3J5U2NvcGUsIHJvb3RDb25maWcpXG4gICkuZmxhdE1hcCgocHJpbmNpcGFsKSA9PlxuICAgIHByaW5jaXBhbC5wdWJsaWNLZXlzLm1hcCgocHVibGljS2V5LCBpbmRleCkgPT4gKHtcbiAgICAgIG5hbWU6IHByaW5jaXBhbC5wdWJsaWNLZXlzLmxlbmd0aCA9PT0gMSA/IHByaW5jaXBhbC5uYW1lIDogYCR7cHJpbmNpcGFsLm5hbWV9JHtpbmRleCArIDF9YCxcbiAgICAgIHB1YmxpY0tleSxcbiAgICB9KSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHNjb3BlOiBGbm94UmVwb3NpdG9yeVNjb3BlLCByZXBvc2l0b3J5OiBGbm94UmVwb3NpdG9yeUlkZW50aXR5KTogYm9vbGVhbiB7XG4gIGNvbnN0IG93bmVyID0gcmVwb3NpdG9yeS5yZXBvQXV0aG9yPy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBuYW1lID0gcmVwb3NpdG9yeS5yZXBvTmFtZT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFvd25lciB8fCAhbmFtZSkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIEFuIHVua25vd24gdmlzaWJpbGl0eSAoZmFpbGVkIEdpdEh1YiBsb29rdXApIG1hdGNoZXMgbm8gdmlzaWJpbGl0eS1jb25zdHJhaW5lZCBzY29wZTogY2FsbGVyc1xuICAvLyB0aGF0IHdvdWxkIHJld3JpdGUgcmVjaXBpZW50cyBmYWlsIGluc3RlYWQgb2YgZW5jcnlwdGluZyB0byB0aGUgd3JvbmcgQ0kgaWRlbnRpdHkuXG4gIGlmIChcbiAgICBzY29wZS52aXNpYmlsaXR5ICYmXG4gICAgKCFyZXBvc2l0b3J5LmlzUmVwb1Zpc2liaWxpdHlLbm93biB8fCAoc2NvcGUudmlzaWJpbGl0eSA9PT0gJ3B1YmxpYycpICE9PSByZXBvc2l0b3J5LmlzUHVibGljUmVwbylcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICAoc2NvcGUub3JnYW5pemF0aW9ucz8uc29tZSgob3JnYW5pemF0aW9uKSA9PiBvcmdhbml6YXRpb24udG9Mb3dlckNhc2UoKSA9PT0gb3duZXIpID8/IGZhbHNlKSB8fFxuICAgIChzY29wZS5yZXBvc2l0b3JpZXM/LnNvbWUoKGZ1bGxOYW1lKSA9PiBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpID09PSBgJHtvd25lcn0vJHtuYW1lfWApID8/IGZhbHNlKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlQWdlUmVjaXBpZW50cyhjb250ZW50OiBzdHJpbmcsIGFnZVJlY2lwaWVudHM6IHJlYWRvbmx5IEZub3hBZ2VSZWNpcGllbnRbXSk6IHN0cmluZyB7XG4gIC8vIFRyYWlsaW5nIG5hbWUgY29tbWVudHMgbGV0IGh1bWFucyB0ZWxsIHdob3NlIGtleSBlYWNoIHJlY2lwaWVudCBpcyB3aXRob3V0IGNvbnN1bHRpbmcgd2JmeS5cbiAgY29uc3QgcmVjaXBpZW50c1RleHQgPSBgcmVjaXBpZW50cyA9IFtcXG4ke2FnZVJlY2lwaWVudHNcbiAgICAubWFwKChyZWNpcGllbnQpID0+IGAgIFwiJHtyZWNpcGllbnQucHVibGljS2V5fVwiLCAjICR7cmVjaXBpZW50Lm5hbWV9YClcbiAgICAuam9pbignXFxuJyl9XFxuXWA7XG4gIC8vIHdiZnkgd3JpdGVzIGEgW3Byb3ZpZGVycy5hZ2VdIHRhYmxlIChwb3NzaWJseSB3aXRoIGEgdHJhaWxpbmcgY29tbWVudCkuIFNjYW4gbGluZS13aXNlIHNvIHRoYXRcbiAgLy8gYSBgW2AgaW5zaWRlIGEgY29tbWVudCBvciBhIHN0cmluZyBuZXZlciB0ZXJtaW5hdGVzIHRoZSB0YWJsZSBlYXJseTsgdGhlIHRhYmxlIGVuZHMgYXQgdGhlXG4gIC8vIG5leHQgbGluZS1zdGFydCB0YWJsZSBoZWFkZXIuIFRoZSBhc3NpZ25tZW50IG1hdGNoIGlzIGxpbmUtYW5jaG9yZWQgc28gYSBjb21tZW50ZWQtb3V0XG4gIC8vIGAjIHJlY2lwaWVudHMgPSBbLi4uXWAgaXMgbmV2ZXIgbWlzdGFrZW4gZm9yIHRoZSByZWFsIG9uZSwgd2hpbGUgbXVsdGlsaW5lIGFycmF5cyBzdGlsbCBtYXRjaFxuICAvLyBiZWNhdXNlIHRoZSBuZWdhdGVkIGNsYXNzIFteXFxdXSAodW5saWtlIGAuYCkgc3BhbnMgbmV3bGluZXMuIEFueSBvdGhlciBzcGVsbGluZyBmYWxscyB0aHJvdWdoXG4gIC8vIHRvIHRoZSBjYWxsZXIncyByZS1wYXJzZSB2YWxpZGF0aW9uLCB3aGljaCBmYWlscyB0aGUgcnVuIHNhZmVseSB3aXRoIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mXG4gIC8vIGNvcnJ1cHRpbmcgdGhlIGZpbGUuXG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGhlYWRlckluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lKSA9PiAvXlxccypcXFtwcm92aWRlcnNcXC5hZ2VcXF1cXHMqKD86Iy4qKT8kL3UudGVzdChsaW5lKSk7XG4gIGlmIChoZWFkZXJJbmRleCAhPT0gLTEpIHtcbiAgICBsZXQgZW5kSW5kZXggPSBsaW5lcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaW5kZXggPSBoZWFkZXJJbmRleCArIDE7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoL15cXHMqXFxbL3UudGVzdChsaW5lc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICAgIGVuZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWN0aW9uID0gbGluZXMuc2xpY2UoaGVhZGVySW5kZXgsIGVuZEluZGV4KS5qb2luKCdcXG4nKTtcbiAgICBjb25zdCByZXBsYWNlZFNlY3Rpb24gPSBzZWN0aW9uLnJlcGxhY2UoL15cXHMqcmVjaXBpZW50c1xccyo9XFxzKlxcW1teXFxdXSpcXF0vbXUsIHJlY2lwaWVudHNUZXh0KTtcbiAgICBjb25zdCBuZXdTZWN0aW9uID1cbiAgICAgIHJlcGxhY2VkU2VjdGlvbiA9PT0gc2VjdGlvblxuICAgICAgICA/IFtsaW5lc1toZWFkZXJJbmRleF0sIHJlY2lwaWVudHNUZXh0LCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEsIGVuZEluZGV4KV0uam9pbignXFxuJylcbiAgICAgICAgOiByZXBsYWNlZFNlY3Rpb247XG4gICAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCksIG5ld1NlY3Rpb24sIC4uLmxpbmVzLnNsaWNlKGVuZEluZGV4KV0uam9pbignXFxuJyk7XG4gIH1cbiAgcmV0dXJuIGAke2NvbnRlbnQudHJpbUVuZCgpfVxcblxcbltwcm92aWRlcnMuYWdlXVxcbnR5cGUgPSBcImFnZVwiXFxuJHtyZWNpcGllbnRzVGV4dH1cXG5gO1xufVxuXG4vLyBSZS1lbmNyeXB0cyB0aGUgYmFzZSBzZWNyZXRzIGFuZCBlYWNoIHByb2ZpbGUncyBvd24gc2VjcmV0cyAoLS1uby1kZWZhdWx0cyBrZWVwcyB0aGUgbWVyZ2VkXG4vLyBiYXNlIHNlY3JldHMgZnJvbSBiZWluZyBkdXBsaWNhdGVkIGludG8gcHJvZmlsZSB0YWJsZXMpIGZvciB0aGUgY3VycmVudCByZWNpcGllbnQgc2V0LiBUaGVcbi8vIHNwYXduZWQgZm5veCBydW5zIHdpdGggYW4gaXNvbGF0ZWQgSE9NRS9YREdfQ09ORklHX0hPTUUgYmVjYXVzZSBmbm94IG1lcmdlcyB0aGUgdXNlci1nbG9iYWxcbi8vIH4vLmNvbmZpZy9mbm94L2NvbmZpZy50b21sIGludG8gZXZlcnkgcHJvamVjdCBjb25maWcg4oCUIGEgcGxhaW4gcmVlbmNyeXB0IHdvdWxkIHJld3JpdGUgdGhlXG4vLyB1c2VyJ3MgZ2xvYmFsIHNlY3JldHMgdG9vLiBEZWNyeXB0aW9uIHRoZXJlZm9yZSBuZWVkcyB0aGUgcGVyc29uYWwgaWRlbnRpdHkgcGFzc2VkIGV4cGxpY2l0bHlcbi8vIHZpYSBGTk9YX0FHRV9LRVk7IEZOT1hfUFJPRklMRSBpcyBzdHJpcHBlZCBzbyBpdCBjYW5ub3QgcmVkaXJlY3QgdGhlIGJhc2UgKG5vIC1QKSBydW4uXG5mdW5jdGlvbiByZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcsIHByb2ZpbGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gVGhlIGlkZW50aXR5IGlzIG9wdGlvbmFsOiBhIHBsYWludGV4dC1vbmx5IGNvbmZpZyBoYXMgbm90aGluZyB0byBkZWNyeXB0IGFuZCBmbm94IHN1Y2NlZWRzXG4gIC8vIHdpdGhvdXQgb25lLCB3aGlsZSBleGlzdGluZyBjaXBoZXJ0ZXh0cyBtYWtlIGZub3ggZmFpbCBsb3VkbHkgb24gaXRzIG93bi5cbiAgY29uc3QgaWRlbnRpdHkgPSByZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkoKSA/PyBwcm9jZXNzLmVudi5GTk9YX0FHRV9LRVk7XG4gIGNvbnN0IGZub3hDb21tYW5kID0gcmVzb2x2ZUZub3hDb21tYW5kKGRpclBhdGgpO1xuICBjb25zdCBpc29sYXRlZEhvbWVEaXJQYXRoID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnd2JmeS1mbm94LWhvbWUtJykpO1xuICB0cnkge1xuICAgIC8vIEhpZGUgdGhlIGxvY2FsIG92ZXJyaWRlcyBvZiBFVkVSWSBkaXJlY3RvcnkgZm5veCBtZXJnZXMgaGllcmFyY2hpY2FsbHkgKGZyb20gdGhlIGNvbW1hbmRcbiAgICAvLyBkaXJlY3RvcnkgdXAgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCk6IGFuIGFuY2VzdG9yJ3MgZm5veC5sb2NhbC50b21sIHdvdWxkIG90aGVyd2lzZSBzaGFkb3dcbiAgICAvLyBjb21taXR0ZWQgc2VjcmV0cyBvciBpdHNlbGYgZ2V0IHJld3JpdHRlbiBieSB0aGUgcmUtZW5jcnlwdGlvbi5cbiAgICByZXR1cm4gd2l0aEZub3hMb2NhbHNIaWRkZW4ocm9vdERpclBhdGgsIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGgsIHJvb3REaXJQYXRoKSwgKCkgPT4ge1xuICAgICAgY29uc3QgZW52ID0ge1xuICAgICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpLmZpbHRlcigoW2tleV0pID0+ICFrZXkuc3RhcnRzV2l0aCgnRk5PWF8nKSkpLFxuICAgICAgICAuLi4oaWRlbnRpdHkgPyB7IEZOT1hfQUdFX0tFWTogaWRlbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgSE9NRTogaXNvbGF0ZWRIb21lRGlyUGF0aCxcbiAgICAgICAgWERHX0NPTkZJR19IT01FOiBpc29sYXRlZEhvbWVEaXJQYXRoLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByb2ZpbGVBcmdzTGlzdCA9IFtbXSwgLi4ucHJvZmlsZU5hbWVzLm1hcCgobmFtZSkgPT4gWyctLW5vLWRlZmF1bHRzJywgYC0tcHJvZmlsZT0ke25hbWV9YF0pXTtcbiAgICAgIGZvciAoY29uc3QgcHJvZmlsZUFyZ3Mgb2YgcHJvZmlsZUFyZ3NMaXN0KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbJ3JlZW5jcnlwdCcsICctLWZvcmNlJywgJy0tbm8tZGFlbW9uJywgJy0tcHJvdmlkZXInLCAnYWdlJywgLi4ucHJvZmlsZUFyZ3NdO1xuICAgICAgICBjb25zb2xlLmxvZyhgJCAke2Zub3hDb21tYW5kfSAke2FyZ3Muam9pbignICcpfSBhdCAke2RpclBhdGh9YCk7XG4gICAgICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhmbm94Q29tbWFuZCwgYXJncywge1xuICAgICAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICAgICAgZW52LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKChwcm9jLnN0YXR1cyA/PyAxKSAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKGlzb2xhdGVkSG9tZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBhY3R1YWwgZm5veCBiaW5hcnkuIGBmbm94YCBvbiBQQVRIIGlzIG9mdGVuIGEgbWlzZSBzaGltLCBhbmQgbWlzZSByZWZ1c2VzIHRvIHJ1blxuICogb25jZSBIT01FL1hER19DT05GSUdfSE9NRSBwb2ludCBhdCB0aGUgaXNvbGF0ZWQgZGlyZWN0b3J5IChpdHMgdHJ1c3Qgc3RhdGUgZGlzYXBwZWFycyksIHNvIHRoZVxuICogaXNvbGF0ZWQgc3Bhd25zIG5lZWQgdGhlIHNoaW0gcmVzb2x2ZWQgdG8gdGhlIHJlYWwgZXhlY3V0YWJsZSBiZWZvcmVoYW5kLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRm5veENvbW1hbmQoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdtaXNlJywgWyd3aGljaCcsICdmbm94J10sIHsgY3dkOiBkaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICBjb25zdCByZXNvbHZlZCA9IHByb2Muc3RhdHVzID09PSAwID8gcHJvYy5zdGRvdXQudHJpbSgpIDogJyc7XG4gIHJldHVybiByZXNvbHZlZCB8fCAnZm5veCc7XG59XG5cbi8vIFRoZSBwZXJzb25hbCBpZGVudGl0eSBmaWxlIGlzIG1hY2hpbmUtZ2xvYmFsLCBzbyBpdCBpcyByZWFkIG9uY2UgcGVyIHByb2Nlc3MuXG5sZXQgaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gZmFsc2U7XG5sZXQgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkpIHJldHVybiBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTtcbiAgaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ2Zub3gnLCAnYWdlLnR4dCcpLCAndXRmOCcpO1xuICAgIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gY29udGVudFxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbmQoKGxpbmUpID0+IGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoJ0FHRS1TRUNSRVQtS0VZLScpKVxuICAgICAgPy50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgZnVuY3Rpb24gd2hpbGUgdGhlIG1hY2hpbmUtbG9jYWwgZm5veC5sb2NhbC50b21sIGZpbGVzIG9mIHRoZSBnaXZlbiBkaXJlY3RvcmllcyBhcmVcbiAqIHRlbXBvcmFyaWx5IG1vdmVkIGFzaWRlOiBmbm94IGxvYWRzIHRoZW0gYXQgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwsIHNvIGFcbiAqIGxvY2FsIG92ZXJyaWRlIHNoYWRvd2luZyBhIGNvbW1pdHRlZCBzZWNyZXQgd291bGQgbWFrZSBgZm5veCByZWVuY3J5cHRgIHNraXAgdGhhdCBzZWNyZXQuXG4gKi9cbmZ1bmN0aW9uIHdpdGhGbm94TG9jYWxzSGlkZGVuPFQ+KHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGhzOiBzdHJpbmdbXSwgZnVuYzogKCkgPT4gVCk6IFQge1xuICBjb25zdCBoaWRkZW5EaXJQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gICAgICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgICBjb25zdCBiYWNrdXBQYXRoID0gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gICAgICAgIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgICBmcy5yZW5hbWVTeW5jKGxvY2FsUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICAgIGhpZGRlbkRpclBhdGhzLnB1c2goZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmMoKTtcbiAgICAvLyBBIHJlc3RvcmF0aW9uIGNvbmZsaWN0IHRocm93cyBoZXJlIGFuZCB0aGVyZWJ5IGludmFsaWRhdGVzIHRoZSBzZWVtaW5nbHkgc3VjY2Vzc2Z1bCByZXN1bHQ6XG4gICAgLy8gYSByZWNyZWF0ZWQgb3ZlcnJpZGUgbWF5IGhhdmUgc2hhZG93ZWQgY29tbWl0dGVkIHNlY3JldHMgZHVyaW5nIHRoZSBmbm94IHJ1biwgc28gdGhlIG91dGVyXG4gICAgLy8gdHJhbnNhY3Rpb24gbXVzdCByZXN0b3JlIGV2ZXJ5IGNvbW1pdHRlZCBmbm94LnRvbWwgaW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBtaWdyYXRpb24uXG4gICAgcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGgsIGhpZGRlbkRpclBhdGhzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFRoZSBvcmlnaW5hbCBmYWlsdXJlIG11c3Qgd2luOyBhIHJlc3RvcmF0aW9uIGNvbmZsaWN0IG9uIHRoaXMgcGF0aCBpcyBvbmx5IHJlcG9ydGVkIHNvIGl0XG4gICAgLy8gY2Fubm90IG1hc2sgdGhlIHJvb3QgY2F1c2UuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoLCBoaWRkZW5EaXJQYXRocyk7XG4gICAgfSBjYXRjaCAocmVzdG9yZUVycm9yKSB7XG4gICAgICBmYWlsRm5veFN5bmMoKHJlc3RvcmVFcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gU3RyaW5nKHJlc3RvcmVFcnJvcikpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vLyBNb3ZlcyB0aGUgaGlkZGVuIGZub3gubG9jYWwudG9tbCBmaWxlcyBiYWNrLCBjbGVhcmluZyB0aGUgZ2l2ZW4gbGlzdCBzbyBhIHNlY29uZCBjYWxsIGlzIGFcbi8vIG5vLW9wLiBOZXZlciBjbG9iYmVycyBhIGZub3gubG9jYWwudG9tbCByZWNyZWF0ZWQgKGUuZy4gYnkgYW4gZWRpdG9yKSB3aGlsZSBmbm94IHdhcyBydW5uaW5nOlxuLy8gdGhlIGJhY2t1cCBpcyBrZXB0IGFuZCByZXBvcnRlZCBmb3IgYSBtYW51YWwgbWVyZ2UuXG5mdW5jdGlvbiByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aDogc3RyaW5nLCBoaWRkZW5EaXJQYXRoczogc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgY29uZmxpY3RpbmdMb2NhbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRpclBhdGggb2YgaGlkZGVuRGlyUGF0aHMuc3BsaWNlKDApKSB7XG4gICAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgICBjb25mbGljdGluZ0xvY2FsUGF0aHMucHVzaChsb2NhbFBhdGgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZzLnJlbmFtZVN5bmMoZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCksIGxvY2FsUGF0aCk7XG4gIH1cbiAgaWYgKGNvbmZsaWN0aW5nTG9jYWxQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBmb2xsb3dpbmcgZm5veC5sb2NhbC50b21sIGZpbGVzIHdlcmUgcmVjcmVhdGVkIHdoaWxlIGZub3ggd2FzIHJ1bm5pbmcgKG9yaWdpbmFsIGZpbGVzIGFyZSBwcmVzZXJ2ZWQgdW5kZXIgJHtwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICcudG1wJywgJ3diZnktZm5veC1sb2NhbC1iYWNrdXAnKX0g4oCUIG1lcmdlIHRoZW0gbWFudWFsbHkpOiAke2NvbmZsaWN0aW5nTG9jYWxQYXRocy5qb2luKCcsICcpfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVzdG9yZXMgYSBmbm94LmxvY2FsLnRvbWwgYmFja3VwIGxlZnQgYnkgYW4gaW50ZXJydXB0ZWQgZWFybGllciBydW4gc28gdGhlIHVzZXIncyBsb2NhbFxuICogb3ZlcnJpZGVzIGFyZSBuZXZlciBzaWxlbnRseSBsb3N0LlxuICovXG5mdW5jdGlvbiByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gIGNvbnN0IGJhY2t1cFBhdGggPSBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGJhY2t1cFBhdGgpKSByZXR1cm47XG4gIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEJvdGggJHtsb2NhbFBhdGh9IGFuZCBpdHMgYmFja3VwICR7YmFja3VwUGF0aH0gZXhpc3Q7IHJlc29sdmUgdGhlIGxlZnRvdmVyIGJhY2t1cCBtYW51YWxseS5gKTtcbiAgfVxuICBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoLCBiYWNrdXBQYXRoKTtcbiAgZnMucmVuYW1lU3luYyhiYWNrdXBQYXRoLCBsb2NhbFBhdGgpO1xufVxuXG4vLyBDcmVhdGVzIHRoZSBiYWNrdXAgZGlyZWN0b3J5IGFuZCBwcm92ZXMgbm8gcGF0aCBjb21wb25lbnQgYmVsb3cgdGhlIHJlcG9zaXRvcnkgcm9vdCBpcyBhXG4vLyBzeW1saW5rOiBhIHJlcG9zaXRvcnktY29udHJvbGxlZCBzeW1saW5rIChlLmcuIGEgdHJhY2tlZCAudG1wL3diZnktZm5veC1sb2NhbC1iYWNrdXAgbGluaylcbi8vIGNvdWxkIG90aGVyd2lzZSBtb3ZlIHRoZSBwbGFpbnRleHQgbG9jYWwgc2VjcmV0cyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBvciByZXNvbHZlIHRoZSBiYWNrdXBcbi8vIGJhY2sgb250byB0aGUgc291cmNlIGZpbGUgYW5kIHR1cm4gdGhlIGhpZGUgcmVuYW1lIGludG8gYSBuby1vcC5cbmZ1bmN0aW9uIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGg6IHN0cmluZywgYmFja3VwUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGJhY2t1cERpclBhdGggPSBwYXRoLmRpcm5hbWUoYmFja3VwUGF0aCk7XG4gIGZzLm1rZGlyU3luYyhiYWNrdXBEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZXhwZWN0ZWRSZWFsUGF0aCA9IHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpLCBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBiYWNrdXBEaXJQYXRoKSk7XG4gIGlmIChmcy5yZWFscGF0aFN5bmMoYmFja3VwRGlyUGF0aCkgIT09IGV4cGVjdGVkUmVhbFBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YmFja3VwRGlyUGF0aH0gcmVzb2x2ZXMgdGhyb3VnaCBhIHN5bWxpbms7IHJlbW92ZSB0aGUgc3ltbGlua2VkIGNvbXBvbmVudC5gKTtcbiAgfVxufVxuXG4vLyBUaGUgYmFja3VwIGxpdmVzIHVuZGVyIHRoZSBnaXRpZ25vcmVkIC50bXAgc28gYSBoaWRkZW4gZm5veC5sb2NhbC50b21sIGNhbiBuZXZlciBiZWNvbWVcbi8vIHN0YWdlYWJsZSAoYSBzaWJsaW5nIHJlbmFtZSBsaWtlIGZub3gubG9jYWwudG9tbC53YmZ5LWJhayB3b3VsZCBubyBsb25nZXIgbWF0Y2ggdGhlIGRvY3VtZW50ZWRcbi8vIGBmbm94LmxvY2FsLnRvbWxgIGlnbm9yZSBlbnRyeSBhbmQgY291bGQgYmUgY29tbWl0dGVkIGJ5IGBnaXQgYWRkIC1BYCkuXG5mdW5jdGlvbiBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnJlc29sdmUoXG4gICAgcm9vdERpclBhdGgsXG4gICAgJy50bXAnLFxuICAgICd3YmZ5LWZub3gtbG9jYWwtYmFja3VwJyxcbiAgICBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBkaXJQYXRoKSxcbiAgICAnZm5veC5sb2NhbC50b21sJ1xuICApO1xufVxuXG5mdW5jdGlvbiB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpOiB2b2lkIHtcbiAgaWYgKCFtaWdyYXRpb25NYXJrZXJQYXRoIHx8IG1pZ3JhdGlvbk1hcmtlck93bmVkKSByZXR1cm47XG4gIGNvbnN0IHRtcERpclBhdGggPSBwYXRoLmRpcm5hbWUobWlncmF0aW9uTWFya2VyUGF0aCk7XG4gIGZzLm1rZGlyU3luYyh0bXBEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgLy8gUmVmdXNlIHRvIHdyaXRlIHRocm91Z2ggc3ltbGlua3M6IGEgcmVwb3NpdG9yeS1jb250cm9sbGVkIC50bXAgc3ltbGluayBjb3VsZCBvdGhlcndpc2VcbiAgLy8gcmVkaXJlY3QgdGhlIG1hcmtlciB3cml0ZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LiBUaGUgYHd4YCBmbGFnIG1ha2VzIHRoZSBvcGVuIGl0c2VsZiBmYWlsXG4gIC8vIG9uIGFueSBwcmUtZXhpc3RpbmcgcGF0aCwgaW5jbHVkaW5nIGEgZGFuZ2xpbmcgc3ltbGluayDigJQgd2hpY2ggYWxzbyBhY3F1aXJlcyB0aGUgbWFya2VyXG4gIC8vIGF0b21pY2FsbHksIHNvIGEgY29uY3VycmVudCB3YmZ5IHJ1biBjYW5ub3Qgc3RhcnQgYSBzZWNvbmQgbWlncmF0aW9uLlxuICBpZiAoZnMubHN0YXRTeW5jKHRtcERpclBhdGgpLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dG1wRGlyUGF0aH0gaXMgYSBzeW1saW5rOyByZXBsYWNlIGl0IHdpdGggYSByZWd1bGFyIGRpcmVjdG9yeS5gKTtcbiAgfVxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoLFxuICAgICAgJ3diZnkgZm5veCBtaWdyYXRpb24gaW4gcHJvZ3Jlc3M7IGEgbGVmdG92ZXIgbWFya2VyIGJsb2NrcyBuZXcgbWlncmF0aW9uc1xcbicsXG4gICAgICB7XG4gICAgICAgIGZsYWc6ICd3eCcsXG4gICAgICB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFub3RoZXIgd2JmeSBwcm9jZXNzIGFwcGVhcnMgdG8gYmUgbWlncmF0aW5nICgke21pZ3JhdGlvbk1hcmtlclBhdGh9IGV4aXN0cyk6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgbWlncmF0aW9uTWFya2VyT3duZWQgPSB0cnVlO1xufVxuXG4vLyBPbmx5IHRoZSBydW4gdGhhdCBhY3F1aXJlZCB0aGUgbWFya2VyIG1heSByZW1vdmUgaXQ6IGRlbGV0aW5nIGEgZm9yZWlnbiBtYXJrZXIgd291bGQgZGlzYWJsZVxuLy8gaW50ZXJydXB0ZWQtbWlncmF0aW9uIGRldGVjdGlvbiBmb3IgYSBjb25jdXJyZW50bHkgcnVubmluZyB3YmZ5LlxuZnVuY3Rpb24gcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTogdm9pZCB7XG4gIGlmICghbWlncmF0aW9uTWFya2VyT3duZWQgfHwgIW1pZ3JhdGlvbk1hcmtlclBhdGgpIHJldHVybjtcbiAgZnMucm1TeW5jKG1pZ3JhdGlvbk1hcmtlclBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGxldCBzdWNjZWVkZWQgPSB0cnVlO1xuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2Ygc25hcHNob3RzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byByZXN0b3JlICR7ZmlsZVBhdGh9IGFmdGVyIGEgZmFpbGVkIG1pZ3JhdGlvbjogJHtlcnJvcn1gKTtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3VjY2VlZGVkO1xufVxuXG5mdW5jdGlvbiBmYWlsRm5veFN5bmMobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICBmbm94U3luY0ZhaWxlZCA9IHRydWU7XG59XG5cbi8vIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBhbiB1bnN1cHBvcnRlZCBmbm94LmxvY2FsLnRvbWwgaW4gdGhlIGRpcmVjdG9yeSwgb3IgdW5kZWZpbmVkLiBMb2NhbFxuLy8gb3ZlcnJpZGVzIG1heSBvbmx5IGhvbGQgbWFjaGluZS1sb2NhbCBzZWNyZXQgdmFsdWVzOyBpbXBvcnRzIG9yIHByb3ZpZGVyIChyZSlkZWZpbml0aW9ucyB3b3VsZFxuLy8gc2lsZW50bHkgY2hhbmdlIHdoaWNoIHJlY2lwaWVudCBzZXQgZ292ZXJucyByZS1lbmNyeXB0aW9uLlxuZnVuY3Rpb24gZmluZEZub3hMb2NhbFRvbWxJc3N1ZShkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NhbFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsVG9tbFBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBsb2NhbFNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsVG9tbFBhdGgsICd1dGY4JykpIGFzIEZub3hUb21sO1xuICBjb25zdCBkZWZpbmVzUHJvdmlkZXJzID1cbiAgICBsb2NhbFNldHRpbmdzLmltcG9ydCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgbG9jYWxTZXR0aW5ncy5wcm92aWRlcnMgIT09IHVuZGVmaW5lZCB8fFxuICAgIE9iamVjdC52YWx1ZXMobG9jYWxTZXR0aW5ncy5wcm9maWxlcyA/PyB7fSkuc29tZSgocHJvZmlsZSkgPT4gcHJvZmlsZT8ucHJvdmlkZXJzICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gZGVmaW5lc1Byb3ZpZGVycyA/IGAke2xvY2FsVG9tbFBhdGh9IGRlZmluZXMgaW1wb3J0cywgcHJvdmlkZXJzLCBvciBwcm9maWxlIHByb3ZpZGVyc2AgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGlzdHMgZXZlcnkgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBjb21taXR0ZWQgKG9yIGNvbW1pdHRhYmxlKSBmbm94LnRvbWwgYW1vbmcgdGhlIGdpdmVuXG4gKiBnaXQtZGlzY292ZXJlZCBjb25maWcgcGF0aHMgKHNlZSBsaXN0Rm5veExpa2VGaWxlUGF0aHM6IGdpdC1iYXNlZCBkaXNjb3ZlcnkgZXhjbHVkZXMgZ2l0aWdub3JlZFxuICogdHJlZXMgc3VjaCBhcyBub2RlX21vZHVsZXMgd2l0aG91dCBleGNsdWRpbmcgbGVnaXRpbWF0ZSBwYWNrYWdlcyBuYW1lZCBsaWtlIGJ1aWxkIG91dHB1dHMpLlxuICovXG5mdW5jdGlvbiBsaXN0Rm5veFRvbWxEaXJQYXRocyhmbm94TGlrZUZpbGVQYXRoczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGZub3hMaWtlRmlsZVBhdGhzXG4gICAgICAgIC5maWx0ZXIoKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ2Zub3gudG9tbCcpXG4gICAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZm5veCBjb25maWcgZGVjbGFyZXMgaXRzIG93biBgW3Byb3ZpZGVycy5hZ2VdYCwgaS5lLiBwYXJ0aWNpcGF0ZXMgaW4gYWdlIGVuY3J5cHRpb24uXG4gKiBBIGNvbmZpZyB3aXRob3V0IG9uZSBlaXRoZXIgaW5oZXJpdHMgYSBtYW5hZ2VkIHJvb3QncyBwcm92aWRlciAoaGFuZGxlZCBieSB0aGUgcm9vdC1leGlzdHMgcGF0aClcbiAqIG9yLCB3aGVuIG5vIHJvb3QgZXhpc3RzLCB1c2VzIG5vIGFnZSBlbmNyeXB0aW9uIGF0IGFsbCDigJQgc28gaXQgbmVlZHMgbm8gcmVjaXBpZW50IHN5bmNocm9uaXphdGlvblxuICogYW5kIG93bnMgbm8gRk5PWF9BR0VfS0VZLlxuICovXG5mdW5jdGlvbiBkZWNsYXJlc0Zub3hBZ2VQcm92aWRlcihmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGFuIHVucmVhZGFibGUgY29uZmlnIG1pZ2h0IGRlY2xhcmUgYW4gYWdlIHByb3ZpZGVyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oKEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sKS5wcm92aWRlcnM/LmFnZSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhaWwgY2xvc2VkOiBhbiB1bnBhcnNhYmxlIGNvbmZpZyBtaWdodCBkZWNsYXJlIGFuIGFnZSBwcm92aWRlci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmbm94IGNvbmZpZyBwYXRoIGxpZXMgaW5zaWRlIGEgdGVzdC1maXh0dXJlIHRyZWUgKHRlc3QvZml4dHVyZXMsIHRlc3QtZml4dHVyZXMsXG4gKiBfX3Rlc3RzX18pOiBmaXh0dXJlIGNvbmZpZ3MgYXJlIHRlc3QgSU5QVVRTLCBub3QgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uLiBmbm94IG5ldmVyIGxvYWRzXG4gKiB0aGVtIGZvciByZWFsIGNvbW1hbmRzIChoaWVyYXJjaGljYWwgbG9hZGluZyBvbmx5IHdhbGtzIGN3ZCBhbmNlc3RvcnMpLCByZWNpcGllbnRcbiAqIHN5bmNocm9uaXphdGlvbiBtdXN0IG5vdCByZXdyaXRlIG9yIHJlLWVuY3J5cHQgdGhlbSAoc2hhcmVkLWxpYi1ub2RlJ3MgdW5kZWNyeXB0YWJsZSBmaXh0dXJlXG4gKiBleGlzdHMgcHJlY2lzZWx5IHRvIHN0YXkgdW5kZWNyeXB0YWJsZSksIGFuZCBhIGZpeHR1cmUgbXVzdCBub3QgZmFpbCB0aGUgc3RyYXktbmVzdGVkLWNvbmZpZ1xuICogY2hlY2sgaW4gcmVwb3NpdG9yaWVzIHdpdGhvdXQgYSByb290IGZub3gudG9tbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGVzdEZpeHR1cmVGbm94UGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGBmaXh0dXJlc2AgY291bnRzIG9ubHkgZGlyZWN0bHkgdW5kZXIgYSB0ZXN0IGRpcmVjdG9yeTogd2JmeSBzdXBwb3J0cyBhcmJpdHJhcnkgd29ya3NwYWNlcyxcbiAgLy8gc28gYSBsZWdpdGltYXRlIGBwYWNrYWdlcy9maXh0dXJlcy9gIHdvcmtzcGFjZSBtdXN0IHN0YXkgbWFuYWdlZCBhbmQgdmVyaWZpZWQuXG4gIGNvbnN0IHNlZ21lbnRzID0gZmlsZVBhdGguc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHNlZ21lbnRzLnNvbWUoXG4gICAgKHNlZ21lbnQsIGluZGV4KSA9PlxuICAgICAgc2VnbWVudCA9PT0gJ3Rlc3QtZml4dHVyZXMnIHx8XG4gICAgICBzZWdtZW50ID09PSAnX190ZXN0c19fJyB8fFxuICAgICAgKHNlZ21lbnQgPT09ICdmaXh0dXJlcycgJiYgKHNlZ21lbnRzW2luZGV4IC0gMV0gPT09ICd0ZXN0JyB8fCBzZWdtZW50c1tpbmRleCAtIDFdID09PSAndGVzdHMnKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIC16IHByaW50cyBOVUwtZGVsaW1pdGVkIHZlcmJhdGltIHBhdGhzOyB3aXRob3V0IGl0LCBjb3JlLnF1b3RlUGF0aCBDLXF1b3RlcyBub24tQVNDSUkgcGF0aHNcbiAgLy8gKGUuZy4gXCJcXDM0NlxcMjI3XFwyNDUuLi5cIiksIHdoaWNoIHdvdWxkIG1ha2UgdGhlIGJhc2VuYW1lIGZpbHRlciBzaWxlbnRseSBza2lwIHRob3NlIGNvbmZpZ3MuXG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbJ2xzLWZpbGVzJywgJy16JywgJy0tY2FjaGVkJywgJy0tb3RoZXJzJywgJy0tZXhjbHVkZS1zdGFuZGFyZCcsICctLScsICcqZm5veCoudG9tbCddLFxuICAgIHsgY3dkOiByb290RGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9XG4gICk7XG4gIC8vIEZhaWwgY2xvc2VkOiB0cmVhdGluZyBhIGdpdCBmYWlsdXJlIGFzIFwibm8gZm5veCBjb25maWdzXCIgd291bGQgc2tpcCBzeW5jaHJvbml6YXRpb24gYW5kIGxldFxuICAvLyBzZXR1cFNlY3JldHMgdXBsb2FkIGEga2V5IHRoYXQgd2FzIG5ldmVyIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlcG9zaXRvcnkncyBjaXBoZXJ0ZXh0cy5cbiAgaWYgKHByb2Muc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBnaXQgbHMtZmlsZXMgZmFpbGVkIGluICR7cm9vdERpclBhdGh9OiAkeyhwcm9jLnN0ZGVyciB8fCBwcm9jLmVycm9yPy5tZXNzYWdlIHx8ICcnKS50cmltKCl9YCk7XG4gIH1cbiAgcmV0dXJuIHByb2Muc3Rkb3V0XG4gICAgLnNwbGl0KCdcXDAnKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IC9eXFwuP2Zub3goXFwuLispP1xcLnRvbWwkL3UudGVzdChwYXRoLmJhc2VuYW1lKGxpbmUpKSAmJiAhaXNUZXN0Rml4dHVyZUZub3hQYXRoKGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgbGluZSkpO1xufVxuXG5mdW5jdGlvbiBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKGRpclBhdGgpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAvXlxcLj9mbm94KFxcLi4rKT9cXC50b21sJC91LnRlc3QobmFtZSkpXG4gICAgICAudG9Tb3J0ZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkKT8uY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICAvLyBGYWlsIGNsb3NlZDogZm5veCBjYW4gc3RpbGwgbG9hZCBhIGNvbmZpZyBmcm9tIGEgZGlyZWN0b3J5IHRoaXMgcHJvY2VzcyBjYW5ub3QgZW51bWVyYXRlXG4gICAgLy8gKGUuZy4gZXhlY3V0ZS1vbmx5IHBlcm1pc3Npb24pLCBzbyBhbiBlbnVtZXJhdGlvbiBmYWlsdXJlIG11c3Qgbm90IHJlYWQgYXMgXCJubyBjb25maWdzXCIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaW5zcGVjdCAke2RpclBhdGh9IGZvciBmbm94IGNvbmZpZ3M6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBkaXJQYXRocyA9IFtkaXJQYXRoXTtcbiAgd2hpbGUgKGRpclBhdGhzLmF0KC0xKSAhPT0gcm9vdERpclBhdGgpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGlyUGF0aHMuYXQoLTEpID8/ICcnKTtcbiAgICBpZiAocGFyZW50ID09PSBkaXJQYXRocy5hdCgtMSkpIGJyZWFrO1xuICAgIGRpclBhdGhzLnB1c2gocGFyZW50KTtcbiAgfVxuICByZXR1cm4gZGlyUGF0aHM7XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IHVua25vd25bXSwgc291cmNlOiB1bmtub3duW10sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93bltdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChpc01lcmdlYWJsZU9iamVjdCh0YXJnZXRbaW5kZXhdLCBvcHRpb25zKSAmJiBpc01lcmdlYWJsZU9iamVjdChpdGVtLCBvcHRpb25zKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG5cbmZ1bmN0aW9uIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd24ge1xuICByZXR1cm4gaXNNZXJnZWFibGVPYmplY3QodmFsdWUsIG9wdGlvbnMpID8gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgLy8gcGFja2FnZS5qc29uLXN0eWxlIGtleXMgYXJlIG5vbi1hcnJheS1pbmRleCBrZXlzLCBzbyBKU09OLnN0cmluZ2lmeSBwcmVzZXJ2ZXMgdGhpcyBpbnNlcnRpb24gb3JkZXIuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRTZWVkZWRCYXNlbGluZUdsb2IsXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG4gIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybixcbiAgbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHksXG4gIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLy8gVGhlIEJ1bi1leGFjdCByZXNvbHV0aW9uIHByaW1pdGl2ZXMgbGl2ZSBpbiBAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlIChzcmMvYnVuV29ya3NwYWNlcy50cylcbi8vIHNvIHdiJ3MgcmVsZWFzZSBjb2RlIHNoYXJlcyB0aGVtOyByZS1leHBvcnQgdGhlIG9uZXMgd2JmeSBtb2R1bGVzIGFuZCB0ZXN0cyBjb25zdW1lLlxuZXhwb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuLyoqIFRoZSBzdWJzZXQgb2YgUGFja2FnZUNvbmZpZyB0aGF0IHdvcmtzcGFjZSBkaXNjb3ZlcnkgbmVlZHMsIHNvIGl0IGNhbiBydW4gYmVmb3JlIGNvbmZpZ3MgZXhpc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VSb290TGlrZSA9IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnIHwgJ2RvZXNDb250YWluU3ViUGFja2FnZUpzb25zJyB8ICdwYWNrYWdlSnNvbic+O1xuXG4vKipcbiAqIEV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZSBkaXJlY3RvcnkgKGFic29sdXRlLCBkZWR1cGxpY2F0ZWQpIG9mIHRoZSBtb25vcmVwbyByb290LCBjb3ZlcmluZ1xuICogbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKi4gVW5jYWNoZWQgYmVjYXVzZSBpbmRleC50cyBjYWxscyBpdCBiZWZvcmUgd2JmeSBtdXRhdGVzXG4gKiB0aGUgcm9vdCBwYWNrYWdlLmpzb24gKGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIGNhY2hlcyB0aGUgcG9zdC1tdXRhdGlvbiBzdGF0ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocm9vdExpa2UpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUocm9vdExpa2UuZGlyUGF0aCwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgICApXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlLmpzb24gcGF0aCAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QsIHNvcnRlZCksIGluY2x1ZGluZyBtYW5pZmVzdHNcbiAqIHdpdGhvdXQgYSBgbmFtZWAgZmllbGQg4oCUIHdiZnkgbmFtZXMgdGhvc2UgbGF0ZXIsIHNvIGRlcGVuZGVuY3kgc2NhbnMgbXVzdCBub3Qgc2tpcCB0aGVtLlxuICogUmVzb2x1dGlvbiBtaW1pY3MgQnVuJ3Mgc2VxdWVudGlhbCBwYXR0ZXJuIGV2YWx1YXRpb247IHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocm9vdENvbmZpZzogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290Q29uZmlnKSwgcm9vdENvbmZpZy5kaXJQYXRoKTtcbn1cblxuaW50ZXJmYWNlIFdvcmtzcGFjZURpclBhdHRlcm5zIHtcbiAgLyoqIERpcmVjdG9yeSBzdWJ0cmVlcyAob3IgcGFja2FnZS1vd25lZCBzdWJwYXRocykgbWF0Y2hlZCBieSBlZmZlY3RpdmUgbmVnYXRpb25zLCBmb3IgdHNjb25maWcgYGV4Y2x1ZGVgIGVudHJpZXMuICovXG4gIGV4Y2x1ZGVzOiBzdHJpbmdbXTtcbiAgLyoqIFBvc2l0aXZlIGRpcmVjdG9yeSBwYXR0ZXJucyAob3IgY29uY3JldGUgZGlyZWN0b3JpZXMgZm9yIEJ1bi1vbmx5IGdsb2Igc3ludGF4KS4gKi9cbiAgaW5jbHVkZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNvcnRlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IHBhdHRlcm5zIChwb3NpeCwgcmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpIGZvciBnZW5lcmF0b3JzIHRoYXRcbiAqIG5lZWQgcGF0dGVybi1zaGFwZWQgZ2xvYnMgY292ZXJpbmcgZXZlcnkgd29ya3NwYWNlIGxheW91dCDigJQgZS5nLiB0aGUgcm9vdCB0c2NvbmZpZydzIGBhcHBzLypgXG4gKiBpbmNsdWRlIGVudHJpZXMg4oCUIGluc3RlYWQgb2YgY29uY3JldGUgZGlyZWN0b3JpZXMsIHdoaWNoIHdvdWxkIGNodXJuIGdlbmVyYXRlZCBmaWxlcyB3aGVuZXZlciBhXG4gKiB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhZGRlZCBvciByZW1vdmVkLiBFdmVyeSByZXR1cm5lZCBwYXR0ZXJuIGlzIHZhbGlkIHRzY29uZmlnIGdsb2Igc3ludGF4LlxuICogQSBwYXR0ZXJuIGNhbiBtYXRjaCBhIHNpYmxpbmcgZGlyZWN0b3J5IHdpdGhvdXQgYSBwYWNrYWdlLmpzb24gKG5vdCBhIHdvcmtzcGFjZSB0byBCdW4pOyB0aGF0XG4gKiBpcyBkZWxpYmVyYXRlLCBtaXJyb3JpbmcgdGhlIGxvbmctc3RhbmRpbmcgYHBhY2thZ2VzLypgIGVudHJpZXMnIGJlaGF2aW9yIGluIGZhdm9yIG9mIHN0YWJsZVxuICogZ2VuZXJhdGVkIG91dHB1dC4gTmVnYXRpb25zIGZvbGxvdyBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyk6IGEgbmVnYXRpb24gc3RheXMgcGF0dGVybi1zaGFwZWQgd2hpbGUgaXQgZXhjbHVkZXMgZXhhY3RseVxuICogd2hhdCBpdCBtYXRjaGVzLCBidXQgaXMgY29uY3JldGl6ZWQgcGVyIG1hdGNoZWQgZGlyZWN0b3J5IHdoZW4gYSBtYXRjaGVkIGRpcmVjdG9yeSBlbmRzIHVwIGFcbiAqIHdvcmtzcGFjZSBhbnl3YXkgKHJlLWluY2x1ZGVkIGJ5IGEgbGF0ZXIgcG9zaXRpdmUsIGEgcGlubmVkIGNvbmNyZXRlIHBvc2l0aXZlLCBvciBhIHNlZWRlZFxuICogYmFzZWxpbmU7ICMxMDA1KSBvciBpcyBhbiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSBkaXJlY3RvcnksIHdoZXJlIEJ1biBleGNsdWRlcyBvbmx5IHRoZVxuICogcGFja2FnZSBBVCB0aGF0IGRpcmVjdG9yeSwgc28gb25seSBpdHMgcGFja2FnZS1vd25lZCBzdWJwYXRocyBhcmUgZXhjbHVkZWQgKCMxMDA0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZURpclBhdHRlcm5zKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IFdvcmtzcGFjZURpclBhdHRlcm5zIHtcbiAgLy8gVW5saWtlIGRpc2NvdmVyeSwgZ2VuZXJhdGVkIG91dHB1dCBtdXN0IG5vdCBjb250YWluIGEgbmV2ZXItbWF0Y2hpbmcgYHBhY2thZ2VzLypgIGZhbGxiYWNrOlxuICAvLyBhbiBhcHBzLyotb25seSBtb25vcmVwbyB3b3VsZCBnZXQgZGVhZCBnbG9icyBjb21taXR0ZWQgaW50byBpdHMgcm9vdCB0c2NvbmZpZy4gTWlycm9yXG4gIC8vIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggZm9yY2VzIGBwYWNrYWdlcy8qYCBvbmx5IHdoZW4gYSBtYW5pZmVzdCBhY3R1YWxseSBtYXRjaGVzLlxuICBjb25zdCBoYXNQYWNrYWdlc0xheW91dCA9XG4gICAgcm9vdExpa2UuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiZcbiAgICAvLyBNaXJyb3IgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zJyBiYXNlbGluZSBnYXRlIHRvbzogd2l0aCBhbiBpbXBsaWNpdCBiYXNlbGluZSBzZWVkZWQsXG4gICAgLy8gYHBhY2thZ2VzLypgIGVudHJpZXMgd291bGQgYmUgZGVhZCBnbG9icyBzdWJzdW1lZCBieSB0aGUgYmFzZWxpbmUtZGVyaXZlZCBvbmVzLlxuICAgICFoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKSAmJlxuICAgIGZnLmdsb2JTeW5jKCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIGN3ZDogcm9vdExpa2UuZGlyUGF0aCxcbiAgICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIH0pLmxlbmd0aCA+IDA7XG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID0gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMoe1xuICAgIC4uLnJvb3RMaWtlLFxuICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBoYXNQYWNrYWdlc0xheW91dCxcbiAgfSk7XG4gIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gbmV3IFNldChcbiAgICByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJucywgcm9vdExpa2UuZGlyUGF0aCkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKVxuICAgIClcbiAgKTtcbiAgY29uc3QgaW5jbHVkZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbmVnYXRpb25Cb2RpZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIC8vIEEgc2VlZGluZyBuZWdhdGlvbiBtYWtlcyBCdW4gbGluayBiYXNlbGluZS1tYXRjaGVkIGRpcmVjdG9yaWVzLCBzbyB0aGUgYmFzZWxpbmUgbXVzdFxuICAgICAgLy8gZW50ZXIgdGhlIGdlbmVyYXRlZCBpbmNsdWRlIHBhdHRlcm5zIGV2ZW4gd2hlbiBldmVyeSBkZWNsYXJlZCBwYXR0ZXJuIGlzIGEgbmVnYXRpb24uXG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSBpbmNsdWRlcy5hZGQoYmFzZWxpbmVHbG9iKTtcbiAgICAgIG5lZ2F0aW9uQm9kaWVzLnB1c2gocGF0dGVybkJvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdHRlcm4gb2YgdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhwYXR0ZXJuQm9keSwgcm9vdExpa2UuZGlyUGF0aCkpIHtcbiAgICAgICAgaW5jbHVkZXMuYWRkKGRpclBhdHRlcm4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBleGNsdWRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IG5lZ2F0aW9uQm9keSBvZiBuZWdhdGlvbkJvZGllcykge1xuICAgIGZvciAoY29uc3QgZXhjbHVkZUVudHJ5IG9mIHRvRXhjbHVkZUVudHJpZXMobmVnYXRpb25Cb2R5LCB3b3Jrc3BhY2VEaXJQYXRocywgcm9vdExpa2UuZGlyUGF0aCkpIHtcbiAgICAgIGV4Y2x1ZGVzLmFkZChleGNsdWRlRW50cnkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBleGNsdWRlczogWy4uLmV4Y2x1ZGVzXS50b1NvcnRlZCgpLCBpbmNsdWRlczogWy4uLmluY2x1ZGVzXS50b1NvcnRlZCgpIH07XG59XG5cbi8qKlxuICogdHNjb25maWcgZXhjbHVkZSBlbnRyaWVzIGZvciBvbmUgbmVnYXRpb24uIFBhdHRlcm4tc2hhcGVkIHdoZW4gdGhlIG5lZ2F0aW9uIGV4Y2x1ZGVzIGV4YWN0bHlcbiAqIHdoYXQgaXQgbWF0Y2hlcyAoc3RhYmxlIG91dHB1dCk7IHBlci1kaXJlY3Rvcnkgb3RoZXJ3aXNlOiBhIGRpcmVjdG9yeSB0aGF0IGlzIGEgd29ya3NwYWNlXG4gKiBkZXNwaXRlIHRoZSBuZWdhdGlvbiBpcyBub3QgZXhjbHVkZWQgYXQgYWxsLCBhbmQgbmVpdGhlciBpcyBhIFBMQUlOIChwYWNrYWdlLmpzb24tbGVzcylcbiAqIGRlc2NlbmRhbnQgb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5IOKAlCBuZWdhdGluZyBhIG5vbi1wYWNrYWdlIGRpcmVjdG9yeSBpcyBhIG5vLW9wIGZvciBCdW4sXG4gKiBhbmQgdGhlIGVuY2xvc2luZyB3b3Jrc3BhY2Ugc3RheXMgYWN0aXZlIChlLmcuIGBbJ2FwcHMvKionLCAnIWFwcHMvKionLCAnYXBwcy93ZWInXWBcbiAqIHJlLWluY2x1ZGVzIGFwcHMvd2ViLCB3aG9zZSBzcmMgbXVzdCBrZWVwIHR5cGUtY2hlY2tpbmc7IGEgdHNjb25maWcgZXhjbHVkZSB3b3VsZCBvdmVycmlkZVxuICogdGhlIGluY2x1ZGUpLiBBIGRlc2NlbmRhbnQgd2l0aCBpdHMgb3duIG1hbmlmZXN0IHRoYXQgdGhlIG5lZ2F0aW9uIGtlZXBzIG91dCBvZiB0aGUgd29ya3NwYWNlXG4gKiBzZXQgaXMgYW4gZXhjbHVkZWQgbmVzdGVkIHBhY2thZ2UgYW5kIHN0YXlzIGV4Y2x1ZGVkLiBBIGRpcmVjdG9yeSB0aGF0IGlzIGFuXG4gKiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSBkaXJlY3RvcnkgZ2V0cyBvbmx5IGl0cyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIGV4Y2x1ZGVkLCBiZWNhdXNlIEJ1blxuICogZXhjbHVkZXMgb25seSB0aGUgcGFja2FnZSBBVCB0aGF0IGRpcmVjdG9yeSB3aGlsZSBrZWVwaW5nIGRlc2NlbmRhbnQgd29ya3NwYWNlcyAoIzEwMDQpLlxuICovXG5mdW5jdGlvbiB0b0V4Y2x1ZGVFbnRyaWVzKG5lZ2F0aW9uQm9keTogc3RyaW5nLCB3b3Jrc3BhY2VEaXJQYXRoczogU2V0PHN0cmluZz4sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzV29ya3NwYWNlQW5jZXN0b3IgPSAoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgIFsuLi53b3Jrc3BhY2VEaXJQYXRoc10uc29tZSgod29ya3NwYWNlRGlyUGF0aCkgPT4gd29ya3NwYWNlRGlyUGF0aC5zdGFydHNXaXRoKGAke2RpclBhdGh9L2ApKTtcbiAgLy8gT25seSBQTEFJTiBkaXJlY3RvcmllcyAobm8gcGFja2FnZS5qc29uIG9mIHRoZWlyIG93bikgYXJlIHByb3RlY3RlZCBieSB0aGUgZW5jbG9zaW5nXG4gIC8vIHdvcmtzcGFjZTogYSBtYXRjaGVkIGRpcmVjdG9yeSB0aGF0IGNhcnJpZXMgaXRzIG93biBtYW5pZmVzdCB5ZXQgaXMgYWJzZW50IGZyb20gdGhlIGZpbmFsXG4gIC8vIHdvcmtzcGFjZSBzZXQgaXMgYW4gZXhjbHVkZWQgbmVzdGVkIHBhY2thZ2UsIGFuZCBpdHMgZXhjbHVzaW9uIG11c3Qgc3Vydml2ZS5cbiAgY29uc3QgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50ID0gKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBbLi4ud29ya3NwYWNlRGlyUGF0aHNdLnNvbWUoKHdvcmtzcGFjZURpclBhdGgpID0+IGRpclBhdGguc3RhcnRzV2l0aChgJHt3b3Jrc3BhY2VEaXJQYXRofS9gKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsIGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gIGNvbnN0IG1hdGNoZWREaXJQYXRocyA9IGdldE1hdGNoZWREaXJQYXRocyhuZWdhdGlvbkJvZHksIHJvb3REaXJQYXRoKTtcbiAgaWYgKFxuICAgICFtYXRjaGVkRGlyUGF0aHMuc29tZShcbiAgICAgIChkaXJQYXRoKSA9PlxuICAgICAgICB3b3Jrc3BhY2VEaXJQYXRocy5oYXMoZGlyUGF0aCkgfHwgaXNXb3Jrc3BhY2VBbmNlc3RvcihkaXJQYXRoKSB8fCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQoZGlyUGF0aClcbiAgICApXG4gICkge1xuICAgIHJldHVybiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKG5lZ2F0aW9uQm9keSwgcm9vdERpclBhdGgpO1xuICB9XG4gIHJldHVybiBtYXRjaGVkRGlyUGF0aHMuZmxhdE1hcCgoZGlyUGF0aCkgPT4ge1xuICAgIC8vIFRoZSBkZXNjZW5kYW50IGNoZWNrIHByZWNlZGVzIHRoZSBhbmNlc3RvciBvbmU6IGEgZGlyZWN0b3J5IGluc2lkZSBvbmUgd29ya3NwYWNlIGJ1dCBhYm92ZVxuICAgIC8vIGEgbmVzdGVkIG9uZSAoZS5nLiBhcHBzL3dlYi9wbHVnaW5zIGJldHdlZW4gd29ya3NwYWNlcyBhcHBzL3dlYiBhbmQgYXBwcy93ZWIvcGx1Z2lucy94KVxuICAgIC8vIHN0aWxsIGJlbG9uZ3MgdG8gdGhlIGVuY2xvc2luZyBhY3RpdmUgd29ya3NwYWNlLCBzbyBub3RoaW5nIG9mIGl0IG1heSBiZSBleGNsdWRlZC5cbiAgICBpZiAod29ya3NwYWNlRGlyUGF0aHMuaGFzKGRpclBhdGgpIHx8IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudChkaXJQYXRoKSkgcmV0dXJuIFtdO1xuICAgIGlmIChpc1dvcmtzcGFjZUFuY2VzdG9yKGRpclBhdGgpKSB7XG4gICAgICByZXR1cm4gW2Ake2RpclBhdGh9LyouY29uZmlnLnRzYCwgYCR7ZGlyUGF0aH0vc2NyaXB0c2AsIGAke2RpclBhdGh9L3NyY2AsIGAke2RpclBhdGh9L3Rlc3RgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtkaXJQYXRoXTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGlyZWN0b3JpZXMgYSBuZWdhdGlvbiBtYXRjaGVzLiBUaGUgbWFuaWZlc3QtYmFzZWQgZ2xvYiBjb21wbGVtZW50cyBvbmx5RGlyZWN0b3JpZXMgYmVjYXVzZVxuICogZmFzdC1nbG9iJ3MgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGBkaXJgIGl0c2VsZiBhcyBhIGRpcmVjdG9yeSwgd2hpbGUgYm90aCBCdW4gYW5kIHRoZVxuICogbWFuaWZlc3QgZ2xvYiB0cmVhdCBgKipgIGFzIHplcm8gb3IgbW9yZSBzZWdtZW50cyAoYGFwcHMvKipgIGNvdmVycyB0aGUgcGFja2FnZSBhdCBhcHBzKS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hlZERpclBhdGhzKG5lZ2F0aW9uQm9keTogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4uZmcuZ2xvYlN5bmMobmVnYXRpb25Cb2R5LCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSksXG4gICAgICAuLi5mZ1xuICAgICAgICAuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKG5lZ2F0aW9uQm9keSwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucylcbiAgICAgICAgLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICAgICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290IGl0c2VsZiwgd2hpY2ggaXMgbmV2ZXIgYSB3b3Jrc3BhY2UuXG4gICAgICAgIC5maWx0ZXIoKGRpclBhdGgpID0+IGRpclBhdGggIT09ICcuJyksXG4gICAgXSksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiB0c2NvbmZpZyBpbmNsdWRlL2V4Y2x1ZGUgc3VwcG9ydCBvbmx5IHRoZSBgKmAsIGA/YCwgYW5kIGAqKmAgd2lsZGNhcmRzLCB3aGlsZSBCdW4gd29ya3NwYWNlc1xuICogYWNjZXB0IGZ1bGwgZ2xvYiBzeW50YXggKGJyYWNlIGV4cGFuc2lvbiwgY2hhcmFjdGVyIGNsYXNzZXMsIOKApiksIHNvIGV4cGFuZCBCdW4tb25seSBwYXR0ZXJucyB0b1xuICogdGhlIGNvbmNyZXRlIGRpcmVjdG9yaWVzIHRoZXkgbWF0Y2ggdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIGdsb2JzIHZhbGlkIGZvciBUeXBlU2NyaXB0LlxuICovXG5mdW5jdGlvbiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKHBhdHRlcm5Cb2R5OiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghL1soKVtcXF17fV0vdS50ZXN0KHBhdHRlcm5Cb2R5KSkgcmV0dXJuIFtwYXR0ZXJuQm9keV07XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuQm9keSwge1xuICAgIGN3ZDogcm9vdERpclBhdGgsXG4gICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIG9ubHlEaXJlY3RvcmllczogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSB0aGF0IHN0YXkgaW5zaWRlIHRoZSByZXBvc2l0b3J5OiBhYnNvbHV0ZVxuICogb3IgYC4uYC10cmF2ZXJzaW5nIHBhdHRlcm5zIHdvdWxkIG1ha2UgY29uc3VtZXJzIHN1Y2ggYXMgcmVtb3ZlTm9kZU1vZHVsZXMgb3BlcmF0ZSBvbiBhbm90aGVyXG4gKiByZXBvc2l0b3J5J3MgZmlsZXMuIERlY2xhcmF0aW9uIG9yZGVyIGFuZCBkdXBsaWNhdGVzIGFyZSBwcmVzZXJ2ZWQg4oCUIEJ1biBldmFsdWF0ZXMgdGhlXG4gKiBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmZ1bmN0aW9uIGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVjbGFyZWRQYXR0ZXJucyA9IGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKTtcbiAgLy8gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIGZvcmNlcyBgcGFja2FnZXMvKmAgaW50byBhIG1vbm9yZXBvJ3Mgd29ya3NwYWNlcyB3aGVuIGFcbiAgLy8gcGFja2FnZXMvKi9wYWNrYWdlLmpzb24gYWN0dWFsbHkgbWF0Y2hlcywgYnV0IGl0IG1heSBub3QgaGF2ZSB3cml0dGVuIHRoZSByb290IHBhY2thZ2UuanNvblxuICAvLyB5ZXQsIHNvIG1pcnJvciB0aGF0IG5vcm1hbGl6YXRpb24gaGVyZSDigJQgUFJFUEVOREVEIGxpa2UgdGhlcmUsIGJlY2F1c2UgYSBwb3NpdGl2ZSBwYXR0ZXJuXG4gIC8vIHBsYWNlZCBhZnRlciBhIHVzZXIgbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcyB1bmRlciBCdW4ncyBzZXF1ZW50aWFsXG4gIC8vIGV2YWx1YXRpb24uIERpc2NvdmVyeSBjYWxsZXJzIHBhc3MgdGhlIGZhbGxiYWNrIHVuY29uZGl0aW9uYWxseSBmb3IgbW9ub3JlcG9zIOKAlCBhXG4gIC8vIG5ldmVyLW1hdGNoaW5nIHBhdHRlcm4gY29udHJpYnV0ZXMgbm8gcGF0aHMgdGhlcmUg4oCUIHdoaWxlIHBhdHRlcm4tc2hhcGVkIGNhbGxlcnNcbiAgLy8gKGdldFdvcmtzcGFjZURpclBhdHRlcm5zKSBnYXRlIGl0IG9uIGFuIGFjdHVhbCBtYXRjaC5cbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPVxuICAgIHJvb3RMaWtlLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmICFoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4ocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpXG4gICAgICA/IFsncGFja2FnZXMvKicsIC4uLmRlY2xhcmVkUGF0dGVybnNdXG4gICAgICA6IGRlY2xhcmVkUGF0dGVybnM7XG4gIHJldHVybiB3b3Jrc3BhY2VQYXR0ZXJucy5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+IGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHBvc2l0aXZlIHBhdHRlcm4gYWxyZWFkeSBjb3ZlcnMgYHBhY2thZ2VzLypgIHVuZGVyIHBhdGggbm9ybWFsaXphdGlvblxuICogKGUuZy4gYC4vcGFja2FnZXMvKmAgb3IgYSB0cmFpbGluZy1zbGFzaCBzcGVsbGluZyk6IGZvcmNpbmcgYSB0ZXh0dWFsIGBwYWNrYWdlcy8qYCBuZXh0IHRvXG4gKiBzdWNoIGEgc3BlbGxpbmcgd291bGQgcGVyc2lzdCBkdXBsaWNhdGUgZXF1aXZhbGVudCBwYXR0ZXJucyBhbmQgcmUtc2NhbiB0aGUgc2FtZSBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybih3b3Jrc3BhY2VzOiBQYWNrYWdlSnNvblsnd29ya3NwYWNlcyddKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgIXdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmXG4gICAgICAvLyBBIGAuLmAtdHJhdmVyc2luZyBvciBhYnNvbHV0ZSBzcGVsbGluZyAoZS5nLiBgeC8uLi9wYWNrYWdlcy8qYCkgaXMgZGlzY2FyZGVkIGJ5XG4gICAgICAvLyBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucywgc28gaXQgbXVzdCBub3QgY291bnQgYXMgY292ZXJpbmcgcGFja2FnZXMvKiDigJQgdGhhdCB3b3VsZFxuICAgICAgLy8gc3VwcHJlc3MgdGhlIGZhbGxiYWNrIEFORCBsb3NlIHRoZSBwYXR0ZXJuLCBsZWF2aW5nIG5vIGRpc2NvdmVyZWQgd29ya3NwYWNlcy5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKSAmJlxuICAgICAgbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkod29ya3NwYWNlUGF0dGVybikgPT09ICdwYWNrYWdlcy8qJ1xuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIH0gZnJvbSAnLi93b3Jrc3BhY2VVdGlsLmpzJztcblxuY29uc3QgUFJJVkFURV9TQ09QRSA9ICdAd2lsbGJvb3N0ZXItcHJpdmF0ZS8nO1xuXG5jb25zdCBwcml2YXRlUmVnaXN0cnlIb3N0ID0gJ3ZlcmRhY2Npby1wcm9kdWN0aW9uLWUzODkudXAucmFpbHdheS5hcHAnO1xuZXhwb3J0IGNvbnN0IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyA9IGBAd2lsbGJvb3N0ZXItcHJpdmF0ZTpyZWdpc3RyeT1odHRwczovLyR7cHJpdmF0ZVJlZ2lzdHJ5SG9zdH0vYDtcblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgcmVwb3NpdG9yeSBkZWFscyB3aXRoIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCBwYWNrYWdlcyDigJQgYnkgY29udmVudGlvbiB0aGF0IHNjb3BlXG4gKiBsaXZlcyBleGNsdXNpdmVseSBvbiB0aGUgcHJpdmF0ZSBWZXJkYWNjaW8gcmVnaXN0cnksIHNvIGV4YWN0bHkgdGhlc2UgcmVwb3NpdG9yaWVzIG5lZWQgdGhlXG4gKiBWRVJEQUNDSU9fVE9LRU4gcGFzcy10aHJvdWdoIGluIHRoZWlyIHJldXNhYmxlLXdvcmtmbG93IGNhbGxlcnMuXG4gKlxuICogQSByZXBvc2l0b3J5IHF1YWxpZmllcyB3aGVuIGFueSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIERFQ0xBUkVTIGEgZGVwZW5kZW5jeSBpbiB0aGUgc2NvcGUgKGFueVxuICogZGVwZW5kZW5jeSBmaWVsZCksIG9yIGlzIGl0c2VsZiBOQU1FRCBpbiB0aGUgc2NvcGUgKGl0IHB1Ymxpc2hlcyB0byBWZXJkYWNjaW8sIGFuZCByZWxlYXNlLnltbFxuICogZGVyaXZlcyBpdHMgbnBtIGF1dGggZnJvbSB0aGUgc2FtZSBzZWNyZXQpLiBOb3RoaW5nIGVsc2UgaXMgc2Nhbm5lZDogbG9ja2ZpbGVzIG9ubHkgbWlycm9yIHRoZVxuICogZGVjbGFyZWQgZGVwZW5kZW5jaWVzLCBhbmQgYnVuZmlnLnRvbWwncyBgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlc2AgbWVudGlvbnMgdGhlIHNjb3BlIGV2ZW4gaW5cbiAqIHJlcG9zaXRvcmllcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCcgfCAnZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMnIHwgJ3BhY2thZ2VKc29uJz5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBtYW5pZmVzdFJlbFBhdGhzID0gbmV3IFNldChbJ3BhY2thZ2UuanNvbicsIC4uLmdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoY29uZmlnKV0pO1xuICByZXR1cm4gWy4uLm1hbmlmZXN0UmVsUGF0aHNdLnNvbWUoKHJlbFBhdGgpID0+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHJlYWRQYWNrYWdlSnNvbklmRXhpc3RzKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcmVsUGF0aCkpO1xuICAgIGlmICghbWFuaWZlc3QpIHJldHVybiBmYWxzZTtcbiAgICBpZiAobWFuaWZlc3QubmFtZT8uc3RhcnRzV2l0aChQUklWQVRFX1NDT1BFKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1hbmlmZXN0LmRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0LmRldkRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0LnBlZXJEZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5vcHRpb25hbERlcGVuZGVuY2llcyxcbiAgICBdLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzID8/IHt9KS5zb21lKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoUFJJVkFURV9TQ09QRSkpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbklmRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSAnd2ViLXRyZWUtc2l0dGVyJztcbmltcG9ydCB7IExhbmd1YWdlLCBQYXJzZXIgfSBmcm9tICd3ZWItdHJlZS1zaXR0ZXInO1xuXG5sZXQgcGFyc2VyUHJvbWlzZTogUHJvbWlzZTxQYXJzZXI+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHVucXVvdGVkIHdvcmRzIChjb21tYW5kIG5hbWUgZmlyc3QpIG9mIGV2ZXJ5IHNpbXBsZSBjb21tYW5kIGluIGEgQmFzaCBzY3JpcHQsIGluY2x1ZGluZyB0aG9zZSBuZXN0ZWRcbiAqIGluIHN1YnNoZWxscywgY29tcG91bmQgc3RhdGVtZW50cywgYW5kIGNvbW1hbmQgc3Vic3RpdHV0aW9ucywgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHNjcmlwdCBkb2VzIG5vdCBwYXJzZS5cbiAqIENvbW1lbnRzIGFuZCBsaXRlcmFsIGhlcmVkb2MgdGV4dCBhcmUgbm90IGNvbW1hbmRzIChjb21tYW5kIHN1YnN0aXR1dGlvbnMgaW4gYW4gdW5xdW90ZWQgaGVyZWRvYyBhcmUpLCBhbmQgZnVuY3Rpb25cbiAqIGJvZGllcyBhcmUgc2tpcHBlZCBiZWNhdXNlIHRoZXkgcnVuIG9ubHkgd2hlbiBjYWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVNoZWxsQ29tbWFuZHMoc2NyaXB0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdW10gfCB1bmRlZmluZWQ+IHtcbiAgcGFyc2VyUHJvbWlzZSA/Pz0gY3JlYXRlUGFyc2VyKCk7XG4gIGNvbnN0IHBhcnNlciA9IGF3YWl0IHBhcnNlclByb21pc2U7XG4gIGNvbnN0IHRyZWUgPSBwYXJzZXIucGFyc2Uoc2NyaXB0KTtcbiAgaWYgKCF0cmVlKSByZXR1cm47XG4gIHRyeSB7XG4gICAgaWYgKHRyZWUucm9vdE5vZGUuaGFzRXJyb3IpIHJldHVybjtcbiAgICByZXR1cm4gdHJlZS5yb290Tm9kZS5kZXNjZW5kYW50c09mVHlwZSgnY29tbWFuZCcpLmZsYXRNYXAoKGNvbW1hbmQpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjb21tYW5kLmNoaWxkRm9yRmllbGROYW1lKCduYW1lJyk7XG4gICAgICBpZiAoIW5hbWUgfHwgaXNJbkZ1bmN0aW9uQm9keShjb21tYW5kKSkgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIFtbbmFtZSwgLi4uY29tbWFuZC5jaGlsZHJlbkZvckZpZWxkTmFtZSgnYXJndW1lbnQnKV0ubWFwKCh3b3JkKSA9PiB1bnF1b3RlV29yZCh3b3JkKSldO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIHRyZWUuZGVsZXRlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkZ1bmN0aW9uQm9keShub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGFuY2VzdG9yID0gbm9kZS5wYXJlbnQ7IGFuY2VzdG9yOyBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudCkge1xuICAgIGlmIChhbmNlc3Rvci50eXBlID09PSAnZnVuY3Rpb25fZGVmaW5pdGlvbicpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUGFyc2VyKCk6IFByb21pc2U8UGFyc2VyPiB7XG4gIGF3YWl0IFBhcnNlci5pbml0KCk7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoKTtcbiAgcGFyc2VyLnNldExhbmd1YWdlKGF3YWl0IExhbmd1YWdlLmxvYWQoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS5yZXNvbHZlKCd0cmVlLXNpdHRlci1iYXNoL3RyZWUtc2l0dGVyLWJhc2gud2FzbScpKSkpO1xuICByZXR1cm4gcGFyc2VyO1xufVxuXG5mdW5jdGlvbiB1bnF1b3RlV29yZChub2RlOiBOb2RlKTogc3RyaW5nIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlICdjb21tYW5kX25hbWUnOiB7XG4gICAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkID8gdW5xdW90ZVdvcmQobm9kZS5maXJzdENoaWxkKSA6IG5vZGUudGV4dDtcbiAgICB9XG4gICAgY2FzZSAnY29uY2F0ZW5hdGlvbic6IHtcbiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHVucXVvdGVXb3JkKGNoaWxkKSkuam9pbignJyk7XG4gICAgfVxuICAgIGNhc2UgJ3Jhd19zdHJpbmcnOiB7XG4gICAgICByZXR1cm4gbm9kZS50ZXh0LnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgcmV0dXJuIG5vZGUudGV4dFxuICAgICAgICAuc2xpY2UoMSwgLTEpXG4gICAgICAgIC5yZXBsYWNlQWxsKCdcXFxcXFxuJywgJycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXFxcKFskYFwiXFxcXF0pL2d1LCAnJDEnKTtcbiAgICB9XG4gICAgY2FzZSAnd29yZCc6IHtcbiAgICAgIHJldHVybiBub2RlLnRleHQucmVwbGFjZUFsbCgnXFxcXFxcbicsICcnKS5yZXBsYWNlQWxsKC9cXFxcKC4pL2dzdSwgJyQxJyk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vIEV4cGFuc2lvbnMgYW5kIHN1YnN0aXR1dGlvbnMgaGF2ZSBubyBzdGF0aWMgdmFsdWU7IHRoZWlyIHNvdXJjZSB0ZXh0IG5ldmVyIGVxdWFscyBhIGxpdGVyYWwgd29yZC5cbiAgICAgIHJldHVybiBub2RlLnRleHQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBydW5uZXJTY2hlbWEgPSB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSk7XG5jb25zdCB3b3JrZmxvd1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgam9iczogei5yZWNvcmQoXG4gICAgei5zdHJpbmcoKSxcbiAgICB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgJ3J1bnMtb24nOiBydW5uZXJTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgc3RyYXRlZ3k6IHoub2JqZWN0KHsgbWF0cml4OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkgfSkub3B0aW9uYWwoKSxcbiAgICAgIH0pXG4gICAgICAubnVsbGFibGUoKVxuICApLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8ICFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSByZXR1cm47XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5jYXRjaCgoZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgZm9yIChjb25zdCB7IG5hbWU6IGZpbGVOYW1lIH0gb2YgZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiAvXFwueWE/bWwkL3UudGVzdChlbnRyeS5uYW1lKSkpIHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHdvcmtmbG93U2NoZW1hLnBhcnNlKHlhbWwubG9hZChhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpKSk7XG4gICAgZm9yIChjb25zdCBbam9iTmFtZSwgam9iXSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvdy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2I/LlsncnVucy1vbiddKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IGpvYlsncnVucy1vbiddO1xuICAgICAgaWYgKGlzU2VsZkhvc3RlZChydW5uZXIpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG1hdGNoID0gdHlwZW9mIHJ1bm5lciA9PT0gJ3N0cmluZycgJiYgL15cXCRcXHtcXHtcXHMqbWF0cml4XFwuKFxcdyspXFxzKlxcfVxcfSQvdS5leGVjKHJ1bm5lcik7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzOiB1bmtub3duW10gPSBbXTtcbiAgICAgIGlmIChtYXRjaCAmJiBqb2Iuc3RyYXRlZ3kpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV0hO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBqb2Iuc3RyYXRlZ3kubWF0cml4O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB6LmFycmF5KHoudW5rbm93bigpKS5zYWZlUGFyc2UobWF0cml4W2tleV0pO1xuICAgICAgICBpZiAodmFsdWVzLnN1Y2Nlc3MpIGNhbmRpZGF0ZXMucHVzaCguLi52YWx1ZXMuZGF0YSk7XG4gICAgICAgIGNvbnN0IGluY2x1ZGUgPSB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSkuc2FmZVBhcnNlKG1hdHJpeC5pbmNsdWRlKTtcbiAgICAgICAgaWYgKGluY2x1ZGUuc3VjY2VzcylcbiAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goLi4uaW5jbHVkZS5kYXRhLm1hcCgocm93KSA9PiByb3dba2V5XSkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHJ1bm5lcik7XG4gICAgICB9XG4gICAgICBjb25zdCBhbGxvd2VkID1cbiAgICAgICAgY2FuZGlkYXRlcy5sZW5ndGggPiAwICYmXG4gICAgICAgIGNhbmRpZGF0ZXMuZXZlcnkoXG4gICAgICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgICAgIGlzU2VsZkhvc3RlZChjYW5kaWRhdGUpIHx8XG4gICAgICAgICAgICAoY29uZmlnLnJlcG9zaXRvcnk/LnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWI6d2lsbGJvb3N0ZXIvY2hlZXJsaW5ncycgJiZcbiAgICAgICAgICAgICAgZmlsZU5hbWUgPT09ICdidWlsZC1kZXNrdG9wLWFwcHMueW1sJyAmJlxuICAgICAgICAgICAgICBqb2JOYW1lID09PSAnYnVpbGQnICYmXG4gICAgICAgICAgICAgIGNhbmRpZGF0ZSA9PT0gJ3dpbmRvd3MtbGF0ZXN0JylcbiAgICAgICAgKTtcbiAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7ZmlsZU5hbWV9OiBqb2JzLiR7am9iTmFtZX0ucnVucy1vbiBtdXN0IHNlbGVjdCBzZWxmLWhvc3RlZCBydW5uZXJzIGluIGEgcHJpdmF0ZSByZXBvc2l0b3J5LiBGaXggdGhlIHdvcmtmbG93IGJlZm9yZSBydW5uaW5nIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NlbGZIb3N0ZWQocnVubmVyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxhYmVscyA9IHJ1bm5lclNjaGVtYS5zYWZlUGFyc2UocnVubmVyKTtcbiAgaWYgKCFsYWJlbHMuc3VjY2VzcykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheShsYWJlbHMuZGF0YSkpIHJldHVybiBsYWJlbHMuZGF0YS5pbmNsdWRlcygnc2VsZi1ob3N0ZWQnKTtcbiAgcmV0dXJuIGxhYmVscy5kYXRhID09PSAnc2VsZi1ob3N0ZWQnO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYXNGbm94U3luY0ZhaWxlZCwgcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgcnVuQWxsSW5Qb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTaGVsbENvbW1hbmRzIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGxQYXJzZXIuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyB9IGZyb20gJy4vd29ya2Zsb3dSdW5uZXJQb2xpY3kuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xuICBxdWV1ZT86ICdzaW5nbGUnIHwgJ21heCc7XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgJ2luaGVyaXQnO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgICAgLy8gTGV0IG1haW50YWluZXJzIHJlLXJ1biB0aGUgdGVzdHMgYnkgaGFuZC5cbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgLy8gTm9uZSBvZiB0aGVzZSBtYXkgYmUgbmFycm93ZWQganVzdCBiZWNhdXNlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IG5ldmVyIHB1c2hlczpcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHRoZSB0ZXN0IGpvYidzIHNraXAtZHVwbGljYXRlLWFjdGlvbnMgY2FsbCB3aXRoIGNhbmNlbF9vdGhlcnM6IHRydWUgKHRoZSByZXVzYWJsZVxuICAgICAgLy8gdGVzdCB3b3JrZmxvdyBkZWNsYXJlcyBubyBwZXJtaXNzaW9ucyBvZiBpdHMgb3duLCBzbyBpdHMgam9icyBydW4gb24gdGhpcyB0b2tlbilcbiAgICAgIGFjdGlvbnM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgYHNlbWFudGljLXJlbGVhc2UgLS1kcnktcnVuYCwgd2hpY2ggZG9lcyBhIGBnaXQgcHVzaCAtLWRyeS1ydW5gIHRvIHZlcmlmeSB3cml0ZVxuICAgICAgLy8gYWNjZXNzIGFuZCBhYm9ydHMgd2l0aCBFR0lUTk9QRVJNSVNTSU9OIHdpdGhvdXQgaXRcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHBrZy1wcmVmbGlnaHQgUFIgZmlsZSBsaXN0aW5nXG4gICAgICAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3Rlc3QtcnVzdCc6IHtcbiAgICBuYW1lOiAnVGVzdCBSdXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd0ZXN0LXJ1c3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC1ydXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gYHF1ZXVlOiBtYXhgIGhlcmUgdG9vICgjOTc0KTogR2l0SHViJ3MgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGNhbmNlbHMgYW4gYWxyZWFkeS1QRU5ESU5HXG4gICAgLy8gY2FsbGVyIHJ1biB3aGVuIGFub3RoZXIgb25lIHF1ZXVlcyDigJQgYmVmb3JlIGl0cyBqb2IgKGFuZCB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBvd25cbiAgICAvLyBqb2ItbGV2ZWwgYHF1ZXVlOiBtYXhgKSBldmVyIHN0YXJ0cyDigJQgc2lsZW50bHkgZHJvcHBpbmcgdGhhdCByZWxlYXNlIHRyaWdnZXIuXG4gICAgLy8gVGhlIGNhbGxlci1sZXZlbCBncm91cCBtdXN0IE5PVCByZXVzZSB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBqb2ItbGV2ZWwgZ3JvdXAgbmFtZVxuICAgIC8vIChgcmVsZWFzZS0ke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX1gKTogd29ya2Zsb3ctbGV2ZWwgYW5kIGpvYi1sZXZlbCBncm91cHMgc2hhcmUgb25lXG4gICAgLy8gcmVwb3NpdG9yeS13aWRlIG5hbWVzcGFjZSwgYW5kIGlkZW50aWNhbCBuYW1lcyBkZWFkbG9jayB0aGUgcnVuIChcIkNhbmNlbGluZyBzaW5jZSBhXG4gICAgLy8gZGVhZGxvY2sgZm9yIGNvbmN1cnJlbmN5IGdyb3VwIC4uLiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiAndG9wIGxldmVsIHdvcmtmbG93JyBhbmQgJzxqb2I+J1wiKS5cbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIHF1ZXVlOiAnbWF4JyxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JztcblxuLyoqXG4gKiBQYXJzZXMgYSBgdXNlczpgIHZhbHVlIGNhbGxpbmcgb25lIG9mIFdpbGxCb29zdGVyJ3Mgb3duIHJldXNhYmxlIHdvcmtmbG93cyAob3IgdGhlXG4gKiBXaWxsQm9vc3RlckxhYiBzeW5jIG1pcnJvcikgaW50byB0aGUgd29ya2Zsb3cgbmFtZSAod2l0aG91dCBleHRlbnNpb24pIGFuZCBnaXQgcmVmLiBPbmx5IHRob3NlXG4gKiBmb2xsb3cgdGhlIGNvbnRyYWN0IHdiZnkgZW5mb3JjZXMg4oCUIGNhbGxlcnMgb2YgYW5vdGhlciBvcmdhbml6YXRpb24ncyBzYW1lLW5hbWVkIHJlcG9zaXRvcnkgYXJlXG4gKiBsZWZ0IGFsb25lLiBHaXRIdWIgdHJlYXRzIG93bmVyL3JlcG9zaXRvcnkgbmFtZXMgY2FzZS1pbnNlbnNpdGl2ZWx5LCBzbyB0aGUgY29tcGFyaXNvbiBkb2VzXG4gKiB0b28sIHdoaWxlIHRoZSB3b3JrZmxvdyBwYXRoIGFuZCByZWYgc3RheSBjYXNlLXNlbnNpdGl2ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChcbiAgdXNlczogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiB7IHdvcmtmbG93TmFtZTogc3RyaW5nOyBleHRlbnNpb246IHN0cmluZzsgcmVmOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gL14oW14vXSspXFwvKFteL10rKVxcL1xcLmdpdGh1YlxcL3dvcmtmbG93c1xcLyhbXi9AXSs/KVxcLih5YT9tbClAKC4rKSQvdS5leGVjKHVzZXMgPz8gJycpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBvd25lciA9IG1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoKG93bmVyICE9PSAnd2lsbGJvb3N0ZXInICYmIG93bmVyICE9PSAnd2lsbGJvb3N0ZXJsYWInKSB8fCBtYXRjaFsyXSEudG9Mb3dlckNhc2UoKSAhPT0gJ3JldXNhYmxlLXdvcmtmbG93cycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IHdvcmtmbG93TmFtZTogbWF0Y2hbM10hLCBleHRlbnNpb246IG1hdGNoWzRdISwgcmVmOiBtYXRjaFs1XSEgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyb290Q29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93bikge1xuICAgIGNvbnNvbGUud2FybignU2tpcHBlZCB3b3JrZmxvdyBnZW5lcmF0aW9uIGJlY2F1c2UgcmVwb3NpdG9yeSB2aXNpYmlsaXR5IGlzIHVua25vd24uJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmIChhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICBhd2FpdCBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgpO1xuICB9XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXaXRoIC5naXRodWIgb3IgLmdpdGh1Yi93b3JrZmxvd3Mgc3ltbGlua2VkIG91dHNpZGUgdGhlIHJlcG9zaXRvcnksIHdyaXRlWWFtbCdzIGd1YXJkc1xuICAgIC8vIGFscmVhZHkgcmVmdXNlIHRoZSB3cml0ZXMsIGJ1dCByZWFkZGlyL3JtIGJlbG93IHdvdWxkIHN0aWxsIGVudW1lcmF0ZSBhbmQgREVMRVRFIGZpbGVzXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSDigJQgc28gcmVxdWlyZSB0aGUgZGlyZWN0b3J5IHRvIHJlc29sdmUgaW5zaWRlIGl0IGJlZm9yZSBhbnlcbiAgICAvLyB0cmF2ZXJzYWwsIG1rZGlyLCBvciBjbGVhbnVwLlxuICAgIGlmICghKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgd29ya2Zsb3dzIGJlY2F1c2UgJHt3b3JrZmxvd3NQYXRofSByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAvLyB3YmZ5IHdyaXRlcyAueW1sIHdvcmtmbG93cywgc28gZWFjaCBraW5kIG1hcHMgdG8gaXRzIC55bWwgZmlsZS5cbiAgICBjb25zdCBmaWxlTmFtZXNCeUtpbmQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhZW50cnkubmFtZS5lbmRzV2l0aCgnLnltbCcpKSBjb250aW51ZTtcbiAgICAgIGZpbGVOYW1lc0J5S2luZC5zZXQoZW50cnkubmFtZS5zbGljZSgwLCAtJy55bWwnLmxlbmd0aCksIGVudHJ5Lm5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBtYW5kYXRvcnlLaW5kcyA9IFsndGVzdCcsICdzZW1hbnRpYy1wcicsICdjbG9zZS1jb21tZW50J107XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgbWFuZGF0b3J5S2luZHMucHVzaCgncmVsZWFzZScpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBtYW5kYXRvcnlLaW5kcy5wdXNoKCd0ZXN0LXJ1c3QnKTtcbiAgICB9XG4gICAgLy8gQSBwcmV2aW91cyBydW4gbWF5IGhhdmUgbWlzdGFrZW4gYSBnaXRpZ25vcmVkIHRoaXJkLXBhcnR5IGNoZWNrb3V0IGZvciByZXBvc2l0b3J5IFJ1c3QgY29kZS5cbiAgICAvLyBSZW1vdmUgb25seSB0aGUgZ2VuZXJhdGVkLXN0eWxlIGNhbGxlcjogYSBzYW1lLW5hbWVkIGN1c3RvbSB3b3JrZmxvdyB3aXRoIGFueSBvdGhlciBqb2Igc3RheXMuXG4gICAgaWYgKHJvb3RDb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCB0ZXN0UnVzdEZpbGVOYW1lID0gZmlsZU5hbWVzQnlLaW5kLmdldCgndGVzdC1ydXN0Jyk7XG4gICAgICBpZiAodGVzdFJ1c3RGaWxlTmFtZSAmJiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aCwgdGVzdFJ1c3RGaWxlTmFtZSwgJ3Rlc3QtcnVzdCcpKSB7XG4gICAgICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3Rlc3QtcnVzdCcpO1xuICAgICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIHRlc3RSdXN0RmlsZU5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgnd2JmeScpO1xuICAgIGZvciAoY29uc3Qga2luZCBvZiBtYW5kYXRvcnlLaW5kcykge1xuICAgICAgaWYgKCFmaWxlTmFtZXNCeUtpbmQuaGFzKGtpbmQpKSB7XG4gICAgICAgIGZpbGVOYW1lc0J5S2luZC5zZXQoa2luZCwgYCR7a2luZH0ueW1sYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWxlTmFtZXNCeUtpbmQuaGFzKCdzeW5jJykpIHtcbiAgICAgIC8vIFRoZSBzeW5jIHdvcmtmbG93J3MgZ2VuZXJhdGlvbiBvd25zIHRoZSBmb3JjZS1zeW5jIHdvcmtmbG93LCBzbyBwcm9jZXNzaW5nIGl0IGFzIGFuXG4gICAgICAvLyBpbmRlcGVuZGVudCBraW5kIHdvdWxkIHJhY2UgY29uY3VycmVudCB3cml0ZXMgb24gdGhlIHNhbWUgcGF0aC5cbiAgICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3N5bmMtZm9yY2UnKTtcbiAgICB9XG5cbiAgICBhd2FpdCBydW5BbGxJblBvb2woXG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIFsuLi5maWxlTmFtZXNCeUtpbmRdLm1hcChcbiAgICAgICAgKFtraW5kLCBmaWxlTmFtZV0pID0+XG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQgYXMgS25vd25LaW5kLCBmaWxlTmFtZSlcbiAgICAgIClcbiAgICApO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZTogR2l0SHViIHJlcG9zaXRvcnkgbmFtZXMgYXJlLCBhbmQgYSByZW1vdGUgbWF5IHNwZWxsIHRoaXMgb25lIGFueSB3YXkuIEdldHRpbmcgaXQgd3JvbmdcbiAgLy8gbGV0cyB3YmZ5IHJld3JpdGUgdGhlIHJlcG9zaXRvcnkgdGhhdCBob3N0cyB0aGUgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gIHJldHVybiByZXBvc2l0b3J5Py50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBldmVyeSBqb2Igb2YgdGhlIHdvcmtmbG93IGZpbGUgY2FsbHMgdGhlIG5hbWVkIFdpbGxCb29zdGVyIHJldXNhYmxlIHdvcmtmbG93IChvd25lclxuICogcmVzdHJpY3RlZCB2aWEgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCkuIFVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgd2JmeSBvd25zIGEgZmlsZSBlbm91Z2ggdG9cbiAqIGRlbGV0ZSBpdDogdW5wYXJzYWJsZSBmaWxlcyBhbmQgZmlsZXMgd2l0aCBhbnkgb3RoZXIgam9iIHJldHVybiBmYWxzZSDigJQgZGVsZXRpbmcgYSB3aG9sZVxuICogd29ya2Zsb3cgb24gYSBsb29zZSBtYXRjaCB3b3VsZCBiZSB0b28gYWdncmVzc2l2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIHdvcmtmbG93TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghZmlsZU5hbWUuZW5kc1dpdGgoJy55bWwnKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGlzVGFyZ2V0Q2FsbCA9ICh1c2VzOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICAgIHR5cGVvZiB1c2VzID09PSAnc3RyaW5nJyAmJiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09IHdvcmtmbG93TmFtZTtcbiAgdHJ5IHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHlhbWwubG9hZChjb250ZW50KSBhcyBXb3JrZmxvdyB8IHVuZGVmaW5lZDtcbiAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qgam9icyA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3cuam9icyk7XG4gICAgICByZXR1cm4gam9icy5sZW5ndGggPiAwICYmIGpvYnMuZXZlcnkoKGpvYikgPT4gaXNUYXJnZXRDYWxsKGpvYj8udXNlcykpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gVW5wYXJzYWJsZSBjb250ZW50IGlzIG5vdCBwcm92YWJseSBhIGNhbGxlciBvZiB0aGUgbmFtZWQgd29ya2Zsb3cuXG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsXG4gIGtpbmQ6IEtub3duS2luZCxcbiAgZmlsZU5hbWUgPSBgJHtraW5kfS55bWxgXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWUgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpXG4gICAgPyAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ1xuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIEEgbm9uLWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sIGluIGEgcmVwbyB3aXRob3V0IFJ1c3QgY29kZSBtZXJlbHkgc2hhcmVzIHRoZSBuYW1lOyBsZWF2ZSBpdCBhbG9uZS5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnICYmIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBvbGRTZXR0aW5nczogV29ya2Zsb3c7XG4gICAgdHJ5IHtcbiAgICAgIG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQW4gZXhpc3Rpbmcgd29ya2Zsb3cgd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGUgdGVtcGxhdGVcbiAgICAgIC8vIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSByZXBvc2l0b3J5J3Mgd29ya2Zsb3cuXG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBZQU1MLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB5YW1sLmxvYWQgcmV0dXJucyB1bmRlZmluZWQgZm9yIGVtcHR5L2NvbW1lbnQtb25seSBmaWxlcyBhbmQgbm9uLW9iamVjdHMgZm9yIHNjYWxhclxuICAgIC8vIGRvY3VtZW50cyB3aXRob3V0IHRocm93aW5nOyBkZWVwbWVyZ2Ugd291bGQgY3Jhc2ggb24gdGhlbS5cbiAgICBpZiAodHlwZW9mIG9sZFNldHRpbmdzICE9PSAnb2JqZWN0JyB8fCBvbGRTZXR0aW5ncyA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSB3b3JrZmxvdy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfVxuXG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICAvLyBVbmxpa2UgdGhlIHJlbGVhc2UgY2FsbGVyLCB0aGUgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGlzIGludGVudGlvbmFsIGhlcmU6IGEgcGVuZGluZ1xuICAgICAgLy8gZGVwbG95IHRoYXQgaXMgY2FuY2VsbGVkIGFuZCByZXBsYWNlZCBieSBhIG5ld2VyIG9uZSBsb3NlcyBub3RoaW5nIOKAlCB0aGUgbmV3ZXIgZGVwbG95XG4gICAgICAvLyBjb252ZXJnZXMgdGhlIGVudmlyb25tZW50IHRvIHRoZSBsYXRlc3Qgc3RhdGUgYW55d2F5LlxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9IGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZTtcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBlbXB0eSBqb2JzIChhIGJhcmUgYGpvYk5hbWU6YCBwYXJzZXMgYXMgbnVsbCksIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3MsIGFuZCBvdGhlclxuICAgIC8vIG9yZ2FuaXphdGlvbnMnIHJldXNhYmxlIHdvcmtmbG93czogYSBzYW1lLW5hbWVkIGByZXVzYWJsZS13b3JrZmxvd3NgIHJlcG9zaXRvcnkgZWxzZXdoZXJlXG4gICAgLy8gZm9sbG93cyBhIGRpZmZlcmVudCBjb250cmFjdCwgYW5kIG5vcm1hbGl6aW5nIGl0cyBjYWxsZXJzIChzZWNyZXQgaW5qZWN0aW9uL3JlbW92YWwsXG4gICAgLy8gcGVybWlzc2lvbnMpIGNvdWxkIGJyZWFrIHRoZW0uXG4gICAgaWYgKCFqb2IgfHwgIXBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIC8vIERlcGxveSBjYWxsZXJzIG5lZWQgbm8gcmVwb3NpdG9yeSB3cml0ZXM6IHRoZSBjYWxsZWQgcmV1c2FibGUgd29ya2Zsb3cgaW5oZXJpdHMgdGhlIGNhbGxlcidzXG4gIC8vIHRva2VuIHBlcm1pc3Npb25zLCByZXBvc2l0b3JpZXMgZGVmYXVsdCB0aGUgdG9rZW4gdG8gd3JpdGUsIGFuZCB0aGUgcmV1c2FibGUgZGVwbG95IHdvcmtmbG93XG4gIC8vIGF0IG1haW4gcGVyZm9ybXMgbm8gR0lUSFVCX1RPS0VOIHdyaXRlcy4gVGhlIHJlYWQtb25seSBkZWZhdWx0IGlzIGluamVjdGVkIGF0IHRoZSBKT0IgbGV2ZWxcbiAgLy8gKGpvYiBwZXJtaXNzaW9ucyBkbyBub3QgYWZmZWN0IHNpYmxpbmcgam9icywgc28gaW5saW5lIGpvYnMgb3IgcGlubmVkIGNhbGxlZXMg4oCUIHdob3NlIHdyaXRlXG4gIC8vIG5lZWRzIGFyZSB1bmF1ZGl0ZWQg4oCUIGtlZXAgdGhlaXJzKSwgYW5kIG9ubHkgd2hlbiBuZWl0aGVyIHRoZSB3b3JrZmxvdyBub3IgdGhlIGpvYiBkZWNsYXJlc1xuICAvLyBpdHMgb3duIHBlcm1pc3Npb25zIChPSURDIGRlcGxveXMgYWx3YXlzIGRvLCBmb3IgaWQtdG9rZW4pLiBydW4tc2NyaXB0IGNhbGxlcnMgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJlY2F1c2UgYXJiaXRyYXJ5IHBhY2thZ2Ugc2NyaXB0cyBtYXkgcHVzaCBjb21taXRzLlxuICBpZiAoIW5ld1NldHRpbmdzLnBlcm1pc3Npb25zKSB7XG4gICAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2IpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2FsbCA9IHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpO1xuICAgICAgaWYgKCFqb2IucGVybWlzc2lvbnMgJiYgY2FsbD8ud29ya2Zsb3dOYW1lID09PSAnZGVwbG95JyAmJiBjYWxsLnJlZiA9PT0gJ21haW4nKSB7XG4gICAgICAgIGpvYi5wZXJtaXNzaW9ucyA9IHsgY29udGVudHM6ICdyZWFkJyB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6XG4gICAgY2FzZSAndGVzdC1ydXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgdGhlIGZvcmNlLXN5bmMgd29ya2Zsb3cgYmFzZWQgb24gdGhlIHN5bmMgd29ya2Zsb3cgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuLy8gd2IncyBnbG9iYWwgb3B0aW9ucyB0aGF0IGNvbnN1bWUgYSBmb2xsb3dpbmcgdmFsdWUgdG9rZW4gKGZyb20gc2hhcmVkT3B0aW9uc0J1aWxkZXIgcGx1c1xuLy8geWFyZ3NPcHRpb25zQnVpbGRlckZvckVudik7IGV2ZXJ5IG90aGVyIGAtYC1wcmVmaXhlZCB0b2tlbiBiZWZvcmUgdGhlIHN1YmNvbW1hbmQgaXMgYSBib29sZWFuLlxuY29uc3Qgd2JHbG9iYWxWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFsnLS13b3JraW5nLWRpcicsICctdycsICctLWVudicsICctLWNhc2NhZGUtZW52J10pO1xuXG4vLyBTdWJjb21tYW5kcyB0aGF0IHJ1biBhIEJJTkFSWSAoc28gdGhlIGZvbGxvd2luZyB0b2tlbiBjYW4gYmUgdGhlIHdiIGV4ZWN1dGFibGUpLCBwZXIgcnVubmVyOiBidW5cbi8vIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYSBwYWNrYWdlIHNjcmlwdCBvZiB0aGF0IG5hbWUpLCBucG0gaGFzIGBleGVjYC9geGAsXG4vLyBhbmQgcG5wbS95YXJuIChCZXJyeSkgaGF2ZSBgZXhlY2AvYGRseGAuXG5jb25zdCBydW5uZXJFeGVjdXRvclN1YmNvbW1hbmRzQnlSdW5uZXI6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHtcbiAgbnBtOiBuZXcgU2V0KFsnZXhlYycsICd4J10pLFxuICBwbnBtOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIHlhcm46IG5ldyBTZXQoWydleGVjJywgJ2RseCddKSxcbiAgYnVuOiBuZXcgU2V0KFsneCddKSxcbn07XG5cbi8vIFJ1bm5lciBvcHRpb25zIHRoYXQgY29uc3VtZSB0aGUgRk9MTE9XSU5HIHRva2VuIGFzIHRoZWlyIHZhbHVlLCBzbyBpdCBpcyBub3QgdGhlIHdiIGV4ZWN1dGFibGVcbi8vIChlLmcuIGBidW4gLS1jd2QgZGlyIHdiIGRlcGxveWAsIGBucHggLXAgcGtnIHdiIGRlcGxveWApLiBBIGNvbnNlcnZhdGl2ZSBzdXBlcnNldCBhY3Jvc3Ncbi8vIG5wbS9wbnBtL3lhcm4vYnVuIGFuZCB0aGUgbnB4L2J1bnggcGFja2FnZSBleGVjdXRvcnMuXG5jb25zdCBydW5uZXJWYWx1ZU9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgJy0tY3dkJyxcbiAgJy1DJyxcbiAgJy0tcHJlZml4JyxcbiAgJy0tZmlsdGVyJyxcbiAgJy1GJyxcbiAgJy0td29ya3NwYWNlJyxcbiAgJy13JyxcbiAgJy0tZGlyJyxcbiAgJy1wJyxcbiAgJy0tcGFja2FnZScsXG4gICctYycsXG4gICctLWNhbGwnLFxuXSk7XG5cbi8qKiBBZHZhbmNlIHBhc3QgYSBydW5uZXIncyBvcHRpb25zLCBjb25zdW1pbmcgYSBzZXBhcmF0ZSB2YWx1ZSB0b2tlbiB3aGVyZSBvbmUgYXBwbGllcy4gKi9cbmZ1bmN0aW9uIHNraXBSdW5uZXJPcHRpb25zKHRva2Vuczogc3RyaW5nW10sIHN0YXJ0SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgKHRva2Vuc1tpbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgaW5kZXgrKztcbiAgICBpZiAoIW9wdGlvbi5pbmNsdWRlcygnPScpICYmIHJ1bm5lclZhbHVlT3B0aW9ucy5oYXMob3B0aW9uKSAmJiBpbmRleCA8IHRva2Vucy5sZW5ndGgpIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZXBsb3kgc2NyaXB0IGludm9rZXMgYHdiIOKApiBkZXBsb3lgIGF0IGNvbW1hbmQgcG9zaXRpb24uIFBhY2thZ2UgcnVubmVycyBhbmQgZ2xvYmFsIHlhcmdzIG9wdGlvbnNcbiAqICh3aXRoIHRoZWlyIHZhbHVlIHRva2VucykgbWF5IHByZWNlZGUgdGhlIGRlcGxveSBjb21tYW5kLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdDogc3RyaW5nLCBzY3JpcHROYW1lczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBmb3IgKGNvbnN0IHRva2VucyBvZiAoYXdhaXQgcGFyc2VTaGVsbENvbW1hbmRzKGRlcGxveVNjcmlwdCkpID8/IFtdKSB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICAvLyBMZWFkaW5nIGxhdW5jaGVycyBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgZW52YCAod2l0aCBvcHRpb25zICsgS0VZPXZhbHVlIGFzc2lnbm1lbnRzKVxuICAgIC8vIGFuZCB0aGUgUE9TSVggYGNvbW1hbmRgIGJ1aWx0aW4gKHdpdGggaXRzIGAtcGAvYC12YC9gLVZgIG9wdGlvbnMpLiBPdGhlciBsYXVuY2hlcnMgKGB0aW1lYCxcbiAgICAvLyBgZXhlY2AsIOKApikgYXJlIE5PVCBtb2RlbGVkOiB0aGV5IGxlYXZlIGEgbm9uLWB3YmAgZmlyc3QgdG9rZW4sIHNvIHRoZSBjb21tYW5kIHNpbXBseSBkb2VzXG4gICAgLy8gbm90IG1hdGNoLiBUaGlzIGlzIGEgZGVsaWJlcmF0ZSBmYWxzZS1uZWdhdGl2ZSBmb3IgZ2VuZXJhdGVkIGd1aWRhbmNlLlxuICAgIGlmICh0b2tlbnNbaW5kZXhdID09PSAnZW52Jykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgICBpZiAoL15bQS1aYS16X11bQS1aYS16MC05X10qPS91LnRlc3QodG9rZW4pKSBpbmRleCsrO1xuICAgICAgICAvLyBlbnYncyBkaXJlY3RvcnkgdmFsdWUgbWF5IGJlIHNlcGFyYXRlIG9yIGF0dGFjaGVkIChgLUNkaXJgLCBgLS1jaGRpcj1kaXJgKS4gSXQgY2hhbmdlc1xuICAgICAgICAvLyB3aGVyZSB3YiBydW5zIGJ1dCBub3Qgd2hldGhlciB0aGUgY29tbWFuZCBpbnZva2VzIHdiIGRlcGxveS5cbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09ICctQycgfHwgdG9rZW4gPT09ICctLWNoZGlyJykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLUMnKSB8fCB0b2tlbi5zdGFydHNXaXRoKCctLWNoZGlyPScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGlmICh0b2tlbiA9PT0gJy11JykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBgY29tbWFuZCBDTURgIGV4ZWN1dGVzIENNRCwgYnV0IGBjb21tYW5kIC12YC9gLVYgQ01EYCBvbmx5IFFVRVJZIGl0cyBhdmFpbGFiaWxpdHkgd2l0aG91dFxuICAgIC8vIHJ1bm5pbmcgaXQsIHNvIGEgZGVwbG95IGJlaGluZCB0aGVtIGRvZXMgbm90IHJ1bi4gVGhlIGB2YC9gVmAgZmxhZyBtYXkgYmUgY2x1c3RlcmVkIHdpdGhcbiAgICAvLyBvdGhlciBvcHRpb24gbGV0dGVycyAoYGNvbW1hbmQgLXB2IHdiYCksIHNvIG1hdGNoIGFueSBvcHRpb24gbGV0dGVyIGNsdXN0ZXIgY29udGFpbmluZyBpdC5cbiAgICB3aGlsZSAodG9rZW5zW2luZGV4XSA9PT0gJ2NvbW1hbmQnKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgbGV0IHF1ZXJpZXNPbmx5ID0gZmFsc2U7XG4gICAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgaWYgKC9eLVtBLVphLXpdKlt2Vl1bQS1aYS16XSokL3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgcXVlcmllc09ubHkgPSB0cnVlO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHF1ZXJpZXNPbmx5KSB7XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSBjb250aW51ZTtcbiAgICAvLyBSZXNvbHZlIGEgcnVubmVyIHByZWZpeCB0byB3aGV0aGVyIHRoZSBmb2xsb3dpbmcgdG9rZW4gaXMgYSBCSU5BUlkgKHRoZSB3YiBleGVjdXRhYmxlKSBvciBhXG4gICAgLy8gcGFja2FnZSBTQ1JJUFQgbmFtZS4gYGJ1bnhgL2BucHhgIGFuZCBgPHBtPiB4fGRseHxleGVjYCBydW4gYSBiaW5hcnk7IGA8cG0+IHJ1bnxydW4tc2NyaXB0YFxuICAgIC8vIChhbmQgYmFyZSBgbnBtIDxuYW1lPmAsIG9yIGFueSBydW5uZXIgZm9sbG93ZWQgYnkgYC0tYCkgcnVuIGEgcGFja2FnZSBzY3JpcHQg4oCUIHNvXG4gICAgLy8gYG5wbSBydW4gd2IgZGVwbG95YCBleGVjdXRlcyB0aGUgc2NyaXB0IG5hbWVkIGB3YmAsIG5vdCB0aGUgd2IgYmluYXJ5LCBhbmQgbXVzdCBiZSByZWplY3RlZC5cbiAgICBpZiAoWyducG0nLCAncG5wbScsICd5YXJuJywgJ2J1biddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBjb25zdCBydW5uZXIgPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgaW5kZXggPSBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnMsIGluZGV4ICsgMSk7XG4gICAgICBjb25zdCBzdWJjb21tYW5kID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgIGlmIChbJ3J1bicsICdydW4tc2NyaXB0J10uaW5jbHVkZXMoc3ViY29tbWFuZCkpIGNvbnRpbnVlOyAvLyBydW5zIGEgcGFja2FnZSBzY3JpcHQsIG5vdCB3YlxuICAgICAgLy8gRXhlY3V0b3Igc3ViY29tbWFuZHMgYXJlIHJ1bm5lci1TUEVDSUZJQzogYnVuIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYVxuICAgICAgLy8gcGFja2FnZSBzY3JpcHQgbmFtZWQgZGx4L2V4ZWMpLiBSZWFsIGJ1aWx0LWluIGV4ZWN1dG9ycyAoYGV4ZWNgL2B4YCwgYW5kIGBkbHhgIGZvciBwbnBtKVxuICAgICAgLy8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgYSBzYW1lLW5hbWVkIHNjcmlwdCwgc28gdGhleSBhcmUgTk9UIHNoYWRvdy1jaGVja2VkLiBPbmx5IGB5YXJuIGRseGAgaXNcbiAgICAgIC8vIGFtYmlndW91cyDigJQgYSBCZXJyeSBidWlsdC1pbiBidXQgYSBwYWNrYWdlIFNDUklQVCBpbiBZYXJuIENsYXNzaWMg4oCUIHNvIGEgZGVjbGFyZWQgYGRseGBcbiAgICAgIC8vIHNjcmlwdCBtYWtlcyBgeWFybiBkbHhgIGRlY2xpbmUgKGZhbGwgdGhyb3VnaCB0byB0aGUgcGFja2FnZS1zY3JpcHQgY2hlY2tzKS5cbiAgICAgIGNvbnN0IGlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQgPSBydW5uZXIgPT09ICd5YXJuJyAmJiBzdWJjb21tYW5kID09PSAnZGx4JyAmJiBzY3JpcHROYW1lcy5oYXMoJ2RseCcpO1xuICAgICAgaWYgKHJ1bm5lckV4ZWN1dG9yU3ViY29tbWFuZHNCeVJ1bm5lcltydW5uZXJdPy5oYXMoc3ViY29tbWFuZCkgJiYgIWlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQpIHtcbiAgICAgICAgaW5kZXgrKzsgLy8gYmluYXJ5IHJ1bm5lciAocG5wbSBkbHgsIGJ1biB4LCBgbnBtIGV4ZWMgLS0gd2Ig4oCmYClcbiAgICAgICAgaWYgKHRva2Vuc1tpbmRleF0gPT09ICctLScpIGluZGV4Kys7IC8vIHRoZSBleGVjdXRvcidzIG9wdGlvbmFsIGAtLWAgYmVmb3JlIHRoZSBjb21tYW5kXG4gICAgICB9IGVsc2UgaWYgKHJ1bm5lciA9PT0gJ25wbScpIHtcbiAgICAgICAgY29udGludWU7IC8vIGJhcmUgYG5wbSB3YmAgbmV2ZXIgcnVucyBhIGJpbmFyeVxuICAgICAgfSBlbHNlIGlmICh0b2tlbnNbaW5kZXhdID09PSAnd2InICYmIHNjcmlwdE5hbWVzLmhhcygnd2InKSkge1xuICAgICAgICAvLyBCYXJlIGBidW4vcG5wbS95YXJuIHdiYCBydW5zIGEgcGFja2FnZSBTQ1JJUFQgbmFtZWQgYHdiYCB3aGVuIG9uZSBleGlzdHMgKHBhc3NpbmcgYGRlcGxveWBcbiAgICAgICAgLy8gYXMgaXRzIGFyZ3VtZW50KSwgbm90IHRoZSB3YiBiaW5hcnkuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoWydidW54JywgJ25weCddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBpbmRleCA9IHNraXBSdW5uZXJPcHRpb25zKHRva2VucywgaW5kZXggKyAxKTtcbiAgICB9XG4gICAgaWYgKHRva2Vuc1tpbmRleF0gIT09ICd3YicpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHdiQXJncyA9IHRva2Vucy5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIFNraXAgZ2xvYmFsIG9wdGlvbnMgKGFuZCBhbnkgdmFsdWUgdG9rZW4gYSB2YWx1ZS1iZWFyaW5nIG9wdGlvbiBjb25zdW1lcykgc28gdGhlIEZJUlNUXG4gICAgLy8gY29tbWFuZCB0b2tlbiBkZWNpZGVzOiBgd2IgLS1jYXNjYWRlLWVudiBwcm9kdWN0aW9uIGRlcGxveWAgYW5kIGB3YiAtdyBwYWNrYWdlcy9hcGkgZGVwbG95YFxuICAgIC8vIG1hdGNoLCB3aGlsZSBzdWJjb21tYW5kcyBvd25pbmcgdGhlaXIgb3duIGBkZXBsb3lgIChgd2IgcHJpc21hIGRlcGxveWAsIGB3YiByZXRyeSBkZXBsb3lgKVxuICAgIC8vIGRvIG5vdC4gYC0tb3B0PXZhbHVlYCBjYXJyaWVzIGl0cyB2YWx1ZSBpbmxpbmUsIHNvIG9ubHkgdGhlIHNwYWNlLXNlcGFyYXRlZCBmb3JtIHNraXBzIG9uZS5cbiAgICBsZXQgY29tbWFuZEluZGV4ID0gMDtcbiAgICB3aGlsZSAoY29tbWFuZEluZGV4IDwgd2JBcmdzLmxlbmd0aCAmJiAod2JBcmdzW2NvbW1hbmRJbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc3QgZmxhZyA9IHdiQXJnc1tjb21tYW5kSW5kZXhdID8/ICcnO1xuICAgICAgY29tbWFuZEluZGV4Kys7XG4gICAgICBpZiAod2JHbG9iYWxWYWx1ZU9wdGlvbnMuaGFzKGZsYWcpICYmIGNvbW1hbmRJbmRleCA8IHdiQXJncy5sZW5ndGgpIGNvbW1hbmRJbmRleCsrO1xuICAgIH1cbiAgICBpZiAod2JBcmdzW2NvbW1hbmRJbmRleF0gIT09ICdkZXBsb3knKSBjb250aW51ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgd29ya2Zsb3dzIGRpcmVjdG9yeSBob2xkcyBhIGxpdmUgY2FsbGVyIG9mIHRoZSByZXVzYWJsZSBDbG91ZGZsYXJlIGRlcGxveSB3b3JrZmxvdy5cbiAqIFlBTUwgaXMgcGFyc2VkIGFuZCBvbmx5IGBqb2JzLioudXNlc2AgdmFsdWVzIGFyZSBpbnNwZWN0ZWQgKGEgcmF3LXRleHQgc2VhcmNoIHdvdWxkIG1hdGNoXG4gKiBjb21tZW50cyBvciBgcnVuOmAgc3RyaW5ncyksIHdpdGggYSBgZGVwbG95KmAtZmlsZW5hbWUgc2hvcnRjdXQgYW5kIGEgY29uc2VydmF0aXZlIHJhdy10ZXh0XG4gKiBmYWxsYmFjayBmb3IgdW5wYXJzZWFibGUgZmlsZXMuIFVzZWQgYnkgdGhlIGFnZW50LWluc3RydWN0aW9uIGdlbmVyYXRvciBzbyBnZW5lcmF0ZWQgZ3VpZGFuY2VcbiAqIGRlc2NyaWJlcyBvbmx5IHdvcmtmbG93cyB0aGF0IGV4aXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ2xvdWRmbGFyZURlcGxveVdvcmtmbG93KHdvcmtmbG93c0RpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgZW50cmllczogZnMuRGlyZW50W107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENhc2UtaW5zZW5zaXRpdmUgb3duZXIvcmVwb3NpdG9yeSAoR2l0SHViIHRyZWF0cyB0aGVtIHNvKSwgY2FzZS1zZW5zaXRpdmUgcGF0aC9yZWYg4oCUIG1hdGNoaW5nXG4gIC8vIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwsIHVzZWQgZm9yIHRoZSB1bnBhcnNlYWJsZS1ZQU1MIHJhdy10ZXh0IGZhbGxiYWNrIG9ubHkuXG4gIGNvbnN0IGRlcGxveUNhbGxQYXR0ZXJuID0gL1teL10rXFwvcmV1c2FibGUtd29ya2Zsb3dzXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvZGVwbG95XFwueWE/bWxAL2l1O1xuICBjb25zdCBjYWxsc0RlcGxveVdvcmtmbG93ID0gKHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgICBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09ICdkZXBsb3knO1xuICByZXR1cm4gZW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIS9cXC55YT9tbCQvdS50ZXN0KGVudHJ5Lm5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIHJldHVybiB0cnVlO1xuICAgIGxldCBjb250ZW50OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c0RpclBhdGgsIGVudHJ5Lm5hbWUpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh3b3JrZmxvdy5qb2JzKS5zb21lKChqb2IpID0+IGNhbGxzRGVwbG95V29ya2Zsb3coam9iPy51c2VzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGVwbG95Q2FsbFBhdHRlcm4udGVzdChjb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBUaGUgcmV1c2FibGUgd29ya2Zsb3dzIHRoYXQgZGVjbGFyZSBGTk9YX0FHRV9LRVkgYW5kIFZFUkRBQ0NJT19UT0tFTiB1bmRlclxuLy8gb24ud29ya2Zsb3dfY2FsbC5zZWNyZXRzIChzZWUgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzKS4gUGFzc2luZyBlaXRoZXIgc2VjcmV0IHRvIGFueVxuLy8gb3RoZXIgY2FsbGVlIGlzIGEgR2l0SHViIGVycm9yLlxuY29uc3QgaW5zdGFsbENhcGFibGVSZXVzYWJsZVdvcmtmbG93cyA9IG5ldyBTZXQoWydkZXBsb3knLCAncmVsZWFzZScsICdydW4tc2NyaXB0JywgJ3Rlc3QnXSk7XG5jb25zdCByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICAvLyBza2lwLWR1cGxpY2F0ZS1hY3Rpb25zIHJlYWRzIHdvcmtmbG93IHJ1bnM7IGNhbmNlbF9vdGhlcnMgaXMgZmFsc2UsIHNvIHJlYWQgaXMgZW5vdWdoLlxuICAndGVzdC1ydXN0JzogeyBhY3Rpb25zOiAncmVhZCcsIGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgJ3NlbWFudGljLXByJzogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3dyaXRlJyB9LFxufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIC8vIGBzZWNyZXRzOiBpbmhlcml0YCAocGFyc2VkIGJ5IGpzLXlhbWwgYXMgYSBwbGFpbiBzdHJpbmcpIGFscmVhZHkgZm9yd2FyZHMgZXZlcnkgY2FsbGVyIHNlY3JldFxuICAvLyBpbmNsdWRpbmcgdGhlIG9uZXMgaW5qZWN0ZWQgYmVsb3csIHNvIHByZXNlcnZlIGl0IHVudG91Y2hlZCDigJQgcHJvcGVydHkgYXNzaWdubWVudHMgb24gdGhlXG4gIC8vIHN0cmluZyB3b3VsZCB0aHJvdy4gQ2F2ZWF0OiBgaW5oZXJpdGAgZm9yd2FyZHMgc2VjcmV0cyB1bmRlciB0aGVpciBleGlzdGluZyBOQU1FUywgc28gaXQgY2FuXG4gIC8vIG5ldmVyIGZlZWQgUFVCTElDX0ZOT1hfQUdFX0tFWSBpbnRvIHRoZSBjYWxsZWUncyBkZWNsYXJlZCBGTk9YX0FHRV9LRVk7IGEgaGFuZC13cml0dGVuXG4gIC8vIGluaGVyaXQgY2FsbGVyIGluIGEgUFVCTElDIGZub3ggcmVwb3NpdG9yeSBtdXN0IGJlIGNvbnZlcnRlZCB0byBhbiBleHBsaWNpdCBtYXBwaW5nIG1hbnVhbGx5XG4gIC8vICh3YmZ5IG5ldmVyIGdlbmVyYXRlcyB0aGUgaW5oZXJpdCBmb3JtLCBhbmQgaGFuZC13cml0dGVuIGRldmlhdGlvbnMgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbiAgLy8gcmVwb3NpdG9yeSBieSBwb2xpY3kpLlxuICBjb25zdCBzZWNyZXRzID0gam9iLnNlY3JldHMgPT09ICdpbmhlcml0JyA/IHVuZGVmaW5lZCA6IChqb2Iuc2VjcmV0cyA9IGpvYi5zZWNyZXRzID8/IHt9KTtcblxuICBpZiAoc2VjcmV0cyAmJiAoa2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICdyZWxlYXNlJykpIHtcbiAgICBzZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBmbm94LnRvbWwgY2FycmllcyBhZ2UtZW5jcnlwdGVkIGFwcCBzZWNyZXRzOyBDSSBkZWNyeXB0cyB0aGVtIHdpdGggdGhlIEZOT1hfQUdFX0tFWSAob3IsIGZvclxuICAvLyBwdWJsaWMgcmVwb3NpdG9yaWVzLCBQVUJMSUNfRk5PWF9BR0VfS0VZKSBvcmdhbml6YXRpb24gc2VjcmV0LlxuICAvLyBLZXkgdGhlIGluamVjdGlvbiBvbiB0aGUgKmNhbGxlZCogcmV1c2FibGUgd29ya2Zsb3csIG5vdCB0aGUgY2FsbGVyJ3MgZmlsZW5hbWU6IGNhbGxlcnMgbWF5IGhhdmVcbiAgLy8gYXJiaXRyYXJ5IG5hbWVzIChlLmcuIHNjaGVkdWxlZCBydW4tc2NyaXB0IGNhbGxlcnMpLCBhbmQgR2l0SHViIHJlamVjdHMgcGFzc2luZyBhIHNlY3JldCB0aGF0IHRoZVxuICAvLyBjYWxsZWUgZG9lcyBub3QgZGVjbGFyZS5cbiAgLy8gT25seSBhbiBAbWFpbiBjYWxsZWUgaXMga25vd24gdG8gZm9sbG93IHRoZSBjdXJyZW50IHNlY3JldCBjb250cmFjdDogYSB3b3JrZmxvdyBwaW5uZWQgdG8gYW5cbiAgLy8gb2xkZXIgdGFnIG9yIFNIQSBtYXkgc3RpbGwgZGVjbGFyZSBOUE1fVE9LRU4gKGFuZCBub3QgVkVSREFDQ0lPX1RPS0VOKSwgYW5kIEdpdEh1YiByZWplY3RzIGFcbiAgLy8gY2FsbGVyIHdob3NlIHNlY3JldHMgZG8gbm90IG1hdGNoIHRoZSBzZWxlY3RlZCByZXZpc2lvbidzIGRlY2xhcmF0aW9ucywgc28gcGlubmVkIGNhbGxlcnMga2VlcFxuICAvLyB0aGVpciBzZWNyZXRzIHVudG91Y2hlZC5cbiAgY29uc3Qgb3JnV29ya2Zsb3dDYWxsID0gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChqb2IudXNlcyk7XG4gIGNvbnN0IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPSBvcmdXb3JrZmxvd0NhbGw/LnJlZiA9PT0gJ21haW4nID8gb3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVxdWlyZWRQZXJtaXNzaW9ucyA9IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPyByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnNbY2FsbGVkUmV1c2FibGVXb3JrZmxvd10gOiB1bmRlZmluZWQ7XG4gIGlmIChyZXF1aXJlZFBlcm1pc3Npb25zKSBqb2IucGVybWlzc2lvbnMgPSB7IC4uLnJlcXVpcmVkUGVybWlzc2lvbnMgfTtcbiAgaWYgKHNlY3JldHMgJiYgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyAmJiBpbnN0YWxsQ2FwYWJsZVJldXNhYmxlV29ya2Zsb3dzLmhhcyhjYWxsZWRSZXVzYWJsZVdvcmtmbG93KSkge1xuICAgIC8vIFRoZSBjYWxsZWUgcm91dGVzIHB1YmxpYyAoZGVmYXVsdC1yZWdpc3RyeSkgaW5zdGFsbHMgdGhyb3VnaCB0aGUgVGFrdW1pIEd1YXJkXG4gICAgLy8gbWFsaWNpb3VzLXBhY2thZ2UtYmxvY2tpbmcgcHJveHkgd2hlbiB0aGlzIHRva2VuIHJlc29sdmVzOyBhbiB1bnNldCBvcmdhbml6YXRpb24gc2VjcmV0XG4gICAgLy8gZXhwYW5kcyB0byAnJyBhbmQgdGhlIGNhbGxlZSB0cmVhdHMgdGhhdCBhcyBcImZlYXR1cmUgb2ZmXCIsIHNvIHBhc3NpbmcgaXQgaXMgYWx3YXlzIHNhZmUuXG4gICAgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gPSAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JztcbiAgICAvLyBUaGUgY2FsbGVlIGdlbmVyYXRlcyB0aGUgd29ya3NwYWNlIC5ucG1yYyBmb3IgQHdpbGxib29zdGVyLXByaXZhdGUvKiBmcm9tIFZFUkRBQ0NJT19UT0tFTlxuICAgIC8vIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4gT25seSByZXBvc2l0b3JpZXMgdGhhdCBhY3R1YWxseSByZXNvbHZlIHByaXZhdGUgcGFja2FnZXNcbiAgICAvLyAob3IgcHVibGlzaCB0byBWZXJkYWNjaW8pIGdldCB0aGUgcGFzcy10aHJvdWdoOiBldmVyeXdoZXJlIGVsc2UgdGhlIGNyZWRlbnRpYWwgd291bGQgZmxvd1xuICAgIC8vIGludG8gQ0kgcnVucyB0aGF0IG5ldmVyIHVzZSBpdCwgc28gdGhlIGxpbmUgaXMgcmVtb3ZlZCBpbnN0ZWFkLiBUaGUgR2l0SHViIHNlY3JldCBpdHNlbGYgaXNcbiAgICAvLyBhbHdheXMgcmVnaXN0ZXJlZCBtYW51YWxseSBhbmQgc3RheXMgcmVnaXN0ZXJlZCBlaXRoZXIgd2F5LlxuICAgIGlmIChyZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMoY29uZmlnKSkge1xuICAgICAgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gPSAnJHt7IHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOIH19JztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIFB1YmxpYyByZXBvc2l0b3JpZXMgY29tbWl0IHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzLCBzbyB0aGV5IGRlY3J5cHQgd2l0aCBhIGRlZGljYXRlZFxuICAgICAgLy8gQ0kgaWRlbnRpdHkgKHRoZSBQVUJMSUNfRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQpIGluc3RlYWQgb2YgdGhlIG9yZy1pbnRlcm5hbFxuICAgICAgLy8gb25lOyB0aGUgY2FsbGVlIHN0aWxsIHJlY2VpdmVzIGl0IHVuZGVyIGl0cyBkZWNsYXJlZCBGTk9YX0FHRV9LRVkgbmFtZS4gV2hlbiBubyBDSVxuICAgICAgLy8gaWRlbnRpdHkgcmVzb2x2ZXMgKHNlZSBmbm94QWdlS2V5TWFwcGluZyksIGxlYXZlIGFueSBleGlzdGluZyBtYXBwaW5nIHVudG91Y2hlZCBhbmQgYWRkXG4gICAgICAvLyBub25lOiBjcmVhdGluZyBvciByZXdyaXRpbmcgb25lIG9uIGluY29tcGxldGUgaW5mb3JtYXRpb24gd291bGQgbWFwIGEgcG9zc2libHktcHVibGljXG4gICAgICAvLyByZXBvc2l0b3J5IHRvIHRoZSB3cm9uZyBpZGVudGl0eSwgYW5kIGEgZm5veCByZWNpcGllbnQgc3luYyBmYWlsdXJlIGRvZXMgbm90IHN0b3AgdGhpc1xuICAgICAgLy8gZ2VuZXJhdG9yIGZyb20gd3JpdGluZyBmaWxlcyDigJQgdGhlIGZhaWxlZCBydW4ncyByZXJ1biBmaWxscyB0aGUgbWFwcGluZyBpbi5cbiAgICAgIGNvbnN0IG1hcHBpbmcgPSBmbm94QWdlS2V5TWFwcGluZyhjb25maWcpO1xuICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgc2VjcmV0cy5GTk9YX0FHRV9LRVkgPSBtYXBwaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcpIHtcbiAgICBjb25zdCBbcnVzdERpclBhdGhdID0gY29uZmlnLmNhcmdvVG9tbERpclBhdGhzO1xuICAgIGlmIChydXN0RGlyUGF0aCAmJiBydXN0RGlyUGF0aCAhPT0gJy4nKSB7XG4gICAgICBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeSA9IHJ1c3REaXJQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLndpdGgud29ya2luZ19kaXJlY3Rvcnk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVjb25zdHJ1Y3QgZnJvbSB0aGUgcGFyc2VkIGNhbGwgc28gYSBkaWZmZXJlbnRseSBjYXNlZCBvd25lciAoR2l0SHViIGlzIGNhc2UtaW5zZW5zaXRpdmVcbiAgLy8gdGhlcmUpIGlzIGFsc28gbm9ybWFsaXplZCB0byB0aGUgcmVwb3NpdG9yeSdzIG93biBvcmdhbml6YXRpb24gLyBtaXJyb3IuXG4gIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH0gZWxzZSBpZiAob3JnV29ya2Zsb3dDYWxsICYmIGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGBXaWxsQm9vc3RlckxhYi9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvJHtvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lfS4ke29yZ1dvcmtmbG93Q2FsbC5leHRlbnNpb259QCR7b3JnV29ya2Zsb3dDYWxsLnJlZn1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIGNvbnN0IGFjY2VwdHNSdW5uZXJJbnB1dCA9IFsndGVzdCcsICd0ZXN0LXJ1c3QnLCAnZGVwbG95JywgJ3JlbGVhc2UnLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKFxuICAgIG9yZ1dvcmtmbG93Q2FsbD8ud29ya2Zsb3dOYW1lID8/ICcnXG4gICk7XG4gIGlmIChjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWNjZXB0c1J1bm5lcklucHV0KSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIGpvYi53aXRoLnJ1bnNfb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbGFiZWxzID0gelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLnRyYW5zZm9ybSgodmFsdWUsIGN0eCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgdW5rbm93bjtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7IGNvZGU6ICdjdXN0b20nLCBtZXNzYWdlOiAnRXhwZWN0ZWQgSlNPTiBydW5uZXIgbGFiZWxzJyB9KTtcbiAgICAgICAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoei5hcnJheSh6LnN0cmluZygpKSlcbiAgICAgICAgLnNhZmVQYXJzZShqb2Iud2l0aC5ydW5zX29uKTtcbiAgICAgIGlmIChsYWJlbHMuc3VjY2VzcyAmJiBsYWJlbHMuZGF0YS5pbmNsdWRlcygnc2VsZi1ob3N0ZWQnKSkge1xuICAgICAgICBqb2Iud2l0aC5ydW5zX29uID0gSlNPTi5zdHJpbmdpZnkobGFiZWxzLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZW1vdmVkIHJ1bnNfb24gZnJvbSAke2pvYi51c2VzfTogcHJpdmF0ZSByZXBvc2l0b3JpZXMgcmVxdWlyZSBhIHNlbGYtaG9zdGVkIGxhYmVsIGFycmF5LmApO1xuICAgICAgICBkZWxldGUgam9iLndpdGgucnVuc19vbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChzZWNyZXRzKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhzZWNyZXRzKTtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzZWNyZXQgZXhwcmVzc2lvbiB0aGUgY2FsbGVyIG1hcHMgaW50byB0aGUgY2FsbGVlJ3MgZGVjbGFyZWQgRk5PWF9BR0VfS0VZLCBvciB1bmRlZmluZWRcbiAqIHdoZW4gdGhlIHJlcG9zaXRvcnkgc3RhdGUgZG9lcyBub3QgaWRlbnRpZnkgYSB1c2FibGUgQ0kgaWRlbnRpdHkg4oCUIGFuIHVua25vd24gdmlzaWJpbGl0eSwgYVxuICogcmVwb3NpdG9yeSBubyBDSSBzY29wZSBjb3ZlcnMgKGRlcml2aW5nIGZyb20gdGhlIHNhbWUgcHJpbmNpcGFsIHJvc3RlciBhcyB0aGUgcmVjaXBpZW50IHN5bmNcbiAqIGtlZXBzIHRoZSB0d28gZnJvbSBldmVyIGRpc2FncmVlaW5nKSwgb3IgYSBmYWlsZWQgZm5veCByZWNpcGllbnQgc3luYywgd2hvc2UgY2lwaGVydGV4dHMgbWF5XG4gKiBzdGlsbCB0YXJnZXQgdGhlIHByZXZpb3VzIGlkZW50aXR5LiBUaGUgY2FsbGVyIG11c3QgdGhlbiBwcmVzZXJ2ZSBhbnkgZXhpc3RpbmcgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gZm5veEFnZUtleU1hcHBpbmcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duIHx8IGhhc0Zub3hTeW5jRmFpbGVkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShjb25maWcpO1xuICByZXR1cm4gc2VjcmV0TmFtZSAmJiBgXFwke3sgc2VjcmV0cy4ke3NlY3JldE5hbWV9IH19YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBIHBlcm1pc3Npb25zIG9iamVjdCBlbXB0aWVkIGJ5IHRoZSBwZXIta2luZCBkZWxldGlvbnMgKGUuZy4gYW4gZXhpc3RpbmcgdGVzdC1ydXN0IGNhbGxlclxuICAvLyB3aG9zZSBvbmx5IGVudHJ5IHdhcyBgYWN0aW9uc2ApIG11c3QgYmUgZHJvcHBlZCBlbnRpcmVseTogYHBlcm1pc3Npb25zOiB7fWAgc3RyaXBzIEVWRVJZXG4gIC8vIHRva2VuIHBlcm1pc3Npb24gZnJvbSB0aGUgd29ya2Zsb3csIHVubGlrZSB0aGUgYWJzZW50IGtleSB3aGljaCBrZWVwcyB0aGUgZGVmYXVsdHMuXG4gIGlmIChuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyAmJiBPYmplY3Qua2V5cyhuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zO1xuICB9XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJ1bkFsbEluUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZURpclBhdHRlcm5zIH0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICAvLyBmaXhUeXBvcyBydW5zIG9uY2Ugb24gdGhlIHJvb3QgY29uZmlnLCBzbyB0aGlzIGdsb2Igc2V0IG11c3QgY292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlXG4gICAgLy8gbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3Rvcnkg4oCUIHdoaWxlIGhvbm9yaW5nXG4gICAgLy8gZGVjbGFyZWQgbmVnYXRpb25zIChlLmcuIGAhYXBwcy9leGNsdWRlZGApLCB3aG9zZSBzb3VyY2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbW9ub3JlcG8uXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0dGVybnMgPSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhwYWNrYWdlQ29uZmlnKTtcbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuaW5jbHVkZXMubWFwKFxuICAgICAgICAgIChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fWBcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5leGNsdWRlcy5tYXAoKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqYCldLFxuICAgICAgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcnVuQWxsSW5Qb29sKFtcbiAgICAgIC4uLmRvY0ZpbGVzLm1hcCgoZmlsZSkgPT4gZml4RmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSksIGZpeFR5cG9zSW5UZXh0LCBwYWNrYWdlQ29uZmlnLCAnZG9jJykpLFxuICAgICAgLi4udHNGaWxlcy5tYXAoKGZpbGUpID0+IGZpeEZpbGUocGF0aC5qb2luKGRpclBhdGgsIGZpbGUpLCBmaXhUeXBvc0luQ29kZSwgcGFja2FnZUNvbmZpZywgJ3RzJykpLFxuICAgICAgLi4udGV4dEJhc2VkRmlsZXMubWFwKChmaWxlKSA9PiBmaXhGaWxlKHBhdGguam9pbihkaXJQYXRoLCBmaWxlKSwgZml4VHlwb3NJblRleHQsIHBhY2thZ2VDb25maWcsICd0ZXh0JykpLFxuICAgIF0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZml4RmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZml4VHlwb3M6IChjb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0J1xuKTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKGZpeFR5cG9zKGNvbnRlbnQpLCBwYWNrYWdlQ29uZmlnLCBwcm9wTmFtZSk7XG4gICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50XG4gICAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgICAvLyBUaGUgd29yZCBib3VuZGFyeSBhbmQgdHJhaWxpbmctd2hpdGVzcGFjZSBndWFyZCBrZWVwIHdvcmRzIG1lcmVseSBlbmRpbmcgaW4gdGhlXG4gICAgICAvLyBhYmJyZXZpYXRpb24gbGV0dGVycyAoZS5nLiBcImNvb2tpZS5cIiwgXCJsZWcuXCIpIGludGFjdC5cbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnJDEvLyQyY2YuJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJlZ1xcLig/PVxcc3wkKS9nLCAnJDEvLyQyZS5nLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiaWVcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmkuZS4nKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgLy8gVGhlIGRvdCBtdXN0IGJlIGVzY2FwZWQ6IGFuIHVuZXNjYXBlZCBgLmAgbWF0Y2hlcyBBTlkgY2hhcmFjdGVyLCBzbyBgbGVnaXRgIGxvc3QgaXRzIGBsYCBhbmQgYGVgLlxuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC9cXC5naXQkL3UsICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICByZXR1cm4gc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgc3RhdHVzID09PSA0MDQ7XG59XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICAvLyBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHNvIGNyZWRlbnRpYWwgc2VsZWN0aW9uIChhbmQgdGhlIGNhY2hlIGtleSkgbXVzdFxuICAvLyBub3QgZGVwZW5kIG9uIGhvdyBhIHJlbW90ZSBVUkwgaGFwcGVucyB0byBzcGVsbCB0aGUgb3JnYW5pemF0aW9uLlxuICBjb25zdCBrZXkgPSBvd25lcj8udG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG9uIHB1cnBvc2U6IGEgbm9uY2Fub25pY2FsbHkgY2FzZWQgcmVtb3RlIChlLmcuIGdpdGh1Yi5jb20vd2lsbGJvb3N0ZXJsYWIv4oCmKVxuICAvLyBtdXN0IHN0aWxsIHNlbGVjdCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIFBBVCDigJQgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIGJyYW5jaCB3b3VsZFxuICAvLyBwcmVmZXIgdGhlIE9USEVSIG9yZ2FuaXphdGlvbidzIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgdGhpcyBvcmdhbml6YXRpb24ncyBwcml2YXRlXG4gIC8vIHJlcG9zaXRvcmllcy5cbiAgY29uc3Qgbm9ybWFsaXplZE93bmVyID0gb3duZXI/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChub3JtYWxpemVkT3duZXIgPT09ICd3aWxsYm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXJsYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IGFwcGx5RWRpdHMsIGNyZWF0ZVNjYW5uZXIsIGZpbmROb2RlQXRMb2NhdGlvbiwgbW9kaWZ5LCBwYXJzZSBhcyBwYXJzZUpzb25jLCBwYXJzZVRyZWUgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG4vLyBqc29uYy1wYXJzZXIgZGVjbGFyZXMgU3ludGF4S2luZC9TY2FuRXJyb3IgYXMgYW1iaWVudCBjb25zdCBlbnVtcywgd2hpY2ggY2Fubm90IGJlIGltcG9ydGVkXG4vLyB1bmRlciB2ZXJiYXRpbU1vZHVsZVN5bnRheDsgbWlycm9yIHRoZSBuZWVkZWQgbWVtYmVyIHZhbHVlcyBsb2NhbGx5LlxuY29uc3Qgc3ludGF4S2luZCA9IHsgbGluZUNvbW1lbnRUcml2aWE6IDEyLCBibG9ja0NvbW1lbnRUcml2aWE6IDEzLCBsaW5lQnJlYWtUcml2aWE6IDE0LCB0cml2aWE6IDE1LCBlb2Y6IDE3IH07XG5jb25zdCBzY2FuRXJyb3JOb25lID0gMDtcblxuZXhwb3J0IGNvbnN0IGpzb25jVXRpbCA9IHtcbiAgLyoqXG4gICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaG9sZHMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwg4oCUIG9ubHkgd2hpdGVzcGFjZSwgY29tcGxldGUgY29tbWVudHMsXG4gICAqIGFuZC9vciBhIEJPTS4gdHNjIHRyZWF0cyBzdWNoIGEgdHNjb25maWcuanNvbiBhcyBhbiBlbXB0eSBjb25maWcsIHNvIGdlbmVyYXRvcnMgc2hvdWxkIHRyZWF0XG4gICAqIGl0IGxpa2UgYSBtaXNzaW5nIGZpbGUgKGFuZCBnZW5lcmF0ZSBkZWZhdWx0cykgaW5zdGVhZCBvZiByZWZ1c2luZyB0byBtYW5hZ2UgaXQuIExleGljYWxseVxuICAgKiBicm9rZW4gdHJpdmlhIChlLmcuIGFuIHVudGVybWluYXRlZCBibG9jayBjb21tZW50KSBpcyBOT1QgdHJpdmlhLW9ubHk6IHRoZSBmaWxlIG11c3QgYmUgbGVmdFxuICAgKiB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gb3ZlcndyaXR0ZW4gd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGlzVHJpdmlhT25seShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgaWYgKFxuICAgICAgICAoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSB8fFxuICAgICAgICAoa2luZCAhPT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC50cml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmxpbmVCcmVha1RyaXZpYSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUGFyc2VzIGEgSlNPTkMgKEpTT04gd2l0aCBjb21tZW50cykgb2JqZWN0IGZyb20gY29uZmlnIGZpbGVzIHN1Y2ggYXMgdHNjb25maWcuanNvbixcbiAgICogcHlyaWdodGNvbmZpZy5qc29uLCByZW5vdmF0ZS5qc29uLCAudnNjb2RlL3NldHRpbmdzLmpzb24sIGFuZCB3cmFuZ2xlci5qc29uYy5cbiAgICpcbiAgICoganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCByZXR1cm5zIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCwgd2hpY2ggbXVzdFxuICAgKiBub3QgYmUgdHJlYXRlZCBhcyB0aGUgZmlsZSdzIGNvbmZpZ3VyYXRpb247IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IgaW5zdGVhZC4gQSBsZWFkaW5nIEJPTSBpc1xuICAgKiBzdHJpcHBlZCBiZWNhdXNlIFR5cGVTY3JpcHQgYWNjZXB0cyBCT00nZCBjb25maWcgZmlsZXMgd2hpbGUganNvbmMtcGFyc2VyIHJlcG9ydHMgdGhlIEJPTSBhc1xuICAgKiBhIHBhcnNlIGVycm9yLiBDYWxsZXJzIHdob3NlIHJlYWRlciByZWplY3RzIHRyYWlsaW5nIGNvbW1hcyB0dXJuIGBhbGxvd1RyYWlsaW5nQ29tbWFgXG4gICAqIG9mZiBzbyBzdWNoIGEgZmlsZSBpcyByZXBvcnRlZCBhcyBtYWxmb3JtZWQgaGVyZSB0b28uXG4gICAqL1xuICBwYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VCBleHRlbmRzIG9iamVjdD4oY29udGVudDogc3RyaW5nLCBhbGxvd1RyYWlsaW5nQ29tbWEgPSB0cnVlKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VKc29uYyhjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpLCBwYXJzZUVycm9ycywgeyBhbGxvd1RyYWlsaW5nQ29tbWEgfSkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGFyc2VFcnJvcnMubGVuZ3RoID09PSAwICYmICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciB0aGUgY29udGVudCBjYXJyaWVzIGF0IGxlYXN0IG9uZSBjb21tZW50LCBpLmUuIGNvbnRlbnQgSlNPTi5zdHJpbmdpZnkgd291bGQgZHJvcC4gKi9cbiAgY29udGFpbnNDb21tZW50KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykpO1xuICAgIGZvciAobGV0IGtpbmQ6IG51bWJlciA9IHNjYW5uZXIuc2NhbigpOyBraW5kICE9PSBzeW50YXhLaW5kLmVvZjsga2luZCA9IHNjYW5uZXIuc2NhbigpKSB7XG4gICAgICAvLyBBIGxleGljYWwgZXJyb3IgbWVhbnMgdGhlIHJlbWFpbmluZyB0b2tlbnMgYXJlIHVucmVsaWFibGU7IHJlcG9ydCBubyBjb21tZW50IHJhdGhlciB0aGFuXG4gICAgICAvLyBndWVzc2luZy4gQSBjYWxsZXIgdGhhdCBvbmx5IHdhcm5zIGFib3V0IGRyb3BwZWQgY29tbWVudHMgbG9zZXMgbm90aGluZywgYW5kIG9uZSB0aGF0XG4gICAgICAvLyByZWZ1c2VzIGEgY29tbWVudGVkIGZpbGUgZm9yIGEgc3RyaWN0LUpTT04gcmVhZGVyIHN0aWxsIHJlamVjdHMgc3VjaCBjb250ZW50IHdoZW4gaXRcbiAgICAgIC8vIHBhcnNlcyBpdC5cbiAgICAgIGlmICgoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGtpbmQgPT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgfHwga2luZCA9PT0gc3ludGF4S2luZC5ibG9ja0NvbW1lbnRUcml2aWEpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGBzZXR0aW5nc2AgaW50byBgb2xkQ29udGVudGAsIGVkaXRpbmcgb25seSB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzXG4gICAqIGNoYW5nZWQgc28gdGhlIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIG9mIGFuIGV4aXN0aW5nIGZpbGUgc3Vydml2ZS4gQ2FsbGVycyBuZXZlciBkcm9wXG4gICAqIHByb3BlcnRpZXMgKGdlbmVyYXRlZCBzZXR0aW5ncyBhcmUgbWVyZ2VkIE9OIFRPUCBvZiB0aGUgZXhpc3Rpbmcgb25lcyksIHNvIHJlbW92YWxzIGFyZSBub3RcbiAgICogaGFuZGxlZDogYSBwcm9wZXJ0eSBtaXNzaW5nIGZyb20gYHNldHRpbmdzYCBpcyBsZWZ0IHVudG91Y2hlZCByYXRoZXIgdGhhbiBkZWxldGVkLlxuICAgKlxuICAgKiBUcml2aWEtb25seSBjb250ZW50IGtlZXBzIGl0cyBjb21tZW50cyBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdCwgcmF0aGVyIHRoYW5cbiAgICogYmVpbmcgcmVwbGFjZWQgb3V0cmlnaHQgb3IgcnVuIHRocm91Z2ggbW9kaWZ5KCkgKHdoaWNoIHdvdWxkIG1vdmUgdGhlIG9iamVjdCBpbiBmcm9udCBvZiB0aGVtKS5cbiAgICovXG4gIHN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgb2xkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB7IGNvbnRlbnQ6IHN0cmluZzsga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSB9IHtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSwga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2xkQ29udGVudCk7XG4gICAgLy8gRHJvcCBhIGxlYWRpbmcgQk9NOiBtb2RpZnkoKSBpbnNlcnRzIHRoZSBnZW5lcmF0ZWQgb2JqZWN0IEJFRk9SRSBhbnkgbGVhZGluZyB0cml2aWEsIHdoaWNoXG4gICAgLy8gd291bGQgbGVhdmUgdGhlIEJPTSBzdHJhbmRlZCBtaWQtZmlsZSB3aGVyZSBpdCBpcyBhIHN5bnRheCBlcnJvciByYXRoZXIgdGhhbiBhbiBpZ25vcmVkIG1hcmsuXG4gICAgbGV0IGNvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpO1xuICAgIGlmIChqc29uY1V0aWwuaXNUcml2aWFPbmx5KGNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBjb250ZW50LnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IGAke2hlYWRlciA/IGhlYWRlciArICdcXG4nIDogJyd9JHtKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKX1gLFxuICAgICAgICBrZXlzTG9zaW5nQ29tbWVudHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbW9kaWZ5T3B0aW9ucyA9IHsgZm9ybWF0dGluZ09wdGlvbnM6IGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQpIH07XG4gICAgY29uc3Qga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5ld0VudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncykpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkU2V0dGluZ3M/LltrZXldO1xuICAgICAgLy8gQ29tcGFyZSBzZXJpYWxpemVkIGZvcm1zIHNvIGRlZXAtZXF1YWwgdmFsdWVzIChlLmcuIGEgcmUtbWVyZ2VkIGBleHRlbmRzYCBhcnJheSkgZG8gbm90XG4gICAgICAvLyByZXdyaXRlIHRoZSBwcm9wZXJ0eSBhbmQgcmVmbG93IGl0cyBmb3JtYXR0aW5nLlxuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2luZyBhIHdob2xlIGFycmF5IHdvdWxkIGRpc2NhcmQgdGhlIGNvbW1lbnRzIGJldHdlZW4gaXRzIGVsZW1lbnRzLCBzbyBncm93IGl0IHdpdGhcbiAgICAgIC8vIHBlci1lbGVtZW50IGluc2VydGlvbnMgd2hlbmV2ZXIgdGhlIG5ldyB2YWx1ZSBvbmx5IGFkZHMgdG8gaXQuXG4gICAgICBjb25zdCBpbnNlcnRpb25zID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZSwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBpbnNlcnRpb24gb2YgaW5zZXJ0aW9ucyA/PyBbXSkge1xuICAgICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIG1vZGlmeShjb250ZW50LCBba2V5LCBpbnNlcnRpb24uaW5kZXhdLCBpbnNlcnRpb24udmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgaXNBcnJheUluc2VydGlvbjogdHJ1ZSB9KVxuICAgICAgICApO1xuICAgICAgICBjb250ZW50ID0gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50LCBrZXksIGluc2VydGlvbi5pbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zZXJ0aW9ucykgY29udGludWU7XG4gICAgICAvLyBSZXdyaXRpbmcgdGhlIHdob2xlIHZhbHVlIGlzIHRoZSBvbmx5IG9wdGlvbiBsZWZ0ICh0aGUgbmV3IG9uZSBkcm9wcyBvciByZW9yZGVycyBlbGVtZW50cyksXG4gICAgICAvLyBhbmQgaXQgdGFrZXMgYW55IGNvbW1lbnQgbmVzdGVkIGluc2lkZSBpdCBhbG9uZy4gUmVwb3J0IHRoYXQgcmF0aGVyIHRoYW4gbG9zaW5nIGl0IHF1aWV0bHkuXG4gICAgICBjb25zdCByZXBsYWNlZFRleHQgPSB2YWx1ZVRleHRPZihjb250ZW50LCBrZXkpO1xuICAgICAgaWYgKHJlcGxhY2VkVGV4dCAhPT0gdW5kZWZpbmVkICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQocmVwbGFjZWRUZXh0KSkga2V5c0xvc2luZ0NvbW1lbnRzLnB1c2goa2V5KTtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIG1vZGlmeU9wdGlvbnMpKTtcbiAgICB9XG4gICAgLy8gUHJlcGVuZCByYXRoZXIgdGhhbiBhcHBlbmQgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmV3OiBhcHBlbmRpbmcgZGV0YWNoZXMgYSB0cmFpbGluZ1xuICAgIC8vIHNhbWUtbGluZSBjb21tZW50IGZyb20gdGhlIGxhc3QgcHJvcGVydHksIGxlYXZpbmcgaXQgdG8gZGVzY3JpYmUgdGhlIGdlbmVyYXRlZCB2YWx1ZVxuICAgIC8vIGluc3RlYWQuIEluc2VydGluZyBpbiByZXZlcnNlIGtlZXBzIHRoZSBvcmRlciB0aGUgc2V0dGluZ3MgZGVjbGFyZSB0aGVtIGluLlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5ld0VudHJpZXMudG9SZXZlcnNlZCgpKSB7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGdldEluc2VydGlvbkluZGV4OiAoKSA9PiAwIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH07XG4gIH0sXG59O1xuXG4vKiogUmV0dXJucyB0aGUgc291cmNlIHRleHQgb2YgYSB0b3AtbGV2ZWwgcHJvcGVydHkncyB2YWx1ZSwgY29tbWVudHMgYW5kIGFsbC4gKi9cbmZ1bmN0aW9uIHZhbHVlVGV4dE9mKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBub2RlID0gcm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pO1xuICByZXR1cm4gbm9kZSAmJiBjb250ZW50LnNsaWNlKG5vZGUub2Zmc2V0LCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoKTtcbn1cblxuLy8gVGhlIHdob2xlIHNhbWUtbGluZSBjb21tZW50IHNlcXVlbmNlLCBub3QganVzdCB0aGUgZmlyc3Qgb25lOiBhIGxpbmUgY29tbWVudCBlbmRzIGl0IChpdCBydW5zIHRvXG4vLyB0aGUgbmV3bGluZSksIGJ1dCBhbnkgbnVtYmVyIG9mIGJsb2NrIGNvbW1lbnRzIGNhbiBwcmVjZWRlIGl0LCBhbmQgbW92aW5nIG9ubHkgdGhlIGZpcnN0IHdvdWxkXG4vLyBsZWF2ZSB0aGUgcmVzdCBkZXNjcmliaW5nIHRoZSB3cm9uZyBlbGVtZW50LlxuY29uc3QgdHJhaWxpbmdDb21tZW50UGF0dGVybiA9IC9eKD86W15cXFNcXG5dKlxcL1xcKltcXFNcXHNdKj9cXCpcXC8pKig/OlteXFxTXFxuXSpcXC9cXC9bXlxcbl0qKT8vdTtcblxuLyoqXG4gKiBSZWF0dGFjaGVzIGEgc2FtZS1saW5lIGNvbW1lbnQgdG8gdGhlIGVsZW1lbnQgaXQgZGVzY3JpYmVzLiBJbnNlcnRpbmcgaW50byBhbiBhcnJheSBwbGFjZXMgdGhlXG4gKiBuZXcgZWxlbWVudCBCRUZPUkUgdGhlIHRyaXZpYSB0aGF0IGZvbGxvd3MgaXRzIHByZWRlY2Vzc29yLCBzbyBhcHBlbmRpbmcgYWZ0ZXJcbiAqIGB7IC4uLiB9IC8vIHdoeSB0aGlzIHJ1bGUgZXhpc3RzYCBsZWF2ZXMgdGhhdCBjb21tZW50IGV4cGxhaW5pbmcgdGhlIGdlbmVyYXRlZCBlbGVtZW50IGluc3RlYWQuXG4gKiBBIGZyZXNobHkgc2VyaWFsaXplZCBlbGVtZW50IG5ldmVyIGNhcnJpZXMgYSBjb21tZW50IG9mIGl0cyBvd24sIHNvIGFueXRoaW5nIHRyYWlsaW5nIHRoZVxuICogaW5zZXJ0aW9uIGJlbG9uZ2VkIHRvIHRoZSBlbGVtZW50IGJlZm9yZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBpbnNlcnRlZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaW5zZXJ0ZWRJbmRleCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IGVsZW1lbnRzID0gKHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKSk/LmNoaWxkcmVuO1xuICBjb25zdCBpbnNlcnRlZCA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleF07XG4gIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4IC0gMV07XG4gIGlmICghaW5zZXJ0ZWQgfHwgIXByZXZpb3VzKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW5zZXJ0ZWRFbmQgPSBpbnNlcnRlZC5vZmZzZXQgKyBpbnNlcnRlZC5sZW5ndGg7XG4gIGNvbnN0IGNvbW1lbnQgPSB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuLmV4ZWMoY29udGVudC5zbGljZShpbnNlcnRlZEVuZCkpPy5bMF07XG4gIGlmICghY29tbWVudCkgcmV0dXJuIGNvbnRlbnQ7XG4gIC8vIExhbmQgdGhlIGNvbW1lbnQgYWZ0ZXIgdGhlIHNlcGFyYXRpbmcgY29tbWEgc28gdGhlIGVsZW1lbnQga2VlcHMgaXRzIG93biBsaW5lIGludGFjdC5cbiAgY29uc3QgcHJldmlvdXNFbmQgPSBwcmV2aW91cy5vZmZzZXQgKyBwcmV2aW91cy5sZW5ndGg7XG4gIGNvbnN0IHJlc3RvcmVPZmZzZXQgPSBwcmV2aW91c0VuZCArICgvXlxccyosL3UuZXhlYyhjb250ZW50LnNsaWNlKHByZXZpb3VzRW5kKSk/LlswXS5sZW5ndGggPz8gMCk7XG4gIHJldHVybiAoXG4gICAgY29udGVudC5zbGljZSgwLCByZXN0b3JlT2Zmc2V0KSArXG4gICAgY29tbWVudCArXG4gICAgY29udGVudC5zbGljZShyZXN0b3JlT2Zmc2V0LCBpbnNlcnRlZEVuZCkgK1xuICAgIGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQgKyBjb21tZW50Lmxlbmd0aClcbiAgKTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBpbmRlbnRhdGlvbiB0aGUgZmlsZSBhbHJlYWR5IHVzZXMsIHNvIGEgc2VtYW50aWMgY2hhbmdlIGRvZXMgbm90IHJlaW5kZW50IHVucmVsYXRlZFxuICogbGluZXMuIFRoZSBmaXJzdCBwcm9wZXJ0eSBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgaW5kZW50ZWQgbGluZSwgYmVjYXVzZSBhIGRlY29yYXRlZFxuICogYmxvY2sgY29tbWVudCAoYCAqIC4uLmApIHdvdWxkIG90aGVyd2lzZSBwYXNzIGZvciB0aGUgZmlsZSdzIGluZGVudGF0aW9uLiBGYWxscyBiYWNrIHRvIHRoZSB0d29cbiAqIHNwYWNlcyBldmVyeSBnZW5lcmF0ZWQgY29uZmlnIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQ6IHN0cmluZyk6IHsgaW5zZXJ0U3BhY2VzOiBib29sZWFuOyB0YWJTaXplOiBudW1iZXIgfSB7XG4gIGNvbnN0IGZpcnN0UHJvcGVydHkgPSBwYXJzZVRyZWUoY29udGVudCk/LmNoaWxkcmVuPy5bMF07XG4gIGNvbnN0IGluZGVudGF0aW9uID1cbiAgICBmaXJzdFByb3BlcnR5ICYmIGNvbnRlbnQuc2xpY2UoY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpICsgMSwgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpO1xuICBpZiAoIWluZGVudGF0aW9uIHx8ICEvXltcXHQgXSskL3UudGVzdChpbmRlbnRhdGlvbikpIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogMiB9O1xuICBpZiAoaW5kZW50YXRpb24uc3RhcnRzV2l0aCgnXFx0JykpIHJldHVybiB7IGluc2VydFNwYWNlczogZmFsc2UsIHRhYlNpemU6IDEgfTtcbiAgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiBpbmRlbnRhdGlvbi5sZW5ndGggfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBpbnNlcnQgaW50byBgb2xkVmFsdWVgIHRvIHR1cm4gaXQgaW50byBgbmV3VmFsdWVgLCBvciB1bmRlZmluZWQgd2hlblxuICogdGhhdCBpcyBpbXBvc3NpYmxlIGJlY2F1c2UgYG5ld1ZhbHVlYCBkcm9wcyBvciByZW9yZGVycyBhbiBleGlzdGluZyBlbGVtZW50ICh0aGUgY2FsbGVyIG11c3RcbiAqIHRoZW4gcmVwbGFjZSB0aGUgYXJyYXkgd2hvbGVzYWxlKS4gSW5kaWNlcyBhZGRyZXNzIHRoZSBhcnJheSBhcyBpdCBncm93cywgc28gYXBwbHlpbmcgdGhlXG4gKiBpbnNlcnRpb25zIGxlZnQgdG8gcmlnaHQgeWllbGRzIGBuZXdWYWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlOiB1bmtub3duW10sIG5ld1ZhbHVlOiB1bmtub3duW10pOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluc2VydGlvbnM6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdID0gW107XG4gIGxldCBvbGRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgW25ld0luZGV4LCBlbGVtZW50XSBvZiBuZXdWYWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAob2xkSW5kZXggPCBvbGRWYWx1ZS5sZW5ndGggJiYgSlNPTi5zdHJpbmdpZnkob2xkVmFsdWVbb2xkSW5kZXhdKSA9PT0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpIHtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaW5zZXJ0aW9ucy5wdXNoKHsgaW5kZXg6IG5ld0luZGV4LCB2YWx1ZTogZWxlbWVudCB9KTtcbiAgfVxuICByZXR1cm4gb2xkSW5kZXggPT09IG9sZFZhbHVlLmxlbmd0aCA/IGluc2VydGlvbnMgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBSZWNvZ25pemVzIHRoZSBtYW5hZ2VkIGB3YiBnZW4tY29kZWAgc2VnbWVudCwgYSBvbmUtbGV2ZWwgcGFja2FnZS1zY3JpcHQgd3JhcHBlciBhcm91bmQgaXQsIGFuZFxuICogY3VzdG9tIHNlZ21lbnRzIHRoYXQgd2JmeSBsZWF2ZXMgYWxvbmUuXG4gKi9cbnR5cGUgU2NyaXB0U2VnbWVudEtpbmQgPSAnY3VzdG9tJyB8ICdnZW5Db2RlJyB8ICdnZW5Db2RlV3JhcHBlcic7XG5cbmNvbnN0IGdlbkNvZGVTZWdtZW50UGF0dGVybiA9IC9eYnVuXFxzK3diXFxzK2dlbi1jb2RlJC91O1xuXG4vLyBBIHJ1bm5lciBkZWxlZ2F0aW5nIHRvIG9uZSBvZiB0aGlzIHBhY2thZ2UncyBvd24gc2NyaXB0cywgZS5nLiBgYnVuIHJ1biBnZW4tdHlwZXNgLlxuY29uc3Qgc2NyaXB0UnVubmVyUGF0dGVybiA9IC9eYnVuXFxzK3J1blxccysoXFxTKykkL3U7XG5cbi8vIEFueXRoaW5nIHdiZnkncyBgJiZgIHNwbGl0IGNhbm5vdCBtb2RlbCAocGlwZXMsIHNlcXVlbmNpbmcsIHJlZGlyZWN0aW9ucywgcXVvdGluZywgc3Vic3RpdHV0aW9ucywgZGlyZWN0b3J5XG4vLyBjaGFuZ2VzKS4gU2NyaXB0cyBjb250YWluaW5nIGl0IGFyZSBsZWZ0IHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG5jb25zdCB1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybiA9IC9bXFxuO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3U7XG5cbi8qKlxuICogU3BsaXRzIGEgc2NyaXB0IGludG8gYCYmYC1zZXBhcmF0ZWQgc2VnbWVudHMsIG9yIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIHNjcmlwdCB1c2VzIHNoZWxsIHN5bnRheCB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgZG9lcyBub3QgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBpZiAodW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm47XG4gIHJldHVybiBzY3JpcHRcbiAgICAuc3BsaXQoJyYmJylcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTY3JpcHRTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIGZvbGxvd3NXcmFwcGVyID0gdHJ1ZVxuKTogU2NyaXB0U2VnbWVudEtpbmQge1xuICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgaWYgKGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KG5vcm1hbGl6ZWQpKSByZXR1cm4gJ2dlbkNvZGUnO1xuICAvLyBBIG9uZS1sZXZlbCB3cmFwcGVyIGxvb2t1cCBjb3ZlcnMgYFwicG9zdGluc3RhbGxcIjogXCJidW4gcnVuIGdlbi10eXBlc1wiYCwgdGhlIHNoYXBlIHRoZXNlIHJlcG9zaXRvcmllcyB1c2U7XG4gIC8vIGRlZXBlciBjaGFpbnMgc3RheSBjdXN0b20gc28gd2JmeSBjYW5ub3QgbG9vcCBvbiBhIHNlbGYtcmVmZXJlbnRpYWwgc2NyaXB0LlxuICBjb25zdCBzY3JpcHROYW1lID0gZm9sbG93c1dyYXBwZXIgPyBzY3JpcHRSdW5uZXJQYXR0ZXJuLmV4ZWMobm9ybWFsaXplZCk/LlsxXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiAnY3VzdG9tJztcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFNjcmlwdFNlZ21lbnRzKHRhcmdldCk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgc3RpbGwgcGVyZm9ybXMgdGhlIG1hbmFnZWRcbiAgLy8gZ2VuZXJhdGlvbiwgc28gaXQgY291bnRzIGFzIGdlbi1jb2RlOyB0cmVhdGluZyBpdCBhcyBjdXN0b20gd291bGQgYXBwZW5kIGEgc2Vjb25kIGB3YiBnZW4tY29kZWAgYW5kIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuXG4gIGlmIChzZWdtZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIG1hbmFnZWQgZ2VuZXJhdGlvbiBBTkQgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IGlzIHRoZSBpbnN0YWxsLXRpbWUgZW50cnkgcG9pbnQ6IGl0IG11c3QgYmUga2VwdCBhc1xuICAgIC8vIHdyaXR0ZW4uIFJlcGxhY2luZyBpdCB3aXRoIGEgYmFyZSBgd2IgZ2VuLWNvZGVgIHdvdWxkIGRyb3AgdGhvc2Ugc3RlcHM7IGFwcGVuZGluZyBvbmUgd291bGQgcnVuIGV2ZXJ5XG4gICAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICAgIHJldHVybiBzZWdtZW50cz8uc29tZSgoaW5uZXIpID0+IGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KGlubmVyLnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpKSlcbiAgICAgID8gJ2dlbkNvZGVXcmFwcGVyJ1xuICAgICAgOiAnY3VzdG9tJztcbiAgfVxuICByZXR1cm4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnRzWzBdID8/ICcnLCBzY3JpcHRzLCBmYWxzZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZCwgYXJncywgY3dkKVsxXTtcbn1cblxuZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dCA6IHN0ZG91dC50b1N0cmluZygpO1xuICByZXR1cm4gW3Byb2Muc3RhdHVzID8/IDEsIHN0ZG91dFRleHQudHJpbSgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICAvLyBXaGV0aGVyIGlzUHVibGljUmVwbyBjb21lcyBmcm9tIGFuIGFjdHVhbCBHaXRIdWIgQVBJIHJlc3BvbnNlOiBhIGZhaWxlZCBsb29rdXAgKG9mZmxpbmUsXG4gIC8vIHJhdGUtbGltaXRlZCwgYmFkIGNyZWRlbnRpYWwpIGNvbGxhcHNlcyB0byBpc1B1YmxpY1JlcG89ZmFsc2UsIHdoaWNoIHZpc2liaWxpdHktc2Vuc2l0aXZlXG4gIC8vIGdlbmVyYXRvcnMgbXVzdCBub3QgbWlzdGFrZSBmb3IgYSBjb25maXJtZWQgcHJpdmF0ZSByZXBvc2l0b3J5LlxuICBpc1JlcG9WaXNpYmlsaXR5S25vd246IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0Nsb3VkZmxhcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW47XG4gIGlzUmFpbHdheTogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLyoqIERpcmVjdG9yaWVzIGNvbnRhaW5pbmcgQ2FyZ28udG9tbCAocmVsYXRpdmUgdG8gZGlyUGF0aCwgcm9vdC1tb3N0IGZpcnN0KS4gRW1wdHkgaWYgdGhlIHJlcG8gaGFzIG5vIFJ1c3QgY29kZS4gKi9cbiAgY2FyZ29Ub21sRGlyUGF0aHM6IHN0cmluZ1tdO1xuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgUHl0aG9uIGxvY2tmaWxlIChwb2V0cnkubG9jayAvIHV2LmxvY2spIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBNYXZlbiBwb20ueG1sIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUG9tWG1sQW55d2hlcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgU2xpZGV2IGRlY2sgKGAqLnNsaWRldi5tZGApIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluU2xpZGV2TWQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWc6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFJ1bnRpbWU6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHNsaWRldjogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgdGF1cmk6IGJvb2xlYW47XG4gICAgdmluZXh0OiBib29sZWFuO1xuICAgIHZpdGU6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gICAgY2hha3JhOiBib29sZWFuO1xuICAgIGRyaXp6bGU6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBbiBleHBsaWNpdCBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCBwbHVnaW4gZW50cnkgcHVibGlzaGVzIHRoZSByb290IG1hbmlmZXN0IGl0c2VsZlxuICAgICAqIChubyBwa2dSb290IHJlZGlyZWN0aW9uIGFuZCBucG1QdWJsaXNoIG5vdCBkaXNhYmxlZCkuXG4gICAgICovXG4gICAgbnBtUHVibGlzaGVzUm9vdDogYm9vbGVhbjtcbiAgfTtcbiAgbWlzZVRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogVGhlIHNlbWFudGljLXJlbGVhc2UgY29uZmlnIGZpbGVzIHdiZnkgZXhwZWN0cywgaW4gY29zbWljb25maWcncyByZXNvbHV0aW9uIG9yZGVyICh0aGUgbGVhZGluZ1xuICogcGFja2FnZS5qc29uIGVudHJ5IGlzIGNoZWNrZWQgYnkgdGhlIGNhbGxlcikuIHdiZnkgZ2VuZXJhdGVzIC5yZWxlYXNlcmMuanNvbjsgdGhlIG90aGVyIHNwZWxsaW5nc1xuICogYXJlIGxpc3RlZCBvbmx5IHRvIGRldGVjdCBhIGhhbmQtd3JpdHRlbiBjb25maWcsIHdob3NlIGZvcm1hdCBKU09OLnBhcnNlIGNhbm5vdCByZWFkIGFuZCB3aG9zZVxuICogcGx1Z2luIGxpc3QgaXMgdGhlcmVmb3JlIHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZS5cbiAqL1xuY29uc3Qgc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzOiB7IGZpbGVOYW1lOiBzdHJpbmc7IGpzb25QYXJzZWFibGU6IGJvb2xlYW4gfVtdID0gW1xuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYycsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnltbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IGlzUm9vdD86IGJvb2xlYW4gfVxuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gZmFsc2U7XG4gICAgbGV0IHJlbGVhc2VOcG1QbHVnaW5QdWJsaXNoZXNSb290ID0gZmFsc2U7XG4gICAgLy8gVGhlIEZJUlNUIGV4aXN0aW5nIHNlYXJjaCBwbGFjZSB3aW5zIChjb3NtaWNvbmZpZyBzaG9ydC1jaXJjdWl0cyksIHNvIGEgSlMvWUFNTC9UUyBjb25maWdcbiAgICAvLyBvciBhbiBgZXh0ZW5kc2AgcHJlc2V0IG1ha2VzIHRoZSBlZmZlY3RpdmUgcGx1Z2luIGxpc3Qgc3RhdGljYWxseSB1bmluc3BlY3RhYmxlIChtaXJyb3JzXG4gICAgLy8gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyBpbiB3YidzIHJlbGVhc2UudHMpLiBUcmVhdGluZyBpdCBhcyB1bmtub3duIGtlZXBzXG4gICAgLy8gYHJlbGVhc2UubnBtYCBjb25zZXJ2YXRpdmVseSB0cnVlLCBzbyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMgbmV2ZXIgZm9yY2VzXG4gICAgLy8gYHByaXZhdGU6IHRydWVgIG9uIGEgbW9ub3JlcG8gdGhhdCBhY3R1YWxseSBwdWJsaXNoZXMgdG8gbnBtLlxuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdHlwZSBSZWxlYXNlQ29uZmlnID1cbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlcz86IHVua25vd247XG4gICAgICAgICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+XSlbXTtcbiAgICAgICAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAvLyBjb3NtaWNvbmZpZyBzZWFyY2hlcyBwYWNrYWdlLmpzb24ncyBgcmVsZWFzZWAga2V5IEJFRk9SRSBhbnkgcmMvY29uZmlnIGZpbGVcbiAgICAgIC8vIChzZW1hbnRpYy1yZWxlYXNlIDI1IGRlbGVnYXRlcyB0byBjb3NtaWNvbmZpZyA5J3MgZGVmYXVsdCBzZWFyY2hQbGFjZXMpLlxuICAgICAgbGV0IHJlbGVhc2VDb25maWcgPSAocGFja2FnZUpzb24gYXMgeyByZWxlYXNlPzogUmVsZWFzZUNvbmZpZyB9KS5yZWxlYXNlO1xuICAgICAgaWYgKHJlbGVhc2VDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgICAgICBjb25zdCByZWxlYXNlcmNQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVsZWFzZXJjUGF0aCkpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICghanNvblBhcnNlYWJsZSkge1xuICAgICAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBgLnJlbGVhc2VyY2AgYW5kIGAuY29uZmlnL3JlbGVhc2VyY2AgbWF5IGFsc28gaG9sZCBZQU1MOyBhIEpTT04ucGFyc2UgZmFpbHVyZSBsYW5kc1xuICAgICAgICAgIC8vIGluIHRoZSBjYXRjaCBiZWxvdyBhbmQgbWFya3MgdGhlIHBsdWdpbiBsaXN0IHVua25vd24gaW5zdGVhZCBvZiBzaWxlbnRseSByZXBvcnRpbmdcbiAgICAgICAgICAvLyBcIm5vIHBsdWdpbnNcIi5cbiAgICAgICAgICByZWxlYXNlQ29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjUGF0aCwgJ3V0ZjgnKSkgYXMgUmVsZWFzZUNvbmZpZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSBhY2NlcHRzIGEgc2NhbGFyIGJyYW5jaCBvciBicmFuY2ggb2JqZWN0cyAoeyBuYW1lLCBwcmVyZWxlYXNlLCAuLi4gfSk7XG4gICAgICAvLyBub3JtYWxpemUgdG8gcGxhaW4gYnJhbmNoIG5hbWVzIGZvciBjb25zdW1lcnMgc3VjaCBhcyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yLlxuICAgICAgY29uc3QgcmF3QnJhbmNoZXMgPSByZWxlYXNlQ29uZmlnPy5icmFuY2hlcztcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IChBcnJheS5pc0FycmF5KHJhd0JyYW5jaGVzKSA/IHJhd0JyYW5jaGVzIDogcmF3QnJhbmNoZXMgPT09IHVuZGVmaW5lZCA/IFtdIDogW3Jhd0JyYW5jaGVzXSlcbiAgICAgICAgLm1hcCgoYnJhbmNoOiB1bmtub3duKSA9PlxuICAgICAgICAgIHR5cGVvZiBicmFuY2ggPT09ICdzdHJpbmcnID8gYnJhbmNoIDogKGJyYW5jaCBhcyB7IG5hbWU/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5uYW1lXG4gICAgICAgIClcbiAgICAgICAgLmZpbHRlcigoYnJhbmNoTmFtZSk6IGJyYW5jaE5hbWUgaXMgc3RyaW5nID0+IHR5cGVvZiBicmFuY2hOYW1lID09PSAnc3RyaW5nJyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxlYXNlQ29uZmlnPy5wbHVnaW5zKSkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW5FbnRyeSBvZiByZWxlYXNlQ29uZmlnLnBsdWdpbnMpIHtcbiAgICAgICAgICBjb25zdCBbcGx1Z2luTmFtZSwgcGx1Z2luT3B0aW9uc10gPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KSA/IHBsdWdpbkVudHJ5IDogW3BsdWdpbkVudHJ5LCB1bmRlZmluZWRdO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luTmFtZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLnB1c2gocGx1Z2luTmFtZSk7XG4gICAgICAgICAgaWYgKHBsdWdpbk5hbWUgIT09ICdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBXaXRoIHBrZ1Jvb3QgdGhlIHBsdWdpbiBwdWJsaXNoZXMgYW5vdGhlciBtYW5pZmVzdCAoaXQgcmVzb2x2ZXMgcGtnUm9vdCBhZ2FpbnN0IHRoZVxuICAgICAgICAgIC8vIHJlcG8gcm9vdCwgc28gYC5gIGFuZCBgLi9gIGJvdGggbWVhbiB0aGUgcm9vdCBpdHNlbGYpLCBhbmQgbnBtUHVibGlzaDogZmFsc2VcbiAgICAgICAgICAvLyBkaXNhYmxlcyBwdWJsaXNoaW5nIGVudGlyZWx5OyBvbmx5IHRoZSByZW1haW5pbmcgc2hhcGUgcHJvdmVzIHRoZSBST09UIGlzIHB1Ymxpc2hlZC5cbiAgICAgICAgICBjb25zdCBwa2dSb290ID0gcGx1Z2luT3B0aW9ucz8ucGtnUm9vdDtcbiAgICAgICAgICBjb25zdCBwdWJsaXNoZXNSb290ID1cbiAgICAgICAgICAgIHBsdWdpbk9wdGlvbnM/Lm5wbVB1Ymxpc2ggIT09IGZhbHNlICYmXG4gICAgICAgICAgICAocGtnUm9vdCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICh0eXBlb2YgcGtnUm9vdCA9PT0gJ3N0cmluZycgJiYgcGF0aC5yZXNvbHZlKGRpclBhdGgsIHBrZ1Jvb3QpID09PSBwYXRoLnJlc29sdmUoZGlyUGF0aCkpKTtcbiAgICAgICAgICByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCB8fD0gcHVibGlzaGVzUm9vdDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZWxlYXNlQ29uZmlnICYmIHJlbGVhc2VDb25maWcuZXh0ZW5kcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgIH1cbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHBsdWdpbiBsaXN0LCBzZW1hbnRpYy1yZWxlYXNlJ3MgZGVmYXVsdCBsaXN0IGFwcGxpZXMsIHdoaWNoIGluY2x1ZGVzXG4gICAgLy8gQHNlbWFudGljLXJlbGVhc2UvbnBtIGFuZCBAc2VtYW50aWMtcmVsZWFzZS9naXRodWIgKG1pcnJvcnMgcmVsZWFzZVB1Ymxpc2hlc1RvTnBtIGluIHdiJ3NcbiAgICAvLyByZWxlYXNlLnRzKS5cbiAgICBjb25zdCB1c2VzU2VtYW50aWNSZWxlYXNlID0gISEoXG4gICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICk7XG5cbiAgICAvLyBUaGUgY2FsbGVyIG1heSBjbGFzc2lmeSBleHBsaWNpdGx5IChpbmRleC50cyBwYXNzZXMgZmFsc2UgZm9yIGV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlLFxuICAgIC8vIGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKTsgdGhlIGhldXJpc3RpYyBjbGFzc2lmaWVzIHRoZSBDTEkgZW50cnlcbiAgICAvLyBwYXRoIGl0c2VsZiwgc28gYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBhbmQgYHdiZnkgPHJlcG8+L2FwcHMvPGFwcD5gIGtlZXAgdGhlaXIgY2hpbGRcbiAgICAvLyBjbGFzc2lmaWNhdGlvbi5cbiAgICBjb25zdCBpc1Jvb3QgPSBvcHRpb25zPy5pc1Jvb3QgPz8gIWlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGgpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAvLyBGZXRjaCB2aXNpYmlsaXR5IGZvciB0aGUgQ0xJIGVudHJ5IGV2ZW4gd2hlbiBpdCBpcyBhIHdvcmtzcGFjZSBjaGlsZCAoYHdiZnlcbiAgICAvLyA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKTogZ2VuZXJhdG9ycyByZWFkIGlzUHVibGljUmVwbyBmcm9tIHRoZWlyIHJvb3RDb25maWcgcGFyYW1ldGVyLFxuICAgIC8vIHdoaWNoIElTIHRoZSBjaGlsZCBjb25maWcgaW4gdGhhdCBpbnZvY2F0aW9uLCBzbyBhIHN0dWIgYGZhbHNlYCB0aGVyZSB3b3VsZCBkcm9wIHRoZVxuICAgIC8vIHB1YmxpYy1yZXBvIHB1Ymxpc2hDb25maWcgaGFuZGxpbmcuIERpc2NvdmVyZWQgY2hpbGRyZW4gKG9wdGlvbnMuaXNSb290ID09PSBmYWxzZSkgc3RpbGxcbiAgICAvLyBza2lwIHRoZSBmZXRjaCDigJQgdGhleSBpbmhlcml0IHRoZSBlbmNsb3Npbmcgcm9vdCdzIHZpc2liaWxpdHkgdmlhIHJvb3RDb25maWcgaW5zdGVhZC5cbiAgICBpZiAob3B0aW9ucz8uaXNSb290ICE9PSBmYWxzZSkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE9ubHkgdGhlIHJvb3QgZmV0Y2hlcyByZXBvIGluZm8sIGFuZCB0aGF0IGZldGNoIG5lZWRzIG5ldHdvcmsgYW5kIGEgdG9rZW4sIHNvIGlkZW50aXR5LWRlcml2ZWRcbiAgICAvLyBmbGFncyBiZWxvdyB3b3VsZCBvdGhlcndpc2UgYmUgZmFsc2UgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlIGFuZCBmb3IgZXZlcnkgb2ZmbGluZSBvclxuICAgIC8vIHJhdGUtbGltaXRlZCBydW4uIFRoZSBnaXQgcmVtb3RlIGFuc3dlcnMgdGhlIHNhbWUgcXVlc3Rpb24gbG9jYWxseSwgZm9yIGV2ZXJ5IHBhY2thZ2UuXG4gICAgaWYgKCFyZXBvQXV0aG9yIHx8ICFyZXBvTmFtZSkge1xuICAgICAgW3JlcG9BdXRob3IsIHJlcG9OYW1lXSA9IGF3YWl0IHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuICAgIC8vIEJ1aWx0IGZyb20gdGhlIFJFU09MVkVEIGlkZW50aXR5IHNvIHdvcmtzcGFjZSBwYWNrYWdlcyBhbmQgb2ZmbGluZSBydW5zIGFsc28gZ2V0IGl0OyBjb25zdW1lcnMgZGVyaXZlXG4gICAgLy8gdGhlIG93bmVyIGZyb20gdGhpcyBmaWVsZCAoZS5nLiB0byBzZXQgYGF1dGhvcmApLlxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvQXV0aG9yICYmIHJlcG9OYW1lID8gYGdpdGh1Yjoke3JlcG9BdXRob3J9LyR7cmVwb05hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICAvLyBUYXVyaSBvZmZpY2lhbGx5IHN1cHBvcnRzIEpTT04sIEpTT041LCBhbmQgVE9NTCBjb25maWd1cmF0aW9uIGZvcm1hdHMuXG4gICAgY29uc3QgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyA9IFsndGF1cmkuY29uZi5qc29uJywgJ3RhdXJpLmNvbmYuanNvbjUnLCAnVGF1cmkudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NyYy10YXVyaScsIGZpbGVOYW1lKSlcbiAgICApO1xuICAgIC8vIFJvb3QtbGV2ZWwgXCJJblBhY2thZ2VzXCIgc2lnbmFscyBtdXN0IHNlZSBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdFxuICAgIC8vIGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeSwgc28gc2NhbiBlYWNoIGRpc2NvdmVyZWQgd29ya3NwYWNlIGRpcmVjdG9yeS5cbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICB9KTtcbiAgICBjb25zdCBjb250YWluc0FueUluV29ya3NwYWNlcyA9IChwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgICB3b3Jrc3BhY2VTdWJEaXJQYXRocy5zb21lKCh3b3Jrc3BhY2VTdWJEaXJQYXRoKSA9PiBjb250YWluc0FueShwYXR0ZXJuLCB3b3Jrc3BhY2VTdWJEaXJQYXRoKSk7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyA9IGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpO1xuICAgIGNvbnN0IHdvcmtmbG93Q29udGVudHMgPSByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aCk7XG4gICAgY29uc3QgaW1wb3J0c1BsYXl3cmlnaHRBdFJ1bnRpbWUgPSBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoKTtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0eXBlb2YgcmVwb0luZm8/LnByaXZhdGUgPT09ICdib29sZWFuJyxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQ2xvdWRmbGFyZTogZGV0ZWN0Q2xvdWRmbGFyZShwYWNrYWdlSnNvbiwgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZywgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnLFxuICAgICAgaXNSYWlsd2F5OiBkZXRlY3RSYWlsd2F5KGRpclBhdGgsIHBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgsIHJlcG9OYW1lKSxcbiAgICAgIGNhcmdvVG9tbERpclBhdGhzOiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aCksXG4gICAgICAvLyBBbHNvIGhvbm9yIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyBiZXlvbmQgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0cmVhdGluZyBhblxuICAgICAgLy8gYXBwcy8qLW9ubHkgbW9ub3JlcG8gYXMgYSBwbGFpbiBwYWNrYWdlIHdvdWxkIGRlbGV0ZSBpdHMgYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uIGluXG4gICAgICAvLyBnZW5lcmF0ZVBhY2thZ2VKc29uIGFuZCBza2lwIG1vbm9yZXBvLW9ubHkgY29udmVudGlvbnMgc3VjaCBhcyByb290IGBwcml2YXRlOiB0cnVlYC5cbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCkgfHwgd29ya3NwYWNlU3ViRGlyUGF0aHMubGVuZ3RoID4gMCxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIC8vIFJlY3Vyc2l2ZSBsaWtlIGRvZXNDb250YWluSmF2YTogbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yaWVzIGtlZXAgbGFuZ3VhZ2UgZGlyZWN0b3JpZXNcbiAgICAgIC8vIChlLmcuIFB5dGhvbiB0b29saW5nIG9yIE1hdmVuIG1vZHVsZXMpIG91dHNpZGUgdGhlIHJvb3QgYW5kIG91dHNpZGUgZGVjbGFyZWQgd29ya3NwYWNlcy5cbiAgICAgIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBjb250YWluc0FueSgnKiove3BvZXRyeS5sb2NrLHV2LmxvY2t9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBjb250YWluc0FueSgnKiovcG9tLnhtbCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluU2xpZGV2TWQ6IGNvbnRhaW5zQW55KCcqKi8qLnNsaWRldi5tZCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcyhcbiAgICAgICAgJ3NyYy10YXVyaS97dGF1cmkuY29uZi5qc29uLHRhdXJpLmNvbmYuanNvbjUsVGF1cmkudG9tbH0nXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JyksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygnKiovKi5qYXZhJyksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBjaGFrcmE6ICEhZGV2RGVwZW5kZW5jaWVzWydAY2hha3JhLXVpL2NsaSddLFxuICAgICAgICBkcml6emxlOiAhIWRlcGVuZGVuY2llc1snZHJpenpsZS1vcm0nXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZHJpenpsZS1raXQnXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcGxheXdyaWdodFJ1bnRpbWU6IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBzbGlkZXY6ICEhZGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHRhdXJpOlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICAgIHZpbmV4dDogISFkZXBlbmRlbmNpZXMudmluZXh0IHx8ICEhZGV2RGVwZW5kZW5jaWVzLnZpbmV4dCxcbiAgICAgICAgdml0ZTogISFkZXBlbmRlbmNpZXMudml0ZSB8fCAhIWRldkRlcGVuZGVuY2llcy52aXRlLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHx8IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICAgICAgIDogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0XG4gICAgICAgICAgPyByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJykgfHwgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duXG4gICAgICAgICAgOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBucG1QdWJsaXNoZXNSb290OiByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCxcbiAgICAgIH0sXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwgfHxcbiAgICAgIC8vIEEgcmVwb3NpdG9yeSBjYW4gbGVnaXRpbWF0ZWx5IGNvbnRhaW4gb25seSBkb2N1bWVudGF0aW9uLiBJdHMgR2l0IG1ldGFkYXRhIGlzIGVub3VnaCB0b1xuICAgICAgLy8gZXN0YWJsaXNoIHRoYXQgdGhlIENMSSB0YXJnZXQgaXMgYSBwcm9qZWN0IHJvb3Q7IHJlcXVpcmluZyBhIGxhbmd1YWdlIG1hbmlmZXN0IGhlcmUgd291bGRcbiAgICAgIC8vIG1ha2Ugd2JmeSB1bmFibGUgdG8gY3JlYXRlIHRoZSBwYWNrYWdlLmpzb24gdGhhdCBpdCBtYW5hZ2VzIGZvciBzdWNoIHJlcG9zaXRvcmllcy4gQm90aFxuICAgICAgLy8gb3JkaW5hcnkgY2hlY2tvdXRzIChgLmdpdGAgZGlyZWN0b3J5KSBhbmQgd29ya3RyZWVzIChgLmdpdGAgZmlsZSkgc2F0aXNmeSB0aGlzIGNoZWNrLlxuICAgICAgKGNvbmZpZy5pc1Jvb3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXQnKSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB3YmZ5IG1hbmFnZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlIHBhY2thZ2UuIFRoZSBmaWxlIGlzIGdpdGlnbm9yZWQgYW5kIHVudHJhY2tlZFxuICogYmVjYXVzZSB0aGUgYHdiIGdlbi1jb2RlYCBwb3N0aW5zdGFsbCByZWdlbmVyYXRlcyBpdCBvbiBldmVyeSBpbnN0YWxsLCBzbyB0aGUgcGFja2FnZSBoYXMgdG8gb3duIGEgd3JhbmdsZXJcbiAqIGNvbmZpZyAoYHdyYW5nbGVyIHR5cGVzYCBleGl0cyBub24temVybyB3aXRob3V0IG9uZSksIHRvIGRlcGVuZCBvbiB3cmFuZ2xlciAoYSBwYWNrYWdlIGRlcGxveWluZyB2aWEgYVxuICogQ0kgYWN0aW9uIGNhbm5vdCByZXNvbHZlIHRoZSBjb21tYW5kKSwgYW5kIHRvIGNvbnN1bWUgdGhlIGdlbmVyYXRlZCBmaWxlLlxuICpcbiAqIElOVkFSSUFOVCDigJQgdGhpcyBkZWNpc2lvbiBtdXN0IGNvbnZlcmdlIGFjcm9zcyBtYWNoaW5lcyBob2xkaW5nIHRoZSBzYW1lIGNvbW1pdC4gSXQgbXVzdCBORVZFUiBjb25zdWx0XG4gKiBnaXRpZ25vcmVkIGZpbGVzIChgLmRldi52YXJzKmAsIGAuZW52KmAsIC4uLiksIHdoaWNoIGB3YiBzdGFydGAgYW5kIGB3YiBkZXBsb3lgIGNyZWF0ZSByb3V0aW5lbHkgYW5kIHdoaWNoXG4gKiB0aGVyZWZvcmUgc3RheSB1bnRyYWNrZWQgb24gZGV2IG1hY2hpbmVzIGZvcmV2ZXI6IGEgZm9ybWVyIGNoZWNrIHRoYXQgdHJlYXRlZCB0aGVtIGFzIGlycmVwcm9kdWNpYmxlIGlucHV0c1xuICogbWFkZSB3YmZ5IHJ1bnMgb24gZGV2IG1hY2hpbmVzIHJlLXRyYWNrIHRoZSB+MTVrLWxpbmUgZ2VuZXJhdGVkIGZpbGUgdGhhdCBydW5zIGZyb20gY2xlYW4gY2hlY2tvdXRzIGhhZFxuICogdW50cmFja2VkLCBvc2NpbGxhdGluZyBldGVybmFsbHkgKGUuZy4gYWktZ2FtZS1idWlsZGVyICM2ODQg4oaSICM3NDYpLiBSZWFkaW5nIGNvbW1pdHRhYmxlIHJlcG9zaXRvcnkgZmlsZXNcbiAqIGZyb20gdGhlIHdvcmtpbmcgdHJlZSAodGhlIHdyYW5nbGVyIGNvbmZpZywgcGFja2FnZS5qc29uLCB0c2NvbmZpZyDigJQgYXMgZXZlcnkgd2JmeSBnZW5lcmF0b3IgZG9lcykgaXMgZmluZTpcbiAqIGFueSBkaXZlcmdlbmNlIHRoZXJlIGlzIHRyYW5zaWVudCBhbmQgZGlzYXBwZWFycyBvbmNlIHRoZSBmaWxlIGlzIGNvbW1pdHRlZCBvciByZW1vdmVkLlxuICogVGhlIGhhemFyZCB0aGF0IGNoZWNrIGd1YXJkZWQgYWdhaW5zdCBubyBsb25nZXIgZXhpc3RzOiBgd2IgZ2VuLWNvZGVgIHJ1bnMgYHdyYW5nbGVyIHR5cGVzIC0tZW52LWZpbGVgIHdpdGhcbiAqIGEga2V5IHN0dWIgZGVyaXZlZCBzb2xlbHkgZnJvbSB0aGUgY29tbWl0dGVkIGZub3gudG9tbCAoc2VlIHdiJ3Mgd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIpLCBzbyBsb2NhbCBkb3RlbnZcbiAqIGZpbGVzIG5ldmVyIGluZmx1ZW5jZSB0aGUgZ2VuZXJhdGVkIGBFbnZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcgJiYgaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uKSAmJiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAncGFja2FnZUpzb24nPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNjcmlwdHMgPSBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHQpO1xuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSA9IHNlZ21lbnRzPy5zb21lKChzZWdtZW50KSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC9eKD86KD86YnVufGJ1bngpKD86IC0tYnVuKT8oPzogcnVuKT8gKT93YiBnZW4tY29kZSQvdS50ZXN0KG5vcm1hbGl6ZWQpICYmXG4gICAgICAgIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBzY3JpcHRzLCB0cnVlKSA9PT0gJ2N1c3RvbSdcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSkgcmV0dXJuIGAke25hbWV9IG11c3QgdXNlIHRoZSBjYW5vbmljYWwgYnVuIHdiIGdlbi1jb2RlIGNvbW1hbmRgO1xuICB9XG4gIC8vIE9ubHkgYGJ1biBydW4gPHNjcmlwdD5gIGlzIHJlY29nbml6ZWQgYXMgYSB3cmFwcGVyOyBhbm90aGVyIHJ1bm5lciBzcGVsbGluZyB3b3VsZCBnZXQgYSBtYW5hZ2VkXG4gIC8vIGdlbmVyYXRpb24gYXBwZW5kZWQgbmV4dCB0byBpdCBhbmQgcnVuIGV2ZXJ5IGdlbmVyYXRvciB0d2ljZSBwZXIgaW5zdGFsbC4gV2l0aG91dCBhIGdlbi1jb2RlXG4gIC8vIHBpcGVsaW5lIG5vdGhpbmcgaXMgYXBwZW5kZWQsIHNvIHRoZSBzcGVsbGluZyBpcyBpcnJlbGV2YW50IHRoZXJlLlxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnKSA/PyBbXSkge1xuICAgIGNvbnN0IHNjcmlwdE5hbWUgPSAvXig/OmJ1bnxidW54KSg/OlxccystLWJ1bik/KD86XFxzK3J1bik/XFxzKyhcXFMrKSQvdS5leGVjKHNlZ21lbnQpPy5bMV07XG4gICAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICBpZiAoXG4gICAgICB0YXJnZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgc2VnbWVudCAhPT0gYGJ1biBydW4gJHtzY3JpcHROYW1lfWAgJiZcbiAgICAgIChzY3JpcHRzWydnZW4tY29kZSddICE9PSB1bmRlZmluZWQgfHwgdGFyZ2V0LmluY2x1ZGVzKCd3YiBnZW4tY29kZScpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGBwb3N0aW5zdGFsbCBtdXN0IGludm9rZSB0aGUgJHtzY3JpcHROYW1lfSBzY3JpcHQgYXMgYnVuIHJ1biAke3NjcmlwdE5hbWV9YDtcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIC8oPzpefCYmKVxccyooPzpucG18bnB4fHBucG18eWFybilcXHMrKD86cnVuKD86LXNjcmlwdCk/XFxzKyk/KD86Z2VuLWNvZGV8d2JcXHMrZ2VuLWNvZGUpXFxzKig/OiYmfCQpL3UudGVzdChcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPz8gJydcbiAgICApXG4gICkge1xuICAgIHJldHVybiAncG9zdGluc3RhbGwgbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2YgYSBub24tQnVuIGdlbi1jb2RlIHJ1bm5lcic7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChzY3JpcHQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSBidW4gd2IgZ2VuLWNvZGUgaW5zdGVhZCBvZiB3cmFuZ2xlciB0eXBlc2A7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gW1xuICAgIHBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgICBwYWNrYWdlSnNvbj8ub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LnBlZXJEZXBlbmRlbmNpZXMsXG4gIF0uc29tZSgoZGVwZW5kZW5jaWVzKSA9PiBkZXBlbmRlbmNpZXM/LndyYW5nbGVyICE9PSB1bmRlZmluZWQpO1xufVxuXG5jb25zdCBzaGVsbFdvcmRQYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpcIig/OlxcXFwufFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwufFteJ1xcXFxdKSonfCg/OlxcXFwufFteXFxzXCInXFxcXF0pKylgO1xuY29uc3Qgd3JhbmdsZXJPcHRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2BcXHMrLS0/W0EtWmEtel1bXFx3LV0qKD86PSR7c2hlbGxXb3JkUGF0dGVybn18XFxzKyg/IS18dHlwZXNcXGIpJHtzaGVsbFdvcmRQYXR0ZXJufSk/YDtcbmNvbnN0IHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gIFN0cmluZy5yYXdgW1wiJ10/XFxid3JhbmdsZXIoPzpAW15cXHNcIiddKyk/XFxiW1wiJ10/KD86JHt3cmFuZ2xlck9wdGlvblBhdHRlcm59KSpcXHMrdHlwZXNcXGJgLFxuICAndSdcbik7XG5cbi8qKlxuICogQSBwYWNrYWdlIHdob3NlIFR5cGVTY3JpcHQgcHJvamVjdCBjYW5ub3QgaW5jbHVkZSB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIChlLmcuIG9uZSBvbiBhIGhhbmQtbWFpbnRhaW5lZFxuICogbWluaW1hbCBgRW52YCB3aXRoIGB0eXBlczogW1wiYnVuXCJdYCwgdGhlIHN0YW5kYXJkIGVzY2FwZSB3aGVuIHRoZSBhbWJpZW50IHdyYW5nbGVyIGdsb2JhbHMgY29uZmxpY3Qgd2l0aCB0aGVcbiAqIGBAdHlwZXMvYnVuYCBnbG9iYWxzIGl0cyB0ZXN0cyBuZWVkKSBnYWlucyBub3RoaW5nIGZyb20gcmVnZW5lcmF0aW5nIHRoZSB+NTAwS0IgZmlsZSBvbiBldmVyeSBpbnN0YWxsLCBzbyB3YmZ5XG4gKiBsZWF2ZXMgc3VjaCBwYWNrYWdlcyB1bm1hbmFnZWQgaW5zdGVhZCBvZiByZS1hZGRpbmcgdGhlIGdlbmVyYXRpb24gc3RlcC4gQ29uc3VtcHRpb24gaXMgZGV0ZWN0ZWQgdHdvIHdheXM6XG4gKiBhIHRleHR1YWwgYHdvcmtlci1jb25maWd1cmF0aW9uYCByZWZlcmVuY2UgaW4gYW55IHRyYWNrZWQgZmlsZSBvZiB0aGUgcGFja2FnZSAoY292ZXJzIGltcG9ydHMsIHRyaXBsZS1zbGFzaFxuICogcmVmZXJlbmNlcywgYW5kIGV4cGxpY2l0IHRzY29uZmlnIGVudHJpZXMpLCBvciBhIGBmaWxlc2AvYGluY2x1ZGVgL2BleGNsdWRlYCBzZXQgdGhhdCBjYW4gbWF0Y2ggdGhlIGZpbGUg4oCUXG4gKiByZXNvbHZlZCB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnMgd2l0aCBlYWNoIHBhdHRlcm4ga2VwdCByZWxhdGl2ZSB0byB0aGUgY29uZmlnIHRoYXQgZGVjbGFyZWQgaXQsXG4gKiBtYXRjaGluZyB0c2MuIFdoZW5ldmVyIHRoZSBlZmZlY3RpdmUgc2V0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIChtaXNzaW5nIG9yIHVucGFyc2VhYmxlIHRzY29uZmlnLCBwYWNrYWdlLW5hbWVcbiAqIGBleHRlbmRzYCBwcmVzZXRzLCBvciBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiksIHRoZSBjdXJyZW50IG1hbmFnZWQgYmVoYXZpb3IgaXMga2VwdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJz4pOiBib29sZWFuIHtcbiAgLy8gYGdpdCBncmVwYCBzZWFyY2hlcyB0cmFja2VkIGZpbGVzIG9ubHksIHNvIHRoZSBnaXRpZ25vcmVkIGdlbmVyYXRlZCBmaWxlIGl0c2VsZiBuZXZlciBtYXRjaGVzLlxuICAvLyB3YmZ5J3Mgb3duIG1hbmFnZWQgYXJ0aWZhY3RzIGFyZSBleGNsdWRlZDogdGhlIGAuZ2l0aWdub3JlYCBydWxlIChgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNgKVxuICAvLyB3YmZ5IGNvbW1pdHRlZCB3aGlsZSBpdCBtYW5hZ2VkIHRoZSBwYWNrYWdlIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLCBvciBhIG9uY2UtbWFuYWdlZFxuICAvLyBwYWNrYWdlIGNvdWxkIG5ldmVyIG9wdCBvdXQuXG4gIGNvbnN0IGdyZXBSZXN1bHQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ2dpdCcsXG4gICAgLy8gdHNjb25maWcgZmlsZXMgYXJlIGNsYXNzaWZpZWQgYnkgdGhlIHJlc29sdmVkIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSBsb2dpYyBiZWxvdyDigJQgYSB0ZXh0dWFsXG4gICAgLy8gaGl0IHRoZXJlIChlLmcuIGFuIGBleGNsdWRlYCBlbnRyeSkgbXVzdCBub3QgY291bnQgYXMgY29uc3VtcHRpb24uXG4gICAgW1xuICAgICAgJ2dyZXAnLFxuICAgICAgJy1sJyxcbiAgICAgICd3b3JrZXItY29uZmlndXJhdGlvbicsXG4gICAgICAnLS0nLFxuICAgICAgJy4nLFxuICAgICAgJzooZXhjbHVkZSkuZ2l0aWdub3JlJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGF0dHJpYnV0ZXMnLFxuICAgICAgU3RyaW5nLnJhd2A6KGdsb2IsZXhjbHVkZSkqKi90c2NvbmZpZyouanNvbmAsXG4gICAgXSxcbiAgICBjb25maWcuZGlyUGF0aFxuICApO1xuICBpZiAoZ3JlcFJlc3VsdC50cmltKCkpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgY29uc3QgZmlsZVNldCA9IHJlc29sdmVUc2NvbmZpZ0ZpbGVTZXQocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpLCBjb25maWcuZGlyUGF0aCwgNSk7XG4gIGlmICghZmlsZVNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1hdGNoZXMgPSAocGF0dGVyblNldDogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFwYXR0ZXJuU2V0IHx8ICFBcnJheS5pc0FycmF5KHBhdHRlcm5TZXQucGF0dGVybnMpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwYXR0ZXJuU2V0LmJhc2VEaXJQYXRoLCB3b3JrZXJUeXBlc1BhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgIHJldHVybiBwYXR0ZXJuU2V0LnBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIGAke2NvbmZpZ0Rpcn1gLXByZWZpeGVkIHBhdHRlcm5zIHdlcmUgZXhwYW5kZWQgdG8gYWJzb2x1dGUgcGF0aHMgYXQgcmVzb2x2ZSB0aW1lLlxuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgd29ya2VyVHlwZXNQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgICB9XG4gICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuLCByZWxhdGl2ZVBhdGgsIHBhdHRlcm5TZXQuZXhwYW5kc0RpcmVjdG9yaWVzKTtcbiAgICB9KTtcbiAgfTtcbiAgLy8gYGZpbGVzYCBlbnRyaWVzIGFyZSBhbHdheXMgcGFydCBvZiB0aGUgcHJvZ3JhbSwgZXZlbiB3aGVuIGBleGNsdWRlYCBtYXRjaGVzIHRoZW0uXG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZmlsZXMpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG1hdGNoZXMoZmlsZVNldC5leGNsdWRlKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBOZWl0aGVyIGluY2x1ZGUgbm9yIGZpbGVzIGRlY2xhcmVkOiBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiBjb3ZlcnMgdGhlIGZpbGUuXG4gIGlmICghZmlsZVNldC5pbmNsdWRlICYmICFmaWxlU2V0LmZpbGVzKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIG1hdGNoZXMoZmlsZVNldC5pbmNsdWRlKTtcbn1cblxuaW50ZXJmYWNlIFRzY29uZmlnUGF0dGVyblNldCB7XG4gIC8qKiBEaXJlY3Rvcnkgb2YgdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIHRoZSBwYXR0ZXJuczsgdHNjIHJlc29sdmVzIHRoZW0gcmVsYXRpdmUgdG8gaXQuICovXG4gIGJhc2VEaXJQYXRoOiBzdHJpbmc7XG4gIC8qKiBpbmNsdWRlL2V4Y2x1ZGUgdHJlYXQgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBwYXR0ZXJuIGFzIGEgZGlyZWN0b3J5IHN1YnRyZWU7IGBmaWxlc2AgZG9lcyBub3QuICovXG4gIGV4cGFuZHNEaXJlY3RvcmllczogYm9vbGVhbjtcbiAgcGF0dGVybnM6IHVua25vd247XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ0ZpbGVTZXQge1xuICBleGNsdWRlPzogVHNjb25maWdQYXR0ZXJuU2V0O1xuICBmaWxlcz86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgaW5jbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbn1cblxuLyoqIFJlc29sdmVzIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnM7IHVuZGVmaW5lZCB3aGVuIHVucmVhZGFibGUuICovXG5mdW5jdGlvbiByZXNvbHZlVHNjb25maWdGaWxlU2V0KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25zdW1lckRpclBhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nRGVwdGg6IG51bWJlclxuKTogVHNjb25maWdGaWxlU2V0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlbWFpbmluZ0RlcHRoIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCB0c2NvbmZpZyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8e1xuICAgIGV4Y2x1ZGU/OiB1bmtub3duO1xuICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIGZpbGVzPzogdW5rbm93bjtcbiAgICBpbmNsdWRlPzogdW5rbm93bjtcbiAgfT4oY29udGVudCk7XG4gIGlmICghdHNjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICAvLyBgJHtjb25maWdEaXJ9YCByZXNvbHZlcyB0byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBST09UIChjb25zdW1pbmcpIGNvbmZpZywgd2hlcmV2ZXIgaXQgYXBwZWFycy5cbiAgY29uc3QgdG9QYXR0ZXJuU2V0ID0gKHBhdHRlcm5zOiB1bmtub3duLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBUc2NvbmZpZ1BhdHRlcm5TZXQgfCB1bmRlZmluZWQgPT5cbiAgICBBcnJheS5pc0FycmF5KHBhdHRlcm5zKVxuICAgICAgPyB7XG4gICAgICAgICAgYmFzZURpclBhdGg6IGRpclBhdGgsXG4gICAgICAgICAgZXhwYW5kc0RpcmVjdG9yaWVzLFxuICAgICAgICAgIHBhdHRlcm5zOiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+XG4gICAgICAgICAgICB0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycgJiYgcGF0dGVybi5zdGFydHNXaXRoKCcke2NvbmZpZ0Rpcn0nKVxuICAgICAgICAgICAgICA/IHBhdGguam9pbihjb25zdW1lckRpclBhdGgsIHBhdHRlcm4uc2xpY2UoJyR7Y29uZmlnRGlyfScubGVuZ3RoKSlcbiAgICAgICAgICAgICAgOiBwYXR0ZXJuXG4gICAgICAgICAgKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbGVTZXQ6IFRzY29uZmlnRmlsZVNldCA9IHtcbiAgICBleGNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZXhjbHVkZSwgdHJ1ZSksXG4gICAgZmlsZXM6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5maWxlcywgZmFsc2UpLFxuICAgIGluY2x1ZGU6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5pbmNsdWRlLCB0cnVlKSxcbiAgfTtcbiAgY29uc3QgcGFyZW50cyA9XG4gICAgdHlwZW9mIHRzY29uZmlnLmV4dGVuZHMgPT09ICdzdHJpbmcnID8gW3RzY29uZmlnLmV4dGVuZHNdIDogQXJyYXkuaXNBcnJheSh0c2NvbmZpZy5leHRlbmRzKSA/IHRzY29uZmlnLmV4dGVuZHMgOiBbXTtcbiAgLy8gV2l0aCBhbiBgZXh0ZW5kc2AgYXJyYXksIGxhdGVyIGVudHJpZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzLCBhbmQgdGhlIGNoaWxkIG92ZXJyaWRlcyBhbGwg4oCUXG4gIC8vIHNvIGZpbGwgZWFjaCBzdGlsbC1taXNzaW5nIGtleSBmcm9tIHRoZSBsYXN0IHBhcmVudCB0aGF0IGRlZmluZXMgaXQuXG4gIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudHMudG9SZXZlcnNlZCgpKSB7XG4gICAgaWYgKGZpbGVTZXQuZXhjbHVkZSAmJiBmaWxlU2V0LmZpbGVzICYmIGZpbGVTZXQuaW5jbHVkZSkgYnJlYWs7XG4gICAgLy8gUGFja2FnZS1uYW1lIGV4dGVuZHMgKGUuZy4gYEB0c2NvbmZpZy9idW5gKSBhcmUgY29tcGlsZXJPcHRpb25zIHByZXNldHMgd2l0aG91dCBmaWxlIHNldHMuXG4gICAgaWYgKHR5cGVvZiBwYXJlbnQgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnQuc3RhcnRzV2l0aCgnLicpKSBjb250aW51ZTtcbiAgICBsZXQgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwYXJlbnQpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXJlbnRQYXRoKSAmJiBmcy5leGlzdHNTeW5jKGAke3BhcmVudFBhdGh9Lmpzb25gKSkgcGFyZW50UGF0aCArPSAnLmpzb24nO1xuICAgIGNvbnN0IHBhcmVudEZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhcmVudFBhdGgsIGNvbnN1bWVyRGlyUGF0aCwgcmVtYWluaW5nRGVwdGggLSAxKTtcbiAgICBpZiAoIXBhcmVudEZpbGVTZXQpIGNvbnRpbnVlO1xuICAgIGZpbGVTZXQuZXhjbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5leGNsdWRlO1xuICAgIGZpbGVTZXQuZmlsZXMgPz89IHBhcmVudEZpbGVTZXQuZmlsZXM7XG4gICAgZmlsZVNldC5pbmNsdWRlID8/PSBwYXJlbnRGaWxlU2V0LmluY2x1ZGU7XG4gIH1cbiAgcmV0dXJuIGZpbGVTZXQ7XG59XG5cbmZ1bmN0aW9uIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm46IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdHRlcm4ucmVwbGFjZSgvXlxcLlxcLy91LCAnJyk7XG4gIC8vIEEgYmFyZSBgLmAgaW5jbHVkZSBjb3ZlcnMgZXZlcnl0aGluZyB1bmRlciB0aGUgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICBpZiAobm9ybWFsaXplZCA9PT0gJycgfHwgbm9ybWFsaXplZCA9PT0gJy4nKSByZXR1cm4gdHJ1ZTtcbiAgLy8gQWJzb2x1dGUgcGF0dGVybnMgKGV4cGFuZGVkIGAke2NvbmZpZ0Rpcn1gKSBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSB0YXJnZXQ7IGRyb3AgdGhlXG4gIC8vIGxlYWRpbmcgc2xhc2hlcyBmcm9tIGJvdGggc28gdGhlIHNlZ21lbnQtYnVpbHQgcmVnZXggYW5jaG9ycyBpZGVudGljYWxseS5cbiAgdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXlxcLysvdSwgJycpO1xuICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKS5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgIT09ICcnKTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBzZWdtZW50c1xuICAgIC5tYXAoKHNlZ21lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChzZWdtZW50ID09PSAnKionKSByZXR1cm4gaXNMYXN0ID8gJy4qJyA6IFN0cmluZy5yYXdgKD86W14vXSsvKSpgO1xuICAgICAgY29uc3Qgc2VnbWVudFNvdXJjZSA9IHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgU3RyaW5nLnJhd2BbXi9dKmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgU3RyaW5nLnJhd2BbXi9dYCk7XG4gICAgICByZXR1cm4gaXNMYXN0ID8gc2VnbWVudFNvdXJjZSA6IGAke3NlZ21lbnRTb3VyY2V9L2A7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG4gIC8vIHRzYyB0cmVhdHMgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBpbmNsdWRlL2V4Y2x1ZGUgZW50cnkgYXMgYSBkaXJlY3Rvcnkgd2hvc2Ugc3VidHJlZSBpcyBpbmNsdWRlZC5cbiAgY29uc3QgbGFzdFNlZ21lbnQgPSBzZWdtZW50cy5hdCgtMSkgPz8gJyc7XG4gIGNvbnN0IGRpcmVjdG9yeVN1ZmZpeCA9XG4gICAgZXhwYW5kc0RpcmVjdG9yaWVzICYmICEvWyo/XS91LnRlc3QobGFzdFNlZ21lbnQpICYmICFsYXN0U2VnbWVudC5pbmNsdWRlcygnLicpID8gU3RyaW5nLnJhd2AoPzovLiopP2AgOiAnJztcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSR7ZGlyZWN0b3J5U3VmZml4fSRgLCAndScpLnRlc3QodGFyZ2V0UGF0aCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB0aGUgZGlyZWN0b3J5IG93bnMgYSBXb3JrZXIsIHVubGlrZSB0aGUgaXNDbG91ZGZsYXJlIGhldXJpc3RpYywgd2hpY2ggYWxzbyBtYXRjaGVzIGEgcGFja2FnZSB0aGF0XG4gKiBtZXJlbHkgbWVudGlvbnMgd3JhbmdsZXIgaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cgKGUuZy4gdGhlIHJvb3Qgb2YgYSBtb25vcmVwbyB3aG9zZSBXb3JrZXIgbGl2ZXMgaW4gYSBzdWItcGFja2FnZSkuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIGRpclBhdGggYmVsb25ncyB0byB0aGUgd2lsbGJvb3N0ZXItY29uZmlncyByZXBvc2l0b3J5LiBQcmVmZXJzIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBHaXRIdWIgcmVwbyBuYW1lLCB3aGljaCBpcyBpbW11bmUgdG8gdGhlIGxvY2FsIGRpcmVjdG9yeSBsYXlvdXQuIFRoYXQgbmFtZSBpcyBmZXRjaGVkIG9ubHkgZm9yIHRoZVxuICogcm9vdCwgc28gc3ViLXBhY2thZ2VzIChhbmQgb2ZmbGluZSByb290cykgd2FsayB1cCB0byB0aGUgbmVhcmVzdCBnaXQgcm9vdCBhbmQgbWF0Y2ggaXRzIGRpcmVjdG9yeVxuICogbmFtZTogYSBzaWJsaW5nIHJlcG8gY2xvbmVkIHVuZGVyIGEgcGFyZW50IGRpcmVjdG9yeSBuYW1lZCB3aWxsYm9vc3Rlci1jb25maWdzIHN0b3BzIGF0IGl0cyBvd25cbiAqIGAuZ2l0YCwgc28gaXQgaXMgbm90IG1pc2NsYXNzaWZpZWQuIFRoZSBwYXRoIHNlZ21lbnQgcmVtYWlucyBhIGxhc3QgcmVzb3J0IHdoZW4gbm8gZ2l0IHJvb3QgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmIChyZXBvTmFtZSkgcmV0dXJuIHJlcG9OYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgbGV0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBwYXRoLmRpcm5hbWUoY3VycmVudCkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5naXQnKSkpIHtcbiAgICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGN1cnJlbnQpLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgICB9XG4gICAgY3VycmVudCA9IHBhdGguZGlybmFtZShjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gcGFja2FnZUpzb25QYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJy93aWxsYm9vc3Rlci1jb25maWdzLycpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RDbG91ZGZsYXJlKFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW4sXG4gIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIGlmIChzY3JpcHRzICYmIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiBzY3JpcHQuaW5jbHVkZXMoJ3dyYW5nbGVyJykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL2Nsb3VkZmxhcmV8d3JhbmdsZXIvaXUudGVzdChjb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFJhaWx3YXkoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCdyYWlsd2F5JykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3JhaWx3YXkuanNvbicpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5LnRvbWwnKSlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dDb250ZW50cy5zb21lKChjb250ZW50KSA9PiAvcmFpbHdheS9pdS50ZXN0KGNvbnRlbnQpKTtcbn1cblxuLyoqIENvbnRlbnRzIG9mIHRoZSByZWFkYWJsZSAuZ2l0aHViL3dvcmtmbG93cyBZQU1MIGZpbGVzLCByZWFkIG9uY2UgZm9yIGV2ZXJ5IGRldGVjdG9yIG5lZWRpbmcgdGhlbS4gKi9cbmZ1bmN0aW9uIHJlYWRXb3JrZmxvd0ZpbGVDb250ZW50cyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzXG4gICAgICAucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aClcbiAgICAgIC5maWx0ZXIoKGZpbGVOYW1lKSA9PiAvXFwueWE/bWwkL2l1LnRlc3QoZmlsZU5hbWUpKVxuICAgICAgLmZsYXRNYXAoKGZpbGVOYW1lKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIFtmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKV07XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHsgdGFza3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnRhc2tzID8/IHt9KSkge1xuICAgICAgICB0YXNrc1tuYW1lXSA9IHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBvciB0ZW1wb3JhcmlseSBpbnZhbGlkIG1pc2UgZmlsZXMgc2hvdWxkIG5vdCBibG9jayBvdGhlciB3YmZ5IGdlbmVyYXRvcnMuXG4gICAgfVxuICB9XG4gIHJldHVybiB0YXNrcztcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gIC8vIFByZXNlcnZlIGFycmF5LWZvcm0gbWlzZSBjb21tYW5kcyBzbyByZWN1cnNpb24gY2hlY2tzIGNhbiBzdGlsbCBzZWUgcGFja2FnZSBzY3JpcHQgY2FsbHMuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmZpbHRlcigoY29tbWFuZCk6IGNvbW1hbmQgaXMgc3RyaW5nID0+IHR5cGVvZiBjb21tYW5kID09PSAnc3RyaW5nJykuam9pbignXFxuJyk7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSByZXR1cm4gcmVhZE1pc2VUYXNrQ29tbWFuZCgodmFsdWUgYXMgeyBydW4/OiB1bmtub3duIH0pLnJ1bik7XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGRpclBhdGggaXMgYSBjaGlsZCB3b3Jrc3BhY2Ugb2YgYW4gZW5jbG9zaW5nIG1vbm9yZXBvIHJvb3Q6IGVpdGhlciB0aGUgY29udmVudGlvbmFsXG4gKiBgPHJvb3Q+L3BhY2thZ2VzLzxuYW1lPmAgbGF5b3V0LCBvciBhIGRpcmVjdG9yeSBtYXRjaGluZyBhIHdvcmtzcGFjZSBwYXR0ZXJuIGRlY2xhcmVkIGJ5IGFuXG4gKiBhbmNlc3RvciBwYWNrYWdlLmpzb24gKHBhdHRlcm5zIG1heSBiZSBhcmJpdHJhcmlseSBkZWVwLCBlLmcuIGBleGFtcGxlcy8qKmApLiBUaGUgd2FsayBzdG9wc1xuICogYXQgdGhlIGZpcnN0IGdpdCByZXBvc2l0b3J5IGJvdW5kYXJ5IHNvIGFuIHVucmVsYXRlZCBlbmNsb3NpbmcgcmVwb3NpdG9yeSdzIHdvcmtzcGFjZXMgY2FuXG4gKiBuZXZlciByZWNsYXNzaWZ5IGFuIGluZGVwZW5kZW50IHJlcG9zaXRvcnkgYXMgYSBjaGlsZC5cbiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VPZkVuY2xvc2luZ1Jvb3QoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc29sdmVkRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgLy8gQSBkaXJlY3Rvcnkgd2l0aCBpdHMgb3duIC5naXQgaXMgYSByZXBvc2l0b3J5IGluIGl0cyBvd24gcmlnaHQsIG5ldmVyIGEgY2hpbGQgd29ya3NwYWNlIOKAlFxuICAvLyBjaGVja2VkIEZJUlNUIHNvIGFuIGluZGVwZW5kZW50IHJlcG9zaXRvcnkgdW5kZXIgc29tZSBgcGFja2FnZXMvYCBkaXJlY3Rvcnkgc3RheXMgYSByb290LlxuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLi4nKSkgPT09ICdwYWNrYWdlcycgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChcbiAgICBsZXQgY2FuZGlkYXRlUm9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUocmVzb2x2ZWREaXJQYXRoKTtcbiAgICA7XG4gICAgY2FuZGlkYXRlUm9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUoY2FuZGlkYXRlUm9vdERpclBhdGgpXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb290UGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICkgYXMgUGFja2FnZUpzb247XG4gICAgICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCByZXNvbHZlZERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHtcbiAgICAgICAgZGlyUGF0aDogY2FuZGlkYXRlUm9vdERpclBhdGgsXG4gICAgICAgIHBhY2thZ2VKc29uOiByb290UGFja2FnZUpzb24sXG4gICAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBmYWxzZSxcbiAgICAgIH0pLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSk7XG4gICAgICBpZiAod29ya3NwYWNlRGlyUGF0aHMuaW5jbHVkZXMocmVsYXRpdmVEaXJQYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBObyBvciB1bnBhcnNhYmxlIG1hbmlmZXN0IGF0IHRoaXMgYW5jZXN0b3I6IGtlZXAgd2Fsa2luZy5cbiAgICB9XG4gICAgY29uc3QgaXNSZXBvQm91bmRhcnkgPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgJy5naXQnKSk7XG4gICAgY29uc3QgaXNGaWxlc3lzdGVtUm9vdCA9IGNhbmRpZGF0ZVJvb3REaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoY2FuZGlkYXRlUm9vdERpclBhdGgpO1xuICAgIGlmIChpc1JlcG9Cb3VuZGFyeSB8fCBpc0ZpbGVzeXN0ZW1Sb290KSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5mdW5jdGlvbiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gZmdcbiAgICAuZ2xvYlN5bmMoJyoqL0NhcmdvLnRvbWwnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSlcbiAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEuc3BsaXQoJy8nKS5sZW5ndGggLSBiLnNwbGl0KCcvJykubGVuZ3RoIHx8IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFBsYXl3cmlnaHRSdW50aW1lSW1wb3J0KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlcyA9IGZnLmdsb2JTeW5jKCd7YXBwLHNyY30vKiovKi57Y2pzLGN0cyxqcyxqc3gsbWpzLG10cyx0cyx0c3h9Jywge1xuICAgIGRvdDogdHJ1ZSxcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgaWdub3JlOiBbLi4uZ2xvYklnbm9yZSwgJyoqL19fdGVzdHNfXy8qKicsICcqKi8qLnNwZWMuKicsICcqKi8qLnRlc3QuKicsICcqKi9wbGF5d3JpZ2h0LmNvbmZpZy4qJ10sXG4gIH0pO1xuICBjb25zdCBwbGF5d3JpZ2h0SW1wb3J0UGF0dGVybiA9IGJ1aWxkUnVudGltZUltcG9ydFJlZ0V4cCgncGxheXdyaWdodCcpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlKSwgJ3V0ZjgnKTtcbiAgICBpZiAocGxheXdyaWdodEltcG9ydFBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBidWlsZFJ1bnRpbWVJbXBvcnRSZWdFeHAocGFja2FnZU5hbWU6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIC8vIE1hdGNoIHRoZSBiYXJlIHNwZWNpZmllciBvciBhbnkgc3VicGF0aCBvZiBpdCAoYHBrZ2AgLyBgcGtnL3N1YmApLCBidXQgbmV2ZXIgYSBkaWZmZXJlbnQgcGFja2FnZVxuICAvLyB0aGF0IG1lcmVseSBzaGFyZXMgdGhlIHByZWZpeCAoYHBrZy1vdGhlcmApLCBzaW5jZSB0aGUgY2hhciBhZnRlciB0aGUgbmFtZSBtdXN0IGJlIGAvYCBvciBhIHF1b3RlLlxuICBjb25zdCBzcGVjaWZpZXIgPSBTdHJpbmcucmF3YFsnXCJdJHtlc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfSg/Oi9bXidcIl0qKT9bJ1wiXWA7XG4gIHJldHVybiBuZXcgUmVnRXhwKFxuICAgIFN0cmluZy5yYXdgXFxiZnJvbVxccyske3NwZWNpZmllcn18XFxiaW1wb3J0XFxzKlxcKFxccyoke3NwZWNpZmllcn1cXHMqXFwpfFxcYnJlcXVpcmVcXHMqXFwoXFxzKiR7c3BlY2lmaWVyfVxccypcXClgLFxuICAgICd1J1xuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZW1vdGVVcmwgPSBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aCk7XG4gIGlmIChyZW1vdGVVcmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb24uIFRoZSBvd25lciBNVVNUIGJlIHBhc3NlZDogZ2V0T2N0b2tpdCgpIHdpdGhvdXQgaXQgcHJlZmVycyB0aGVcbiAgICAvLyBXaWxsQm9vc3RlciBQQVQsIHdoaWNoIGNhbm5vdCByZWFkIHByaXZhdGUgV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yaWVzLCBjb2xsYXBzaW5nIHRoZWlyXG4gICAgLy8gdmlzaWJpbGl0eSB0byB1bmtub3duIChhbmQgZS5nLiBza2lwcGluZyB0aGUgd2JmeSBjYWxsZXIgZ2VuZXJhdGlvbiBpbmRlZmluaXRlbHkpLlxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChvcmcpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICAvLyBSZS1mZXRjaCB1bmRlciB0aGUgcmVkaXJlY3RlZCBpZGVudGl0eSBzbyBhIHJlbmFtZWQgcmVwb3NpdG9yeSBzdGlsbCBnZXRzIGNvbXBsZXRlXG4gICAgICAvLyBtZXRhZGF0YSAodmlzaWJpbGl0eSBpbmNsdWRlZCkgaW5zdGVhZCBvZiBhIGJhcmUgZnVsbF9uYW1lIHRoYXQgd291bGQgbGVhdmVcbiAgICAgIC8vIGlzUmVwb1Zpc2liaWxpdHlLbm93biBmYWxzZSBvbiBldmVyeSBzdWJzZXF1ZW50IHJ1biB3aXRoIHRoZSBzdGFsZSByZW1vdGUgVVJMLlxuICAgICAgY29uc3QgW3JlZGlyZWN0ZWRPcmcsIHJlZGlyZWN0ZWROYW1lXSA9IHJlZGlyZWN0ZWRGdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlZGlyZWN0ZWRPcmcgJiYgcmVkaXJlY3RlZE5hbWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQocmVkaXJlY3RlZE9yZykucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyOiByZWRpcmVjdGVkT3JnLFxuICAgICAgICAgICAgcmVwbzogcmVkaXJlY3RlZE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgYmFyZSBpZGVudGl0eSBiZWxvdzogdGhlIHJlcG9zaXRvcnkgaXMgc3RpbGwgY2Fub25pY2FsaXplZCwgb25seVxuICAgICAgICAgIC8vIGl0cyB2aXNpYmlsaXR5IHN0YXlzIHVua25vd24uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGZ1bGxfbmFtZTogcmVkaXJlY3RlZEZ1bGxOYW1lIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYDxvcmc+LzxuYW1lPmAgZnJvbSB0aGUgZ2l0IHJlbW90ZSAoZmFsbGluZyBiYWNrIHRvIHBhY2thZ2UuanNvbidzIGByZXBvc2l0b3J5YCkgd2l0aG91dFxuICogY2FsbGluZyB0aGUgR2l0SHViIEFQSS4gSXQgd29ya3MgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlLCBub3QganVzdCB0aGUgcm9vdCDigJQgb25seSB0aGUgcm9vdFxuICogZmV0Y2hlcyByZXBvIGluZm8g4oCUIGFuZCBpdCBrZWVwcyB3b3JraW5nIG9mZmxpbmUgb3IgcmF0ZS1saW1pdGVkLCB3aGVyZSBhbiB1bmRlZmluZWQgaWRlbnRpdHlcbiAqIHdvdWxkIHNpbGVudGx5IHJlY2xhc3NpZnkgdGhlIHJlcG9zaXRvcnkgKGUuZy4gbWFraW5nIHdiZnkgd3JpdGUgd2lsbGJvb3N0ZXItY29uZmlncycgUmVub3ZhdGVcbiAqIHByZXNldCBpbnRvIHRoZSBwcmVzZXQgaXRzZWxmIGFnYWluKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxvY2FsUmVwb0lkZW50aXR5KFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdPiB7XG4gIGNvbnN0IHJlbW90ZVVybCA9IGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoKTtcbiAgaWYgKHJlbW90ZVVybCkge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gcmVhZEdpdEh1YklkZW50aXR5KHJlbW90ZVVybCk7XG4gICAgaWYgKGlkZW50aXR5KSByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gcmVhZEdpdEh1YklkZW50aXR5KHVybCk7XG4gICAgaWYgKGlkZW50aXR5KSByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG59XG5cbmZ1bmN0aW9uIGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2NvbmZpZycsICctLWdldCcsICdyZW1vdGUub3JpZ2luLnVybCddLCBkaXJQYXRoKSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogYGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZWAgaXMgaG9zdC1hZ25vc3RpYywgc28gaXQgaGFwcGlseSB0dXJucyBhIEdpdExhYiBVUkwgaW50byBhbiBgPG9yZz4vPHJlcG8+YCBwYWlyLlxuICogRXZlcnl0aGluZyBkb3duc3RyZWFtIHRyZWF0cyB0aGUgcmVzdWx0aW5nIGlkZW50aXR5IGFzIEdpdEh1YiAodGhlIGBnaXRodWI6YCByZXBvc2l0b3J5IGZpZWxkIGlzIHJld3JpdHRlblxuICogaW50byBwYWNrYWdlLmpzb24pLCBzbyB0aGUgaG9zdCBtdXN0IGJlIHZlcmlmaWVkIGZpcnN0OyBhIG5vbi1HaXRIdWIgcmVtb3RlIHlpZWxkcyBubyBpZGVudGl0eSwgYXMgYmVmb3JlLlxuICovXG5mdW5jdGlvbiByZWFkR2l0SHViSWRlbnRpdHkodXJsOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0YXJnZXRzR2l0SHViKHVybCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybCk7XG4gIHJldHVybiBvcmcgJiYgbmFtZSA/IFtjYW5vbmljYWxpemVPd25lcihvcmcpLCBuYW1lXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBVUkwncyBIT1NUIGlzIGdpdGh1Yi5jb20uIFBhcnNlZCByYXRoZXIgdGhhbiBzdWJzdHJpbmctbWF0Y2hlZDogYSBwYXRoIHN1Y2ggYXNcbiAqIGBodHRwczovL2dpdGxhYi5jb20vZ2l0aHViLmNvbS9vd25lci9yZXBvLmdpdGAgd291bGQgb3RoZXJ3aXNlIGJlIHRha2VuIGZvciBHaXRIdWIsIGFuZCBhbiB1cHBlcmNhc2VcbiAqIGBHSVRIVUIuQ09NYCB3b3VsZCBiZSByZWplY3RlZC4gYGdpdGh1Yjpvd25lci9yZXBvYCBpcyBucG0ncyBzaG9ydGhhbmQgYW5kIG5hbWVzIG5vIGhvc3QsIHNvIGl0IGlzXG4gKiByZWNvZ25pemVkIHNlcGFyYXRlbHk7IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiBhY2NlcHRzIHRoZSBzYW1lIHNob3J0aGFuZC5cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0c0dpdEh1Yih1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoL15naXRodWI6L2l1LnRlc3QodXJsKSkgcmV0dXJuIHRydWU7XG4gIC8vIHNjcC1zdHlsZSByZW1vdGVzIChgZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwby5naXRgKSBhcmUgbm90IHZhbGlkIFVSTHMuXG4gIGNvbnN0IHNjcEhvc3QgPSAvXlteL0BdKkAoW146L10rKTovdS5leGVjKHVybCk/LlsxXTtcbiAgaWYgKHNjcEhvc3QpIHJldHVybiBzY3BIb3N0LnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJztcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwucmVwbGFjZSgvXmdpdFxcKy91LCAnJykpLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogR2l0SHViIG93bmVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgYSByZW1vdGUgb3IgbWFuaWZlc3QgVVJMIG1heSBzcGVsbCB0aGVtIGFueSB3YXksIGJ1dCB0aGUgQVBJJ3NcbiAqIGBmdWxsX25hbWVgIGFsd2F5cyByZXR1cm5lZCB0aGUgY2Fub25pY2FsIHNwZWxsaW5nIOKAlCB3aGljaCB0aGUgbWFueSBleGFjdCBgPT09ICdXaWxsQm9vc3RlcidgIHBvbGljeSBjaGVja3NcbiAqIChvcmdhbml6YXRpb24gd29ya2Zsb3dzLCBhdXRob3IgbWV0YWRhdGEsIHRoZSBXaWxsQm9vc3RlckxhYiBwcmUtcHVzaCBndWFyZCkgZGVwZW5kIG9uLiBDYW5vbmljYWxpemUgaGVyZSBzb1xuICogdGhlIGxvY2FsIGZhbGxiYWNrIHlpZWxkcyB0aGUgc2FtZSBpZGVudGl0eSB0aGUgQVBJIGRpZCwgaW5zdGVhZCBvZiBzaWxlbnRseSBza2lwcGluZyB0aG9zZSBwb2xpY2llcy5cbiAqL1xuZnVuY3Rpb24gY2Fub25pY2FsaXplT3duZXIob3duZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhbm9uaWNhbE93bmVycyA9IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXTtcbiAgcmV0dXJuIGNhbm9uaWNhbE93bmVycy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50b0xvd2VyQ2FzZSgpID09PSBvd25lci50b0xvd2VyQ2FzZSgpKSA/PyBvd25lcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IElTU1VFX1RFTVBMQVRFX1JVTEVTLCBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUywgVEVTVF9XUklUSU5HX1JVTEVTIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJ1bkFsbEluUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3csIGludm9rZXNXYkRlcGxveSB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBkZXBsb3lTY3JpcHRSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhbGxDb25maWdzLm1hcChhc3luYyAoY29uZmlnKSA9PiB7XG4gICAgICAgIGNvbnN0IHNjcmlwdHMgPSBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gICAgICAgIGNvbnN0IGRlcGxveVNjcmlwdCA9IHNjcmlwdHNbJ2RlcGxveSddO1xuICAgICAgICByZXR1cm4gdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiYgKGF3YWl0IGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQsIG5ldyBTZXQoT2JqZWN0LmtleXMoc2NyaXB0cykpKSk7XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgdXNlc1diRGVwbG95ID0gZGVwbG95U2NyaXB0UmVzdWx0cy5pbmNsdWRlcyh0cnVlKTtcblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCB1c2VzV2JEZXBsb3ksIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcnVuQWxsSW5Qb29sKFtcbiAgICAgIC4uLihcbiAgICAgICAgW1xuICAgICAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgICAgICBdIGFzIGNvbnN0XG4gICAgICApLm1hcCgoW2ZpbGVOYW1lLCB0b29sTmFtZV0pID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgdXNlc1diRGVwbG95LCBleHRyYUNvbnRlbnQpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgICAgcmV0dXJuICgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgICAgfSksXG4gICAgICAoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSxcbiAgICBdKTtcbiAgfSk7XG59XG5cbmNvbnN0IGFnZW50c0V4dHJhQ29udGVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuLyoqXG4gKiBSZWFkcyB0aGUgcm9vdCdzIHVzZXItYXV0aG9yZWQgQUdFTlRTX0VYVFJBLm1kIG9uY2UgcGVyIHByb2Nlc3M6IHdiZnkgbmV2ZXIgcmV3cml0ZXMgdGhlIGZpbGUsXG4gKiBhbmQgYm90aCB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gYW5kIEdlbWluaSBnZW5lcmF0b3JzIG5lZWQgaXRzIGNvbnRlbnQuIENhY2hpbmcgdGhlIHJlc29sdmVkXG4gKiB2YWx1ZSAobm90IHRoZSBQcm9taXNlKSBpcyByYWNlLWZyZWUgYmVjYXVzZSB0aGUgdHdvIGNhbGxlcnMgcnVuIHNlcXVlbnRpYWxseSBpbiBpbmRleC50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICBpZiAoIWFnZW50c0V4dHJhQ29udGVudENhY2hlLmhhcyhhZ2VudHNFeHRyYVBhdGgpKSB7XG4gICAgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuc2V0KGFnZW50c0V4dHJhUGF0aCwgYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoYWdlbnRzRXh0cmFQYXRoKSk7XG4gIH1cbiAgcmV0dXJuIGFnZW50c0V4dHJhQ29udGVudENhY2hlLmdldChhZ2VudHNFeHRyYVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdXNlc1diRGVwbG95OiBib29sZWFuLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCB1c2VzV2JEZXBsb3ksIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIHVzZXNXYkRlcGxveTogYm9vbGVhbixcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9ICdidW4nO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9uO1xuICBjb25zdCBmbm94SW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSlcbiAgICA/IGBcXG4tIEVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBsaXZlIGluIFxcYGZub3gudG9tbFxcYCAobWlzZSArIGZub3gpOyBuZXZlciBjcmVhdGUgXFxgLmVudlxcYCwgXFxgLmVudi4qXFxgLCBvciBcXGAuZGV2LnZhcnNcXGAgZmlsZXMuIFJ1biBjb21tYW5kcyB0aHJvdWdoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIC4uLlxcYCBvciBcXGBmbm94IHJ1biAtUCA8cHJvZmlsZT4gLS0gPGNvbW1hbmQ+XFxgLiBQcm9maWxlIHNlY3JldHMgbG9hZCBvbmx5IHdoZW4gYSBwcm9maWxlIGlzIHNlbGVjdGVkOiBtb2RlLWF3YXJlIHdiIGNvbW1hbmRzIChlLmcuIFxcYHdiIHN0YXJ0XFxgLCBcXGB3YiB0ZXN0XFxgKSBhbmQgXFxgd2IgZG90ZW52XFxgIHNlbGVjdCBpdCB0aGVtc2VsdmVzIChcXGB3YiBkb3RlbnZcXGAgdXNlcyBcXGBXQl9FTlZcXGAsIGVsc2UgXFxgRk5PWF9QUk9GSUxFXFxgLCBlbHNlIFxcYE5PREVfRU5WXFxgLCBlbHNlIHRoZSBkZXZlbG9wbWVudCBwcm9maWxlOyBcXGBXQl9FTlZcXGAgYWNjZXB0cyBvbmx5IFxcYGRldmVsb3BtZW50XFxgL1xcYHRlc3RcXGAvXFxgc3RhZ2luZ1xcYC9cXGBwcm9kdWN0aW9uXFxgLCBzbyB1c2UgXFxgRk5PWF9QUk9GSUxFXFxgIGZvciBhbnkgb3RoZXIgcHJvZmlsZSksIHdoaWxlIGJhcmUgXFxgZm5veCBydW5cXGAgbmVlZHMgYW4gZXhwbGljaXQgXFxgLVAgPHByb2ZpbGU+XFxgLmBcbiAgICA6ICcnO1xuICAvLyBtaXNlIG93bnMgdGhlIHBpbm5lZCB0b29sIHZlcnNpb25zLCBzbyBhIHZlcnNpb24gbWlzbWF0Y2ggaXMgZml4ZWQgYnkgZWRpdGluZyBtaXNlLnRvbWwg4oCUIG5vdFxuICAvLyBieSBpbnN0YWxsaW5nIGEgZGlmZmVyZW50IHZlcnNpb24gZ2xvYmFsbHksIHdoaWNoIHRoZSBuZXh0IGBtaXNlIGluc3RhbGxgIHNpbGVudGx5IG92ZXJyaWRlcy5cbiAgY29uc3QgbWlzZUluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJykpXG4gICAgPyAnXFxuLSBUb29sIHZlcnNpb25zIChlLmcuLCBub2RlKSBhcmUgcGlubmVkIGluIGBtaXNlLnRvbWxgOyBydW4gYG1pc2UgaW5zdGFsbGAgYWZ0ZXIgY2hhbmdpbmcgaXQgYW5kIG5ldmVyIGluc3RhbGwgdGhvc2UgdG9vbHMgZ2xvYmFsbHkgaW5zdGVhZC4nXG4gICAgOiAnJztcbiAgLy8gSXNvbGF0ZWQgaW5zdGFsbHMgYXJlIHRoZSBvcmcgc3RhbmRhcmQgKHdiZnkgZ2VuZXJhdGVzIG5vIG90aGVyIGxpbmtlcikgYW5kIHRoZSBtb3N0XG4gIC8vIGFnZW50LWhvc3RpbGUgcGFydCBvZiB0aGUgc3RhY2s6IGEgcGFja2FnZSB0aGF0IGlzIG9ubHkgcmVhY2hhYmxlIGJlY2F1c2UgYSBkZXBlbmRlbmN5IGhvaXN0ZWRcbiAgLy8gaXQgbm8gbG9uZ2VyIHJlc29sdmVzLCBhbmQgdGhlIHJlZmxleCBmaXggKHN3aXRjaGluZyB0aGUgbGlua2VyIGJhY2spIHNpbGVudGx5IHJlaW50cm9kdWNlc1xuICAvLyB0aGUgcGhhbnRvbSBkZXBlbmRlbmNpZXMgdGhlIGxheW91dCBleGlzdHMgdG8gY2F0Y2guXG4gIGNvbnN0IGlzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9uID0gYFxcbi0gXFxgYnVuZmlnLnRvbWxcXGAgdXNlcyBCdW4ncyBpc29sYXRlZCBsaW5rZXIsIHNvIG9ubHkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIHJlc29sdmUuIElmIGFuIGltcG9ydCBmYWlscyB0byByZXNvbHZlLCBkZWNsYXJlIHRoYXQgcGFja2FnZSBpbiB0aGUgXFxgcGFja2FnZS5qc29uXFxgIHRoYXQgaW1wb3J0cyBpdDsgbmV2ZXIgc3dpdGNoIFxcYGxpbmtlclxcYCB0byBcXGBob2lzdGVkXFxgIG9yIGFkZCB0byBcXGBwdWJsaWNIb2lzdFBhdHRlcm5cXGAgdG8gd29yayBhcm91bmQgaXQuYDtcbiAgLy8gRXZlcnkgY2xhdXNlIHN0YXRlcyBvbmx5IGEgdmVyaWZpZWQgZmFjdCwgcmV1c2luZyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3Mgb3duIGRldGVjdG9yczogdGhlXG4gIC8vIHdyYW5nbGVyLWNvbmZpZyBjbGF1c2UgbmVlZHMgYW4gYWN0dWFsIGNvbmZpZyBmaWxlIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlclxuICAvLyBtZW50aW9uIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93KSwgdGhlIHdvcmtmbG93IGNsYXVzZSBuZWVkcyBhIGxpdmUgcmV1c2FibGUtZGVwbG95IGNhbGxlclxuICAvLyAoWUFNTC1wYXJzZWQgam9icy4qLnVzZXMsIG5vdCBhIHJhdy10ZXh0L2NvbW1lbnQgbWF0Y2gpLCBhbmQgdGhlIGB3YiBkZXBsb3lgIGNsYXVzZSBuZWVkcyBhXG4gIC8vIGRlcGxveSBzY3JpcHQgd2hvc2UgY29tbWFuZCB0b2tlbiBpcyBgd2Ig4oCmIGRlcGxveWAuXG4gIGNvbnN0IG93bnNXcmFuZ2xlckNvbmZpZyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIC8vIE9ubHkgY2xhaW0gdGhlIGZpbGUgaXMgZ2VuZXJhdGVkIHdoZXJlIGl0IGFjdHVhbGx5IGlzOiBhIHBhY2thZ2UgdGhhdCBoYW5kLW1haW50YWlucyBpdHMgYEVudmAgKGUuZy4gdW5kZXJcbiAgLy8gYHR5cGVzOiBbXCJidW5cIl1gKSBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0ZWxsaW5nIGFuIGFnZW50IHRvIHJ1biBgd2IgZ2VuLWNvZGVgIHRoZXJlIHdvdWxkIHNlbmRcbiAgLy8gaXQgYWZ0ZXIgYSBmaWxlIHRoYXQgbmV2ZXIgYXBwZWFycyDigJQgYW5kIGF3YXkgZnJvbSB0aGUgYEVudmAgaXQgc2hvdWxkIGJlIGVkaXRpbmcuXG4gIGNvbnN0IG93bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbiAgY29uc3QgaGFzRGVwbG95V29ya2Zsb3cgPSBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWIvd29ya2Zsb3dzJykpO1xuICAvLyBJbmRlcGVuZGVudCBmYWN0cyBzdGF5IHNlcGFyYXRlIHNlbnRlbmNlczogdGhlIHdvcmtmbG93J3Mgb3duIGRlcGxveSBtZWNoYW5pc20gaXMgbm90XG4gIC8vIGluc3BlY3RlZCwgc28gdGhlIHdiLWRlcGxveSBjbGF1c2UgbXVzdCBub3QgY2xhaW0gdGhlIHdvcmtmbG93IGludm9rZXMgaXQuXG4gIGNvbnN0IGNsb3VkZmxhcmVJbnN0cnVjdGlvbiA9IG93bnNXcmFuZ2xlckNvbmZpZ1xuICAgID8gYFxcbi0gVGhpcyBwcm9qZWN0IHJ1bnMgb24gQ2xvdWRmbGFyZSBXb3JrZXJzOiB0aGUgd3JhbmdsZXIgY29uZmlndXJhdGlvbiBmaWxlIGhvbGRzIHRoZSBXb3JrZXIncyBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgYmluZGluZ3MgYW5kIHBlci1lbnZpcm9ubWVudCBvdmVycmlkZXMuJHtoYXNEZXBsb3lXb3JrZmxvdyA/ICcgVGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYCBwZXJmb3JtIGRlcGxveW1lbnRzLicgOiAnJ30ke3VzZXNXYkRlcGxveSA/ICcgVGhlIGBkZXBsb3lgIHBhY2thZ2Ugc2NyaXB0IHJ1bnMgYHdiIGRlcGxveWAuJyA6ICcnfSR7b3duc0dlbmVyYXRlZFdvcmtlclR5cGVzID8gYFxcbi0gXFxgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c1xcYCBpcyBnaXRpZ25vcmVkIGFuZCBnZW5lcmF0ZWQgYnkgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgZ2VuLWNvZGVcXGA7IGFmdGVyIGNoYW5naW5nIGJpbmRpbmdzIG9yIHZhcnMgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZ3VyYXRpb24sIHJlLXJ1biBpdCBpbnN0ZWFkIG9mIGVkaXRpbmcgdGhlIGZpbGUgYnkgaGFuZC5gIDogJyd9YFxuICAgIDogJyc7XG4gIC8vIFdpbGxCb29zdGVyIFJhaWx3YXkgcHJvamVjdCBpZGVudGlmaWVycyBhcmUgbWFuYWdlZCBpbiBkZXBsb3kgd29ya2Zsb3cgc2V0dGluZ3MuXG4gIGNvbnN0IHJhaWx3YXlJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNSYWlsd2F5XG4gICAgPyAnXFxuLSBSYWlsd2F5IHByb2plY3QgaW5mb3JtYXRpb24gaXMgaW4gdGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYC4nXG4gICAgOiAnJztcbiAgY29uc3QgcGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbiA9IGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGFsbENvbmZpZ3MpXG4gICAgPyBgXFxuLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJyc7XG4gIGNvbnN0IGNvQXV0aG9ySW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuICAtIEVuZCB5b3VyIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBibGFuayBsaW5lIGZvbGxvd2VkIGJ5IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgLCB0aGUgb25seSBBSSBhdHRyaWJ1dGlvbiB0byBhZGQuYFxuICAgIDogJyc7XG4gIC8vIEtleWVkIG9uIHRoZSByZXBvc2l0b3J5IGNsYXNzaWZpY2F0aW9uIHJhdGhlciB0aGFuIG9uIHRoZSB0ZW1wbGF0ZSBmaWxlcycgcHJlc2VuY2U6IHRoZSBzYW1lXG4gIC8vIHJ1biB3cml0ZXMgdGhlIHRlbXBsYXRlcyBmb3IgV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3JpZXMgYmVmb3JlIHRoaXMgZ2VuZXJhdG9yXG4gIC8vIHJ1bnMsIGFuZCBoYW5kLWFkZGVkIHRlbXBsYXRlcyBlbHNld2hlcmUgYmVsb25nIHRvIEFHRU5UU19FWFRSQS5tZC5cbiAgY29uc3QgcHJUZW1wbGF0ZUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbiR7UFVMTF9SRVFVRVNUX0JPRFlfUlVMRVMucmVwbGFjZUFsbCgvXi9nbSwgJyAgJyl9YFxuICAgIDogJyc7XG4gIC8vIEdhdGVkIGxpa2UgcHJUZW1wbGF0ZUluc3RydWN0aW9uOiB0aGUgc2VjdGlvbiBpdCBuYW1lcyBleGlzdHMgb25seSB3aGVyZSB0aGUgdGVtcGxhdGUgaXMgZ2VuZXJhdGVkLlxuICBjb25zdCByZXF1aXJlbWVudHNFeGVtcHRpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBcIiBvdGhlciB0aGFuIHRoZSBQUiBib2R5J3MgUmVxdWlyZW1lbnRzIHNlY3Rpb24gKHdoaWNoIHN0YXRlcyB3aGF0IGlzIGN1cnJlbnRseSBhc2tlZCBmb3IgcmF0aGVyIHRoYW4gd2hhdCB0aGUgY29kZSBjb250YWlucylcIlxuICAgIDogJyc7XG4gIGNvbnN0IGlzc3VlVGVtcGxhdGVJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4tIFdoZW4gY3JlYXRpbmcgYW4gaXNzdWU6XFxuJHtJU1NVRV9URU1QTEFURV9SVUxFUy5yZXBsYWNlQWxsKC9eL2dtLCAnICAnKX1gXG4gICAgOiAnJztcbiAgY29uc3QgbGFuZ3VhZ2VJbnN0cnVjdGlvbiA9XG4gICAgZ2V0RGVmYXVsdFByb3NlTGFuZ3VhZ2Uocm9vdENvbmZpZykgPT09ICdKYXBhbmVzZSdcbiAgICAgID8gJ1xcbi0gVW5sZXNzIGluc3RydWN0ZWQgb3RoZXJ3aXNlLCB3cml0ZSBpc3N1ZXMsIFBScywgcmV2aWV3IGNvbW1lbnRzLCBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgcGVvcGxlIChSRUFETUUsIGBkb2NzL2ApIGluIEphcGFuZXNlLCBhbmQgZXZlcnkgb3RoZXIgYXJ0aWZhY3QgKGluY2x1ZGluZyBjb2RlIGNvbW1lbnRzLCBKU0RvYywgYW5kIGFnZW50IGluc3RydWN0aW9ucykgZXhjZXB0IHlvdXIgY29udmVyc2F0aW9uYWwgcmVwbGllcyBhbmQgcHJvZHVjdC1mYWNpbmcgdGV4dCBpbiBFbmdsaXNoLidcbiAgICAgIDogJ1xcbi0gVW5sZXNzIGluc3RydWN0ZWQgb3RoZXJ3aXNlLCB3cml0ZSBldmVyeSBhcnRpZmFjdCBleGNlcHQgeW91ciBjb252ZXJzYXRpb25hbCByZXBsaWVzIGFuZCBwcm9kdWN0LWZhY2luZyB0ZXh0IGluIEVuZ2xpc2guJztcbiAgY29uc3QgcnVubmVySW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyAnXFxuLSBQcml2YXRlIHJlcG9zaXRvcmllcyB1c2Ugc2VsZi1ob3N0ZWQgQ0kgcnVubmVycy4gS2VlcCBPUy9zaXplIGNvbnN0cmFpbnRzIGluIGFuIGV4cGxpY2l0IHNlbGYtaG9zdGVkIGxhYmVsIGFycmF5OyBmaXggbWlzc2luZyBydW5uZXIgY2FwYWJpbGl0aWVzIGluc3RlYWQgb2Ygc3dpdGNoaW5nIHRvIEdpdEh1Yi1ob3N0ZWQgcnVubmVycy4gVGhlIHNvbGUgYXBwcm92ZWQgZXhjZXB0aW9uIGlzIHRoZSBXaW5kb3dzIGRlc2t0b3AgYnVpbGQgaW4gV2lsbEJvb3N0ZXIvY2hlZXJsaW5ncy4nXG4gICAgOiAnJztcbiAgY29uc3QgcHJvamVjdE5hbWUgPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5uYW1lIHx8IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCkpO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Byb2plY3ROYW1lfVxcYCR7ZGVzY3JpcHRpb24gPyBgXFxuLSBEZXNjcmlwdGlvbjogJHtkZXNjcmlwdGlvbn1gIDogJyd9XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBJZiBvbiBcXGBtYWluXFxgLCBjcmVhdGUgYSBuZXcgYnJhbmNoOyBvdGhlcndpc2Ugd29yayBvbiB0aGUgY3VycmVudCBicmFuY2guXG4tIFJ1biBcXGBnaXRcXGAgY29tbWFuZHMgb25lIGF0IGEgdGltZSB0byBhdm9pZCBcXGBpbmRleC5sb2NrXFxgIGNvbmZsaWN0cy4ke2xhbmd1YWdlSW5zdHJ1Y3Rpb259XG4ke1RFU1RfV1JJVElOR19SVUxFU31cbi0gV2hlbiBmaXhpbmcgaXNzdWVzIChpbmNsdWRpbmcgdGVzdCBmYWlsdXJlcyksIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCB2aWEgZGVidWcgbG9ncyBvciBzY3JlZW5zaG90cykgYW5kIGZpeCBpdCBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY2hhbmdlcywgYXMgYSBydWxlLCBydW4gb25seSB3aGF0IGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGNoYW5nZSBsb2NhbGx5LCBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5XFxgICh0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nOyB1cCB0byAxMCBtaW51dGVzKSBhbmQgdGhlIHJlbGV2YW50IHRlc3RzLCBhbmQgbGVhdmUgdGhlIGZ1bGwgdGVzdCBzdWl0ZSAoXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHZlcmlmeS1mdWxsXFxgOyB1cCB0byAxIGhvdXIpIHRvIHRoZSBQUidzIENJLiBJZiBQUiBDSSBkb2VzIG5vdCBydW4gdGhlIGZ1bGwgc3VpdGUsIHJ1biBpdCBsb2NhbGx5LiBGaXggZXJyb3JzLCBpbmNsdWRpbmcgQ0kgZmFpbHVyZXMsIGFuZCByZS1ydW4gdW50aWwgdGhleSBwYXNzLlxuICAtIFJ1biByZWxldmFudCB0ZXN0cyB3aXRoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHRlc3QgdGVzdC91bml0L2V4YW1wbGUudGVzdC50cyAtLWdyZXAgJ2Nhc2UgbmFtZSdcXGAgKG9taXQgXFxgLS1ncmVwXFxgIGZvciB0aGUgd2hvbGUgZmlsZTsgdXNlIFxcYC13IHBhY2thZ2VzL2V4YW1wbGVcXGAgaW4gYSBtb25vcmVwbykuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHZlcmlmeSAtLWZ1bGwgPHRlc3QtcGF0aD4gLS1ncmVwICdjYXNlIG5hbWUnXFxgIGNvbWJpbmVzIHZlcmlmaWNhdGlvbiB3aXRoIHNlbGVjdGVkIHRlc3RzLlxuICAtIFdhaXQgZm9yIGl0IHRvIGZpbmlzaCB3aXRob3V0IHJlc3RhcnRpbmcgaXQ6IHByZWZlciBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbnMsIG90aGVyd2lzZSB0aGUgbG9uZ2VzdCBwZXJtaXR0ZWQgd2FpdDsgbm8gb3V0cHV0IGRvZXMgbm90IG1lYW4gaXQgaGFzIHN0b3BwZWQuIElmIHRoZSBkaXNwbGF5ZWQgZXhjZXJwdCBpcyBpbnN1ZmZpY2llbnQsIHJlYWQgdGhlIGluZGljYXRlZCBsb2cgZmlsZSBiZWZvcmUgcmVydW5uaW5nLiBJZiB0aGUgZW52aXJvbm1lbnQga2lsbHMgbG9uZy1ydW5uaW5nIGNvbW1hbmRzLCBydW4gdGhlbSBkZXRhY2hlZCB3aXRoIGEgc2F2ZWQgbG9nIGFuZCBleGl0IHN0YXR1cy5cbi0gT25jZSB2ZXJpZmllZCwgY29tbWl0IGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCBhbmQgY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgYnJhbmNoLlxuICAtIEZvbGxvdyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgZm9ybWF0IChlLmcuLCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCkuJHtjb0F1dGhvckluc3RydWN0aW9ufVxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHM7IGF2b2lkIFxcYC0tYW1lbmRcXGAuJHtwclRlbXBsYXRlSW5zdHJ1Y3Rpb259JHtpc3N1ZVRlbXBsYXRlSW5zdHJ1Y3Rpb259XG4tIEluIGFueSBleHBsYW5hdG9yeSB0ZXh0IChjb21taXQgbWVzc2FnZXMsIFBSIGRlc2NyaXB0aW9ucywgZG9jdW1lbnRhdGlvbiwgY29kZSBjb21tZW50cywgZXRjLikke3JlcXVpcmVtZW50c0V4ZW1wdGlvbn0sIGRlc2NyaWJlIG9ubHkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb246IGRyb3AgYW55IHN0YXRlbWVudCBuYW1pbmcgYW4gaWRlbnRpZmllciwgZmVhdHVyZSwgb3IgY29uY2VwdCB5b3UgY2Fubm90IGNvbmZpcm0gZXhpc3RzIGluIHRoZSBmaW5hbCBkaWZmIG9yIHRoZSBjdXJyZW50IGNvZGViYXNlIChlLmcuLCBvbmUgYWRkZWQgYW5kIGxhdGVyIHJlbW92ZWQgb3IgcmVuYW1lZCBhbG9uZyB0aGUgd2F5KS4gV2hlbmV2ZXIgZG9jdW1lbnRhdGlvbiBvciBjb21tZW50cyBubyBsb25nZXIgbWF0Y2ggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gKHJlbW92ZWQgb3B0aW9ucywgZGVwcmVjYXRlZCB1c2FnZSwgb3V0ZGF0ZWQgYmVoYXZpb3IpLCBkZWxldGUgb3IgcmV3cml0ZSB0aGVtLCBldmVuIGluIGZpbGVzIHlvdSBhcmUgbm90IG90aGVyd2lzZSBjaGFuZ2luZy4gTWVudGlvbiBhIHBhc3Qgc3RhdGUgb25seSB3aGVyZSBpdCBpcyBuZWVkZWQgdG8gdW5kZXJzdGFuZCB3aHkgdGhlIGN1cnJlbnQgZGVzaWduIGlzIGFzIGl0IGlzLCBvciB3aGVuIGV4cGxpY2l0bHkgYXNrZWQ7IGZpbGVzIHRoYXQgcmVjb3JkIGhpc3RvcnkgYnkgZGVzaWduIChlLmcuLCBhIGNoYW5nZWxvZykgYXJlIGV4ZW1wdC5cbi0gVXNlIGhlcmVkb2MgZm9yIG11bHRpLWxpbmUgY29tbWFuZCBpbnB1dCAoZS5nLiwgXFxgZ2l0IGNvbW1pdCAtRiAtXFxgLCBcXGBnaCBwciBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCwgXFxgZ2ggaXNzdWUgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uXG4tIFxcYEFHRU5UUy5tZFxcYCwgXFxgQ0xBVURFLm1kXFxgLCBcXGBHRU1JTkkubWRcXGAsIFxcYC5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGNcXGAsIGFuZCBcXGAuZ2VtaW5pL3N0eWxlZ3VpZGUubWRcXGAgYXJlIGdlbmVyYXRlZCBmcm9tIFxcYEFHRU5UU19FWFRSQS5tZFxcYCBhbmQgb3ZlcndyaXR0ZW4gb24gZXZlcnkgXFxgd2JmeVxcYCBydW47IHRvIGNoYW5nZSBhZ2VudCBpbnN0cnVjdGlvbnMsIGVkaXQgb25seSBcXGBBR0VOVFNfRVhUUkEubWRcXGAuJHttaXNlSW5zdHJ1Y3Rpb259JHtpc29sYXRlZEluc3RhbGxJbnN0cnVjdGlvbn0ke2Zub3hJbnN0cnVjdGlvbn0ke2Nsb3VkZmxhcmVJbnN0cnVjdGlvbn0ke3JhaWx3YXlJbnN0cnVjdGlvbn0ke3BsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb259JHtydW5uZXJJbnN0cnVjdGlvbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZywgYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbi8qKlxuICogVGhlIGxhbmd1YWdlIGlzc3VlcywgUFJzLCByZXZpZXcgY29tbWVudHMsIGFuZCBkb2N1bWVudGF0aW9uIGRlZmF1bHQgdG86IEphcGFuZXNlIG9ubHkgaW4gYVxuICogV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5IGNvbmZpcm1lZCBwcml2YXRlLiBBbiB1bmtub3duIHZpc2liaWxpdHkgKG9mZmxpbmUgcnVuLFxuICogZmFpbGVkIGxvb2t1cCkgeWllbGRzIEVuZ2xpc2ggc28gdGhhdCBhIEphcGFuZXNlIGRlZmF1bHQgaXMgbmV2ZXIgd3JpdHRlbiBpbnRvIGEgcHVibGljIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZShyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ0VuZ2xpc2gnIHwgJ0phcGFuZXNlJyB7XG4gIHJldHVybiByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvICYmIHJvb3RDb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duICYmICFyb290Q29uZmlnLmlzUHVibGljUmVwb1xuICAgID8gJ0phcGFuZXNlJ1xuICAgIDogJ0VuZ2xpc2gnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIFRhdXJpIGRlc2t0b3AgYXBwcyBzaGlwIFdpbmRvd3MgYnVpbGRzLCBhbmQgdGhlIGJvdW5kYXJ5IGJldHdlZW4gYXBwIGNvZGUgYW5kIHNoYXJlZCBjb2RlIGlzXG4gIC8vIHRvbyBmdXp6eSB0byBzY29wZSB0aGUgbWFjT1MvTGludXgtb25seSBydWxlIHBlciBwYWNrYWdlLCBzbyBzdWNoIHJlcG9zaXRvcmllcyB0YXJnZXQgYWxsXG4gIC8vIHRocmVlIE9TZXMgaW5zdGVhZC5cbiAgY29uc3QgaGFzRGVza3RvcEFwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcudGF1cmkgfHwgYy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcyk7XG4gIC8vIEEgcHVibGljIHJlcG9zaXRvcnkgd2l0aCBubyBgQHdpbGxib29zdGVyL2AgcGFja2FnZSBpcyBPU1MgZm9yIHRoZSBnZW5lcmFsIHB1YmxpYywgd2hvc2UgdXNlcnNcbiAgLy8gbWF5IHJ1biBXaW5kb3dzLCBzbyBubyBPUyByZXN0cmljdGlvbiBhcHBsaWVzIHRoZXJlLiBBbiB1bmtub3duIHZpc2liaWxpdHkgY29sbGFwc2VzIHRvXG4gIC8vIGlzUHVibGljUmVwbz1mYWxzZSBhbmQgdGhlcmVmb3JlIGtlZXBzIHRoZSByZXN0cmljdGl2ZSBkZWZhdWx0LlxuICBjb25zdCBpc0dlbmVyYWxQdWJsaWNPc3MgPVxuICAgIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvICYmIGFsbENvbmZpZ3MuZXZlcnkoKGMpID0+ICFjLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAvLyBPbmx5IHB1YmxpYyByZXBvc2l0b3JpZXMgcHVibGlzaCBwYWNrYWdlcyB0byB0aGUgcHVibGljIG5wbSByZWdpc3RyeSwgd2hvc2UgdXNlcnMgcmVhZCB0aGVcbiAgLy8gSlNEb2Mgd2l0aG91dCB0aGUgc291cmNlOyBwcml2YXRlIHJlcG9zaXRvcmllcyBhcmUgcmVhZCBvbmx5IGJ5IGFnZW50cyB0aGF0IGhhdmUgdGhlIHNvdXJjZS5cbiAgY29uc3QgbnBtQXBpRXhjZXB0aW9uID0gcm9vdENvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICA/ICcgRXhjZXB0aW9uOiB0aGUgZXhwb3J0ZWQgQVBJIG9mIGEgcGFja2FnZSBwdWJsaXNoZWQgdG8gbnBtIG1heSBjYXJyeSBKU0RvYyBkZXNjcmliaW5nIHdoYXQgaXQgZG9lcyBhbmQgaG93IHRvIGNhbGwgaXQsIGJlY2F1c2UgaXRzIHVzZXJzIHJlYWQgaXQgd2l0aG91dCB0aGUgc291cmNlLidcbiAgICA6ICcnO1xuICBjb25zdCBjb21tZW50SW5zdHJ1Y3Rpb24gPSBgLSBDb21tZW50cyBhbmQgSlNEb2M6IGV2ZXJ5IHJlYWRlciBoYXMgdGhlIHNvdXJjZSwgc28gbmV2ZXIgcmVzdGF0ZSB3aGF0IHRoZSBjb2RlLCBpdHMgbmFtZXMsIG9yIGl0cyB0eXBlcyBhbHJlYWR5IHNheSAoZS5nLiwgXFxgQHBhcmFtIG5hbWUgVGhlIG5hbWVcXGApLiBXcml0ZSBvbmUgb25seSB3aGVuIGEgcGxhdXNpYmxlIGVkaXQgd291bGQgYnJlYWsgc29tZXRoaW5nIHdpdGhvdXQgdGhhdCBrbm93bGVkZ2UgYW5kIG5vIHR5cGUgY2hlY2ssIGxpbnQgcnVsZSwgb3IgdGVzdCB3b3VsZCBjYXRjaCBpdDsgZmlyc3QgZW5jb2RlIHRoZSBrbm93bGVkZ2UgaW4gY29kZSAoYSBuYW1lLCBhIHR5cGUsIGFuIFxcYGFzc2VydFxcYCwgYSB0ZXN0KSBhbmQgY29tbWVudCBvbmx5IHdoYXQgY2Fubm90IGJlIGVuY29kZWQ6IGFuIG9kZC1sb29raW5nIHdvcmthcm91bmQsIGEgZGVwZW5kZW5jeSBvbiBhIGZhY3Qgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgb3IgYSByZWplY3RlZCBhbHRlcm5hdGl2ZSBhbmQgd2h5LiBQdXQgYSBjb250cmFjdCBvZiB0aGUgZGVjbGFyZWQgc3ltYm9sIGluIEpTRG9jIGFuZCBsaW5lLXNwZWNpZmljIGtub3dsZWRnZSBpbiBhbiBpbmxpbmUgY29tbWVudC4gRGVsZXRlIGNvbW1lbnRzIHRoYXQgZmFpbCB0aGlzIHRlc3QgaW4gZmlsZXMgeW91IHRvdWNoLiR7bnBtQXBpRXhjZXB0aW9ufWA7XG4gIGNvbnN0IG9zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9uID0gaXNHZW5lcmFsUHVibGljT3NzXG4gICAgPyAnJ1xuICAgIDogaGFzRGVza3RvcEFwcFxuICAgICAgPyAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MsIG1hY09TLCBhbmQgTGludXguJ1xuICAgICAgOiAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSBvbmx5IHdpdGggbWFjT1MgYW5kIExpbnV4OyBkbyBub3QgaW5jbHVkZSBXaW5kb3dzLXNwZWNpZmljIGNvZGUuJztcbiAgLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIGV4ZWN1dGUgYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzIGFuZCB0d28gcmVxdWVzdHMgYXJlIG5vdCBndWFyYW50ZWVkXG4gIC8vIHRvIGhpdCB0aGUgc2FtZSBpbnN0YW5jZSwgc28gdGhlIHNpbmdsZS1pbnN0YW5jZSBzaW1wbGlmaWNhdGlvbiBzaWxlbnRseSBsb3NlcyBzdGF0ZSB0aGVyZSDigJRcbiAgLy8gYnV0IFdvcmtlcnMgZGVsaWJlcmF0ZWx5IHJldXNlIGV4ZWN1dGlvbiBjb250ZXh0cywgc28gYmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgc3RheVxuICAvLyBsZWdpdGltYXRlIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy9yZWZlcmVuY2UvaG93LXdvcmtlcnMtd29ya3MvKS4gVGhlXG4gIC8vIHNpZ25hbHMgYXJlIGNvcnJlbGF0ZWQgUEVSIFBBQ0tBR0U6IGEgbW9ub3JlcG8gY2FuIGhvc3QgYSBzaW5nbGUtaW5zdGFuY2Ugc2VydmVyIGFwcCBuZXh0IHRvXG4gIC8vIGFuIHVucmVsYXRlZCBXb3JrZXIsIGFuZCBuZWl0aGVyIG1heSBvdmVycmlkZSB0aGUgb3RoZXIncyBydWxlLiBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnIGlzXG4gIC8vIHRoZSBhY2N1cmF0ZSBXb3JrZXJzIHNpZ25hbCAoaXNDbG91ZGZsYXJlIGFsc28gbWF0Y2hlcyBhIG1lcmUgd3JhbmdsZXIgbWVudGlvbiBpbiBhIHNjcmlwdCBvclxuICAvLyB3b3JrZmxvdykuXG4gIGNvbnN0IGhhc1dvcmtlcnNBcHAgPSBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIGNvbnN0IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwID0gYWxsQ29uZmlncy5zb21lKFxuICAgIChjKSA9PiAoYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpICYmICFjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWdcbiAgKTtcbiAgY29uc3Qgd29ya2Vyc0luc3RydWN0aW9uID1cbiAgICAnLSBDbG91ZGZsYXJlIFdvcmtlcnMgcnVuIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcywgc28gdHdvIHJlcXVlc3RzIG1heSBoaXQgZGlmZmVyZW50IGluc3RhbmNlczogbmV2ZXIgbGV0IGNvcnJlY3RuZXNzIGRlcGVuZCBvbiBtb2R1bGUtbGV2ZWwgbXV0YWJsZSBzdGF0ZTsgcGVyc2lzdCBhdXRob3JpdGF0aXZlIHNoYXJlZCBzdGF0ZSBpbiBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKS4gQmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgb2Ygbm9uLXJlcXVlc3Qtc2NvcGVkIGRhdGEgYXJlIGZpbmUuJztcbiAgY29uc3Qgc2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbiA9IGhhc1dvcmtlcnNBcHBcbiAgICA/IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwXG4gICAgICA/IGAke3dvcmtlcnNJbnN0cnVjdGlvbn0gVGhpcyBhcHBsaWVzIHRvIGFsbCBjb2RlIHJ1bm5pbmcgb24gQ2xvdWRmbGFyZSBXb3JrZXJzICh0aGUgd3JhbmdsZXItY29uZmlndXJlZCBwYWNrYWdlcyBhbmQgYW55IHdvcmtzcGFjZSBwYWNrYWdlIHRoZXkgaW1wb3J0KTsgYXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIG90aGVyIHNlcnZlciBhcHBzLmBcbiAgICAgIDogd29ya2Vyc0luc3RydWN0aW9uXG4gICAgOiBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcFxuICAgICAgPyAnLSBBc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLidcbiAgICAgIDogJyc7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZpbGUgbmFtZXMgZm9yIEphdmFTY3JpcHQvVHlwZVNjcmlwdCAoUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIG1vZHVsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGggaGlnaCBjb2hlc2lvbiBhbmQgbG93IGNvdXBsaW5nOyBzcGxpdCBsYXJnZSBtb2R1bGVzIHdoZW4gbmVlZGVkLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCAodG9wLWRvd24gb3JkZXIpOyBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgYWJvdmUgdGhlaXIgdXNhZ2UuXG4ke2NvbW1lbnRJbnN0cnVjdGlvbn1cbi0gTmV2ZXIgZXhwbGFpbiBob3cgV2lsbEJvb3N0ZXIncyBpbi1ob3VzZSB0b29scyAoZS5nLiwgXFxgd2JcXGAsIFxcYHdiZnlcXGApIHdvcmsgaW4gY29kZSBjb21tZW50cyBvciBkb2N1bWVudHMgb3V0c2lkZSB0aGUgdG9vbCdzIG93biBwYWNrYWdlLCBleGNlcHQgaW4gaW5zdHJ1Y3Rpb25zIGZvciBBSSBhZ2VudHMgKGUuZy4sIGRvIG5vdCBub3RlIHRoYXQgXFxgUE9SVFxcYCBpcyB1bnNldCBiZWNhdXNlIFxcYHdiXFxgIHBpY2tzIGEgZnJlZSBwb3J0KS5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gVmFsaWRhdGUgSmF2YVNjcmlwdCBvYmplY3RzIChlLmcuLCBwYXJzZWQgSlNPTiwgQVBJIHJlc3BvbnNlcykgd2l0aCBcXGB6b2RcXGAgd2hlbmV2ZXIgcG9zc2libGUgaW5zdGVhZCBvZiBoYW5kLXdyaXR0ZW4gY2hlY2tzIG9yIHR5cGUgYXNzZXJ0aW9ucy5cbi0gQnVpbGQgcHJvbXB0cyBhcyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIG9uIGEgcHJlLWNvbXB1dGFibGUgYXJyYXkgb2Ygc3RyaW5ncy5cbi0gQXNzdW1lIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWQ7IGlmIHZhbGlkYXRpb24gaXMgbmVlZGVkLCBcXGBhc3NlcnRcXGAgdGhlbSBhdCBzdGFydHVwIHRvIGZhaWwgZmFzdC5cbi0gQXNzdW1lIGxvY2FsIHRvb2xzIHN1Y2ggYXMgXFxgZ2l0XFxgLCBcXGBnaFxcYCwgYW5kIFxcYGdocVxcYCBhcmUgaW5zdGFsbGVkIGFuZCBhdXRoZW50aWNhdGVkLlxuJHtvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gUmVnaXN0ZXIgc3RyaW5nIGxpdGVyYWxzIGZvciBSZWFjdCBjb21wb25lbnRzIGluIHRoZSBcXGBpMThuXFxgIHJlc291cmNlIGZpbGVzIChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApIGFuZCByZWZlcmVuY2UgdGhlbSB2aWEgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eSAoZS5nLiwgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYCkuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGAtIFByZWZlciBsYW1iZGEgb3ZlciBcXGBmdW5jdGlvblxcYCBmb3IgUmVhY3QgY29tcG9uZW50cywgZS5nLiwgXFxgY29uc3QgQnV0dG9uOiBSZWFjdC5GQyA9ICgpID0+IHtcXGAuXG4tIFByZWZlciBcXGB1c2VJbW1lclxcYCBvdmVyIFxcYHVzZVN0YXRlXFxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4tIFVzZSBcXGBhdXRvRm9jdXNcXGAgd2hlcmUgaXQgcmVkdWNlcyB1c2VyIGVmZm9ydC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgLy8gdmluZXh0IGlzIHRoZSBvcmcncyBjdXJyZW50IHdlYi1hcHAgZnJhbWV3b3JrIGFuZCBlbmFibGVzIHRoZSBSZWFjdCBDb21waWxlciBqdXN0IGFzIE5leHQuanNcbiAgLy8gZG9lcywgc28gaXQgbXVzdCBub3QgbWlzcyB0aGlzIHJ1bGUuXG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpXG4gICAgPyBgXG4tIFRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgc28gXFxgdXNlQ2FsbGJhY2tcXGAgYW5kIFxcYHVzZU1lbW9cXGAgYXJlIHVubmVjZXNzYXJ5IGZvciBwZXJmb3JtYW5jZS5cbmBcbiAgICA6ICcnXG59XG4ke3NlcnZlckluc3RhbmNlSW5zdHJ1Y3Rpb259XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCk7XG59XG4iLCIiLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgcmVsZWFzZUFnZUdhdGUgZnJvbSAnLi4vLi4vY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uJyB3aXRoIHsgdHlwZTogJ2pzb24nIH07XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBCdW5maWdUb21sIHtcbiAgaW5zdGFsbD86IHtcbiAgICBleGFjdD86IGJvb2xlYW47XG4gICAgZ2xvYmFsU3RvcmU/OiBib29sZWFuO1xuICAgIGxpbmtlcj86IHN0cmluZztcbiAgICBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzPzogc3RyaW5nW107XG4gIH07XG59XG5cbi8vIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiBpcyB0aGUgb3JnYW5pemF0aW9uJ3Mgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIHBvbGljeTogdGhlXG4vLyBtYWNoaW5lcycgZ2xvYmFsIGNvbmZpZ3MgZ2V0IGl0IHRocm91Z2ggY29uZmlncy9hcHBseVJlbGVhc2VBZ2VHYXRlLnNoIChydW4gYnkgd2JmeSBpdHNlbGYsIGJ5XG4vLyByZXVzYWJsZS13b3JrZmxvd3Mgb24gQ0ksIGFuZCBieSBzZWxmLWhvc3QtdXRpbHMgb24gdGhlIHJ1bm5lcnMpLCBhbmQgcmVwb3NpdG9yaWVzIGdldCBpdCBoZXJlLlxuLy8gT3VyIG93biBwYWNrYWdlcyBhcmUgZXhlbXB0OiB3ZSBjb250cm9sIHdobyBwdWJsaXNoZXMgdGhlbSwgc28gYSBjb21wcm9taXNlZCByZWxlYXNlIGNhbm5vdFxuLy8gcmVhY2ggdXMgdGhyb3VnaCBhbiB1cHN0cmVhbSBtYWludGFpbmVyJ3Mgc3RvbGVuIGNyZWRlbnRpYWxzLiBUaGF0IGNvdmVycyBldmVyeVxuLy8gQHdpbGxib29zdGVyLXByaXZhdGUgcGFja2FnZSAodGhlIHNjb3BlIHJlc29sdmVzIG9ubHkgZnJvbSBvdXIgb3duIHJlZ2lzdHJ5KSwgYnV0IGJ1biwgbnBtLCBhbmRcbi8vIFlhcm4gbWF0Y2ggZXhjbHVkZSBlbnRyaWVzIGJ5IGV4YWN0IG5hbWUg4oCUIG5vIEBzY29wZS8qIHBhdHRlcm5zIOKAlCBzbyBlYWNoIG5ldyBwYWNrYWdlIGluIHRoZVxuLy8gc2NvcGUgbXVzdCBiZSBhZGRlZCB0byBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gd2hlbiBpdCBpcyBmaXJzdCBwdWJsaXNoZWQuIFRoZSBvbmx5IHBlcm1hbmVudFxuLy8gdGhpcmQtcGFydHkgZXhlbXB0aW9uIGlzIHRoZSBDb2RleCBDTEksIHdob3NlIG5ld2VzdCBtb2RlbHMgcnVuIG9ubHkgb24gaXRzIGxhdGVzdCByZWxlYXNlcy5cbi8vIE90aGVyIHRoaXJkLXBhcnR5IHBhY2thZ2VzIOKAlCBpbmNsdWRpbmcgdG9vbGluZyB3YmZ5IHBpbnMgaXRzZWxmIOKAlCBzdGF5IGFnZS1nYXRlZDtcbi8vIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24gaW4gcGFja2FnZUpzb24udHMgcGlucyB0aGUgbmV3ZXN0IHJlbGVhc2Ugb2xkIGVub3VnaCB0byBwYXNzXG4vLyB0aGUgZ2F0ZSwgc28gcGlubmluZyBrZWVwcyB3b3JraW5nIHdpdGhvdXQgYW4gZXhlbXB0aW9uLiBgdGVtcG9yYXJ5RXhjbHVkZXNgIGxldHMgYSB0aGlyZC1wYXJ0eVxuLy8gcmVsZWFzZSBuZWVkZWQgbm93IChhIHNlY3VyaXR5IGZpeCwgb3IgYW4gU0RLIGEgbmV3IG1vZGVsIHJlcXVpcmVzKSBpbiBpbW1lZGlhdGVseSBhbmQgZ2F0ZXMgdGhlXG4vLyBwYWNrYWdlIGFnYWluIGZyb20gdGhlIGdpdmVuIFVUQyBkYXRlLCBzbyB0aGUgbmV4dCB3YmZ5IHJ1biByZXN0b3JlcyB0aGUgZ2F0ZSB3aXRob3V0IGFueW9uZVxuLy8gaGF2aW5nIHRvIHJlbWVtYmVyIHRvIHJlbW92ZSB0aGUgZW50cnkuIExpc3QgZXZlcnkgcGFja2FnZSB0aGF0IHJlbGVhc2UgcGlucyBleGFjdGx5IGFuZFxuLy8gcHVibGlzaGVzIGFsb25nc2lkZSBpdCwgc2luY2UgZXhjbHVzaW9uIG1hdGNoZXMgZXhhY3QgbmFtZXMgb25seS5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSByZWxlYXNlQWdlR2F0ZS5kYXlzICogMjQgKiA2MCAqIDYwO1xuY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gIC4uLnJlbGVhc2VBZ2VHYXRlLmV4Y2x1ZGVzLFxuICAuLi5PYmplY3QuZW50cmllcyhyZWxlYXNlQWdlR2F0ZS50ZW1wb3JhcnlFeGNsdWRlcylcbiAgICAuZmlsdGVyKChbLCBnYXRlZEFnYWluRnJvbV0pID0+IHRvZGF5IDwgZ2F0ZWRBZ2FpbkZyb20pXG4gICAgLm1hcCgoW3BhY2thZ2VOYW1lXSkgPT4gcGFja2FnZU5hbWUpLFxuXTtcblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZXBvc2l0b3J5J3MgYnVuZmlnLnRvbWwgbGlzdHMgdG9kYXkncyBleGVtcHRpb25zLiBgdGVtcG9yYXJ5RXhjbHVkZXNgIGNoYW5nZXMgdGhlbSBieVxuICogZGF0ZSBhbG9uZSwgc28gYSByZXBvc2l0b3J5IGFscmVhZHkgY29uZmlndXJlZCBieSB0aGUgcnVubmluZyB3YmZ5IGJ1aWxkIG11c3Qgbm90IGJlIHNraXBwZWRcbiAqIG9uY2UgdGhleSBkaWZmZXIsIG9yIGFuIGV4cGlyZWQgZXhlbXB0aW9uIHdvdWxkIG91dGxpdmUgaXRzIGRhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDdXJyZW50QnVuUmVsZWFzZUFnZUV4Y2x1ZGVzKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdidW5maWcudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgZXhjbHVkZXMgPSBwYXJzZUJ1bmZpZ1RvbWwoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpKT8uaW5zdGFsbD8ubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcztcbiAgcmV0dXJuIGV4Y2x1ZGVzPy5qb2luKCdcXG4nKSA9PT0gYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5qb2luKCdcXG4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRCdW5HbG9iYWxTdG9yZShyb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHBhcnNlQnVuZmlnVG9tbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpPy5pbnN0YWxsPy5nbG9iYWxTdG9yZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5HbG9iYWxTdG9yZShcbiAgY29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBza2lwRGVwczogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSA9IHNob3VsZFVzZUJ1bkdsb2JhbFN0b3JlKGNvbmZpZ3MpO1xuICByZXR1cm4gc2tpcERlcHMgPyAocHJldmlvdXNHbG9iYWxTdG9yZSA/PyBkZWZhdWx0VXNlR2xvYmFsU3RvcmUpIDogZGVmYXVsdFVzZUdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIC8vIEJsaXR6IGJ1aWxkcyBvbiBOZXh0LmpzIGJ1dCBuZWVkIG5vdCBkZWNsYXJlIGl0IGRpcmVjdGx5LCBhbmQgaXRzIGNvZGVnZW4gYWxzbyBwYXRjaGVzIE5leHRcbiAgLy8gaW5zaWRlIG5vZGVfbW9kdWxlcy4gQm90aCBmcmFtZXdvcmtzIHRoZXJlZm9yZSByZXF1aXJlIHByb2plY3QtbG9jYWwgaXNvbGF0ZWQgaW5zdGFsbHMuXG4gIC8vIFNsaWRldiBsb2FkcyBvcHRpb25hbCBWdWUgY29tcGlsZXIgcGVlcnMgdGhyb3VnaCBsb2NhbC1wa2cuIFRoZSBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzXG4gIC8vIGxvY2FsLXBrZyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBzbyBOb2RlIGNhbm5vdCByZXNvbHZlIGEgY29tcGlsZXIgZGVjbGFyZWQgYnkgdGhlIHByb2plY3QuXG4gIHJldHVybiAhY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuc2xpZGV2KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcsIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIC8vIG1pbmltdW1SZWxlYXNlQWdlIGFuZCBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIGFyZSBvcmcgcG9saWN5LCBuZXZlciByZXBvc2l0b3J5IHBvbGljeTogYm90aFxuICAvLyBhcmUgcmV3cml0dGVuIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbidzIHZhbHVlcyBvbiBldmVyeSBydW4sIHNvIGEgaGFuZC1lZGl0ZWQgKHdlYWtlbmVkKVxuICAvLyBnYXRlIGNhbm5vdCBzdXJ2aXZlIHJlZ2VuZXJhdGlvbi4gRHJvcHBpbmcgcmVwb3NpdG9yeS1zcGVjaWZpYyBleGNsdWRlIGVudHJpZXMgaXMgZmFpbC1zYWZlIOKAlCBhblxuICAvLyB1bmNvdmVyZWQgcGFja2FnZSBiZWNvbWVzIGFnZS1nYXRlZCBhbmQgc3VyZmFjZXMgYXQgaW5zdGFsbCB0aW1lIGluc3RlYWQgb2Ygd2Vha2VuaW5nIHRoZSBnYXRlLlxuICAvLyBUdXJib3BhY2sgcmVqZWN0cyBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVjYXVzZSB0aGV5IHJlc29sdmUgb3V0c2lkZSBpdHMgZmlsZXN5c3RlbSByb290LlxuICAvLyBLZWVwaW5nIE5leHQuanMgaW5zdGFsbHMgcHJvamVjdC1sb2NhbCBhdm9pZHMgd2lkZW5pbmcgdGhhdCByb290IHRvICRIT01FIChvciBgL2AgaW4gRG9ja2VyKSxcbiAgLy8gd2hpY2ggd291bGQgZXhwYW5kIGRldmVsb3BtZW50IGZpbGVzeXN0ZW0gd2F0Y2hpbmcgYW5kIGJ5cGFzcyB0aGUgYm91bmRhcnkncyBjYWNoZSBiZW5lZml0cy5cbiAgY29uc3QgZ2xvYmFsU3RvcmVMaW5lID0gdXNlR2xvYmFsU3RvcmUgPyAnZ2xvYmFsU3RvcmUgPSB0cnVlJyA6ICdnbG9iYWxTdG9yZSA9IGZhbHNlJztcbiAgLy8gTm8gYFtydW5dIGJ1biA9IHRydWVgOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrc1xuICAvLyB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KTsgYW55IGV4aXN0aW5nIHNldHRpbmcgaXMgZHJvcHBlZC5cbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIOKAlCB0c3g6IGJ1aWxkLXRzIHVuZGVyIE5vZGUuanMgc3Bhd25zIGBub2RlIC0taW1wb3J0IHRzeGAsIHdoaWNoIHJlc29sdmVzXG4gIC8vIHRzeCBmcm9tIHRoZSBjb25zdW1lciBwYWNrYWdlJ3MgZGlyZWN0b3J5LCBub3QgZnJvbSBidWlsZC10cydzIG93biBkZXBlbmRlbmNpZXMuXG4gIC8vIHVuZGljaS10eXBlczogYnVuLXR5cGVzIHJlZmVyZW5jZXMgaXQgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSk7XG4gIC8vIGdlbmVyYXRlZCB0c2NvbmZpZ3MgYWxzbyBtYXAgdW5kaWNpLXR5cGVzIHRvIHRoZSBob2lzdGVkIGNvcHkgKHNlZSB0c2NvbmZpZy50cykgYmVjYXVzZSB0aGVcbiAgLy8gZ2xvYmFsIHN0b3JlIHJlYWxwYXRocyBidW4tdHlwZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGV4aXN0aW5nQ29udGVudCl9W2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbiR7Z2xvYmFsU3RvcmVMaW5lfVxubGlua2VyID0gXCJpc29sYXRlZFwiXG5wdWJsaWNIb2lzdFBhdHRlcm4gPSBbXCJ0c3hcIiwgXCJ1bmRpY2ktdHlwZXNcIl1cbm1pbmltdW1SZWxlYXNlQWdlID0gJHtidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHN9XG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHtidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbi8qKlxuICogUHJlc2VydmUgdGhlIHByb2plY3QncyBgW3Rlc3RdYCBzZWN0aW9ucyAoZS5nLiBwcmVsb2FkIHNjcmlwdHMgc3dhcHBpbmcgYSBDbG91ZGZsYXJlIEQxIGNsaWVudFxuICogZm9yIGEgbG9jYWwgU1FMaXRlIG9uZSkgdmVyYmF0aW0sIGNvbW1lbnRzIGluY2x1ZGVkOyB3YmZ5IG1hbmFnZXMgb25seSB0aGUgb3RoZXIgc2VjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghY29udGVudCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IHByZXNlcnZlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5UZXN0U2VjdGlvbiA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBzZWN0aW9uTWF0Y2ggPSAvXlxccypcXFsoW15cXF1dKylcXF0vLmV4ZWMobGluZSk7XG4gICAgaWYgKHNlY3Rpb25NYXRjaCkge1xuICAgICAgaW5UZXN0U2VjdGlvbiA9IHNlY3Rpb25NYXRjaFsxXSA9PT0gJ3Rlc3QnIHx8IChzZWN0aW9uTWF0Y2hbMV0gYXMgc3RyaW5nKS5zdGFydHNXaXRoKCd0ZXN0LicpO1xuICAgIH1cbiAgICBpZiAoaW5UZXN0U2VjdGlvbiAmJiBsaW5lLnRyaW0oKSkge1xuICAgICAgcHJlc2VydmVkTGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZXNlcnZlZExpbmVzLmxlbmd0aCA+IDAgPyBgJHtwcmVzZXJ2ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5cXG5gIDogJyc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGUgZGVwbG95cyBHaXQtYmFzZWQgcHJpdmF0ZSBwYWNrYWdlcyBmcm9tIG5vZGVfbW9kdWxlcywgYnV0IHRoZSBEb2NrZXIgY29udGV4dCBzaG91bGQgc3RheSBuYXJyb3cuXG5jb25zdCBpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnMgPSBbJ0B3aWxsYm9vc3RlciddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuLmVudipcbioqLy5EU19TdG9yZVxuKiovLmNhY2hlXG4qKi8uY2xhdWRlXG4qKi8uY3Vyc29yXG4qKi8uZWRpdG9yY29uZmlnXG4qKi8uZXNsaW50Y2FjaGVcbioqLy5nZW1pbmlcbioqLy5naXRcbioqLy5naXRhdHRyaWJ1dGVzXG4qKi8uZ2l0aHViXG4qKi8uZ2l0aWdub3JlXG4qKi8uaWRlYVxuKiovLmxlZnRob29rXG4qKi8ubXlweV9jYWNoZVxuKiovLm5leHQvY2FjaGVcbioqLy5ucG1cbioqLy5wYXJjZWwtY2FjaGVcbioqLy5wbnBtLXN0b3JlXG4qKi8ucHl0ZXN0X2NhY2hlXG4qKi8ucmFpbHdheWlnbm9yZVxuKiovLnJlbGVhc2VyYy5qc29uXG4qKi8ucnVmZl9jYWNoZVxuKiovLnRtcFxuKiovLnRtcC0qLyoqXG4qKi8udHVyYm9cbioqLy50b3hcbioqLy52c2NvZGVcbioqLy55YXJuL2NhY2hlXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuKiovX19weWNhY2hlX19cbioqLyoubG9nXG4qKi8qLnB5Y1xuKiovKi50c2J1aWxkaW5mb1xuKiovY292ZXJhZ2VcbioqL25vZGVfbW9kdWxlcy8qKlxuJHtpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnNcbiAgLm1hcChcbiAgICAocGF0dGVybikgPT4gYCEqKi9ub2RlX21vZHVsZXMvJHtwYXR0ZXJufVxuISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59LyoqYFxuICApXG4gIC5qb2luKCdcXG4nKX1cbioqL25vZGVfbW9kdWxlcy8uY2FjaGVcbioqL3BsYXl3cmlnaHQtcmVwb3J0XG4qKi9zdG9yeWJvb2stc3RhdGljXG4qKi90YXJnZXRcbioqL3Rlc3QtcmVzdWx0c1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBydW5BbGxJblBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSwgZ2V0RGVmYXVsdFByb3NlTGFuZ3VhZ2UsIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueWFtbCcpO1xuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG5cbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxDb25maWcgPSAhIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChub25DYW5vbmljYWxDb25maWdGaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pKTtcbiAgICBpZiAoaGFzTm9uQ2Fub25pY2FsQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtjb25maWdGaWxlUGF0aH0gYmVjYXVzZSAke25vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRofSBpcyBub3QgYSBzdXBwb3J0ZWQgR2VtaW5pIGNvbmZpZyBsb2NhdGlvbi4gUmVuYW1lIGl0IG1hbnVhbGx5LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGRlZmF1bHRDb25maWcpO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBoYXNOb25DYW5vbmljYWxDb25maWcgPyB1bmRlZmluZWQgOiBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGNvbmZpZ0ZpbGVQYXRoKTtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvbGRDb25maWcgPSBCdW4uWUFNTC5wYXJzZShvbGRDb250ZW50KTtcbiAgICAgICAgLy8gTWVyZ2Ugb25seSBhIG1hcHBpbmc6IGVtcHR5LCBjb21tZW50LW9ubHksIG9yIHNjYWxhciBZQU1MIHdvdWxkIGVpdGhlciB0aHJvdyBpblxuICAgICAgICAvLyBtZXJnZS5hbGwgb3IgcG9sbHV0ZSB0aGUgY29uZmlnIHdpdGggaW5kZXgga2V5cy5cbiAgICAgICAgaWYgKG9sZENvbmZpZyAmJiB0eXBlb2Ygb2xkQ29uZmlnID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvbGRDb25maWcpKSB7XG4gICAgICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGNhbid0IGJlIHBhcnNlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0gQnVuLllBTUwuc3RyaW5naWZ5KG5ld0NvbmZpZywgdW5kZWZpbmVkLCAyKTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQoY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnQ/LnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJyMnKSA/IHVuZGVmaW5lZCA6IGV4dHJhQ29udGVudDtcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGBSZXZpZXcgaW4gJHtnZXREZWZhdWx0UHJvc2VMYW5ndWFnZShjb25maWcpfSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuXFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoY29uZmlnLCBhbGxDb25maWdzKX0ke1xuICAgICAgY29kaW5nUnVsZUV4dHJhQ29udGVudCA/IGBcXG4ke2NvZGluZ1J1bGVFeHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgYXdhaXQgcnVuQWxsSW5Qb29sKFtcbiAgICAgIC4uLihoYXNOb25DYW5vbmljYWxDb25maWcgPyBbXSA6IFsoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCldKSxcbiAgICAgICgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZ2l0T3V0cHV0TWF4QnVmZmVyID0gNjQgKiAxMDI0ICogMTAyNDtcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuLy8gYC5naXRpZ25vcmUgLXRleHRgIGtlZXBzIHRoZSBtYWNPUyB0ZW1wbGF0ZSdzIGBJY29uXFxyXFxyYCBydWxlIGludGFjdDogYHRleHQ9YXV0b2Agbm9ybWFsaXphdGlvblxuLy8gc3RyaXBzIG9uZSBDUiBwZXIgY2hlY2tpbiwgZGVncmFkaW5nIHRoZSBydWxlIHVudGlsIGl0IG1hdGNoZXMgbm90aGluZy5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuLmdpdGlnbm9yZSAtdGV4dFxuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IG91dHB1dDogc3RyaW5nO1xuICB0cnkge1xuICAgIG91dHB1dCA9IGNoaWxkX3Byb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2xzLWZpbGVzJywgJy0tZW9sJywgJy16J10sIHtcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IGdpdE91dHB1dE1heEJ1ZmZlcixcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdHJhY2tlZCBsaW5lLWVuZGluZyByZW5vcm1hbGl6YXRpb246ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgcmVub3JtYWxpemVkQ291bnQgPSAwO1xuICBmb3IgKGNvbnN0IHJlY29yZCBvZiBvdXRwdXQuc3BsaXQoJ1xcMCcpKSB7XG4gICAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSByZWNvcmQuaW5kZXhPZignXFx0Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4ID09PSAtMSkgY29udGludWU7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gcmVjb3JkLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICBpZiAoIS9eaVxcLyg/OmNybGZ8bWl4ZWQpXFxzL3UudGVzdChhdHRyaWJ1dGVzKSB8fCAhL2F0dHJcXC8uKlxcYmVvbD0oPzpsZnxjcmxmKSg/Olxcc3wkKS91LnRlc3QoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlY29yZC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIGNvbnN0IHRyYWNrZWRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHN0YXRzID0gZnMubHN0YXRTeW5jKHRyYWNrZWRGaWxlUGF0aCwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgaWYgKCFzdGF0cz8uaXNGaWxlKCkpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2l0J3Mgc3RhdCBjYWNoZSBjYW4gaGlkZSBwcmUtZXhpc3RpbmcgQ1JMRiBibG9icyBhZnRlciB3YmZ5IGludHJvZHVjZXMgdGV4dCBhdHRyaWJ1dGVzLlxuICAgIC8vIE5vcm1hbGl6ZSBieXRlcyBpbiB0aGUgd29ya3RyZWUgc28gdGhlIGNhbGxlcidzIG5vcm1hbCBgZ2l0IGFkZCAtQWAgcmVjb3JkcyB0aGUgY2Fub25pY2FsXG4gICAgLy8gYmxvYjsgdGhpcyBhbHNvIHByZXZlbnRzIFByZXR0aWVyJ3MgbWV0YWRhdGEgY2FjaGUgZnJvbSBza2lwcGluZyB0aGUgbmV3bHkgY2hhbmdlZCBmaWxlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModHJhY2tlZEZpbGVQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCwgQnVmZmVyLmZyb20oY29udGVudC50b1N0cmluZygnYmluYXJ5JykucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLCAnYmluYXJ5JykpO1xuICAgIHJlbm9ybWFsaXplZENvdW50Kys7XG4gIH1cbiAgaWYgKHJlbm9ybWFsaXplZENvdW50ID4gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVub3JtYWxpemVkIGxpbmUgZW5kaW5ncyBpbiAke3Jlbm9ybWFsaXplZENvdW50fSB0cmFja2VkIGZpbGUocykuYCk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG5fX2dlbmVyYXRlZF9fL1xuLmFpZGVyKlxuLmFudGlncmF2aXR5Y2xpL1xuLmNsYXVkZS8qLmxvY2FsLipcbi5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2tcbi5kZXZjb250YWluZXIvXG4uZG9ja2VyLmVudlxuLmVudipcbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4ucGxheXdyaWdodC1tY3AvXG4uc2VyZW5hL1xuLnRtcC9cbi50bXAtKi9cbi50b2tlbnNhdmUvXG4ud2IvXG5Ad2lsbGJvb3N0ZXIvXG5Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9cbiovbW91bnQvKi5oYXNoXG5DTEFVREUubG9jYWwubWRcbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICAvLyBFdmVyeSBhY2NlcHRlZCByZXBvc2l0b3J5IHJvb3QgcmVjZWl2ZXMgYSBtYW5hZ2VkIHBhY2thZ2UuanNvbiBsYXRlciBpbiB0aGUgc2FtZSBydW4sIHNvIGl0c1xuICAgIC8vIGRlcGVuZGVuY3kgdHJlZSBtdXN0IGJlIGlnbm9yZWQgZXZlbiB3aGVuIHRoZSBtYW5pZmVzdCBkaWQgbm90IGV4aXN0IGF0IGNvbmZpZy1kZXRlY3Rpb24gdGltZS5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHwgY29uZmlnLmlzUm9vdCkge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3QgcG9tLnhtbCk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBpdHMgTWF2ZW5cbiAgICAvLyBtb2R1bGVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmQgZHJvcHBpbmcgdGhlIG1hdmVuIHRlbXBsYXRlIHdvdWxkIGxldCB0YXJnZXQvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnkuIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdFxuICAgIC8vIGxvY2tmaWxlKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIFB5dGhvbiBkaXJlY3RvcmllcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kXG4gICAgLy8gZHJvcHBpbmcgdGhlIHB5dGhvbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgX19weWNhY2hlX18vIGFuZCAudmVudi8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHwgY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydXN0Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZykge1xuICAgICAgLy8gIUNhcmdvLmxvY2sgb3ZlcnJpZGVzIGFueSBwcmUtZXhpc3RpbmcgdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgZnJvbSBhXG4gICAgICAvLyBwYXJlbnQgLmdpdGlnbm9yZSwgc28gdGhlIGFwcGxpY2F0aW9uIGxvY2tmaWxlIHN0YXlzIGNvbW1pdHRhYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAhQ2FyZ28ubG9ja1xuc3JjLXRhdXJpL2dlbi9zY2hlbWFzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNDbG91ZGZsYXJlIHx8IHJvb3RDb25maWcuaXNDbG91ZGZsYXJlKSB7XG4gICAgICAvLyAuZGV2LnZhcnMqIGhvbGQgbG9jYWwgc2VjcmV0cyBmb3Igd3JhbmdsZXIgZGV2IGFuZCBtdXN0IG5ldmVyIGJlIGNvbW1pdHRlZC5cbiAgICAgIC8vIC5lbnYuY2xvdWRmbGFyZSBjYXJyaWVzIENMT1VERkxBUkVfQVBJX1RPS0VOOiBDSSB3cml0ZXMgaXQgZnJvbSBhIHNlY3JldCwgYW5kIGEgbG9jYWxcbiAgICAgIC8vIGB3YiBkZXBsb3lgIG5lZWRzIGEgcmVhbCB0b2tlbiBpbiBpdCwgc28gY29tbWl0dGluZyBpdCB3b3VsZCBsZWFrIGFjY291bnQgY3JlZGVudGlhbHMuXG4gICAgICAvLyBJdCBpcyBsaXN0ZWQgZXhwbGljaXRseSBzbyB0aGUgQ2xvdWRmbGFyZS1zcGVjaWZpYyBjcmVkZW50aWFsIHBvbGljeSByZW1haW5zIHZpc2libGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi5lbnYuY2xvdWRmbGFyZVxuLndyYW5nbGVyL1xuYDtcbiAgICB9XG4gICAgLy8gSWdub3JlZCBvbmx5IHdoZXJlIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0LCBzbyB3YmZ5IG5ldmVyIGlnbm9yZXMgYSBmaWxlIHRoYXQgbm90aGluZyByZWNyZWF0ZXMuIFRoaXMga2VlcHNcbiAgICAvLyBpdHMgdGhvdXNhbmRzIG9mIGxpbmVzIG91dCBvZiBldmVyeSB3cmFuZ2xlciBidW1wJ3MgZGlmZi4gQW5jaG9yZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYmVjYXVzZSBgd3JhbmdsZXIgdHlwZXNgXG4gICAgLy8gYW5kIHRoZSBvcHQtb3V0IGRlbGV0aW9uIGJlbG93IG9ubHkgZXZlciB0b3VjaCB0aGlzIHBhY2thZ2UncyBvd24gZmlsZSwgbm90IGEgbmVzdGVkIG9uZSBhdCBhbnkgZGVwdGguXG4gICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiAhY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAvLyBPbiBhIGdlbnVpbmUgd29ya2VyLXR5cGVzIG9wdC1vdXQgKG5vdGhpbmcgY29uc3VtZXMgdGhlIGdlbmVyYXRlZCBmaWxlOyBnZW5lcmF0ZXNXb3JrZXJUeXBlc1xuICAgICAgLy8gYWxvbmUgaXMgZmFsc2UgZm9yIHVucmVsYXRlZCByZWFzb25zIHN1Y2ggYXMgYSBtaXNzaW5nIGxvY2FsIHdyYW5nbGVyIGRlcGVuZGVuY3ksIHdoZXJlIHRoZVxuICAgICAgLy8gZmlsZSBtYXkgc3RpbGwgYmUgY29uc3VtZWQpIHRoZSBpZ25vcmUgcnVsZVxuICAgICAgLy8gYWJvdmUgZGlzYXBwZWFycywgc28gYW4gYWxyZWFkeS1nZW5lcmF0ZWQgZmlsZSB3b3VsZCBzdXJmYWNlIGFzIHVudHJhY2tlZCBub2lzZSBvbiBldmVyeVxuICAgICAgLy8gY2hlY2tvdXQg4oCUIGRlbGV0ZSBpdC4gTm8gcmVwb3NpdG9yeSB0cmFja3MgdGhlIGZpbGUgKGRvY3MvZXhwZWN0ZWQtcmVwb3NpdG9yeS1ydWxlcy5tZCksXG4gICAgICAvLyBzbyBhbiBleGlzdGluZyBjb3B5IGlzIGFsd2F5cyBhIGRpc3Bvc2FibGUgZ2VuZXJhdGVkIG9uZS5cbiAgICAgIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtlclR5cGVzUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzLnByb21pc2VzLnJtKHdvcmtlclR5cGVzUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBnaXRpZ25vcmUgdHJlYXRzIGAjYCBhcyBhIGNvbW1lbnQgb25seSBhdCBsaW5lIHN0YXJ0LCBzbyBhIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4sIHZpbSdzIGAhKi5zdmcgICMgLi4uYClcbiAgICAvLyB0dXJucyB0aGUgd2hvbGUgbGluZSBpbnRvIGEgcGF0dGVybiB0aGF0IG5ldmVyIG1hdGNoZXMuXG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oW14jXFxzXS4qPylbIFxcdF0rKCMuKikkL2dtLCAnJDJcXG4kMScpO1xuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUncyB1bmFuY2hvcmVkIGRlYnVnLyB3b3VsZCBhbHNvIGhpZGUgZnJvbnRlbmQgc291cmNlXG4gICAgICAvLyBkaXJlY3RvcmllcyBzdWNoIGFzIHNyYy9kZWJ1Zy87IGNhcmdvIG91dHB1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGFyZ2V0Ly5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eZGVidWdcXC8kL2dtLCAnIyBkZWJ1Zy8nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8IGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcykge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUgaWdub3JlcyBDYXJnby5sb2NrLCBidXQgYSBzcmMtdGF1cmkgY29uZmlndXJhdGlvbiBtYXJrcyBhblxuICAgICAgLy8gYXBwbGljYXRpb24sIHdob3NlIENhcmdvLmxvY2sgbXVzdCBiZSBjb21taXR0ZWQgZm9yIHJlcHJvZHVjaWJsZSBidWlsZHMuIFRoZVxuICAgICAgLy8gcnVsZSBpcyBhbHNvIGRpc2FibGVkIHdoZW4gYSBzdWIgcGFja2FnZSBjb250YWlucyBhIFRhdXJpIGFwcGxpY2F0aW9uLCBiZWNhdXNlXG4gICAgICAvLyBhbiB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBpbiBhIHBhcmVudCAuZ2l0aWdub3JlIHdvdWxkIGhpZGUgdGhlIG5lc3RlZFxuICAgICAgLy8gYXBwbGljYXRpb24ncyBsb2NrZmlsZS4gVGF1cmkgcGx1Z2luIGxpYnJhcmllcyAoZGV0ZWN0ZWQgb25seSB2aWFcbiAgICAgIC8vIEB0YXVyaS1hcHBzLyogZGVwZW5kZW5jaWVzKSBrZWVwIHRoZSB0ZW1wbGF0ZSdzIHBvbGljeSBvZiBpZ25vcmluZyBDYXJnby5sb2NrLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15DYXJnb1xcLmxvY2skL2dtLCAnIyBDYXJnby5sb2NrJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiB3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBjYXJyaWVzIGluIHRoZSByZXBvc2l0b3J5LiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCByZXdyaXRlc1xuICogaXQgaW4gdGhlIHB1Ymxpc2hlZCB0YXJiYWxsIG9ubHkgKGl0IGlzIG5ldmVyIGNvbW1pdHRlZCBiYWNrKSwgc28gYSB3YmZ5IHJ1biBzdGFydGVkIGZyb20gYSBnaXRcbiAqIGNoZWNrb3V0IHJlcG9ydHMgdGhpcyBwbGFjZWhvbGRlciBpbnN0ZWFkIG9mIGEgcmVhbCB2ZXJzaW9uLlxuICovXG5jb25zdCB1bnJlbGVhc2VkVmVyc2lvblByZWZpeCA9ICcwLjAuMC0nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb24oKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS52ZXJzaW9uO1xufVxuXG4vKiogd2JmeSdzIGxvY2F0aW9uIGluc2lkZSBpdHMgb3duIHJlcG9zaXRvcnksIHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QuICovXG5jb25zdCB3YmZ5RGlyUGF0aEluUmVwbyA9IHBhdGguam9pbigncGFja2FnZXMnLCAnd2JmeScpO1xuXG4vKipcbiAqIElkZW50aWZpZXMgdGhlIHdiZnkgYnVpbGQgdGhhdCBwcm9kdWNlZCB0aGUgZ2VuZXJhdGVkIGZpbGVzOiB0aGUgcmVsZWFzZWQgdmVyc2lvbiwgb3JcbiAqIGA8c2hvcnQgY29tbWl0IGhhc2g+Wy1kaXJ0eV0tbG9jYWxgIHdoZW4gd2JmeSBydW5zIGZyb20gaXRzIG93biBnaXQgY2hlY2tvdXQuIFVuZGVmaW5lZCB3aGVuXG4gKiBuZWl0aGVyIGlzIGF2YWlsYWJsZSAoZS5nLiBhbiB1bnJlbGVhc2VkIGJ1aWxkIGV4dHJhY3RlZCBmcm9tIGEgc291cmNlIGFyY2hpdmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBOZWl0aGVyIHRoZSBpbnN0YWxsZWQgcGFja2FnZS5qc29uIG5vciB0aGUgZ2l0IHN0YXRlIG9mIHdiZnkncyBvd24gY2hlY2tvdXQgY2FuIGNoYW5nZVxuICAvLyBtaWQtcnVuLCBhbmQgY29tcHV0aW5nIHRoZSBsYWJlbCBzcGF3bnMgc2V2ZXJhbCBnaXQgc3VicHJvY2Vzc2VzLCBzbyBpdCBpcyBjb21wdXRlZCBvbmNlLlxuICBpZiAoIWhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsKSB7XG4gICAgY2FjaGVkVmVyc2lvbkxhYmVsID0gY29tcHV0ZVdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgICBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25MYWJlbDtcbn1cblxubGV0IGhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsID0gZmFsc2U7XG5sZXQgY2FjaGVkVmVyc2lvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiwgZGlyUGF0aCB9ID0gcmVhZFdiZnlQYWNrYWdlSnNvbigpO1xuICBpZiAoIXZlcnNpb24uc3RhcnRzV2l0aCh1bnJlbGVhc2VkVmVyc2lvblByZWZpeCkpIHJldHVybiB2ZXJzaW9uO1xuXG4gIC8vIGdpdCByZXNvbHZlcyB0aGUgTkVBUkVTVCBlbmNsb3NpbmcgcmVwb3NpdG9yeSwgd2hpY2ggZm9yIGFuIHVucmVsZWFzZWQgYnVpbGQgcGxhY2VkIHVuZGVyIGFcbiAgLy8gdGFyZ2V0IHJlcG9zaXRvcnkgKG5vZGVfbW9kdWxlcywgb3IgYSB2ZW5kb3JlZC9leHRyYWN0ZWQgc291cmNlIHRyZWUpIGlzIHRoYXQgcmVwb3NpdG9yeSDigJQgaXRzXG4gIC8vIGNvbW1pdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHdiZnkgYnVpbGQgdGhhdCByYW4uIE9ubHkgd2JmeSdzIG93biBsb2NhdGlvbiBpbnNpZGUgaXRzIG93blxuICAvLyByZXBvc2l0b3J5IGlkZW50aWZpZXMgYSBnZW51aW5lIGNoZWNrb3V0LCBzbyBhbnl0aGluZyBlbHNlIGZhbGxzIGJhY2sgdG8gdGhlIHZlcnNpb24tbGVzcyBsYWJlbC5cbiAgY29uc3QgZ2l0Um9vdERpclBhdGggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG93LXRvcGxldmVsJ10sIGRpclBhdGgpO1xuICBpZiAoXG4gICAgIWdpdFJvb3REaXJQYXRoIHx8XG4gICAgcGF0aC5yZWxhdGl2ZShnaXRSb290RGlyUGF0aCwgZGlyUGF0aCkgIT09IHdiZnlEaXJQYXRoSW5SZXBvIHx8XG4gICAgIWlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGgpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgY29tbWl0SGFzaCA9IHJ1bkdpdChbJ3Jldi1wYXJzZScsICctLXNob3J0PTgnLCAnSEVBRCddLCBkaXJQYXRoKTtcbiAgaWYgKCFjb21taXRIYXNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBUaGUgY29tbWl0IGFsb25lIHdvdWxkIG1pc2lkZW50aWZ5IGEgYnVpbGQgbWFkZSBmcm9tIGFuIGVkaXRlZCBjaGVja291dCwgc28gdW5jb21taXR0ZWQgY2hhbmdlc1xuICAvLyBhcmUgcmVwb3J0ZWQgdG9vIOKAlCBidXQgb25seSB1bmRlciBwYWNrYWdlcy8qL3NyYywgcGFja2FnZXMvKi9iaW4gYW5kIHBhY2thZ2VzLyovY29uZmlncywgdGhlXG4gIC8vIHNvdXJjZSwgZW50cnktcG9pbnQgd3JhcHBlciBhbmQgcG9saWN5IGZpbGVzIHdiZnkgYW5kIGl0cyB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IHJ1blxuICAvLyBmcm9tLiBFdmVyeXRoaW5nIHdiZnkgR0VORVJBVEVTIHdoZW4gaXQgdGFyZ2V0cyBpdHMgb3duIHJlcG9zaXRvcnkgbGl2ZXMgb3V0c2lkZSB0aG9zZSAodGhlXG4gIC8vIHJvb3QgUkVBRE1FIHRoaXMgbGFiZWwgZ29lcyBpbnRvLCBhbmQgZWFjaCBwYWNrYWdlJ3MgLmdpdGlnbm9yZSwgcGFja2FnZS5qc29uLCB0c2NvbmZpZywg4oCmKSwgc29cbiAgLy8gYSBmaXJzdCBydW4gY2Fubm90IG1ha2UgdGhlIG5leHQgb25lIHJlbGFiZWwgdGhlIGJhZGdlIGAtZGlydHktbG9jYWxgIGJ5IGl0c2VsZi5cbiAgLy8gTWFuaWZlc3RzIHN0YXkgb3V0IG9uIHB1cnBvc2UsIGV2ZW4gdGhvdWdoIGFuIGVkaXRlZCBgZXhwb3J0c2AgbWFwIGNhbiByZWRpcmVjdCB3aGljaCBjb2RlXG4gIC8vIGxvYWRzOiB3YmZ5IEdFTkVSQVRFUyBwYWNrYWdlLmpzb24sIHNvIGluY2x1ZGluZyBpdCB3b3VsZCBtYWtlIGV2ZXJ5IHJ1biByZXBvcnQgaXRzZWxmIGRpcnR5LlxuICAvLyBUaGUgbGFiZWwgaXMgYmVzdC1lZmZvcnQgYnVpbGQgcHJvdmVuYW5jZSwgbm90IGEgcmVwcm9kdWNpYmxlLWJ1aWxkIGF0dGVzdGF0aW9uLlxuICBjb25zdCBpc0RpcnR5ID0gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aCk7XG4gIGlmIChpc0RpcnR5ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpc0RpcnR5KSByZXR1cm4gYCR7Y29tbWl0SGFzaH0tZGlydHktbG9jYWxgO1xuICAvLyBBbiB1bm1vZGlmaWVkIGNoZWNrb3V0IHNpdHRpbmcgb24gYSByZWxlYXNlIHRhZyBydW5zIGV4YWN0bHkgdGhlIGNvZGUgdGhhdCB3YXMgcHVibGlzaGVkIHVuZGVyXG4gIC8vIHRoYXQgdmVyc2lvbiwgc28gaXQgaXMgbGFiZWxlZCB3aXRoIHRoZSB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGNvbW1pdCB0aGF0IG9ubHkgd2JmeSBkZXZlbG9wZXJzXG4gIC8vIGNvdWxkIHJlc29sdmUgYmFjayB0byBvbmUuXG4gIHJldHVybiBmaW5kUmVsZWFzZWRWZXJzaW9uQXRIZWFkKG5hbWUsIGRpclBhdGgpID8/IGAke2NvbW1pdEhhc2h9LWxvY2FsYDtcbn1cblxuLyoqIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHRhZ3MgZWFjaCByZWxlYXNlIGA8cGFja2FnZSBuYW1lPkA8dmVyc2lvbj5gLiAqL1xuZnVuY3Rpb24gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChwYWNrYWdlTmFtZTogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IGAke3BhY2thZ2VOYW1lfUBgO1xuICAvLyBBIGNvbW1pdCBjYXJyaWVzIGF0IG1vc3Qgb25lIHJlbGVhc2UgdGFnIHBlciBwYWNrYWdlLCBzbyB0aGUgZmlyc3QgbWF0Y2ggaXMgdGhlIG9ubHkgbWF0Y2guXG4gIHJldHVybiBydW5HaXQoWyd0YWcnLCAnLS1wb2ludHMtYXQnLCAnSEVBRCddLCBjd2QpXG4gICAgPy5zcGxpdCgnXFxuJylcbiAgICAuZmluZCgodGFnKSA9PiB0YWcuc3RhcnRzV2l0aCh0YWdQcmVmaXgpKVxuICAgID8uc2xpY2UodGFnUHJlZml4Lmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBFdmVyeSByZW1vdGUgY291bnRzLCBub3QganVzdCBgb3JpZ2luYDogYSBmb3JrIGNoZWNrb3V0IGNhcnJpZXMgdGhlIGNhbm9uaWNhbCByZXBvc2l0b3J5IGFzXG4gIC8vIGB1cHN0cmVhbWAsIGFuZCBpdCBpcyBzdGlsbCBhIGdlbnVpbmUgd2JmeSBjaGVja291dCB3aG9zZSBjb21taXQgaWRlbnRpZmllcyB0aGUgYnVpbGQuXG4gIGNvbnN0IHJlbW90ZVVybHMgPSBydW5HaXQoWydyZW1vdGUnLCAnLXYnXSwgZ2l0Um9vdERpclBhdGgpO1xuICByZXR1cm4gISFyZW1vdGVVcmxzPy5zcGxpdCgnXFxuJykuc29tZSgobGluZSkgPT4gaXNDYW5vbmljYWxSZW1vdGVVcmwobGluZS5zcGxpdCgvWyBcXHRdKy91KVsxXSA/PyAnJykpO1xufVxuXG5jb25zdCBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aCA9IC9eXFwvP1dpbGxCb29zdGVyXFwvc2hhcmVkKD86XFwuZ2l0KT8kL2l1O1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbW90ZSBVUkwgcG9pbnRzIGF0IHdiZnkncyBvd24gcmVwb3NpdG9yeS4gVGhlIGhvc3QgaXMgY29tcGFyZWQgYWZ0ZXIgUEFSU0lORyByYXRoZXJcbiAqIHRoYW4gbWF0Y2hlZCBpbnNpZGUgdGhlIHN0cmluZzogYW55IHBhdHRlcm4gbG9vc2UgZW5vdWdoIHRvIGFjY2VwdCBldmVyeSBVUkwgZm9ybSBnaXQgc3VwcG9ydHNcbiAqIGFsc28gYWNjZXB0ZWQgYSBsb29rYWxpa2UgdGhhdCBtZXJlbHkgY29udGFpbnMgdGhlIGhvc3QsIHN1Y2ggYXNcbiAqIGBodHRwczovL2V2aWwuZXhhbXBsZS8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCwgbGV0dGluZyBhbiB1bnJlbGF0ZWQgY2hlY2tvdXQgY2xhaW0gdG9cbiAqIGJlIGEgZ2VudWluZSB3YmZ5IGJ1aWxkLlxuICovXG5mdW5jdGlvbiBpc0Nhbm9uaWNhbFJlbW90ZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBzY3Atc3R5bGUgKGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCkgaXMgbm90IGEgVVJMLCBzbyBpdCBpcyBtYXRjaGVkIHNlcGFyYXRlbHkuXG4gIC8vIFRoZSBsb29rYWhlYWQga2VlcHMgYSBzY2hlbWUncyBgOi8vYCBmcm9tIGJlaW5nIHJlYWQgYXMgdGhlIGBob3N0OnBhdGhgIHNlcGFyYXRvci5cbiAgY29uc3Qgc2NwTWF0Y2ggPSAvXig/OlteQC9dK0ApPyhbXi86XSspOig/IVxcLykoLiopJC91LmV4ZWModXJsKTtcbiAgaWYgKHNjcE1hdGNoKSB7XG4gICAgcmV0dXJuIHNjcE1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbScgJiYgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGgudGVzdChzY3BNYXRjaFsyXSEpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgeyBob3N0bmFtZSwgcGF0aG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3QocGF0aG5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbXG4gICAgICAnc3RhdHVzJyxcbiAgICAgICctLXBvcmNlbGFpbicsXG4gICAgICAnLS11bnRyYWNrZWQtZmlsZXM9YWxsJyxcbiAgICAgICctLScsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9zcmMvKipgLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9LyovYmluLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2NvbmZpZ3MvKipgLFxuICAgIF0sXG4gICAgeyBjd2Q6IGdpdFJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gISFwcm9jLnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1bkdpdChhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIGFyZ3MsIHsgY3dkLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICByZXR1cm4gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkV2JmeVBhY2thZ2VKc29uOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBkaXJQYXRoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuLyoqIFJldHVybnMgd2JmeSdzIG93biBwYWNrYWdlIGRpcmVjdG9yeSwgd2hpY2ggYWxzbyBob2xkcyBpdHMgY29uZmlncyAoZS5nLiByZWxlYXNlQWdlR2F0ZS5qc29uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5RGlyUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFdiZnlQYWNrYWdlSnNvbigpLmRpclBhdGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRXYmZ5UGFja2FnZUpzb24oKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0ge1xuICBpZiAoY2FjaGVkV2JmeVBhY2thZ2VKc29uKSByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xuICAvLyBmaWxlVVJMVG9QYXRoLCBub3QgVVJMLnBhdGhuYW1lOiB0aGUgbGF0dGVyIGtlZXBzIHBlcmNlbnQtZW5jb2RpbmcsIHNvIGFuIGluc3RhbGxhdGlvbiBwYXRoXG4gIC8vIGNvbnRhaW5pbmcgZS5nLiBhIHNwYWNlIHdvdWxkIHJlc29sdmUgdG8gYSBub25leGlzdGVudCBkaXJlY3RvcnkgYW5kIHRoZSBzZWFyY2ggd291bGQgd2FsayB1cFxuICAvLyB0byBhbiB1bnJlbGF0ZWQgcGFja2FnZS5cbiAgbGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICAvLyBwYXRoLmRpcm5hbWUoJy8nKSA9PT0gJy8nLCBzbyB0aGUgc2VhcmNoIG11c3Qgc3RvcCBleHBsaWNpdGx5IGF0IHRoZSBmaWxlc3lzdGVtIHJvb3QuXG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGRpclBhdGgpIHRocm93IG5ldyBFcnJvcihcIndiZnkncyBvd24gcGFja2FnZS5qc29uIGlzIG1pc3NpbmcuXCIpO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIGNhY2hlZFdiZnlQYWNrYWdlSnNvbiA9IHsgbmFtZTogcGFja2FnZUpzb24ubmFtZSwgdmVyc2lvbjogcGFja2FnZUpzb24udmVyc2lvbiwgZGlyUGF0aCB9O1xuICByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldFdiZnlEaXJQYXRoIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbi8qKlxuICogQXBwbGllcyB0aGUgb3JnYW5pemF0aW9uJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhlIGRldmVsb3BlciBtYWNoaW5lJ3MgR0xPQkFMXG4gKiBwYWNrYWdlLW1hbmFnZXIgY29uZmlncy4gUmVwb3NpdG9yeSBjb25maWdzIGd1YXJkIG9ubHkgd2JmaWVkIHJlcG9zaXRvcmllczsgYSBicmFuZC1uZXcgbG9jYWxcbiAqIHByb2plY3QgaGFzIG5vIGJ1bmZpZy50b21sIHlldCwgc28gdGhlIGdsb2JhbCBmaWxlcyBhcmUgdGhlIG9ubHkgZ2F0ZSBiZXR3ZWVuIGBidW4gY3JlYXRlYCAvXG4gKiBgbnBtIGluaXRgIGFuZCBhIGZyZXNobHkgY29tcHJvbWlzZWQgcmVsZWFzZS4gVGhlIHNhbWUgc2NyaXB0IHJ1bnMgb24gQ0kgYW5kIG9uIHRoZSBzZWxmLWhvc3RlZFxuICogcnVubmVycywgc28gZXZlcnkgbWFjaGluZSBlbmRzIHVwIHdpdGggYnl0ZS1pZGVudGljYWwgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoJ2Jhc2gnLCBbcGF0aC5qb2luKGdldFdiZnlEaXJQYXRoKCksICdjb25maWdzJywgJ2FwcGx5UmVsZWFzZUFnZUdhdGUuc2gnKV0sIHtcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYXBwbHkgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuJyk7XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBLZWVwIHBhY2thZ2UtbWFuYWdlciBzaGltcyBpbiB0aGUgRmlsZSBXYXRjaGVyIHByb2dyYW0gZmllbGQgc28gbm9kZSBkb2VzIG5vdFxuLy8gcGFyc2Ugd3JhcHBlciBzY3JpcHRzIHBhc3NlZCB0aHJvdWdoIGFyZ3VtZW50cy5cbmNvbnN0IG94Zm10UHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL294Zm10JztcbmNvbnN0IHByZXR0aWVyUHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZylcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWcpKSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhc2tPcHRpb25zID0gW1xuICAgIHtcbiAgICAgIGFyZ3M6ICctLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLm94Zm10LFxuICAgICAgbmFtZTogJ094Zm10JyxcbiAgICAgIHByb2dyYW06IG94Zm10UHJvZ3JhbSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFyZ3M6ICctLWNhY2hlIC0td3JpdGUnLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkphdmEoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5LFxuICAgICAgbmFtZTogJ1ByZXR0aWVyJyxcbiAgICAgIHByb2dyYW06IHByZXR0aWVyUHJvZ3JhbSxcbiAgICB9LFxuICBdXG4gICAgLmZpbHRlcigodGFzaykgPT4gdGFzay5jb25kaXRpb24pXG4gICAgLmZsYXRNYXAoKHRhc2spID0+IHRhc2suZXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnModGFzay5wcm9ncmFtLCB0YXNrLmFyZ3MsIHRhc2submFtZSwgZXh0KSkpO1xuXG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4gICAgJHt0YXNrT3B0aW9ucy5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJz4sXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgIXNjcmlwdHM/LlsnZ2VuLWkxOG4tdHMnXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuICdidW4gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsJztcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/IFtdKSwgLi4uT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KHNvcnRGbildXG5cbiAgZm9yIChrZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgIGlmIChoYXMob2JqZWN0LCBrZXkpKSB7XG4gICAgICB0b3RhbFtrZXldID0gb2JqZWN0W2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxcbn1cbiIsIi8vIERldGVjdCBlaXRoZXIgc3BhY2VzIG9yIHRhYnMgYnV0IG5vdCBib3RoIHRvIHByb3Blcmx5IGhhbmRsZSB0YWJzIGZvciBpbmRlbnRhdGlvbiBhbmQgc3BhY2VzIGZvciBhbGlnbm1lbnRcbmNvbnN0IElOREVOVF9SRUdFWCA9IC9eKD86KCApK3xcXHQrKS87XG5cbmNvbnN0IElOREVOVF9UWVBFX1NQQUNFID0gJ3NwYWNlJztcbmNvbnN0IElOREVOVF9UWVBFX1RBQiA9ICd0YWInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSBzaW5nbGUgc3BhY2UgcGF0dGVybnNcbmZ1bmN0aW9uIHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgdmFsdWUpIHtcblx0cmV0dXJuIGlnbm9yZVNpbmdsZVNwYWNlcyAmJiBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSAmJiB2YWx1ZSA9PT0gMTtcbn1cblxuLyoqXG5NYWtlIGEgTWFwIHRoYXQgY291bnRzIGhvdyBtYW55IGluZGVudHMvdW5pbmRlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gc2l6ZSBhbmQgaG93IG1hbnkgbGluZXMgZm9sbG93IGEgZ2l2ZW4gaW5kZW50YXRpb24uXG5cblRoZSBrZXkgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbmRlbnRhdGlvbiB0eXBlIChzID0gc3BhY2UgYW5kIHQgPSB0YWIpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMuXG5cbmBgYFxuaW5kZW50cyA9IHtcblx0dDM6IFsxLCAwXSxcblx0dDQ6IFsxLCA1XSxcblx0czU6IFsxLCAwXSxcblx0czEyOiBbMSwgMF0sXG59XG5gYGBcbiovXG5mdW5jdGlvbiBtYWtlSW5kZW50c01hcChzdHJpbmcsIGlnbm9yZVNpbmdsZVNwYWNlcykge1xuXHRjb25zdCBpbmRlbnRzID0gbmV3IE1hcCgpO1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBzaXplIG9mIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvblxuXHRsZXQgcHJldmlvdXNTaXplID0gMDtcblx0bGV0IHByZXZpb3VzSW5kZW50VHlwZTtcblxuXHQvLyBJbmRlbnRzIGtleSAoaWRlbnQgdHlwZSArIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzKVxuXHRsZXQga2V5O1xuXG5cdGZvciAoY29uc3QgbGluZSBvZiBzdHJpbmcuc3BsaXQoL1xcbi9nKSkge1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0Ly8gSWdub3JlIGVtcHR5IGxpbmVzXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBtYXRjaGVzID0gbGluZS5tYXRjaChJTkRFTlRfUkVHRVgpO1xuXG5cdFx0aWYgKG1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaW5kZW50ID0gbWF0Y2hlc1swXS5sZW5ndGg7XG5cdFx0XHRjb25zdCBpbmRlbnRUeXBlID0gbWF0Y2hlc1sxXSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIHVubGVzcyBpdCdzIHRoZSBvbmx5IGluZGVudCBkZXRlY3RlZCB0byBwcmV2ZW50IGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXNcblx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGluZGVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRlbnRUeXBlICE9PSBwcmV2aW91c0luZGVudFR5cGUpIHtcblx0XHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdH1cblxuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gaW5kZW50VHlwZTtcblxuXHRcdFx0bGV0IHVzZSA9IDE7XG5cdFx0XHRsZXQgd2VpZ2h0ID0gMDtcblxuXHRcdFx0Y29uc3QgaW5kZW50RGlmZmVyZW5jZSA9IGluZGVudCAtIHByZXZpb3VzU2l6ZTtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IGluZGVudDtcblxuXHRcdFx0Ly8gUHJldmlvdXMgbGluZSBoYXZlIHNhbWUgaW5kZW50P1xuXHRcdFx0aWYgKGluZGVudERpZmZlcmVuY2UgPT09IDApIHtcblx0XHRcdFx0Ly8gTm90IGEgbmV3IFwidXNlXCIgb2YgdGhlIGN1cnJlbnQgaW5kZW50OlxuXHRcdFx0XHR1c2UgPSAwO1xuXHRcdFx0XHQvLyBCdXQgZG8gYWRkIGEgYml0IHRvIGl0IGZvciBicmVha2luZyB0aWVzOlxuXHRcdFx0XHR3ZWlnaHQgPSAxO1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGtleSBmcm9tIHByZXZpb3VzIGxvb3Bcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSA9IE1hdGguYWJzKGluZGVudERpZmZlcmVuY2UpO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgY2hhbmdlcyB3aGVuIGlnbm9yZVNpbmdsZVNwYWNlcyBpcyB0cnVlXG5cdFx0XHRcdC8vIFRoaXMgcHJldmVudHMgY29tbW9uIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoaW5ncyBsaWtlIGFsaWduZWQgY29tbWVudHNcblx0XHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHN0YXRzXG5cdFx0XHRjb25zdCBlbnRyeSA9IGluZGVudHMuZ2V0KGtleSk7XG5cdFx0XHRpbmRlbnRzLnNldChrZXksIGVudHJ5ID09PSB1bmRlZmluZWQgPyBbMSwgMF0gOiBbZW50cnlbMF0gKyB1c2UsIGVudHJ5WzFdICsgd2VpZ2h0XSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGluZGVudHM7XG59XG5cbi8vIEVuY29kZSB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBhcyBhIHN0cmluZyAoZS5nLiAnczQnKSBmb3IgdXNlIGFzIGEgY29tcG91bmQga2V5IGluIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgaW5kZW50QW1vdW50KSB7XG5cdGNvbnN0IHR5cGVDaGFyYWN0ZXIgPSBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICdzJyA6ICd0Jztcblx0cmV0dXJuIHR5cGVDaGFyYWN0ZXIgKyBTdHJpbmcoaW5kZW50QW1vdW50KTtcbn1cblxuLy8gRXh0cmFjdCB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBmcm9tIGEga2V5IG9mIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGRlY29kZUluZGVudHNLZXkoaW5kZW50c0tleSkge1xuXHRjb25zdCBrZXlIYXNUeXBlU3BhY2UgPSBpbmRlbnRzS2V5WzBdID09PSAncyc7XG5cdGNvbnN0IHR5cGUgPSBrZXlIYXNUeXBlU3BhY2UgPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRjb25zdCBhbW91bnQgPSBOdW1iZXIoaW5kZW50c0tleS5zbGljZSgxKSk7XG5cblx0cmV0dXJuIHt0eXBlLCBhbW91bnR9O1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSAoZS5nLiAnczQnKSBmcm9tIHRoZSBpbmRlbnRzIE1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vc3QgY29tbW9uIGluZGVudCxcbi8vIG9yIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGluZGVudHMuXG5mdW5jdGlvbiBnZXRNb3N0VXNlZEtleShpbmRlbnRzKSB7XG5cdGxldCByZXN1bHQ7XG5cdGxldCBtYXhVc2VkID0gMDtcblx0bGV0IG1heFdlaWdodCA9IDA7XG5cblx0Zm9yIChjb25zdCBba2V5LCBbdXNlZENvdW50LCB3ZWlnaHRdXSBvZiBpbmRlbnRzKSB7XG5cdFx0aWYgKHVzZWRDb3VudCA+IG1heFVzZWQgfHwgKHVzZWRDb3VudCA9PT0gbWF4VXNlZCAmJiB3ZWlnaHQgPiBtYXhXZWlnaHQpKSB7XG5cdFx0XHRtYXhVc2VkID0gdXNlZENvdW50O1xuXHRcdFx0bWF4V2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KSB7XG5cdGNvbnN0IGluZGVudENoYXJhY3RlciA9IHR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJyAnIDogJ1xcdCc7XG5cdHJldHVybiBpbmRlbnRDaGFyYWN0ZXIucmVwZWF0KGFtb3VudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIElkZW50aWZ5IGluZGVudHMgd2hpbGUgc2tpcHBpbmcgc2luZ2xlIHNwYWNlIGluZGVudHMgdG8gYXZvaWQgY29tbW9uIGVkZ2UgY2FzZXMgKGUuZy4gY29kZSBjb21tZW50cylcblx0Ly8gSWYgbm8gaW5kZW50cyBhcmUgaWRlbnRpZmllZCwgcnVuIGFnYWluIGFuZCBpbmNsdWRlIGFsbCBpbmRlbnRzIGZvciBjb21wcmVoZW5zaXZlIGRldGVjdGlvblxuXHRsZXQgaW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgdHJ1ZSk7XG5cdGlmIChpbmRlbnRzLnNpemUgPT09IDApIHtcblx0XHRpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBmYWxzZSk7XG5cdH1cblxuXHRjb25zdCBrZXlPZk1vc3RVc2VkSW5kZW50ID0gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cyk7XG5cblx0bGV0IHR5cGU7XG5cdGxldCBhbW91bnQgPSAwO1xuXHRsZXQgaW5kZW50ID0gJyc7XG5cblx0aWYgKGtleU9mTW9zdFVzZWRJbmRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdCh7dHlwZSwgYW1vdW50fSA9IGRlY29kZUluZGVudHNLZXkoa2V5T2ZNb3N0VXNlZEluZGVudCkpO1xuXHRcdGluZGVudCA9IG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YW1vdW50LFxuXHRcdHR5cGUsXG5cdFx0aW5kZW50LFxuXHR9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRjb25zdCBuZXdsaW5lcyA9IHN0cmluZy5tYXRjaCgvKD86XFxyP1xcbikvZykgfHwgW107XG5cblx0aWYgKG5ld2xpbmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNybGYgPSBuZXdsaW5lcy5maWx0ZXIobmV3bGluZSA9PiBuZXdsaW5lID09PSAnXFxyXFxuJykubGVuZ3RoO1xuXHRjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG5cblx0cmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lR3JhY2VmdWwoc3RyaW5nKSB7XG5cdHJldHVybiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0TmV3bGluZShzdHJpbmcpKSB8fCAnXFxuJztcbn1cbiIsIiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS93aXJlaXRcbmNvbnN0IHdpcmVpdFNjcmlwdFByb3BlcnRpZXMgPSBbJ2NvbW1hbmQnLCAnZGVwZW5kZW5jaWVzJywgJ2ZpbGVzJywgJ291dHB1dCddXG5jb25zdCBzb3J0V2lyZWl0U2NyaXB0ID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeSh3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdkZXBlbmRlbmNpZXMnLFxuICAgIG9uQXJyYXkoKGRlcHMpID0+IGRlcHMubWFwKHNvcnRPYmplY3RCeShbJ3NjcmlwdCcsICdjYXNjYWRlJ10pKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZW52JyxcbiAgICBvbk9iamVjdCgoZW52KSA9PlxuICAgICAgc29ydE9iamVjdEtleXMoXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhlbnYpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBzb3J0T2JqZWN0QnkoWydleHRlcm5hbCcsICdkZWZhdWx0J10pKHZhbHVlKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdzZXJ2aWNlJyxcbiAgICBwaXBlKFtzb3J0T2JqZWN0QnkoWydyZWFkeVdoZW4nXSksIG92ZXJQcm9wZXJ0eSgncmVhZHlXaGVuJywgc29ydE9iamVjdCldKSxcbiAgKSxcbl0pXG5jb25zdCBzb3J0V2lyZWl0ID0gb25PYmplY3QoKHdpcmVpdCkgPT5cbiAgc29ydE9iamVjdEtleXMoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMod2lyZWl0KS5tYXAoKFtuYW1lLCBjb25maWddKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNvcnRXaXJlaXRTY3JpcHQoY29uZmlnKSxcbiAgICAgIF0pLFxuICAgICksXG4gICksXG4pXG5jb25zdCBzb3J0RGV2RW5naW5lcyA9IG92ZXJQcm9wZXJ0eShcbiAgJ3BhY2thZ2VNYW5hZ2VyJyxcbiAgc29ydE9iamVjdEJ5KFsnbmFtZScsICd2ZXJzaW9uJywgJ29uRmFpbCddKSxcbilcblxuY29uc3QgcG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAncGVlckRlcGVuZGVuY3lSdWxlcycsXG4gICduZXZlckJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXNGaWxlJyxcbiAgJ2FsbG93ZWREZXByZWNhdGVkVmVyc2lvbnMnLFxuICAnYWxsb3dOb25BcHBsaWVkUGF0Y2hlcycsXG4gICd1cGRhdGVDb25maWcnLFxuICAnYXVkaXRDb25maWcnLFxuICAncmVxdWlyZWRTY3JpcHRzJyxcbiAgJ3N1cHBvcnRlZEFyY2hpdGVjdHVyZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ3BhdGNoZWREZXBlbmRlbmNpZXMnLFxuICAncGFja2FnZUV4dGVuc2lvbnMnLFxuXVxuXG5jb25zdCBzb3J0UG5wbUNvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkocG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzLCB0cnVlKSxcbiAgb3ZlclByb3BlcnR5KCdvdmVycmlkZXMnLCBzb3J0T2JqZWN0QnlTZW12ZXIpLFxuXSlcblxuLy8gU2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vbWlzYy9zY3JpcHRzXG5jb25zdCBkZWZhdWx0TnBtU2NyaXB0cyA9IG5ldyBTZXQoW1xuICAnaW5zdGFsbCcsXG4gICdwYWNrJyxcbiAgJ3ByZXBhcmUnLFxuICAncHVibGlzaCcsXG4gICdyZXN0YXJ0JyxcbiAgJ3Nocmlua3dyYXAnLFxuICAnc3RhcnQnLFxuICAnc3RvcCcsXG4gICd0ZXN0JyxcbiAgJ3VuaW5zdGFsbCcsXG4gICd2ZXJzaW9uJyxcbl0pXG5cbmNvbnN0IGhhc0RldkRlcGVuZGVuY3kgPSAoZGVwZW5kZW5jeSwgcGFja2FnZUpzb24pID0+IHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLCAnZGV2RGVwZW5kZW5jaWVzJykgJiZcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcywgZGVwZW5kZW5jeSlcbiAgKVxufVxuXG5jb25zdCBydW5TUmVnRXhwID1cbiAgLyg/PD1efFtcXHMmOzw+fChdKSg/OnJ1bi1zfG5wbS1ydW4tYWxsMj8gLiooPzotLXNlcXVlbnRpYWx8LS1zZXJpYWx8LXMpKSg/PSR8W1xccyY7PD58KV0pL1xuXG5jb25zdCBpc1NlcXVlbnRpYWxTY3JpcHQgPSAoY29tbWFuZCkgPT5cbiAgY29tbWFuZC5pbmNsdWRlcygnKicpICYmIHJ1blNSZWdFeHAudGVzdChjb21tYW5kKVxuXG5jb25zdCBoYXNTZXF1ZW50aWFsU2NyaXB0ID0gKHBhY2thZ2VKc29uKSA9PiB7XG4gIGlmIChcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwnLCBwYWNrYWdlSnNvbikgJiZcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwyJywgcGFja2FnZUpzb24pXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IHNjcmlwdHMgPSBbJ3NjcmlwdHMnLCAnYmV0dGVyU2NyaXB0cyddLmZsYXRNYXAoKGZpZWxkKSA9PlxuICAgIHBhY2thZ2VKc29uW2ZpZWxkXSA/IE9iamVjdC52YWx1ZXMocGFja2FnZUpzb25bZmllbGRdKSA6IFtdLFxuICApXG4gIHJldHVybiBzY3JpcHRzLnNvbWUoKHNjcmlwdCkgPT4gaXNTZXF1ZW50aWFsU2NyaXB0KHNjcmlwdCkpXG59XG5cbmZ1bmN0aW9uIHNvcnRTY3JpcHROYW1lcyhrZXlzLCBwcmVmaXggPSAnJykge1xuICBjb25zdCBncm91cE1hcCA9IG5ldyBNYXAoKVxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgcmVzdCA9IHByZWZpeCA/IGtleS5zbGljZShwcmVmaXgubGVuZ3RoICsgMSkgOiBrZXlcbiAgICBjb25zdCBpZHggPSByZXN0LmluZGV4T2YoJzonKVxuICAgIGlmIChpZHggPiAwKSB7XG4gICAgICBjb25zdCBiYXNlID0ga2V5LnNsaWNlKDAsIChwcmVmaXggPyBwcmVmaXgubGVuZ3RoICsgMSA6IDApICsgaWR4KVxuICAgICAgaWYgKCFncm91cE1hcC5oYXMoYmFzZSkpIGdyb3VwTWFwLnNldChiYXNlLCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChiYXNlKS5wdXNoKGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cE1hcC5oYXMoa2V5KSkgZ3JvdXBNYXAuc2V0KGtleSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoa2V5KS5wdXNoKGtleSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBNYXAua2V5cygpKVxuICAgIC5zb3J0KClcbiAgICAuZmxhdE1hcCgoZ3JvdXBLZXkpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ3JvdXBNYXAuZ2V0KGdyb3VwS2V5KVxuICAgICAgaWYgKFxuICAgICAgICBjaGlsZHJlbi5sZW5ndGggPiAxICYmXG4gICAgICAgIGNoaWxkcmVuLnNvbWUoKGspID0+IGsgIT09IGdyb3VwS2V5ICYmIGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGlyZWN0ID0gY2hpbGRyZW5cbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiBrID09PSBncm91cEtleSB8fCAhay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IGNoaWxkcmVuLmZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgcmV0dXJuIFsuLi5kaXJlY3QsIC4uLnNvcnRTY3JpcHROYW1lcyhuZXN0ZWQsIGdyb3VwS2V5KV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZHJlbi5zb3J0KClcbiAgICB9KVxufVxuXG5jb25zdCBzb3J0U2NyaXB0cyA9IG9uT2JqZWN0KChzY3JpcHRzLCBwYWNrYWdlSnNvbikgPT4ge1xuICBsZXQgbmFtZXMgPSBPYmplY3Qua2V5cyhzY3JpcHRzKVxuICBjb25zdCBwcmVmaXhhYmxlID0gbmV3IFNldCgpXG5cbiAgbmFtZXMgPSBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICBjb25zdCBvbWl0dGVkID0gbmFtZS5yZXBsYWNlKC9eKD86cHJlfHBvc3QpLywgJycpXG4gICAgaWYgKGRlZmF1bHROcG1TY3JpcHRzLmhhcyhvbWl0dGVkKSB8fCBuYW1lcy5pbmNsdWRlcyhvbWl0dGVkKSkge1xuICAgICAgcHJlZml4YWJsZS5hZGQob21pdHRlZClcbiAgICAgIHJldHVybiBvbWl0dGVkXG4gICAgfVxuICAgIHJldHVybiBuYW1lXG4gIH0pXG5cbiAgaWYgKCFoYXNTZXF1ZW50aWFsU2NyaXB0KHBhY2thZ2VKc29uKSkge1xuICAgIG5hbWVzID0gc29ydFNjcmlwdE5hbWVzKG5hbWVzKVxuICB9XG4gIG5hbWVzID0gbmFtZXMuZmxhdE1hcCgoa2V5KSA9PlxuICAgIHByZWZpeGFibGUuaGFzKGtleSkgPyBbYHByZSR7a2V5fWAsIGtleSwgYHBvc3Qke2tleX1gXSA6IFtrZXldLFxuICApXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhzY3JpcHRzLCBuYW1lcylcbn0pXG5cbi8qXG4tIE1vdmUgYGRlZmF1bHRgIGNvbmRpdGlvbiB0byBib3R0b21cbiovXG5jb25zdCBzb3J0Q29uZGl0aW9ucyA9IChjb25kaXRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVmYXVsdENvbmRpdGlvbnMgPSBbXSwgcmVzdENvbmRpdGlvbnMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgY29uZGl0aW9ucyxcbiAgICAoY29uZGl0aW9uKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0Q29uZGl0aW9ucydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdyZXN0Q29uZGl0aW9ucydcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIFsuLi5yZXN0Q29uZGl0aW9ucywgLi4uZGVmYXVsdENvbmRpdGlvbnNdXG59XG5cbmNvbnN0IHNvcnRFeHBvcnRzID0gb25PYmplY3QoKGV4cG9ydHMpID0+IHtcbiAgY29uc3QgeyBwYXRocyA9IFtdLCBjb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnd2lyZWl0Jywgb3Zlcjogc29ydFdpcmVpdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdsMTBuJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjb250cmlidXRlcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnYWN0aXZhdGlvbkV2ZW50cycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdodXNreScsIG92ZXI6IG92ZXJQcm9wZXJ0eSgnaG9va3MnLCBzb3J0R2l0SG9va3MpIH0sXG4gIHsga2V5OiAnc2ltcGxlLWdpdC1ob29rcycsIG92ZXI6IHNvcnRHaXRIb29rcyB9LFxuICB7IGtleTogJ3ByZS1jb21taXQnIH0sXG4gIHsga2V5OiAnY29tbWl0bGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdsaW50LXN0YWdlZCcgfSxcbiAgeyBrZXk6ICduYW5vLXN0YWdlZCcgfSxcbiAgeyBrZXk6ICdjb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbm9kZW1vbkNvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2VyaWZ5Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2JhYmVsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJzbGlzdCcgfSxcbiAgeyBrZXk6ICd4bycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwcmV0dGllcicsIG92ZXI6IHNvcnRQcmV0dGllckNvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludENvbmZpZycsIG92ZXI6IHNvcnRFc2xpbnRDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRJZ25vcmUnIH0sXG4gIHsga2V5OiAnbnBtcGtnanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtUGFja2FnZUpzb25MaW50Q29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbXBhY2thZ2Vqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZWxlYXNlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbWFya0NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdzdHlsZWxpbnQnIH0sXG4gIHsga2V5OiAnYXZhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1qdW5pdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LXN0YXJlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21vY2hhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ255YycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdjOCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICd0YXAnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb2NsaWYnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ3Jlc29sdXRpb25zJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ292ZXJyaWRlcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGV2RGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0Qnkoc29ydE9iamVjdEJ5SWRlbnQsIHRydWUpIH0sXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgLy8gVE9ETzogb25seSBzb3J0IGRlcHRoID0gMlxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdvcHRpb25hbERlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdidW5kbGVkRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2J1bmRsZURlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uUGFjaycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2ZsYXQnIH0sXG4gIHsga2V5OiAncGFja2FnZU1hbmFnZXInIH0sXG4gIHsga2V5OiAnZW5naW5lcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdlbmdpbmVTdHJpY3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZGV2RW5naW5lcycsIG92ZXI6IHNvcnREZXZFbmdpbmVzIH0sXG4gIHsga2V5OiAndm9sdGEnLCBvdmVyOiBzb3J0Vm9sdGEgfSxcbiAgeyBrZXk6ICdsYW5ndWFnZU5hbWUnIH0sXG4gIHsga2V5OiAnb3MnIH0sXG4gIHsga2V5OiAnY3B1JyB9LFxuICB7IGtleTogJ3ByZWZlckdsb2JhbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwdWJsaXNoQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdpY29uJyB9LFxuICAvKiB2c2NvZGUgKi8ge1xuICAgIGtleTogJ2JhZGdlcycsXG4gICAgb3Zlcjogb25BcnJheSgoYmFkZ2UpID0+IGJhZGdlLm1hcChzb3J0VlNDb2RlQmFkZ2VPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZ2FsbGVyeUJhbm5lcicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHJldmlldycgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbWFya2Rvd24nIH0sXG4gIHsga2V5OiAncG5wbScsIG92ZXI6IHNvcnRQbnBtQ29uZmlnIH0sXG5dXG5cbmNvbnN0IGRlZmF1bHRTb3J0T3JkZXIgPSBmaWVsZHMubWFwKCh7IGtleSB9KSA9PiBrZXkpXG5jb25zdCBvdmVyRmllbGRzID0gcGlwZShcbiAgZmllbGRzXG4gICAgLm1hcCgoeyBrZXksIG92ZXIgfSkgPT4gKG92ZXIgPyBvdmVyUHJvcGVydHkoa2V5LCBvdmVyKSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbilcblxuZnVuY3Rpb24gZWRpdFN0cmluZ0pTT04oanNvbiwgb3Zlcikge1xuICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeyBpbmRlbnQsIHR5cGUgfSA9IGRldGVjdEluZGVudChqc29uKVxuICAgIGNvbnN0IGVuZENoYXJhY3RlcnMgPSBqc29uLnNsaWNlKC0xKSA9PT0gJ1xcbicgPyAnXFxuJyA6ICcnXG4gICAgY29uc3QgbmV3bGluZSA9IGRldGVjdE5ld2xpbmUoanNvbilcbiAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKVxuXG4gICAgbGV0IHJlc3VsdCA9XG4gICAgICBKU09OLnN0cmluZ2lmeShvdmVyKGpzb24pLCBudWxsLCB0eXBlID09PSAndGFiJyA/ICdcXHQnIDogaW5kZW50KSArXG4gICAgICBlbmRDaGFyYWN0ZXJzXG4gICAgaWYgKG5ld2xpbmUgPT09ICdcXHJcXG4nKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFxuL2csIG5ld2xpbmUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHJldHVybiBvdmVyKGpzb24pXG59XG5cbmZ1bmN0aW9uIHNvcnRQYWNrYWdlSnNvbihqc29uSXNoLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGVkaXRTdHJpbmdKU09OKFxuICAgIGpzb25Jc2gsXG4gICAgb25PYmplY3QoKGpzb24pID0+IHtcbiAgICAgIGxldCBzb3J0T3JkZXIgPSBvcHRpb25zLnNvcnRPcmRlciB8fCBkZWZhdWx0U29ydE9yZGVyXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvcnRPcmRlcikpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGpzb24pXG4gICAgICAgIGNvbnN0IHsgcHJpdmF0ZUtleXMgPSBbXSwgcHVibGljS2V5cyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIChrZXkpID0+IChrZXlbMF0gPT09ICdfJyA/ICdwcml2YXRlS2V5cycgOiAncHVibGljS2V5cycpLFxuICAgICAgICApXG4gICAgICAgIHNvcnRPcmRlciA9IFtcbiAgICAgICAgICAuLi5zb3J0T3JkZXIsXG4gICAgICAgICAgLi4uZGVmYXVsdFNvcnRPcmRlcixcbiAgICAgICAgICAuLi5wdWJsaWNLZXlzLnNvcnQoKSxcbiAgICAgICAgICAuLi5wcml2YXRlS2V5cy5zb3J0KCksXG4gICAgICAgIF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG92ZXJGaWVsZHMoc29ydE9iamVjdEtleXMoanNvbiwgc29ydE9yZGVyKSwganNvbilcbiAgICB9KSxcbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0UGFja2FnZUpzb25cbmV4cG9ydCB7IHNvcnRQYWNrYWdlSnNvbiwgZGVmYXVsdFNvcnRPcmRlciBhcyBzb3J0T3JkZXIgfVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBbXG4gICdAdHNjb25maWcvYnVuJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLWx0cycsXG4gICdAdHNjb25maWcvbm9kZS10cycsXG4gICdAdHNjb25maWcvcmVhY3QtbmF0aXZlJyxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAvLyBSZWFjdCBOYXRpdmUgbmVlZHMgTWV0cm8tY29tcGF0aWJsZSBzZXR0aW5ncyAoanN4OiByZWFjdC1uYXRpdmUsIG5vZGUgcmVzb2x1dGlvbiksIHdoaWNoXG4gIC8vIEB0c2NvbmZpZy9idW4gd291bGQgb3ZlcnJpZGUgZXZlbiB0aG91Z2ggdGhlIHJlcG8gdXNlcyBCdW4gYXMgaXRzIHBhY2thZ2UgbWFuYWdlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSddO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9idW4nXTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1vZHVsZSBzcGVjaWZpZXIgYSBnZW5lcmF0ZWQgY29uZmlnIGZpbGUgc2hvdWxkIHVzZSB0byBsb2FkIGFcbiAqIHdpbGxib29zdGVyLWNvbmZpZ3MgY29uZmlnIHBhY2thZ2Ugc3VjaCBhcyBgQHdpbGxib29zdGVyL294bGludC1jb25maWdgLlxuICpcbiAqIE91dHNpZGUgd2lsbGJvb3N0ZXItY29uZmlncyB0aGlzIGlzIHNpbXBseSB0aGUgcHVibGlzaGVkIHBhY2thZ2UgbmFtZS4gSW5zaWRlXG4gKiB3aWxsYm9vc3Rlci1jb25maWdzIHRoZSBwYWNrYWdlIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGEgZGVwZW5kZW5jeTogdGhlXG4gKiBjb25maWcgcGFja2FnZXMgaW1wb3J0IG9uZSBhbm90aGVyIChlLmcuIG94Zm10LWNvbmZpZydzIG94bGludC5jb25maWcudHNcbiAqIGltcG9ydHMgb3hsaW50LWNvbmZpZyBhbmQgdmljZSB2ZXJzYSksIHNvIGEgZGVjbGFyZWQgZWRnZSB3b3VsZCBmb3JtIGFcbiAqIGRlcGVuZGVuY3kgY3ljbGUgdGhhdCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIGNhbm5vdCB0b3BvbG9naWNhbGx5IHNvcnQuIFNpbmNlXG4gKiB0aGUgZWRnZSBpcyBhYnNlbnQsIGlzb2xhdGVkIGluc3RhbGxzIGNhbm5vdCByZXNvbHZlIHRoZSBiYXJlIHBhY2thZ2UgbmFtZSwgc29cbiAqIGltcG9ydCB0aGUgY29tbWl0dGVkIGBjb25maWcubWpzYCBidWlsZCBvdXRwdXQgdGhyb3VnaCBhIHJlbGF0aXZlIHBhdGggaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWc6IFBhY2thZ2VDb25maWcsIGNvbmZpZ1BhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuIGNvbmZpZ1BhY2thZ2VOYW1lO1xuXG4gIC8vIGUuZy4gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyAtPiAnb3hsaW50LWNvbmZpZycsIHdoaWNoIGlzIGl0cyBkaXJlY3RvcnkgdW5kZXIgYHBhY2thZ2VzL2AuXG4gIGNvbnN0IGNvbmZpZ1BhY2thZ2VEaXIgPSBjb25maWdQYWNrYWdlTmFtZS5zcGxpdCgnLycpLnBvcCgpID8/ICcnO1xuICAvLyBEZXJpdmUgdGhlIHdpbGxib29zdGVyLWNvbmZpZ3Mgcm9vdCBmcm9tIHRoZSBwYWNrYWdlIGJlaW5nIGdlbmVyYXRlZCwgbm90IGZyb20gdGhlIENMSSBlbnRyeVxuICAvLyBwYXRoOiBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPHBrZz5gIGlzIGEgc3VwcG9ydGVkIGludm9jYXRpb24gd2hvc2UgZW50cnkgY29uZmlnIGlzIHRoZSBjaGlsZFxuICAvLyBwYWNrYWdlIHJhdGhlciB0aGFuIHRoZSByZXBvIHJvb3QsIHNvIHJlbHlpbmcgb24gdGhlIGVudHJ5IHdvdWxkIGVtaXQgYSBuZXN0ZWQsIHVucmVzb2x2YWJsZVxuICAvLyBwYXRoIGZvciBhIGRpcmVjdGx5IHRhcmdldGVkIGNvbmZpZyBwYWNrYWdlLiBFdmVyeSB3aWxsYm9vc3Rlci1jb25maWdzIHBhY2thZ2UgaXMgZWl0aGVyIHRoZVxuICAvLyByb290IG9yIGEgZGlyZWN0IGNoaWxkIHVuZGVyIGBwYWNrYWdlcy9gLCBzbyB0aGUgcm9vdCBpcyB0aGUgcGFja2FnZSBkaXIgaXRzZWxmIG9yIGl0cyBncmFuZHBhcmVudC5cbiAgY29uc3QgcmVwb1Jvb3REaXJQYXRoID0gY29uZmlnLmlzUm9vdCA/IGNvbmZpZy5kaXJQYXRoIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgY29uc3QgbG9jYWxFbnRyeSA9IHBhdGgucmVzb2x2ZShyZXBvUm9vdERpclBhdGgsICdwYWNrYWdlcycsIGNvbmZpZ1BhY2thZ2VEaXIsICdjb25maWcubWpzJyk7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGxvY2FsRW50cnkpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmXG4gICAgIWNvbmZpZy5pc1Jvb3QgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24/LnByaXZhdGUgIT09IHRydWUgJiZcbiAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5wYWNrYWdlSnNvbj8uZmlsZXMpICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uLmZpbGVzLmxlbmd0aCA+IDBcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCwgcXVvdGVGb3JTaGVsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvciwgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuLi91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxuICBoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4sXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuaW1wb3J0IHsgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcywgYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzIH0gZnJvbSAnLi9idW5maWcuanMnO1xuXG5jb25zdCBveGxpbnREZXBzID0gWydAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ294Zm10JywgJ294bGludCcsICdveGxpbnQtdHNnb2xpbnQnXTtcbmNvbnN0IHR5cGVzY3JpcHREZXBlbmRlbmN5ID0gJ3R5cGVzY3JpcHQnO1xuLy8gVHlwZVNjcmlwdCA3J3MgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gbmF0aXZlIGNvbXBpbGVyIGFuZCBleHBvc2VzIG5vXG4vLyBwcm9ncmFtbWF0aWMgQVBJLiBOZXh0LmpzJ3MgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCBuZWVkcyB0aGF0IEFQSSwgc29cbi8vIGBuZXh0IGJ1aWxkYCBmYWlscyAoXCJ0cnlpbmcgdG8gdXNlIFR5cGVTY3JpcHQgYnV0IGRvIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwYWNrYWdlKHMpXCIpXG4vLyB3aXRoIG9ubHkgYHR5cGVzY3JpcHRgIHY3IGluc3RhbGxlZC4gTmV4dC5qcyByZXNvbHZlcyB0aGUgdHNnbyBiaW5hcnkgdGhyb3VnaCB0aGVcbi8vIHNlcGFyYXRlIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgcGFja2FnZSwgc28gTmV4dC5qcy1mYW1pbHkgcmVwb3MgbXVzdCBpbnN0YWxsXG4vLyBib3RoOyBvdGhlciByZXBvcyBvbmx5IG5lZWQgYHR5cGVzY3JpcHRgIGZvciBgdHNjYCB0eXBlY2hlY2tzLlxuY29uc3QgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA9ICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldyc7XG5jb25zdCB3YkRlcGVuZGVuY3kgPSAnQHdpbGxib29zdGVyL3diJztcbmNvbnN0IGJ1aWxkVHNEZXBlbmRlbmN5ID0gJ2J1aWxkLXRzJztcbmNvbnN0IGxlZnRob29rRGVwZW5kZW5jeSA9ICdsZWZ0aG9vayc7XG5jb25zdCBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzID0gbmV3IFNldChbXG4gIHdiRGVwZW5kZW5jeSxcbiAgYnVpbGRUc0RlcGVuZGVuY3ksXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdERlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3ksXG4gICdzb3J0LXBhY2thZ2UtanNvbicsXG4gIC8vIE1peGVkIEB0eXBlcy9idW4gdmVyc2lvbnMgYWNyb3NzIGEgbW9ub3JlcG8gbG9hZCB0d28gYnVuLXR5cGVzIGNvcGllcywgd2hpY2hcbiAgLy8gYnJlYWtzIGdsb2JhbCBpbnRlcmZhY2UgbWVyZ2luZyAoZS5nLiBSZXNwb25zZS9IZWFkZXJzKSBkdXJpbmcgdHlwZSBjaGVja2luZy5cbiAgJ0B0eXBlcy9idW4nLFxuICAuLi5veGxpbnREZXBzLFxuXSk7XG5jb25zdCBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbmNvbnN0IHBhY2thZ2VBZ2VHYXRlTXMgPSBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgKiAxMDAwO1xuY29uc3QgbnBtUGFja2FnZVRpbWVzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB3b3JrZXJUeXBlc1NjcmlwdEVycm9yID0gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcihjb25maWcpO1xuICBpZiAod29ya2VyVHlwZXNTY3JpcHRFcnJvcikgdGhyb3cgbmV3IEVycm9yKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpO1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgdXBkYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBlbnN1cmVUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBwcnVuZUNhcGFiaWxpdHlEZXBlbmRlbnRDb21waWxlckRlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGF3YWl0IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIC8vIE9uIGEgZmlyc3QgcnVuIHRoZXJlIGlzIG5vIG1hbmlmZXN0IGZvciBgYnVuIGFkZGAgdG8gdXBkYXRlIHJlbGlhYmx5LiBXcml0ZSB0aGUgcmVzb2x2ZWRcbiAgLy8gZGVwZW5kZW5jeSB2ZXJzaW9ucyBpbnRvIHRoZSBuZXcgbWFuaWZlc3QgZGlyZWN0bHk7IHRoZSBmaW5hbCByZXBvc2l0b3J5LXdpZGUgYGJ1biBpbnN0YWxsYFxuICAvLyB0aGVuIGluc3RhbGxzIHRoZW0gYW5kIHJlbWFpbnMgdGhlIGF1dGhvcml0YXRpdmUgZmFpbHVyZSBjaGVjay5cbiAgYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIGRlcGVuZGVuY3lVcGRhdGVzLFxuICAgIHNraXBBZGRpbmdEZXBzIHx8ICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvblxuICApO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICAvLyBZYXJuIHJlYWRzIHBhY2thZ2UuanNvbiBmcm9tIGRpc2sgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgYHlhcm4gYWRkIC1EYFxuICAvLyBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyByZWd1bGFyIGRlcGVuZGVuY3ksIHNvIHRoaXMgd3JpdGUgbXVzdCBmaW5pc2hcbiAgLy8gYmVmb3JlIGluc3RhbGxpbmcgdGhlIG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGVzIGJlbG93LiBLZWVwIHRoaXMgZ2VuZXJhdGVkXG4gIC8vIGZpbGUgc29ydGVkIGV2ZW4gd2hlbiB3ZSBsYXRlciBydW4gdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgZm9ybWF0dGVyIHNvIGFcbiAgLy8gbWlkLXJ1biBpbnRlcnJ1cHRpb24gbmV2ZXIgbGVhdmVzIHBhY2thZ2UuanNvbiBpbiBhIHBhcnRpYWxseSBtYW5hZ2VkIG9yZGVyLlxuICAvLyBBIHJlZnVzZWQgd3JpdGUgKGUuZy4gYSBzeW1saW5rZWQgcGFja2FnZS5qc29uKSBtdXN0IGFsc28gYWJvcnQgdGhlIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uXG4gIC8vIGJlbG93OiBgYnVuIGFkZGAgZm9sbG93cyB0aGUgc3ltbGluayBhbmQgd291bGQgbW9kaWZ5IHRoZSBmaWxlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmopKSkpIHJldHVybjtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAgIC8vIEEgbmV3bHkgY3JlYXRlZCBtYW5pZmVzdCBpcyBhbHJlYWR5IHNvcnRlZCBieSB3YmZ5J3MgYnVuZGxlZCBzZXJpYWxpemVyOyB0aGUgdGFyZ2V0IGZvcm1hdHRlclxuICAgIC8vIGlzIGF2YWlsYWJsZSB3aXRob3V0IGFuIGV4dHJhIGZldGNoIG9ubHkgd2hlbiB0aGlzIHJ1biBzdGFydGVkIHdpdGggcGFja2FnZS5qc29uLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWcsIGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHN0cmluZyB7XG4gIC8vIGZzVXRpbC5nZW5lcmF0ZUZpbGUoKSBub3JtYWxpemVzIHRoZSB0cmFpbGluZyBuZXdsaW5lLCBzbyBrZWVwIHRoZSBzZXJpYWxpemVyXG4gIC8vIGZvY3VzZWQgb24gdGhlIEpTT04gcGF5bG9hZCBpdHNlbGYuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24oanNvbk9iaiksIHVuZGVmaW5lZCwgMik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxXcml0YWJsZVBhY2thZ2VKc29uPiB7XG4gIGxldCBqc29uT2JqOiBQYWNrYWdlSnNvbiA9IHt9O1xuICB0cnkge1xuICAgIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIERvY3VtZW50YXRpb24tb25seSByZXBvc2l0b3JpZXMgaGF2ZSBubyBtYW5pZmVzdCBvbiB0aGVpciBmaXJzdCB3YmZ5IHJ1bi4gU3RhcnRpbmcgZnJvbSBhblxuICAgIC8vIGVtcHR5IG9iamVjdCBsZXRzIHRoZSBub3JtYWwgZ2VuZXJhdG9yIGVzdGFibGlzaCB0aGUgc2FtZSBtYW5hZ2VkIGJhc2VsaW5lIGFzIGV2ZXJ5IG90aGVyXG4gICAgLy8gcmVwb3NpdG9yeTsgbWFsZm9ybWVkIG9yIHVucmVhZGFibGUgZXhpc3RpbmcgbWFuaWZlc3RzIG11c3Qgc3RpbGwgZmFpbCBsb3VkbHkuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB0aHJvdyBlcnJvcjtcbiAgfVxuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuZnVuY3Rpb24gcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIC8vIFJ1biBiZWZvcmUgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zLCB3aGljaCByZS1hZGRzIHRzZ28gb25seSBmb3IgY3VycmVudCBOZXh0LmpzLWZhbWlseSByZXBvc2l0b3JpZXMuXG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGpzb25PYmouc2NyaXB0cyA9IHsgLi4uanNvbk9iai5zY3JpcHRzLCAuLi5nZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpIH07XG59XG5cbi8qKlxuICogS2VlcHMgdGhlIHByb2plY3QncyBvd24gc2VnbWVudHMgaW4gb3JkZXIsIHJlcGxhY2luZyB0aGUgZmlyc3QgbWFuYWdlZCBnZW4tY29kZSBzcGVsbGluZyB3aXRoXG4gKiBgYnVuIHdiIGdlbi1jb2RlYCBhbmQgZHJvcHBpbmcgbGF0ZXIgZHVwbGljYXRlcy4gQXBwZW5kcyBnZW5lcmF0aW9uIG9ubHkgd2hlbiB0aGUgc2NyaXB0XG4gKiBjb250YWluZWQgbm9uZSwgc28gbm90aGluZyBpcyByZW9yZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIHJlYnVpbGRQb3N0aW5zdGFsbFNlZ21lbnRzKHNlZ21lbnRzOiBzdHJpbmdbXSwgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2luZHMgPSBzZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBzY3JpcHRzLCB0cnVlKSk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgZ2VuZXJhdGVzOyBhZGRpbmcgYW5vdGhlciBpbnZvY2F0aW9uIHdvdWxkIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UuXG4gIGxldCBnZW5lcmF0aW9uUGxhY2VkID0ga2luZHMuaW5jbHVkZXMoJ2dlbkNvZGVXcmFwcGVyJyk7XG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIHNlZ21lbnRdIG9mIHNlZ21lbnRzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGtpbmQgPSBraW5kc1tpbmRleF07XG4gICAgaWYgKGtpbmQgPT09ICdjdXN0b20nIHx8IGtpbmQgPT09ICdnZW5Db2RlV3JhcHBlcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHNlZ21lbnQpO1xuICAgIH0gZWxzZSBpZiAoIWdlbmVyYXRpb25QbGFjZWQpIHtcbiAgICAgIHJlc3VsdC5wdXNoKCdidW4gd2IgZ2VuLWNvZGUnKTtcbiAgICAgIGdlbmVyYXRpb25QbGFjZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoIWdlbmVyYXRpb25QbGFjZWQpIHJlc3VsdC5wdXNoKCdidW4gd2IgZ2VuLWNvZGUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIG1hbmFnZWQgZ2VuLWNvZGUgc2VnbWVudHMgd2hpbGUga2VlcGluZyB0aGUgZmlyc3Qgc2VnbWVudCdzIHBvc2l0aW9uIHNvIGEgY3VzdG9tXG4gKiBzdGVwIHRoYXQgY29uc3VtZXMgZ2VuZXJhdGVkIG91dHB1dCBzdGlsbCBydW5zIGFmdGVyIGl0LiBSZXR1cm5zIHdpdGhvdXQgY2hhbmdpbmcgYW5cbiAqIHVucGFyc2VhYmxlIHNjcmlwdC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cywgbWFuYWdlc1dvcmtlclR5cGVzOiBib29sZWFuKTogdm9pZCB7XG4gIC8vIGBidW4gd2IgZ2VuLWNvZGVgIHJlZ2VuZXJhdGVzIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgaXRzZWxmLCBzbyBhIHBhY2thZ2Ugd2l0aCBhXG4gIC8vIGNvZGUtZ2VuZXJhdGlvbiBvciB3b3JrZXItdHlwZXMgcGlwZWxpbmUgZ2V0cyBvbmUgbWFuYWdlZCBnZW5lcmF0aW9uIHNlZ21lbnQuXG4gIGlmIChzY3JpcHRzWydnZW4tY29kZSddIHx8IG1hbmFnZXNXb3JrZXJUeXBlcykge1xuICAgIC8vIFByb2plY3Qtb3duZWQgc3RlcHMgYXJlIG5ldmVyIGRyb3BwZWQsIGFuZCB0aGVpciBQT1NJVElPTiByZWxhdGl2ZSB0byBnZW5lcmF0aW9uIGlzIHByZXNlcnZlZDogYSBzdGVwXG4gICAgLy8gYmVmb3JlIGl0IG1heSBwcm9kdWNlIGB3cmFuZ2xlciB0eXBlc2AnIGlucHV0cyAoYSB3cmFuZ2xlciBjb25maWcsIGAuZGV2LnZhcnNgKSwgd2hpbGUgb25lIGFmdGVyIGl0IG1heVxuICAgIC8vIGNvbnN1bWUgdGhlIGdlbmVyYXRlZCB0eXBlcy4gU28gdGhlIG1hbmFnZWQgZ2VuZXJhdGlvbiByZXBsYWNlcyB0aGUgZmlyc3QgbWFuYWdlZCBzZWdtZW50IGluIHBsYWNlLCBhbmQgaXNcbiAgICAvLyBhcHBlbmRlZCBvbmx5IHdoZW4gdGhlIHNjcmlwdCBoYWQgbm9uZS4gQSB3cmFwcGVyIGFyb3VuZCBhIGN1c3RvbWl6ZWQgZ2VuLWNvZGUgYWxyZWFkeSBwZXJmb3JtcyB0aGVcbiAgICAvLyBnZW5lcmF0aW9uIHBsdXMgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IHN1cHByZXNzZXMgdGhlIHJlcGxhY2VtZW50IGVudGlyZWx5LlxuICAgIGNvbnN0IHNlZ21lbnRzID0gc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gdW5kZWZpbmVkID8gW10gOiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdHMucG9zdGluc3RhbGwpO1xuICAgIGNvbnN0IGtlcHRTZWdtZW50cyA9IHNlZ21lbnRzICYmIHJlYnVpbGRQb3N0aW5zdGFsbFNlZ21lbnRzKHNlZ21lbnRzLCBzY3JpcHRzKTtcbiAgICBpZiAoa2VwdFNlZ21lbnRzKSB7XG4gICAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID0ga2VwdFNlZ21lbnRzLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gICAgLy8gQW55IG90aGVyIHVucGFyc2VhYmxlIHBvc3RpbnN0YWxsIGlzIGxlZnQgdG8gYSBodW1hbiByYXRoZXIgdGhhbiByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPERlcGVuZGVuY3lVcGRhdGVzPiB7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICBpZiAoXG4gICAgaGFzSmF2YSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXInKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgLy8gTGVmdGhvb2sgZ2VuZXJhdGlvbiBpcyBiZXN0LWVmZm9ydCBhbmQgLmxlZnRob29rIGlzIGFic2VudCBmcm9tIERvY2tlciBidWlsZCBjb250ZXh0cywgc28gYVxuICAgIC8vIG1pc3Npbmcgbm9ybWFsaXplciBpcyB2YWxpZC4gT25jZSBwcmVzZW50LCBpdHMgZmFpbHVyZSBtdXN0IGFib3J0IGluc3RhbGwgcmF0aGVyIHRoYW4gbGVhdmUgYVxuICAgIC8vIEd1YXJkLXBpbm5lZCBsb2NrZmlsZSBiZWhpbmQ7IGtlZXAgdGhhdCBmYWlsLWZhc3QgZ3JvdXBpbmcgZXhwbGljaXQgYmVmb3JlIGFueSB3b3Jrc3BhY2UgYnVpbGQuXG4gICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPVxuICAgICAgJyhidW4gbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlKSAmJiAodGVzdCAhIC1mIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHx8IGJhc2ggLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gpJztcbiAgICAvLyBXaGVuIEB3aWxsYm9vc3Rlci93YiBpcyBhIHdvcmtzcGFjZSBvZiB0aGlzIHJlcG9zaXRvcnksIHRoZSBnZW5lcmF0ZWQgYGJ1biB3YiDigKZgIHNjcmlwdHMgcnVuXG4gICAgLy8gaXRzIGdpdGlnbm9yZWQgZGlzdCBidWlsZCAoYmluL2luZGV4LmpzIGltcG9ydHMgLi4vZGlzdC9pbmRleC5qcyksIHNvIGEgZnJlc2ggY2hlY2tvdXQgbXVzdFxuICAgIC8vIGJ1aWxkIGl0IGR1cmluZyBpbnN0YWxsOyByZWdpc3RyeSBpbnN0YWxscyBzaGlwIGEgcHJlYnVpbHQgZGlzdCBhbmQgbmVlZCBubyBleHRyYSBzdGVwLlxuICAgIGNvbnN0IHdiV29ya3NwYWNlRGlyID0gZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykuZ2V0KHdiRGVwZW5kZW5jeSk7XG4gICAgaWYgKHdiV29ya3NwYWNlRGlyKSB7XG4gICAgICAvLyBRdW90ZWQgdW5sZXNzIHRoZSBuYW1lIGNhcnJpZXMgbm8gc2hlbGwgbWVhbmluZywgc28gdGhhdCBgJCjigKYpYCBvciBhIHZhcmlhYmxlIGEgaG9zdGlsZVxuICAgICAgLy8gZGlyZWN0b3J5IG5hbWUgY291bGQgc211Z2dsZSBpbnRvIHRoZSBnZW5lcmF0ZWQgc2NyaXB0IG5ldmVyIHJlYWNoZXMgdGhlIHNoZWxsIHVucXVvdGVkLlxuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgKz0gYCAmJiBidW4gcnVuIC0tY3dkICR7cXVvdGVGb3JTaGVsbCh3YldvcmtzcGFjZURpcil9IGJ1aWxkYDtcbiAgICB9XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2gobGVmdGhvb2tEZXBlbmRlbmN5KTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShqc29uT2JqLnNjcmlwdHMucmVsZWFzZSkpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ107XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0UnVudGltZSkge1xuICAgICAgICAvLyBSdW50aW1lIGltcG9ydHMgbmVlZCB0aGUgc3RhbmRhbG9uZSBwYWNrYWdlIGFmdGVyIERvY2tlciBwcnVuaW5nIHJlbW92ZXMgZGV2RGVwZW5kZW5jaWVzLlxuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/PVxuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz9cbiAgICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddID8/XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ3BsYXl3cmlnaHQnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uIFlhcm4gdjEncyBvYmplY3QgZm9ybSBrZWVwcyBpdHNcbiAgICAgIC8vIGRlY2xhcmVkIHBhdHRlcm5zICh3b3Jrc3BhY2VzLnBhY2thZ2VzKTsgb25seSBleHRyYXMgc3VjaCBhcyBub2hvaXN0IGFyZSBkcm9wcGVkLlxuICAgICAgLy8gRm9yY2UgYHBhY2thZ2VzLypgIG9ubHkgd2hlbiBpdCBhY3R1YWxseSBtYXRjaGVzIGEgd29ya3NwYWNlIG1hbmlmZXN0OiBhbiBhcHBzLyotb25seVxuICAgICAgLy8gbW9ub3JlcG8gbXVzdCBub3QgZ2V0IGEgbmV2ZXItbWF0Y2hpbmcgcGF0dGVybiBhcHBlbmRlZCB0byBpdHMgZGVjbGFyYXRpb24uIEFcbiAgICAgIC8vIGJhc2VsaW5lLXNlZWRpbmcgZGVjbGFyYXRpb24gbmVlZHMgbm8gZm9yY2VkIHBhdHRlcm4gYXQgYWxsIOKAlCB0aGUgc2VlZGVkIGJhc2VsaW5lXG4gICAgICAvLyAoYCovKmAgb3IgYCoqYCkgYWxyZWFkeSBjb3ZlcnMgcGFja2FnZXMvKi4gVGhlIGZvcmNlZCBwYXR0ZXJuIGlzIFBSRVBFTkRFRDogQnVuXG4gICAgICAvLyBldmFsdWF0ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gYSBwb3NpdGl2ZSBwYXR0ZXJuIHBsYWNlZCBhZnRlciBhIHVzZXJcbiAgICAgIC8vIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMuIEEgZGVjbGFyYXRpb24gdGhhdCBhbHJlYWR5IGNvdmVyc1xuICAgICAgLy8gcGFja2FnZXMvKiB1bmRlciBub3JtYWxpemF0aW9uIChlLmcuIGAuL3BhY2thZ2VzLypgKSBpcyBrZXB0IHZlcmJhdGltOiBmb3JjaW5nIGEgdGV4dHVhbFxuICAgICAgLy8gYHBhY2thZ2VzLypgIG5leHQgdG8gaXQgd291bGQgcGVyc2lzdCBhIGR1cGxpY2F0ZSBlcXVpdmFsZW50IHBhdHRlcm4uXG4gICAgICBjb25zdCBmb3JjZWRQYXR0ZXJucyA9XG4gICAgICAgICFoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgIWhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybihqc29uT2JqLndvcmtzcGFjZXMpICYmXG4gICAgICAgIGZnLmdsb2JTeW5jKCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIHsgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH0pLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFsncGFja2FnZXMvKiddXG4gICAgICAgICAgOiBbXTtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IG1lcmdlLmFsbChbZm9yY2VkUGF0dGVybnMsIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMoanNvbk9iai53b3Jrc3BhY2VzKV0sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgfSk7XG4gICAgICAvLyBCb3RoIGlucHV0cyBjYW4gYmUgZW1wdHkgKGUuZy4gcGFja2FnZXMvcGFja2FnZS5qc29uIHdpdGhvdXQgYW55IHBhY2thZ2VzLyovcGFja2FnZS5qc29uXG4gICAgICAvLyBhbmQgbm8gZGVjbGFyZWQgd29ya3NwYWNlcyk7IGRvIG5vdCBwZXJzaXN0IGEgbWVhbmluZ2xlc3MgYHdvcmtzcGFjZXM6IFtdYC5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykgJiYganNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaXhlcnMvbmV4dENvbmZpZy50cyBlbmFibGVzIGByZWFjdENvbXBpbGVyOiB0cnVlYCBmb3IgZXZlcnkgTmV4dC5qcyBwcm9qZWN0LCBhbmQgTmV4dC5qc1xuICAvLyByZXNvbHZlcyBgYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyYCBhdCBidWlsZCB0aW1lIHdoZW4gUmVhY3QgQ29tcGlsZXIgaXMgb24uIEFkZCBpdCBoZXJlIHNvXG4gIC8vIHRoZSBtYW5hZ2VkIG5leHQuY29uZmlnIG5ldmVyIGJyZWFrcyBgbmV4dCBidWlsZGAgd2l0aCBhbiB1bnJlc29sdmVkLXBhY2thZ2UgZXJyb3IuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyk7XG4gIH1cblxuICAvLyBgd2IgdmVyaWZ5IC0tZnVsbGAgYXVkaXRzIGV2ZXJ5IGAqLnNsaWRldi5tZGAgZGVjayB3aXRoIHNsaWRldi1jaGVjaywgc28gdGhlIGNoZWNrZXIgaGFzIHRvIGJlXG4gIC8vIGluc3RhbGxlZCB3aGVyZXZlciBhIGRlY2sgbGl2ZXMuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TbGlkZXZNZCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzbGlkZXYtY2hlY2snKTtcbiAgfVxuXG4gIGlmICghaXNXYlBhY2thZ2UoanNvbk9iaikpIHtcbiAgICAvLyBBIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgZGVwZW5kcyBvbiB0aGUgd2IgZGV2ZWxvcGVkIGluIHRoaXMgcmVwb3NpdG9yeSAoZS5nLlxuICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBpdHNlbGYpOyBpbnN0YWxsaW5nIHRoZSBsYXRlc3QgcmVnaXN0cnkgcmVsZWFzZSBvdmVyIGl0IHdvdWxkIHNpbGVudGx5XG4gICAgLy8gcmVwbGFjZSB0aGUgbG9jYWwgYnVpbGQgd2l0aCBhIHB1Ymxpc2hlZCBvbmUsIHNvIGxlYXZlIHN1Y2ggYSBkZWNsYXJhdGlvbiB1bnRvdWNoZWQuXG4gICAgY29uc3Qgd2JTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1t3YkRlcGVuZGVuY3ldID8/IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV07XG4gICAgaWYgKCF3YlNwZWNpZmllcj8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgaWYgKHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gICAgLy8gVGhlIGdlbmVyYXRlZCAqLmNvbmZpZy50cyBmaWxlcyBhcmUgdHlwZS1jaGVja2VkIGJ5IHRoZSBsaW50IHByb2plY3QgZXZlbiBpbiBKYXZhU2NyaXB0LW9ubHlcbiAgICAvLyByZXBvc2l0b3JpZXMuIFJlYWN0IE5hdGl2ZSByZWxpZXMgb24gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSdzIGFtYmllbnQgdHlwZXMgaW5zdGVhZC5cbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSA/IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpIDogW107XG4gIGF3YWl0IHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmosIHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLnRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UsIHNvIGl0IGlzXG4gICAgLy8gbm93IHRoZSBtYW5hZ2VkIGNvbXBpbGVyIGZvciBldmVyeSBUeXBlU2NyaXB0IHJlcG8gKHR5cGVjaGVja2luZyBydW5zIGB0c2NgKS5cbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0RGVwZW5kZW5jeSk7XG4gICAgLy8gTmV4dC5qcydzIGBuZXh0IGJ1aWxkYCBpbnNwZWN0cyBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSB0byBydW4gaXRzIHR5cGVcbiAgICAvLyBjaGVjazsgdGhlIGB0eXBlc2NyaXB0YCB2NyBwYWNrYWdlIGFsb25lIGxhY2tzIHRoZSBBUEkgbmV4dCBuZWVkcywgc28ga2VlcCBib3RoXG4gICAgLy8gaW5zdGFsbGVkIGZvciBOZXh0LmpzLWZhbWlseSByZXBvcy4gU2VlIHRoZSB0eXBlc2NyaXB0R29EZXBlbmRlbmN5IGNvbW1lbnQgYWJvdmUuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0R29EZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvXFxiKD86YnVueHxucHh8cG5wbVxccytkbHh8eWFyblxccytkbHgpXFxzK3NlbWFudGljLXJlbGVhc2UoPzpAXFxTKyk/XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIGtlZXBBc1J1bnRpbWVdIG9mIFtcbiAgICBbd2JEZXBlbmRlbmN5LCBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgICBbYnVpbGRUc0RlcGVuZGVuY3ksIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAoa2VlcEFzUnVudGltZSkge1xuICAgICAgY29uc3QgZGV2VmVyc2lvbiA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFkZXZWZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIXJ1bnRpbWVWZXJzaW9uIHx8IGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihkZXZWZXJzaW9uLCBydW50aW1lVmVyc2lvbikpIHtcbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBkZXZWZXJzaW9uO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH0gZWxzZSBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHtcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIGltYWdlcyBydW4gbWlncmF0aW9ucyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCwganVzdCBhcyBwYWNrYWdlIG1hbmFnZXJzXG4gIC8vIHJ1biBwb3N0aW5zdGFsbCBkdXJpbmcgcHJvZHVjdGlvbiBpbnN0YWxscywgc28gYm90aCBlbnRyeSBwb2ludHMgbXVzdCByZXRhaW4gdGhlIHdiIGJpbmFyeS5cbiAgLy8gS2VlcCB0aGUgd29yZCBtYXRjaCBjb25zZXJ2YXRpdmU6IHN1cHBvcnRlZCBjdXN0b20gd3JhcHBlcnMgY2FuIHB1dCB3YiBpbnNpZGUgc2hlbGwgbG9vcHMgdGhhdFxuICAvLyB0aGUgY29tbWFuZC1wb3NpdGlvbiBwYXJzZXIgY2Fubm90IGNsYXNzaWZ5LCB3aGlsZSBhIGZhbHNlIHBvc2l0aXZlIG9ubHkgcmV0YWlucyB0aGUgQ0xJLlxuICByZXR1cm4gW2pzb25PYmouc2NyaXB0cz8ucG9zdGluc3RhbGwsIGpzb25PYmouc2NyaXB0cz8uWydkYi1taWdyYXRlJ11dLnNvbWUoXG4gICAgKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiXFxiL3UudGVzdChzY3JpcHQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmlzbWEgPSBqc29uT2JqLnByaXNtYSBhcyB7IHNlZWQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHByaXNtYT8uc2VlZCkgfHwgZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhqc29uT2JqLnNjcmlwdHM/LnNlZWQpO1xufVxuXG5mdW5jdGlvbiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHNlZWRDb21tYW5kOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gRG9ja2VyIGltYWdlcyBydW4gc2VlZCBzY3JpcHRzIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLFxuICAvLyBzbyBUeXBlU2NyaXB0IHNlZWQgcnVubmVycyBtdXN0IHJlbWFpbiBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAgcmV0dXJuIHR5cGVvZiBzZWVkQ29tbWFuZCA9PT0gJ3N0cmluZycgJiYgLyg/PCFbXFx3LV0pYnVpbGQtdHMoPyFbXFx3LV0pL3UudGVzdChzZWVkQ29tbWFuZCk7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zID0gW1xuICAnZGVwZW5kZW5jaWVzJyxcbiAgJ2RldkRlcGVuZGVuY2llcycsXG4gICdvcHRpb25hbERlcGVuZGVuY2llcycsXG4gICdwZWVyRGVwZW5kZW5jaWVzJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9yY2VzIHN0b3JlLWluY29tcGF0aWJsZSBwYWNrYWdlcyB0byBzdGF5IHByb2plY3QtbG9jYWwgd2hlbiB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGVuYWJsZXNcbiAqIEJ1bidzIGdsb2JhbCBzdG9yZTogYGNoYWtyYSB0eXBlZ2VuYCAocnVuIGJ5IGB3YiBnZW4tY29kZWApXG4gKiB3cml0ZXMgZ2VuZXJhdGVkIHR5cGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0IHBhY2thZ2UsIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogbXV0YXRlIHRoZSBtYWNoaW5lLXdpZGUgc3RvcmUgc2hhcmVkIGFjcm9zcyByZXBvc2l0b3JpZXMsIGFuZCBkcml6emxlLWtpdCByZXF1aXJlcyBkcml6emxlLW9ybVxuICogd2l0aG91dCBkZWNsYXJpbmcgaXQsIHdoaWNoIHRoZSBzdG9yZSByZWFscGF0aCBwbGFjZXMgYmV5b25kIGEgcGxhaW4gbm9kZV9tb2R1bGVzIHdhbGstdXAuXG4gKiBMaXN0aW5nIHRoZW0gaW4gYHRydXN0ZWREZXBlbmRlbmNpZXNgIG1ha2VzIEJ1biBtYXRlcmlhbGl6ZSBhIHBlci1wcm9qZWN0IGNvcHkgdW5kZXJcbiAqIGBub2RlX21vZHVsZXMvLmJ1bi9gLCB3aG9zZSBzaWJsaW5nIGBub2RlX21vZHVsZXMvLmJ1bi9ub2RlX21vZHVsZXMvYCBsaW5rcyBldmVyeSBpbnN0YWxsZWRcbiAqIHBhY2thZ2UgYW5kIHRoZXJlZm9yZSByZXNvbHZlcyB0aGUgdW5kZWNsYXJlZCByZXF1aXJlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQnVuIGNvbnN1bHRzIHRydXN0ZWREZXBlbmRlbmNpZXMgaW4gdGhlIHdvcmtzcGFjZSByb290J3MgcGFja2FnZS5qc29uIG9ubHksIHNvIHRoZSBsaXN0IGlzXG4gIC8vIG1hbmFnZWQgdGhlcmUgYW5kIG11c3QgY292ZXIgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIGFueXdoZXJlIGluIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcbiAgY29uc3QgYnVuSnNvbk9iaiA9IGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbiAmIHsgdHJ1c3RlZERlcGVuZGVuY2llcz86IHN0cmluZ1tdIH07XG4gIC8vIEJ1biBpbnN0YWxscyBvcHRpb25hbCBhbmQgcGVlciBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdCwgc28gYWxsIGRlY2xhcmF0aW9uIHNlY3Rpb25zIGNvdW50LlxuICAvLyBFdmVyeSBkZWNsYXJlZCByYW5nZSBpcyBrZXB0IHBlciBwYWNrYWdlOiBhIHJvb3QgZGVjbGFyYXRpb24gbXVzdCBub3QgbWFzayBhIHdvcmtzcGFjZSBvbmVcbiAgLy8gKGUuZy4gcm9vdCBAY2hha3JhLXVpL2NsaSB2MiBhbG9uZ3NpZGUgYSB3b3Jrc3BhY2Ugb24gdjMpLlxuICBjb25zdCBkZWNsYXJlZERlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMgPSAocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgdmVyc2lvblJhbmdlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltzZWN0aW9uXSA/PyB7fSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uUmFuZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgdmVyc2lvblJhbmdlcyA9IGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldChkZXBlbmRlbmN5TmFtZSk7XG4gICAgICAgICAgaWYgKHZlcnNpb25SYW5nZXMpIHtcbiAgICAgICAgICAgIHZlcnNpb25SYW5nZXMucHVzaCh2ZXJzaW9uUmFuZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWNsYXJlZERlcGVuZGVuY2llcy5zZXQoZGVwZW5kZW5jeU5hbWUsIFt2ZXJzaW9uUmFuZ2VdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZykpIHtcbiAgICB0cnkge1xuICAgICAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoXG4gICAgICAgIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvblxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB1bnJlYWRhYmxlIHdvcmtzcGFjZSBwYWNrYWdlLmpzb25cbiAgICB9XG4gIH1cbiAgLy8gT25seSBAY2hha3JhLXVpL2NsaSB2MydzIGBjaGFrcmEgdHlwZWdlbmAgd3JpdGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0O1xuICAvLyB2MidzIGBjaGFrcmEtY2xpIHRva2Vuc2Agd3JpdGVzIGludG8gQGNoYWtyYS11aS9zdHlsZWQtc3lzdGVtIGluc3RlYWQsIHNvIHRydXN0aW5nXG4gIC8vIEBjaGFrcmEtdWkvcmVhY3QgdGhlcmUgd291bGQgZm9yY2UgYSB1c2VsZXNzIHByb2plY3QtbG9jYWwgY29weSB3aXRob3V0IGZpeGluZyBnZW4tY29kZS5cbiAgLy8gTWlycm9yIHdiIGdlbi1jb2RlJ3MgY2xhc3NpZmljYXRpb246IG9ubHkgYSByYW5nZSB3aG9zZSBsZWFkaW5nIG1ham9yIHBhcnNlcyB0byAyIHNlbGVjdHMgdGhlXG4gIC8vIHYyIGNvbW1hbmQsIHNvIGRpZ2l0bGVzcyBzcGVjcyBsaWtlIGBsYXRlc3RgIG9yIGNhdGFsb2cgcmVmZXJlbmNlcyBjb3VudCBhcyB2My5cbiAgY29uc3QgaGFzQ2hha3JhQ2xpVjMgPSAoZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KCdAY2hha3JhLXVpL2NsaScpID8/IFtdKS5zb21lKFxuICAgICh2ZXJzaW9uUmFuZ2UpID0+IC9cXGQrL3UuZXhlYyh2ZXJzaW9uUmFuZ2UpPy5bMF0gIT09ICcyJ1xuICApO1xuICBjb25zdCByZXF1aXJlZFdiZnlQYWNrYWdlcyA9IFtcbiAgICAuLi4oaGFzQ2hha3JhQ2xpVjMgJiYgZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAY2hha3JhLXVpL3JlYWN0JykgPyBbJ0BjaGFrcmEtdWkvcmVhY3QnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdkcml6emxlLWtpdCcpID8gWydkcml6emxlLWtpdCddIDogW10pLFxuICAgIC8vIFRoZXNlIGdpdC1kZXBlbmRlbmN5IGJ1aWxkcyBpbXBvcnQgcGFja2FnZXMgdGhleSBkbyBub3QgZGVjbGFyZSAoZS5nLiB6b2QpLCB3aGljaCB0aGVcbiAgICAvLyBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cDsgYSBwcm9qZWN0LWxvY2FsIGNvcHkgdW5kZXJcbiAgICAvLyBub2RlX21vZHVsZXMvLmJ1biByZXNvbHZlcyB0aGVtIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHkpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpID8gWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgPyBbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA6IFtdKSxcbiAgICAvLyBibGl0eiBhbmQgQGJsaXR6anMvYXV0aCByZXF1aXJlIHJlYWN0IChhbmQgb3RoZXIgcGVlcnMpIHdpdGhvdXQgZGVjbGFyaW5nIHRoZW0sIHJlbHlpbmcgb25cbiAgICAvLyBob2lzdGluZywgd2hpY2ggdGhlIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwIChvYnNlcnZlZCBpblxuICAgIC8vIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW06IGBuZXh0IGJ1aWxkYCBwYWdlLWRhdGEgY29sbGVjdGlvbiBkaWVzIHdpdGggXCJDYW5ub3QgZmluZCBtb2R1bGVcbiAgICAvLyAncmVhY3QnXCIgZnJvbSBAYmxpdHpqcy9hdXRoKS4gQGJsaXR6anMvcnBjIGlzIE5PVCBsaXN0ZWQgYmVjYXVzZSBpdCBwcm9wZXJseSBkZWNsYXJlcyBpdHNcbiAgICAvLyByZWFjdC9AdGFuc3RhY2sgcGVlcnMsIHNvIEJ1biBsaW5rcyB0aGVtIGludG8gaXRzIHN0b3JlIGVudHJ5LiBAYmxpdHpqcy9uZXh0IGlzXG4gICAgLy8gZGVsaWJlcmF0ZWx5IE5PVCBsaXN0ZWQgZWl0aGVyOiB0cnVzdGluZyBpdCB3b3VsZCBydW4gaXRzIHBvc3RpbnN0YWxsIChgYmxpdHogY29kZWdlbmApLFxuICAgIC8vIHdoaWNoIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2Ug4oCUIHJlcG9zaXRvcmllcyBwYXRjaCBvdXQgdGhhdCBwb3N0aW5zdGFsbFxuICAgIC8vIHdpdGggYGJ1biBwYXRjaGAgaW5zdGVhZCwgd2hpY2ggYWxzbyBrZWVwcyB0aGUgcGFja2FnZSBwcm9qZWN0LWxvY2FsLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2JsaXR6JykgPyBbJ2JsaXR6J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGJsaXR6anMvYXV0aCcpID8gWydAYmxpdHpqcy9hdXRoJ10gOiBbXSksXG4gICAgLy8gQnVuIGRvZXMgbm90IGxpbmsgQGhvb2tmb3JtL3Jlc29sdmVycycgT1BUSU9OQUwgdmFsaWRhdG9yIHBlZXJzIChlLmcuIHpvZCkgaW50byBpdHNcbiAgICAvLyBnbG9iYWwtc3RvcmUgZW50cnkgZXZlbiB3aGVuIHRoZSBwcm9qZWN0IGluc3RhbGxzIHRoZW0sIHNvIGl0cyBzZXJ2ZXItc2lkZVxuICAgIC8vIGBpbXBvcnQgJ3pvZCdgIGZhaWxzIGZyb20gdGhlIHN0b3JlIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAaG9va2Zvcm0vcmVzb2x2ZXJzJykgPyBbJ0Bob29rZm9ybS9yZXNvbHZlcnMnXSA6IFtdKSxcbiAgICAvLyBAem9vbS9ydG1zIGluc3RhbGxzIGl0cyBuYXRpdmUgcnRtcy5ub2RlIGJpbmRpbmcgaW4gYSBsaWZlY3ljbGUgc2NyaXB0LiBXaXRob3V0IGV4cGxpY2l0XG4gICAgLy8gdHJ1c3QsIEJ1biBza2lwcyB0aGF0IHNjcmlwdCBhbmQgdGhlIHBhY2thZ2UgZmFpbHMgYXMgc29vbiBhcyB0aGUgWm9vbSBib3QgaW1wb3J0cyBpdFxuICAgIC8vIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zbWFydHNlLXpvb20tYm90KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAem9vbS9ydG1zJykgPyBbJ0B6b29tL3J0bXMnXSA6IFtdKSxcbiAgXTtcblxuICAvLyB3YmZ5IGZ1bGx5IG93bnMgdGhpcyBmaWVsZDogYSBwYWNrYWdlIHdob3NlIGxpZmVjeWNsZSBzY3JpcHRzIG11c3QgcnVuIGdldHMgYWRkZWQgdG8gd2JmeVxuICAvLyBpdHNlbGYgaW5zdGVhZCBvZiB0byBpbmRpdmlkdWFsIHJlcG9zaXRvcmllcywgc28gdW5tYW5hZ2VkIGVudHJpZXMgYXJlIGFsd2F5cyByZW1vdmVkIOKAlFxuICAvLyBpbmNsdWRpbmcgYW4gZXhwbGljaXRseSBlbXB0eSBkZW55LWFsbCBsaXN0LCB3aG9zZSBkZWxldGlvbiBkZWxpYmVyYXRlbHkgcmVzdG9yZXMgQnVuJ3NcbiAgLy8gZGVmYXVsdCBhbGxvdy1saXN0ICh0aGUgb3duZXJzaGlwIHBvbGljeSBjaG9zZW4gaW4gIzk3NSkuXG4gIGNvbnN0IGV4aXN0aW5nVHJ1c3RlZCA9IGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgaWYgKHJlcXVpcmVkV2JmeVBhY2thZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChleGlzdGluZ1RydXN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRGVsZXRpbmcgdGhlIGZpZWxkIHJlc3RvcmVzIEJ1bidzIGZ1bGwgZGVmYXVsdCBhbGxvdy1saXN0LCBzbyBvbmx5IGVudHJpZXMgb3V0c2lkZSB0aGF0XG4gICAgICAvLyBsaXN0IGFjdHVhbGx5IGxvc2UgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMuXG4gICAgICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCwgbmV3IFNldCgpKTtcbiAgICAgIGRlbGV0ZSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFuIGV4cGxpY2l0IHRydXN0ZWREZXBlbmRlbmNpZXMgbGlzdCBSRVBMQUNFUyBCdW4ncyBkZWZhdWx0IGFsbG93LWxpc3QgaW5zdGVhZCBvZiBleHRlbmRpbmdcbiAgLy8gaXQsIGFuZCBCdW4gcHJpbnRzIG5vIHdhcm5pbmcgZm9yIHRoZSBwb3N0aW5zdGFsbHMgaXQgY29uc2VxdWVudGx5IHNraXBzIChlLmcuIEByYWlsd2F5L2NsaVxuICAvLyBkb3dubG9hZHMgaXRzIGJpbmFyeSBpbiBwb3N0aW5zdGFsbCBhbmQgZXhpdHMgMSB3aXRob3V0IG9uZSkuIEluY2x1ZGUgdGhlIEVOVElSRSBkZWZhdWx0IGxpc3Q6XG4gIC8vIGVudHJpZXMgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQgYXJlIGluZXJ0LCBhbmQgdGhpcyBpcyB0aGUgb25seSByZXByZXNlbnRhdGlvblxuICAvLyB0aGF0IHN0YXlzIGNvcnJlY3QgZm9yIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlc29sdmVzIGFmdGVyIHRoaXNcbiAgLy8gcnVucyDigJQgYW4gaW50ZXJzZWN0aW9uIHdpdGggYSBtaXNzaW5nIG9yIHN0YWxlIGxvY2tmaWxlIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhlbS5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICAvLyBsZWZ0aG9vayBpcyBhcHBlbmRlZCBleHBsaWNpdGx5IHNvIHRoZSBkZWZhdWx0LWxpc3QgbG9va3VwIGZhaWxpbmcgY2Fubm90IGRyb3AgaXQ6IGl0IGlzXG4gIC8vIHJlcXVpcmVkIGluIGV2ZXJ5IG1hbmFnZWQgcmVwb3NpdG9yeS5cbiAgY29uc3QgbmV3VHJ1c3RlZFBhY2thZ2VzID0gbmV3IFNldChbXG4gICAgLi4ucmVxdWlyZWRXYmZ5UGFja2FnZXMsXG4gICAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICAgIC4uLihkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA/PyBbXSksXG4gIF0pO1xuICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCA/PyBbXSwgbmV3VHJ1c3RlZFBhY2thZ2VzKTtcbiAgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzID0gWy4uLm5ld1RydXN0ZWRQYWNrYWdlc10udG9Tb3J0ZWQoKTtcbn1cblxuLy8gVGhlIHBhY2thZ2VzIHdiZnkgaXRzZWxmIG1heSB3cml0ZSBpbnRvIHRydXN0ZWREZXBlbmRlbmNpZXM7IHRoZWlyIHJlbW92YWwgaXMgbWFuYWdlZCBjbGVhbnVwLFxuLy8gbmV2ZXIgYSBsb3NzIG9mIHVzZXIgcG9saWN5LlxuY29uc3Qgd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbXG4gICdAYmxpdHpqcy9hdXRoJyxcbiAgJ0BjaGFrcmEtdWkvcmVhY3QnLFxuICAnQGhvb2tmb3JtL3Jlc29sdmVycycsXG4gICdAd2lsbGJvb3N0ZXIvanVkZ2UnLFxuICAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsXG4gICdAem9vbS9ydG1zJyxcbiAgJ2JsaXR6JyxcbiAgJ2RyaXp6bGUta2l0JyxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuXSk7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGV4aXN0aW5nVHJ1c3RlZDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtlcHRQYWNrYWdlczogUmVhZG9ubHlTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIC8vIEEgZGVmYXVsdC10cnVzdGVkIGVudHJ5IG5ldmVyIGxvc2VzIGFueXRoaW5nIGJ5IHJlbW92YWw6IHdoaWxlIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCB0aGVcbiAgLy8ga2VwdCBsaXN0IChvciwgd2hlbiB0aGUgZmllbGQgaXMgZGVsZXRlZCwgQnVuJ3Mgb3duIGRlZmF1bHQgbGlzdCkgc3RpbGwgdHJ1c3RzIGl0LlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGNvbnN0IHJlbW92ZWRQYWNrYWdlcyA9IGV4aXN0aW5nVHJ1c3RlZC5maWx0ZXIoXG4gICAgKHBrZykgPT4gIWtlcHRQYWNrYWdlcy5oYXMocGtnKSAmJiAhd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzLmhhcyhwa2cpICYmICFkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcz8uaGFzKHBrZylcbiAgKTtcbiAgaWYgKHJlbW92ZWRQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFJlbW92aW5nIHVubWFuYWdlZCB0cnVzdGVkRGVwZW5kZW5jaWVzIGVudHJpZXM6ICR7cmVtb3ZlZFBhY2thZ2VzLmpvaW4oJywgJyl9LiB3YmZ5IG93bnMgdGhpcyBmaWVsZDsgaWYgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMgYXJlIHJlcXVpcmVkLCBhZGQgdGhlIHBhY2thZ2VzIHRvIHdiZnkgaXRzZWxmLmBcbiAgICApO1xuICB9XG59XG5cbmxldCBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbi8qKiBGZXRjaGVzIEJ1bidzIGRlZmF1bHQgdHJ1c3RlZC1kZXBlbmRlbmN5IGFsbG93LWxpc3QgZnJvbSB0aGUgQnVuIHZlcnNpb24gaW5zdGFsbGluZyB0aGUgcmVwb3NpdG9yeS4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcykge1xuICAgIC8vIEJ1biBjb2xvcml6ZXMgdGhlIGxpc3QgbWFya2VycyB3aGVuIEZPUkNFX0NPTE9SIGlzIHNldCAoZS5nLiBieSB0ZXN0IHJ1bm5lcnMgb24gQ0kpLCBzb1xuICAgIC8vIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBtdXN0IGJlIHN0cmlwcGVkIGJlZm9yZSBwYXJzaW5nLlxuICAgIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnYnVuJywgWydwbScsICdkZWZhdWx0LXRydXN0ZWQnXSwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoXG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBtYXRjaGluZyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgcmVxdWlyZXMgdGhlIEVTQyBjb250cm9sIGNoYXJhY3RlclxuICAgICAgL1xcdTAwMUJcXFtbMC05O10qbS9ndSxcbiAgICAgICcnXG4gICAgKTtcbiAgICBjb25zdCBwYXJzZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFsuLi5zdGRvdXQubWF0Y2hBbGwoL15cXHMqLVxccysoXFxTKykkL2dtdSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdIGFzIHN0cmluZykpO1xuICAgIGlmIChwYXJzZWREZXBlbmRlbmNpZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gRG8gbm90IGNhY2hlIHRoZSBmYWlsdXJlOiBhIHRhcmdldC1sb2NhbCBwcm9ibGVtIChlLmcuIGFuIHVucmVhZGFibGUgcGFja2FnZS5qc29uKSBtdXN0XG4gICAgICAvLyBub3QgZGVueSB0aGUgZGVmYXVsdCBsaXN0IHRvIGV2ZXJ5IGxhdGVyIHRhcmdldCBvZiBhIG11bHRpLXBhdGggcnVuLlxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVhZCB0aGUgZGVmYXVsdCBhbGxvdy1saXN0IHZpYSBgYnVuIHBtIGRlZmF1bHQtdHJ1c3RlZGAuJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IHBhcnNlZERlcGVuZGVuY2llcztcbiAgfVxuICByZXR1cm4gY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgLy8gRXhwbGljaXQgcm9vdCBwdWJsaXNoaW5nIGludGVudCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgd2JmeSdzIHByaXZhdGUgbW9ub3JlcG8tcm9vdCBkZWZhdWx0LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmIChjb25maWcucmVsZWFzZS5ucG1QdWJsaXNoZXNSb290IHx8IGpzb25PYmoucHVibGlzaENvbmZpZykpIHtcbiAgICBkZWxldGUganNvbk9iai5wcml2YXRlO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhY29uZmlnLnJlbGVhc2UubnBtICYmICFqc29uT2JqLnB1Ymxpc2hDb25maWcpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJlZ2lzdHJ5LCBucG0gcmVzb2x2ZXMgdGhlIHB1Ymxpc2ggdGFyZ2V0IGZyb20gdGhlIHdvcmtzcGFjZSAubnBtcmMsXG4gICAgLy8gd2hvc2UgZGVmYXVsdCByZWdpc3RyeSBvbiBDSSBtYXkgYmUgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHByb3h5IOKAlCB3aGljaCByZWplY3RzXG4gICAgLy8gYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSAoc2hhcmVkIzEwNzIpLiBgPz89YCBrZWVwcyBhIGRlbGliZXJhdGVseSBkaWZmZXJlbnQgcmVnaXN0cnkuXG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLnJlZ2lzdHJ5ID8/PSAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJztcbiAgfVxuICBjb25zdCBvd25lciA9IGNvbmZpZy5yZXBvQXV0aG9yO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ2J1biBydW4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgY29uc3Qgc2NyaXB0UnVubmVyID0gJ2J1biBydW4nO1xuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGAke3NjcmlwdFJ1bm5lcn0gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBgJHtzY3JpcHRSdW5uZXJ9IGxpbnRgO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgaWYgKHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZykpIHtcbiAgICAvLyBQcmVzZXJ2ZSBwcm9qZWN0LXNwZWNpZmljIHN0ZXBzIGEgcmVwbyBhcHBlbmRlZCB0byB0aGUgbWFuYWdlZCBgYnVuIHdiIGdlbi1jb2RlYCAoZS5nLiBidWlsZGluZyBleHRyYSBkZXBsb3lcbiAgICAvLyBhc3NldHMpIGluc3RlYWQgb2YgZGlzY2FyZGluZyB0aGVtOyBvbmx5IHRoZSBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnQgaXMgd2JmeSdzIHRvXG4gICAgLy8gcmVnZW5lcmF0ZS4gQW4gdW5wYXJzZWFibGUgc2NyaXB0IGlzIGxlZnQgYWxvbmUgcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgICBjb25zdCBzZWdtZW50cyA9IGdlbkNvZGVTY3JpcHQgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhnZW5Db2RlU2NyaXB0KTtcbiAgICBjb25zdCBjdXN0b21TZWdtZW50cyA9IHNlZ21lbnRzPy5maWx0ZXIoXG4gICAgICAoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIGpzb25PYmouc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgKTtcbiAgICBpZiAoY3VzdG9tU2VnbWVudHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IFsnYnVuIHdiIGdlbi1jb2RlJywgLi4uY3VzdG9tU2VnbWVudHNdLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoanNvbk9iai5zY3JpcHRzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhIHx8IGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8IGNvbmZpZy5kZXBlbmRpbmcucHJpc21hO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChmb3JtYXRTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmIGJ1biBydW4gZm9ybWF0LWNvZGVgIDogJ2J1biBydW4gZm9ybWF0LWNvZGUnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PlxuICAgIGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQubXRzJyksIGNvbmZpZ0RtdHNDb250ZW50KVxuICApO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBqc29uT2JqOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpLmZpbHRlcihcbiAgICAoZGVwZW5kZW5jeSkgPT5cbiAgICAgIG1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpICYmXG4gICAgICAvLyBBIHB1YmxpYyBwYWNrYWdlJ3MgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBtdXN0IG5ldmVyIGJlIHJlLW1hbmFnZWQgdmlhIGEgcmVnaXN0cnkgaW5zdGFsbFxuICAgICAgLy8gKHByaXZhdGUgb25lcyBhcmUgbm9ybWFsaXplZCB0byBgd29ya3NwYWNlOipgIGxhdGVyKS4gVGhpcyBhbHNvIGNvdmVycyBydW5uaW5nIHdiZnkgb24gYVxuICAgICAgLy8gbW9ub3JlcG8gU1VCRElSRUNUT1JZLCB3aGVyZSB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcyBhcmUgaW52aXNpYmxlIGFuZCB0aGUgd29ya3NwYWNlLW1hcFxuICAgICAgLy8gZ3VhcmQgaW4gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMgY2Fubm90IHByb3RlY3QgdGhlIHNwZWNpZmllci5cbiAgICAgIChqc29uT2JqLnByaXZhdGUgfHwgIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiB2b2lkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuICB9XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgLy8gYG1pc2Ugd2hpY2ggcHl0aG9uYCB5aWVsZHMgdGhlIHNpbmdsZSBhY3RpdmUgaW50ZXJwcmV0ZXIgcGF0aDsgYG1pc2UgY3VycmVudCBweXRob25gIGNhblxuICAvLyBwcmludCBtdWx0aXBsZSBzcGFjZS1zZXBhcmF0ZWQgdmVyc2lvbnMgKG1pc2Ugc3VwcG9ydHMgbXVsdGktdmVyc2lvbiBwaW5zKSwgd2hpY2ggd291bGQgcGFzc1xuICAvLyBleHRyYSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBgcG9ldHJ5IGVudiB1c2VgLiBXaGVuIG1pc2UgaXMgbWlzc2luZyBvciBweXRob24gaXNcbiAgLy8gdW5jb25maWd1cmVkLCBza2lwIGBwb2V0cnkgZW52IHVzZWAgYW5kIGZhbGwgYmFjayB0byBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyIGluc3RlYWQgb2ZcbiAgLy8gYWJvcnRpbmcgdGhlIGNoYWluLlxuICAvLyBUaGUgYHx8IHRydWVgIGNvdmVycyBvbmx5IHRoZSBtaXNlIHJlc29sdXRpb246IGEgbWlzc2luZy91bmNvbmZpZ3VyZWQgbWlzZSBmYWxscyBiYWNrIHRvXG4gIC8vIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIsIHdoaWxlIGEgZmFpbGluZyBgcG9ldHJ5IGVudiB1c2VgIHN0aWxsIGFib3J0cyB0aGUgY2hhaW4uXG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgeyBweXRob25fcGF0aD1cIiQobWlzZSB3aGljaCBweXRob24gMj4vZGV2L251bGwpXCIgfHwgdHJ1ZTsgfSAmJiB7IFsgLXogXCIkcHl0aG9uX3BhdGhcIiBdIHx8IHBvZXRyeSBlbnYgdXNlIFwiJHB5dGhvbl9wYXRoXCI7IH0gJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KSkpLFxuICBdO1xuICBzcGF3blN5bmMoJ2J1bicsIFsnYWRkJywgLi4uKGRldiA/IFsnLUQnXSA6IFtdKSwgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIC8vIEEgcHJpdmF0ZSBwYWNrYWdlIHdob3NlIG1vbm9yZXBvIGNvbnRhaW5zIHRoaXMgZGVwZW5kZW5jeSBhcyBhIHdvcmtzcGFjZSBtdXN0IHJlZmVyZW5jZSBpdFxuICAgIC8vIHZpYSB0aGUgd29ya3NwYWNlIHByb3RvY29sOiBwaW5uaW5nIGEgcmVnaXN0cnkgdmVyc2lvbiBtYWtlcyBCdW4gc2hhZG93IHRoZSBzYW1lLW5hbWVcbiAgICAvLyB3b3Jrc3BhY2UgYW5kIHNraXAgaW5zdGFsbGluZyB0aGUgd29ya3NwYWNlJ3Mgb3duIGRlcGVuZGVuY2llcy4gKFB1Ymxpc2hlZCBwYWNrYWdlcyBpbnN0ZWFkXG4gICAgLy8gcGluIGEgY29uY3JldGUgdmVyc2lvbiBiZWNhdXNlIGBucG0gcHVibGlzaGAgcmVqZWN0cyBgd29ya3NwYWNlOipgIHNwZWNpZmllcnMg4oCUIGJ1dCBhblxuICAgIC8vIEVYSVNUSU5HIGB3b3Jrc3BhY2U6YCBkZWNsYXJhdGlvbiBpcyBhbHdheXMga2VwdDogb3ZlcndyaXRpbmcgaXQgd2l0aCBhIHJlZ2lzdHJ5IHJlbGVhc2VcbiAgICAvLyB3b3VsZCBzaWxlbnRseSBicmVhayB0aGUgbG9jYWwgd29ya3NwYWNlIGxpbmsuKVxuXG4gICAgLy8gQSBkZWNsYXJlZCBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGFsd2F5cyB3aW5zLCB3aGV0aGVyIG9yIG5vdCB0aGUgd29ya3NwYWNlIG1hcCBzZWVzIHRoZVxuICAgIC8vIHBhY2thZ2U6IHJ1bm5pbmcgd2JmeSBvbiBhIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSBoaWRlcyB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcywgc28gdGhlIG1hcFxuICAgIC8vIGFsb25lIGNhbm5vdCBiZSB0cnVzdGVkIHRvIGRldGVjdCBhIGxvY2FsIHdvcmtzcGFjZSBsaW5rLlxuICAgIGlmIChwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoanNvbk9iai5wcml2YXRlKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoanNvbk9iai5wcml2YXRlICYmIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmhhcyhkZXBlbmRlbmN5KSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZXhpc3RpbmdTcGVjaWZpZXIgfHwgZXhpc3RpbmdTcGVjaWZpZXIuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBBbiBleGlzdGluZyBDT05DUkVURSBwaW4gb24gYSB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhIGRlbGliZXJhdGUgY2hvaWNlIGFuZCBtdXN0IG5vdCBiZVxuICAgICAgLy8gY29udmVydGVkIHRvIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2wuIE5vdGUgdGhlIHRyYWRlLW9mZiBlaXRoZXIgd2F5OiBucG0gKHdoaWNoXG4gICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlXG4gICAgICAvLyBhIHJlZ2lzdHJ5IHBpbiBtYWtlcyBhIGNvbGQgYnVuIGluc3RhbGwgc2hhZG93IHRoZSB3b3Jrc3BhY2UgYW5kIHNraXAgaXRzIGRlcGVuZGVuY2llcyDigJRcbiAgICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBrZWVwcyBgd29ya3NwYWNlOipgIGFuZCBzdHJpcHMgdGhlIHByb3RvY29sIG9uIHRoZSBDSSBjaGVja291dCByaWdodFxuICAgICAgLy8gYmVmb3JlIHJlbGVhc2luZyAoc2NyaXB0cy9zdHJpcFdvcmtzcGFjZVByb3RvY29sLm1qcykuIEZhbGwgdGhyb3VnaCBzbyBhIGNvbmNyZXRlIHBpblxuICAgICAgLy8ga2VlcHMgYmVpbmcgYnVtcGVkIGxpa2UgYW55IG1hbmFnZWQgZGVwZW5kZW5jeS5cbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHJvb3RDb25maWcsXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGNvbnN0IG1hbmFnZWRWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSwgbWFuYWdlZFZlcnNpb24pKSB7XG4gICAgICAgIC8vIGBidW4gYWRkIGRlcGVuZGVuY3lgIHByZXNlcnZlcyBhbiBleGlzdGluZyBleGFjdCBwaW4sIHNvIHdyaXRlIHRoZSBhZ2UtY2xlYXJlZCB2ZXJzaW9uXG4gICAgICAgIC8vIGRpcmVjdGx5LiBUaGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGluc3RhbGwgcmVmcmVzaGVzIHRoZSBsb2NrZmlsZSBhZnRlciBldmVyeSBwYWNrYWdlXG4gICAgICAgIC8vIG1hbmlmZXN0IGhhcyBjb252ZXJnZWQgb24gdGhlIGdlbmVyYXRlZCByZWxlYXNlLWFnZSBwb2xpY3kuXG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbWFuYWdlZFZlcnNpb247XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoIXNraXBBZGRpbmdEZXBzKSBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgaWYgKGxhdGVzdFZlcnNpb24gPT09ICcqJyAmJiBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBsYXRlc3RWZXJzaW9uO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgc3Bhd25TeW5jKCdidW54JywgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICAvLyBUeXBlU2NyaXB0IDcncyBuYXRpdmUgY29tcGlsZXIgZHJvcHBlZCB0aGUgaW4tcHJvY2VzcyBgcGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbmBcbiAgICAvLyBoZWxwZXIsIHNvIHBhcnNlIHRoZSB0c2NvbmZpZyBpbnRvIGFuIEFTVCBhbmQgcmVhZCBpdHMgdG9wLWxldmVsIGBleHRlbmRzYCBkaXJlY3RseS5cbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoYWJzb2x1dGVGaWxlUGF0aCk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcGFyc2VkLmApO1xuICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2UpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodmFsdWUgPT09IGRlcGVuZGVuY3kgfHwgdmFsdWUuc3RhcnRzV2l0aChgJHtkZXBlbmRlbmN5fS9gKSkge1xuICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuLyoqIFJlYWRzIHRoZSB0b3AtbGV2ZWwgYGV4dGVuZHNgIGVudHJpZXMgKGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MpIGZyb20gYSBwYXJzZWQgdHNjb25maWcuICovXG5mdW5jdGlvbiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZSkpIHtcbiAgICBpZiAoYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSAmJiBhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpICYmIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ2V4dGVuZHMnKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhwcm9wZXJ0eS5pbml0aWFsaXplciwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogcmVhZG9ubHkgYXN0Lk9iamVjdExpdGVyYWxFbGVtZW50TGlrZVtdIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoYXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChzdGF0ZW1lbnQpICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uLnByb3BlcnRpZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMobm9kZTogYXN0LkV4cHJlc3Npb24sIHZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGFzdC5pc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICB2YWx1ZXMucHVzaChub2RlLnRleHQpO1xuICB9IGVsc2UgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygbm9kZS5lbGVtZW50cykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMoZWxlbWVudCwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PltdIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5c1xuICAgIC5tYXAoKGtleSkgPT4ganNvbk9ialtrZXldKVxuICAgIC5maWx0ZXIoKHNlY3Rpb24pOiBzZWN0aW9uIGlzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gISFzZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVkVmVyc2lvbiA9IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuZ2V0KGRlcGVuZGVuY3kpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpKSB7XG4gICAgcmV0dXJuIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzID0gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3kpO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBpZiAobGF0ZXN0VmVyc2lvbiAhPT0gJyonICYmIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZSh0aW1lc1tsYXRlc3RWZXJzaW9uXSkpIHtcbiAgICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuXG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lcylbMF0gPz8gJyonO1xufVxuXG4vKiogRXZlcnkgc3RhYmxlIHJlbGVhc2UgaW4gYHRpbWVzYCB0aGF0IGFscmVhZHkgY2xlYXJlZCB0aGUgYWdlIGdhdGUsIG5ld2VzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nW10ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModGltZXMpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiBzZW12ZXIudmFsaWQodmVyc2lvbikpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiAoc2VtdmVyLnByZXJlbGVhc2UodmVyc2lvbik/Lmxlbmd0aCA/PyAwKSA9PT0gMClcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IE51bWJlci5pc0Zpbml0ZShEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSkpXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBub3cgLSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSA+PSBwYWNrYWdlQWdlR2F0ZU1zKVxuICAgIC50b1NvcnRlZCgoW3ZlcnNpb25BXSwgW3ZlcnNpb25CXSkgPT4gc2VtdmVyLnJjb21wYXJlKHZlcnNpb25BLCB2ZXJzaW9uQikpXG4gICAgLm1hcCgoW3ZlcnNpb25dKSA9PiB2ZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHB1Ymxpc2hlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaXNoZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwdWJsaXNoZWRUaW1lID0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHVibGlzaGVkVGltZSkgJiYgRGF0ZS5ub3coKSAtIHB1Ymxpc2hlZFRpbWUgPj0gcGFja2FnZUFnZUdhdGVNcztcbn1cblxuZnVuY3Rpb24gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3k6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGRlcGVuZGVuY3kucmVwbGFjZSgvQFteQC9dKyQvdSwgJycpO1xuICBjb25zdCBjYWNoZWRUaW1lcyA9IG5wbVBhY2thZ2VUaW1lc0NhY2hlLmdldChwYWNrYWdlTmFtZSk7XG4gIGlmIChjYWNoZWRUaW1lcykgcmV0dXJuIGNhY2hlZFRpbWVzO1xuXG4gIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnbnBtJyxcbiAgICBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3RpbWUnLCAnLS1qc29uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLFxuICAgIHByb2Nlc3MuY3dkKClcbiAgKTtcbiAgaWYgKCFzdGRvdXQpIHJldHVybiB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgW1JlY29yZDxzdHJpbmcsIHN0cmluZz5dO1xuICAgIGNvbnN0IHRpbWVzID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkWzBdIDogcGFyc2VkO1xuICAgIGlmICghdGltZXMpIHJldHVybiB7fTtcbiAgICBucG1QYWNrYWdlVGltZXNDYWNoZS5zZXQocGFja2FnZU5hbWUsIHRpbWVzKTtcbiAgICByZXR1cm4gdGltZXM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBLZWVwIHBpbm5pbmcgYWxpZ25lZCB3aXRoIEJ1bidzIGV4ZW1wdGlvbnMuIHdiZnkncyBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbiBjYW4gcmVseSBvbiB0aGVcbiAgLy8gY3VycmVudCB3YiBjb250cmFjdCwgc28gaW5kZXBlbmRlbnRseSBzb2FraW5nIG9yIGRvd25ncmFkaW5nIHdiIHdvdWxkIHBhaXIgbmV3IGdlbmVyYXRlZCBmaWxlc1xuICAvLyB3aXRoIGFuIGluY29tcGF0aWJsZSBvbGQgQ0xJLCBhbmQgYSB0ZW1wb3JhcmlseSBleGVtcHRlZCBwYWNrYWdlIG11c3QgcmVhY2ggaXRzIHNlY3VyaXR5IGZpeC5cbiAgLy8gT25seSBwYWNrYWdlcyBCdW4gaXRzZWxmIGdhdGVzIG1heSBiZSBzZWxlY3RlZCBmcm9tIG9sZGVyIHRhZ3MuXG4gIHJldHVybiAhYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5zb21lKChwYXR0ZXJuKSA9PiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuLCBkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJuID09PSBkZXBlbmRlbmN5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApLnJlcGxhY2VBbGwoJyonLCAnLionKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgLCAndScpLnRlc3QoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBObyBjYWNoZSBoZXJlOiB0aGUgb25seSBjYWxsZXIgY2hhaW4gZ29lcyB0aHJvdWdoIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uLCB3aGljaCBhbHJlYWR5XG4gIC8vIG1lbW9pemVzIHBlciBkZXBlbmRlbmN5LCBzbyB0aGlzIGNhbiBydW4gYXQgbW9zdCBvbmNlIHBlciBkZXBlbmRlbmN5LlxuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBkZXBlbmRlbmN5LCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSwgcHJvY2Vzcy5jd2QoKSkgfHwgJyonO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFR5cGVTY3JpcHQgaXMgdmVyc2lvbi1jYXBwZWQgaW4gQmxpdHogcmVwb3NpdG9yaWVzLCBzbyBpdHMgaW5zdGFsbCBzcGVjaWZpZXIgbXVzdCBjYXJyeSB0aGVcbiAgLy8gbWFuYWdlZCB2ZXJzaW9uIOKAlCBhIGJhcmUgYGJ1biBhZGRgIHdvdWxkIGluc3RhbGwgdGhlIGluY29tcGF0aWJsZSBsYXRlc3QuXG4gIGlmIChkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Z2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSl9YDtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jeTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYSBCbGl0eiBhcHAgKHRoZSBjdXJyZW50IHBhY2thZ2Ugb3IgdGhlIHdvcmtzcGFjZSByb290KS4gKi9cbmZ1bmN0aW9uIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCByb290Q29uZmlnLmRlcGVuZGluZy5ibGl0ejtcbn1cblxuY29uc3Qgd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4vKiogTWFwIGZyb20gZWFjaCB3b3Jrc3BhY2UgcGFja2FnZSdzIG5hbWUgdG8gaXRzIGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZS5nZXQocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCB3b3Jrc3BhY2VEaXJzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgaWYgKHdvcmtzcGFjZVBhY2thZ2VKc29uLm5hbWUpIHtcbiAgICAgICAgd29ya3NwYWNlRGlyc0J5TmFtZS5zZXQod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucGFyc2FibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLnNldChyb290Q29uZmlnLmRpclBhdGgsIHdvcmtzcGFjZURpcnNCeU5hbWUpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyc0J5TmFtZTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGN1cnJlbnRWZXJzaW9uID09PSAnKicpIHJldHVybiB0cnVlO1xuICBpZiAoaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkgcmV0dXJuIHRydWU7XG4gIGlmICghbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgY29uc3QgY3VycmVudFZhbGlkVmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIC8vIEEgVHlwZVNjcmlwdCA3IHBpbiBpbiBhIEJsaXR6IHJlcG9zaXRvcnkgaXMgbGlrZXdpc2UgaW5jb21wYXRpYmxlIChgbmV4dCBidWlsZGAgZmFpbHMgb25cbiAgLy8gdGhlIE5leHQuanMgMTUgdGhhdCBCbGl0eiBwaW5zIOKAlCBzZWUgZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKSwgc28gcmV3cml0ZSBpdCB0byB0aGVcbiAgLy8gY2FwcGVkIHJlbGVhc2UgaW5zdGVhZCBvZiBwcmVzZXJ2aW5nIGl0IHZpYSB0aGUgbm8tZG93bmdyYWRlIHJ1bGUgYmVsb3cuIFRoZSBwaW4gbWF5IGJlIGFcbiAgLy8gUkFOR0UgKGUuZy4gYF43LjAuMGApLCB3aGljaCBzZW12ZXIudmFsaWQgcmVqZWN0cyDigJQganVkZ2UgdGhlIG1ham9yIGZyb20gdGhlIHJhbmdlIG1pbmltdW0uXG4gIGNvbnN0IGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiA9XG4gICAgY3VycmVudFZhbGlkVmVyc2lvbiA/PyAoc2VtdmVyLnZhbGlkUmFuZ2UoY3VycmVudFZlcnNpb24pID8gc2VtdmVyLm1pblZlcnNpb24oY3VycmVudFZlcnNpb24pPy52ZXJzaW9uIDogdW5kZWZpbmVkKTtcbiAgaWYgKFxuICAgIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmXG4gICAgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSAmJlxuICAgIGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiAmJlxuICAgIHNlbXZlci5tYWpvcihjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24pID49IDcgJiZcbiAgICBzZW12ZXIudmFsaWQobWFuYWdlZFZlcnNpb24pICYmXG4gICAgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gVGhlIGdlbmVyYXRlZCBidW5maWcgYXBwbGllcyB0aGUgb3JnYW5pemF0aW9uIGFnZSBnYXRlIGV2ZW4gdG8gZXhhY3QgcGlucy4gSWYgYSBtYW5hZ2VkXG4gIC8vIHRoaXJkLXBhcnR5IHRvb2wgaXMgbmV3ZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UgdGhhdCBjbGVhcmVkIHRoYXQgZ2F0ZSwgcHJlc2VydmluZyB0aGUgcGluXG4gIC8vIHByb2R1Y2VzIGEgcGFja2FnZS5qc29uIHRoYXQgYSBmcmVzaCBpbnN0YWxsIHdpdGhvdXQgdGhlIG9sZCBsb2NrZmlsZSBjYW5ub3QgcmVzb2x2ZSAobm90YWJseVxuICAvLyBvcHRpbWl6ZWQgRG9ja2VyIGJ1aWxkcykuIEtlZXAgdGhlIG5vLWRvd25ncmFkZSBwb2xpY3kgb25seSB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIGV4ZW1wdCBmcm9tXG4gIC8vIHRoZSBnYXRlOyBhZ2UtZ2F0ZWQgbWFuYWdlZCB0b29scyBtdXN0IGNvbnZlcmdlIG9uIHRoZSB2ZXJzaW9uIHRoZSBnZW5lcmF0ZWQgYnVuZmlnIGFjY2VwdHMuXG4gIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyB3YmZ5IG93bnMgdGhlc2UgdG9vbCBkZXBlbmRlbmNpZXMsIGJ1dCBhcHBseWluZyB3YmZ5IHNob3VsZCBub3QgZG93bmdyYWRlIGFcbiAgLy8gcmVwb3NpdG9yeSB0aGF0IGFscmVhZHkgcGlucyBhIG5ld2VyIHJldmlld2VkIHJlbGVhc2Ugd2hlbiB0aGUgb3JnIHBvbGljeSBleGVtcHRzIGl0LlxuICByZXR1cm4gaXNOZXdlclBhY2thZ2VWZXJzaW9uKG1hbmFnZWRWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWFuYWdlZFZlcnNpb246IHN0cmluZ1xuKTogY3VycmVudFZlcnNpb24gaXMgc3RyaW5nIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRNYW5hZ2VkVmVyc2lvbiA9IHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbik7XG4gIHJldHVybiAoXG4gICAgc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSAmJlxuICAgIHZhbGlkQ3VycmVudFZlcnNpb24gIT09IG51bGwgJiZcbiAgICB2YWxpZE1hbmFnZWRWZXJzaW9uICE9PSBudWxsICYmXG4gICAgc2VtdmVyLmd0KHZhbGlkQ3VycmVudFZlcnNpb24sIHZhbGlkTWFuYWdlZFZlcnNpb24pXG4gICk7XG59XG5cbi8vIFRoZSBuZXdlc3QgVHlwZVNjcmlwdCA2IHJlbGVhc2UgYXQgdGhlIHRpbWUgdGhlIEJsaXR6IGNhcCBzaGlwcGVkOyB1c2VkIG9ubHkgd2hlbiB0aGUgcmVnaXN0cnlcbi8vIGxvb2t1cCBmb3IgdGhlIGFjdHVhbCBuZXdlc3QgcHJlLXY3IHJlbGVhc2UgZmFpbHMgKHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLlxuY29uc3QgbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbiA9ICc2LjAuMyc7XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICAvLyBCbGl0eiBwaW5zIE5leHQuanMgMTUsIHdob3NlIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgcmVxdWlyZXMgdGhlIGNsYXNzaWNcbiAgICAvLyBgdHlwZXNjcmlwdGAgY29tcGlsZXIgQVBJOyB0aGUgVHlwZVNjcmlwdCA3IGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIGJpbmFyeVxuICAgIC8vIHdpdGhvdXQgdGhhdCBBUEksIHNvIGBuZXh0IGJ1aWxkYCBhYm9ydHMgd2l0aCBcIkZhaWxlZCB0byBpbnN0YWxsIHJlcXVpcmVkIFR5cGVTY3JpcHRcbiAgICAvLyBkZXBlbmRlbmNpZXNcIiAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuIENhcCBgdHlwZXNjcmlwdGAgYmVsb3cgNyB1bnRpbFxuICAgIC8vIEJsaXR6IHN1cHBvcnRzIGEgTmV4dC5qcyByZWxlYXNlIHRoYXQgdW5kZXJzdGFuZHMgdHNnby4gQSBmYWlsZWQgcmVnaXN0cnkgbG9va3VwIG11c3RcbiAgICAvLyByZXNvbHZlIHRvIGEga25vd24tY29tcGF0aWJsZSByZWxlYXNlIOKAlCBmYWxsaW5nIGJhY2sgdG8gbGF0ZXN0VmVyc2lvbiB3b3VsZCByZWluc3RhbGwgdGhlXG4gICAgLy8gaW5jb21wYXRpYmxlIFR5cGVTY3JpcHQgNy5cbiAgICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbik7XG4gICAgaWYgKHZhbGlkTGF0ZXN0VmVyc2lvbiAmJiBzZW12ZXIubWFqb3IodmFsaWRMYXRlc3RWZXJzaW9uKSA8IDcpIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICAgIC8vIFRoZSBjYXBwZWQgbG9va3VwIG11c3QgcmVzcGVjdCB0aGUgYWdlIGdhdGUgdG9vOiB0aGlzIHZlcnNpb24gaXMgd3JpdHRlbiBhcyBhbiBleGFjdCBwaW4sXG4gICAgLy8gYW5kIEJ1biByZWZ1c2VzIHRvIHJlc29sdmUgb25lIHB1Ymxpc2hlZCBpbnNpZGUgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93LiBUaGVyZSBpcyBub1xuICAgIC8vIHVuZ2F0ZWQgZmFsbGJhY2sg4oCUIHdpdGhvdXQgcHVibGljYXRpb24gbWV0YWRhdGEgdGhlIGFnZSBvZiBhIHJhbmdlIHJlc3VsdCBpcyB1bmtub3duLCBzbyBhXG4gICAgLy8gcGFydGlhbCByZWdpc3RyeSBmYWlsdXJlIHdvdWxkIG90aGVyd2lzZSB3cml0ZSBhIHZlcnNpb24gQnVuIHRoZW4gcmVmdXNlcyB0byBpbnN0YWxsLlxuICAgIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZFZlcnNpb25CZWxvdyh0eXBlc2NyaXB0RGVwZW5kZW5jeSwgJzcuMC4wJykgPz8gbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBUaGUgaGlnaGVzdCByZWxlYXNlIG9mIGBwYWNrYWdlTmFtZWAgYmVsb3cgYGV4Y2x1c2l2ZVVwcGVyQm91bmRgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2VcbiAqIGdhdGUsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSByZWdpc3RyeSBsb29rdXAgZmFpbHMgb3Igbm8gc3VjaCByZWxlYXNlIGV4aXN0cyB5ZXQuXG4gKi9cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHBhY2thZ2VOYW1lOiBzdHJpbmcsIGV4Y2x1c2l2ZVVwcGVyQm91bmQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyhnZXROcG1QYWNrYWdlVGltZXMocGFja2FnZU5hbWUpKS5maW5kKCh2ZXJzaW9uKSA9PlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBleGNsdXNpdmVVcHBlckJvdW5kKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyUGFja2FnZVZlcnNpb24oY2FuZGlkYXRlVmVyc2lvbjogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChjYW5kaWRhdGVWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIHJldHVybiAhdmFsaWRMYXRlc3RWZXJzaW9uIHx8ICF2YWxpZEN1cnJlbnRWZXJzaW9uIHx8IHNlbXZlci5ndCh2YWxpZExhdGVzdFZlcnNpb24sIHZhbGlkQ3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHNcbiAgICAvLyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgICBjbGVhbnVwOiAnYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgIGZvcm1hdDogYGJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICBsaW50OiBgYnVuIHdiIGxpbnRgLFxuICAgICdsaW50LWZpeCc6ICdidW4gd2IgbGludCAtLWZpeCcsXG4gICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICB0eXBlY2hlY2s6ICdidW4gd2IgdHlwZWNoZWNrJyxcbiAgICB2ZXJpZnk6ICdidW4gd2IgdmVyaWZ5JyxcbiAgICAndmVyaWZ5LWZ1bGwnOiAnYnVuIHdiIHZlcmlmeSAtLWZ1bGwnLFxuICB9O1xuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGFwcGx5VGVzdE9uQ2lTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIH1cbiAgYXBwbHlUZXN0U2NyaXB0KGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ3Rlc3QnLCAndmVyaWZ5LWZ1bGwnXSk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgYGJ1biAke2dldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyl9YCk7XG4gIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbi8vIENJIHdvcmtmbG93cyAoYm90aCB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBhbmQgdGhlIHNlbGYtY29udGFpbmVkIHZhcmlhbnQgZm9yIG5vbi1XaWxsQm9vc3RlclxuLy8gcmVwb3NpdG9yaWVzKSBwcmVmZXIgYHRlc3QvY2lgIG92ZXIgYHRlc3RgLCBzbyBzdGFuZGFyZGl6ZSBpdCBvbiBgd2IgdGVzdC1vbi1jaWAgYXQgdGhlIHJvb3Qg4oCUXG4vLyBgd2IgdGVzdC1vbi1jaWAgYWxyZWFkeSBpdGVyYXRlcyB3b3Jrc3BhY2UgcGFja2FnZXMgaXRzZWxmLlxuZnVuY3Rpb24gYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbJ3Rlc3QvY2knXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBDSSB0ZXN0cyB3aXRoIGV4dHJhIHN0ZXBzIChlLmcuIHNlbGVjdGluZyBzcGVjIGZpbGVzIG9yIHJ1bm5pbmcgcmF3XG4gIC8vIFBsYXl3cmlnaHQpIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5OyBzdWNoIHdyYXBwZXJzIGFyZSBwcmVzZXJ2ZWQuXG4gIHNjcmlwdHNbJ3Rlc3QvY2knXSA9IG9sZFNjcmlwdCAmJiAhaXNHZW5lcmF0ZWRUZXN0T25DaVNjcmlwdChvbGRTY3JpcHQpID8gb2xkU2NyaXB0IDogJ2J1biB3YiB0ZXN0LW9uLWNpJztcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIGdlbmVyYXRlZCBgd2IgdGVzdC1vbi1jaWAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKipcbiAqIGB3YiB0ZXN0YCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCB0ZXN0IHJ1bm5lcnMgb25seSwgc28gcmVwbGFjaW5nIHRoZSBgdGVzdGAgc2NyaXB0IG9mIGFcbiAqIHBhY2thZ2Ugd3JpdHRlbiBpbiBhbm90aGVyIGxhbmd1YWdlIChlLmcuIGEgTWF2ZW4gb3IgYW4gUlNwZWMgcGFja2FnZSBpbiBhIHBvbHlnbG90IG1vbm9yZXBvKVxuICogc2lsZW50bHkgZHJvcHMgaXRzIHdob2xlIHN1aXRlOiB0aGUgZ2VuZXJhdGVkIHNjcmlwdCB0aGVuIHN1Y2NlZWRzIHdpdGhvdXQgcnVubmluZyBhbnl0aGluZy5cbiAqIFN1Y2ggYSBwYWNrYWdlIGtlZXBzIGl0cyBvd24gYHRlc3RgIHNjcmlwdDsgSlMvVFMgcGFja2FnZXMgYXJlIHN0YW5kYXJkaXplZCBhcyB1c3VhbC5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUZXN0U2NyaXB0KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHNcbik6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzLnRlc3Q/LnRyaW0oKTtcbiAgaWYgKCFvbGRTY3JpcHQgfHwgZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBpc0dlbmVyYXRlZFRlc3RTY3JpcHQob2xkU2NyaXB0KSkgcmV0dXJuO1xuICBzY3JpcHRzLnRlc3QgPSBvbGRTY3JpcHQ7XG59XG5cbi8qKiBXaGV0aGVyIGEgc2NyaXB0IGJvZHkgaXMgb25lIG9mIHRoZSBLTk9XTiBnZW5lcmF0ZWQgYHdiIHRlc3RgIGludm9jYXRpb25zLiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0U2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3QnO1xufVxuXG4vKipcbiAqIEtlZXBzIGEgc2NyaXB0IHRoYXQgQ0hBSU5TIGV4dHJhIGNvbW1hbmRzIG9udG8gdGhlIGdlbmVyYXRlZCBvbmUgKGUuZy4gYSBwb2x5Z2xvdCBtb25vcmVwb1xuICogYXBwZW5kaW5nIGl0cyBNYXZlbiBhbmQgUlNwZWMgc3VpdGVzIHRvIGB3YiB0ZXN0YCwgd2hpY2ggcnVucyBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgcnVubmVyc1xuICogb25seSkuIFN1Y2ggYSB3cmFwcGVyIHN0aWxsIHJ1bnMgdGhlIGdlbmVyYXRlZCBjb21tYW5kLCBzbyByZXBsYWNpbmcgaXQgd291bGQgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJlcG9zaXRvcnkncyBvd24gc3RlcHMg4oCUIHRoZSBzYW1lIHJlYXNvbmluZyBhcyBgYXBwbHlUZXN0T25DaVNjcmlwdGAuIEFuIHVucmVjb2duaXplZCBjaGFpbmVkXG4gKiBzY3JpcHQgaXMga2VwdCB3aG9sZXNhbGUgcmF0aGVyIHRoYW4gbG9zaW5nIGl0cyBwcm9qZWN0LW93bmVkIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBrZWVwR2VuZXJhdGVkU2NyaXB0V3JhcHBlcnMoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHNjcmlwdE5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBzY3JpcHROYW1lcykge1xuICAgIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbc2NyaXB0TmFtZV0/LnRyaW0oKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRTY3JpcHQgPSBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgIGlmICghb2xkU2NyaXB0IHx8ICFnZW5lcmF0ZWRTY3JpcHQgfHwgb2xkU2NyaXB0ID09PSBnZW5lcmF0ZWRTY3JpcHQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRSZWdFeHAgPSBuZXcgUmVnRXhwKFxuICAgICAgYF4ke2VzY2FwZVJlZ0V4cChnZW5lcmF0ZWRTY3JpcHQpLnJlcGxhY2VBbGwoJyAnLCBTdHJpbmcucmF3YFsgXFx0XStgKX0oPz1bIFxcXFx0XSooPzomJnxcXFxcfFxcXFx8fDt8XFxcXG4pKWAsXG4gICAgICAndSdcbiAgICApO1xuICAgIC8vIEEgbmV3bGluZSBzZXBhcmF0ZXMgc2hlbGwgY29tbWFuZHMganVzdCBsaWtlICYmLCB8fCBhbmQgOy5cbiAgICBpZiAoaGVhZFJlZ0V4cC50ZXN0KG9sZFNjcmlwdCkpIHtcbiAgICAgIC8vIEEgZnVuY3Rpb24gcmVwbGFjZW1lbnQga2VlcHMgYCRgLXNoYXBlZCBjaGFyYWN0ZXJzIGluIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCBsaXRlcmFsLlxuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdC5yZXBsYWNlKGhlYWRSZWdFeHAsICgpID0+IGdlbmVyYXRlZFNjcmlwdCk7XG4gICAgfSBlbHNlIGlmICgvKD86JiZ8XFx8XFx8fDt8XFxuKS91LnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgd2JEYkNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuO1xuXG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLWNyZWF0ZS1taWdyYXRpb24nLCBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZS1kZXZgLCAnbWlncmF0ZS1kZXYnKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgICBzY3JpcHRzLFxuICAgIG9sZFNjcmlwdHMsXG4gICAgJ2RiLW1pZ3JhdGUnLFxuICAgIGAke3diRGJDb21tYW5kfSBtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3lgLFxuICAgICdtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3knXG4gICk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLXZpZXcnLCBgJHt3YkRiQ29tbWFuZH0gc3R1ZGlvYCwgJ3N0dWRpbycpO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0KFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lOiBzdHJpbmcsXG4gIGdlbmVyYXRlZFNjcmlwdDogc3RyaW5nLFxuICBnZW5lcmF0ZWRBcmd1bWVudHM6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbbmFtZV07XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgbWlncmF0aW9uIGNvbW1hbmRzIHRvIHByZXBhcmUgU1FMaXRlIGRpcmVjdG9yaWVzLFxuICAvLyBmYW4gb3V0IG92ZXIgdGVuYW50cywgb3IgcGVyZm9ybSBjbGVhbnVwIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5LlxuICBjb25zdCBnZW5lcmF0ZWRCb2RpZXMgPSBbYGJ1biB3YiBkYiAke2dlbmVyYXRlZEFyZ3VtZW50c31gLCBgYnVuIHdiIHByaXNtYSAke2dlbmVyYXRlZEFyZ3VtZW50c31gXTtcbiAgc2NyaXB0c1tuYW1lXSA9IG9sZFNjcmlwdCAmJiAhZ2VuZXJhdGVkQm9kaWVzLmluY2x1ZGVzKG9sZFNjcmlwdC50cmltKCkpID8gb2xkU2NyaXB0IDogZ2VuZXJhdGVkU2NyaXB0O1xufVxuXG5mdW5jdGlvbiBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgcmV0dXJuICd3YiBkYic7XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgLy8gUHJlc2VydmUgYSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYgcHJlZml4IChlLmcuIGBNSVNFX0VOVj10ZXN0YCkgb24gYW4gZXhpc3RpbmcgbWlzZSBicmlkZ2UuXG4gICAgLy8gU3VjaCBhIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgbWlzZSBjb25maWcgZW52aXJvbm1lbnRzIChtaXNlLjxNSVNFX0VOVj4udG9tbCksIHdoaWNoIGFyZVxuICAgIC8vIHNlbGVjdGVkIGZyb20gTUlTRV9FTlYgKmJlZm9yZSogbWlzZSBzdGFydHMgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCBmcm9tIGluc2lkZSBhIHRhc2s7IGRyb3BwaW5nXG4gICAgLy8gaXQgd291bGQgc2lsZW50bHkgcnVuIHRoZSB0YXNrIGluIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LlxuICAgIGNvbnN0IGVudlByZWZpeCA9IGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpO1xuICAgIGlmIChlbnZQcmVmaXggPT09IHVuZGVmaW5lZCAmJiBvbGRTY3JpcHRzW25hbWVdICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGAke2VudlByZWZpeCA/PyAnJ31taXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudi12YXIgcHJlZml4IG9mIGFuIGV4aXN0aW5nIGBtaXNlIHJ1biA8bmFtZT5gIGJyaWRnZSBzY3JpcHRcbiAqIChwb3NzaWJseSBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYnJpZGdlIGhhcyBubyBwcmVmaXgpLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzY3JpcHQgaXMgbm90IGFcbiAqIG1pc2UgYnJpZGdlIGZvciB0aGUgZ2l2ZW4gdGFzay5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEVhY2ggYXNzaWdubWVudCB2YWx1ZSBtYXkgYmUgZG91YmxlLXF1b3RlZCwgc2luZ2xlLXF1b3RlZCwgb3IgYW4gdW5xdW90ZWQgcnVuIG9mIG5vbi13aGl0ZXNwYWNlLFxuICAvLyBzbyBwcmVmaXhlcyBsaWtlIGBNSVNFX0VOVj1cImEgYlwiYCAod2hvc2UgdmFsdWUgY29udGFpbnMgc3BhY2VzKSBhcmUgbWF0Y2hlZCBpbnN0ZWFkIG9mIGRyb3BwZWQuXG4gIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF4oKD86XFx3Kz0oPzpcIlteXCJdKlwifCdbXiddKid8XFxTKylcXHMrKSopbWlzZSBydW4gJHtlc2NhcGVSZWdFeHAobmFtZSl9JGAsICd1JykuZXhlYyhcbiAgICBzY3JpcHQudHJpbSgpXG4gICk7XG4gIHJldHVybiBtYXRjaD8uWzFdO1xufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIG9yZzogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCBvcmc6ICdXaWxsQm9vc3RlcicsIHJlcG86ICdjb2RlLWFuYWx5emVyJywgdGFyZ2V0OiAnZGV2RGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvanVkZ2UnLCBvcmc6ICdXaWxsQm9vc3RlckxhYicsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IG9yZywgcGFja2FnZU5hbWUsIHJlcG8sIHRhcmdldCB9KSA9PiB7XG4gICAgICBpZiAoIXBhY2thZ2VOYW1lcy5oYXMocGFja2FnZU5hbWUpIHx8IGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCBwYWNrYWdlTmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdO1xuICAgICAgY29uc3Qgb3RoZXJUYXJnZXQgPSB0YXJnZXQgPT09ICdkZXBlbmRlbmNpZXMnID8gJ2RldkRlcGVuZGVuY2llcycgOiAnZGVwZW5kZW5jaWVzJztcbiAgICAgIC8vIFRoZSBsaW50IHJ1bGUgZGlzYWxsb3dzIGBkZWxldGVgIHdpdGggY29tcHV0ZWQgcGFja2FnZSBuYW1lczsgUmVmbGVjdCBoYXMgdGhlIHNhbWUgZGVsZXRpb24gc2VtYW50aWNzIGhlcmUuXG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmpbb3RoZXJUYXJnZXRdLCBwYWNrYWdlTmFtZSk7XG4gICAgICBqc29uT2JqW3RhcmdldF1bcGFja2FnZU5hbWVdID0gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihleGlzdGluZ1NwZWNpZmllciwgb3JnLCByZXBvKVxuICAgICAgICA/IGV4aXN0aW5nU3BlY2lmaWVyXG4gICAgICAgIDogYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIob3JnLCByZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGV4aXN0aW5nIHNwZWNpZmllciBhbHJlYWR5IHBpbnMgYSBnaXQgcmVmIG9mIHRoZSBleHBlY3RlZCBwcml2YXRlIHJlcG9zaXRvcnkuXG4gKiB3YmZ5IG11c3Qgbm90IGJ1bXAgc3VjaCBwaW5zOiBhIHJ1biBpbnRlbmRlZCBhcyBjb25maWd1cmF0aW9uL3BhY2thZ2UtbWFuYWdlciBtYWludGVuYW5jZVxuICogd291bGQgb3RoZXJ3aXNlIGNoYW5nZSB0aGUgZGVwZW5kZW5jeSdzIHZlcnNpb24gYXMgYSBzaWRlIGVmZmVjdCAodXBkYXRpbmcgcGlucyBpcyBSZW5vdmF0ZSdzXG4gKiBqb2IpLCBwb3NzaWJseSB0byBhIGNvbW1pdCB3aG9zZSBwcmVidWlsdCBhcnRpZmFjdHMgYXJlIG1pc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzUGlubmVkUHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoXG4gIHNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcmc6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nXG4pOiBzcGVjaWZpZXIgaXMgc3RyaW5nIHtcbiAgaWYgKCFzcGVjaWZpZXIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2AoPzpefFs6L10pJHtvcmd9LyR7cmVwb30oPzpcXC5naXQpPyNcXFMrJGAsICd1JykudGVzdChzcGVjaWZpZXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmc6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2gob3JnLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbToke29yZ30vJHtyZXBvfS5naXQjJHtjb21taXRIYXNofWA7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBxdW90ZUZvclNoZWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuLy8gTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHRoZSB1bnF1b3RlZCBsb29wcyBiZWxvdyBrZWVwIHBhdGhzXG4vLyB3aXRoIHNwYWNlcyBpbnRhY3QuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGJ1biByZWNvcmRzIGFuIGFic29sdXRlIGByZXNvbHZlZGAgVVJMIGZvciBhbiBhbHJlYWR5LWxvY2tlZCBwYWNrYWdlIHdoZW5ldmVyIHRoZVxuICAgICAgLy8gY29uZmlndXJlZCByZWdpc3RyeSBkb2VzIG5vdCBzZXJ2ZSB0aGUgdGFyYmFsbCBob3N0IGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhIOKAlCB3aGljaCBpc1xuICAgICAgLy8gZXhhY3RseSB3aGF0IHRoZSBUYWt1bWkgR3VhcmQgcHJveHkgZG9lcy4gU28gYW4gaW5zdGFsbCBydW4gd2l0aCBHdWFyZCBhcyB0aGUgZGVmYXVsdFxuICAgICAgLy8gcmVnaXN0cnkgKENJLCBvciBhIGRldmVsb3BlciB3aG8gcHV0IGl0IGluIH4vLm5wbXJjKSBiYWtlcyBucG0uZmxhdHQudGVjaCBVUkxzIGludG9cbiAgICAgIC8vIGJ1bi5sb2NrLCBhbmQgY29tbWl0dGluZyB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeVxuICAgICAgLy8gbGF0ZXIgaW5zdGFsbCBkb3dubG9hZHMgdGhyb3VnaCB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoXG4gICAgICAvLyA0MDEgZm9yIGFueW9uZSB3aG9zZSBucG1yYyBjYXJyaWVzIGEgcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmVnaXN0cnkncyBjcmVkZW50aWFscyB0byB3aGF0ZXZlciBob3N0IHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lc1xuICAgICAgLy8gbm90IGRlcGVuZCBvbiB0aGVzZSBVUkxzIOKAlCB3aXRoIGFuIGVtcHR5IGByZXNvbHZlZGAsIGJ1biBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbVxuICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgcmVnaXN0cnkg4oCUIHNvIHN0cmlwIHRoZW0uIE9ubHkgdGhlIEd1YXJkIGhvc3QgaXMgc3RyaXBwZWQ6IGEgc2NvcGVkXG4gICAgICAvLyByZWdpc3RyeSBzdWNoIGFzIFZlcmRhY2NpbyBsZWdpdGltYXRlbHkgcmVjb3JkcyBpdHMgb3duIFVSTCBmb3IgcHJpdmF0ZSBwYWNrYWdlcy5cbiAgICAgIG5hbWU6ICdub3JtYWxpemUtYnVuLWxvY2tmaWxlJyxcbiAgICAgIGdsb2I6ICdidW4ubG9jaycsXG4gICAgICBydW46ICdiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gT25seSB3aWxsYm9vc3Rlci1jb25maWdzIGdldHMgdGhpcyBqb2I6IGV2ZXJ5IG90aGVyIHJlcG9zaXRvcnkncyByZW5vdmF0ZS5qc29uYyBtZXJlbHlcbiAgICAgIC8vIGV4dGVuZHMgdGhlIHNoYXJlZCBwcmVzZXQsIGFuZCB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IHJlc29sdmUgcmVtb3RlIHByZXNldHMsIHNvIHJ1bm5pbmcgaXRcbiAgICAgIC8vIHRoZXJlIHdvdWxkIHZhbGlkYXRlIHR3byBsaW5lcyBhbmQgY2F0Y2ggbm90aGluZy4gYC0tbm8tZ2xvYmFsYCB2YWxpZGF0ZXMgdGhlIHByZXNldCBhcyBhXG4gICAgICAvLyByZXBvIGNvbmZpZyBpbnN0ZWFkIG9mIGEgc2VsZi1ob3N0ZWQgZ2xvYmFsIGNvbmZpZywgYW5kIGBAbGF0ZXN0YCBrZWVwcyBucG0gZnJvbSBzaWxlbnRseVxuICAgICAgLy8gaW5zdGFsbGluZyBhbiBhbmNpZW50IFJlbm92YXRlIHRoYXQgY2Fubm90IGV2ZW4gcGFyc2UgSlNPTkMgd2hlbiB0aGUgbG9jYWwgTm9kZSBsYWdzIGJlaGluZC5cbiAgICAgIC8vIFN0YWdpbmcgYSBkZWxldGlvbiBvZiByZW5vdmF0ZS5qc29uYyBsZWF2ZXMgbm8gZmlsZSBmb3IgaW5zcGVjdGlvbiwgc28gTGVmdGhvb2sgc2tpcHMgdGhpc1xuICAgICAgLy8gam9iIGluc3RlYWQgb2YgcnVubmluZyB0aGUgdmFsaWRhdG9yIG9uIGEgbWlzc2luZyBwYXRoIOKAlCBkZWxpYmVyYXRlbHksIGJlY2F1c2UgZGVsZXRpbmcgdGhlXG4gICAgICAvLyBzaGFyZWQgcHJlc2V0IGlzIG5vdCBhbiBvcGVyYXRpb24gdGhpcyBob29rIG5lZWRzIHRvIGd1YXJkLlxuICAgICAgbmFtZTogJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycsXG4gICAgICBnbG9iOiAncmVub3ZhdGUuanNvbmMnLFxuICAgICAgcnVuOiAnbnB4IC0teWVzIC0tcGFja2FnZSByZW5vdmF0ZUBsYXRlc3QgLS0gcmVub3ZhdGUtY29uZmlnLXZhbGlkYXRvciAtLXN0cmljdCAtLW5vLWdsb2JhbCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIC8vIHByZXBhcmUgY2FsbHMgdGhpcyB3aXRob3V0IGFyZ3VtZW50cyBhZnRlciBCdW4gc2F2ZXMgdGhlIHJvb3QgbG9ja2ZpbGU7IExlZnRob29rIHBhc3NlcyBpdHNcbiAgLy8gc3RhZ2VkIHBhdGguIFRoZSB1bnByZWRpY3RhYmxlIHNpYmxpbmcgZmlsZSBtYWtlcyByZXBsYWNlbWVudCBhdG9taWMsIGBjcCAtcGAgcHJlc2VydmVzIGl0c1xuICAvLyBtb2RlLCBhbmQgdGhlIGFuY2hvcmVkIHBhdHRlcm4gY2Fubm90IGVyYXNlIGEgZGlyZWN0IHRhcmJhbGwgZGVwZW5kZW5jeSBVUkwuXG4gIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlOiBgXG4jIS9iaW4vYmFzaFxuc2V0IC1lXG5cbmlmIFtbIFwiJCNcIiAtZXEgMCBdXTsgdGhlblxuICBzZXQgLS0gYnVuLmxvY2tcbmZpXG5cbm5vcm1hbGl6ZWQ9XCJcIlxudHJhcCAnW1sgLXogXCIkbm9ybWFsaXplZFwiIF1dIHx8IHJtIC1mIFwiJG5vcm1hbGl6ZWRcIicgRVhJVFxuZm9yIGZpbGUgaW4gXCIkQFwiOyBkb1xuICBbWyAtZiBcIiRmaWxlXCIgXV0gfHwgY29udGludWVcbiAgbm9ybWFsaXplZD1cIiQobWt0ZW1wIFwiJGZpbGUud2JmeS1ub3JtYWxpemluZy5YWFhYWFhcIilcIlxuICBjcCAtcCBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiXG4gIHNlZCAtRSAncyMoXCIsIClcImh0dHBzOi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC9bXlwiXSpcIiNcXFxcMVwiXCIjZycgXCIkZmlsZVwiID4gXCIkbm9ybWFsaXplZFwiXG4gIGlmICEgY21wIC1zIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCI7IHRoZW5cbiAgICBtdiBcIiRub3JtYWxpemVkXCIgXCIkZmlsZVwiXG4gICAgZWNobyBcIlJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAkZmlsZSBzbyB0aGUgbG9ja2ZpbGUgc3RheXMgcmVnaXN0cnktYWdub3N0aWMuXCJcbiAgZmlcbiAgcm0gLWYgXCIkbm9ybWFsaXplZFwiXG4gIG5vcm1hbGl6ZWQ9XCJcIlxuZG9uZVxuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbY29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2snLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIGFsbENvbmZpZ3MpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnLCBhbGxDb25maWdzKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gnKSwgc2NyaXB0cy5ub3JtYWxpemVCdW5Mb2NrZmlsZSArICdcXG4nLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9ICdidW4gd2IgbGludCAtLXF1aWV0JztcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzXG4gICAgLmZpbHRlcigoam9iKSA9PiBqb2IubmFtZSAhPT0gJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycgfHwgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKVxuICAgIC5tYXAoKGpvYikgPT5cbiAgICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogam9iXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIExldCBgd2IgbGludCAtLWZvcm1hdGAgZGVjaWRlIHdoZXRoZXIgUHJldHRpZXIgaXMgYXZhaWxhYmxlOyB0aGUgaG9va1xuICAvLyBzdGlsbCBuZWVkcyB0byB0cmlnZ2VyIHdoZW4gYWRkaW5nIHRoZSBmaXJzdCBwcmV0dGllci1vbmx5IGZpbGUuXG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPSBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdweScpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnZGFydCcpO1xuICB9XG4gIGNvbnN0IGZpbHRlcmVkRXh0ZW5zaW9ucyA9IFsuLi5uZXcgU2V0KHN1cHBvcnRlZEV4dGVuc2lvbnMpXS50b1NvcnRlZCgpO1xuICByZXR1cm4gYCoqLyoueyR7ZmlsdGVyZWRFeHRlbnNpb25zLmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnKSkge1xuICAgIHJldHVybiBTdHJpbmcucmF3YFxuYnVuIHJ1biAtLWN3ZCBwYWNrYWdlcy93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmIChjYW5Vc2VXYkZvclN0YWdlZEZpbGVzKSB7XG4gICAgcmV0dXJuIGBcbmJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcucmF3YFxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgYnVuIHNvcnQtcGFja2FnZS1qc29uICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8cnVzdC10b29sY2hhaW4oXFwudG9tbCk/KWA7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIiR7dG9vbHNDaGFuZ2VkUGF0dGVybn1cIiBcIm1pc2UgaW5zdGFsbFwiYCk7XG4gIC8vIGBtaXNlIGFjdGl2YXRlYCB1cGRhdGVzIFBBVEggb25seSB3aGVuIHRoZSBwcm9tcHQgaXMgZHJhd24sIHNvIHRoZSBob29rIGluaGVyaXRzIHRoZSB0b29sXG4gIC8vIHZlcnNpb25zIHBpbm5lZCBiZWZvcmUgdGhlIG1lcmdlOyByZWZyZXNoIFBBVEggc28gYSBwdWxsZWQgQnVuIHBpbiBpbnN0YWxscyB3aXRoIHRoYXQgQnVuLlxuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKCdldmFsIFwiJChtaXNlIGVudiAtcyBiYXNoKVwiJyk7XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gJ2J1biBpbnN0YWxsJztcbiAgLy8gRG8gTk9UIGFkZCBgLnZpbmV4dGAgaGVyZTogaXQgaG9sZHMgb25seSB2aW5leHQncyBjb250ZW50LWhhc2hlZCBmb250IGNhY2hlIGFuZCB0aGUgZGV2XG4gIC8vIHNlcnZlcidzIGxvY2sgZmlsZSAoZGVsZXRpbmcgdGhlIGxvY2sgZGlzYWJsZXMgdGhlIGR1cGxpY2F0ZS1kZXYtc2VydmVyIGd1YXJkIGZvciBhIHJ1bm5pbmdcbiAgLy8gc2VydmVyKS4gdmluZXh0J3MgYnVpbGQgb3V0cHV0IGdvZXMgdG8gYGRpc3QvYCwgYW5kIFZpdGUncyBkZXBlbmRlbmN5IGNhY2hlIGlzIGhhbmRsZWQgYnlcbiAgLy8gdGhlIHNlcGFyYXRlIGluc3RhbGwtbGF5b3V0IGhvb2sgYmVsb3cuXG4gIC8vIFNjYW4gZXZlcnkgd29ya3NwYWNlIGNvbmZpZyAobm90IGp1c3QgdGhlIHJvb3QpOiBpbiBhIG1vbm9yZXBvIHRoZSBhcHAgdXN1YWxseSBsaXZlcyBpblxuICAvLyBwYWNrYWdlcy88YXBwPiBvciBhcHBzLzxhcHA+LCBhbmQgdGhlIGNhY2hlIGRpcmVjdG9yaWVzIGFyZSB3b3Jrc3BhY2UtcmVsYXRpdmUuXG4gIGNvbnN0IG5leHRDYWNoZURpclBhdGhzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gICAgY29uZmlnLFxuICAgIGFsbENvbmZpZ3MsXG4gICAgKHdvcmtzcGFjZUNvbmZpZykgPT4gd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLm5leHQsXG4gICAgJy5uZXh0J1xuICApO1xuICBjb25zdCBybU5leHREaXJlY3RvcmllcyA9XG4gICAgbmV4dENhY2hlRGlyUGF0aHMubGVuZ3RoID4gMCA/IGAgJiYgcm0gLVJmIC0tICR7bmV4dENhY2hlRGlyUGF0aHMubWFwKHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwpLmpvaW4oJyAnKX1gIDogJyc7XG4gIC8vIEJ1biBkb2VzIG5vdCByZWxpbmsgYW4gZXhpc3RpbmcgaXNvbGF0ZWQgdHJlZSB3aGVuIGdsb2JhbFN0b3JlL2xpbmtlciBzZXR0aW5ncyBjaGFuZ2UuIEluc3BlY3RcbiAgLy8gdGhvc2Uga2V5cyByYXRoZXIgdGhhbiBldmVyeSBidW5maWcgY2hhbmdlOiBtaW5pbXVtUmVsZWFzZUFnZSB1cGRhdGVzIG11c3Qgbm90IGRlc3Ryb3kgYVxuICAvLyBjb250cmlidXRvcidzIHdvcmtpbmcgaW5zdGFsbCBiZWZvcmUgYSBwb3RlbnRpYWxseSBuZXR3b3JrLWRlcGVuZGVudCByZXBsYWNlbWVudCBzdWNjZWVkcy5cbiAgY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKGNvbmZpZywgYWxsQ29uZmlncywgKCkgPT4gdHJ1ZSwgJ25vZGVfbW9kdWxlcycpO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgIFN0cmluZy5yYXdgaWYgZ2l0IGRpZmYgLS1uby1jb2xvciAtVTAgT1JJR19IRUFEIEhFQUQgLS0gJypidW5maWcudG9tbCcgfCBncmVwIC0tcXVpZXQgLUUgJ15bKy1dICooZ2xvYmFsU3RvcmV8bGlua2VyfHB1YmxpY0hvaXN0UGF0dGVybiknOyB0aGVuIHJtIC1SZiAtLSAke25vZGVNb2R1bGVzRGlyUGF0aHMubWFwKHF1b3RlRm9yU2hlbGwpLmpvaW4oJyAnKX07IGZpYFxuICApO1xuICAvLyBidW4ubG9jay1vbmx5IG1lcmdlcyAoUmVub3ZhdGUgbG9ja2ZpbGUgbWFpbnRlbmFuY2UpLCBidW5maWcudG9tbCAvIC5ucG1yYyBjaGFuZ2VzIChsaW5rZXIsXG4gIC8vIHJlZ2lzdHJ5LCBob2lzdGluZyksIGFuZCBwYXRjaCBlZGl0cyBhbGwgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0IHRvdWNoaW5nIHBhY2thZ2UuanNvbi5cbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKHBhY2thZ2VcXC5qc29ufGJ1blxcLmxvY2t8YnVuZmlnXFwudG9tbHxcXC5ucG1yY3xwYXRjaGVzLylcIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcmllc31cImBcbiAgKTtcbiAgLy8gVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaW4gbm9kZV9tb2R1bGVzLy52aXRlIHNlbGYtaW52YWxpZGF0ZXMgb24gbG9ja2ZpbGUgLyBwYXRjaGVzIC9cbiAgLy8gY29uZmlnIC8gTk9ERV9FTlYgY2hhbmdlcyAoc2VlIFZpdGUncyBkZXAgcHJlLWJ1bmRsaW5nIGRvY3MpLCBzbyB0aGUgcmVzaWR1YWwgc3RhbGUgY2FzZSBpc1xuICAvLyBpbnN0YWxsLWxheW91dCBjaGFuZ2VzIChidW5maWcudG9tbCBsaW5rZXIsIC5ucG1yYyk6IHRoZXkgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0XG4gIC8vIHRvdWNoaW5nIHRoZSBsb2NrZmlsZSwgYW5kIHRoZXkgYXJlIGFic2VudCBmcm9tIFZpdGUncyBjYWNoZSBrZXkuXG4gIGNvbnN0IHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpbmV4dCB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpdGUsXG4gICAgJ25vZGVfbW9kdWxlcy8udml0ZSdcbiAgKTtcbiAgaWYgKHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMubGVuZ3RoID4gMCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmMpXCIgXCJybSAtUmYgLS0gJHtybVZpdGVDYWNoZURpcmVjdG9yaWVzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9XCJgXG4gICAgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICAvLyBCbGl0eiByZXBvc2l0b3JpZXMgZGVsaWJlcmF0ZWx5IGdldCB0aGUgc2FtZSB3Yi1kcml2ZW4gcHJpc21hIGNvbW1hbmRzIGFzIGV2ZXJ5b25lIGVsc2U6XG4gIC8vIHRoZSBibGl0eiBDTEkncyBjb2RlZ2VuIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2UsIHdoaWNoIG11c3QgbmV2ZXIgcnVuXG4gIC8vIHVuZGVyIEJ1bidzIHNoYXJlZCBnbG9iYWwgc3RvcmUuIFlhcm4tZXJhIEJsaXR6IHJlcG9zIGdldCB0aGVpciByb3V0ZSBtYW5pZmVzdCBmcm9tXG4gIC8vIGB3YiBnZW4tY29kZWAncyBgYmxpdHogY29kZWdlbmAgc3RlcCwgYW5kIGN1cnJlbnQgd2Igcm91dGVzIG9ubHkgYHdiIHByaXNtYSBzZWVkYCB0aHJvdWdoXG4gIC8vIHRoZSBibGl0eiBDTEksIG9ubHkgZm9yIG5vbi1CdW4gcmVwb3MgKHNlZSBwYWNrYWdlcy93Yi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzKTsgdGhlXG4gIC8vIHBvc3QtbWVyZ2UgaG9va3Mgc3RheSB3Yi1kcml2ZW4gYmVjYXVzZSBgcHJpc21hIGRlcGxveWAvYGdlbmVyYXRlYCBuZWVkIG5vIGJsaXR6IGxvYWRlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuLy8gVGhlIGdlbmVyYXRlZCBjb21tYW5kIHBhc3NlcyB0aHJvdWdoIFRXTyBzaGVsbCBwYXJzaW5nIHN0YWdlczogdGhlIHByZXBhcmUuc2ggbGluZSBwYXJzZXMgaXQgYXNcbi8vIGEgZG91YmxlLXF1b3RlZCBhcmd1bWVudCAocHJvY2Vzc2luZyBcXCwgYCwgJCBhbmQgXCIgaW1tZWRpYXRlbHkpLCBhbmQgcnVuX2lmX2NoYW5nZWQgdGhlbiBldmFsJ3Ncbi8vIGl0ICh3b3JkLXNwbGl0dGluZyBhbmQgZ2xvYmJpbmcpLiBBbiB1bnF1b3RlZCBwYXRoIGNvbnRhaW5pbmcgc3BhY2VzIChlLmcuIGBhcHBzL215IGFwcC8ubmV4dGApXG4vLyB3b3VsZCB3b3JkLXNwbGl0IGludG8gdW5yZWxhdGVkIHJtIHRhcmdldHMsIGFuZCBgJGAvYmFja3RpY2sgd291bGQgZXhwYW5kIGF0IHRoZSBmaXJzdCBzdGFnZS5cbi8vIFNvOiBxdW90ZSBmb3IgdGhlIGV2YWwgc3RhZ2Ug4oCUIGBxdW90ZUZvclNoZWxsYCBsZWF2ZXMgb25seSB3b3JkcyB0aGF0IGNhcnJ5IG5vIHNoZWxsIG1lYW5pbmdcbi8vIHVucXVvdGVkIOKAlCB0aGVuIGJhY2tzbGFzaC1lc2NhcGUgdGhlIGRvdWJsZS1xdW90ZS1jb250ZXh0IHNwZWNpYWxzLlxuZnVuY3Rpb24gcXVvdGVGb3JFdmFsdWF0ZWRTaGVsbChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXZhbFF1b3RlZCA9IHF1b3RlRm9yU2hlbGwoZmlsZVBhdGgpO1xuICByZXR1cm4gZXZhbFF1b3RlZC5yZXBsYWNlQWxsKC9bXFxcXGAkXCJdL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlLXJlbGF0aXZlIGRpcmVjdG9yaWVzIChyb290IGZpcnN0LCBkZWR1cGxpY2F0ZWQsIGA8c3ViRGlyTmFtZT5gIGFwcGVuZGVkKSBvZiBldmVyeVxuICogd29ya3NwYWNlIHdob3NlIGNvbmZpZyBtYXRjaGVzIHRoZSBwcmVkaWNhdGUuIFRoZSBob29rIHNjcmlwdCBydW5zIGF0IHRoZSByZXBvc2l0b3J5IHJvb3QsIHNvXG4gKiBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmVkaWNhdGU6IChjb25maWc6IFBhY2thZ2VDb25maWcpID0+IGJvb2xlYW4sXG4gIHN1YkRpck5hbWU6IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBhbGxDb25maWdzXG4gICAgICAgIC5maWx0ZXIoKGNvbmZpZykgPT4gcHJlZGljYXRlKGNvbmZpZykpXG4gICAgICAgIC5tYXAoKGNvbmZpZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdENvbmZpZy5kaXJQYXRoLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgICAgcmV0dXJuIHJlbGF0aXZlRGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihyZWxhdGl2ZURpclBhdGgsIHN1YkRpck5hbWUpIDogc3ViRGlyTmFtZTtcbiAgICAgICAgfSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJpbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuZXhwb3J0IHR5cGUgQ29uZmlnQmxvY2tOYW1lID0gJ2Jhc2UnIHwgJ2V4cG9ydCc7XG5cbmludGVyZmFjZSBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucyB7XG4gIGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuICBtYXJrZXJQcmVmaXg6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgZGVzaXJlZENvbnRlbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQ29uZmlnQmxvY2tzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlclByZWZpeDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucykge1xuICAgIHRoaXMuYmxvY2tOYW1lcyA9IG9wdGlvbnMuYmxvY2tOYW1lcztcbiAgICB0aGlzLm1hcmtlclByZWZpeCA9IG9wdGlvbnMubWFya2VyUHJlZml4O1xuICAgIHRoaXMudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICB9XG5cbiAgZ2V0Q29uZmlnQ29udGVudChvcHRpb25zOiBHZXRDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFvcHRpb25zLmV4aXN0aW5nQ29udGVudCkgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gICAgaWYgKHRoaXMuaGFzTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50LCBvcHRpb25zLmRlc2lyZWRDb250ZW50LCBvcHRpb25zLmZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gIH1cblxuICBnZXRCbG9jayhibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHt0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG4gIH1cblxuICBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJsb2NrTmFtZXMuc29tZSgoYmxvY2tOYW1lKSA9PiBjb250ZW50LmluY2x1ZGVzKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgdGhpcy5ibG9ja05hbWVzKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRoaXMuZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMucmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluICR7dGhpcy50b29sTmFtZX0gY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgICAgfVxuICAgICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBgJHtlc2NhcGVSZWdFeHAodGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0ICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OmVuZCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgIGZpbGVQYXRoLFxuICAgIH0pO1xuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBveGZtdEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hmbXQgY29uZmlnIGZpbGVzIGFyZSBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGZtdENvbmZpZyA9IHJlcXVpcmUoJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IG94Zm10Q29uZmlnLmRlZmF1bHQgPz8gb3hmbXRDb25maWc7YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9JztcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBjb25maWc7YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UsXG4gIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSxcbn0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGxpbnQnLFxuICB0b29sTmFtZTogJ294bGludCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBnZW5lcmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVwbGFjZSBwYWNrYWdlLXByb3ZpZGVkIGxpbnRlciBzZXR0aW5ncy4gR2VuZXJhdGVkIGZpbGVzIHdpdGhcbiAgICAvLyBtYW5hZ2VkIGJsb2NrcyBhcmUgc3RpbGwgc2FmZSB0byB1cGRhdGUuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnQgPVxuICAgICAgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgJiYgZXhpc3RpbmdDb250ZW50ICYmICFtYW5hZ2VkQ29uZmlnQmxvY2tzLmhhc01hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50KTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50XG4gICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgOiBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICB9KTtcblxuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBpc1Jvb3RDb25maWcgPSBjb25maWcuaXNSb290O1xuICBjb25zdCBveGxpbnRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyk7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hsaW50IG9ubHkgYXV0by1kaXNjb3ZlcnMgLnRzIGNvbmZpZyBmaWxlcywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94bGludEJhc2VDb25maWcgPSByZXF1aXJlKCcke294bGludEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnLmRlZmF1bHQgPz8gb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbmltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG5cbi8vIHN0cnVjdHVyZWRDbG9uZSBrZWVwcyBhIHBhY2thZ2UtbG9jYWwgY29weSBzbyByZXBvc2l0b3JpZXMgY2FuIGFkZCBzZXR0aW5ncyBvdXRzaWRlIG1hbmFnZWRcbi8vIGJsb2NrcyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgaW1wb3J0ZWQgY29uZmlnIG9iamVjdC4gVGhlIHJvb3QgY29uZmlnIGZvcmNlcyB0aGUgdHlwZS1hd2FyZVxuLy8gb3B0aW9ucyBvbiBpbnNpZGUgdGhlIG1hbmFnZWQgYmxvY2sgc28gbm8gY3VzdG9taXphdGlvbiBjYW4gc2lsZW50bHkgZGlzYWJsZSB0eXBlIGNoZWNraW5nOyBldmVyeVxuLy8gb3RoZXIgY29uZmlnIGRlbGV0ZXMgdGhlbSBiZWNhdXNlIE94bGludCByZWplY3RzIHRob3NlIHJvb3Qtb25seSBvcHRpb25zIGVsc2V3aGVyZSAodHlwZSBjaGVja2luZ1xuLy8gc3Vydml2ZXM6IHRoZSBsaW50IGNvbW1hbmRzIHBhc3MgLS10eXBlLWF3YXJlIGFuZCAtLXR5cGUtY2hlY2sgZXhwbGljaXRseSkuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zID0geyAuLi5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zLCB0eXBlQXdhcmU6IHRydWUsIHR5cGVDaGVjazogdHJ1ZSB9O2A7XG4gIH1cblxuICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuZGVsZXRlIG94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnM7YDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICAvLyBweXJpZ2h0Y29uZmlnLmpzb24gYWxsb3dzIEpTT05DOyBhbiBleGlzdGluZyBmaWxlIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdFxuICAgICAgLy8gdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYmFyZSB0ZW1wbGF0ZS5cbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHB5cmlnaHRjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShuZXdTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25zdW1lc0RvY2tlckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBtYW5hZ2VkU2NyaXB0c0Jsb2NrID0gYHNjcmlwdHMvKipcbiFzY3JpcHRzL1xuIXNjcmlwdHMvKi5zaGA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhSYWlsd2F5aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFJhaWx3YXlpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmFpbHdheWlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgdXNlc0RvY2tlckVudiA9IGNvbnN1bWVzRG9ja2VyRW52KGNvbmZpZy5kb2NrZXJmaWxlKTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIGlmIChjb25maWcuaXNSYWlsd2F5ICYmIHVzZXNEb2NrZXJFbnYpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsICchLmRvY2tlci5lbnZcXG4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15zY3JpcHRzXFwvJC9tLCBtYW5hZ2VkU2NyaXB0c0Jsb2NrKTtcbiAgICAvLyBgcmFpbHdheSB1cGAgc3RyaXBzIGdpdGlnbm9yZWQgZmlsZXMgZnJvbSB0aGUgdXBsb2FkZWQgYnVpbGQgY29udGV4dCwgc28gdGhlIGdlbmVyYXRlZFxuICAgIC8vIG5vbi1zZWNyZXQgLmRvY2tlci5lbnYgKGB3YiBnZW4tZG9ja2VyLWVudmAgb3V0cHV0KSBuZWVkcyBhbiBleHBsaWNpdCB1bi1pZ25vcmUgdG8gcmVhY2hcbiAgICAvLyB0aGUgcmVtb3RlIERvY2tlciBidWlsZC4gQXBwZW5kZWQsIG5vdCBwcmVwZW5kZWQ6IGlnbm9yZSBmaWxlcyBhcmUgbGFzdC1tYXRjaC13aW5zLCBzbyBhXG4gICAgLy8gaGFuZC13cml0dGVuIHBhdHRlcm4gc3VjaCBhcyBgKi5lbnZgIGVhcmxpZXIgaW4gdGhlIGZpbGUgbXVzdCBub3Qgc2lsZW50bHkgcmUtZXhjbHVkZSBpdC5cbiAgICBpZiAodXNlc0RvY2tlckVudiAmJiAhL14hXFwuZG9ja2VyXFwuZW52JC9tLnRlc3QobmV3Q29udGVudCkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBgJHtuZXdDb250ZW50LnJlcGxhY2UoL1xcbj8kLywgJ1xcbicpfSEuZG9ja2VyLmVudlxcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9ja2VyZmlsZSAmJiAhdXNlc0RvY2tlckVudikge1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXiFcXC5kb2NrZXJcXC5lbnZcXG4/L20sICcnKTtcbiAgICB9XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PlxuICAgICAgbmV3Q29udGVudCA/IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpIDogZnNVdGlsLnJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoKVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbWFnZSwgTGluaywgUGFyYWdyYXBoLCBQaHJhc2luZ0NvbnRlbnQsIFJvb3RDb250ZW50IH0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHsgZnJvbU1hcmtkb3duIH0gZnJvbSAnbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmNvbnN0IHdiZnlCYWRnZVVybFByZWZpeCA9ICdodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3diZnktJztcbmNvbnN0IHdiZnlCYWRnZVVybFN1ZmZpeCA9ICctMWU5MGZmLnN2Zyc7XG5jb25zdCB3YmZ5QmFkZ2VMaW5rID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvdHJlZS9tYWluL3BhY2thZ2VzL3diZnknO1xuXG5jb25zdCBucG1QYWNrYWdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlLyc7XG5jb25zdCBucG1MaWNlbnNlQmFkZ2VQYXR0ZXJuID0gL15cXFshXFxbW15cXF1dKlxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL25wbVxcL2xcXC9bXilcXHNdK1xcKVxcXVxcKFteKVxcc10rXFwpJC91O1xuXG5jb25zdCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucyA9IFtcbiAgL15cXFshXFxbd2JmeVxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL2JhZGdlXFwvd2JmeS1bXilcXHNdKy0xZTkwZmZcXC5zdmdcXClcXF1cXChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9XaWxsQm9vc3RlclxcL3NoYXJlZFxcL3RyZWVcXC9tYWluXFwvcGFja2FnZXNcXC93YmZ5XFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1teKVxcc10rXFwvYWN0aW9uc1xcL3dvcmtmbG93c1xcL1teKVxcc10rKVxcL2JhZGdlXFwuc3ZnXFwpXFxdXFwoXFwxXFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoW14pXFxzXStcXClcXF1cXChodHRwcz86XFwvXFwvKD86d3d3XFwuKT9ucG1qc1xcLmNvbVxcL3BhY2thZ2VcXC9bXilcXHNdKlxcKSQvdSxcbiAgbnBtTGljZW5zZUJhZGdlUGF0dGVybixcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkV2JmeUJhZGdlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIeXBoZW5zIGFyZSBlc2NhcGVkIGFzIGAtLWAgcGVyIHNoaWVsZHMuaW8ncyBiYWRnZSBwYXRoIHN5bnRheCwgc28gYHYxLjIuMy1yYy4xYCBzdGF5cyBpbnRhY3QuXG4gIHJldHVybiBgWyFbd2JmeV0oJHt3YmZ5QmFkZ2VVcmxQcmVmaXh9JHtsYWJlbC5yZXBsYWNlQWxsKCctJywgJy0tJyl9JHt3YmZ5QmFkZ2VVcmxTdWZmaXh9KV0oJHt3YmZ5QmFkZ2VMaW5rfSlgO1xufVxuXG4vKiogVGhlIHZlcnNpb24gbGFiZWwgdGhlIHdiZnkgYmFkZ2UgaW4gdGhlIHJlcG9zaXRvcnkncyBSRUFETUUgcmVjb3JkcywgaS5lLiB0aGUgYnVpbGQgdGhhdCB3YmZpZWQgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIENvbmZpbmVkLCBhbmQgdG9sZXJhbnQgb2YgYW55IHJlYWQgZmFpbHVyZTogYSBSRUFETUUgdGhhdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IChhXG4gIC8vIGNvbW1pdHRlZCBzeW1saW5rKSBvciBjYW5ub3QgYmUgcmVhZCBhdCBhbGwgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoIGJ1aWxkIGNvbmZpZ3VyZWQgVEhJU1xuICAvLyByZXBvc2l0b3J5LCBhbmQgdGhlIGFuc3dlciBvbmx5IGV2ZXIgc3VwcHJlc3NlcyB3b3JrIOKAlCBzbyBhbnl0aGluZyBidXQgYSByZWFkYWJsZSBpbi1yZXBvc2l0b3J5XG4gIC8vIFJFQURNRSBtZWFucyBcIm5vdCBrbm93biB0byBiZSBhcHBsaWVkXCIgYW5kIHRoZSBydW4gcHJvY2VlZHMuXG4gIGNvbnN0IHJlYWRtZSA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdSRUFETUUubWQnKSkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAocmVhZG1lID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFJFQURNRSBpcyBwYXJzZWQgcmF0aGVyIHRoYW4gc2Nhbm5lZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3cml0ZUJhZGdlQmxvY2sgcGFyc2VzIGl0LCBhbmRcbiAgLy8gb25seSB0aGUgc2hhcGUgd3JpdGVCYWRnZUJsb2NrIGl0c2VsZiB3cml0ZXMgY291bnRzIGFzIGFuIGFwcGxpZWQgYmFkZ2U6IGEgdG9wLWxldmVsIHBhcmFncmFwaFxuICAvLyBvZiBiYWRnZXMuIEEgYmFkZ2UgYW55d2hlcmUgZWxzZSBpcyBjb250ZW50IHRoYXQgbWVyZWx5IG1lbnRpb25zIG9uZSDigJQgYSBmZW5jZWQgZXhhbXBsZSAod2JmeSdzXG4gIC8vIG93biBkb2N1bWVudGF0aW9uIGhhcyB0aG9zZSksIGEgYmxvY2sgcXVvdGUsIGEgbGlzdCBpdGVtIOKAlCBhbmQgcmVhZGluZyBpdCBhcyBhcHBsaWVkIHdvdWxkIHNraXBcbiAgLy8gZXZlcnkgZml4ZXIgZm9yIHRoZSByZXBvc2l0b3J5LlxuICBmb3IgKGNvbnN0IG5vZGUgb2YgZnJvbU1hcmtkb3duKHJlYWRtZSkuY2hpbGRyZW4pIHtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYmFkZ2Ugb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKCFpc0JhZGdlTm9kZShiYWRnZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyB1cmwgfSA9IGJhZGdlLmNoaWxkcmVuWzBdO1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHdiZnlCYWRnZVVybFByZWZpeCkgJiYgdXJsLmVuZHNXaXRoKHdiZnlCYWRnZVVybFN1ZmZpeCkpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zbGljZSh3YmZ5QmFkZ2VVcmxQcmVmaXgubGVuZ3RoLCAtd2JmeUJhZGdlVXJsU3VmZml4Lmxlbmd0aCkucmVwbGFjZUFsbCgnLS0nLCAnLScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICAvLyBUaGUgd2JmeSBiYWRnZSBtYXJrcyBhIHJlcG9zaXRvcnkgYXMgd2JmaWVkLCBzbyBhIHJlcG9zaXRvcnkgd2l0aG91dCBhIFJFQURNRSBzdGlsbCBnZXRzIG9uZS5cbiAgICAvLyByZWFkRmlsZUlmRXhpc3RzIGZhbGxzIGJhY2sgT05MWSBvbiBFTk9FTlQ6IGEgUkVBRE1FIHRoYXQgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZCAoZS5nLlxuICAgIC8vIHBlcm1pc3Npb25zLCBFTUZJTEUpIG11c3QgYWJvcnQgdGhlIGdlbmVyYXRvciBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIHN0dWIuXG4gICAgbGV0IG5ld0NvbnRlbnQgPVxuICAgICAgKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz9cbiAgICAgIGAjICR7Y29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID8/IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSl9XFxuYDtcblxuICAgIC8vIE9yZGVyZWQgYnkgd2hhdCBhIHJlYWRlciBjYXJlcyBhYm91dCBtb3N0OiB0aGUgbnBtIGJhZGdlIG5hbWVzIHRoZSBwYWNrYWdlIGEgcmVhZGVyIGluc3RhbGxzLFxuICAgIC8vIHRoZW4gdGhlIHdvcmtmbG93IGJhZGdlcyByZXBvcnQgd2hldGhlciB0aGUgY29kZSBpcyBjdXJyZW50bHkgaGVhbHRoeSwgdGhlbiBob3cgaXQgaXNcbiAgICAvLyByZWxlYXNlZCwgYW5kIGxhc3QgdGhlIHdiZnkgYnVpbGQgdGhhdCBjb25maWd1cmVkIGl0LlxuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGF3YWl0IGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZyk7XG4gICAgaWYgKHBhY2thZ2VOYW1lKSB7XG4gICAgICBiYWRnZXMucHVzaChidWlsZE5wbUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICBjb25zdCBsaWNlbnNlID0gY29uZmlnLnBhY2thZ2VKc29uPy5saWNlbnNlO1xuICAgICAgaWYgKGxpY2Vuc2UgJiYgbGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnKSB7XG4gICAgICAgIGJhZGdlcy5wdXNoKGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGJhZGdlcy5wdXNoKC4uLihhd2FpdCBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZykpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIGJhZGdlcy5wdXNoKHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICBiYWRnZXMucHVzaChidWlsZFdiZnlCYWRnZShnZXRXYmZ5VmVyc2lvbkxhYmVsKCkgPz8gJ2FwcGxpZWQnKSk7XG5cbiAgICAvLyBUaGUgYmxvY2sgaXMgd3JpdHRlbiBpbiBvbmUgcGFzcyBmcm9tIHRoZSBiYWRnZXMgd2JmeSBtYW5hZ2VzIHJpZ2h0IG5vdy4gQSBiYWRnZSB0aGF0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIHdhbnRlZCDigJQgYSBzdXBlcnNlZGVkIHZlcnNpb24sIG9yIG9uZSB3aG9zZSB3b3JrZmxvdyBpcyBnb25lIOKAlCBzaW1wbHkgaXMgbm90IGluIHRoZVxuICAgIC8vIGxpc3QsIHNvIG5vdGhpbmcgaGFzIHRvIHJlbW92ZSBpdC5cbiAgICBuZXdDb250ZW50ID0gd3JpdGVCYWRnZUJsb2NrKG5ld0NvbnRlbnQsIGJhZGdlcyk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT5cbiAgICAgIGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQsIGdldExpbmVFbmRpbmcobmV3Q29udGVudCkpXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICAvLyBBIG1vbm9yZXBvIGhhcyBubyBzaW5nbGUgbnBtIHZlcnNpb24gcmVwcmVzZW50aW5nIHRoZSB3aG9sZSByZXBvc2l0b3J5LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIHx8ICFjb25maWcucmVsZWFzZS5ucG0gfHwgIXBhY2thZ2VKc29uPy5uYW1lIHx8IHBhY2thZ2VKc29uLnByaXZhdGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiAoYXdhaXQgaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VKc29uLm5hbWUpKSA/IHVuZGVmaW5lZCA6IHBhY2thZ2VKc29uLm5hbWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVnaXN0cnkgYW5zd2VycyB0aGF0IGl0IGhhcyBubyBzdWNoIHBhY2thZ2Ug4oCUIHRoZSBPTkxZIGFuc3dlciB0aGF0IHJlbW92ZXMgYSBiYWRnZS5cbiAqIEEgY2hlY2sgdGhhdCBjYW5ub3QgcnVuIChvZmZsaW5lLCBhbiBvdXRhZ2UsIGEgdGltZW91dCkgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBwYWNrYWdlLCBhbmRcbiAqIHRyZWF0aW5nIGl0IGFzIGFic2VudCB3b3VsZCBzdHJpcCB0aGUgYmFkZ2Ugb3V0IG9mIGV2ZXJ5IHB1Ymxpc2hlZCByZXBvc2l0b3J5IHdiZnkgdG91Y2hlc1xuICogZHVyaW5nIHRoZSBvdXRhZ2UgYW5kIHB1dCBpdCBiYWNrIGFmdGVyd2FyZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgLy8gVGhlIHNjb3BlIHNlcGFyYXRvciBtdXN0IHN1cnZpdmUgYXMgYSBwYXRoIHNlZ21lbnQsIHNvIHRoZSBuYW1lIGlzIGVuY29kZWQgcGllY2V3aXNlLlxuICAgIGNvbnN0IGVuY29kZWROYW1lID0gcGFja2FnZU5hbWUuc3BsaXQoJy8nKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcvJyk7XG4gICAgLy8gQSBiYWRnZSBpcyBkZWNvcmF0aW9uOiBhIHN0YWxsZWQgcmVnaXN0cnkgY29ubmVjdGlvbiBtdXN0IG5vdCBob2xkIHRoZSB3aG9sZSBydW4gZm9yIGhvd2V2ZXJcbiAgICAvLyBsb25nIHRoZSBuZXR3b3JraW5nIHN0YWNrIHdvdWxkIHdhaXQuIFRoZSBidWRnZXQgaXMgZ2VuZXJvdXMgYmVjYXVzZSBhIHRpbWVvdXQgYW5zd2Vyc1xuICAgIC8vIFwidW5rbm93blwiLCB3aGljaCBrZWVwcyB0aGUgYmFkZ2Ug4oCUIGFuZCBvbiBhIHJlcG9zaXRvcnkgdGhhdCBpcyBub3Qgb24gbnBtIHRoYXQgbWVhbnMgd3JpdGluZ1xuICAgIC8vIG9uZSBpdCBzaG91bGQgbm90IGhhdmU7IGEgd2JmeSBydW4gYWxyZWFkeSBzcGVuZHMgbWludXRlcyBvbiBpbnN0YWxscywgc28gd2FpdGluZyBhIGxpdHRsZVxuICAgIC8vIGxvbmdlciBmb3IgYSByZWFsIGFuc3dlciBjb3N0cyBsZXNzIHRoYW4gYWN0aW5nIG9uIGEgbWlzc2luZyBvbmUuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVkTmFtZX1gLCB7XG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMF8wMDApLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDQwNDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTnBtQmFkZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWyFbbnBtIHZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL3YvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFshW2xpY2Vuc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL2wvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFyZXBvc2l0b3J5IHx8ICFmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpKSByZXR1cm4gW107XG5cbiAgLy8gV29ya2Zsb3cgYW5kIFJFQURNRSBnZW5lcmF0aW9uIHJ1biBjb25jdXJyZW50bHkuIERvIG5vdCByZXRhaW4gYSBzdGFsZSBSdXN0IGJhZGdlIHdoaWxlIHRoZVxuICAvLyB3b3JrZmxvdyBnZW5lcmF0b3IgcmVtb3ZlcyBhIGNhbGxlciBjcmVhdGVkIGZyb20gYSBmb3JtZXJseSBtaXNkZXRlY3RlZCBsb2NhbCBjYWNoZSDigJQgYnV0XG4gIC8vIG1pcnJvciBpdHMgb3duZXJzaGlwIGNoZWNrOiBhIGN1c3RvbSBzYW1lLW5hbWVkIHdvcmtmbG93IHN1cnZpdmVzLCBzbyBpdHMgYmFkZ2UgbXVzdCB0b28uXG4gIC8vIERlY2lkZWQgc3luY2hyb25vdXNseSBiZWZvcmUgdGhlIGxvb3AncyBmaXJzdCBhd2FpdDogdGhlIGdlbmVyYXRvcidzIGRlbGV0ZSBjYW4gb25seSBsYW5kIGF0XG4gIC8vIGFuIGF3YWl0IHBvaW50LCBhbmQgYSBwb3N0LWRlbGV0ZSByZWFkIHdvdWxkIG1pc3JlcG9ydCB0aGUgd2JmeS1vd25lZCBjYWxsZXIgYXMgY3VzdG9tLlxuICAvLyBObyBleGlzdHNTeW5jIHByZS1jaGVjazogdGhlIGhlbHBlciBhbHJlYWR5IHRyZWF0cyBhIG1pc3NpbmcgZmlsZSBhcyBub3Qgb3duZWQsIGFuZCB0aGlzIHJ1bnNcbiAgLy8gb25jZSBwZXIgcmVwb3NpdG9yeSwgc28gdGhlIGV4Y2VwdGlvbmFsIEVOT0VOVCByZWFkIGNvc3RzIG5vdGhpbmcgd29ydGggYSByZWR1bmRhbnQgc3RhdC5cbiAgY29uc3QgZHJvcHNUZXN0UnVzdEJhZGdlID1cbiAgICBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCAndGVzdC1ydXN0LnltbCcsICd0ZXN0LXJ1c3QnKTtcblxuICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkpIHtcbiAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuICAgIGlmIChmaWxlTmFtZSA9PT0gJ3Rlc3QtcnVzdC55bWwnICYmIGRyb3BzVGVzdFJ1c3RCYWRnZSkgY29udGludWU7XG4gICAgLy8gR2l0SHViJ3MgYmFkZ2UgZW5kcG9pbnQgcmV0dXJucyA0MDQgdW50aWwgdGhlIHdvcmtmbG93IGhhcyBhdCBsZWFzdCBvbmUgcnVuLCBzbyBhIGJhZGdlIGZvciBhXG4gICAgLy8gZGlzcGF0Y2gtb25seSBkZXBsb3kgd29ya2Zsb3cgdGhhdCBoYXMgbmV2ZXIgcnVuIHJlbmRlcnMgYXMgYSBicm9rZW4gaW1hZ2UuIFRlc3Qgd29ya2Zsb3dzIHJ1blxuICAgIC8vIG9uIGV2ZXJ5IFBSLCBzbyBvbmx5IGRlcGxveSBiYWRnZXMgbmVlZCB0aGUgZ3VhcmQuXG4gICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmICEoYXdhaXQgaGFzQW55V29ya2Zsb3dSdW4ocmVwb3NpdG9yeSwgZmlsZU5hbWUsIGNvbmZpZy5pc1B1YmxpY1JlcG8pKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGJhZGdlTmFtZSA9IChmaWxlTmFtZVswXSA/PyAnJykudG9VcHBlckNhc2UoKSArIGZpbGVOYW1lLnNsaWNlKDEsIGZpbGVOYW1lLmluZGV4T2YoJy4nKSkucmVwbGFjZSgnLScsICcgJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtlbmNvZGVVcmxQYXRoKGZpbGVOYW1lKX1gO1xuICAgIGJhZGdlcy5wdXNoKGBbIVske2JhZGdlTmFtZX1dKCR7d29ya2Zsb3dVcmx9L2JhZGdlLnN2ZyldKCR7d29ya2Zsb3dVcmx9KWApO1xuICB9XG4gIHJldHVybiBiYWRnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FueVdvcmtmbG93UnVuKFxuICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gIHdvcmtmbG93RmlsZU5hbWU6IHN0cmluZyxcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IHJlcG9zaXRvcnkuc3BsaXQoJy8nKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG93bmVyKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vcnVucycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIHdvcmtmbG93X2lkOiB3b3JrZmxvd0ZpbGVOYW1lLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZvciBhIFBVQkxJQyByZXBvc2l0b3J5IHRoZSBydW5zIGVuZHBvaW50IG5lZWRzIG5vIGF1dGhvcml6YXRpb24sIHNvIDQwNCByZWxpYWJseSBtZWFucyB0aGVcbiAgICAvLyB3b3JrZmxvdyBpcyBhYnNlbnQgZnJvbSB0aGUgcmVtb3RlIChlLmcuIGFkZGVkIGxvY2FsbHksIG5ldmVyIHB1c2hlZCkg4oCUIGxpa2UgemVybyBydW5zLCBpdHNcbiAgICAvLyBiYWRnZSB3b3VsZCByZW5kZXIgYnJva2VuLiBGb3IgYSBQUklWQVRFIHJlcG9zaXRvcnkgR2l0SHViIGFsc28gYW5zd2VycyA0MDQgd2hlbiB0aGUgdG9rZW5cbiAgICAvLyBpcyBtaXNzaW5nIG9yIHVuZGVyLXNjb3BlZCwgc28gNDA0IGlzIGFtYmlndW91cyB0aGVyZSBhbmQgdGhlIGJhZGdlIGlzIGtlcHQuXG4gICAgaWYgKChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwNCAmJiBpc1B1YmxpY1JlcG8pIHJldHVybiBmYWxzZTtcbiAgICAvLyBLZWVwIHRoZSBwcmUtZ3VhcmQgYmVoYXZpb3IgKGluc2VydCB0aGUgYmFkZ2UpIHdoZW4gdGhlIGNoZWNrIGl0c2VsZiBjYW5ub3QgcnVuLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGJhZGdlIGJsb2NrcyBkaXJlY3RseSB1bmRlciB0aGUgdGl0bGUgd2l0aCBgbWFuYWdlZEJhZGdlc2AsIGtlZXBpbmcgYW55IGJhZGdlIHRoZXJlXG4gKiB0aGF0IHdiZnkgZG9lcyBub3QgbWFuYWdlLCBhbmQgcmVhc3NlbWJsZXMgdGhlIFJFQURNRSBhcm91bmQgdGhlbSB3aXRoIGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgb25cbiAqIGVhY2ggc2lkZS5cbiAqXG4gKiBCb3RoIHRoZSB0aXRsZSBhbmQgdGhlIGJsb2NrIGFyZSBsb2NhdGVkIGluIGEgQ29tbW9uTWFyayBzeW50YXggdHJlZSByYXRoZXIgdGhhbiBieSBzY2FubmluZ1xuICogbGluZXM6IG9ubHkgYSByZWFsIHBhcnNlciBrbm93cyB3aGV0aGVyIGEgbGluZSB0aGF0IGxvb2tzIGxpa2UgYSBiYWRnZSBpcyBhIGJhZGdlIChhIHBhcmFncmFwaCBvZlxuICogbGlua2VkIGltYWdlcykgb3IgY29udGVudCB0aGF0IG1lcmVseSByZWFkcyBsaWtlIG9uZSAoYW4gaW5kZW50ZWQgY29kZSBibG9jaywgYSBibG9jayBxdW90ZSwgYVxuICogZmVuY2VkIGV4YW1wbGUsIGEgbXVsdGlsaW5lIGNvZGUgc3BhbiwgYW4gSFRNTCBibG9jaykuIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgYmxvY2sgaXMgY29waWVkIGJhY2tcbiAqIHZlcmJhdGltIGZyb20gdGhlIG9yaWdpbmFsIHRleHQgdGhyb3VnaCB0aGUgcGFyc2VyJ3MgcG9zaXRpb25hbCBvZmZzZXRzLCBzbyBubyByZWZvcm1hdHRpbmcgb2YgdGhlXG4gKiB1c2VyJ3MgY29udGVudCBpcyBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQmFkZ2VCbG9jayhyZWFkbWU6IHN0cmluZywgbWFuYWdlZEJhZGdlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lRW5kaW5nID0gZ2V0TGluZUVuZGluZyhyZWFkbWUpO1xuICAvLyBBIEJPTSBpcyBub3QgTWFya2Rvd246IGxlZnQgaW4gdGhlIHRleHQgaXQgaGlkZXMgdGhlIGAjYCBvZiB0aGUgdGl0bGUgZnJvbSB0aGUgcGFyc2VyLCBhbmRcbiAgLy8gcHJlcGVuZGluZyB0aGUgYmxvY2sgYWhlYWQgb2YgaXQgd291bGQgc3RyaXAgdGhlIG1hcmtlciBmcm9tIHRoZSBmaWxlJ3MgZmlyc3QgYnl0ZS5cbiAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IHJlYWRtZS5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gIC8vIEZyb250IG1hdHRlciBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNhbWUgYC0tLWAgYSBTZXRleHQgaGVhZGluZyBhbmQgYSB0aGVtYXRpYyBicmVhayB1c2UsIHNvIGl0IGlzXG4gIC8vIGRldGFjaGVkIGJlZm9yZSBwYXJzaW5nIGluc3RlYWQgb2YgYmVpbmcgdG9sZCBhcGFydCBhZnRlcndhcmRzOyBpdCBhbHNvIGhhcyB0byBzdGF5IGZpcnN0IGluIHRoZVxuICAvLyBmaWxlLCB3aGljaCBtYWtlcyBpdCBhIHByZWZpeCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGUgQk9NIGlzLlxuICBjb25zdCB3aXRob3V0TWFyayA9IHJlYWRtZS5zbGljZShieXRlT3JkZXJNYXJrLmxlbmd0aCk7XG4gIGNvbnN0IGZyb250TWF0dGVyID0gd2l0aG91dE1hcmsuc3RhcnRzV2l0aCgnLS0tJylcbiAgICA/ICgvXi0tLVsgXFx0XSpcXHI/XFxuW1xcc1xcU10qP14tLS1bIFxcdF0qKD86XFxyP1xcbnwkKS9tdS5leGVjKHdpdGhvdXRNYXJrKT8uWzBdID8/ICcnKVxuICAgIDogJyc7XG4gIGNvbnN0IHByZWZpeCA9IGAke2J5dGVPcmRlck1hcmt9JHtmcm9udE1hdHRlcn1gO1xuICAvLyBUaGUgZmluYWwgbmV3bGluZSBpcyBzZXQgYXNpZGUgcmF0aGVyIHRoYW4gcGFyc2VkIGFzIHRyYWlsaW5nIGJsYW5rIHNwYWNlLCB3aGljaCB0aGUgYmxhbmstbGluZVxuICAvLyB0cmltbWluZyBiZWxvdyB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdy5cbiAgY29uc3QgZW5kc1dpdGhOZXdsaW5lID0gL1xccj9cXG4kL3UudGVzdChyZWFkbWUpO1xuICBjb25zdCBjb250ZW50ID0gd2l0aG91dE1hcmsuc2xpY2UoZnJvbnRNYXR0ZXIubGVuZ3RoKS5yZXBsYWNlKC9cXHI/XFxuJC91LCAnJyk7XG5cbiAgY29uc3Qgbm9kZXMgPSBmcm9tTWFya2Rvd24oY29udGVudCkuY2hpbGRyZW47XG4gIC8vIEEgbGVhZGluZyBiYWRnZSBibG9jayBpcyB0aGUgdXNlcidzIG93biBsYXlvdXQ6IGl0IHN0YXlzIGFib3ZlIHRoZSB0aXRsZSwgYW5kIHdiZnkncyBibG9jayBnb2VzIGJlbG93LlxuICBjb25zdCBrZWVwc0xlYWRpbmdCbG9jayA9ICEhbm9kZXNbMF0gJiYgaXNCYWRnZUJsb2NrTm9kZShub2Rlc1swXSkgJiYgaXNUaXRsZU5vZGUobm9kZXNbMV0pO1xuICBjb25zdCB0aXRsZUluZGV4ID0ga2VlcHNMZWFkaW5nQmxvY2sgPyAxIDogaXNUaXRsZU5vZGUobm9kZXNbMF0pID8gMCA6IC0xO1xuICAvLyBXaXRob3V0IGEgcmVjb2duaXphYmxlIHRpdGxlIHRoZSBibG9jayBzaXRzIGF0IHRoZSB2ZXJ5IHRvcCwgYWJvdmUgZXZlcnl0aGluZy5cbiAgY29uc3QgaGVhZFN0YXJ0Tm9kZSA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gbm9kZXNbMF0hIDogbm9kZXNbdGl0bGVJbmRleF07XG4gIGNvbnN0IGhlYWQgPVxuICAgIHRpdGxlSW5kZXggPT09IC0xXG4gICAgICA/ICcnXG4gICAgICA6IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGhlYWRTdGFydE5vZGUhKSwgbm9kZXNbdGl0bGVJbmRleF0hLnBvc2l0aW9uIS5lbmQub2Zmc2V0KTtcblxuICBjb25zdCBiYWRnZUJsb2NrTm9kZXM6IFBhcmFncmFwaFtdID0gW107XG4gIGZvciAobGV0IG5vZGVJbmRleCA9IHRpdGxlSW5kZXggKyAxOyA7IG5vZGVJbmRleCsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW25vZGVJbmRleF07XG4gICAgaWYgKCFpc0JhZGdlQmxvY2tOb2RlKG5vZGUpKSBicmVhaztcbiAgICBiYWRnZUJsb2NrTm9kZXMucHVzaChub2RlKTtcbiAgICAvLyBXaXRob3V0IGEgdGl0bGUsIG1lcmdpbmcgbGVhZGluZyBibG9ja3MgY291bGQgY2hhbmdlIHdoaWNoIG5vZGUgaXMgcmVjb2duaXplZCBhcyB0aGUgdGl0bGUgb24gdGhlIG5leHQgcnVuLlxuICAgIGlmICh0aXRsZUluZGV4ID09PSAtMSkgYnJlYWs7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmcgPSBiYWRnZUJsb2NrTm9kZXMuZmxhdE1hcCgobm9kZSkgPT4gcmVhZEJhZGdlcyhub2RlLCBjb250ZW50KSk7XG4gIGNvbnN0IGJvZHlOb2RlID0gbm9kZXNbdGl0bGVJbmRleCArIDEgKyBiYWRnZUJsb2NrTm9kZXMubGVuZ3RoXTtcbiAgY29uc3QgYm9keSA9IGJvZHlOb2RlID8gY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgYm9keU5vZGUpKSA6ICcnO1xuXG4gIC8vIFN1cGVyc2VkaW5nIGEgbWFuYWdlZCBiYWRnZSBpcyBqdXN0IGRyb3BwaW5nIHRoZSBvbGQgb25lOiBhIHZlcnNpb24sIHdvcmtmbG93LCBucG0sIG9yIGxpY2Vuc2VcbiAgLy8gY2hhbmdlIGxlYXZlcyBubyBzdGFsZSBjb3B5LCB3aGlsZSBhbnkgb3RoZXIgYmFkZ2UgaW4gdGhlIG1hbmFnZWQgcmVnaW9uIGlzIGtlcHQuXG4gIGNvbnN0IGJhZGdlcyA9IFsuLi5tYW5hZ2VkQmFkZ2VzLCAuLi5leGlzdGluZy5maWx0ZXIoKGJhZGdlKSA9PiAhaXNNYW5hZ2VkQmFkZ2UoYmFkZ2UpKV07XG4gIC8vIENvbnRlbnQgaXMgc2xpY2VkIGZyb20gaXRzIG5vZGUncyBzdGFydCBvZmZzZXQsIHNvIHdoYXRldmVyIGJsYW5rIHNwYWNlIGZvbGxvd2VkIHRoZSBmcm9udFxuICAvLyBtYXR0ZXIgaXMgZ29uZTsgZXhhY3RseSBvbmUgYmxhbmsgbGluZSBpcyByZXN0b3JlZCBoZXJlLiBBIGNsb3NpbmcgZGVsaW1pdGVyIHRoYXQgZW5kZWQgYXQgRU9GXG4gIC8vIGNhcnJpZXMgbm8gbmV3bGluZSBvZiBpdHMgb3duIGFuZCBuZWVkcyBib3RoLCBvciBgLS0tYCB3b3VsZCBmdXNlIHdpdGggdGhlIGZpcnN0IGJhZGdlIGFuZFxuICAvLyBkZXN0cm95IHRoZW0gYm90aC4gQSBCT00gbmVlZHMgbm8gc2VwYXJhdG9yOiBpdCBpcyBhIGJ5dGUgbWFya2VyLCBub3QgYSBsaW5lLlxuICBjb25zdCBzZXBhcmF0b3IgPSBmcm9udE1hdHRlciA/ICgvXFxyP1xcbiQvdS50ZXN0KGZyb250TWF0dGVyKSA/IGxpbmVFbmRpbmcgOiBgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKSA6ICcnO1xuICBjb25zdCByZXN1bHQgPVxuICAgIHByZWZpeCArIHNlcGFyYXRvciArIFtoZWFkLCBiYWRnZXMuam9pbihsaW5lRW5kaW5nKSwgYm9keV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCk7XG4gIHJldHVybiBlbmRzV2l0aE5ld2xpbmUgPyBgJHtyZXN1bHR9JHtsaW5lRW5kaW5nfWAgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQSBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBleHRlbmRlZCBiYWNrIG92ZXIgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBpdHMgb3duIGxpbmUuIENvbW1vbk1hcmtcbiAqIGFsbG93cyBvbmUgdG8gdGhyZWUgc3BhY2VzIG9mIGluZGVudGF0aW9uIGJlZm9yZSBhIGJsb2NrLCBhbmQgbWRhc3QgcmVwb3J0cyB0aGUgb2Zmc2V0IEFGVEVSXG4gKiB0aGVtIOKAlCBzbyBzbGljaW5nIGZyb20gaXQgc2lsZW50bHkgcmVpbmRlbnRzIGNvbnRlbnQgdGhpcyBnZW5lcmF0b3IgcHJvbWlzZXMgdG8gY29weSB2ZXJiYXRpbS5cbiAqL1xuZnVuY3Rpb24gc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQ6IHN0cmluZywgbm9kZTogUm9vdENvbnRlbnQpOiBudW1iZXIge1xuICBjb25zdCBzdGFydCA9IG5vZGUucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCE7XG4gIGNvbnN0IGxpbmVTdGFydCA9IGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIHN0YXJ0IC0gMSkgKyAxO1xuICByZXR1cm4gL15bIFxcdF0qJC91LnRlc3QoY29udGVudC5zbGljZShsaW5lU3RhcnQsIHN0YXJ0KSkgPyBsaW5lU3RhcnQgOiBzdGFydDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBub2RlIG9wZW5zIHRoZSBSRUFETUUgd2l0aCBhIHRpdGxlLiBPbmx5IHRoZSBGSVJTVCBwaWVjZSBvZiBjb250ZW50IGNhbiBiZSBvbmU6IGFcbiAqIHRpdGxlIGlzIHdoYXQgYSBSRUFETUUgb3BlbnMgd2l0aCwgYW5kIGFuY2hvcmluZyB0aGUgYmFkZ2VzIHRvIGEgaGVhZGluZyBmdXJ0aGVyIGRvd24gd291bGQgYnVyeVxuICogdGhlbSBiZWxvdyBjb250ZW50IHRoZSBhdXRob3IgcHV0IGZpcnN0LlxuICovXG5mdW5jdGlvbiBpc1RpdGxlTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ2hlYWRpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgLy8gTWFueSBSRUFETUVzIGNlbnRlciB0aGVpciB0aXRsZSBpbiBIVE1MIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLCB3aGljaCB0aGVcbiAgLy8gcGFyc2VyIHJlcG9ydHMgYXMgb25lIG9wYXF1ZSBIVE1MIGJsb2NrOyB0aGUgYmFkZ2VzIGdvIGFmdGVyIHRoZSB3aG9sZSBibG9jay5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2h0bWwnICYmIGNvbnRhaW5zUmVuZGVyZWRIMShub2RlLnZhbHVlKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBIVE1MIGJsb2NrIHVuYW1iaWd1b3VzbHkgUkVOREVSUyBhbiBgPGgxPmAg4oCUIHRoZSBjZW50ZXJlZC10aXRsZSBsYXlvdXQgbWFueSBSRUFETUVzXG4gKiB1c2UgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBhIGdlbmVyYWwgSFRNTCBwYXJzZXIuIERlY2lkaW5nIHRoaXMgZXhhY3RseSByZXF1aXJlcyB0aGUgcmVhbCB0b2tlbml6ZXInc1xuICogc3RhdGVzIOKAlCByYXcgdGV4dCwgUkNEQVRBLCBzY3JpcHQgZGF0YSwgYXR0cmlidXRlIHZhbHVlcywgdGVtcGxhdGUgY29udGVudHMsIGRlY2xhcmF0aW9ucyDigJQgYW5kXG4gKiBhcHByb3hpbWF0aW5nIHRoZW0gd2l0aCByZWdleGVzIGlzIHRoZSBzYW1lIGxvc2luZyBnYW1lIHRoZSBNYXJrZG93biBzY2FubmluZyB0aGlzIG1vZHVsZVxuICogcmVwbGFjZWQgd2FzIHBsYXlpbmcuIFNvIHRoZSBydWxlIGlzOiB0b2tlbml6ZSBvbmx5IHRoZSBzaW1wbGUgY2FzZSwgYW5kIHRyZWF0IGFueXRoaW5nIGNhcnJ5aW5nXG4gKiBhIGNvbnN0cnVjdCB3aG9zZSBwYXJzaW5nIGRlcGVuZHMgb24gdGhvc2Ugc3RhdGVzIGFzIE5PVCBhIHRpdGxlLiBCZWluZyB3cm9uZyB0aGF0IHdheSBwdXRzIHRoZVxuICogYmFkZ2VzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIHdoaWNoIGlzIG1lcmVseSB1bmhlbHBmdWw7IGJlaW5nIHdyb25nIHRoZSBvdGhlciB3YXkgcmV3cml0ZXMgdGhlXG4gKiB1c2VyJ3MgUkVBRE1FIGFyb3VuZCB0aGUgd3JvbmcgYW5jaG9yLlxuICovXG5mdW5jdGlvbiBjb250YWluc1JlbmRlcmVkSDEoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbW1lbnRzIGNhbm5vdCBuZXN0IGFuZCBlbmQgdW5hbWJpZ3VvdXNseSwgc28gdGhleSBhcmUgc2ltcGx5IHJlbW92ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZy5cbiAgY29uc3Qgd2l0aG91dENvbW1lbnRzID0gaHRtbC5yZXBsYWNlQWxsKC88IS0tW1xcc1xcU10qPyg/Oi0tPnwkKS9ndSwgJycpO1xuICAvLyBDREFUQSwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGRlY2xhcmF0aW9ucywgZWxlbWVudHMgd2hvc2UgY29udGVudCBpcyByYXcgdGV4dCAvIFJDREFUQSAvXG4gIC8vIHNjcmlwdCBkYXRhLCBhbmQgYDx0ZW1wbGF0ZT5gICh3aG9zZSBjb250ZW50cyBhcmUgaW5lcnQpLiBBIHF1b3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyBgPGBcbiAgLy8gbWFrZXMgZXZlbiBsb2NhdGluZyB0aGVzZSB1bnJlbGlhYmxlLCBzbyBpdCBkaXNxdWFsaWZpZXMgdGhlIGJsb2NrIHRvby5cbiAgY29uc3QgYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybiA9XG4gICAgLzwhXFxbQ0RBVEFcXFt8PFxcP3w8IVthLXpBLVpdfDxcXC8/KD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlfGlmcmFtZXxub2ZyYW1lc3xub2VtYmVkfHhtcHx0ZW1wbGF0ZSlcXGJ8XCJbXlwiXSo8W15cIl0qXCJ8J1teJ10qPFteJ10qJy9pdTtcbiAgaWYgKGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4udGVzdCh3aXRob3V0Q29tbWVudHMpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFF1b3RpbmcgaXMgc2lnbmlmaWNhbnQgb25seSBpbnNpZGUgYSBzdGFydCB0YWcsIHNvIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyBjb25zdW1lZCB3aXRoIGl0cyBvd25cbiAgLy8gdGFnIHdoaWxlIHF1b3RhdGlvbiBtYXJrcyBpbiBvcmRpbmFyeSB0ZXh0IHN0YXkgdGV4dDogYDxkaXYgdGl0bGU9XCImbHQ7aDEmZ3Q7XCI+YCBkb2VzIG5vdCBjb3VudCxcbiAgLy8gYFwiPGgxPlByb2plY3Q8L2gxPlwiYCBkb2VzLlxuICBjb25zdCBzdGFydFRhZ1BhdHRlcm4gPSAvPChbYS16QS1aXVteXFxzLz5dKikoPzpcIlteXCJdKlwifCdbXiddKid8W14+XCInXSkqPi9ndTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB3aXRob3V0Q29tbWVudHMubWF0Y2hBbGwoc3RhcnRUYWdQYXR0ZXJuKSkge1xuICAgIGlmIChtYXRjaFsxXT8udG9Mb3dlckNhc2UoKSA9PT0gJ2gxJykgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogV2hldGhlciB0aGUgbm9kZSBpcyBhIHBhcmFncmFwaCBvZiBiYWRnZXMgYW5kIG5vdGhpbmcgZWxzZSDigJQgdGhlIG9ubHkgY29udGVudCB3YmZ5IHB1dHMgaW4gdGhlIGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNCYWRnZUJsb2NrTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IG5vZGUgaXMgUGFyYWdyYXBoIHtcbiAgcmV0dXJuIChcbiAgICAhIW5vZGUgJiZcbiAgICBub2RlLnR5cGUgPT09ICdwYXJhZ3JhcGgnICYmXG4gICAgbm9kZS5jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKSAmJlxuICAgIG5vZGUuY2hpbGRyZW4uZXZlcnkoXG4gICAgICAoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSB8fCBjaGlsZC50eXBlID09PSAnYnJlYWsnIHx8IChjaGlsZC50eXBlID09PSAndGV4dCcgJiYgIWNoaWxkLnZhbHVlLnRyaW0oKSlcbiAgICApXG4gICk7XG59XG5cbi8qKiBBIGJhZGdlIGlzIG9uZSBgWyFbYWx0XShpbWFnZSldKGxpbmspYCwgdGhlIG9ubHkgc2hhcGUgd2JmeSBldmVyIHdyaXRlcy4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgUGhyYXNpbmdDb250ZW50KTogbm9kZSBpcyBMaW5rICYgeyBjaGlsZHJlbjogW0ltYWdlXSB9IHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2xpbmsnICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG5vZGUuY2hpbGRyZW5bMF0/LnR5cGUgPT09ICdpbWFnZSc7XG59XG5cbi8qKlxuICogVGhlIGJhZGdlcyBpbiB0aGUgYmxvY2ssIGFzIHRoZSBleGFjdCBzb3VyY2UgdGV4dCB0aGF0IHByb2R1Y2VkIHRoZW06IGEgYmFkZ2Ugd2JmeSBkb2VzIG5vdCBtYW5hZ2VcbiAqIGlzIHdyaXR0ZW4gYmFjayBieXRlIGZvciBieXRlIGluc3RlYWQgb2YgYmVpbmcgcmUtc2VyaWFsaXplZCBmcm9tIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiByZWFkQmFkZ2VzKG5vZGU6IFBhcmFncmFwaCwgY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpXG4gICAgLm1hcCgoY2hpbGQpID0+IGNvbnRlbnQuc2xpY2UoY2hpbGQucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCwgY2hpbGQucG9zaXRpb24hLmVuZC5vZmZzZXQpKTtcbn1cblxuLyoqXG4gKiBQZXJjZW50LWVuY29kZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBlbmQgYSBNYXJrZG93biBkZXN0aW5hdGlvbiBlYXJseS4gQSB3b3JrZmxvdyBmaWxlIG1heSBiZVxuICogbmFtZWQgYW55dGhpbmcgd2l0aCBhIGAueW1sYCBleHRlbnNpb24sIGFuZCBvbmUgY29udGFpbmluZyBgKGAgb3IgYClgIHByb2R1Y2VkIGEgYmFkZ2UgdGhhdCB3YmZ5J3NcbiAqIG93biBiYWRnZSBwYXR0ZXJuIGNvdWxkIG5vdCByZWFkIGJhY2sg4oCUIHNvIHRoZSBsaW5lIGxlZnQgdGhlIGJsb2NrIGFuZCB0aGUgYmFkZ2Ugd2FzIGR1cGxpY2F0ZWQuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVybFBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bKClcXHNdL2d1LCAoY2hhcmFjdGVyKSA9PiBgJSR7Y2hhcmFjdGVyLmNvZGVQb2ludEF0KDApIS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGlzIG9uZSB3YmZ5IHdyaXRlcyBpdHNlbGYsIGFuZCBzbyBtYXkgYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgYmxvY2suICovXG5mdW5jdGlvbiBpc01hbmFnZWRCYWRnZShiYWRnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBiYWRnZSA9PT0gc2VtYW50aWNSZWxlYXNlQmFkZ2UgfHwgbWFuYWdlZEJhZGdlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGJhZGdlKSk7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVFbmRpbmcoY29udGVudDogc3RyaW5nKTogJ1xcbicgfCAnXFxyXFxuJyB7XG4gIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXHJcXG4nKSA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuXG5jb25zdCBzaGFyZWRQcmVzZXQgPSAnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbmMnO1xuY29uc3QgZ2VuZXJhdGVkU2V0dGluZ3MgPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogW3NoYXJlZFByZXNldF0sXG59O1xuXG50eXBlIFNldHRpbmdzID0gUGFydGlhbDx0eXBlb2YgZ2VuZXJhdGVkU2V0dGluZ3M+ICYge1xuICBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdO1xufTtcblxuY29uc3QgbWFuYWdlZEZpbGVOYW1lID0gJ3Jlbm92YXRlLmpzb25jJztcblxuLy8gd2JmeSBzdXBwb3J0cyBvbmUgY2Fub25pY2FsIFJlbm92YXRlIGxvY2F0aW9uLiBOb24tY2Fub25pY2FsIGNvbmZpZ3MgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbi8vIHJlcG9zaXRvcnkgaW5zdGVhZCBvZiBiZWluZyBwYXJzZWQsIG1lcmdlZCwgb3IgZGVsZXRlZCBoZXJlLlxuY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMgPSBbXG4gICdyZW5vdmF0ZS5qc29uJyxcbiAgJ3Jlbm92YXRlLmpzb241JyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbicsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb25jJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbjUnLFxuICAnLnJlbm92YXRlcmMnLFxuICAnLnJlbm92YXRlcmMuanNvbicsXG4gICcucmVub3ZhdGVyYy5qc29uNScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgbWFuYWdlZEZpbGVOYW1lKTtcbiAgICBjb25zdCBtYW5hZ2VkRmlsZVN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAobWFuYWdlZEZpbGVTdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMubWFwKGFzeW5jIChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGNhbmRpZGF0ZSkuY2F0Y2goKCkgPT4ge30pKSA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdQYXRoID0gbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAobm9uQ2Fub25pY2FsQ29uZmlnUGF0aCB8fCBjb25maWcucGFja2FnZUpzb24/LnJlbm92YXRlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgcmVwb3NpdG9yeSBoYXMgYSBub24tY2Fub25pY2FsIFJlbm92YXRlIGNvbmZpZyR7XG4gICAgICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA/IGAgYXQgJHtub25DYW5vbmljYWxDb25maWdQYXRofWAgOiAnIGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgfS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8U2V0dGluZ3M+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbGRTZXR0aW5ncz8uZXh0ZW5kcyAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4dGVuZHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiZXh0ZW5kc1wiIGlzIG5vdCBhbiBhcnJheS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZFByZXNldCA9IG9sZFNldHRpbmdzPy5leHRlbmRzPy5maW5kKFxuICAgICAgKHByZXNldCkgPT4gcHJlc2V0LnN0YXJ0c1dpdGgoJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOicpICYmIHByZXNldCAhPT0gc2hhcmVkUHJlc2V0XG4gICAgKTtcbiAgICBpZiAocmVtb3ZlZFByZXNldCkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcIiR7cmVtb3ZlZFByZXNldH1cIiBubyBsb25nZXIgZXhpc3RzOyByZW1vdmUgaXQgbWFudWFsbHkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSBidWlsZFNldHRpbmdzKGNvbmZpZywgb2xkU2V0dGluZ3MpO1xuICAgIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICAgIG9sZENvbnRlbnQsXG4gICAgICBuZXdTZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICk7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBub3JtYWxpemUoY29udGVudCkgPT09IG5vcm1hbGl6ZShvbGRDb250ZW50KSkgcmV0dXJuO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IFNldHRpbmdzIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBvbGRTZXR0aW5nc1xuICAgID8gKG1lcmdlLmFsbChbZ2VuZXJhdGVkU2V0dGluZ3MsIG9sZFNldHRpbmdzLCBnZW5lcmF0ZWRTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncylcbiAgICA6IHN0cnVjdHVyZWRDbG9uZShnZW5lcmF0ZWRTZXR0aW5ncyk7XG4gIGNvbnN0IGV4aXN0aW5nRXh0ZW5kcyA9IG9sZFNldHRpbmdzPy5leHRlbmRzID8/IFtdO1xuICBzZXR0aW5ncy5leHRlbmRzID0gY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzXG4gICAgPyBleGlzdGluZ0V4dGVuZHMuZmlsdGVyKChwcmVzZXQpID0+IHByZXNldCAhPT0gc2hhcmVkUHJlc2V0KVxuICAgIDogZXhpc3RpbmdFeHRlbmRzLmluY2x1ZGVzKHNoYXJlZFByZXNldClcbiAgICAgID8gZXhpc3RpbmdFeHRlbmRzXG4gICAgICA6IFtzaGFyZWRQcmVzZXQsIC4uLmV4aXN0aW5nRXh0ZW5kc107XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gIHJldHVybiB0cmltbWVkQ29udGVudCA/IHRyaW1tZWRDb250ZW50ICsgJ1xcbicgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgLy8gYGFwcC8qKmAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBldmVuIHRob3VnaCB0aGUgZG9lc0NvbnRhaW4qU2NyaXB0IHNpZ25hbHMgc2NhbiBpdDogYXBwXG4gIC8vIGRpcmVjdG9yaWVzIGJlbG9uZyB0byBmcmFtZXdvcmsgcGFja2FnZXMgKE5leHQuanMvQmxpdHopLCB3aGljaCBvd24gdGhlaXIgdHNjb25maWdcbiAgLy8gKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSksIGFuZCBjaGVja2luZyBmcmFtZXdvcmsgc291cmNlcyB1bmRlciB0aGlzIHByb2plY3QncyBjb21waWxlclxuICAvLyBvcHRpb25zIHdvdWxkIHByb2R1Y2UgZmFsc2UgZXJyb3JzLlxuICBpbmNsdWRlOiBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gdmluZXh0IGlzIHRoZSBvcmcncyBOZXh0LmpzLWVxdWl2YWxlbnQgZnJhbWV3b3JrIGFuZCBvd25zIGl0cyB0c2NvbmZpZyBqdXN0IGxpa2UgTmV4dC9CbGl0eixcbiAgICAvLyBzbyBpdCBtdXN0IHNraXAgdGhlIHN0YW5kYXJkIGdlbmVyYXRpb24gdGhhdCB3b3VsZCBvdmVyd3JpdGUgdGhlIGZyYW1ld29yaydzIG93biBzZXR0aW5ncy5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGF3YWl0IG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gKGNvbmZpZy5pc1Jvb3QgPyBidWlsZFJvb3RKc29uT2JqKGNvbmZpZykgOiBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRUeXBlcyA9IGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnJvb3REaXIgPSBnZXRSb290RGlyKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgLy8gUHJpc21hIHNlZWRzIGFuZCBtaWdyYXRpb24gaGVscGVyIHNjcmlwdHMgb2Z0ZW4gbGl2ZSBvdXRzaWRlIHNyYywgYnV0XG4gICAgICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgc3RpbGwgbmVlZHMgdGhlbSBjb3ZlcmVkIGJ5IHRoZSBwcm9qZWN0IGNvbmZpZy5cbiAgICAgIGFkZEluY2x1ZGVQYXRoKG5ld1NldHRpbmdzLCAncHJpc21hLyoqLyonKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9yaWdpbmFsU2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLy8gQSBmaWxlIHdpdGggbm8gY29uZmlndXJhdGlvbiAoZW1wdHkgb3IgY29tbWVudC1vbmx5KSBpcyB0cmVhdGVkIGxpa2UgYSBtaXNzaW5nIG9uZSwgYXMgdHNjIGRvZXMuXG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgICAvLyBBbiBleGlzdGluZyB0c2NvbmZpZy5qc29uIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlXG4gICAgICAvLyBnZW5lcmF0ZWQgc2V0dGluZ3Mgd2l0aG91dCBtZXJnaW5nIHdvdWxkIHNpbGVudGx5IGRpc2NhcmQgdGhlIHByb2plY3QncyBjb25maWd1cmF0aW9uLlxuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpKSk7XG4gICAgICBjb25zdCBleGlzdGluZ1R5cGVzID0gbm9ybWFsaXplU3RyaW5nQXJyYXkob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcyk7XG4gICAgICBjb25zdCBleGlzdGluZ0VtaXRNZXRhZGF0YSA9IHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgICAgICByZW1vdmVTdGFsZU1hbmFnZWRXb3Jrc3BhY2VFbnRyaWVzKGNvbmZpZywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgICAgIH1cbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICAvLyB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZy5qc29uIGlzIGEgbGludC90eXBlY2hlY2sgcHJvamVjdCwgbm90IHRoZSBlbWl0XG4gICAgICAvLyBjb250cmFjdC4gSXQgbXVzdCBrZWVwIHJvb3REaXIgYnJvYWQgZW5vdWdoIGZvciByb290IGNvbmZpZyBmaWxlcyxcbiAgICAgIC8vIHNjcmlwdHMsIHNyYywgYW5kIHRlc3RzLiBidWlsZC10cyBvd25zIGVtaXQgYW5kIGNyZWF0ZXMgYSB0ZW1wb3JhcnlcbiAgICAgIC8vIHNyYy1vbmx5IHRzY29uZmlnIHdpdGggbm9FbWl0PWZhbHNlLCBlbWl0RGVjbGFyYXRpb25Pbmx5PXRydWUsXG4gICAgICAvLyByb290RGlyPVwic3JjXCIsIGFuZCBpbmNsdWRlPVtcInNyYy8qKi8qXCJdLCBzbyBwcmVzZXJ2aW5nIG5vRW1pdD1mYWxzZSBvclxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiIGhlcmUgd291bGQgb25seSBicmVhayBub24tc3JjIHR5cGUtYXdhcmUgbGludCBjb3ZlcmFnZS5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRNZXRhZGF0YSB9O1xuXG4gICAgICBjb25zdCBtZXJnZWRUeXBlcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXMsIGdlbmVyYXRlZFR5cGVzKSwgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9XG4gICAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhuZXdTZXR0aW5ncywgY29uZmlnKTtcbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS11cC10by1kYXRlIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKG9yaWdpbmFsU2V0dGluZ3NKc29uID09PSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncykpIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIG1vbm9yZXBvLXJvb3QgdHNjb25maWcsIHdob3NlIGluY2x1ZGUvZXhjbHVkZSBjb3ZlciBldmVyeSBERUNMQVJFRCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuXG4gKiBgYXBwcy8qYCBhbG9uZ3NpZGUgYHBhY2thZ2VzLypgKSBzbyB0eXBlLWF3YXJlIGxpbnRpbmcgcnVuIGZyb20gdGhlIHJvb3Qgc2VlcyBhbGwgd29ya3NwYWNlXG4gKiBzb3VyY2VzLCBub3QganVzdCB0aGUgY29udmVudGlvbmFsIHBhY2thZ2VzLyogZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBidWlsZFJvb3RKc29uT2JqKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFRzQ29uZmlnSnNvbiB7XG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID0gY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zXG4gICAgPyBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhjb25maWcpXG4gICAgOiB7IGV4Y2x1ZGVzOiBbXSwgaW5jbHVkZXM6IFtdIH07XG4gIGNvbnN0IHNldHRpbmdzID0gc3RydWN0dXJlZENsb25lKHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgc2V0dGluZ3MuZXhjbHVkZSA9IFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmluY2x1ZGVzLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gYCR7d29ya3NwYWNlUGF0dGVybn0vdGVzdC9maXh0dXJlc2ApLFxuICAgICAgLy8gTmVnYXRpdmUgd29ya3NwYWNlIHBhdHRlcm5zIChlLmcuIGAhcGFja2FnZXMvZXhjbHVkZWRgKSBvcHQgd29ya3NwYWNlIHN1YnRyZWVzIG91dCBvZiB0aGVcbiAgICAgIC8vIG1vbm9yZXBvLCBzbyB0aGVpciBzb3VyY2VzIG11c3Qgbm90IGVudGVyIHRoZSByb290IHR5cGUtY2hlY2sgcHJvamVjdCBlaXRoZXIuIEEgbmVnYXRpb25cbiAgICAgIC8vIHdob3NlIGRpcmVjdG9yeSBpcyBhbiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSB5aWVsZHMgcGFja2FnZS1vd25lZCBzdWJwYXRoIGVudHJpZXNcbiAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHdob2xlIHN1YnRyZWUgKHNlZSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykuXG4gICAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5leGNsdWRlcyxcbiAgICAgIC8vIFRoZSBtYW5hZ2VkIGluY2x1ZGVzIGFib3ZlIGRlbGliZXJhdGVseSBvbWl0IGZyYW1ld29yayBgYXBwLyoqYCBkaXJlY3RvcmllcyAoc2VlXG4gICAgICAvLyBzdWJKc29uT2JqLmluY2x1ZGUncyBjb21tZW50KSwgYnV0IGEgcmVwby1hdXRob3JlZCBicm9hZCBpbmNsdWRlIHN1Y2ggYXMgYGUyZS8qKlxcLypgXG4gICAgICAvLyBjYW4gc3RpbGwgZHJhZyBhIGZyYW1ld29yayB3b3Jrc3BhY2UncyBhcHAgc291cmNlcyBpbnRvIHRoZSByb290IHByb2plY3QsIHdoZXJlIHRoZXlcbiAgICAgIC8vIGZhaWwgdW5kZXIgdGhlIHJvb3QgY29tcGlsZXIgb3B0aW9ucyDigJQgdGhlaXIgYmFyZSBgbmV4dC8qYCBpbXBvcnRzIHJlc29sdmUgb25seSB0aHJvdWdoXG4gICAgICAvLyB0aGUgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIG93biB0c2NvbmZpZyBgcGF0aHNgLiBFeGNsdWRlIHRob3NlIGFwcCBkaXJlY3RvcmllcyBzbyB0aGVcbiAgICAgIC8vIHJvb3QgcHJvamVjdCBuZXZlciB0eXBlLWNoZWNrcyB0aGVtLCBubyBtYXR0ZXIgaG93IGJyb2FkIHRoZSByZXBvJ3MgaW5jbHVkZSBnbG9icyBhcmUuXG4gICAgICAuLi5nZXRGcmFtZXdvcmtXb3Jrc3BhY2VBcHBFeGNsdWRlcyhjb25maWcpLFxuICAgICAgLi4uKHNldHRpbmdzLmV4Y2x1ZGUgPz8gW10pLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG4gIHNldHRpbmdzLmluY2x1ZGUgPSBbXG4gICAgLi4uKHNldHRpbmdzLmluY2x1ZGUgPz8gW10pLFxuICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmluY2x1ZGVzLmZsYXRNYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IFtcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59LyouY29uZmlnLnRzYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NjcmlwdHMvKiovKmAsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS9zcmMvKiovKmAsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0LyoqLypgLFxuICAgIF0pLFxuICBdO1xuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbi8vIEZyYW1ld29yayBwYWNrYWdlcyBvd24gdGhlaXIgdHNjb25maWcgKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSkgYW5kIHNoaW0gYmFyZSBpbXBvcnRzIHN1Y2ggYXNcbi8vIGBuZXh0L25hdmlnYXRpb25gIHRocm91Z2ggcGFja2FnZS1sb2NhbCBgcGF0aHNgOyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmtcbi8vIGFuZCBiZWhhdmVzIHRoZSBzYW1lLiBUaGVpciBhcHAgc291cmNlcyB0aGVyZWZvcmUgb25seSB0eXBlLWNoZWNrIHVuZGVyIHRoZWlyIG93biBjb25maWcuXG5jb25zdCBmcmFtZXdvcmtEZXBlbmRlbmN5TmFtZXMgPSBbJ2JsaXR6JywgJ25leHQnLCAndmluZXh0J107XG5cbi8vIEEgZnJhbWV3b3JrIGFwcCBsaXZlcyBpbiBgYXBwL2Agb3IsIHVuZGVyIHRoZSBzcmMtZGlyZWN0b3J5IGxheW91dCwgYHNyYy9hcHAvYC4gVGhlIHJvb3QgcHJvamVjdFxuLy8gaW5jbHVkZXMgYDx3b3Jrc3BhY2U+L3NyYy8qKi8qYCwgc28gYHNyYy9hcHBgIGxlYWtzIGluIGp1c3QgYXMgYSByZXBvLXdpZGUgZ2xvYiBjYW4gcHVsbCBpbiBgYXBwYC5cbmNvbnN0IGZyYW1ld29ya0FwcERpck5hbWVzID0gWydhcHAnLCAnc3JjL2FwcCddO1xuXG4vKiogUm9vdCBgZXhjbHVkZWAgZW50cmllcyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSByb290KSBmb3IgZXZlcnkgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBkaXJlY3RvcnkuICovXG5mdW5jdGlvbiBnZXRGcmFtZXdvcmtXb3Jrc3BhY2VBcHBFeGNsdWRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSByZXR1cm4gW107XG4gIGNvbnN0IGV4Y2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZURpclBhdGggb2YgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKSkge1xuICAgIGlmICghZGVwZW5kc09uRnJhbWV3b3JrKHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGFwcERpck5hbWUgb2YgZnJhbWV3b3JrQXBwRGlyTmFtZXMpIHtcbiAgICAgIGNvbnN0IGFwcERpclBhdGggPSBwYXRoLnJlc29sdmUod29ya3NwYWNlRGlyUGF0aCwgYXBwRGlyTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhhcHBEaXJQYXRoKSkgZXhjbHVkZXMucHVzaChwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBhcHBEaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBleGNsdWRlcztcbn1cblxuZnVuY3Rpb24gZGVwZW5kc09uRnJhbWV3b3JrKG1hbmlmZXN0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBtYW5pZmVzdDogUGFja2FnZUpzb24gfCBudWxsO1xuICB0cnkge1xuICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBBIG1hbmlmZXN0IHRoYXQgcGFyc2VzIHRvIGEgbm9uLW9iamVjdCAoZS5nLiBhIGZpbGUgbGl0ZXJhbGx5IGNvbnRhaW5pbmcgYG51bGxgKSBkZWNsYXJlcyBub1xuICAvLyBkZXBlbmRlbmNpZXM7IGd1YXJkIHRoZSBwcm9wZXJ0eSBhY2Nlc3MsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSB0aHJvdyBvdXRzaWRlIHRoZSB0cnkgYWJvdmUuXG4gIGlmICghbWFuaWZlc3QgfHwgdHlwZW9mIG1hbmlmZXN0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7IC4uLm1hbmlmZXN0LmRlcGVuZGVuY2llcywgLi4ubWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzIH07XG4gIHJldHVybiBmcmFtZXdvcmtEZXBlbmRlbmN5TmFtZXMuc29tZSgoZGVwZW5kZW5jeU5hbWUpID0+IGRlcGVuZGVuY2llc1tkZXBlbmRlbmN5TmFtZV0pO1xufVxuXG5jb25zdCBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzID0gWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ107XG5cbi8qKlxuICogUm9vdCBpbmNsdWRlL2V4Y2x1ZGUgZW50cmllcyB3YmZ5IGdlbmVyYXRlZCBmb3IgYW4gZWFybGllciB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGBwYWNrYWdlcy8qYFxuICogZ2xvYnMgaW4gYSByZXBvIHRoYXQgbm93IGRlY2xhcmVzIG9ubHkgYGFwcHMvKmApIG11c3Qgbm90IHN1cnZpdmUgdGhlIG1lcmdlIHdpdGggdGhlIGV4aXN0aW5nXG4gKiB0c2NvbmZpZywgb3IgdGhlIG9ic29sZXRlIGRpcmVjdG9yaWVzIHdvdWxkIGtlZXAgZW50ZXJpbmcgcm9vdCB0eXBlIGNoZWNraW5nIGZvcmV2ZXIuIEEgcHJlZml4XG4gKiBjb3VudHMgYXMgd2JmeS1tYW5hZ2VkIG9ubHkgd2hlbiB0aGUgQ09NUExFVEUgZ2VuZXJhdGVkIGluY2x1ZGUgc2V0IGZvciBpdCBpcyBwcmVzZW50IGFuZCBub1xuICogbG9uZ2VyIGdlbmVyYXRlZCDigJQgYSB1c2VyLWF1dGhvcmVkIGVudHJ5IHN1Y2ggYXMgYSBsb25lIGB0b29scy8qXFwvc3JjLyoqXFwvKmAgbmV2ZXIgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiByZW1vdmVTdGFsZU1hbmFnZWRXb3Jrc3BhY2VFbnRyaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIG9sZFNldHRpbmdzOiBUc0NvbmZpZ0pzb24sXG4gIG5ld1NldHRpbmdzOiBUc0NvbmZpZ0pzb25cbik6IHZvaWQge1xuICBjb25zdCBzdGFsZVByZWZpeGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmluY2x1ZGUpKSB7XG4gICAgY29uc3Qgb2xkSW5jbHVkZSA9IG9sZFNldHRpbmdzLmluY2x1ZGUuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRJbmNsdWRlID0gbmV3IFNldChuZXdTZXR0aW5ncy5pbmNsdWRlKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG9sZEluY2x1ZGUpIHtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpO1xuICAgICAgaWYgKHdvcmtzcGFjZVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8IHN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaXNDb21wbGV0ZSA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuZXZlcnkoKHN1ZmZpeCkgPT5cbiAgICAgICAgb2xkSW5jbHVkZS5pbmNsdWRlcyhgJHt3b3Jrc3BhY2VQcmVmaXh9LyR7c3VmZml4fWApXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTdGlsbEdlbmVyYXRlZCA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuc29tZSgoc3VmZml4KSA9PlxuICAgICAgICBnZW5lcmF0ZWRJbmNsdWRlLmhhcyhgJHt3b3Jrc3BhY2VQcmVmaXh9LyR7c3VmZml4fWApXG4gICAgICApO1xuICAgICAgaWYgKGlzQ29tcGxldGUgJiYgIWlzU3RpbGxHZW5lcmF0ZWQpIHN0YWxlUHJlZml4ZXMuYWRkKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgfVxuICAgIGlmIChzdGFsZVByZWZpeGVzLnNpemUgPiAwKSB7XG4gICAgICBvbGRTZXR0aW5ncy5pbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgPyBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8ICFzdGFsZVByZWZpeGVzLmhhcyh3b3Jrc3BhY2VQcmVmaXgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5leGNsdWRlKSkgcmV0dXJuO1xuICBjb25zdCBnZW5lcmF0ZWRFeGNsdWRlID0gbmV3IFNldChuZXdTZXR0aW5ncy5leGNsdWRlKTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKGNvbmZpZykubWFwKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PlxuICAgICAgICBwYXRoLnJlbGF0aXZlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCksIHdvcmtzcGFjZURpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpXG4gICAgICApXG4gICAgOiBbXTtcbiAgb2xkU2V0dGluZ3MuZXhjbHVkZSA9IG9sZFNldHRpbmdzLmV4Y2x1ZGUuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdzdHJpbmcnIHx8IGdlbmVyYXRlZEV4Y2x1ZGUuaGFzKGVudHJ5KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGVudHJ5LmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpKSB7XG4gICAgICByZXR1cm4gIXN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0nL3Rlc3QvZml4dHVyZXMnLmxlbmd0aCkpO1xuICAgIH1cbiAgICAvLyBBIGZyYW1ld29yayBhcHAgZXhjbHVkZSAoYDx3b3Jrc3BhY2U+L2FwcGAsIGA8d29ya3NwYWNlPi9zcmMvYXBwYCkgZm9yIGEgc3RpbGwtZGVjbGFyZWRcbiAgICAvLyB3b3Jrc3BhY2UgaXMgcHJ1bmVkIGJ5IGNvdmVyc1dvcmtzcGFjZURpciBiZWxvdyB3aGVuIG5vIGxvbmdlciBnZW5lcmF0ZWQ7IHRoaXMgY2F0Y2hlcyB0aGVcbiAgICAvLyByZW1haW5pbmcgY2FzZSwgd2hlcmUgdGhlIHdvcmtzcGFjZSBpdHNlbGYgd2FzIHJlbW92ZWQgYW5kIGl0cyBwcmVmaXggaXMgdGhlcmVmb3JlIHN0YWxlLlxuICAgIC8vIChBIHdyb25nIHN1ZmZpeCBzdHJpcCB5aWVsZHMgYSBwcmVmaXggYWJzZW50IGZyb20gc3RhbGVQcmVmaXhlcywgc28gdGVzdGluZyBldmVyeSBuYW1lIGlzIHNhZmUuKVxuICAgIGlmIChcbiAgICAgIGZyYW1ld29ya0FwcERpck5hbWVzLnNvbWUoXG4gICAgICAgIChhcHBEaXJOYW1lKSA9PiBlbnRyeS5lbmRzV2l0aChgLyR7YXBwRGlyTmFtZX1gKSAmJiBzdGFsZVByZWZpeGVzLmhhcyhlbnRyeS5zbGljZSgwLCAtKGFwcERpck5hbWUubGVuZ3RoICsgMSkpKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIWNvdmVyc1dvcmtzcGFjZURpcihlbnRyeSwgd29ya3NwYWNlRGlyUGF0aHMpO1xuICB9KTtcbn1cblxuLy8gV2hldGhlciBhbiBleGNsdWRlIGVudHJ5IGlzIGEgd29ya3NwYWNlIG5lZ2F0aW9uIChgIWFwcHMvZXhjbHVkZWRgKSB3aG9zZSBuZWdhdGlvbiBpcyBnb25lOiB0aGVcbi8vIGRpcmVjdG9yeSBpcyBhIHdvcmtzcGFjZSBhZ2FpbiBhbmQgbXVzdCByZS1lbnRlciB0aGUgcm9vdCBwcm9qZWN0LiB3YmZ5IHdyaXRlcyBzdWNoIGEgbmVnYXRpb24gYXNcbi8vIGEgZGlyZWN0b3J5IHBhdGgsIGFzIGEgZGlyZWN0b3J5IFBBVFRFUk4gd2hlbiBpdCBleGNsdWRlcyBleGFjdGx5IHdoYXQgaXQgbWF0Y2hlcyAoYGFwcHMvKmJgKSwgb3Jcbi8vIGFzIGFuIGFuY2VzdG9yJ3MgcGFja2FnZS1vd25lZCBzdWJwYXRocyAoYGFwcHMveC9zcmNgKSDigJQgc28gdGhlIGVudHJ5IG1heSBjb3ZlciBhIGRpc2NvdmVyZWRcbi8vIHdvcmtzcGFjZSBkaXJlY3Rvcnkgb3Igc2l0IHVuZGVyIG9uZS4gQSBnbG9ic3RhciBzZWdtZW50IG1hcmtzIGEgaHlnaWVuZSBnbG9iIChub2RlX21vZHVsZXMsIGUyZVxuLy8gYW5kIGZyaWVuZHMpLCB3aGljaCBpcyBuZXZlciBuZWdhdGlvbi1kZXJpdmVkIGFuZCBtdXN0IHN1cnZpdmUuXG5mdW5jdGlvbiBjb3ZlcnNXb3Jrc3BhY2VEaXIoZW50cnk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChlbnRyeS5zcGxpdCgnLycpLmluY2x1ZGVzKCcqKicpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gZW50cnlcbiAgICAuc3BsaXQoJy8nKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+XG4gICAgICBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsICdbXi9dKicpXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgJ1teL10nKVxuICAgIClcbiAgICAuam9pbignLycpO1xuICBjb25zdCBlbnRyeVBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0oPzovLiopPyRgLCAndScpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyUGF0aHMuc29tZShcbiAgICAod29ya3NwYWNlRGlyUGF0aCkgPT4gZW50cnlQYXR0ZXJuLnRlc3Qod29ya3NwYWNlRGlyUGF0aCkgfHwgZW50cnkuc3RhcnRzV2l0aChgJHt3b3Jrc3BhY2VEaXJQYXRofS9gKVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkU3VmZml4ID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5maW5kKChzdWZmaXgpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHtzdWZmaXh9YCkpO1xuICBpZiAoIW1hdGNoZWRTdWZmaXgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IGVudHJ5LnNsaWNlKDAsIC0obWF0Y2hlZFN1ZmZpeC5sZW5ndGggKyAxKSk7XG4gIHJldHVybiB3b3Jrc3BhY2VQcmVmaXggPT09ICcnID8gdW5kZWZpbmVkIDogd29ya3NwYWNlUHJlZml4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVGcmFtZXdvcmtUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gTmV4dC9CbGl0eiBvd24gdGhlaXIgdHNjb25maWcgc2hhcGUsIGJ1dCBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGFjY2VwdHNcbiAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICBjb25zdCBzZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VHNDb25maWdKc29uPihleGlzdGluZ0NvbnRlbnQpO1xuICBpZiAoIXNldHRpbmdzKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGNsZWFuaW5nIHVwICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3MpO1xuICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzLCBjb25maWcpO1xuICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gIC8vIGFscmVhZHktY2xlYW4gdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+XG4gICAgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpXG4gICk7XG59XG5cbi8qKlxuICogYnVuLXR5cGVzIHJlZmVyZW5jZXMgdW5kaWNpLXR5cGVzIHdpdGhvdXQgZGVjbGFyaW5nIGl0IGFzIGEgZGVwZW5kZW5jeSAob3Zlbi1zaC9idW4jMjI4MDUpLCBzb1xuICogQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIChlc3BlY2lhbGx5IHdpdGggdGhlIGdsb2JhbCBzdG9yZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5KSBjYW5ub3QgcmVzb2x2ZVxuICogaXQgZnJvbSBidW4tdHlwZXMnIGxvY2F0aW9uLCB3aGljaCBzaWxlbnRseSBkZWdyYWRlcyBnbG9iYWwgZmV0Y2ggdHlwZXMgc3VjaCBhcyBSZXNwb25zZS4gTWFwIGl0XG4gKiB0byB0aGUgY29weSB0aGF0IGJ1bmZpZy50b21sJ3MgcHVibGljSG9pc3RQYXR0ZXJuIHBsYWNlcyBpbiB0aGUgcm9vdCBub2RlX21vZHVsZXMuXG4gKi9cbmZ1bmN0aW9uIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIE1hcCB1bmRpY2ktdHlwZXMgb25seSB3aGVuIGJ1bi10eXBlcyBhY3R1YWxseSBsb2FkczogYW4gZXhwbGljaXQgYHR5cGVzYCBsaXN0IGxvYWRzIGl0IGlmZiBpdFxuICAvLyBjb250YWlucyBcImJ1blwiIChldmVuIG9uIFJlYWN0IE5hdGl2ZSwgd2hvc2UgcHJvamVjdHMgbWF5IG9wdCBpbiBieSBoYW5kKTsgd2l0aCBgdHlwZXNgXG4gIC8vIG9taXR0ZWQsIFR5cGVTY3JpcHQncyBhdXRvbWF0aWMgQHR5cGVzIGluY2x1c2lvbiBsb2FkcyBpdCBiZWNhdXNlIHdiZnkgaW5zdGFsbHMgQHR5cGVzL2J1blxuICAvLyBmb3IgZXZlcnkgSmF2YVNjcmlwdCBvciBUeXBlU2NyaXB0IHByb2plY3QgZXhjZXB0IFJlYWN0IE5hdGl2ZSwgd2hpY2ggdXNlc1xuICAvLyBAdHNjb25maWcvcmVhY3QtbmF0aXZlIGluc3RlYWQuXG4gIGNvbnN0IHR5cGVzID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcztcbiAgaWYgKHR5cGVzID8gIXR5cGVzLmluY2x1ZGVzKCdidW4nKSA6IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHJldHVybjtcbiAgY29uc3QgY29ycmVjdE1hcHBpbmcgPSBgJHtnZXRSb290RGlyKGNvbmZpZyl9L25vZGVfbW9kdWxlcy91bmRpY2ktdHlwZXMvaW5kZXguZC50c2A7XG4gIGNvbnN0IGV4aXN0aW5nTWFwcGluZyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ucGF0aHM/LlsndW5kaWNpLXR5cGVzJ107XG4gIGlmIChleGlzdGluZ01hcHBpbmcpIHtcbiAgICAvLyBSZXdyaXRlIHRoZSBnZW5lcmF0ZWQgbWFwcGluZyB3aGVuIGEgd29ya3NwYWNlIG1vdmVzIHRvIGEgZGlmZmVyZW50IHJvb3QgZGVwdGguIEFueSBvdGhlclxuICAgIC8vIHZhbHVlIGlzIGEgZGVsaWJlcmF0ZSByZXBvLWxvY2FsIG1hcHBpbmcgKGUuZy4gcGF0Y2hlZCB0eXBlcykgYW5kIG11c3QgYmUga2VwdC5cbiAgICBpZiAoXG4gICAgICBleGlzdGluZ01hcHBpbmcubGVuZ3RoID09PSAxICYmXG4gICAgICB0eXBlb2YgZXhpc3RpbmdNYXBwaW5nWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgLyg/Ol58XFwvKW5vZGVfbW9kdWxlc1xcL3VuZGljaS10eXBlc1xcL2luZGV4XFwuZFxcLnRzJC91LnRlc3QoZXhpc3RpbmdNYXBwaW5nWzBdKVxuICAgICkge1xuICAgICAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zIS5wYXRocyFbJ3VuZGljaS10eXBlcyddID0gW2NvcnJlY3RNYXBwaW5nXTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnBhdGhzID0ge1xuICAgIC4uLnNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyxcbiAgICAndW5kaWNpLXR5cGVzJzogW2NvcnJlY3RNYXBwaW5nXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGlmIChzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKCdzY3JpcHRzLyoqLyonKSkgcmV0dXJuO1xuXG4gIHNldHRpbmdzLmluY2x1ZGUucHVzaCgnc2NyaXB0cy8qKi8qJyk7XG4gIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIC8vIFRoZSB1bmRpY2ktdHlwZXMgcGF0aCBtYXBwaW5nIG11c3QgcmVhY2ggdGhlIG1vbm9yZXBvIHJvb3QncyBub2RlX21vZHVsZXMgKGJ1bmZpZy50b21sJ3NcbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIGhvaXN0cyB0aGUgcGFja2FnZSB0aGVyZSksIGFuZCB3b3Jrc3BhY2UgcGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXBcbiAgLy8gKGUuZy4gYGV4YW1wbGVzLyoqYCksIHNvIGEgZml4ZWQgdHdvLWxldmVsIHByb2JlIGlzIG5vdCBlbm91Z2guIFByZWZlciB0aGUgbmVhcmVzdCBhbmNlc3RvclxuICAvLyBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIHdvcmtzcGFjZXMgKHRoZSBtb25vcmVwbyByb290KTsgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbmVhcmVzdFxuICAvLyBhbmNlc3RvciBtYW5pZmVzdC4gU3RvcCBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZ1xuICAvLyByZXBvc2l0b3J5J3MgbWFuaWZlc3QgY2FuIG5ldmVyIGJlIGNob3Nlbi5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCk7XG4gIGxldCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7IDsgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCkpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgcm9vdERpclBhdGggPz89IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgICAgLy8gQnVuIG5vLW9wIHBhdHRlcm5zIChlLmcuIGB3b3Jrc3BhY2VzOiBbXCJcIl1gKSBkbyBub3QgbWFrZSBhIG1hbmlmZXN0IGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICAgIGlmIChnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhtYW5pZmVzdC53b3Jrc3BhY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcm9vdERpclBhdGggPSBhbmNlc3RvckRpclBhdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBbiB1bnBhcnNhYmxlIG1hbmlmZXN0IHN0aWxsIG1hcmtzIGEgcHJvamVjdCBkaXJlY3Rvcnk7IGtlZXAgY2xpbWJpbmcgZm9yIGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gYW5jZXN0b3JEaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgYnJlYWs7XG4gIH1cbiAgaWYgKCFyb290RGlyUGF0aCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgcm9vdERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpIHx8ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VTZXR0aW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIFJlYWN0IE5hdGl2ZSBnZXRzIGl0cyBhbWJpZW50IHR5cGVzIGZyb20gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSAocmVhY3QtbmF0aXZlLCBqZXN0KS5cbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGUgb2YgZWFjaCBzdXBwb3J0ZWQgYWdlbnQsIHJlbGF0aXZlIHRvIHRoZSBob21lIGRpcmVjdG9yeS4gVGhlc2VcbiAqIGFwcGx5IHRvIGV2ZXJ5IHJlcG9zaXRvcnkgdGhlIGFnZW50IHdvcmtzIGluLCBzbyB0aGV5IGhvbGQgb25seSB0aGUgY29udmVudGlvbnMgdGhhdCBhcmUgdHJ1ZSBvblxuICogZXZlcnkgV2lsbEJvb3N0ZXIgZGV2ZWxvcGVyIG1hY2hpbmUgcmF0aGVyIHRoYW4gaW4gYSBwYXJ0aWN1bGFyIHJlcG9zaXRvcnkuXG4gKi9cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzID0gWycuY29kZXgvQUdFTlRTLm1kJywgJy5jbGF1ZGUvQ0xBVURFLm1kJywgJy5nZW1pbmkvR0VNSU5JLm1kJ10gYXMgY29uc3Q7XG5cbi8vIFRoaXMgY29udGVudCBpcyBsb2FkZWQgaW50byBldmVyeSBhZ2VudCBzZXNzaW9uLCBzbyBpdCBpcyBrZXB0IGFzIHNob3J0IGFzIGl0IGNhbiBiZSB3aGlsZVxuLy8gc3RheWluZyB1bmFtYmlndW91czogZS5nLiwgdGhlIGV4Y2x1ZGVkIG9yZ2FuaXphdGlvbnMgYXJlIHdyaXR0ZW4gYXMgc2hlbGwgYnJhY2UgZXhwYW5zaW9uLCB3aGljaFxuLy8gdGhlIGFnZW50cyByZWFkIGFzIGEgcGF0aCBjb25kaXRpb24gd2l0aG91dCBhbnkgcnVudGltZSBtYXRjaGluZy5cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCA9IGAtIFJlcG9zIGxpdmUgdW5kZXIgXFxgfi9naHEvZ2l0aHViLmNvbVxcYDsgYWx3YXlzIGNsb25lIHdpdGggXFxgZ2hxIGdldCAtcFxcYCwgbmV2ZXIgXFxgZ2l0IGNsb25lXFxgLlxuLSBMTE0vQUkgYWdlbnQgcmVzcG9uc2VzIG1heSB0YWtlIDHigJMyIGhvdXJzOyB3YWl0IHBhdGllbnRseSwgZG9uJ3QgYXNzdW1lIGZhaWx1cmUuXG4tIE5vIEFJIGF0dHJpYnV0aW9uIChlLmcuLCBcXGBDby1BdXRob3JlZC1CeVxcYCB0cmFpbGVycywgXCJHZW5lcmF0ZWQgd2l0aCAuLi5cIiBmb290ZXJzKSBpbiBjb21taXRzLCBpc3N1ZXMsIG9yIFBScyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgaGlkZXMgbm90aGluZzogaWYgYXNrZWQgd2hpY2ggQUkgYWdlbnQgZGlkIHRoZSB3b3JrLCBhbnN3ZXIgdHJ1dGhmdWxseS5cbi0gT3V0c2lkZSBcXGB+L2docS9naXRodWIuY29tL3tXaWxsQm9vc3RlcixXaWxsQm9vc3RlckxhYn0vXFxgLCBmb2xsb3cgdGhlIHJlcG9zaXRvcnkncyBjb250cmlidXRpb24gZ3VpZGUgKGUuZy4sIENPTlRSSUJVVElORy5tZCwgXFxgLmdpdGh1Yi9cXGApIGFuZCBpc3N1ZS9QUiB0ZW1wbGF0ZXMsIG1hdGNoIGl0cyBjb21taXQgYW5kIGNvZGUgY29udmVudGlvbnMsIGFuZCBob25vciBpdHMgcnVsZXMgb24gQUktYXNzaXN0ZWQgY29udHJpYnV0aW9ucy4gV3JpdGUgaXRzIGlzc3VlcyBhbmQgUFJzIHdpdGggb25seSB3aGF0IGEgcmV2aWV3ZXIgdW5mYW1pbGlhciB3aXRoIHRoZSB3b3JrIG5lZWRzIHRvIHVuZGVyc3RhbmQgYW5kIGFzc2VzcyBpdCwgYXMgY29uY2lzZWx5IGFzIHRoYXQgY29udGV4dCBhbGxvd3MuXG5gO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIHNldHRpbmdzIG1lcmdlZCBpbnRvIGVhY2ggYWdlbnQncyBKU09OIHNldHRpbmdzIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSBob21lXG4gKiBkaXJlY3RvcnkuXG4gKlxuICogRXZlcnkgYWdlbnQgdGhhdCBjYXJyaWVzIGZhY3RzIGZyb20gb25lIHNlc3Npb24gaW50byB0aGUgbmV4dCBpcyB0dXJuZWQgb2ZmIGhlcmUgYmVjYXVzZSBzdWNoXG4gKiBtZW1vcnkgbWFrZXMgYSBzZXNzaW9uIGRlcGVuZCBvbiBpbnZpc2libGUgbWFjaGluZS1sb2NhbCBzdGF0ZTogaXRzIGJlaGF2aW9yIHN0b3BzIGJlaW5nXG4gKiByZXByb2R1Y2libGUgYWNyb3NzIGRldmVsb3BlcnMgYW5kIENJLCBhbmQgYSBzdGFsZSBvciB3cm9uZyBtZW1vcnkgc2lsZW50bHkgb3ZlcnJpZGVzIHRoZVxuICogaW5zdHJ1Y3Rpb24gZmlsZXMgYWJvdmUuIENvZGV4IG5lZWRzIG5vIGVudHJ5IGJlY2F1c2UgaXRzIG1lbW9yaWVzIGFyZSBvcHQtaW5cbiAqIChgW2ZlYXR1cmVzXSBtZW1vcmllcyA9IHRydWVgIGluIGB+Ly5jb2RleC9jb25maWcudG9tbGApLCBzbyBsZWF2aW5nIHRoYXQgZmxhZyB1bnNldCBpcyBlbm91Z2guXG4gKi9cbmNvbnN0IGFnZW50U2V0dGluZ3MgPSBbXG4gIHtcbiAgICByZWxhdGl2ZVBhdGg6ICcuY2xhdWRlL3NldHRpbmdzLmpzb24nLFxuICAgIGFjY2VwdHNDb21tZW50czogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQ2xhdWRlIENvZGUgaW5qZWN0cyBpdHMgb3duIGF0dHJpYnV0aW9uIGRpcmVjdGl2ZSAoYSBgQ28tQXV0aG9yZWQtQnlgIHRyYWlsZXIsIGEgXCJHZW5lcmF0ZWRcbiAgICAgKiB3aXRoXCIgZm9vdGVyLCBhbmQgYSBzZXNzaW9uIGxpbmspIGludG8gdGhlIHRvb2wgZGVzY3JpcHRpb25zIGFuZCBtaWQtc2Vzc2lvbiByZW1pbmRlcnMsIGFuZFxuICAgICAqIHRoYXQgZGlyZWN0aXZlIGRlY2xhcmVzIGl0c2VsZiB0byByZXBsYWNlIGVhcmxpZXIgZ3VpZGFuY2UsIHNvIHRoZSBpbnN0cnVjdGlvbiBmaWxlIGFsb25lXG4gICAgICogY2Fubm90IHN1cHByZXNzIGl0LiBPbmx5IHRoaXMgc2V0dGluZyByZW1vdmVzIHRoZSBkaXJlY3RpdmUgYXQgaXRzIHNvdXJjZS4gQXV0byBtZW1vcnkgaXMgb25cbiAgICAgKiBieSBkZWZhdWx0LCBzbyBpdCBtdXN0IGJlIHR1cm5lZCBvZmYgZXhwbGljaXRseS5cbiAgICAgKi9cbiAgICBzZXR0aW5nczoge1xuICAgICAgYXR0cmlidXRpb246IHtcbiAgICAgICAgY29tbWl0OiAnJyxcbiAgICAgICAgcHI6ICcnLFxuICAgICAgICBzZXNzaW9uVXJsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBhdXRvTWVtb3J5RW5hYmxlZDogZmFsc2UsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHJlbGF0aXZlUGF0aDogJy5nZW1pbmkvc2V0dGluZ3MuanNvbicsXG4gICAgLy8gR2VtaW5pIENMSSBzdHJpcHMgY29tbWVudHMgYmVmb3JlIHBhcnNpbmcgaXRzIHNldHRpbmdzIGZpbGUsIHVubGlrZSBDbGF1ZGUgQ29kZSwgd2hpY2hcbiAgICAvLyByZWplY3RzIGEgY29tbWVudGVkIGZpbGUgYXMgbWFsZm9ybWVkLlxuICAgIGFjY2VwdHNDb21tZW50czogdHJ1ZSxcbiAgICBzZXR0aW5nczoge1xuICAgICAgZXhwZXJpbWVudGFsOiB7XG4gICAgICAgIGF1dG9NZW1vcnk6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBPdmVyd3JpdGVzIHRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGVzIG9mIGV2ZXJ5IHN1cHBvcnRlZCBhZ2VudCB3aXRoIHRoZSBmaXhlZCBjb250ZW50IGFuZFxuICogbWVyZ2VzIHRoZSBmaXhlZCBzZXR0aW5ncyBpbnRvIGVhY2ggYWdlbnQncyB1c2VyIHNldHRpbmdzLiBSZXR1cm5zIGZhbHNlIHdoZW4gYW55IGZpbGUgd2FzXG4gKiBza2lwcGVkIChlLmcuIGEgc3ltbGlua2VkIG9yIHVucGFyc2FibGUgZmlsZSksIHNvIHRoZSBjb21tYW5kIGNhbiBmYWlsIGxvdWRseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgbGV0IGhhc1dyaXR0ZW5BbGwgPSB0cnVlO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiB1c2VyQWdlbnRJbnN0cnVjdGlvbkZpbGVQYXRocykge1xuICAgIGNvbnN0IGhhc1dyaXR0ZW4gPSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCksIHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzV3JpdHRlbjtcbiAgfVxuICBmb3IgKGNvbnN0IHsgYWNjZXB0c0NvbW1lbnRzLCByZWxhdGl2ZVBhdGgsIHNldHRpbmdzIH0gb2YgYWdlbnRTZXR0aW5ncykge1xuICAgIC8vIEF3YWl0ZWQgc2VwYXJhdGVseTogYCYmPWAgd291bGQgc2tpcCB0aGUgbWVyZ2Ugb25jZSBhbiBlYXJsaWVyIGZpbGUgd2FzIHNraXBwZWQuXG4gICAgY29uc3QgaGFzTWVyZ2VkID0gYXdhaXQgbWVyZ2VBZ2VudFNldHRpbmdzKHJlbGF0aXZlUGF0aCwgc2V0dGluZ3MsIGFjY2VwdHNDb21tZW50cyk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzTWVyZ2VkO1xuICB9XG4gIHJldHVybiBoYXNXcml0dGVuQWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtZXJnZUFnZW50U2V0dGluZ3MoXG4gIHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuICBuZXdTZXR0aW5nczogb2JqZWN0LFxuICBhY2NlcHRzQ29tbWVudHM6IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgbGV0IGV4aXN0aW5nU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEFuIGFnZW50IGlnbm9yZXMgaXRzIHdob2xlIHNldHRpbmdzIGZpbGUgd2hlbiB0aGUgZmlsZSBicmVha3MgdGhlIGdyYW1tYXIgdGhlIGFnZW50IHJlYWRzIGl0XG4gICAgLy8gd2l0aCwgc28gd2JmeSBsZWF2ZXMgc3VjaCBhIGZpbGUgdG8gdGhlIGRldmVsb3BlciB0byByZXBhaXIgcmF0aGVyIHRoYW4gcmV3cml0aW5nIGl0IGludG8gYVxuICAgIC8vIGZpbGUgdGhlIGFnZW50IHN0aWxsIGlnbm9yZXM6IGNvbW1lbnRzIGFyZSB0b2xlcmF0ZWQgb25seSB3aGVyZSB0aGUgYWdlbnQgc3RyaXBzIHRoZW0sIGFuZFxuICAgIC8vIHRyYWlsaW5nIGNvbW1hcyBub3doZXJlLCBzaW5jZSBib3RoIGFnZW50cyBwYXJzZSB3aXRoIEpTT04ucGFyc2UgaW4gdGhlIGVuZC4gQ29tbWVudC1vbmx5XG4gICAgLy8gY29udGVudCBpcyBjaGVja2VkIHRvbywgYmVjYXVzZSBpdCBpcyBrZXB0IGFzIGEgaGVhZGVyIGFib3ZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LlxuICAgIGlmICghYWNjZXB0c0NvbW1lbnRzICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhpcyBhZ2VudCByZWFkcyBpdCBhcyBzdHJpY3QgSlNPTiwgY29tbWVudHMgYW5kIGFsbC5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oZXhpc3RpbmdDb250ZW50LCBmYWxzZSk7XG4gICAgICBpZiAoIXBhcnNlZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBhIHN0cmljdCBKU09OIG9iamVjdCAoYSB0cmFpbGluZyBjb21tYSwgZm9yIGV4YW1wbGUsIGlzIG5vdCBhbGxvd2VkKS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nU2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBtZXJnZShleGlzdGluZ1NldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gIC8vIE9ubHkgdGhlIHByb3BlcnRpZXMgd2hvc2UgdmFsdWUgY2hhbmdlcyBhcmUgcmV3cml0dGVuLCBzbyB0aGUgZmlsZSBrZWVwcyBpdHMgb3duIGZvcm1hdHRpbmdcbiAgLy8gYW5kLCB3aGVyZSB0aGUgYWdlbnQgYWxsb3dzIHRoZW0sIGl0cyBjb21tZW50cy5cbiAgY29uc3QgeyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfSA9IGpzb25jVXRpbC5zdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKGV4aXN0aW5nQ29udGVudCwgc2V0dGluZ3MpO1xuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzTG9zaW5nQ29tbWVudHMpIHtcbiAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICAgIC8vIC52c2NvZGUvc2V0dGluZ3MuanNvbiBpcyBKU09OQyBieSBkZWZpbml0aW9uOyBKU09OLnBhcnNlIHdvdWxkIG1ha2Ugd2JmeSBzaWxlbnRseSBza2lwXG4gICAgLy8gY29tbWVudGVkIGZpbGVzLlxuICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShwYXJzZWRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICBsZXQgc2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICB9XG4gICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHNldHRpbmdzLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuaW50ZXJmYWNlIEZub3hUb21sU3VidHJlZSB7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgdW5kZWZpbmVkPjtcbn1cblxuLy8gVGhlIGZvdXIgc3RhbmRhcmQgV0JfRU5WIG1vZGVzOyBzdGFnaW5nIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGNvbXBsZXRlZCB3aGVuIHRoZSByZXBvc2l0b3J5XG4vLyBhbHJlYWR5IGRlY2xhcmVzIHRoZSBzdGFnaW5nIHByb2ZpbGUuXG5jb25zdCB3YkVudk1vZGVzID0gWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddIGFzIGNvbnN0O1xudHlwZSBXYkVudk1vZGUgPSAodHlwZW9mIHdiRW52TW9kZXMpW251bWJlcl07XG5cbi8qKlxuICogRW5zdXJlcyBhIGZub3ggcmVwb3NpdG9yeSBkZWZpbmVzIFdCX0VOViBmb3IgZXZlcnkgc3RhbmRhcmQgbW9kZSAoYW5kIE5FWFRfUFVCTElDX1dCX0VOViB3aGVuXG4gKiBhbnkgd29ya3NwYWNlIGRlcGVuZHMgb24gTmV4dC5qcyBvciB2aW5leHQpIGluIGZub3gudG9tbCBwcm9maWxlcy4gRXhpc3RpbmcgZGVmaW5pdGlvbnMgYXJlXG4gKiBhbHdheXMgbGVmdCB1bnRvdWNoZWQuIE5vbi1mbm94IHJlcG9zaXRvcmllcyBhcmUgc2tpcHBlZDogLmVudiBmaWxlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2Vuc3VyZVdiRW52RGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmVlZHNOZXh0UHVibGljID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZykpO1xuICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAvLyBsc3RhdCwgbm90IGV4aXN0c1N5bmM6IGV4aXN0c1N5bmMgaXMgZmFsc2UgZm9yIGEgREFOR0xJTkcgZm5veC50b21sIHN5bWxpbms7IGFueSBmbm94LnRvbWxcbiAgICAvLyBkaXJlY3RvcnkgZW50cnkgbWFya3MgYSBmbm94IHJlcG9zaXRvcnksIGFuZCBhIHJlZnVzZWQvZGFuZ2xpbmcgb25lIGFib3J0cyBpbnN0ZWFkIG9mXG4gICAgLy8gYmVpbmcgdHJlYXRlZCBhcyBhIG5vbi1mbm94IHJlcG9zaXRvcnkgd2hpbGUgdGhlIGZub3ggc3luY2hyb25pemF0aW9uIGlzIGZhaWxpbmcuXG4gICAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZm5veFRvbWxQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZm5veFRvbWxQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50LCBuZWVkc05leHRQdWJsaWMpO1xuICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWlycm9ycyB3YidzIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52IGNvbnRyYWN0IChwYWNrYWdlcy93Yi9zcmMvcHJvamVjdC50cyk6IHRoZSBmcmFtZXdvcmsgbWF5XG4gKiBiZSBkZWNsYXJlZCBpbiBBTlkgb2YgdGhlIGZvdXIgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBgbmV4dGAgYXMgYSBkZXZEZXBlbmRlbmN5IGluIGEgc2hhcmVkXG4gKiBjb21wb25lbnQgbGlicmFyeSksIHdoaWxlIHdiZnkncyBgZGVwZW5kaW5nLm5leHRgIGxvb2tzIG9ubHkgYXQgcmVndWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXS5zb21lKChzZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gY29uZmlnLnBhY2thZ2VKc29uPy5bc2VjdGlvbiBhcyAnZGVwZW5kZW5jaWVzJ107XG4gICAgcmV0dXJuICEhZGVwZW5kZW5jaWVzPy5bJ25leHQnXSB8fCAhIWRlcGVuZGVuY2llcz8uWyd2aW5leHQnXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBtaXNzaW5nIFdCX0VOViAoYW5kIG9wdGlvbmFsbHkgTkVYVF9QVUJMSUNfV0JfRU5WKSBlbnRyaWVzIGludG8gYSBmbm94LnRvbWw6IHRoZSBiYXNlXG4gKiBgW3NlY3JldHNdYCB0YWJsZSBjYXJyaWVzIHRoZSBkZXZlbG9wbWVudCBkZWZhdWx0cyBhbmQgYFtwcm9maWxlcy48bW9kZT4uc2VjcmV0c11gIG92ZXJsYXlzXG4gKiBlYWNoIG90aGVyIG1vZGUsIG1hdGNoaW5nIHRoZSBvcmctc3RhbmRhcmQgbGF5b3V0LiBGb3JtYXR0aW5nIGFuZCBjb21tZW50cyBhcmUgcHJlc2VydmVkOyBvbmx5XG4gKiBtaXNzaW5nIGxpbmVzIGFyZSBpbnNlcnRlZCBvciBtaXNzaW5nIHNlY3Rpb25zIGFwcGVuZGVkLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjb250ZW50XG4gKiBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZCAodW5wYXJzYWJsZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGVkaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudDogc3RyaW5nLCBuZWVkc05leHRQdWJsaWM6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2V0dGluZ3M6IEZub3hUb21sU3VidHJlZTtcbiAgdHJ5IHtcbiAgICBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSBpdCBpcyBub3QgcGFyc2FibGUgYXMgVE9NTC4nKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qga2V5TmFtZXMgPSBuZWVkc05leHRQdWJsaWMgPyBbJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSA6IFsnV0JfRU5WJ107XG4gIGxldCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgLy8gVGhlIHN0YWdpbmcgbW9kZSBpcyBvcHRpb25hbDogY29tcGxldGUgaXQgb25seSB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgZGVjbGFyZXMgdGhlIHByb2ZpbGUuXG4gICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHNldHRpbmdzLnNlY3JldHMgOiBzZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBrZXlOYW1lcykge1xuICAgICAgY29uc3QgZGVmaW5lZCA9IGRlZmluZWRLZXlzPy5ba2V5TmFtZV07XG4gICAgICBjb25zdCBkZWZpbmVkVmFsdWUgPVxuICAgICAgICB0eXBlb2YgZGVmaW5lZCA9PT0gJ3N0cmluZycgPyBkZWZpbmVkIDogKGRlZmluZWQgYXMgeyBkZWZhdWx0PzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZGVmYXVsdDtcbiAgICAgIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWUsIGRlZmluZWRWYWx1ZSwgbW9kZSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmdMaW5lcyA9IGtleU5hbWVzXG4gICAgICAuZmlsdGVyKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChrZXlOYW1lKSA9PiBgJHtrZXlOYW1lfSA9IHsgZGVmYXVsdCA9IFwiJHttb2RlfVwiIH1gKTtcbiAgICBpZiAobWlzc2luZ0xpbmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRJbnRvRm5veFNlY3Rpb24oXG4gICAgICB1cGRhdGVkQ29udGVudCxcbiAgICAgIG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyAnc2VjcmV0cycgOiBgcHJvZmlsZXMuJHttb2RlfS5zZWNyZXRzYCxcbiAgICAgIG1pc3NpbmdMaW5lc1xuICAgICk7XG4gIH1cbiAgaWYgKHVwZGF0ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm4gY29udGVudDtcblxuICAvLyBSZS1wYXJzZSBiZWZvcmUgcmV0dXJuaW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cyB3aXRob3V0IGEgdGFibGUgaGVhZGVyKSBjb3VsZFxuICAvLyBtYWtlIHRoZSB0ZXh0dWFsIGVkaXQgcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZTsgZmFpbCBzYWZlbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKHVwZGF0ZWRDb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHVwZGF0ZWRTZXR0aW5ncy5zZWNyZXRzIDogdXBkYXRlZFNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgICBpZiAoa2V5TmFtZXMuc29tZSgoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnNlcnRlZCAke21vZGV9IGVudHJpZXMgZGlkIG5vdCB0YWtlIGVmZmVjdGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQ29udGVudDtcbn1cblxuLyoqXG4gKiBXYXJucyB3aGVuIGFuIGV4aXN0aW5nIFdCX0VOVi1mYW1pbHkgZGVmaW5pdGlvbiBuYW1lcyBhIGRpZmZlcmVudCBtb2RlIHRoYW4gdGhlIG9uZSBpdCBpc1xuICogZGVmaW5lZCBmb3IgKGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCBvciBgcHJvZHVjdGlvbjFgLCBvciBhIGNvcHktcGFzdGVkIHdyb25nIG1vZGUpOiB3YlxuICogcmVqZWN0cyBub24tc3RhbmRhcmQgdmFsdWVzIGF0IHJ1bnRpbWUsIHNvIHN1cmZhY2luZyB0aGUgbWlzbWF0Y2ggZHVyaW5nIHdiZnkgaXMgdGhlIGVhcmxpZXN0XG4gKiBwb3NzaWJsZSBzaWduYWwuIFRoZSBwYXNzZWQgdmFsdWUgaXMgYWx3YXlzIHBsYWludGV4dCAoYSBmbm94IGBkZWZhdWx0YCBmaWVsZCkg4oCUIGVuY3J5cHRlZFxuICogZm5veCBlbnRyaWVzIGFyZSBgeyBwcm92aWRlciwgdmFsdWUgfWAgb2JqZWN0cyB3aG9zZSBgZGVmYXVsdGAgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBtb2RlOiBXYkVudk1vZGUpOiB2b2lkIHtcbiAgLy8gQW4gRU1QVFkgdmFsdWUgY291bnRzIGFzIHVuc2V0ICh3YiBzdXBwbGllcyB0aGUgZmFsbGJhY2sgbW9kZSksIG5vdCBhcyBhIG1pc21hdGNoaW5nIG1vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbW9kZSkgcmV0dXJuO1xuICAvLyBBIGR5bmFtaWMgdmFsdWUgKGUuZy4gYE5FWFRfUFVCTElDX1dCX0VOVj0ke1dCX0VOVn1gKSBtYXkgbGVnaXRpbWF0ZWx5IHJlc29sdmUgdG8gdGhlIG1vZGVcbiAgLy8gdGhyb3VnaCBleHBhbnNpb24sIHdoaWNoIHRoaXMgc3RhdGljIGNoZWNrIGNhbm5vdCBldmFsdWF0ZSDigJQgc2tpcCBpbnN0ZWFkIG9mIG1pc2ZpcmluZy5cbiAgLy8gZm5veCBleHBhbmRzIG9ubHkgYCR7Li4ufWAgKGEgYmFyZSBgJFVOU0VUYCBzdGF5cyBsaXRlcmFsKS5cbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCckeycpKSByZXR1cm47XG4gIGlmIChrZXlOYW1lID09PSAnTkVYVF9QVUJMSUNfV0JfRU5WJykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2Igb3ZlcnJpZGVzIGl0IHdpdGggV0JfRU5WLCBidXQgYSBkaXJlY3QgZnJhbWV3b3JrIGJ1aWxkIHdvdWxkIGlubGluZSB0aGlzIHZhbHVlLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiByZWplY3RzIHZhbHVlcyBvdXRzaWRlIGRldmVsb3BtZW50L3Rlc3Qvc3RhZ2luZy9wcm9kdWN0aW9uLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGxpbmVzIGF0IHRoZSB0b3Agb2YgYSBUT01MIHNlY3Rpb24sIHJpZ2h0IGFmdGVyIGl0cyBgW2hlYWRlcl1gIGxpbmUgc28gcHJvZmlsZS1zcGVjaWZpY1xuICogZW50cmllcyBzdGF5IGdyb3VwZWQgd2l0aCB0aGVpciBoZWFkZXI7IHRoZSBzZWN0aW9uIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQgd2hlbiBpdCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEludG9Gbm94U2VjdGlvbihjb250ZW50OiBzdHJpbmcsIHNlY3Rpb25OYW1lOiBzdHJpbmcsIGluc2VydGVkTGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgLy8gd2JmeSB3cml0ZXMgdGhlIGhlYWRlciB3aXRob3V0IHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkb3R0ZWQta2V5IGNvbXBvbmVudHMuXG4gIGNvbnN0IGhlYWRlclBhdHRlcm4gPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXlxccypcXFske3NlY3Rpb25OYW1lLnJlcGxhY2VBbGwoJy4nLCBTdHJpbmcucmF3YFxcLmApfVxcXVxccyooPzojLiopPyRgLCAndScpO1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gaGVhZGVyUGF0dGVybi50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bJHtzZWN0aW9uTmFtZX1dXFxuJHtpbnNlcnRlZExpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCArIDEpLCAuLi5pbnNlcnRlZExpbmVzLCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEpXS5qb2luKCdcXG4nKTtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBydW5BbGxJblBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8qKlxuICogUmVwb3NpdG9yaWVzIG91dHNpZGUgV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGVcbiAqIHdvcmtmbG93czogdGhvc2Ugd29ya2Zsb3dzIGRlcGVuZCBvbiBvcmdhbml6YXRpb24gc2VjcmV0cyAoVkVSREFDQ0lPX1RPS0VOLCBEaXNjb3JkIHdlYmhvb2tzKVxuICogYW5kIHNlbGYtaG9zdGVkIHJ1bm5lcnMgdGhhdCBvdGhlciBvd25lcnMgZG8gbm90IGhhdmUuIFRoaXMgZ2VuZXJhdG9yIGluc3RlYWQgZW1pdHNcbiAqIHNlbGYtY29udGFpbmVkIHdvcmtmbG93cyBidWlsdCBvbmx5IGZyb20gd2hhdCBhbnkgcmVwb3NpdG9yeSBvd25lciBjYW4gcHJvdmlkZTogdGhlIHJlcG9zaXRvcnlcbiAqIGNvbnRlbnRzIChtaXNlLnRvbWwsIHBhY2thZ2UuanNvbiBzY3JpcHRzKSBhbmQgdGhlIHNpbmdsZSBgRk5PWF9BR0VfS0VZYCByZXBvc2l0b3J5IHNlY3JldCB3aGVuXG4gKiB0aGUgcmVwb3NpdG9yeSB1c2VzIGZub3guIEdlbmVyYXRpb24gaXMga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3NcbiAqIGlkZW50aXR5LCBzbyBpdCB3b3JrcyBmb3IgYXJiaXRyYXJ5IHBlcnNvbmFsIHJlcG9zaXRvcmllcy5cbiAqL1xuXG4vKiogRmlyc3QgbGluZSBvZiBldmVyeSBnZW5lcmF0ZWQgZmlsZTsgZmlsZXMgd2l0aG91dCBpdCBhcmUgaGFuZC13cml0dGVuIGFuZCBuZXZlciB0b3VjaGVkLiAqL1xuZXhwb3J0IGNvbnN0IHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5Lic7XG5cbi8vIFNhbWUgcGlucyBhcyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzIC8gdGhlaXIgY29uc3VtZXJzOyBSZW5vdmF0ZSB1cGRhdGVzIHRoZW0gaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5LlxuY29uc3QgY2hlY2tvdXRBY3Rpb24gPSAnYWN0aW9ucy9jaGVja291dEB2Ny4wLjEnO1xuY29uc3QgbWlzZUFjdGlvbiA9ICdqZHgvbWlzZS1hY3Rpb25AdjQuMi4zJztcbmNvbnN0IGNhY2hlQWN0aW9uID0gJ2FjdGlvbnMvY2FjaGVAdjYuMS4wJztcbmNvbnN0IHVwbG9hZEFydGlmYWN0QWN0aW9uID0gJ2FjdGlvbnMvdXBsb2FkLWFydGlmYWN0QHY3LjAuMSc7XG4vLyB2Ni4xLjE7IHRoZSBzYW1lIHBpbiBhcyB0aGUgcmV1c2FibGUgc2VtYW50aWMtcHIgd29ya2Zsb3cuXG5jb25zdCBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uID0gJ2FtYW5ubi9hY3Rpb24tc2VtYW50aWMtcHVsbC1yZXF1ZXN0QDQ1YjllZDdjZjI0MDg3YTJmNzc4NWJmNTViZTk3Mzk0YmE4N2UxYzInO1xuLy8gdjMuMC4zOyBkZXBsb3lzIGFyZSBuZXR3b3JrLWhlYXZ5IGFuZCBiZW5lZml0IGZyb20gcmV0cmllcyB3aXRoIGEgbG9uZyB0aW1lb3V0LlxuY29uc3QgcmV0cnlBY3Rpb24gPSAnbmljay1maWVsZHMvcmV0cnlAZGQ1NmYxY2E4Y2E5OTFlMjM4NWMxOGFiNmRkMzZlYTdmOWZkYjU1Zic7XG5cbi8qKlxuICogSm9iLWxldmVsIGVudiB0aGF0IHR1cm5zIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwYXRoIG9uLCBtaXJyb3JpbmcgdGhlIHJldXNhYmxlIHdvcmtmbG93cy5cbiAqXG4gKiBgc2VjcmV0c2AgaXMgdW5hdmFpbGFibGUgaW4gYSBzdGVwLWxldmVsIGBpZjpgLCBzbyB0aGUgcHJlc2VuY2Ugb2YgdGhlIHRva2VuIGlzIGV4cG9zZWQgYXMgYVxuICogbm9uLXNlY3JldCBzaWduYWw7IGFuIHVuc2V0IHNlY3JldCBleHBhbmRzIHRvIGBmYWxzZWAgYW5kIGxlYXZlcyBldmVyeSBHdWFyZCBzdGVwIHNraXBwZWQsIHdoaWNoXG4gKiBpcyB3aGF0IGtlZXBzIHRoZSBnZW5lcmF0ZWQgd29ya2Zsb3dzIHJ1bm5hYmxlIGluIGEgcmVwb3NpdG9yeSB0aGF0IG5ldmVyIHJlZ2lzdGVycyB0aGUgc2VjcmV0LlxuICogVEFLVU1JX0dVQVJEX1RPS0VOIGl0c2VsZiBpcyBkZWZpbmVkLWJ1dC1FTVBUWSBqb2Itd2lkZSBzbyB0aGUgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlXG4gKiBpbiB0aGUgZ2VuZXJhdGVkIC5ucG1yYyBzdGlsbCBleHBhbmRzICh0byAnJykgaW4gdGhlIHN0ZXBzIHRoYXQgZGVsaWJlcmF0ZWx5IHJ1biB3aXRob3V0IHRoZVxuICogdG9rZW47IGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZCB2YXJpYWJsZSBpcyB3aGF0IGJyZWFrcyBhbiBpbnN0YWxsLCBhbiBlbXB0eSBvbmUgaXMgZmluZS5cbiAqL1xuY29uc3QgZ3VhcmRKb2JFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEhBU19UQUtVTUlfR1VBUkRfVE9LRU46ICcke3sgISFzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScsXG4gIFRBS1VNSV9HVUFSRF9UT0tFTjogJycsXG59O1xuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgdXNlcz86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICAnd29ya2luZy1kaXJlY3RvcnknPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25jdXJyZW5jeT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgeyAncnVucy1vbic6IHN0cmluZzsgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBzdGVwczogU3RlcFtdIH1cbiAgPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtyb290Q29uZmlnXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCB1c2VzRm5veCA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICBjb25zdCB3b3JrZmxvd0J5RmlsZU5hbWU6IFJlY29yZDxzdHJpbmcsIFdvcmtmbG93PiA9IHtcbiAgICAgICd0ZXN0LnltbCc6IGJ1aWxkVGVzdFdvcmtmbG93KHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzLCB1c2VzRm5veCksXG4gICAgICAnc2VtYW50aWMtcHIueW1sJzogYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKSxcbiAgICB9O1xuICAgIC8vIERlcGxveSB3b3JrZmxvd3MgYXJlIGdlbmVyYXRlZCBwZXIgZGVwbG95IHNjcmlwdCB0aGUgcmVwb3NpdG9yeSBkZWNsYXJlcywgc28gYSByZXBvc2l0b3J5XG4gICAgLy8gd2l0aG91dCBhIHN0YWdpbmcgZW52aXJvbm1lbnQgc2ltcGx5IGdldHMgbm8gc3RhZ2luZyB3b3JrZmxvdy4gT25seSBzY3JpcHRzIHRoYXQgaW52b2tlXG4gICAgLy8gYHdiIGRlcGxveWAgcXVhbGlmeTogYSBiZXNwb2tlIGRlcGxveSBzY3JpcHQgbWF5IG5vdCBiZSBzYWZlIHRvIHRyaWdnZXIgYXV0b21hdGljYWxseVxuICAgIC8vIChkZXBsb3ktc3RhZ2luZyBydW5zIG9uIGV2ZXJ5IHB1c2ggdG8gdGhlIGRlZmF1bHQgYnJhbmNoKS5cbiAgICBjb25zdCBzY3JpcHRzID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPSBpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveSddKTtcbiAgICBpZiAoaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93KSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1wcm9kdWN0aW9uLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygncHJvZHVjdGlvbicsICdkZXBsb3knLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveTpzdGFnaW5nJ10pKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1zdGFnaW5nLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygnc3RhZ2luZycsICdkZXBsb3k6c3RhZ2luZycsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSAmJiByb290Q29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydyZWxlYXNlLnltbCddID0gYnVpbGRSZWxlYXNlV29ya2Zsb3cocm9vdENvbmZpZywgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93LCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGF3YWl0IHJ1bkFsbEluUG9vbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdvcmtmbG93QnlGaWxlTmFtZSkubWFwKFxuICAgICAgICAoW2ZpbGVOYW1lLCB3b3JrZmxvd10pID0+XG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksIHdvcmtmbG93KVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhmaWxlUGF0aDogc3RyaW5nLCB3b3JrZmxvdzogV29ya2Zsb3cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgLy8gVW5saWtlIFdpbGxCb29zdGVyLW9yZ2FuaXphdGlvbiByZXBvc2l0b3JpZXMsIHdiZnkgZG9lcyBub3Qgb3duIGFyYml0cmFyeSByZXBvc2l0b3JpZXMnIENJOlxuICAvLyBvbmx5IGZpbGVzIGl0IGdlbmVyYXRlZCAoaWRlbnRpZmllZCBieSB0aGUgbWFya2VyKSBhcmUgcmVnZW5lcmF0ZWQsIGFuZCBoYW5kLXdyaXR0ZW5cbiAgLy8gd29ya2Zsb3dzIGFyZSBuZXZlciB0b3VjaGVkLiBPd25lcnMgb3B0IG91dCBwZXJtYW5lbnRseSBieSByZW1vdmluZyB0aGUgbWFya2VyIGxpbmUuXG4gIC8vIEFuIGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSBmaWxlIGNhcnJpZXMgbm8gaGFuZC13cml0dGVuIGNvbnRlbnQsIHNvIGl0IGlzIHRyZWF0ZWQgYXMgYWJzZW50LlxuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG9sZENvbnRlbnQudHJpbSgpICE9PSAnJyAmJiAhb2xkQ29udGVudC5zdGFydHNXaXRoKHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBgJHtzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXJ9IFJlbW92ZSB0aGlzIGxpbmUgdG8gc3RvcCB3YmZ5IGZyb20gb3ZlcndyaXRpbmcgdGhpcyBmaWxlLlxcbmA7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKHdvcmtmbG93LCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgaGVhZGVyICsgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiB3b3JraW5nRGlyKGRpclBhdGg6IHN0cmluZyk6IFBpY2s8U3RlcCwgJ3dvcmtpbmctZGlyZWN0b3J5Jz4ge1xuICByZXR1cm4gZGlyUGF0aCA/IHsgJ3dvcmtpbmctZGlyZWN0b3J5JzogZGlyUGF0aCB9IDoge307XG59XG5cbmZ1bmN0aW9uIGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2IgZGVwbG95XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBidWlsZFRlc3RXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbFBhY2thZ2VDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sIHVzZXNGbm94OiBib29sZWFuKTogV29ya2Zsb3cge1xuICAvLyBQbGF5d3JpZ2h0IG1heSBiZSBkZWNsYXJlZCBvbmx5IGluIHdvcmtzcGFjZSBwYWNrYWdlczsgYHdiIHRlc3Qtb24tY2lgIHJ1bnMgZXZlcnkgZGVjbGFyaW5nXG4gIC8vIHBhY2thZ2UncyBlMmUgdGVzdHMsIHNvIHRoZSB3b3JrZmxvdyBtdXN0IGluc3RhbGwgYnJvd3NlcnMgZm9yIGVhY2ggb2YgdGhlbSAodGhlaXIgdmVyc2lvbnNcbiAgLy8gbWF5IGRpZmZlciwgYW5kIGVhY2ggbGlicmFyeSB2ZXJzaW9uIHJlcXVpcmVzIGl0cyBtYXRjaGluZyBicm93c2VyIGJpbmFyaWVzKS4gQnVuJ3MgaXNvbGF0ZWRcbiAgLy8gbGlua2VyIHJlc29sdmVzIHRoZSBwbGF5d3JpZ2h0IGJpbmFyeSBvbmx5IGZyb20gdGhlIGRlY2xhcmluZyBwYWNrYWdlLCBoZW5jZSB0aGVcbiAgLy8gd29ya2luZy1kaXJlY3Rvcnkgb24gZXZlcnkgc3RlcC4gVGhlIGJyb3dzZXJzIGxhbmQgaW4gfi8uY2FjaGUvbXMtcGxheXdyaWdodCwgc2hhcmVkIGFjcm9zc1xuICAvLyB3b3Jrc3BhY2VzLCBzbyBzYW1lLXZlcnNpb24gaW5zdGFsbHMgbmF0dXJhbGx5IGRlZHVwbGljYXRlLlxuICBjb25zdCBwbGF5d3JpZ2h0RGlyUGF0aHMgPSBbLi4uYWxsUGFja2FnZUNvbmZpZ3NdXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLmRpclBhdGgubG9jYWxlQ29tcGFyZShiLmRpclBhdGgpKVxuICAgIC5maWx0ZXIoKHBhY2thZ2VDb25maWcpID0+IHBhY2thZ2VDb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KVxuICAgIC5tYXAoKHBhY2thZ2VDb25maWcpID0+IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VDb25maWcuZGlyUGF0aCkpO1xuICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieSBgYnVuIGluc3RhbGxgXG4gIC8vIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gIGNvbnN0IGZub3hFbnY6IFBpY2s8U3RlcCwgJ2Vudic+ID0gdXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9O1xuXG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiB9LFxuICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKHRydWUpLFxuICAgIC4uLihwbGF5d3JpZ2h0RGlyUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyAoW1xuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgsIGluZGV4KTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgbmFtZTogYEdldCBQbGF5d3JpZ2h0IHZlcnNpb24ke2RpclBhdGggPyBgICgke2RpclBhdGh9KWAgOiAnJ31gLFxuICAgICAgICAgICAgLy8gVGhlIElOU1RBTExFRCB2ZXJzaW9uLCBub3QgdGhlIHBhY2thZ2UuanNvbiBzcGVjaWZpZXI6IGEgcmFuZ2UgbGlrZSBgXjEuNDUuMGBcbiAgICAgICAgICAgIC8vIHN0YXlzIHVuY2hhbmdlZCBhY3Jvc3MgbG9ja2ZpbGUgdXBkYXRlcywgc28ga2V5aW5nIHRoZSBjYWNoZSBvbiBpdCB3b3VsZCByZXN0b3JlXG4gICAgICAgICAgICAvLyBzdGFsZSBicm93c2VycyB0aGF0IG5vIGxvbmdlciBtYXRjaCB0aGUgbGlicmFyeS4gUnVucyBhZnRlciBgYnVuIGluc3RhbGxgLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIHBhY2thZ2UgaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSdzIGRpcmVjdG9yeS5cbiAgICAgICAgICAgIGlkOiBgcGxheXdyaWdodC12ZXJzaW9uLSR7aW5kZXh9YCxcbiAgICAgICAgICAgIHJ1bjogJ2VjaG8gXCJ2ZXJzaW9uPSQoYnVuIC1lIFwidHJ5IHsgY29uc29sZS5sb2cocmVxdWlyZShcXCdAcGxheXdyaWdodC90ZXN0L3BhY2thZ2UuanNvblxcJykudmVyc2lvbikgfSBjYXRjaCB7fVwiKVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQ2FjaGUgUGxheXdyaWdodCBicm93c2VycycsXG4gICAgICAgICAgICBpZDogJ3BsYXl3cmlnaHQtY2FjaGUnLFxuICAgICAgICAgICAgdXNlczogY2FjaGVBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHBhdGg6ICd+Ly5jYWNoZS9tcy1wbGF5d3JpZ2h0JyxcbiAgICAgICAgICAgICAga2V5OiBgcGxheXdyaWdodC1cXCR7eyBydW5uZXIub3MgfX0tJHtwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChfLCBpbmRleCkgPT4gYFxcJHt7IHN0ZXBzLnBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fS5vdXRwdXRzLnZlcnNpb24gfX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCctJyl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoKTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCAhPSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgYnJvd3NlcnMgc3RpbGwgbmVlZCB0aGVpciBzeXN0ZW0gZGVwZW5kZW5jaWVzIG9uIGEgZnJlc2ggcnVubmVyLlxuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwtZGVwcycsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgOiBbXSksXG4gICAgLi4uKGhhc1R5cGVjaGVjayA/IFt7IHJ1bjogJ2J1biBydW4gdHlwZWNoZWNrJywgLi4uZm5veEVudiB9XSA6IFtdKSxcbiAgICB7IHJ1bjogJ2J1biBydW4gbGludCcsIC4uLmZub3hFbnYgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVGVzdCcsXG4gICAgICBpZDogJ3Rlc3QnLFxuICAgICAgcnVuOiBgaWYgW1sgXCIkVVBMT0FEX1RFU1RfTE9HXCIgIT0gXCJ0cnVlXCIgXV07IHRoZW5cbiAgZXhlYyBidW4gcnVuIHRlc3QvY2lcbmZpXG5sb2dfZGlyPSQobWt0ZW1wIC1kIFwiJFJVTk5FUl9URU1QL3Rlc3Qtb3V0cHV0LlhYWFhYWFwiKVxuZWNobyBcImxvZ19wYXRoPSRsb2dfZGlyL3Rlc3QubG9nXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXG4jIEtlZXAgZHJhaW5pbmcgdGVzdCBvdXRwdXQgd2hlbiB0aGUgbG9nIHJlYWNoZXMgYSBmaWxlLXNpemUgbGltaXQuXG5zZXQgK2VcbmJ1biBydW4gdGVzdC9jaSAyPiYxIHwgKHRyYXAgJycgWEZTWjsgdGVlIFwiJGxvZ19kaXIvdGVzdC5sb2dcIilcbnRlc3Rfc3RhdHVzPShcIlxcJHtQSVBFU1RBVFVTW0BdfVwiKVxuaWYgKCggdGVzdF9zdGF0dXNbMF0gIT0gMCApKTsgdGhlbiBleGl0IFwiXFwke3Rlc3Rfc3RhdHVzWzBdfVwiOyBmaVxuZXhpdCBcIlxcJHt0ZXN0X3N0YXR1c1sxXX1cImAsXG4gICAgICBlbnY6IHsgLi4uZm5veEVudi5lbnYsIFVQTE9BRF9URVNUX0xPRzogJyR7eyB2YXJzLlVQTE9BRF9URVNUX0xPRyB9fScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCBsb2cnLFxuICAgICAgaWY6IFwiJHt7IGFsd2F5cygpICYmIHZhcnMuVVBMT0FEX1RFU1RfTE9HID09ICd0cnVlJyAmJiBzdGVwcy50ZXN0Lm91dHB1dHMubG9nX3BhdGggIT0gJycgfX1cIixcbiAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgd2l0aDoge1xuICAgICAgICBuYW1lOiAndGVzdC1vdXRwdXQtJHt7IHJ1bm5lci5vcyB9fS0ke3sgam9iLmNoZWNrX3J1bl9pZCB9fS0ke3sgZ2l0aHViLnJ1bl9hdHRlbXB0IH19JyxcbiAgICAgICAgcGF0aDogJyR7eyBzdGVwcy50ZXN0Lm91dHB1dHMubG9nX3BhdGggfX0nLFxuICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgJ2lmLW5vLWZpbGVzLWZvdW5kJzogJ2Vycm9yJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCByZXN1bHRzJyxcbiAgICAgICAgICAgIGlmOiAnJHt7IGFsd2F5cygpIH19JyxcbiAgICAgICAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBuYW1lOiAndGVzdC1yZXN1bHRzJyxcbiAgICAgICAgICAgICAgLy8gRXZlcnkgZGVjbGFyaW5nIHBhY2thZ2Ugd3JpdGVzIGl0cyBvd24gdGVzdC1yZXN1bHRzIGRpcmVjdG9yeTsgYSBuZXdsaW5lLXNlcGFyYXRlZFxuICAgICAgICAgICAgICAvLyBsaXN0IHVwbG9hZHMgdGhlbSBhbGwuXG4gICAgICAgICAgICAgIHBhdGg6IHBsYXl3cmlnaHREaXJQYXRoc1xuICAgICAgICAgICAgICAgIC5tYXAoKGRpclBhdGgpID0+IChkaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICd0ZXN0LXJlc3VsdHMnKSA6ICd0ZXN0LXJlc3VsdHMnKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdpZ25vcmUnLFxuICAgICAgICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgOiBbXSksXG4gIF07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6ICdyZWFkJyB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBGT1JDRV9DT0xPUjogJzMnLCBXQl9FTlY6ICd0ZXN0JywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHMsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95V29ya2Zsb3coZW52aXJvbm1lbnQ6ICdzdGFnaW5nJyB8ICdwcm9kdWN0aW9uJywgc2NyaXB0TmFtZTogc3RyaW5nLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBgRGVwbG95IGFwcCBvbiAke2Vudmlyb25tZW50fWAsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgICAgLy8gUHJvZHVjdGlvbiBkZXBsb3lzIGZvbGxvdyBwdWJsaXNoZWQgcmVsZWFzZXMgKHNlZSB0aGUgcmVsZWFzZSB3b3JrZmxvdydzIHRyaWdnZXIgc3RlcCk7XG4gICAgICAvLyBzdGFnaW5nIGNvbnZlcmdlcyBvbiBldmVyeSBkZWZhdWx0LWJyYW5jaCBwdXNoLlxuICAgICAgLi4uKGVudmlyb25tZW50ID09PSAncHJvZHVjdGlvbidcbiAgICAgICAgPyB7IHJlbGVhc2U6IHsgdHlwZXM6IFsncHVibGlzaGVkJ10gfSB9XG4gICAgICAgIDogeyBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSwgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddIH0gfSksXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICBkZXBsb3k6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBXQl9FTlY6IGVudmlyb25tZW50LCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIC8vIGZldGNoLWRlcHRoIDAgc28gYGdpdCBkZXNjcmliZWAgc2VlcyB0aGUgdGFncyBXQl9WRVJTSU9OIGlzIGRlcml2ZWQgZnJvbS5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZXQgV0JfVkVSU0lPTicsXG4gICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbldCX1ZFUlNJT049JChnaXQgZGVzY3JpYmUgLS1hbHdheXMgLS10YWdzKVxcbmVjaG8gXCJXQl9WRVJTSU9OPSRXQl9WRVJTSU9OXCIgPj4gXCIkR0lUSFVCX0VOVlwiJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnRGVwbG95JyxcbiAgICAgICAgICAgIHVzZXM6IHJldHJ5QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICB0aW1lb3V0X21pbnV0ZXM6IDYwLFxuICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHM6IDUsXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFN0ZXAtc2NvcGVkIGxpa2UgdGhlIHRlc3Qgd29ya2Zsb3c6IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgcnVuIGJ5XG4gICAgICAgICAgICAvLyBgYnVuIGluc3RhbGxgIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gICAgICAgICAgICAuLi4odXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbGVhc2VXb3JrZmxvdyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3c6IGJvb2xlYW4sXG4gIHVzZXNGbm94OiBib29sZWFuXG4pOiBXb3JrZmxvdyB7XG4gIGNvbnN0IGZub3hFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB1c2VzRm5veCA/IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IDoge307XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbLi4uY29uZmlnLnJlbGVhc2UuYnJhbmNoZXNdIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgZGlzcGF0Y2hpbmcgdGhlIHByb2R1Y3Rpb24gZGVwbG95IHdvcmtmbG93IGFmdGVyIGEgcmVsZWFzZVxuICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA/IHsgYWN0aW9uczogJ3dyaXRlJyB9IDoge30pLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gUmVsZWFzZXMgYnVpbGQgcHJvZHVjdGlvbiBhcnRpZmFjdHMsIGhlbmNlIHRoZSBlbnZpcm9ubWVudCDigJQgdGhlIHNhbWUgZGVmYXVsdCBhcyB0aGVcbiAgICAgICAgLy8gcmV1c2FibGUgcmVsZWFzZSB3b3JrZmxvdy4gd2IncyBDSSBndWFyZCBhbHNvIHJlcXVpcmVzIGFuIGV4cG9ydGVkIFdCX0VOViwgc28gd2l0aG91dFxuICAgICAgICAvLyBpdCBhIGBwb3N0aW5zdGFsbGAgdGhhdCBjYWxscyB3YiAoZS5nLiBgd2IgZ2VuLWNvZGVgKSBleGl0cyAxIGJlZm9yZSBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICAgIC8vIHJ1bnMuXG4gICAgICAgIGVudjogeyBXQl9FTlY6ICdwcm9kdWN0aW9uJywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwOiBzZW1hbnRpYy1yZWxlYXNlIHJlYWRzIHRoZSBmdWxsIGhpc3RvcnkgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLlxuICAgICAgICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24sIHdpdGg6IHsgJ2ZldGNoLWRlcHRoJzogMCB9IH0sXG4gICAgICAgICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgICAgICAgLi4uYnVpbGRJbnN0YWxsU3RlcHMoZmFsc2UpLFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdHZXQgY3VycmVudCBsYXRlc3QgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncHJlLXJlbGVhc2UtdGFnJyxcbiAgICAgICAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuZWNobyBcInRhZz0kKGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCAyPi9kZXYvbnVsbCB8fCBlY2hvIFxcJ1xcJylcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICAgICAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgY2hlY2tzIE5vZGUuanMgcnVudGltZSByZXF1aXJlbWVudHM7IGBidW4gPGJpbj5gIHJlc3BlY3RzIGl0c1xuICAgICAgICAgICAgLy8gYCMhL3Vzci9iaW4vZW52IG5vZGVgIHNoZWJhbmcsIHNvIGl0IHN0aWxsIHJ1bnMgdW5kZXIgcmVhbCBOb2RlLlxuICAgICAgICAgICAgcnVuOiAnYnVuIHNlbWFudGljLXJlbGVhc2UnLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgICAgIExFRlRIT09LOiAnMCcsXG4gICAgICAgICAgICAgIC4uLmZub3hFbnYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd1xuICAgICAgICAgICAgPyAoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVjayBmb3IgbmV3IHJlbGVhc2UgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncG9zdC1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmdpdCBmZXRjaCAtLXRhZ3MgLS1mb3JjZVxcbk5FV19UQUc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXFxuZWNobyBcInRhZz0kTkVXX1RBR1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxcbmlmIFtbIC1uIFwiJE5FV19UQUdcIiAmJiBcIiRORVdfVEFHXCIgIT0gXCIke3sgc3RlcHMucHJlLXJlbGVhc2UtdGFnLm91dHB1dHMudGFnIH19XCIgXV07IHRoZW5cXG4gIGVjaG8gXCJjcmVhdGVkPXRydWVcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5maScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZjogXCJzdGVwcy5wb3N0LXJlbGVhc2UtdGFnLm91dHB1dHMuY3JlYXRlZCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdUcmlnZ2VyIHByb2R1Y3Rpb24gZGVwbG95JyxcbiAgICAgICAgICAgICAgICAgIC8vIEEgR0lUSFVCX1RPS0VOLWNyZWF0ZWQgcmVsZWFzZSBkb2VzIG5vdCBmaXJlIHRoZSBkZXBsb3kgd29ya2Zsb3cnc1xuICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZS1wdWJsaXNoZWQgdHJpZ2dlciwgc28gZGlzcGF0Y2ggaXQgZXhwbGljaXRseSBvbiB0aGUgbmV3IHRhZy5cbiAgICAgICAgICAgICAgICAgIHJ1bjogJ2doIHdvcmtmbG93IHJ1biBkZXBsb3ktcHJvZHVjdGlvbi55bWwgLS1yZWYgXCIke3sgc3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiJyxcbiAgICAgICAgICAgICAgICAgIGVudjogeyBHSF9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdIHNhdGlzZmllcyBTdGVwW10pXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbCBzZXF1ZW5jZSBldmVyeSBnZW5lcmF0ZWQgd29ya2Zsb3cgc2hhcmVzOiBgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVgLCBoYXJkZW5lZCBpbnRvIHRoZVxuICogcmV1c2FibGUgd29ya2Zsb3dzJyB0aHJlZS1zdGVwIGRhbmNlIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVnaXN0ZXJzIGEgVEFLVU1JX0dVQVJEX1RPS0VOIHNlY3JldC5cbiAqXG4gKiBUYWt1bWkgR3VhcmQgKGh0dHBzOi8vZmxhdHQudGVjaC90YWt1bWkvZmVhdHVyZXMvZ3VhcmQpIGlzIGEgcmVnaXN0cnkgcHJveHkgdGhhdCBibG9ja3NcbiAqIGtub3duLW1hbGljaW91cyBwYWNrYWdlcy4gUm91dGluZyB0aGUgREVGQVVMVCByZWdpc3RyeSB0aHJvdWdoIGl0IGlzIHdoYXQgcHJvdGVjdHMgdGhlIGluc3RhbGwsXG4gKiBhbmQgdGhlIHRva2VuIGF1dGhlbnRpY2F0ZXMgdGhhdCBwcm94eSDigJQgc28gdGhlIHRva2VuIGhhcyB0byBiZSBwcmVzZW50IHdoaWxlIGRlcGVuZGVuY2llcyBhcmVcbiAqIHJlc29sdmVkLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gYSBjb21wcm9taXNlZCBkZXBlbmRlbmN5J3MgbGlmZWN5Y2xlIHNjcmlwdCB3b3VsZCBydW4uIEhlbmNlIHRoZVxuICogc3BsaXQ6IHJlc29sdmUgYW5kIGRvd25sb2FkIHdpdGggYC0taWdub3JlLXNjcmlwdHNgIGFuZCB0aGUgdG9rZW4sIHRoZW4gcmVwbGF5IHRoZSBza2lwcGVkXG4gKiBsaWZlY3ljbGUgc2NyaXB0cyBpbiBhIHNlY29uZCBpbnN0YWxsIHRoYXQgaGFzIG5vIHRva2VuIChldmVyeSBwYWNrYWdlIGlzIGFscmVhZHkgY2FjaGVkLCBhbmRcbiAqIEd1YXJkIHNlcnZlcyBhbm9ueW1vdXNseSBhbnl3YXkpLiBPbmx5IGJ1biBpcyBnZW5lcmF0ZWQgaGVyZSwgYW5kIGJ1biByZWFkcyAubnBtcmMsIHNvIG5vXG4gKiBwYWNrYWdlLW1hbmFnZXIgYnJhbmNoaW5nIGlzIG5lZWRlZC5cbiAqXG4gKiBUaGUgc2hlbGwgZGV0YWlscyBkZWxpYmVyYXRlbHkgbWlycm9yIHJldXNhYmxlLXdvcmtmbG93cycgcHJvZHVjdGlvbi1wcm92ZW4gaW5zdGFsbCBzdGVwczogYmFyZVxuICogYCRSVU5ORVJfVEVNUGAgKHNldCBieSB0aGUgcnVubmVyIGFwcGxpY2F0aW9uIG9uIGV2ZXJ5IHJ1bm5lciwgYW5kIGBzZXQgLXVgIGZhaWxzIGxvdWRseSBpZiBub3QpLFxuICogYFtbIC1lIC5ucG1yYyBdXWAsIGFuZCB0aGUgc2Vjb25kIGBybSAtcmYgbm9kZV9tb2R1bGVzYCBpbiB0aGUgZmFsbGJhY2sgKGFuIGludGVycnVwdGVkIGxpZmVjeWNsZVxuICogcnVuIG1heSBsZWF2ZSBub2RlX21vZHVsZXMgaW5jb25zaXN0ZW50LCBzbyB0aGUgcmV0cnkgc3RhcnRzIGNsZWFuIHJhdGhlciB0aGFuIHRydXN0aW5nIGEgcmVwYWlyKS5cbiAqXG4gKiBgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlYCBkZWNpZGVzIHdoYXQgYSBmYWlsaW5nIGxpZmVjeWNsZS1zY3JpcHQgcmVwbGF5IGRvZXMuIEV2ZXJ5XG4gKiByZXBsYXkgcnVucyB0b2tlbmxlc3MgYW5kIHdpdGhvdXQgRk5PWF9BR0VfS0VZICh0aGUga2V5IGlzIHNjb3BlZCB0byB0aGUgbGF0ZXIgRGVwbG95L1JlbGVhc2VcbiAqIHN0ZXApLCBzbyBhIHBvc3RpbnN0YWxsIHRoYXQgbmVlZHMgZGVjcnlwdGVkIHNlY3JldHMgaXMgdW5zdXBwb3J0ZWQgaW4gYWxsIG9mIHRoZW0gYnkgZGVzaWduLlxuICogVGhlIHRlc3Qgd29ya2Zsb3cgdG9sZXJhdGVzIHRoZSBmYWlsdXJlIGJlY2F1c2UgdHlwZWNoZWNrL2xpbnQvdGVzdCBmYWlsIGxvdWRseSBvbiBhIGRlZ3JhZGVkXG4gKiB0cmVlIGFueXdheS4gRGVwbG95IGFuZCByZWxlYXNlIHdvcmtmbG93cyBtdXN0IG5vdDogYSBgOjp3YXJuaW5nOjpgIGRvZXMgbm90IGZhaWwgdGhlIGpvYiwgc29cbiAqIHRoZSBmYWxsYmFjayB3b3VsZCBzaGlwIGEgdHJlZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyAoZS5nLiBhIGBwb3N0aW5zdGFsbDogd2IgZ2VuLWNvZGVgKVxuICogbmV2ZXIgcmFuLCBzaWxlbnRseSBkZXBsb3lpbmcgZGVncmFkZWQgb3V0cHV0ICgjMTEyNykuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbFN0ZXBzKHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZTogYm9vbGVhbik6IFN0ZXBbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ0dlbmVyYXRlIC5ucG1yYyBmb3IgVGFrdW1pIEd1YXJkJyxcbiAgICAgIC8vIFRoZSB0b2tlbiBpcyB3cml0dGVuIGFzIGEgbGl0ZXJhbCBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2UgdGhhdCBidW4gZXhwYW5kcyBhdFxuICAgICAgLy8gaW5zdGFsbCB0aW1lLCBzbyB0aGUgc2VjcmV0IGl0c2VsZiBuZXZlciBsYW5kcyBpbiBhIGZpbGUuIFRoZSBtYW5hZ2VkIGxpbmVzIGFyZSBzdHJpcHBlZFxuICAgICAgLy8gZnJvbSBhbiBleGlzdGluZyAubnBtcmMgZmlyc3Q6IGEgcmVwb3NpdG9yeSBvdXRzaWRlIHRoZSBvcmdhbml6YXRpb25zIG1heSBsZWdpdGltYXRlbHlcbiAgICAgIC8vIGNvbW1pdCBvbmUgKHNjb3BlIG1hcHBpbmdzIGZvciBhbm90aGVyIHJlZ2lzdHJ5KSwgYW5kIGRyb3BwaW5nIG9ubHkgdGhlc2UgdHdvIGxpbmVzIGtlZXBzXG4gICAgICAvLyB0aGUgcmVzdCBvZiBpdCBpbiBlZmZlY3QuIFJlcGxhY2luZyB0aGUgZmlsZSB3aXRoIGBtdmAgcmF0aGVyIHRoYW4gYXBwZW5kaW5nIGluIHBsYWNlIHN0b3BzXG4gICAgICAvLyBhIGNvbW1pdHRlZCBzeW1saW5rIGZyb20gcmVkaXJlY3RpbmcgdGhlIHdyaXRlIGludG8sIHNheSwgYSBwZXJzaXN0ZW50IGhvbWUgbnBtcmMuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuTlBNUkM9XCIkKG1rdGVtcCBcIiRSVU5ORVJfVEVNUC9ucG1yYy5YWFhYWFhcIilcIlxuaWYgW1sgLWUgLm5wbXJjIF1dOyB0aGVuXG4gIGdyZXAgLXZFICdecmVnaXN0cnk9fF4vL25wbVxcXFwuZmxhdHRcXFxcLnRlY2gvOl9hdXRoVG9rZW4nIC5ucG1yYyA+IFwiJE5QTVJDXCIgfHwgdHJ1ZVxuZmlcbmVjaG8gJ3JlZ2lzdHJ5PWh0dHBzOi8vbnBtLmZsYXR0LnRlY2gvJyA+PiBcIiROUE1SQ1wiXG5lY2hvICcvL25wbS5mbGF0dC50ZWNoLzpfYXV0aFRva2VuPVxcJHtUQUtVTUlfR1VBUkRfVE9LRU59JyA+PiBcIiROUE1SQ1wiXG5ybSAtZiAubnBtcmNcbm12IFwiJE5QTVJDXCIgLm5wbXJjYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAvLyAtLWZyb3plbi1sb2NrZmlsZTogYSBwbGFpbiBgYnVuIGluc3RhbGxgIHNpbGVudGx5IHJlcGFpcnMgYSBidW4ubG9jayB0aGF0IGlzIHN0YWxlIGFnYWluc3RcbiAgICAgIC8vIHBhY2thZ2UuanNvbiwgc28gQ0kgd291bGQgcnVuIGRlcGVuZGVuY3kgcmVzb2x1dGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHJldmlld2VkICgjMTEyNikuXG4gICAgICAvLyBXaXRoIE5PIGJ1bi5sb2NrIGF0IGFsbCwgLS1mcm96ZW4tbG9ja2ZpbGUgc2lsZW50bHkgaW5zdGFsbHMgZnJlc2gsIHVucGlubmVkIHJlc29sdXRpb25zXG4gICAgICAvLyAoQnVuIDEuMy4xNCBleGl0cyAwIGFuZCB3cml0ZXMgbm8gbG9ja2ZpbGUpLCBzbyBhIG1pc3NpbmcgbG9ja2ZpbGUgbXVzdCBmYWlsIGV4cGxpY2l0bHkuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgW1sgISAtZSBidW4ubG9jayBdXTsgdGhlblxuICBlY2hvIFwiOjplcnJvcjo6YnVuLmxvY2sgaXMgbWlzc2luZzsgY29tbWl0IGl0IHNvIENJIGluc3RhbGxzIHN0YXkgcmVwcm9kdWNpYmxlXCJcbiAgZXhpdCAxXG5maVxuaWYgW1sgXCIkSEFTX1RBS1VNSV9HVUFSRF9UT0tFTlwiID09IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIC0taWdub3JlLXNjcmlwdHNcbmVsc2VcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVcbmZpYCxcbiAgICAgIC8vIFN0ZXAtc2NvcGVkOiBhIGpvYi1sZXZlbCB0b2tlbiB3b3VsZCBiZSByZWFkYWJsZSBieSBldmVyeSBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHQgdGhlXG4gICAgICAvLyB0b2tlbmxlc3MgcmVwbGF5IGJlbG93IHJ1bnMuXG4gICAgICBlbnY6IHsgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1J1biBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMnLFxuICAgICAgLy8gQSByZXBlYXRlZCBgYnVuIGluc3RhbGxgIGlzIGEgbm8tb3AgdGhhdCByZXBsYXlzIG5vdGhpbmcsIHNvIG5vZGVfbW9kdWxlcyBoYXMgdG8gZ28gZmlyc3QuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxucm0gLXJmIG5vZGVfbW9kdWxlc1xuYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUke1xuICAgICAgICB0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmVcbiAgICAgICAgICA/IGAgfHwge1xuICBlY2hvIFwiOjp3YXJuaW5nOjpMaWZlY3ljbGUgc2NyaXB0cyBmYWlsZWQ7IGNvbXBsZXRpbmcgdGhlIGluc3RhbGwgd2l0aG91dCB0aGVtXCJcbiAgcm0gLXJmIG5vZGVfbW9kdWxlc1xuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG59YFxuICAgICAgICAgIDogJydcbiAgICAgIH1gLFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1JlbW92ZSB0aGUgZ2VuZXJhdGVkIC5ucG1yYycsXG4gICAgICAvLyBOb3RoaW5nIGFmdGVyIHRoZSBpbnN0YWxsIG5lZWRzIHRoZSBwcm94eSwgYW5kIGxlYXZpbmcgaXQgaW4gcGxhY2Ugd291bGQgYnJlYWsgdGhlIG9uZVxuICAgICAgLy8gdGhpbmcgR3VhcmQgcmVmdXNlcyB0byBzZXJ2ZTogaXQgYW5zd2VycyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1LCBzbyBhIHJlbGVhc2Ugd29ya2Zsb3dcbiAgICAgIC8vIHdob3NlIHBhY2thZ2UgbGFja3MgYW4gZXhwbGljaXQgcHVibGlzaENvbmZpZy5yZWdpc3RyeSB3b3VsZCBmYWlsIHRvIHB1Ymxpc2guXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAtLSAubnBtcmMgPiAvZGV2L251bGwgMj4mMTsgdGhlblxuICBnaXQgY2hlY2tvdXQgLS0gLm5wbXJjXG5lbHNlXG4gIHJtIC1mIC5ucG1yY1xuZmlgLFxuICAgIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VtYW50aWNQcldvcmtmbG93KCk6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHsgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAvLyBUaGUgYWN0aW9uIHJlYWRzIHRoZSBwdWxsIHJlcXVlc3QsIGFuZCBpdHMgYHdpcGAgc3VwcG9ydCBwb3N0cyBhIGNvbW1pdCBzdGF0dXM7IG5laXRoZXJcbiAgICAgICAgLy8gcGVybWlzc2lvbiBpcyBncmFudGVkIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVzdHJpY3RzIGRlZmF1bHQgd29ya2Zsb3cgcGVybWlzc2lvbnMuXG4gICAgICAgIHBlcm1pc3Npb25zOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXM6IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7IHdpcDogdHJ1ZSB9LFxuICAgICAgICAgICAgZW52OiB7IEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbnRlcmZhY2UgTWlzZVRvbWwge1xuICB0b29scz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vLyBUaGUgb2xkZXN0IEJ1biBydW50aW1lIHdiZnkgc3VwcG9ydHMuXG5leHBvcnQgY29uc3QgbWluaW11bUJ1blZlcnNpb24gPSAnMS40LjAnO1xuXG4vKipcbiAqIFBpbnMgTm9kZS5qcyBhbmQgdGhlIGxhdGVzdCBCdW4gYW5kICh3aGVuIGZub3gudG9tbCBleGlzdHMpIGZub3ggdmVyc2lvbnMuIE9ubHkgdGhlIGNoYW5nZWQgcGluXG4gKiBsaW5lcyBhcmUgZWRpdGVkIGluIHBsYWNlOiByZS1zZXJpYWxpemluZyB0aGUgcGFyc2VkIFRPTUwgd291bGQgZHJvcCBldmVyeSBjb21tZW50IGFuZCBjb2xsYXBzZVxuICogbXVsdGktbGluZSBzdHJpbmdzIChlLmcuIG1pc2UgdGFzayBzY3JpcHRzKSBpbiB0aGUgcmVzdCBvZiB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTWlzZVRvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVNaXNlVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtaXNlVG9tbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdtaXNlLnRvbWwnKTtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZE1pc2VUb21sKG1pc2VUb21sUGF0aCk7XG4gICAgLy8gQSBwYXJzZSBmYWlsdXJlIG11c3QgYWJvcnQ6IGVkaXRpbmcgcGlucyBpbiBhIGJyb2tlbiBtaXNlLnRvbWwgd291bGQgaGlkZSB0aGUgYnJlYWthZ2UuXG4gICAgY29uc3QgdG9vbHMgPSAoQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgTWlzZVRvbWwpLnRvb2xzID8/IHt9O1xuXG4gICAgY29uc3QgcGluczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAvLyBFbnN1cmUgTm9kZS5qcyBpcyBhbHdheXMgcGlubmVkOiBnZW5lcmF0ZWQgaG9va3MgYW5kIENJIHJ1biBgbWlzZSBpbnN0YWxsYCwgYW5kIGFuIHVucGlubmVkXG4gICAgICAvLyBOb2RlIHdvdWxkIGNvbWUgZnJvbSB3aGF0ZXZlciBoYXBwZW5zIHRvIGJlIG9uIFBBVEguXG4gICAgICAvLyBMaWZ0LXRoZW4tcGluOiB0aGUgbGlmdCBvbmx5IHRvdWNoZXMgZXhhY3QgcGlucyBhbmQgdGhlIHBpbiBvbmx5IHRvdWNoZXMgc2VsZWN0b3JzLCBzb1xuICAgICAgLy8gb3JkZXJpbmcgdGhlIGxpZnQgZmlyc3QgYXZvaWRzIHJlc29sdmluZyBgbWlzZSBsYXRlc3Qgbm9kZUBsdHNgIHR3aWNlIGZvciB1bnBpbm5lZCByZXBvcy5cbiAgICAgIG5vZGU6IHBpbkNvbmNyZXRlVG9vbFZlcnNpb24oXG4gICAgICAgICdub2RlJyxcbiAgICAgICAgbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcignbm9kZUBsdHMnLCB0b29scy5ub2RlLCBjb25maWcuZGlyUGF0aCksXG4gICAgICAgIGNvbmZpZy5kaXJQYXRoXG4gICAgICApLFxuICAgICAgYnVuOiBwaW5MYXRlc3RUb29sVmVyc2lvbignYnVuJywgdG9vbHMuYnVuLCBjb25maWcuZGlyUGF0aCksXG4gICAgfTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIHBpbnMuZm5veCA9IHBpbkxhdGVzdFRvb2xWZXJzaW9uKCdmbm94JywgdG9vbHMuZm5veCwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cblxuICAgIGxldCBuZXdDb250ZW50ID0gY29udGVudDtcbiAgICBmb3IgKGNvbnN0IFt0b29sLCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhwaW5zKSkge1xuICAgICAgaWYgKHZlcnNpb24gPT09IHRvb2xzW3Rvb2xdKSBjb250aW51ZTtcbiAgICAgIGFzc2VydC5vayh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycsIGBUaGUgcmVzb2x2ZWQgJHt0b29sfSBwaW4gbXVzdCBiZSBhIHZlcnNpb24gc3RyaW5nLmApO1xuICAgICAgbmV3Q29udGVudCA9IHNldFRvb2xWZXJzaW9uKG5ld0NvbnRlbnQsIHRvb2wsIHZlcnNpb24pO1xuICAgICAgLy8gQSBsaW5lIGVkaXQgYnJlYWtzIHBpbnMgd3JpdHRlbiBpbiBhbnkgb3RoZXIgZm9ybSAoYSBtdWx0aS1saW5lIHZhbHVlLCBhIGB0b29scy5idW5gXG4gICAgICAvLyBkb3R0ZWQga2V5LCBhIGBbdG9vbHMuYnVuXWAgc3ViLXRhYmxlKSwgc28gbmV2ZXIgd3JpdGUgYSByZXN1bHQgdGhlIHBhcnNlciBkaXNhZ3JlZXMgd2l0aC5cbiAgICAgIGFzc2VydC5vayhcbiAgICAgICAgcGFyc2VUb29scyhuZXdDb250ZW50KT8uW3Rvb2xdID09PSB2ZXJzaW9uLFxuICAgICAgICBgV3JpdGUgdGhlICR7dG9vbH0gcGluIGluIG1pc2UudG9tbCBhcyBvbmUgXFxgJHt0b29sfSA9IC4uLlxcYCBsaW5lIHVuZGVyIFt0b29sc10uYFxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShtaXNlVG9tbFBhdGgsIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0VG9vbFZlcnNpb24oY29udGVudDogc3RyaW5nLCB0b29sOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBpbiA9IGAke3Rvb2x9ID0gXCIke3ZlcnNpb259XCJgO1xuICBjb25zdCBzZWN0aW9uID0gL15cXFt0b29sc1xcXSg/IVteXFxuXSkoPzpcXG4oPyFcXFspLiopKi9tdS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIGlmIChzZWN0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiBgJHtjb250ZW50ICYmIGAke2NvbnRlbnQudHJpbUVuZCgpfVxcblxcbmB9W3Rvb2xzXVxcbiR7cGlufVxcbmA7XG5cbiAgY29uc3QgcGluUGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3Rvb2x9ID0gLio/KFxcXFxzKiMuKik/JGAsICdtdScpO1xuICAvLyBCbGFuayBsaW5lcyBhbmQgY29tbWVudHMgdGhhdCBlbmQgdGhlIHNlY3Rpb24gbGVhZCB0aGUgbmV4dCB0YWJsZSwgc28gYSBuZXcgcGluIGdvZXMgYWJvdmUgdGhlbS5cbiAgY29uc3QgcGluc0VuZCA9IC8oPzpcXG5bXFx0IF0qKD86Iy4qKT8pKiQvdS5leGVjKHNlY3Rpb24pPy5pbmRleCA/PyBzZWN0aW9uLmxlbmd0aDtcbiAgY29uc3QgbmV3U2VjdGlvbiA9IHBpblBhdHRlcm4udGVzdChzZWN0aW9uKVxuICAgID8gc2VjdGlvbi5yZXBsYWNlKHBpblBhdHRlcm4sIGAke3Bpbn0kMWApXG4gICAgOiBgJHtzZWN0aW9uLnNsaWNlKDAsIHBpbnNFbmQpfVxcbiR7cGlufSR7c2VjdGlvbi5zbGljZShwaW5zRW5kKX1gO1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlKHNlY3Rpb24sICgpID0+IG5ld1NlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRvb2xzKGNvbnRlbnQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sKS50b29scztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogVXBkYXRlcyB0byB0aGUgbGF0ZXN0IHJlbGVhc2UgYWNyb3NzIG1ham9yIHZlcnNpb25zIHdpdGhvdXQgZG93bmdyYWRpbmcgZXhpc3RpbmcgZXhhY3QgcGlucy4gKi9cbmZ1bmN0aW9uIHBpbkxhdGVzdFRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgLy8gUmVzb2x2ZSBpbmRlcGVuZGVudGx5IG9mIHRoZSB0YXJnZXQncyB0cnVzdCBzdGF0ZSBhbmQgdG9vbCBhbGlhc2VzLlxuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJy0tbm8tY29uZmlnJywgJ2xhdGVzdCcsIHRvb2xdLCBjd2QpO1xuICBpZiAoIXNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pKSByZXR1cm4gdmVyc2lvbiA/PyAnbGF0ZXN0JztcbiAgLy8gQSBjYWNoZWQgcmVsZWFzZSBsaXN0aW5nIGNhbiBsYWcgYmVoaW5kIGFub3RoZXIgbWFjaGluZSB0aGF0IGFscmVhZHkgdXBkYXRlZCB0aGUgcGluLlxuICByZXR1cm4gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnICYmIHNlbXZlci52YWxpZCh2ZXJzaW9uKSAmJiBzZW12ZXIuZ3QodmVyc2lvbiwgcmVzb2x2ZWRWZXJzaW9uKVxuICAgID8gdmVyc2lvblxuICAgIDogcmVzb2x2ZWRWZXJzaW9uO1xufVxuXG4vKipcbiAqIExpZnRzIGFuIGV4YWN0IHRvb2wgcGluIGJlbG93IHRoZSBsYXRlc3QgcmVzb2x2YWJsZSB2ZXJzaW9uIOKAlCB3aXRoaW4gdGhlIFNBTUUgbWFqb3Ig4oCUIHRvIHRoYXRcbiAqIHZlcnNpb24gKE5vZGUuanMgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgbGF0ZXN0IExUUyk6IHRoZSByZXBvc2l0b3J5LXN0cnVjdHVyZSBzdGFuZGFyZCB0cmFja3MgdGhlXG4gKiBjdXJyZW50IHRvb2xjaGFpbiBhY3Jvc3MgcmVwb3NpdG9yaWVzIGFuZCBSZW5vdmF0ZSBkb2VzIG5vdCBtYW5hZ2UgbWlzZS50b21sIHBpbnMsIHNvXG4gKiBwYXRjaC9taW5vciBkcmlmdCAoZS5nLiBub2RlIDI0LjE2LjAgdnMgMjQuMTguMCkgbmV2ZXIgc2VsZi1oZWFscy4gQSBwaW5cbiAqIG9uIGFuIG9sZGVyIG1ham9yIGlzIGEgZGVsaWJlcmF0ZSBjb21wYXRpYmlsaXR5IGNob2ljZSBhbmQgaXMga2VwdCwgYXMgYXJlIG5vbi1leGFjdCBhbmRcbiAqIG5vbi1zdHJpbmcgZm9ybXMuIFdoZW4gbWlzZSBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBwaW4gaXMga2VwdC5cbiAqL1xuZnVuY3Rpb24gbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcihzZWxlY3Rvcjogc3RyaW5nLCB2ZXJzaW9uOiB1bmtub3duLCBjd2Q6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8ICFzZW12ZXIudmFsaWQodmVyc2lvbikpIHJldHVybiB2ZXJzaW9uO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbikgJiZcbiAgICBzZW12ZXIubWFqb3IobGF0ZXN0VmVyc2lvbikgPT09IHNlbXZlci5tYWpvcih2ZXJzaW9uKSAmJlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBsYXRlc3RWZXJzaW9uKVxuICAgID8gbGF0ZXN0VmVyc2lvblxuICAgIDogdmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbiB1bnBpbm5lZCBzZWxlY3RvciAoYGxhdGVzdGAsIGEgcmFuZ2Ugc3VjaCBhcyBcIjI0XCIsIGFuIGFsaWFzLCBvciBhIG1pc3NpbmcgZW50cnkpXG4gKiB3aXRoIHRoZSBuZXdlc3QgY29uY3JldGUgdmVyc2lvbiBtaXNlIHJlc29sdmVzIGZvciBpdCwgYmVjYXVzZSB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmVcbiAqIHN0YW5kYXJkIHJlcXVpcmVzIGNvbmNyZXRlIHBpbnM6IENJIGluc3RhbGxzIHdoYXRldmVyIGFuIHVucGlubmVkIHNlbGVjdG9yIHJlc29sdmVzIHRvIGF0IHJ1blxuICogdGltZSwgc28gYnVpbGRzIGRyaWZ0IGFjcm9zcyBydW5zLiBFeGFjdCB2ZXJzaW9ucyBhcmUga2VwdCBhcy1pcywgYW5kIG5vbi1zdHJpbmcgZm9ybXMgKG1pc2Unc1xuICogYXJyYXkgYW5kIGB7IHZlcnNpb24gPSBcIuKAplwiIH1gIGZvcm1zKSBhcmUgdXNlci1tYW5hZ2VkIGFuZCBsZWZ0IHVudG91Y2hlZC4gV2hlbiBtaXNlIGlzXG4gKiB1bmF2YWlsYWJsZSBvciBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBpcyBrZXB0IOKAlFxuICogYW4gdW5waW5uZWQgdG9vbCBpcyBiZXR0ZXIgdGhhbiBhIGJyb2tlbiBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8IHNlbXZlci52YWxpZCh2ZXJzaW9uKSkpIHJldHVybiB2ZXJzaW9uO1xuICAvLyBOb3JtYWxpemUgc2VsZWN0b3IgZm9ybXMgYG1pc2UgbGF0ZXN0YCBjYW5ub3QgcmVzb2x2ZSBldmVuIHRob3VnaCBtaXNlIGNvbmZpZ3VyYXRpb24gYWNjZXB0c1xuICAvLyB0aGVtOiBgcHJlZml4OjI0YCBpcyByZWplY3RlZCBvdXRyaWdodCB3aGlsZSBgMjRgIHJlc29sdmVzLCBhbmQgYGx0cy8qYCB5aWVsZHMgZW1wdHkgb3V0cHV0XG4gIC8vIHdoaWxlIGBsdHNgIHJlc29sdmVzLiBNb2RpZmllciBzZWxlY3RvcnMgc3VjaCBhcyBgc3ViLTI6bHRzYCBzdGF5IHVucmVzb2x2YWJsZSBhbmQgZmFsbCBiYWNrXG4gIC8vIHRvIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBiZWxvdy5cbiAgY29uc3QgcmFuZ2UgPSB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgPyB2ZXJzaW9uLnJlcGxhY2UoL15wcmVmaXg6L3UsICcnKS5yZXBsYWNlKC9cXC9cXCokL3UsICcnKSA6IHVuZGVmaW5lZDtcbiAgLy8gV2l0aCBubyBtZWFuaW5nZnVsIHNlbGVjdG9yLCBOb2RlLmpzIHBpbnMgdG8gdGhlIGxhdGVzdCBMVFMgKG1hdGNoaW5nIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MnXG4gIC8vIGBsdHMvKmAgZmFsbGJhY2spIHJhdGhlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZS5cbiAgY29uc3QgZGVmYXVsdFNlbGVjdG9yID0gdG9vbCA9PT0gJ25vZGUnID8gJ25vZGVAbHRzJyA6IHRvb2w7XG4gIGNvbnN0IHNlbGVjdG9yID0gcmFuZ2UgJiYgcmFuZ2UgIT09ICdsYXRlc3QnID8gYCR7dG9vbH1AJHtyYW5nZX1gIDogZGVmYXVsdFNlbGVjdG9yO1xuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJ2xhdGVzdCcsIHNlbGVjdG9yXSwgY3dkKTtcbiAgcmV0dXJuIHNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pID8gcmVzb2x2ZWRWZXJzaW9uIDogKHZlcnNpb24gPz8gJ2xhdGVzdCcpO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRvbWwobWlzZVRvbWxQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMobWlzZVRvbWxQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE9ubHkgYSByZXBvc2l0b3J5IHdpdGhvdXQgbWlzZS50b21sIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IGNvbmZpZ3VyYXRpb247IGFuIHVucmVhZGFibGUgZmlsZVxuICAgIC8vIChlLmcuIHBlcm1pc3Npb25zKSBtdXN0IGFib3J0IGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCBnZW5lcmF0ZWQgc2V0dGluZ3MuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gJyc7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZywgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLmpzJztcblxuLyoqXG4gKiBCdW4gcmVhZHMgcmVnaXN0cnkgc2NvcGUgbWFwcGluZ3MgZnJvbSBhIHBoeXNpY2FsIHJlcG9zaXRvcnkgLm5wbXJjIGR1cmluZyBSZW5vdmF0ZSBhcnRpZmFjdFxuICogdXBkYXRlczsgUmVub3ZhdGUncyBucG1yYyBzZXR0aW5nIGlzIHVzZWQgb25seSBieSBpdHMgZGF0YXNvdXJjZSBsYXllci4gS2VlcCB0aGUgbm9uLXNlY3JldFxuICogbWFwcGluZyBpbiByZXBvc2l0b3JpZXMgdGhhdCByZXNvbHZlIHByaXZhdGUgcGFja2FnZXMsIHdoaWxlIGF1dGhlbnRpY2F0aW9uIHJlbWFpbnMgaW4gdGhlXG4gKiBkZXZlbG9wZXIncyB+Ly5ucG1yYyBsb2NhbGx5IGFuZCBpbiB0ZW1wb3JhcnkgQ0kgb3IgTWVuZCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9BdXRob3IgPSBjb25maWdzWzBdPy5yZXBvQXV0aG9yO1xuICBpZiAocmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyJyAmJiByZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgY29uc3QgbnBtcmNQYXRocyA9IG5ldyBTZXQoY29uZmlncy5tYXAoKGNvbmZpZykgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJykpKTtcbiAgY29uc3Qgcm9vdENvbmZpZyA9IGNvbmZpZ3MuZmluZCgoY29uZmlnKSA9PiBjb25maWcuaXNSb290KTtcbiAgaWYgKHJvb3RDb25maWcgJiYgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKHJvb3RDb25maWcpKSB7XG4gICAgY29uc3Qgcm9vdE5wbXJjUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcubnBtcmMnKTtcbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHJvb3ROcG1yY1BhdGgsIHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyk7XG4gICAgbnBtcmNQYXRocy5kZWxldGUocm9vdE5wbXJjUGF0aCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSBhd2FpdCByZW1vdmVOcG1yYyhucG1yY1BhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVOcG1yYyhucG1yY1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChucG1yY1BhdGgpLmNhdGNoKCgpID0+IHt9KSkpIHJldHVybjtcbiAgaWYgKGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChucG1yY1BhdGgpKSB7XG4gICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIG5vbi1jYW5vbmljYWwgcmVwb3NpdG9yeSBucG1yYyAke25wbXJjUGF0aH0uYCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0OiAnYnJhbmNoJztcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnO1xuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGluY2x1ZGU6IHN0cmluZ1tdO1xuICAgICAgZXhjbHVkZTogc3RyaW5nW107XG4gICAgfTtcbiAgfTtcbiAgcnVsZXM6IChcbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2RlbGV0aW9uJyB8ICdub25fZmFzdF9mb3J3YXJkJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBib29sZWFuO1xuICAgICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiB7XG4gICAgICAgICAgICBjb250ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogbnVtYmVyO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiBudW1iZXI7XG4gICAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXTtcbiAgICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogYm9vbGVhbjtcbiAgICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ107XG4gICAgICAgIH07XG4gICAgICB9XG4gIClbXTtcbiAgYnlwYXNzX2FjdG9yczoge1xuICAgIGFjdG9yX2lkOiBudW1iZXI7XG4gICAgYWN0b3JfdHlwZTogJ1RlYW0nO1xuICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JztcbiAgfVtdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNvdXJjZV90eXBlPzogc3RyaW5nO1xufVxuXG5jb25zdCBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSID0ge1xuICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCA9IDE1XzM2ODtcblxuY29uc3QgUFJPVEVDVF9NQUlOX1JVTEVTRVQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCA9IHtcbiAgbmFtZTogJ1Byb3RlY3QgbWFpbicsXG4gIHRhcmdldDogJ2JyYW5jaCcsXG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJyxcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBleGNsdWRlOiBbXSxcbiAgICAgIGluY2x1ZGU6IFsnfkRFRkFVTFRfQlJBTkNIJ10sXG4gICAgfSxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZGVsZXRpb24nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGZhbHNlLFxuICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAndGVzdCAvIHRlc3QnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3NlbWFudGljLXByIC8gc2VtYW50aWMtcHInLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ25vbl9mYXN0X2ZvcndhcmQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IDAsXG4gICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXSxcbiAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBmYWxzZSxcbiAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBieXBhc3NfYWN0b3JzOiBbXG4gICAge1xuICAgICAgYWN0b3JfaWQ6IDE3Xzc3N180OTUsXG4gICAgICBhY3Rvcl90eXBlOiAnVGVhbScsXG4gICAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicpIHJldHVybjtcbiAgICAvLyBUaGUgcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gaG9zdHMgd29ya2Zsb3dfY2FsbCBkZWZpbml0aW9ucywgc28gdGhlXG4gICAgLy8gUHJvdGVjdCBtYWluIHJ1bGVzZXQgd291bGQgcmVxdWlyZSB0ZXN0L3NlbWFudGljLXByIGNoZWNrcyB0aGF0IG5ldmVyIHJ1biB0aGVyZS5cbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8oY29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIFJlcG9zaXRvcnkgcnVsZXNldHMgcmVxdWlyZSBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB3aGljaCBsb2NhbCBydW5zXG4gICAgICAvLyBtYXkgbm90IGhhdmUgZXZlbiB3aGVuIGZpbGUtZ2VuZXJhdGlvbiBhbmQgcHVzaGVzIGFyZSBhbGxvd2VkLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgY29uc3QgcnVsZXNldCA9IHN0cnVjdHVyZWRDbG9uZShQUk9URUNUX01BSU5fUlVMRVNFVCk7XG4gIGlmIChjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlc2V0LnJ1bGVzKSB7XG4gICAgICBpZiAocnVsZS50eXBlICE9PSAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIGNvbnRleHQgaXMgYDxjYWxsZXIgam9iIGlkPiAvIDxyZXVzYWJsZSBqb2IgaWQ+YCBvZiB0aGUgd2JmeS1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbC5cbiAgICAgIHJ1bGUucGFyYW1ldGVycy5yZXF1aXJlZF9zdGF0dXNfY2hlY2tzLnB1c2goe1xuICAgICAgICBjb250ZXh0OiAndGVzdC1ydXN0IC8gdGVzdC1ydXN0JyxcbiAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydWxlc2V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0ID0gYXdhaXQgZmluZFJlcG9zaXRvcnlSdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBydWxlc2V0Lm5hbWUpO1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXRJZCA9IGV4aXN0aW5nUnVsZXNldD8uaWQ7XG5cbiAgYXdhaXQgd2l0aFJldHJ5KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChleGlzdGluZ1J1bGVzZXRJZCkge1xuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgcnVsZXNldF9pZDogZXhpc3RpbmdSdWxlc2V0SWQsXG4gICAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5UnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdpdGhSZXRyeShcbiAgICAoKSA9PlxuICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgaW5jbHVkZXNfcGFyZW50czogZmFsc2UsXG4gICAgICAgIHRhcmdldHM6ICdicmFuY2gnLFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSksXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG4gIGNvbnN0IHJ1bGVzZXRzID0gcmVzcG9uc2UuZGF0YTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzZXRzKSkgcmV0dXJuO1xuICByZXR1cm4gcnVsZXNldHMuZmluZCgocnVsZXNldCkgPT4gcnVsZXNldC5uYW1lID09PSBydWxlc2V0TmFtZSAmJiBydWxlc2V0LnNvdXJjZV90eXBlID09PSAnUmVwb3NpdG9yeScpO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwR2l0SHViU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgaGFzX3dpa2k6IGZhbHNlLFxuICAgICAgICAgICAgaGFzX3Byb2plY3RzOiBmYWxzZSxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBMb2NhbCB3YmZ5IHJ1bnMgb2Z0ZW4gaGF2ZSBwdXNoIHBlcm1pc3Npb24gd2l0aG91dCBhZG1pbiBwZXJtaXNzaW9uLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwR2l0SHViU2V0dGluZ3MgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2l0aFJldHJ5KCgpID0+IGRpc2FibGVEaXNjdXNzaW9ucyhvY3Rva2l0LCBvd25lciwgcmVwbyksIHtcbiAgICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViU2V0dGluZ3NFcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBkaXNhYmxpbmcgR2l0SHViIERpc2N1c3Npb25zIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzYWJsZURpc2N1c3Npb25zKG9jdG9raXQ6IFJldHVyblR5cGU8dHlwZW9mIGdldE9jdG9raXQ+LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3NpdG9yeVJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5ncmFwaHFsPHsgcmVwb3NpdG9yeT86IHsgaWQ/OiBzdHJpbmcgfSB9PihcbiAgICBgcXVlcnkoJG93bmVyOiBTdHJpbmchLCAkcmVwbzogU3RyaW5nISkge1xuICAgICAgcmVwb3NpdG9yeShvd25lcjogJG93bmVyLCBuYW1lOiAkcmVwbykgeyBpZCB9XG4gICAgfWAsXG4gICAgeyBvd25lciwgcmVwbyB9XG4gICk7XG4gIGNvbnN0IHJlcG9zaXRvcnlJZCA9IHJlcG9zaXRvcnlSZXNwb25zZS5yZXBvc2l0b3J5Py5pZDtcbiAgaWYgKCFyZXBvc2l0b3J5SWQpIHJldHVybjtcbiAgYXdhaXQgb2N0b2tpdC5ncmFwaHFsKFxuICAgIGBtdXRhdGlvbigkaW5wdXQ6IFVwZGF0ZVJlcG9zaXRvcnlJbnB1dCEpIHtcbiAgICAgIHVwZGF0ZVJlcG9zaXRvcnkoaW5wdXQ6ICRpbnB1dCkgeyByZXBvc2l0b3J5IHsgaWQgfSB9XG4gICAgfWAsXG4gICAgeyBpbnB1dDogeyByZXBvc2l0b3J5SWQsIGhhc0Rpc2N1c3Npb25zRW5hYmxlZDogZmFsc2UgfSB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2V0dGluZ3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8ICEoJ2Vycm9ycycgaW4gZXJyb3IpIHx8ICFBcnJheS5pc0FycmF5KGVycm9yLmVycm9ycykpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVycm9yLmVycm9ycy5zb21lKFxuICAgIChncmFwaHFsRXJyb3I6IHVua25vd24pID0+XG4gICAgICAhIWdyYXBocWxFcnJvciAmJlxuICAgICAgdHlwZW9mIGdyYXBocWxFcnJvciA9PT0gJ29iamVjdCcgJiZcbiAgICAgICd0eXBlJyBpbiBncmFwaHFsRXJyb3IgJiZcbiAgICAgIFsnRk9SQklEREVOJywgJ0lOU1VGRklDSUVOVF9TQ09QRVMnLCAnTk9UX0ZPVU5EJ10uaW5jbHVkZXMoZ3JhcGhxbEVycm9yLnR5cGUgYXMgc3RyaW5nKVxuICApO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLy8gVGhlIGAvc3JjYCBlbnRyeSAoYSBkZWNsYXJlZCBleHBvcnQpIGxldHMgdGhpcyB3b3Jrc3BhY2UgY29uc3VtZXIgdXNlIHRoZSBzb3VyY2VzIHdpdGhvdXRcbi8vIGJ1aWxkaW5nIHNoYXJlZC1saWIgZmlyc3QsIGFzIGV2ZXJ5IG90aGVyIGltcG9ydCBvZiBpdCBpbiB0aGlzIHBhY2thZ2UgZG9lcy5cbmltcG9ydCB7XG4gIEJVR19JU1NVRV9TRUNUSU9OUyxcbiAgQ0hBTkdFX0lTU1VFX1NFQ1RJT05TLFxuICBQVUxMX1JFUVVFU1RfU0VDVElPTlMsXG4gIHJlbmRlclNlY3Rpb25UZW1wbGF0ZSxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgZ2V0RGVmYXVsdFByb3NlTGFuZ3VhZ2UgfSBmcm9tICcuLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcnVuQWxsSW5Qb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBnZW5lcmF0ZVRlbXBsYXRlcyA9IChsYW5ndWFnZU5vdGU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4gKHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbjwhLS0gV3JpdGUgZm9yIGEgcmV2aWV3ZXIgd2hvIGhhcyBub3QgZm9sbG93ZWQgdGhlIHdvcmsuJHtsYW5ndWFnZU5vdGV9IFNjYWxlIGVhY2ggc2VjdGlvbiB0byB0aGUgY2hhbmdlOiBhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lLiBEZWxldGUgdGhpcyBjb21tZW50IGFuZCB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYmVsb3cuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShQVUxMX1JFUVVFU1RfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9idWcubWQnOiBgXG4tLS1cbm5hbWU6IEJ1ZyAvIFByb2JsZW1cbmFib3V0OiBTb21ldGhpbmcgYmVoYXZlcyB3cm9uZ2x5XG50aXRsZTogJ2ZpeDogJ1xubGFiZWxzOiAndDogZml4IDpidWc6J1xuLS0tXG5cbjwhLS0gS2VlcCBQcm9ibGVtIGFuZCBQcm9wb3NhbDsgZGVsZXRlIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuJHtsYW5ndWFnZU5vdGV9IERlbGV0ZSB0aGVzZSBjb21tZW50cy4gLS0+XG5cbiR7cmVuZGVyU2VjdGlvblRlbXBsYXRlKEJVR19JU1NVRV9TRUNUSU9OUyl9XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2NoYW5nZS5tZCc6IGBcbi0tLVxubmFtZTogQ2hhbmdlIC8gRmVhdHVyZVxuYWJvdXQ6IFByb3Bvc2UgYSBjaGFuZ2UgdGhhdCBhIHRoaXJkIHBhcnR5IGNvdWxkIGltcGxlbWVudCB3aXRob3V0IGFza2luZyBhIHF1ZXN0aW9uXG50aXRsZTogJ2ZlYXQ6ICdcbmxhYmVsczogJ3Q6IGZlYXQgOnNwYXJrbGVzOidcbi0tLVxuXG48IS0tIEtlZXAgdGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGZvciBhbnkgY2hhbmdlIGFuZCBhZGQgdGhlIG90aGVycyBhcyB0aGUgY2hhbmdlIGdyb3dzOyBhIGxhcmdlIGNoYW5nZSBmaWxscyBhbGwgb2YgdGhlbSAoc3BlYy1ib29zdGVyIHJldmlld3MgYWdhaW5zdCB0aGlzIGxpc3QpLiR7bGFuZ3VhZ2VOb3RlfSBEZWxldGUgdGhlc2UgY29tbWVudHMuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShDSEFOR0VfSVNTVUVfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9jb25maWcueW1sJzogJ2JsYW5rX2lzc3Vlc19lbmFibGVkOiB0cnVlJyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGVtcGxhdGVzIGFyZSByZXBvc2l0b3J5LWxldmVsIGZpbGVzLCBzbyBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCBjcmVhdGUgdGhlbS5cbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyB8fCAhY29uZmlnLmlzUm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhbmd1YWdlTm90ZSA9XG4gICAgICBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZShjb25maWcpID09PSAnSmFwYW5lc2UnID8gJyBXcml0ZSBpbiBKYXBhbmVzZSwga2VlcGluZyB0aGUgaGVhZGluZ3MgYXMgdGhleSBhcmUuJyA6ICcnO1xuICAgIGF3YWl0IHJ1bkFsbEluUG9vbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdlbmVyYXRlVGVtcGxhdGVzKGxhbmd1YWdlTm90ZSkpLm1hcCgoW2ZpbGVOYW1lLCBjb250ZW50XSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IGFsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilgO1xuY29uc3QgYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucyA9IFtcbiAgbmV3IFJlZ0V4cChgXiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChgXmdpdGh1Yjoke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/aHR0cHM6Ly9naXRodWJcXFxcLmNvbS8ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP3NzaDovL2dpdEBnaXRodWJcXFxcLmNvbVs6L10ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKGBeKD86Z2l0XFxcXCspP2dpdEBnaXRodWJcXFxcLmNvbToke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLCAndScpLFxuXTtcblxuaW50ZXJmYWNlIERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlIHtcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZztcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBzZWN0aW9uTmFtZTogKHR5cGVvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpW251bWJlcl07XG4gIHNwZWNpZmllcjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHZvaWQge1xuICBjb25zdCBkaXNhbGxvd2VkU291cmNlcyA9IGNvbmZpZ3MuZmxhdE1hcChnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMpO1xuICBpZiAoZGlzYWxsb3dlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlscyA9IGRpc2FsbG93ZWRTb3VyY2VzXG4gICAgLm1hcChcbiAgICAgICh7IGRlcGVuZGVuY3lOYW1lLCBkaXJQYXRoLCBzZWN0aW9uTmFtZSwgc3BlY2lmaWVyIH0pID0+XG4gICAgICAgIGAtICR7cGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKX06ICR7c2VjdGlvbk5hbWV9LiR7ZGVwZW5kZW5jeU5hbWV9IHVzZXMgJHtzcGVjaWZpZXJ9YFxuICAgIClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEaXNhbGxvd2VkIEdpdCBkZXBlbmRlbmN5IHNvdXJjZXMgZm91bmQuXFxuT25seSBXaWxsQm9vc3RlciBhbmQgV2lsbEJvb3N0ZXJMYWIgR2l0SHViIGRlcGVuZGVuY2llcyBhcmUgYWxsb3dlZC5cXG4ke2RldGFpbHN9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm4gW107XG5cbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXM6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uTmFtZSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFja2FnZUpzb25bc2VjdGlvbk5hbWVdO1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgc3BlY2lmaWVyXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCFzcGVjaWZpZXIpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAoaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcblxuICAgICAgZGlzYWxsb3dlZFNvdXJjZXMucHVzaCh7XG4gICAgICAgIGRlcGVuZGVuY3lOYW1lLFxuICAgICAgICBkaXJQYXRoOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgc2VjdGlvbk5hbWUsXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlzYWxsb3dlZFNvdXJjZXM7XG59XG5cbmZ1bmN0aW9uIGlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcikgfHxcbiAgICAvXig/OmJpdGJ1Y2tldHxnaXN0fGdpdGh1YnxnaXRsYWIpOi91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eaHR0cHM/OlxcL1xcLyg/OmJpdGJ1Y2tldFxcLm9yZ3xnaXRodWJcXC5jb218Z2l0bGFiXFwuY29tKVxcLy91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86aHR0cHM/fHNzaCk6XFwvXFwvXFxTK1xcLmdpdCg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15bXkBcXHNdK0BbXjpcXHNdKzpcXFMrKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0OicpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdCsnKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdzc2g6Ly9naXRAJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eW2EtekEtWjAtOV1bXFx3Li1dKlxcL1tcXHcuLV0rKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmZ1bmN0aW9uIGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHNwZWNpZmllcikpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3IsIGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4Q2hha3JhVG9hc3RlciB9IGZyb20gJy4vZml4ZXJzL2NoYWtyYVRvYXN0ZXIuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQge1xuICBnZW5lcmF0ZUJ1bmZpZ1RvbWwsXG4gIGhhc0N1cnJlbnRCdW5SZWxlYXNlQWdlRXhjbHVkZXMsXG4gIHJlYWRCdW5HbG9iYWxTdG9yZSxcbiAgcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlLFxufSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVGbm94VG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9mbm94VG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdlbWluaUNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzLCByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dsb2JhbFJlbGVhc2VBZ2VHYXRlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9vayB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uLCBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhSYWlsd2F5aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUsIHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb25jLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBlbnN1cmVXYkVudkRlZmluaXRpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3diRW52LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9zZWxmQ29udGFpbmVkV29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWlzZVRvbWwsIG1pbmltdW1CdW5WZXJzaW9uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL21pc2VUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL25wbXJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgfSBmcm9tICcuL2dpdGh1Yi9ydWxlc2V0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcsIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzIH0gZnJvbSAnLi91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VUeXBlU2NyaXB0QXBpIH0gZnJvbSAnLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGdldFdiZnlWZXJzaW9uLCBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi91dGlscy92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuLyoqXG4gKiBBcHBsaWVzIG9ubHkgdGhlIGdsb2JhbCByZWxlYXNlLWFnZSBnYXRlLCB3aXRob3V0IHRvdWNoaW5nIGFueSByZXBvc2l0b3J5LiBTcGVsbGVkIG91dCBpbiBmdWxsXG4gKiByYXRoZXIgdGhhbiBzaG9ydGVuZWQgKGUuZy4gYGdhdGVgKSBiZWNhdXNlIHRoZSBkZWZhdWx0IGNvbW1hbmQgdGFrZXMgcG9zaXRpb25hbCBwYXRoczogYSBzaG9ydFxuICogbmFtZSB3b3VsZCBzd2FsbG93IGEgZGlyZWN0b3J5IHRoYXQgaGFwcGVucyB0byBzaGFyZSBpdC5cbiAqL1xuY29uc3QgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQgPSAnYXBwbHktcmVsZWFzZS1hZ2UtZ2F0ZSc7XG4vKiogU2FtZSBuYW1pbmcgcmF0aW9uYWxlIGFzIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLiAqL1xuY29uc3QgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCA9ICdnZW5lcmF0ZS11c2VyLWFnZW50LWNvbmZpZ3MnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKFxuICAgICAgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQsXG4gICAgICBcIkFwcGx5IG9ubHkgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoaXMgbWFjaGluZSdzIGdsb2JhbCBwYWNrYWdlLW1hbmFnZXIgY29uZmlnc1wiXG4gICAgKVxuICAgIC5jb21tYW5kKFxuICAgICAgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCxcbiAgICAgIFwiT3ZlcndyaXRlIHRoaXMgdXNlcidzIGFnZW50IGluc3RydWN0aW9uIGZpbGVzICh+Ly5jb2RleC9BR0VOVFMubWQsIH4vLmNsYXVkZS9DTEFVREUubWQsIH4vLmdlbWluaS9HRU1JTkkubWQpIHdpdGggdGhlIG9yZ2FuaXphdGlvbidzIGZpeGVkIGNvbnRlbnQgYW5kIG1lcmdlIHRoZSBvcmdhbml6YXRpb24ncyBzZXR0aW5ncyBpbnRvIH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uIGFuZCB+Ly5nZW1pbmkvc2V0dGluZ3MuanNvblwiXG4gICAgKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBmb3JjZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGx5IHdiZnkgZXZlbiB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgcmVjb3JkcyB0aGlzIHdiZnkgdmVyc2lvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZicsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ1NraXAgYWRkaW5nIG1hbmFnZWQgZGVwZW5kZW5jaWVzIGFuZCB0aGUgbGlua2VyIHByb2JlICh0aGUgZmluYWwgYGJ1biBpbnN0YWxsYCByZWZyZXNoaW5nIHRoZSBsb2NrZmlsZSBzdGlsbCBydW5zKScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFdiZnlWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuXG4gIC8vIERlbGliZXJhdGVseSBiZWZvcmUgdGhlIEJ1biBjaGVjayBpbiB3aWxsYm9vc3RlcmlmeVBhdGhzKCk6IHRoZSBnYXRlIG11c3QgYmUgYXBwbGlhYmxlIG9uIGFcbiAgLy8gbWFjaGluZSB3aG9zZSBCdW4gaXMgb3V0ZGF0ZWQsIHdoaWNoIGlzIGV4YWN0bHkgYSBtYWNoaW5lIHRoYXQgc3RpbGwgbmVlZHMgZ2F0aW5nLlxuICBpZiAoYXJndi5fWzBdID09PSBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCkge1xuICAgIGlmICghZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCkpIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYXJndi5fWzBdID09PSBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kKSB7XG4gICAgaWYgKCEoYXdhaXQgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzKCkpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGF3YWl0IHdpbGxib29zdGVyaWZ5UGF0aHMoYXJndi5wYXRocyBhcyBzdHJpbmdbXSwgYXJndi5za2lwRGVwcywgYXJndi5mb3JjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgY29tcGlsZXIgc2VydmVyIHNwYXduZWQgZm9yIEFTVCBwYXJzaW5nIGtlZXBzIGFuIG9wZW4gSVBDXG4gICAgLy8gY2hhbm5lbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBwcmV2ZW50IHRoZSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAgIGF3YWl0IGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk7XG4gIH1cbiAgaWYgKGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnKSB7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2lsbGJvb3N0ZXJpZnlQYXRocyhwYXRoczogc3RyaW5nW10sIHNraXBEZXBzOiBib29sZWFuLCBmb3JjZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBCZWZvcmUgYW55dGhpbmcgZWxzZSDigJQgZXZlbiB0aGUgQnVuIGNoZWNrIGJlbG93OiB0aGUgZGV2ZWxvcGVyIG1hY2hpbmUncyBnbG9iYWxcbiAgLy8gcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MgbXVzdCByZWNlaXZlIHRoZSBvcmcncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSBvbiBFVkVSWSBydW4sXG4gIC8vIGJlY2F1c2UgdGhleSBhcmUgd2hhdCBndWFyZHMgYnJhbmQtbmV3IGxvY2FsIHByb2plY3RzIHRoYXQgaGF2ZSBubyB3YmZ5LWdlbmVyYXRlZCByZXBvc2l0b3J5XG4gIC8vIGNvbmZpZyB5ZXQsIGFuZCB0aGF0IHByb3RlY3Rpb24gbXVzdCB3b3JrIGJlZm9yZSB0aGUgc3VwcG9ydGVkLXZlcnNpb24gY2hlY2suXG4gIGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpO1xuXG4gIC8vIHdiZnkgbWFuYWdlcyByZXBvc2l0b3JpZXMgdGhyb3VnaCBCdW4gKyBtaXNlIGFuZCB1c2VzIEJ1biAxLjQgcnVudGltZSBBUElzLiBUaGUgdmVyc2lvbiBmbG9vclxuICAvLyBhbHNvIGVuc3VyZXMgdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBvcHRpb25zIHByb2R1Y2UgdGhlIGluc3RhbGwgbGF5b3V0IHdiZnkgdmFsaWRhdGVzLiBJdFxuICAvLyBzdGF5cyB1bmNvbmRpdGlvbmFsIGV2ZW4gdGhvdWdoIHRoZSBhbHJlYWR5LWFwcGxpZWQgY2hlY2sgYmVsb3cgY2FuIG1ha2UgYSBydW4gYSBuby1vcDogYW5cbiAgLy8gb3V0ZGF0ZWQgQnVuIGlzIGEgYnJva2VuIGVudmlyb25tZW50IHdiZnkgbXVzdCByZXBvcnQsIGFuZCBoaWRpbmcgaXQgd2hlbmV2ZXIgZXZlcnkgcGF0aFxuICAvLyBoYXBwZW5zIHRvIGJlIHNraXBwZWQgd291bGQgc3VyZmFjZSBpdCBvbmx5IGxhdGVyLlxuICBjb25zdCBidW5WZXJzaW9uID0gQnVuLnZlcnNpb247XG4gIGlmIChCdW4uc2VtdmVyLm9yZGVyKGJ1blZlcnNpb24sIG1pbmltdW1CdW5WZXJzaW9uKSA8IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGB3YmZ5IHJlcXVpcmVzIEJ1biA+PSAke21pbmltdW1CdW5WZXJzaW9ufSAoZm91bmQgJHtidW5WZXJzaW9ufSkuIFVwZ3JhZGUgQnVuIGFuZCByZS1ydW4uYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBBIGAtZGlydHktbG9jYWxgIGxhYmVsIGlkZW50aWZpZXMgYW4gZWRpdGVkIGNoZWNrb3V0LCB3aG9zZSBuZXh0IGJ1aWxkIHByb2R1Y2VzIGRpZmZlcmVudCBmaWxlc1xuICAvLyB1bmRlciB0aGUgc2FtZSBsYWJlbCwgc28gc3VjaCBhIHJ1biBpcyBuZXZlciB0cmVhdGVkIGFzIGFscmVhZHkgYXBwbGllZC5cbiAgY29uc3QgdmVyc2lvbkxhYmVsID0gZ2V0V2JmeVZlcnNpb25MYWJlbCgpO1xuICBjb25zdCBza2lwcGFibGVWZXJzaW9uTGFiZWwgPVxuICAgICFmb3JjZSAmJiB2ZXJzaW9uTGFiZWwgJiYgIXZlcnNpb25MYWJlbC5lbmRzV2l0aCgnLWRpcnR5LWxvY2FsJykgPyB2ZXJzaW9uTGFiZWwgOiB1bmRlZmluZWQ7XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIGZvciAoY29uc3QgaW5wdXREaXJQYXRoIG9mIHBhdGhzKSB7XG4gICAgLy8gTm9ybWFsaXplIG9uY2UgYXQgdGhlIENMSSBib3VuZGFyeS4gR2VuZXJhdG9ycyB1c2UgZGlyUGF0aCBmb3IgY3dkIGFuZCBiYXNlbmFtZSBkZWNpc2lvbnM7XG4gICAgLy8gbGVhdmluZyB0aGUgc3VwcG9ydGVkIGRlZmF1bHQgYC5gIHVucmVzb2x2ZWQgd291bGQgZ2VuZXJhdGUgYW4gaW52YWxpZCBwYWNrYWdlIG5hbWUgb2YgYC5gLlxuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGlucHV0RGlyUGF0aCk7XG4gICAgLy8gQ29uZmluZSBldmVyeSBnZW5lcmF0ZWQgZmlsZSB0byB0aGlzIHJlcG9zaXRvcnkgKHNlZSBmc1V0aWwuZ2VuZXJhdGVGaWxlKS4gU2V0IEJFRk9SRSBhbnlcbiAgICAvLyBmaXhlciB3cml0ZXMsIGFuZCByZXNldCBvbiBldmVyeSBpdGVyYXRpb24gc28gYSBtdWx0aS1wYXRoIHJ1biBuZXZlciBrZWVwcyB0aGUgcHJldmlvdXMgcm9vdC5cbiAgICBmc1V0aWwuc2V0Um9vdERpclBhdGgoZnMuZXhpc3RzU3luYyhyb290RGlyUGF0aCkgPyByb290RGlyUGF0aCA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBUaGUgYmFkZ2UgcmVjb3JkcyB0aGUgYnVpbGQgdGhhdCBnZW5lcmF0ZWQgdGhlIHJlcG9zaXRvcnkncyBjb25maWd1cmF0aW9uLCBzbyB0aGUgc2FtZSBidWlsZFxuICAgIC8vIHdvdWxkIG9ubHkgcmV3cml0ZSB3aGF0IGlzIGFscmVhZHkgdGhlcmUuIFNraXBwaW5nIGlzIGEgZGVsaWJlcmF0ZSB0cmFkZTogdGhlIHBhcnRzIG9mIGEgcnVuXG4gICAgLy8gdGhhdCBkZXBlbmQgb24gc3RhdGUgT1VUU0lERSB0aGUgcmVwb3NpdG9yeSAoR2l0SHViIHNldHRpbmdzLCBkZXBlbmRlbmN5IHVwZGF0ZXMsIHRoZSBmZXRjaGVkXG4gICAgLy8gLmdpdGlnbm9yZSkgZG8gZ2V0IHNraXBwZWQgdG9vLCB3aGljaCBpcyB3aGF0IC0tZm9yY2UgaXMgZm9yLiBUaGUgcmVsZWFzZS1hZ2UgZXhlbXB0aW9ucyBhcmVcbiAgICAvLyB0aGUgZXhjZXB0aW9uOiB0aGV5IGV4cGlyZSBieSBkYXRlLCBhbmQgcmVzdG9yaW5nIHRoZSBnYXRlIG11c3Qgbm90IHdhaXQgZm9yIGEgbmV3IGJ1aWxkLlxuICAgIGlmIChcbiAgICAgIHNraXBwYWJsZVZlcnNpb25MYWJlbCAmJlxuICAgICAgKGF3YWl0IHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChyb290RGlyUGF0aCkpID09PSBza2lwcGFibGVWZXJzaW9uTGFiZWwgJiZcbiAgICAgIGhhc0N1cnJlbnRCdW5SZWxlYXNlQWdlRXhjbHVkZXMocm9vdERpclBhdGgpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgJHtyb290RGlyUGF0aH06IHdiZnkgJHtza2lwcGFibGVWZXJzaW9uTGFiZWx9IGlzIGFscmVhZHkgYXBwbGllZC4gUGFzcyAtLWZvcmNlIHRvIHJlLWFwcGx5LmApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBwYWNrYWdlc1N1YkRpclBhdGhzID0gZGlyZW50c1xuICAgICAgLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKVxuICAgICAgLm1hcCgoZCkgPT4gcGF0aC5yZXNvbHZlKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG4gICAgLy8gQWxzbyBjb3ZlciB3b3Jrc3BhY2VzIGRlY2xhcmVkIG91dHNpZGUgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0aGV5IHJlY2VpdmUgdGhlIHNhbWVcbiAgICAvLyBtYW5hZ2VkIGNvbmZpZ3MgKHRzY29uZmlnLmpzb24sIHBhY2thZ2UuanNvbiBjb252ZW50aW9ucywg4oCmKSBhcyBwYWNrYWdlcy8qIGNoaWxkcmVuLlxuICAgIGNvbnN0IHJvb3RQYWNrYWdlSnNvbiA9XG4gICAgICBpZ25vcmVFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXVxuICAgICAgKSA/PyB7fTtcbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGg6IHJvb3REaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb246IHJvb3RQYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBwYWNrYWdlc1N1YkRpclBhdGhzLnNvbWUoKHN1YkRpclBhdGgpID0+XG4gICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgICksXG4gICAgfSk7XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBbLi4ubmV3IFNldChbLi4ucGFja2FnZXNTdWJEaXJQYXRocywgLi4ud29ya3NwYWNlU3ViRGlyUGF0aHNdKV0uZmlsdGVyKFxuICAgICAgKHN1YkRpclBhdGgpID0+IHN1YkRpclBhdGggIT09IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aClcbiAgICApO1xuXG4gICAgLy8gUmVmdXNlZCB3cml0ZXMgb24gY29yZSBtYW5hZ2VkIGZpbGVzIHdvdWxkIGxlYXZlIHRoZSByZXBvc2l0b3J5IHBhcnRpYWxseSB1cGRhdGVkLCBzbyBza2lwXG4gICAgLy8gaXQgQkVGT1JFIGFueSBtdXRhdGlvbiB3aGVuIG9uZSBvZiB0aGVtIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICAgIGNvbnN0IG1hbmFnZWRGaWxlUGF0aHMgPSBbXG4gICAgICAuLi5bJy5naXRhdHRyaWJ1dGVzJywgJ2J1bmZpZy50b21sJywgJ2xlZnRob29rLnltbCcsICdwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCBuYW1lKVxuICAgICAgKSxcbiAgICAgIC4uLnN1YkRpclBhdGhzLmZsYXRNYXAoKHN1YkRpclBhdGgpID0+XG4gICAgICAgIFsncGFja2FnZS5qc29uJywgJ3RzY29uZmlnLmpzb24nXS5tYXAoKG5hbWUpID0+IHBhdGgucmVzb2x2ZShzdWJEaXJQYXRoLCBuYW1lKSlcbiAgICAgICksXG4gICAgXTtcbiAgICBjb25zdCB3cml0YWJsZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hbmFnZWRGaWxlUGF0aHMubWFwKChmaWxlUGF0aCkgPT4gZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKVxuICAgICk7XG4gICAgaWYgKHdyaXRhYmxlUmVzdWx0cy5pbmNsdWRlcyhmYWxzZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06IGEgbWFuYWdlZCBjb25maWcgZmlsZSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZsaWdodEVycm9ycyA9IFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VDb25maWdbJ3BhY2thZ2VKc29uJ107XG4gICAgICAgIGNvbnN0IGVycm9yID0gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcih7IHBhY2thZ2VKc29uIH0pO1xuICAgICAgICByZXR1cm4gZXJyb3IgPyBbYCR7ZGlyUGF0aH06ICR7ZXJyb3J9YF0gOiBbXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW2Ake3BhY2thZ2VKc29uUGF0aH0gaXMgaW52YWxpZGBdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChwcmVmbGlnaHRFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTpcXG4ke3ByZWZsaWdodEVycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIExldCBnZXRQYWNrYWdlQ29uZmlnIGRlcml2ZSBpc1Jvb3QgZm9yIHRoZSBlbnRyeSBwYXRoOiBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gIGlzIGFcbiAgICAvLyBzdXBwb3J0ZWQgaW52b2NhdGlvbiB3aG9zZSB0YXJnZXQgbXVzdCBrZWVwIGl0cyBjaGlsZCBjbGFzc2lmaWNhdGlvbiwgc28gZm9yY2luZ1xuICAgIC8vIGBpc1Jvb3Q6IHRydWVgIGhlcmUgd291bGQgYXBwbHkgcm9vdC1vbmx5IHByb2Nlc3NpbmcgKGxlZnRob29rIGluc3RhbGwsIHJvb3QgdHNjb25maWcsXG4gICAgLy8gQUdFTlRTLm1kLCDigKYpIHRvIGEgc3VicGFja2FnZS5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBFdmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSAoaW5jbHVkaW5nIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyopIGlzIGEgY2hpbGRcbiAgICAvLyBwYWNrYWdlOyB0aGUgcGFja2FnZXMvKiBoZXVyaXN0aWMgaW5zaWRlIGdldFBhY2thZ2VDb25maWcgd291bGQgbWlzY2xhc3NpZnkgYXBwcy8qIGFzIHJvb3RzLlxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCB7IGlzUm9vdDogZmFsc2UgfSkpXG4gICAgKTtcbiAgICBjb25zdCBpbnZhbGlkU3ViUGFja2FnZURpclBhdGggPSBzdWJEaXJQYXRocy5maW5kKFxuICAgICAgKHN1YkRpclBhdGgsIGluZGV4KSA9PiAhbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlnc1tpbmRleF0gJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICk7XG4gICAgaWYgKGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogJHtpbnZhbGlkU3ViUGFja2FnZURpclBhdGh9L3BhY2thZ2UuanNvbiBpcyBpbnZhbGlkLmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcbiAgICAvLyBUaGUgbWFuYWdlZCBpZ25vcmUgcnVsZSBpcyB1bmFuY2hvcmVkLCBzbyBhIG5lc3RlZCBjb3B5IChlLmcuIHdvcmtlcnMvYXBpLy5lbnYuY2xvdWRmbGFyZSkgaXNcbiAgICAvLyBhcyBtdWNoIGEgbGVhayBhcyBhIHJvb3Qgb25lOyB0aGUgd2lsZGNhcmQgcGF0aHNwZWMgY292ZXJzIGV2ZXJ5IGRlcHRoIGluIG9uZSBxdWVyeS5cbiAgICBjb25zdCB0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzID0gYWxsUGFja2FnZUNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuaXNDbG91ZGZsYXJlKVxuICAgICAgPyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgICAgICAgJ2dpdCcsXG4gICAgICAgICAgWyctYycsICdjb3JlLnF1b3RlUGF0aD1mYWxzZScsICdscy1maWxlcycsICctLScsICcuZW52LmNsb3VkZmxhcmUnLCAnKi8uZW52LmNsb3VkZmxhcmUnXSxcbiAgICAgICAgICByb290Q29uZmlnLmRpclBhdGhcbiAgICAgICAgKVxuICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKSlcbiAgICAgIDogW107XG4gICAgaWYgKHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFNFQ1VSSVRZIEVSUk9SOiBDbG91ZGZsYXJlIGNyZWRlbnRpYWxzIG11c3QgYmUgdW50cmFja2VkLiBSZW1vdmUgJHt0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzLmpvaW4oXG4gICAgICAgICAgJywgJ1xuICAgICAgICApfSBmcm9tIEdpdCwgcHVyZ2UgdGhlIHRva2VuIGZyb20gaGlzdG9yeSwgYW5kIHJvdGF0ZSBDTE9VREZMQVJFX0FQSV9UT0tFTiBiZWZvcmUgcmVydW5uaW5nIHdiZnkuYFxuICAgICAgKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBmaXhUeXBvc1Byb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGF3YWl0IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gTWFuYWdlZCByZXBvc2l0b3JpZXMgdXNlIEJ1biB3aXRoIG1pc2UgKGFuZCBvcHRpb25hbGx5IGZub3gpLlxuICAgIGNvbnN0IHByZXZpb3VzQnVuR2xvYmFsU3RvcmUgPSByZWFkQnVuR2xvYmFsU3RvcmUocm9vdERpclBhdGgpO1xuICAgIC8vIFJvb3QtbGV2ZWwgaW5zdGFsbCBsYXlvdXQgbXVzdCBjb3ZlciB3b3Jrc3BhY2UgYXBwcyB0b286IE5leHQuanMgY29tbW9ubHkgbGl2ZXMgdW5kZXJcbiAgICAvLyBwYWNrYWdlcy8qIG9yIGFwcHMvKiB3aGlsZSBidW5maWcudG9tbCBleGlzdHMgb25seSBhdCB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgIGNvbnN0IHVzZUdsb2JhbFN0b3JlID0gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKGFsbFBhY2thZ2VDb25maWdzLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCBza2lwRGVwcyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBnZW5lcmF0ZU1pc2VUb21sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZyk7XG4gICAgLy8gUnVuIGFmdGVyIGdlbmVyYXRlRm5veFRvbWwgc28gaXRzIHRyYW5zYWN0aW9uYWwgcmVjaXBpZW50IHN5bmMgY2Fubm90IHJlc3RvcmUgYSBzbmFwc2hvdFxuICAgIC8vIG92ZXIgZGVmaW5pdGlvbnMgaW5zZXJ0ZWQgaGVyZS5cbiAgICBhd2FpdCBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIC8vIFRoZSBsYXlvdXQgbXVzdCBiZSB2ZXJpZmllZCBpbnN0YWxsYWJsZSBCRUZPUkUgYW55IGBidW4gYWRkYCBtdXRhdGVzIHBhY2thZ2UuanNvbiBmaWxlczpcbiAgICAvLyBwZXItcGFja2FnZSBpbnN0YWxscyB0b2xlcmF0ZSBmYWlsdXJlcyAoc3Bhd25TeW5jIGRpc2NhcmRzIHRoZWlyIHN0YXR1cyksIHNvIGEgbGF5b3V0IHRoYXRcbiAgICAvLyBjYW5ub3QgaW5zdGFsbCB3b3VsZCBzaWxlbnRseSBkcm9wIGV2ZXJ5IG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGUgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4uXG4gICAgLy8gQSBkb2NzLW9ubHkgcmVwb3NpdG9yeSBoYXMgbm8gbWFuaWZlc3QgdG8gcHJvYmUgb24gaXRzIGZpcnN0IHJ1bjsgZ2VuZXJhdGVQYWNrYWdlSnNvbiBiZWxvd1xuICAgIC8vIGNyZWF0ZXMgaXQgYmVmb3JlIHRoZSBhdXRob3JpdGF0aXZlIHJlZnJlc2hCdW5Mb2NrIGNoZWNrLlxuICAgIGlmIChcbiAgICAgICFza2lwRGVwcyAmJlxuICAgICAgcm9vdENvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmXG4gICAgICAhcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwocm9vdERpclBhdGgsIHJvb3RDb25maWcsIHByZXZpb3VzQnVuR2xvYmFsU3RvcmUsIHVzZUdsb2JhbFN0b3JlKVxuICAgICkge1xuICAgICAgLy8gcmVmcmVzaEJ1bkxvY2sgYmVsb3cgaXMgdGhlIGF1dGhvcml0eSBvbiB3aGV0aGVyIHRoZSBmaW5hbCBpbnN0YWxsIGZhaWxlZC5cbiAgICAgIGNvbnNvbGUud2FybihgYnVuIGluc3RhbGwgY3VycmVudGx5IGZhaWxzIGluICR7cm9vdERpclBhdGh9IHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIC8vIE90aGVyIG93bmVycyBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGUgd29ya2Zsb3dzICh0aGVpciBzZWNyZXRzIGFuZCBydW5uZXJzXG4gICAgLy8gZG8gbm90IGV4aXN0IHRoZXJlKSwgc28gYW55IG90aGVyIEdpdEh1Yi1ob3N0ZWQgTm9kZS5qcyByZXBvc2l0b3J5IGdldHMgc2VsZi1jb250YWluZWRcbiAgICAvLyB3b3JrZmxvd3MgaW5zdGVhZCDigJQga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3MgaWRlbnRpdHkuXG4gICAgLy8gcm9vdENvbmZpZy5pc1Jvb3Q6IGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIChgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKSBrZWVwc1xuICAgIC8vIGlzUm9vdCBmYWxzZSwgYW5kIEdpdEh1YiBpZ25vcmVzIHdvcmtmbG93IGZpbGVzIG5lc3RlZCB1bmRlciBhIHBhY2thZ2UgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHNob3VsZFJ1blNlbGZDb250YWluZWRXb3JrZmxvd3MgPVxuICAgICAgIXNob3VsZFJ1bldvcmtmbG93cyAmJlxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgICEhcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6JykgJiZcbiAgICAgIHJvb3RDb25maWcuaXNSb290O1xuICAgIC8vIGZpeFR5cG9zIHJlYWQtbW9kaWZ5LXdyaXRlcyB0aGUgTWFya2Rvd24gYW5kIFlBTUwgZmlsZXMgdGhhdCB0aGUgZ2VuZXJhdG9ycyBiZWxvdyByZXdyaXRlLlxuICAgIGF3YWl0IGZpeFR5cG9zUHJvbWlzZTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZml4UmFpbHdheWlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICAuLi4oc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA/IFtnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3Mocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgLy8gR2l0IGhvb2tzIGFyZSByZXBvc2l0b3J5LWxldmVsIHN0YXRlOiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCB3cml0ZSBhXG4gICAgICAvLyBjaGlsZCBsZWZ0aG9vay55bWwgb3IgcmVwbGFjZSB0aGUgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyBob29rIGluc3RhbGxhdGlvbi5cbiAgICAgIC4uLihyb290Q29uZmlnLmlzUm9vdCA/IFtnZW5lcmF0ZUxlZnRob29rKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgXSk7XG4gICAgLy8gQWZ0ZXIgdGhlIHdvcmtmbG93IGdlbmVyYXRvciAoYW5kIGl0cyBwb29sZWQgd3JpdGVzKSBzbyB0aGUgaW5zdHJ1Y3Rpb24gZmlsZXMgZGVzY3JpYmUgdGhlXG4gICAgLy8gZmluYWxpemVkIHdvcmtmbG93IGZpbGVzIGluc3RlYWQgb2YgbGFnZ2luZyBvbmUgcnVuIGJlaGluZC5cbiAgICBhd2FpdCBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4Q2hha3JhVG9hc3Rlcihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSmF2YShjb25maWcpKSBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcERlcHMpO1xuXG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJiBkb2VzQ29udGFpbkpzT3JUcyhyb290Q29uZmlnKSkge1xuICAgICAgICAvLyBNb25vcmVwbyB2ZXJpZmljYXRpb24gY2FuIGludm9rZSBveGxpbnQgZnJvbSBldmVyeSB3b3Jrc3BhY2UuIEdpdmVcbiAgICAgICAgLy8gbm9uLWNvZGUgcGFja2FnZXMgYSBsb2NhbCBjb25maWcgc28gb3hsaW50IGRvZXMgbm90IGNsaW1iIHRvIHRoZVxuICAgICAgICAvLyByb290IGNvbmZpZyBhbmQgcmVqZWN0IHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMgZnJvbSBhIHBhY2thZ2UgY3dkLlxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAvLyBSdW4gYWZ0ZXIgZXZlcnkgcG9vbGVkIGdlbmVyYXRvciB3cml0ZSBzbyBub3JtYWxpemF0aW9uIGNhbm5vdCBvdmVyd3JpdGUgYSBjb25jdXJyZW50XG4gICAgLy8gdXBkYXRlLCBhbmQgYmVmb3JlIGNsZWFudXAgc28gZm9ybWF0dGVyIG1ldGFkYXRhIGNhY2hlcyBvYnNlcnZlIHRoZSBjaGFuZ2VkIGZpbGVzLlxuICAgIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhyb290RGlyUGF0aCk7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBmYWlsZWQgaW5zdGFsbCBtdXN0IGZhaWwgdGhlIENMSTogZXhpdGluZyAwIHdpdGggYSBzdGFsZSBvciBtaXNzaW5nIEJ1biBsb2NrZmlsZSB3b3VsZFxuICAgICAgLy8gaGlkZSBhIGJyb2tlbiBtYW5hZ2VkIGNvbmZpZ3VyYXRpb24uXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gQnVuIHdyaXRlcyBidW4ubG9jayBiZWZvcmUgbGlmZWN5Y2xlIHNjcmlwdHMsIHNvIGEgZmFpbGVkIGluc3RhbGwgY2FuIHN0aWxsIGxlYXZlIEd1YXJkXG4gICAgICAvLyBVUkxzIGJlaGluZC4gTm9ybWFsaXplIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBvdXRwdXQgd2l0aG91dCByZXBsYWNpbmcgdGhlIGluc3RhbGwgZXJyb3IuXG4gICAgICBjb25zdCBub3JtYWxpemVkTG9ja2ZpbGVQYXRoID0gbm9ybWFsaXplQnVuTG9ja2ZpbGUocm9vdERpclBhdGgpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRMb2NrZmlsZVBhdGgpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtub3JtYWxpemVkTG9ja2ZpbGVQYXRofSB0byBrZWVwIGl0IHJlZ2lzdHJ5LWFnbm9zdGljLmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbm9ybWFsaXplIHRoZSBCdW4gbG9ja2ZpbGU6JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcik7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgfVxuICAgIHNwYXduU3luYygnYnVuJywgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gaGFzSW52YWxpZFBhY2thZ2VDb25maWc7XG59XG5cbi8qKlxuICogUHJvYmVzIGBidW4gaW5zdGFsbGAgdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci4gQW4gaW5jb21wYXRpYmlsaXR5IG11c3QgYmUgZml4ZWQgaW4gdGhlXG4gKiByZXBvc2l0b3J5IG9yIGluIHdiZnkncyBtYW5hZ2VkIGxpc3RzLCBuZXZlciBieSBzd2l0Y2hpbmcgdGhlIGxpbmtlci4gUmV0dXJucyBmYWxzZSB3aGVuIHRoZVxuICogaW5zdGFsbCBmYWlscy5cbiAqL1xuZnVuY3Rpb24gcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgLy8gQSBsYXlvdXQgc3dpdGNoIG11c3QgcHJvYmUgZnJvbSBhIGNsZWFuIHRyZWUgYmVjYXVzZSBCdW4gZG9lcyBub3QgcmVtb3ZlIHRoZSBwcmV2aW91cyBsYXlvdXQncyBsZWZ0b3ZlcnMuXG4gIGlmIChwcmV2aW91c0dsb2JhbFN0b3JlICE9PSB1c2VHbG9iYWxTdG9yZSkge1xuICAgIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgfVxuICAvLyBSZXRyeSBvbmNlIHNvIGEgdHJhbnNpZW50IGZhaWx1cmUgKHJlZ2lzdHJ5IGhpY2N1cCwgZmxha3kgbGlmZWN5Y2xlIHNjcmlwdCkgZG9lcyBub3RcbiAgLy8gbWFzcXVlcmFkZSBhcyBhIGxheW91dCBpbmNvbXBhdGliaWxpdHkuXG4gIGlmIChzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCwgMSkgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIC8vIENsZWFuIHVwIHRoZSBmYWlsZWQgYXR0ZW1wdCBzbyBsYXRlciBpbnN0YWxscyBkbyBub3QgcnVuIG9uIGEgcG9sbHV0ZWQgdHJlZS5cbiAgcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGgsIHJvb3RDb25maWcpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoOiBzdHJpbmcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gQ292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlOiBsZWZ0b3ZlcnMgY2FuIGtlZXAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgcmVzb2x2YWJsZS5cbiAgY29uc3Qgbm9kZU1vZHVsZXNQYXRocyA9IFtcbiAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnKSxcbiAgICAuLi5bLi4uZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykudmFsdWVzKCldLm1hcCgod29ya3NwYWNlRGlyKSA9PlxuICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCB3b3Jrc3BhY2VEaXIsICdub2RlX21vZHVsZXMnKVxuICAgICksXG4gIF07XG4gIC8vIE5ldmVyIGRlbGV0ZSB0aHJvdWdoIGEgd29ya3NwYWNlIHN5bWxpbmsgdGhhdCBlc2NhcGVzIHRoaXMgcmVwb3NpdG9yeS5cbiAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2Ygbm9kZU1vZHVsZXNQYXRocykge1xuICAgIGNvbnN0IHJlYWxQYXJlbnREaXJQYXRoID0gaWdub3JlRXJyb3IoKCkgPT4gZnMucmVhbHBhdGhTeW5jKHBhdGguZGlybmFtZShub2RlTW9kdWxlc1BhdGgpKSk7XG4gICAgaWYgKFxuICAgICAgIXJlYWxQYXJlbnREaXJQYXRoIHx8XG4gICAgICAocmVhbFBhcmVudERpclBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJiAhcmVhbFBhcmVudERpclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpO1xuICBpZiAoc3RhdHVzID09PSAwKSByZXR1cm47XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNDYsNDcsNDgsNDksNTAsNTFdLCJtYXBwaW5ncyI6Imk0QkFXQSxNQUFhLEdBQW9ELENBQy9ELENBQ0UsUUFBUyxNQUNULFlBQWEsc0dBQ2YsRUFDQSxDQUNFLFFBQVMsZUFDVCxZQUNFLHFuQkFDSixFQUNBLENBQ0UsUUFBUyxtQkFDVCxZQUNFLDRHQUNKLEVBQ0EsQ0FDRSxRQUFTLG9CQUNULFlBQ0UseUtBQ0osRUFDQSxDQUNFLFFBQVMsVUFDVCxZQUFhLCtEQUNmLEVBQ0EsQ0FDRSxRQUFTLFFBQ1QsWUFBYSxzR0FDZixDQUNGLEVBb0NhLEdBQWlELENBQzVELENBQUUsUUFBUyxVQUFXLFlBQWEsOENBQStDLEVBQ2xGLENBQUUsUUFBUyxXQUFZLFlBQWEsNkNBQThDLEVBQ2xGLENBQUUsUUFBUyxTQUFVLFlBQWEsd0NBQXlDLEVBQzNFLENBQUUsUUFBUyxXQUFZLFlBQWEsdURBQXdELENBQzlGLEVBUWEsRUFBb0QsQ0FDL0QsQ0FDRSxRQUFTLHNCQUNULFlBQWEsd0VBQ2YsRUFDQSxDQUNFLFFBQVMsV0FDVCxZQUNFLGtOQUNKLEVBQ0EsQ0FDRSxRQUFTLHNCQUNULFlBQ0Usd0dBQ0osRUFDQSxDQUNFLFFBQVMsc0JBQ1QsWUFBYSxtR0FDZixFQUNBLENBQ0UsUUFBUyxxQkFDVCxZQUNFLDBPQUNKLEVBQ0EsQ0FDRSxRQUFTLDhCQUNULFlBQWEsbUdBQ2YsRUFDQSxDQUNFLFFBQVMsZUFDVCxZQUFhLGdGQUNmLEVBQ0EsQ0FDRSxRQUFTLGlCQUNULFlBQWEsd0ZBQ2YsQ0FDRixFQVFBLFNBQWdCLEdBQXNCLEVBQThDLENBQ2xGLE9BQU8sRUFDSixJQUNFLEdBQ0MsTUFBTSxFQUFRLFFBQVEsV0FBVyxFQUFRLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBUSxZQUFZ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