@willbooster/wbfy 1.13.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +8 -8
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -22,7 +22,7 @@ ${e instanceof Error?`---
22
22
  `}var at=`applypatch-msg.pre-applypatch.post-applypatch.pre-commit.pre-merge-commit.prepare-commit-msg.commit-msg.post-commit.pre-rebase.post-checkout.post-merge.pre-push.pre-receive.update.proc-receive.post-receive.post-update.reference-transaction.push-to-checkout.pre-auto-gc.post-rewrite.sendemail-validate.fsmonitor-watchman.p4-changelist.p4-prepare-changelist.p4-post-changelist.p4-pre-submit.post-index-change`.split(`.`);function ot(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)}const O=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),k=e=>t=>Array.isArray(t)?e(t):t,st=e=>t=>Array.isArray(t)&&t.every(e=>typeof e==`string`)?e(t):t,A=st(e=>[...new Set(e)]),j=O([A,st(e=>e.toSorted())]),M=e=>(t,...n)=>ot(t)?e(t,...n):t,N=(e,t)=>{let n=M(r=>(t&&(r=Object.fromEntries(Object.entries(r).map(([e,t])=>[e,n(t)]))),D(r,e)));return n},P=N(),ct=N([`type`,`url`]),lt=N([`name`,`email`,`url`]),ut=N([`lib`,`bin`,`man`,`doc`,`example`,`test`]),F=(e,t)=>M((n,...r)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...r)}:n),dt=N(at),ft=e=>{let[t]=e.split(`>`),n=[...t.matchAll(`@`)];if(!n.length||n.length===1&&n[0].index===0)return{name:e};let r=n.pop().index;return{name:t.substring(0,r),range:t.substring(r+1)}},pt=N((e,t)=>{let{name:n,range:r}=ft(e),{name:i,range:a}=ft(t);return n===i?r?a?c(l(r),l(a)):1:-1:n.localeCompare(i,`en`)}),mt=e=>{let t=e.indexOf(`@`,+!!e.startsWith(`@`));return t===-1?e:e.slice(0,t)},ht=(e,t)=>{let n=mt(e),r=mt(t);return n<r?-1:+(n>r)},gt=new Map,_t=()=>{let t=process.cwd();return gt.has(t)||gt.set(t,e.existsSync(`yarn.lock`)||e.existsSync(`.yarn/`)||e.existsSync(`.yarnrc.yml`)||e.existsSync(`pnpm-lock.yaml`)||e.existsSync(`pnpm-workspace.yaml`)),gt.get(t)};function vt(e){return typeof e.packageManager==`string`?e.packageManager.startsWith(`npm@`):e.devEngines?.packageManager?.name?e.devEngines.packageManager.name===`npm`:e.pnpm?!1:e.engines?.npm?!0:!_t()}const I=M((e,t)=>Object.keys(e).length<2?e:vt(t)?D(e,(e,t)=>e.localeCompare(t,`en`)):D(e)),yt=O([N([`packages`,`catalog`]),F(`packages`,j),F(`catalog`,I)]),bt=O([N([`files`,`excludedFiles`,`env`,`parser`,`parserOptions`,`settings`,`plugins`,`extends`,`rules`,`overrides`,`globals`,`processor`,`noInlineConfig`,`reportUnusedDisableDirectives`]),F(`env`,P),F(`globals`,P),F(`overrides`,k(e=>e.map(bt))),F(`parserOptions`,P),F(`rules`,N((e,t)=>e.split(`/`).length-t.split(`/`).length||e.localeCompare(t))),F(`settings`,P)]),xt=N([`description`,`url`,`href`]),St=O([M(e=>D(e,[...Object.keys(e).filter(e=>e!==`overrides`).sort(),`overrides`])),F(`overrides`,k(e=>e.map(O([P,F(`options`,P)]))))]),Ct=N([`node`,`npm`,`yarn`]),wt=O([N([`command`,`dependencies`,`files`,`output`]),F(`dependencies`,k(e=>e.map(N([`script`,`cascade`])))),F(`env`,M(e=>D(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,N([`external`,`default`])(t)]))))),F(`service`,O([N([`readyWhen`]),F(`readyWhen`,P)]))]),Tt=M(e=>D(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,wt(t)])))),Et=F(`packageManager`,N([`name`,`version`,`onFail`])),Dt=O([N([`peerDependencyRules`,`neverBuiltDependencies`,`onlyBuiltDependencies`,`onlyBuiltDependenciesFile`,`allowedDeprecatedVersions`,`allowNonAppliedPatches`,`updateConfig`,`auditConfig`,`requiredScripts`,`supportedArchitectures`,`overrides`,`patchedDependencies`,`packageExtensions`],!0),F(`overrides`,pt)]),Ot=new Set([`install`,`pack`,`prepare`,`publish`,`restart`,`shrinkwrap`,`start`,`stop`,`test`,`uninstall`,`version`]),kt=(e,t)=>Object.hasOwn(t,`devDependencies`)&&Object.hasOwn(t.devDependencies,e),At=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,jt=e=>e.includes(`*`)&&At.test(e),Mt=e=>!kt(`npm-run-all`,e)&&!kt(`npm-run-all2`,e)?!1:[`scripts`,`betterScripts`].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>jt(e));function Nt(e,t=``){let n=new Map;for(let r of e){let e=(t?r.slice(t.length+1):r).indexOf(`:`);if(e>0){let i=r.slice(0,(t?t.length+1:0)+e);n.has(i)||n.set(i,[]),n.get(i).push(r)}else n.has(r)||n.set(r,[]),n.get(r).push(r)}return Array.from(n.keys()).sort().flatMap(e=>{let t=n.get(e);if(t.length>1&&t.some(t=>t!==e&&t.startsWith(e+`:`))){let n=t.filter(t=>t===e||!t.startsWith(e+`:`)).sort(),r=t.filter(t=>t.startsWith(e+`:`));return[...n,...Nt(r,e)]}return t.sort()})}const Pt=M((e,t)=>{let n=Object.keys(e),r=new Set;return n=n.map(e=>{let t=e.replace(/^(?:pre|post)/,``);return Ot.has(t)||n.includes(t)?(r.add(t),t):e}),Mt(t)||(n=Nt(n)),n=n.flatMap(e=>r.has(e)?[`pre${e}`,e,`post${e}`]:[e]),D(e,n)}),Ft=e=>{let{defaultConditions:t=[],restConditions:n=[]}=Object.groupBy(e,e=>e==="default"?`defaultConditions`:`restConditions`);return[...n,...t]},It=M(e=>{let{paths:t=[],conditions:n=[]}=Object.groupBy(Object.keys(e),e=>e.startsWith(`.`)?`paths`:`conditions`);return Object.fromEntries([...t,...Ft(n)].map(t=>[t,It(e[t])]))}),Lt=[{key:`$schema`},{key:`name`},{key:`displayName`},{key:`version`},{key:`stableVersion`},{key:`private`},{key:`description`},{key:`categories`,over:A},{key:`keywords`,over:A},{key:`homepage`},{key:`bugs`,over:N([`url`,`email`])},{key:`repository`,over:ct},{key:`funding`,over:ct},{key:`license`,over:ct},{key:`qna`},{key:`author`,over:lt},{key:`maintainers`,over:k(e=>e.map(lt))},{key:`contributors`,over:k(e=>e.map(lt))},{key:`publisher`},{key:`sideEffects`},{key:`type`},{key:`imports`},{key:`exports`,over:It},{key:`main`},{key:`svelte`},{key:`umd:main`},{key:`jsdelivr`},{key:`unpkg`},{key:`module`},{key:`source`},{key:`jsnext:main`},{key:`browser`},{key:`react-native`},{key:`types`},{key:`typesVersions`},{key:`typings`},{key:`style`},{key:`example`},{key:`examplestyle`},{key:`assets`},{key:`bin`,over:P},{key:`man`},{key:`directories`,over:ut},{key:`files`,over:A},{key:`workspaces`,over:yt},{key:`binary`,over:N([`module_name`,`module_path`,`remote_path`,`package_name`,`host`])},{key:`scripts`,over:Pt},{key:`betterScripts`,over:Pt},{key:`wireit`,over:Tt},{key:`l10n`},{key:`contributes`,over:P},{key:`activationEvents`,over:A},{key:`husky`,over:F(`hooks`,dt)},{key:`simple-git-hooks`,over:dt},{key:`pre-commit`},{key:`commitlint`,over:P},{key:`lint-staged`},{key:`nano-staged`},{key:`config`,over:P},{key:`nodemonConfig`,over:P},{key:`browserify`,over:P},{key:`babel`,over:P},{key:`browserslist`},{key:`xo`,over:P},{key:`prettier`,over:St},{key:`eslintConfig`,over:bt},{key:`eslintIgnore`},{key:`npmpkgjsonlint`,over:P},{key:`npmPackageJsonLintConfig`,over:P},{key:`npmpackagejsonlint`,over:P},{key:`release`,over:P},{key:`remarkConfig`,over:P},{key:`stylelint`},{key:`ava`,over:P},{key:`jest`,over:P},{key:`jest-junit`,over:P},{key:`jest-stare`,over:P},{key:`mocha`,over:P},{key:`nyc`,over:P},{key:`c8`,over:P},{key:`tap`,over:P},{key:`oclif`,over:N(void 0,!0)},{key:`resolutions`,over:P},{key:`overrides`,over:I},{key:`dependencies`,over:I},{key:`devDependencies`,over:I},{key:`dependenciesMeta`,over:N(ht,!0)},{key:`peerDependencies`,over:I},{key:`peerDependenciesMeta`,over:N(void 0,!0)},{key:`optionalDependencies`,over:I},{key:`bundledDependencies`,over:j},{key:`bundleDependencies`,over:j},{key:`extensionPack`,over:j},{key:`extensionDependencies`,over:j},{key:`flat`},{key:`packageManager`},{key:`engines`,over:P},{key:`engineStrict`,over:P},{key:`devEngines`,over:Et},{key:`volta`,over:Ct},{key:`languageName`},{key:`os`},{key:`cpu`},{key:`preferGlobal`,over:P},{key:`publishConfig`,over:P},{key:`icon`},{key:`badges`,over:k(e=>e.map(xt))},{key:`galleryBanner`,over:P},{key:`preview`},{key:`markdown`},{key:`pnpm`,over:Dt}],Rt=Lt.map(({key:e})=>e),zt=O(Lt.map(({key:e,over:t})=>t?F(e,t):void 0).filter(Boolean));function Bt(e,t){if(typeof e==`string`){let{indent:n,type:r}=nt(e),i=e.slice(-1)===`
23
23
  `?`
24
24
  `:``,a=it(e);e=JSON.parse(e);let o=JSON.stringify(t(e),null,r===`tab`?` `:n)+i;return a===`\r
25
- `&&(o=o.replace(/\n/g,a)),o}return t(e)}function Vt(e,t={}){return Bt(e,M(e=>{let n=t.sortOrder||Rt;if(Array.isArray(n)){let t=Object.keys(e),{privateKeys:r=[],publicKeys:i=[]}=Object.groupBy(t,e=>e[0]===`_`?`privateKeys`:`publicKeys`);n=[...n,...Rt,...i.sort(),...r.sort()]}return zt(D(e,n),e)}))}async function Ht(n){return b.functionIgnoringException(`fixTestDirectoriesUpdatingPackageJson`,async()=>{await Promise.all(n.map(async n=>{let r=t.join(n,`package.json`);if(!e.existsSync(r))return;let i=t.join(n,`test`);for(let a of[`__tests__`,`tests`]){let o=t.join(n,a);try{await Ut(o,i);let t=JSON.parse(await e.promises.readFile(r,`utf8`)),n=!1,s=t.scripts??{};for(let[e,t]of Object.entries(s)){let r=t.replaceAll(a,`test`);t!==r&&(s[e]=r,n=!0)}if(t.scripts=s,!n)return;await x.generateFile(r,JSON.stringify(Vt(t),void 0,2))}catch{}}}))})}async function Ut(n,r){if(!e.existsSync(r)){await e.promises.rename(n,r);return}let i=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(i.map(async i=>{let a=t.join(n,i.name),o=t.join(r,i.name),s=e.existsSync(o)?await e.promises.stat(o):void 0;if(i.isDirectory()&&s?.isDirectory()){await Ut(a,o);return}await e.promises.rename(a,o)})),await e.promises.rm(n,{recursive:!0})}async function Wt(e,n){return b.functionIgnoringException(`fixTypeDefinitions`,async()=>{let r=t.resolve(e.dirPath,`@types`),i=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,`src`,`types`),a=await v(()=>o.readdir(r,{withFileTypes:!0}));if(a)for(let e of a){let a=e.name.slice(0,-5),s=e.name.endsWith(`.d.ts`),c=s?a:e.name;c.includes(`__`)&&(c=`@${c.replace(`__`,`/`)}`);let l=n.some(e=>e.packageJson?.dependencies?.[c]||e.packageJson?.devDependencies?.[c]);e.isFile()&&s?l?(await o.mkdir(t.join(r,a),{recursive:!0}),await S.run(()=>o.rename(t.join(r,e.name),t.join(r,a,`index.d.ts`)))):i&&(await o.mkdir(i,{recursive:!0}),await S.run(()=>o.rename(t.join(r,e.name),t.join(i,e.name)))):e.isDirectory()&&i&&!l&&(await o.mkdir(i,{recursive:!0}),await S.run(()=>v(()=>o.rename(t.join(r,e.name,`index.d.ts`),t.join(i,`${e.name}.d.ts`)))))}})}function L(e,t){return t}function Gt(e,t,n){let r=[...e];for(let[i,a]of t.entries())r[i]===void 0?r[i]=Kt(a,n):qt(e[i],n)&&qt(a,n)?r[i]=u(e[i],a,n):e.includes(a)||r.push(a);return r}function Kt(e,t){return qt(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function qt(e,t){return!!e&&typeof e==`object`&&t.isMergeableObject(e)}function Jt(e,t){let n=e[t];return delete e[t],e[t]=n,e}function R(e){let t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(let[n,r]of t)delete e[n],e[n]=r,r&&typeof r==`object`&&!Array.isArray(r)&&R(r);return e}const Yt={name:`autofix.ci`,on:{pull_request:null,push:{branches:[`main`]}},permissions:{contents:`read`},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":`ubuntu-latest`}}},Xt={test:{name:`Test`,on:{pull_request:null,push:{branches:[`main`,`wbfy`]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:`write`,"pull-requests":`read`},jobs:{test:{uses:`WillBooster/reusable-workflows/.github/workflows/test.yml@main`}}},release:{name:`Release`,on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":`write`,contents:`write`},jobs:{release:{uses:`WillBooster/reusable-workflows/.github/workflows/release.yml@main`}}},"semantic-pr":{name:`Lint PR title`,on:{pull_request_target:{types:[`opened`,`edited`,`synchronize`]}},jobs:{"semantic-pr":{uses:`WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main`}}},sync:{name:`Sync`,on:{},permissions:{contents:`write`},jobs:{sync:{uses:`WillBooster/reusable-workflows/.github/workflows/sync.yml@main`}}},"close-comment":{name:`Add close comment`,on:{pull_request:{types:[`opened`]}},jobs:{"close-comment":{uses:`WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main`}}}};async function Zt(n){return b.functionIgnoringException(`generateWorkflow`,async()=>{if(Qt(n.repository))return;let r=t.resolve(n.dirPath,`.github`,`workflows`);await e.promises.mkdir(r,{recursive:!0});let i=t.resolve(n.dirPath,`.github`,`semantic.yml`);await S.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));let a=await e.promises.readdir(r,{withFileTypes:!0});for(let n of a)!n.isFile()||!$t(n.name)||await S.run(()=>e.promises.rm(t.join(r,n.name),{force:!0}));let o=new Set([`test.yml`,`autofix.yml`,`semantic-pr.yml`,`close-comment.yml`,...a.filter(e=>e.isFile()&&e.name.endsWith(`.yml`)&&!$t(e.name)).map(e=>e.name)]);n.depending.semanticRelease&&o.add(`release.yml`),n.isPublicRepo||(o.delete(`autofix.yml`),await S.run(()=>e.promises.rm(t.join(r,`autofix.yml`),{force:!0})));for(let e of o){let i=t.basename(e,`.yml`);await S.run(()=>en(n,r,i))}})}function Qt(e){return e?.endsWith(`/reusable-workflows`)??!1}function $t(e){return/^gen-pr(?:-.+)?\.ya?ml$/u.test(e)}async function en(n,r,i){let a=t.join(r,`${i}.yml`),o=e.existsSync(t.join(r,`deploy-production.yml`));if(i===`autofix`){await rn(nn(n),a);return}let s=structuredClone(i in Xt?Xt[i]:{});try{let t=await e.promises.readFile(a,`utf8`),n=d.load(t);s=u.all([s,n,s],{arrayMerge:Gt})}catch{}if(!(`jobs`in s))return;i.startsWith(`deploy`)&&(s={...s,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},Jt(s,`jobs`),s.on?.push&&(s.on.push[`paths-ignore`]=[...new Set([`**.md`,`**/docs/**`,...s.on.push[`paths-ignore`]??[]])])),i===`release`&&s.jobs.release&&o&&(s.permissions??={},s.permissions.actions=`write`,s.jobs.release.with??={},s.jobs.release.with.trigger_deploy_workflow=`deploy-production.yml`);let c=!1;for(let e of Object.values(s.jobs))e.uses?.includes(`/reusable-workflows/`)&&(tn(n,e,i),c=!0);if(c){switch(i){case`release`:if(s.on?.schedule)delete s.on.push;else if(s.on?.push&&n.release.branches.length>0)s.on.push.branches=n.release.branches;else{await e.promises.rm(t.join(r,`release.yml`),{force:!0});return}n.isPublicRepo?(s.permissions??={},s.permissions[`id-token`]=`write`):delete s.permissions?.[`id-token`];break;case`test`:delete s.permissions?.actions,s.on?.pull_request&&delete s.on.pull_request[`paths-ignore`],s.on?.push&&(delete s.on.push[`paths-ignore`],s.on.push.branches=s.on.push.branches.filter(e=>e!==`renovate/**`));break}if(await rn(s,a),i===`sync`){if(await e.promises.rm(t.join(r,`sync-init.yml`),{force:!0}),!s.jobs.sync?.with)return;s.jobs[`sync-force`]=s.jobs.sync;let n=s.jobs.sync.with.sync_params_without_dest;if(typeof n!=`string`)return;s.jobs.sync.with.sync_params_without_dest=`--force ${n}`,s.name=`Force to Sync`,s.on={workflow_dispatch:null},delete s.jobs.sync,await rn(s,t.join(r,`sync-force.yml`))}}}function tn(e,t,n){if(t.with??={},t.secrets??={},(n===`test`||n===`release`)&&(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&(n===`release`||n.startsWith(`deploy`))||t.with.server_url&&n.startsWith(`deploy`))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),n===`sync`){let e=t.with.sync_params_without_dest;typeof e==`string`&&(t.with.sync_params_without_dest=e.replace(`sync `,``))}if(e.repository?.startsWith(`github:WillBooster/`)?t.uses=t.uses?.replace(`WillBoosterLab/`,`WillBooster/`):e.repository?.startsWith(`github:WillBoosterLab/`)&&(t.uses=t.uses?.replace(`WillBooster/`,`WillBoosterLab/`)),t.with.dot_env_path===`.env`&&delete t.with.dot_env_path,n.startsWith(`deploy`)&&t.secrets.FLY_API_TOKEN&&typeof t.with.deploy_command==`string`&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,``)),e.doesContainDockerfile&&!t.with.ci_label&&n.startsWith(`test`)&&(t.with.ci_label=`large`),n===`release`||n===`test`||n.startsWith(`deploy`)?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?R(t.with):delete t.with,Object.keys(t.secrets).length>0){let e=R(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function nn(e){let t=e.isBun?`bun`:`yarn`,n=[{uses:`actions/checkout@v6`},{uses:`actions/setup-node@v6`,with:{"check-latest":!0,"node-version":`lts/*`}},...e.isBun?[{uses:`oven-sh/setup-bun@v2`,with:{"bun-version":`latest`}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`}),n.push({uses:`autofix-ci/action@c5b2d67aa2274e7b5a18224e8171550871fc7e4a`});let r=structuredClone(Yt),i=r.jobs.autofix??{"runs-on":`ubuntu-latest`};return r.jobs.autofix={...i,steps:n},r}async function rn(t,n){let r=an(d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":`empty`}}));await e.promises.writeFile(n,r)}function an(e){return e.replaceAll(/[ \t]+$/gm,``)}async function on(e){return b.functionIgnoringException(`fixTypos`,async()=>{if(Qt(e.repository))return;let n=e.dirPath,r=await s.glob(`**/*.md`,{dot:!0,cwd:n,ignore:E});y.isVerbose&&console.info(`Found ${r.length} markdown files in ${n}`);for(let i of r){let r=t.join(n,i);S.run(async()=>{let t=await x.readFileIgnoringError(r);if(t===void 0)return;let n=sn(t);n=ln(n,e,`doc`),t!==n&&await x.generateFile(r,n)})}let i=await s.glob([`{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}`,`packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}`],{dot:!0,cwd:n,ignore:E});y.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${n}`);for(let r of i){let i=t.join(n,r);S.run(async()=>{let t=await x.readFileIgnoringError(i);if(t===void 0)return;let n=cn(t);n=ln(n,e,`ts`),t!==n&&await x.generateFile(i,n)})}let a=await s.glob(`**/*.{csv,htm,html,tsv,xml,yaml,yml}`,{dot:!0,cwd:n,ignore:E});y.isVerbose&&console.info(`Found ${a.length} text-based files in ${n}`);for(let r of a){let i=t.join(n,r);S.run(async()=>{let t=await x.readFileIgnoringError(i);if(t===void 0)return;let n=sn(t);n=ln(n,e,`text`),t!==n&&await x.generateFile(i,n)})}await S.promiseAll()})}function sn(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,`cf.`).replaceAll(/\beg\.(?=\s|$)/g,`e.g.`).replaceAll(/\bie\.(?=\s)/g,`i.e.`)}function cn(e){return e.replaceAll(/\/\*[\s\S]*?\*\//g,e=>sn(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,`$1//$2cf.`).replaceAll(/(^|\s)\/\/(.*?)eg\./g,`$1//$2e.g.`).replaceAll(/(^|\s)\/\/(.*?)ie\./g,`$1//$2i.e.`)}function ln(e,t,n){for(let[n,r]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,r);for(let[r,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(r,i);return e}const un=/\bwb\s+(?:db|prisma)\b/gu,dn=[`**/*.{cjs,cts,js,json,jsx,md,mdc,mjs,mts,sh,tsx,ts,toml,txt,yaml,yml}`,`**/.env`,`**/.env.*`,`**/.github/workflows/*`,`**/.gitignore`,`**/.dockerignore`,`**/Dockerfile`,`**/Dockerfile.*`,`**/Makefile`,`**/mise.toml`,`**/.mise.toml`,`**/lefthook.yml`,`**/package.json`];async function fn(e,t=[e]){if(e.repoAuthor===`WillBooster`&&e.repoName===`shared`)return;let n=new i,r=[];for(let e of t){let t=pn(e);if(!t)continue;let i=await s(dn,{absolute:!0,cwd:e.dirPath,dot:!0,ignore:[`**/.git/**`,...e.isRoot?[`packages/**`]:[],...E],onlyFiles:!0});for(let e of i)r.push(n.run(()=>mn(e,t)))}await Promise.all(r),await n.promiseAll()}function pn(e){if(e.depending.prisma)return`wb prisma`;if(e.depending.drizzle)return`wb db`}async function mn(e,t){let n=await hn(e);if(!n)return;let r=n.replaceAll(un,t);r!==n&&await x.generateFile(e,r)}async function hn(e){if((await o.stat(e)).size>1048576)return;let t=await o.readFile(e);if(!t.includes(0))return t.toString(`utf8`)}async function gn(e,n){return b.functionIgnoringException(`generateAgentInstructions`,async()=>{if(!e.isRoot)return;let r=t.resolve(e.dirPath,`AGENTS_EXTRA.md`),i=await x.readFileIgnoringError(r);for(let[r,a]of[[`AGENTS.md`,`Codex CLI`],[`CLAUDE.md`,`Claude Code`],[`GEMINI.md`,`Gemini CLI`]]){let o=vn(e,n,a,i),s=t.resolve(e.dirPath,r);await S.run(()=>x.generateFile(s,o))}let a=t.resolve(e.dirPath,`.cursor/rules/general.mdc`),o=_n(e,n,i);await S.run(()=>x.generateFile(a,o))})}function _n(e,t,n){return`---
25
+ `&&(o=o.replace(/\n/g,a)),o}return t(e)}function Vt(e,t={}){return Bt(e,M(e=>{let n=t.sortOrder||Rt;if(Array.isArray(n)){let t=Object.keys(e),{privateKeys:r=[],publicKeys:i=[]}=Object.groupBy(t,e=>e[0]===`_`?`privateKeys`:`publicKeys`);n=[...n,...Rt,...i.sort(),...r.sort()]}return zt(D(e,n),e)}))}async function Ht(n){return b.functionIgnoringException(`fixTestDirectoriesUpdatingPackageJson`,async()=>{await Promise.all(n.map(async n=>{let r=t.join(n,`package.json`);if(!e.existsSync(r))return;let i=t.join(n,`test`);for(let a of[`__tests__`,`tests`]){let o=t.join(n,a);try{await Ut(o,i);let t=JSON.parse(await e.promises.readFile(r,`utf8`)),n=!1,s=t.scripts??{};for(let[e,t]of Object.entries(s)){let r=t.replaceAll(a,`test`);t!==r&&(s[e]=r,n=!0)}if(t.scripts=s,!n)return;await x.generateFile(r,JSON.stringify(Vt(t),void 0,2))}catch{}}}))})}async function Ut(n,r){if(!e.existsSync(r)){await e.promises.rename(n,r);return}let i=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(i.map(async i=>{let a=t.join(n,i.name),o=t.join(r,i.name),s=e.existsSync(o)?await e.promises.stat(o):void 0;if(i.isDirectory()&&s?.isDirectory()){await Ut(a,o);return}await e.promises.rename(a,o)})),await e.promises.rm(n,{recursive:!0})}async function Wt(e,n){return b.functionIgnoringException(`fixTypeDefinitions`,async()=>{let r=t.resolve(e.dirPath,`@types`),i=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,`src`,`types`),a=await v(()=>o.readdir(r,{withFileTypes:!0}));if(a)for(let e of a){let a=e.name.slice(0,-5),s=e.name.endsWith(`.d.ts`),c=s?a:e.name;c.includes(`__`)&&(c=`@${c.replace(`__`,`/`)}`);let l=n.some(e=>e.packageJson?.dependencies?.[c]||e.packageJson?.devDependencies?.[c]);e.isFile()&&s?l?(await o.mkdir(t.join(r,a),{recursive:!0}),await S.run(()=>o.rename(t.join(r,e.name),t.join(r,a,`index.d.ts`)))):i&&(await o.mkdir(i,{recursive:!0}),await S.run(()=>o.rename(t.join(r,e.name),t.join(i,e.name)))):e.isDirectory()&&i&&!l&&(await o.mkdir(i,{recursive:!0}),await S.run(()=>v(()=>o.rename(t.join(r,e.name,`index.d.ts`),t.join(i,`${e.name}.d.ts`)))))}})}function L(e,t){return t}function Gt(e,t,n){let r=[...e];for(let[i,a]of t.entries())r[i]===void 0?r[i]=Kt(a,n):qt(e[i],n)&&qt(a,n)?r[i]=u(e[i],a,n):e.includes(a)||r.push(a);return r}function Kt(e,t){return qt(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function qt(e,t){return!!e&&typeof e==`object`&&t.isMergeableObject(e)}function Jt(e,t){let n=e[t];return delete e[t],e[t]=n,e}function R(e){let t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(let[n,r]of t)delete e[n],e[n]=r,r&&typeof r==`object`&&!Array.isArray(r)&&R(r);return e}const Yt={name:`autofix.ci`,on:{pull_request:null,push:{branches:[`main`]}},permissions:{contents:`read`},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":`ubuntu-latest`}}},Xt={test:{name:`Test`,on:{pull_request:null,push:{branches:[`main`,`wbfy`]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:`write`,"pull-requests":`read`},jobs:{test:{uses:`WillBooster/reusable-workflows/.github/workflows/test.yml@main`}}},"test-rust":{name:`Test Rust`,on:{pull_request:null,push:{branches:[`main`,`wbfy`]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{"test-rust":{uses:`WillBooster/reusable-workflows/.github/workflows/test-rust.yml@main`}}},release:{name:`Release`,on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":`write`,contents:`write`},jobs:{release:{uses:`WillBooster/reusable-workflows/.github/workflows/release.yml@main`}}},"semantic-pr":{name:`Lint PR title`,on:{pull_request_target:{types:[`opened`,`edited`,`synchronize`]}},jobs:{"semantic-pr":{uses:`WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main`}}},sync:{name:`Sync`,on:{},permissions:{contents:`write`},jobs:{sync:{uses:`WillBooster/reusable-workflows/.github/workflows/sync.yml@main`}}},"close-comment":{name:`Add close comment`,on:{pull_request:{types:[`opened`]}},jobs:{"close-comment":{uses:`WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main`}}}};async function Zt(n){return b.functionIgnoringException(`generateWorkflow`,async()=>{if(Qt(n.repository))return;let r=t.resolve(n.dirPath,`.github`,`workflows`);await e.promises.mkdir(r,{recursive:!0});let i=t.resolve(n.dirPath,`.github`,`semantic.yml`);await S.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));let a=await e.promises.readdir(r,{withFileTypes:!0});for(let n of a)!n.isFile()||!$t(n.name)||await S.run(()=>e.promises.rm(t.join(r,n.name),{force:!0}));let o=new Set([`test.yml`,`autofix.yml`,`semantic-pr.yml`,`close-comment.yml`,...a.filter(e=>e.isFile()&&e.name.endsWith(`.yml`)&&!$t(e.name)).map(e=>e.name)]);n.depending.semanticRelease&&o.add(`release.yml`),n.cargoTomlDirPaths.length>0&&o.add(`test-rust.yml`),n.isPublicRepo||(o.delete(`autofix.yml`),await S.run(()=>e.promises.rm(t.join(r,`autofix.yml`),{force:!0})));for(let e of o){let i=t.basename(e,`.yml`);await S.run(()=>en(n,r,i))}})}function Qt(e){return e?.endsWith(`/reusable-workflows`)??!1}function $t(e){return/^gen-pr(?:-.+)?\.ya?ml$/u.test(e)}async function en(n,r,i){let a=t.join(r,`${i}.yml`),o=e.existsSync(t.join(r,`deploy-production.yml`));if(i===`autofix`){await rn(nn(n),a);return}if(i===`test-rust`&&n.cargoTomlDirPaths.length===0)return;let s=structuredClone(i in Xt?Xt[i]:{});try{let t=await e.promises.readFile(a,`utf8`),n=d.load(t);s=u.all([s,n,s],{arrayMerge:Gt})}catch{}if(!(`jobs`in s))return;if(i===`test-rust`){for(let[e,t]of Object.entries(s.jobs))t.uses?.includes(`/reusable-workflows/`)||delete s.jobs[e];Jt(s,`jobs`)}i.startsWith(`deploy`)&&(s={...s,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},Jt(s,`jobs`),s.on?.push&&(s.on.push[`paths-ignore`]=[...new Set([`**.md`,`**/docs/**`,...s.on.push[`paths-ignore`]??[]])])),i===`release`&&s.jobs.release&&o&&(s.permissions??={},s.permissions.actions=`write`,s.jobs.release.with??={},s.jobs.release.with.trigger_deploy_workflow=`deploy-production.yml`);let c=!1;for(let e of Object.values(s.jobs))e.uses?.includes(`/reusable-workflows/`)&&(tn(n,e,i),c=!0);if(c){switch(i){case`release`:if(s.on?.schedule)delete s.on.push;else if(s.on?.push&&n.release.branches.length>0)s.on.push.branches=n.release.branches;else{await e.promises.rm(t.join(r,`release.yml`),{force:!0});return}n.isPublicRepo?(s.permissions??={},s.permissions[`id-token`]=`write`):delete s.permissions?.[`id-token`];break;case`test`:case`test-rust`:delete s.permissions?.actions,s.on?.pull_request&&delete s.on.pull_request[`paths-ignore`],s.on?.push&&(delete s.on.push[`paths-ignore`],s.on.push.branches=s.on.push.branches.filter(e=>e!==`renovate/**`));break}if(await rn(s,a),i===`sync`){if(await e.promises.rm(t.join(r,`sync-init.yml`),{force:!0}),!s.jobs.sync?.with)return;s.jobs[`sync-force`]=s.jobs.sync;let n=s.jobs.sync.with.sync_params_without_dest;if(typeof n!=`string`)return;s.jobs.sync.with.sync_params_without_dest=`--force ${n}`,s.name=`Force to Sync`,s.on={workflow_dispatch:null},delete s.jobs.sync,await rn(s,t.join(r,`sync-force.yml`))}}}function tn(e,t,n){if(t.with??={},t.secrets??={},(n===`test`||n===`release`)&&(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&(n===`release`||n.startsWith(`deploy`))||t.with.server_url&&n.startsWith(`deploy`))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),n===`sync`){let e=t.with.sync_params_without_dest;typeof e==`string`&&(t.with.sync_params_without_dest=e.replace(`sync `,``))}if(n===`test-rust`){let[n]=e.cargoTomlDirPaths;n&&n!==`.`?t.with.working_directory=n:delete t.with.working_directory}if(e.repository?.startsWith(`github:WillBooster/`)?t.uses=t.uses?.replace(`WillBoosterLab/`,`WillBooster/`):e.repository?.startsWith(`github:WillBoosterLab/`)&&(t.uses=t.uses?.replace(`WillBooster/`,`WillBoosterLab/`)),t.with.dot_env_path===`.env`&&delete t.with.dot_env_path,n.startsWith(`deploy`)&&t.secrets.FLY_API_TOKEN&&typeof t.with.deploy_command==`string`&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,``)),e.doesContainDockerfile&&!t.with.ci_label&&n.startsWith(`test`)&&(t.with.ci_label=`large`),n===`release`||n.startsWith(`test`)||n.startsWith(`deploy`)?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?R(t.with):delete t.with,Object.keys(t.secrets).length>0){let e=R(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function nn(e){let t=e.isBun?`bun`:`yarn`,n=[{uses:`actions/checkout@v6`},{uses:`actions/setup-node@v6`,with:{"check-latest":!0,"node-version":`lts/*`}},...e.isBun?[{uses:`oven-sh/setup-bun@v2`,with:{"bun-version":`latest`}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`}),n.push({uses:`autofix-ci/action@c5b2d67aa2274e7b5a18224e8171550871fc7e4a`});let r=structuredClone(Yt),i=r.jobs.autofix??{"runs-on":`ubuntu-latest`};return r.jobs.autofix={...i,steps:n},r}async function rn(t,n){let r=an(d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":`empty`}}));await e.promises.writeFile(n,r)}function an(e){return e.replaceAll(/[ \t]+$/gm,``)}async function on(e){return b.functionIgnoringException(`fixTypos`,async()=>{if(Qt(e.repository))return;let n=e.dirPath,r=await s.glob(`**/*.md`,{dot:!0,cwd:n,ignore:E});y.isVerbose&&console.info(`Found ${r.length} markdown files in ${n}`);for(let i of r){let r=t.join(n,i);S.run(async()=>{let t=await x.readFileIgnoringError(r);if(t===void 0)return;let n=sn(t);n=ln(n,e,`doc`),t!==n&&await x.generateFile(r,n)})}let i=await s.glob([`{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}`,`packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}`],{dot:!0,cwd:n,ignore:E});y.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${n}`);for(let r of i){let i=t.join(n,r);S.run(async()=>{let t=await x.readFileIgnoringError(i);if(t===void 0)return;let n=cn(t);n=ln(n,e,`ts`),t!==n&&await x.generateFile(i,n)})}let a=await s.glob(`**/*.{csv,htm,html,tsv,xml,yaml,yml}`,{dot:!0,cwd:n,ignore:E});y.isVerbose&&console.info(`Found ${a.length} text-based files in ${n}`);for(let r of a){let i=t.join(n,r);S.run(async()=>{let t=await x.readFileIgnoringError(i);if(t===void 0)return;let n=sn(t);n=ln(n,e,`text`),t!==n&&await x.generateFile(i,n)})}await S.promiseAll()})}function sn(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,`cf.`).replaceAll(/\beg\.(?=\s|$)/g,`e.g.`).replaceAll(/\bie\.(?=\s)/g,`i.e.`)}function cn(e){return e.replaceAll(/\/\*[\s\S]*?\*\//g,e=>sn(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,`$1//$2cf.`).replaceAll(/(^|\s)\/\/(.*?)eg\./g,`$1//$2e.g.`).replaceAll(/(^|\s)\/\/(.*?)ie\./g,`$1//$2i.e.`)}function ln(e,t,n){for(let[n,r]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,r);for(let[r,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(r,i);return e}const un=/\bwb\s+(?:db|prisma)\b/gu,dn=[`**/*.{cjs,cts,js,json,jsx,md,mdc,mjs,mts,sh,tsx,ts,toml,txt,yaml,yml}`,`**/.env`,`**/.env.*`,`**/.github/workflows/*`,`**/.gitignore`,`**/.dockerignore`,`**/Dockerfile`,`**/Dockerfile.*`,`**/Makefile`,`**/mise.toml`,`**/.mise.toml`,`**/lefthook.yml`,`**/package.json`];async function fn(e,t=[e]){if(e.repoAuthor===`WillBooster`&&e.repoName===`shared`)return;let n=new i,r=[];for(let e of t){let t=pn(e);if(!t)continue;let i=await s(dn,{absolute:!0,cwd:e.dirPath,dot:!0,ignore:[`**/.git/**`,...e.isRoot?[`packages/**`]:[],...E],onlyFiles:!0});for(let e of i)r.push(n.run(()=>mn(e,t)))}await Promise.all(r),await n.promiseAll()}function pn(e){if(e.depending.prisma)return`wb prisma`;if(e.depending.drizzle)return`wb db`}async function mn(e,t){let n=await hn(e);if(!n)return;let r=n.replaceAll(un,t);r!==n&&await x.generateFile(e,r)}async function hn(e){if((await o.stat(e)).size>1048576)return;let t=await o.readFile(e);if(!t.includes(0))return t.toString(`utf8`)}async function gn(e,n){return b.functionIgnoringException(`generateAgentInstructions`,async()=>{if(!e.isRoot)return;let r=t.resolve(e.dirPath,`AGENTS_EXTRA.md`),i=await x.readFileIgnoringError(r);for(let[r,a]of[[`AGENTS.md`,`Codex CLI`],[`CLAUDE.md`,`Claude Code`],[`GEMINI.md`,`Gemini CLI`]]){let o=vn(e,n,a,i),s=t.resolve(e.dirPath,r);await S.run(()=>x.generateFile(s,o))}let a=t.resolve(e.dirPath,`.cursor/rules/general.mdc`),o=_n(e,n,i);await S.run(()=>x.generateFile(a,o))})}function _n(e,t,n){return`---
26
26
  description: General Coding Rules
27
27
  globs:
28
28
  alwaysApply: true
@@ -388,7 +388,7 @@ test/fixtures/
388
388
  `&&e[n]===`
389
389
  `){let r=e.slice(0,n+1),i=e.slice(n+1);return!i.startsWith(`[`)&&!i.startsWith(`!`)&&(i=`\n${i}`),`${r}${t}\n${i}`}return`${e}\n${t}\n`}function ja(e,t,n){let r=Ma(t),i=Ma(n);return e.replaceAll(new RegExp(String.raw`\[!\[${r}\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${i}/badge\.svg\)\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${i}\)\n?`,`gu`),``).replaceAll(/\n\n\n+/g,`
390
390
 
391
- `)}function Ma(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function Na(n){return b.functionIgnoringException(`generateReleaserc`,async()=>{let r=t.resolve(n.dirPath,`.releaserc.json`);if(!e.existsSync(r))return;let i=JSON.parse(await e.promises.readFile(r,`utf8`)),a=i.plugins??[];for(let e=0;e<a.length;e++){let t=a[e],n=Array.isArray(t),r=n?t[0]:t,i=n&&t[1]||{};r===`@semantic-release/commit-analyzer`?a[e]=[`@semantic-release/commit-analyzer`,u.all([i,{preset:`conventionalcommits`}],{arrayMerge:L})]:r===`@semantic-release/github`&&(a[e]=[`@semantic-release/github`,u.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:[`r: semantic-release`],releasedLabels:[`released :bookmark:`]}],{arrayMerge:L})])}let o=JSON.stringify(i,void 0,2);await S.run(()=>x.generateFile(r,o))})}const Pa={$schema:`https://docs.renovatebot.com/renovate-schema.json`,extends:[`github>WillBooster/willbooster-configs:renovate.json5`]};async function Fa(n){return b.functionIgnoringException(`generateRenovateJson`,async()=>{let r=structuredClone(Pa),i=t.resolve(n.dirPath,`renovate.json`);if(e.existsSync(`${i}5`))return;try{let t=await e.promises.readFile(i,`utf8`),n=JSON.parse(t);r=u.all([r,n,r],{arrayMerge:L}),r.extends=Ia(Pa.extends,n.extends??[])}catch{}n.depending.blitz&&(r.packageRules??=[],r.packageRules.some(e=>e.matchPackageNames?.includes(`next`))||r.packageRules.push({matchPackageNames:[`next`],enabled:!1})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.dependabot`),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.renovaterc.json`),{force:!0}));let a=JSON.stringify(r,void 0,2);await S.run(()=>x.generateFile(i,a))})}function Ia(e,t){return[...new Set([...e,...t])].filter(e=>e!==`@willbooster`)}async function La(e){return b.functionIgnoringException(`installAgentSkills`,async()=>{})}const Ra={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:[`packages/*/test/fixtures`,`test/fixtures`],include:[`*.config.ts`,`packages/*/*.config.ts`,`packages/*/scripts/**/*`,`packages/*/src/**/*`,`packages/*/test/**/*`,`scripts/**/*`,`src/**/*`,`test/**/*`]},za={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:[`test/fixtures`],include:[`*.config.ts`,`scripts/**/*`,`src/**/*`,`test/**/*`]};async function Ba(n){return b.functionIgnoringException(`generateTsconfig`,async()=>{if(n.depending.blitz||n.depending.next){await Va(n);return}let r=structuredClone(n.isRoot?Ra:za),i=ao(n);r.extends=ur(n),r.compilerOptions??={},r.compilerOptions.rootDir=Ka(n),i.length>0&&(r.compilerOptions={...r.compilerOptions,types:i}),!n.doesContainJsxOrTsx&&!n.doesContainJsxOrTsxInPackages?delete r.compilerOptions?.jsx:!n.isBun&&!n.depending.reactNative&&(r.compilerOptions={...r.compilerOptions,jsx:`react-jsx`}),n.isRoot&&!n.doesContainSubPackageJsons&&(r.include=r.include?.filter(e=>!e.startsWith(`packages/*/`)),r.exclude=r.exclude?.filter(e=>!e.startsWith(`packages/*/`))),n.depending.prisma&&Ja(r,`prisma/**/*`);let a=t.resolve(n.dirPath,`tsconfig.json`);try{let t=await e.promises.readFile(a,`utf8`),n=JSON.parse(t),o=Xa(n.compilerOptions?.types),s=io(n.compilerOptions);r.extends=qa(r.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,r=u.all([r,n,r],{arrayMerge:Gt}),r.include=r.include?.filter(e=>!e.includes(`@types`)&&!e.includes(`__tests__/`)&&!e.includes(`tests/`)),r.compilerOptions??={},r.compilerOptions={...r.compilerOptions,...s},eo(r.compilerOptions);let c=[...new Set([...Qa(o,i),...i])];c.length>0?r.compilerOptions.types=c:delete r.compilerOptions.types,Za(i)&&delete r.compilerOptions.typeRoots}catch{}R(r),r.include?.sort(),delete r.compilerOptions?.experimentalDecorators,delete r.compilerOptions?.baseUrl,to(r.compilerOptions,n),ro(r.compilerOptions,n),n.depending.reactNative&&delete r.compilerOptions?.verbatimModuleSyntax;let o=JSON.stringify(r,void 0,2);await S.run(()=>x.generateFile(a,o))})}async function Va(n){let r=t.resolve(n.dirPath,`tsconfig.json`);try{let t=JSON.parse(await e.promises.readFile(r,`utf8`));Ua(t),Wa(t.compilerOptions),Ha(t),await S.run(()=>x.generateFile(r,JSON.stringify(t,void 0,2)))}catch{}}function Ha(e){e.include&&(e.include.includes(`scripts/**/*`)||(e.include.push(`scripts/**/*`),e.include.sort()))}function Ua(e){let t=e.compilerOptions;if(!t)return;let n=no(t.moduleResolution);(n===`node`||n===`node10`||n===void 0)&&(e.extends?delete t.moduleResolution:t.moduleResolution=`bundler`)}function Wa(e){if(e&&(delete e.baseUrl,e.paths))for(let[t,n]of Object.entries(e.paths))e.paths[t]=Ga(n)}function Ga(e){return e.map(e=>e.startsWith(`./`)||e.startsWith(`../`)||t.isAbsolute(e)?e:`./${e}`)}function Ka(n){return n.isRoot?`.`:e.existsSync(t.resolve(n.dirPath,`..`,`..`,`package.json`))?`../..`:`.`}function qa(e,t){let n=[...Ya(e),...Ya(t)],r=[...new Set(n)];if(r.length!==0)return r.length===1?r[0]:r}function Ja(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}function Ya(e){return e?Array.isArray(e)?e:[e]:[]}function Xa(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Za(e){return e.some(e=>e===`cypress`||e.includes(`/`))}function Qa(e,t){let n=new Set(t);return e.filter(e=>!($a(e)&&!n.has(e)))}function $a(e){return e===`cypress`||e===`jest`||e===`mocha`||e===`vitest/globals`}function eo(e){e&&(e.noEmit!==!1||e.emitDeclarationOnly===!0||(e.rewriteRelativeImportExtensions=!0))}function to(e,t){if(!e)return;let n=no(e.moduleResolution);if((n===`node`||n===`node10`)&&delete e.moduleResolution,t.isBun||t.depending.reactNative)return;if(t.depending.vite||t.depending.tauri){n!==`bundler`&&(e.moduleResolution=`bundler`);let t=no(e.module);(t===void 0||t!==`preserve`&&!t.startsWith(`es`))&&(e.module=`ESNext`);return}n===`bundler`&&delete e.moduleResolution;let r=no(e.module);(r===`preserve`||r?.startsWith(`es`))&&delete e.module}function no(e){return typeof e==`string`?e.toLowerCase():void 0}function ro(e,t){!e||t.isBun||t.depending.reactNative||t.isEsmPackage||(e.module?.toLowerCase()===`commonjs`&&(e.module=`Node16`),e.verbatimModuleSyntax=!1)}function io(e){let t={};for(let n of[`declaration`,`declarationMap`,`sourceMap`]){let r=e?.[n];r!==void 0&&(t[n]=r)}return t}function ao(e){let t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};return e.isBun?t.add(`bun`):e.depending.reactNative||t.add(`node`),(n.jest||n[`@jest/globals`]||n[`jest-environment-jsdom`]||n[`ts-jest`])&&t.add(`jest`),n.vitest&&t.add(`vitest/globals`),n.mocha&&t.add(`mocha`),n.cypress&&t.add(`cypress`),[...t]}const oo=[`**/.git/objects/**`,`**/.git/subtree-cache/**`,`**/node_modules/**`,`**/tmp/**`,`**/temp/**`,`**/dist/**`];async function so(n){return b.functionIgnoringException(`generateVscodeSettings`,async()=>{try{let r=t.resolve(n.dirPath,`.vscode`,`settings.json`),i=await e.promises.readFile(r,`utf8`),a=JSON.parse(i);for(let e of oo)a=u.all([a,co(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(a=u.all([a,co(`**/.venv/**`)])),n.depending.next&&(a=u.all([a,co(`**/.next/**`)])),`editor.codeActionsOnSave`in a&&delete a[`editor.codeActionsOnSave`],`editor.formatOnSave`in a&&delete a[`editor.formatOnSave`],R(a);let o=JSON.stringify(a,void 0,2);await S.run(()=>x.generateFile(r,o))}catch{}})}function co(e){return{"files.watcherExclude":{[e]:!0}}}async function lo(e){return b.functionIgnoringException(`setupLabels`,async()=>{let[t,n]=W.getOrgAndName(e.repository??``);if(!t||!n||t!==`WillBooster`&&t!==`WillBoosterLab`||!or(t))return;let r=G(t);try{await Z(r,t,n,`d1: x-easy :hedgehog:`,`EDE9FE`),await Z(r,t,n,`d2: easy :rabbit2:`,`DDD6FE`),await Z(r,t,n,`d3: medium :ox:`,`C4B5FD`),await Z(r,t,n,`d4: hard :squid:`,`A78BFA`),await Z(r,t,n,`d5: x-hard :whale2:`,`8B5CF6`),await Z(r,t,n,`p1: critical :fire::fire::fire:`,`EF4444`),await Z(r,t,n,`p2: urgent :fire::fire:`,`F87171`),await Z(r,t,n,`p3: important :fire:`,`FCA5A5`),await Z(r,t,n,`p4: nice to have :droplet:`,`FECACA`),await Z(r,t,n,`r: blitz`,`5300bc`),await Z(r,t,n,`r: firebase`,`ffca28`),await Z(r,t,n,`r: prisma`,`0c344b`),await Z(r,t,n,`r: react`,`61dafb`),await Z(r,t,n,`r: svelte`,`ff3e00`),await Z(r,t,n,`r: semantic-release`,`494949`),await Z(r,t,n,`ready :rocket:`,`22C55E`),await Z(r,t,n,`review requested :mag:`,`FBCA04`),await Z(r,t,n,`released :bookmark:`,`6366F1`),await Z(r,t,n,`s: 0.5h :clock1230:`,`F3F4F6`),await Z(r,t,n,`s: 1h :clock1:`,`E5E7EB`),await Z(r,t,n,`s: 2h :clock2:`,`D1D5DB`),await Z(r,t,n,`s: 3h :clock3:`,`9CA3AF`),await Z(r,t,n,`s: 5h :clock5:`,`6B7280`),await Z(r,t,n,`s: 8h :clock8:`,`4B5563`),await Z(r,t,n,`s: 13h :clock1:`,`374151`),await Z(r,t,n,`t: build :hammer:`,`BFDBFE`),await Z(r,t,n,`t: chore :broom:`,`BFDBFE`),await Z(r,t,n,`t: ci :construction_worker:`,`BFDBFE`),await Z(r,t,n,`t: docs :memo:`,`BFDBFE`),await Z(r,t,n,`t: feat :sparkles:`,`BFDBFE`),await Z(r,t,n,`t: fix :bug:`,`BFDBFE`),await Z(r,t,n,`t: perf :zap:`,`BFDBFE`),await Z(r,t,n,`t: refactor :recycle:`,`BFDBFE`),await Z(r,t,n,`t: style :lipstick:`,`BFDBFE`),await Z(r,t,n,`t: test :test_tube:`,`BFDBFE`),await Z(r,t,n,`project`,`24292F`),await Z(r,t,n,`focused :dart:`,`22C55E`),await Q(r,t,n,`bug`),await Q(r,t,n,`documentation`),await Q(r,t,n,`duplicate`),await Q(r,t,n,`enhancement`),await Q(r,t,n,`good first issue`),await Q(r,t,n,`help wanted`),await Q(r,t,n,`invalid`),await Q(r,t,n,`question`),await Q(r,t,n,`wontfix`),await Q(r,t,n,`ready`),await Q(r,t,n,`review requested`),await Q(r,t,n,`released`),await Q(r,t,n,`semantic-release`),await Q(r,t,n,`llm-pr :robot:`),await Q(r,t,n,`ai-pr :robot:`),await Q(r,t,n,`gen-pr-all :robot:`),await Q(r,t,n,`gen-pr-claude :robot:`),await Q(r,t,n,`gen-pr-codex :robot:`),await Q(r,t,n,`gen-pr-gemini :robot:`)}catch(e){console.warn(`Skip setupLabels due to:`,e?.stack??e)}})}async function Z(e,t,n,r,i){try{await e.request(`POST /repos/{owner}/{repo}/labels`,{owner:t,repo:n,name:r,color:i})}catch{await e.request(`PATCH /repos/{owner}/{repo}/labels/{name}`,{owner:t,repo:n,name:r,color:i})}}async function Q(e,t,n,r){try{await e.request(`DELETE /repos/{owner}/{repo}/labels/{name}`,{owner:t,repo:n,name:r})}catch{}}const uo={"X-GitHub-Api-Version":`2022-11-28`},fo={name:`Protect main`,target:`branch`,enforcement:`active`,conditions:{ref_name:{exclude:[],include:[`~DEFAULT_BRANCH`]}},rules:[{type:`deletion`},{type:`required_status_checks`,parameters:{strict_required_status_checks_policy:!1,do_not_enforce_on_create:!0,required_status_checks:[{context:`test / test`,integration_id:15368},{context:`semantic-pr / semantic-pr`,integration_id:15368}]}},{type:`non_fast_forward`},{type:`pull_request`,parameters:{required_approving_review_count:0,dismiss_stale_reviews_on_push:!1,required_reviewers:[],require_code_owner_review:!1,require_last_push_approval:!1,required_review_thread_resolution:!1,allowed_merge_methods:[`squash`]}}],bypass_actors:[{actor_id:17777495,actor_type:`Team`,bypass_mode:`pull_request`}]};async function po(e){return b.functionIgnoringException(`setupRepositoryRulesets`,async()=>{let[t,n]=W.getOrgAndName(e.repository??``);if(!t||!n||t!==`WillBooster`||!or(t))return;let r=G(t);try{await mo(r,t,n)}catch(e){if(!go(e))throw e;console.warn(`Skip setupRepositoryRulesets due to:`,e?.stack??e)}})}async function mo(e,t,n){let r=(await ho(e,t,n,fo.name))?.id;await oe(async()=>{if(r){await e.request(`PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}`,{owner:t,repo:n,ruleset_id:r,...fo,headers:uo});return}await e.request(`POST /repos/{owner}/{repo}/rulesets`,{owner:t,repo:n,...fo,headers:uo})},{shouldRetry:e=>!go(e)})}async function ho(e,t,n,r){let i=(await oe(()=>e.request(`GET /repos/{owner}/{repo}/rulesets`,{owner:t,repo:n,includes_parents:!1,targets:`branch`,headers:uo}),{shouldRetry:e=>!go(e)})).data;if(Array.isArray(i))return i.find(e=>e.name===r&&e.source_type===`Repository`)}function go(e){if(!e||typeof e!=`object`)return!1;let t=e.status;return t===401||t===403||t===404}const _o=[`READY_DISCORD_WEBHOOK_URL`,`GH_BOT_PAT`,`PUBLIC_GH_BOT_PAT`],vo=te(import.meta.url);async function yo(e){return b.functionIgnoringException(`setupSecrets`,async()=>{let[n,r]=W.getOrgAndName(e.repository??``);if(!n||!r||n!==`WillBoosterLab`||!or(n)||!y.doesUploadEnvVars)return;let i=ne.config({path:t.resolve(e.dirPath,`.env`),quiet:!0}).parsed??{};if(Object.keys(i).length===0)return;let a=G(n);try{for(let e of _o)try{await a.request(`DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}`,{owner:n,repo:r,secret_name:e})}catch{}let{key:e,key_id:t}=(await a.request(`GET /repos/{owner}/{repo}/actions/secrets/public-key`,{owner:n,repo:r})).data,o=bo();await o.ready;for(let[s,c]of Object.entries(i)){if(s===`GH_BOT_PAT`||s===`GH_BOT_PAT_FOR_WILLBOOSTER`||s===`GH_BOT_PAT_FOR_WILLBOOSTERLAB`)continue;let i=o.from_base64(e,o.base64_variants.ORIGINAL),l=o.from_string(c),u=o.crypto_box_seal(l,i),d=o.to_base64(u,o.base64_variants.ORIGINAL);await a.request(`PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}`,{owner:n,repo:r,secret_name:s,encrypted_value:d,key_id:t})}}catch(e){console.warn(`Skip setupSecrets due to:`,e?.stack??e)}})}function bo(){return vo("libsodium-wrappers")}async function xo(e){return b.functionIgnoringException(`setupGitHubSettings`,async()=>{let[t,n]=W.getOrgAndName(e.repository??``);if(!t||!n||t!==`WillBooster`&&t!==`WillBoosterLab`||!or(t))return;let r=G(t);try{await oe(()=>r.request(`PATCH /repos/{owner}/{repo}`,{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:`PR_TITLE`,squash_merge_commit_message:`BLANK`,headers:{"X-GitHub-Api-Version":`2022-11-28`},...e.repository?.startsWith(`github:WillBooster/`)?{allow_auto_merge:!0}:{}}),{shouldRetry:e=>!So(e)})}catch(e){if(!So(e))throw e;console.warn(`Skip setupGitHubSettings due to:`,e?.stack??e)}})}function So(e){return!e||typeof e!=`object`||!(`status`in e)?!1:e.status===401||e.status===403||e.status===404}const Co=`__PM_RUN__`,wo={"pull_request_template.md":`
391
+ `)}function Ma(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function Na(n){return b.functionIgnoringException(`generateReleaserc`,async()=>{let r=t.resolve(n.dirPath,`.releaserc.json`);if(!e.existsSync(r))return;let i=JSON.parse(await e.promises.readFile(r,`utf8`)),a=i.plugins??[];for(let e=0;e<a.length;e++){let t=a[e],n=Array.isArray(t),r=n?t[0]:t,i=n&&t[1]||{};r===`@semantic-release/commit-analyzer`?a[e]=[`@semantic-release/commit-analyzer`,u.all([i,{preset:`conventionalcommits`}],{arrayMerge:L})]:r===`@semantic-release/github`&&(a[e]=[`@semantic-release/github`,u.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:[`r: semantic-release`],releasedLabels:[`released :bookmark:`]}],{arrayMerge:L})])}let o=JSON.stringify(i,void 0,2);await S.run(()=>x.generateFile(r,o))})}const Pa={$schema:`https://docs.renovatebot.com/renovate-schema.json`,extends:[`github>WillBooster/willbooster-configs:renovate.json5`]};async function Fa(n){return b.functionIgnoringException(`generateRenovateJson`,async()=>{let r=structuredClone(Pa),i=t.resolve(n.dirPath,`renovate.json`);if(e.existsSync(`${i}5`))return;try{let t=await e.promises.readFile(i,`utf8`),n=JSON.parse(t);r=u.all([r,n,r],{arrayMerge:L}),r.extends=Ia(Pa.extends,n.extends??[])}catch{}n.depending.blitz&&(r.packageRules??=[],r.packageRules.some(e=>e.matchPackageNames?.includes(`next`))||r.packageRules.push({matchPackageNames:[`next`],enabled:!1})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.dependabot`),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.renovaterc.json`),{force:!0}));let a=JSON.stringify(r,void 0,2);await S.run(()=>x.generateFile(i,a))})}function Ia(e,t){return[...new Set([...e,...t])].filter(e=>e!==`@willbooster`)}async function La(e){return b.functionIgnoringException(`installAgentSkills`,async()=>{})}const Ra={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:[`packages/*/test/fixtures`,`test/fixtures`],include:[`*.config.ts`,`packages/*/*.config.ts`,`packages/*/scripts/**/*`,`packages/*/src/**/*`,`packages/*/test/**/*`,`scripts/**/*`,`src/**/*`,`test/**/*`]},za={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:[`test/fixtures`],include:[`*.config.ts`,`scripts/**/*`,`src/**/*`,`test/**/*`]};async function Ba(n){return b.functionIgnoringException(`generateTsconfig`,async()=>{if(n.depending.blitz||n.depending.next){await Va(n);return}let r=structuredClone(n.isRoot?Ra:za),i=ao(n);r.extends=ur(n),r.compilerOptions??={},r.compilerOptions.rootDir=Ka(n),i.length>0&&(r.compilerOptions={...r.compilerOptions,types:i}),!n.doesContainJsxOrTsx&&!n.doesContainJsxOrTsxInPackages?delete r.compilerOptions?.jsx:!n.isBun&&!n.depending.reactNative&&(r.compilerOptions={...r.compilerOptions,jsx:`react-jsx`}),n.isRoot&&!n.doesContainSubPackageJsons&&(r.include=r.include?.filter(e=>!e.startsWith(`packages/*/`)),r.exclude=r.exclude?.filter(e=>!e.startsWith(`packages/*/`))),n.depending.prisma&&Ja(r,`prisma/**/*`);let a=t.resolve(n.dirPath,`tsconfig.json`);try{let t=await e.promises.readFile(a,`utf8`),n=JSON.parse(t),o=Xa(n.compilerOptions?.types),s=io(n.compilerOptions);r.extends=qa(r.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,r=u.all([r,n,r],{arrayMerge:Gt}),r.include=r.include?.filter(e=>!e.includes(`@types`)&&!e.includes(`__tests__/`)&&!e.includes(`tests/`)),r.compilerOptions??={},r.compilerOptions={...r.compilerOptions,...s},eo(r.compilerOptions);let c=[...new Set([...Qa(o,i),...i])];c.length>0?r.compilerOptions.types=c:delete r.compilerOptions.types,Za(i)&&delete r.compilerOptions.typeRoots}catch{}R(r),r.include?.sort(),delete r.compilerOptions?.experimentalDecorators,delete r.compilerOptions?.baseUrl,to(r.compilerOptions,n),ro(r.compilerOptions,n),n.depending.reactNative&&delete r.compilerOptions?.verbatimModuleSyntax;let o=JSON.stringify(r,void 0,2);await S.run(()=>x.generateFile(a,o))})}async function Va(n){let r=t.resolve(n.dirPath,`tsconfig.json`);try{let t=JSON.parse(await e.promises.readFile(r,`utf8`));Ua(t),Wa(t.compilerOptions),Ha(t),await S.run(()=>x.generateFile(r,JSON.stringify(t,void 0,2)))}catch{}}function Ha(e){e.include&&(e.include.includes(`scripts/**/*`)||(e.include.push(`scripts/**/*`),e.include.sort()))}function Ua(e){let t=e.compilerOptions;if(!t)return;let n=no(t.moduleResolution);(n===`node`||n===`node10`||n===void 0)&&(e.extends?delete t.moduleResolution:t.moduleResolution=`bundler`)}function Wa(e){if(e&&(delete e.baseUrl,e.paths))for(let[t,n]of Object.entries(e.paths))e.paths[t]=Ga(n)}function Ga(e){return e.map(e=>e.startsWith(`./`)||e.startsWith(`../`)||t.isAbsolute(e)?e:`./${e}`)}function Ka(n){return n.isRoot?`.`:e.existsSync(t.resolve(n.dirPath,`..`,`..`,`package.json`))?`../..`:`.`}function qa(e,t){let n=[...Ya(e),...Ya(t)],r=[...new Set(n)];if(r.length!==0)return r.length===1?r[0]:r}function Ja(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}function Ya(e){return e?Array.isArray(e)?e:[e]:[]}function Xa(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Za(e){return e.some(e=>e===`cypress`||e.includes(`/`))}function Qa(e,t){let n=new Set(t);return e.filter(e=>!($a(e)&&!n.has(e)))}function $a(e){return e===`cypress`||e===`jest`||e===`mocha`||e===`vitest/globals`}function eo(e){e&&(e.noEmit!==!1||e.emitDeclarationOnly===!0||(e.rewriteRelativeImportExtensions=!0))}function to(e,t){if(!e)return;let n=no(e.moduleResolution);if((n===`node`||n===`node10`)&&delete e.moduleResolution,t.isBun||t.depending.reactNative)return;if(t.depending.vite||t.depending.tauri){n!==`bundler`&&(e.moduleResolution=`bundler`);let t=no(e.module);(t===void 0||t!==`preserve`&&!t.startsWith(`es`))&&(e.module=`ESNext`);return}n===`bundler`&&delete e.moduleResolution;let r=no(e.module);(r===`preserve`||r?.startsWith(`es`))&&delete e.module}function no(e){return typeof e==`string`?e.toLowerCase():void 0}function ro(e,t){!e||t.isBun||t.depending.reactNative||t.isEsmPackage||(e.module?.toLowerCase()===`commonjs`&&(e.module=`Node16`),e.verbatimModuleSyntax=!1)}function io(e){let t={};for(let n of[`declaration`,`declarationMap`,`sourceMap`]){let r=e?.[n];r!==void 0&&(t[n]=r)}return t}function ao(e){let t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};return e.isBun?t.add(`bun`):e.depending.reactNative||t.add(`node`),(n.jest||n[`@jest/globals`]||n[`jest-environment-jsdom`]||n[`ts-jest`])&&t.add(`jest`),n.vitest&&t.add(`vitest/globals`),n.mocha&&t.add(`mocha`),n.cypress&&t.add(`cypress`),[...t]}const oo=[`**/.git/objects/**`,`**/.git/subtree-cache/**`,`**/node_modules/**`,`**/tmp/**`,`**/temp/**`,`**/dist/**`];async function so(n){return b.functionIgnoringException(`generateVscodeSettings`,async()=>{try{let r=t.resolve(n.dirPath,`.vscode`,`settings.json`),i=await e.promises.readFile(r,`utf8`),a=JSON.parse(i);for(let e of oo)a=u.all([a,co(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(a=u.all([a,co(`**/.venv/**`)])),n.depending.next&&(a=u.all([a,co(`**/.next/**`)])),`editor.codeActionsOnSave`in a&&delete a[`editor.codeActionsOnSave`],`editor.formatOnSave`in a&&delete a[`editor.formatOnSave`],R(a);let o=JSON.stringify(a,void 0,2);await S.run(()=>x.generateFile(r,o))}catch{}})}function co(e){return{"files.watcherExclude":{[e]:!0}}}async function lo(e){return b.functionIgnoringException(`setupLabels`,async()=>{let[t,n]=W.getOrgAndName(e.repository??``);if(!t||!n||t!==`WillBooster`&&t!==`WillBoosterLab`||!or(t))return;let r=G(t);try{await Z(r,t,n,`d1: x-easy :hedgehog:`,`EDE9FE`),await Z(r,t,n,`d2: easy :rabbit2:`,`DDD6FE`),await Z(r,t,n,`d3: medium :ox:`,`C4B5FD`),await Z(r,t,n,`d4: hard :squid:`,`A78BFA`),await Z(r,t,n,`d5: x-hard :whale2:`,`8B5CF6`),await Z(r,t,n,`p1: critical :fire::fire::fire:`,`EF4444`),await Z(r,t,n,`p2: urgent :fire::fire:`,`F87171`),await Z(r,t,n,`p3: important :fire:`,`FCA5A5`),await Z(r,t,n,`p4: nice to have :droplet:`,`FECACA`),await Z(r,t,n,`r: blitz`,`5300bc`),await Z(r,t,n,`r: firebase`,`ffca28`),await Z(r,t,n,`r: prisma`,`0c344b`),await Z(r,t,n,`r: react`,`61dafb`),await Z(r,t,n,`r: svelte`,`ff3e00`),await Z(r,t,n,`r: semantic-release`,`494949`),await Z(r,t,n,`ready :rocket:`,`22C55E`),await Z(r,t,n,`review requested :mag:`,`FBCA04`),await Z(r,t,n,`released :bookmark:`,`6366F1`),await Z(r,t,n,`s: 0.5h :clock1230:`,`F3F4F6`),await Z(r,t,n,`s: 1h :clock1:`,`E5E7EB`),await Z(r,t,n,`s: 2h :clock2:`,`D1D5DB`),await Z(r,t,n,`s: 3h :clock3:`,`9CA3AF`),await Z(r,t,n,`s: 5h :clock5:`,`6B7280`),await Z(r,t,n,`s: 8h :clock8:`,`4B5563`),await Z(r,t,n,`s: 13h :clock1:`,`374151`),await Z(r,t,n,`t: build :hammer:`,`BFDBFE`),await Z(r,t,n,`t: chore :broom:`,`BFDBFE`),await Z(r,t,n,`t: ci :construction_worker:`,`BFDBFE`),await Z(r,t,n,`t: docs :memo:`,`BFDBFE`),await Z(r,t,n,`t: feat :sparkles:`,`BFDBFE`),await Z(r,t,n,`t: fix :bug:`,`BFDBFE`),await Z(r,t,n,`t: perf :zap:`,`BFDBFE`),await Z(r,t,n,`t: refactor :recycle:`,`BFDBFE`),await Z(r,t,n,`t: style :lipstick:`,`BFDBFE`),await Z(r,t,n,`t: test :test_tube:`,`BFDBFE`),await Z(r,t,n,`project`,`24292F`),await Z(r,t,n,`focused :dart:`,`22C55E`),await Q(r,t,n,`bug`),await Q(r,t,n,`documentation`),await Q(r,t,n,`duplicate`),await Q(r,t,n,`enhancement`),await Q(r,t,n,`good first issue`),await Q(r,t,n,`help wanted`),await Q(r,t,n,`invalid`),await Q(r,t,n,`question`),await Q(r,t,n,`wontfix`),await Q(r,t,n,`ready`),await Q(r,t,n,`review requested`),await Q(r,t,n,`released`),await Q(r,t,n,`semantic-release`),await Q(r,t,n,`llm-pr :robot:`),await Q(r,t,n,`ai-pr :robot:`),await Q(r,t,n,`gen-pr-all :robot:`),await Q(r,t,n,`gen-pr-claude :robot:`),await Q(r,t,n,`gen-pr-codex :robot:`),await Q(r,t,n,`gen-pr-gemini :robot:`)}catch(e){console.warn(`Skip setupLabels due to:`,e?.stack??e)}})}async function Z(e,t,n,r,i){try{await e.request(`POST /repos/{owner}/{repo}/labels`,{owner:t,repo:n,name:r,color:i})}catch{await e.request(`PATCH /repos/{owner}/{repo}/labels/{name}`,{owner:t,repo:n,name:r,color:i})}}async function Q(e,t,n,r){try{await e.request(`DELETE /repos/{owner}/{repo}/labels/{name}`,{owner:t,repo:n,name:r})}catch{}}const uo={"X-GitHub-Api-Version":`2022-11-28`},fo=15368,po={name:`Protect main`,target:`branch`,enforcement:`active`,conditions:{ref_name:{exclude:[],include:[`~DEFAULT_BRANCH`]}},rules:[{type:`deletion`},{type:`required_status_checks`,parameters:{strict_required_status_checks_policy:!1,do_not_enforce_on_create:!0,required_status_checks:[{context:`test / test`,integration_id:fo},{context:`semantic-pr / semantic-pr`,integration_id:fo}]}},{type:`non_fast_forward`},{type:`pull_request`,parameters:{required_approving_review_count:0,dismiss_stale_reviews_on_push:!1,required_reviewers:[],require_code_owner_review:!1,require_last_push_approval:!1,required_review_thread_resolution:!1,allowed_merge_methods:[`squash`]}}],bypass_actors:[{actor_id:17777495,actor_type:`Team`,bypass_mode:`pull_request`}]};async function mo(e){return b.functionIgnoringException(`setupRepositoryRulesets`,async()=>{let[t,n]=W.getOrgAndName(e.repository??``);if(!t||!n||t!==`WillBooster`||!or(t))return;let r=G(t);try{await go(r,t,n,ho(e))}catch(e){if(!vo(e))throw e;console.warn(`Skip setupRepositoryRulesets due to:`,e?.stack??e)}})}function ho(e){let t=structuredClone(po);if(e.cargoTomlDirPaths.length>0)for(let e of t.rules)e.type===`required_status_checks`&&e.parameters.required_status_checks.push({context:`test-rust / test-rust`,integration_id:fo});return t}async function go(e,t,n,r){let i=(await _o(e,t,n,r.name))?.id;await oe(async()=>{if(i){await e.request(`PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}`,{owner:t,repo:n,ruleset_id:i,...r,headers:uo});return}await e.request(`POST /repos/{owner}/{repo}/rulesets`,{owner:t,repo:n,...r,headers:uo})},{shouldRetry:e=>!vo(e)})}async function _o(e,t,n,r){let i=(await oe(()=>e.request(`GET /repos/{owner}/{repo}/rulesets`,{owner:t,repo:n,includes_parents:!1,targets:`branch`,headers:uo}),{shouldRetry:e=>!vo(e)})).data;if(Array.isArray(i))return i.find(e=>e.name===r&&e.source_type===`Repository`)}function vo(e){if(!e||typeof e!=`object`)return!1;let t=e.status;return t===401||t===403||t===404}const yo=[`READY_DISCORD_WEBHOOK_URL`,`GH_BOT_PAT`,`PUBLIC_GH_BOT_PAT`],bo=te(import.meta.url);async function xo(e){return b.functionIgnoringException(`setupSecrets`,async()=>{let[n,r]=W.getOrgAndName(e.repository??``);if(!n||!r||n!==`WillBoosterLab`||!or(n)||!y.doesUploadEnvVars)return;let i=ne.config({path:t.resolve(e.dirPath,`.env`),quiet:!0}).parsed??{};if(Object.keys(i).length===0)return;let a=G(n);try{for(let e of yo)try{await a.request(`DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}`,{owner:n,repo:r,secret_name:e})}catch{}let{key:e,key_id:t}=(await a.request(`GET /repos/{owner}/{repo}/actions/secrets/public-key`,{owner:n,repo:r})).data,o=So();await o.ready;for(let[s,c]of Object.entries(i)){if(s===`GH_BOT_PAT`||s===`GH_BOT_PAT_FOR_WILLBOOSTER`||s===`GH_BOT_PAT_FOR_WILLBOOSTERLAB`)continue;let i=o.from_base64(e,o.base64_variants.ORIGINAL),l=o.from_string(c),u=o.crypto_box_seal(l,i),d=o.to_base64(u,o.base64_variants.ORIGINAL);await a.request(`PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}`,{owner:n,repo:r,secret_name:s,encrypted_value:d,key_id:t})}}catch(e){console.warn(`Skip setupSecrets due to:`,e?.stack??e)}})}function So(){return bo("libsodium-wrappers")}async function Co(e){return b.functionIgnoringException(`setupGitHubSettings`,async()=>{let[t,n]=W.getOrgAndName(e.repository??``);if(!t||!n||t!==`WillBooster`&&t!==`WillBoosterLab`||!or(t))return;let r=G(t);try{await oe(()=>r.request(`PATCH /repos/{owner}/{repo}`,{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:`PR_TITLE`,squash_merge_commit_message:`BLANK`,headers:{"X-GitHub-Api-Version":`2022-11-28`},...e.repository?.startsWith(`github:WillBooster/`)?{allow_auto_merge:!0}:{}}),{shouldRetry:e=>!wo(e)})}catch(e){if(!wo(e))throw e;console.warn(`Skip setupGitHubSettings due to:`,e?.stack??e)}})}function wo(e){return!e||typeof e!=`object`||!(`status`in e)?!1:e.status===401||e.status===403||e.status===404}const To=`__PM_RUN__`,Eo={"pull_request_template.md":`
392
392
  Close #<IssueNumber>
393
393
 
394
394
  ## Self Check
@@ -396,8 +396,8 @@ Close #<IssueNumber>
396
396
  - [ ] I've confirmed \`All checks have passed\` on this page.
397
397
  - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).
398
398
  - PR title doesn't have \`WIP:\`.
399
- - The test command (e.g., \`${Co} test\`) passed.
400
- - The lint command (e.g., \`${Co} lint\`) passed.
399
+ - The test command (e.g., \`${To} test\`) passed.
400
+ - The lint command (e.g., \`${To} lint\`) passed.
401
401
  - You may leave this box unchecked due to long workflows.
402
402
  - [ ] I've reviewed my changes on the GitHub diff view.
403
403
  - [ ] I've written the steps to test my changes.
@@ -430,7 +430,7 @@ Close #<IssueNumber>
430
430
  4. Push \`Submit\` button.
431
431
  5. ...
432
432
  -->
433
- `.trim()};async function To(n){return b.functionIgnoringException(`generateGitHubTemplates`,async()=>{if(n.isWillBoosterRepo)for(let[r,i]of Object.entries(wo)){let a=Eo(i,n),o=t.resolve(n.dirPath,`.github`,r);e.existsSync(o)&&g(await e.promises.readFile(o,`utf8`),a)>a.length/2||(await e.promises.mkdir(t.resolve(n.dirPath,`.github`),{recursive:!0}),await S.run(()=>x.generateFile(o,a)))}})}function Eo(e,t){let n=t.isBun?`bun run`:`yarn`;return e.replaceAll(Co,n)}const Do=_.object({typos:_.object({all:_.record(_.string(),_.string()).optional(),doc:_.record(_.string(),_.string()).optional(),ts:_.record(_.string(),_.string()).optional(),text:_.record(_.string(),_.string()).optional()}).optional()});async function Oo(n,r){let i=t.resolve(n,`package.json`);try{let a=e.existsSync(i),s={},c={},l={},u=!1;if(a){let t=e.readFileSync(i,`utf8`);l=JSON.parse(t),s=l.dependencies??{},c=l.devDependencies??{},u=l.type===`module`}let d=[],f=[];try{let e=t.resolve(n,`.releaserc.json`),r=JSON.parse(await o.readFile(e,`utf8`));d=r?.branches??[],f=r?.plugins?.flat()??[]}catch{}let p=t.basename(t.resolve(n,`..`))!==`packages`||!e.existsSync(t.resolve(n,`..`,`..`,`package.json`)),m;p&&(m=await Lo(n,l));let h=ko(n);for(let r of[`java`,`node`,`python`])if(e.existsSync(t.resolve(n,`.${r}-version`))){h=!0;break}let ee=``;try{ee=await o.readFile(t.resolve(n,`Dockerfile`),`utf8`)}catch{}let te=t.resolve(n,`wbfy.json`),ne;try{let e=await o.readFile(te,`utf8`);ne=Do.parse(JSON.parse(e))}catch{}let g=typeof m?.full_name==`string`?m.full_name:void 0,re,_;if(g){let e=g.split(`/`);e.length>=2&&(re=e[0],_=e[1])}let ie=g?`github:${g}`:void 0,ae=[`tauri.conf.json`,`tauri.conf.json5`,`Tauri.toml`].some(r=>e.existsSync(t.resolve(n,`src-tauri`,r))),v={dirPath:n,dockerfile:ee,isRoot:p,isPublicRepo:m?.private===!1,isReferredByOtherRepo:!!l.files,repository:ie,repoAuthor:re,repoName:_,isWillBoosterRepo:!!(ie?.startsWith(`github:WillBooster/`)||ie?.startsWith(`github:WillBoosterLab/`)),isCloudflare:Ao(n,l),isRailway:jo(n,l),isBun:r?.isBun||e.existsSync(t.join(n,`bun.lockb`))||e.existsSync(t.join(n,`bun.lock`))||e.existsSync(t.join(n,`bunfig.toml`)),isEsmPackage:u,isWillBoosterConfigs:i.includes(`/willbooster-configs`),doesContainSubPackageJsons:$(`packages/**/package.json`,n),doesContainDockerfile:!!ee||e.existsSync(t.resolve(n,`docker-compose.yml`)),doesContainGemfile:e.existsSync(t.resolve(n,`Gemfile`)),doesContainGoMod:e.existsSync(t.resolve(n,`go.mod`)),doesContainPackageJson:e.existsSync(t.resolve(n,`package.json`)),doesContainPoetryLock:e.existsSync(t.resolve(n,`poetry.lock`)),doesContainUvLock:e.existsSync(t.resolve(n,`uv.lock`)),doesContainPomXml:e.existsSync(t.resolve(n,`pom.xml`)),doesContainPubspecYaml:e.existsSync(t.resolve(n,`pubspec.yaml`)),doesContainTauriConfig:ae,doesContainTauriConfigInPackages:$(`packages/**/src-tauri/{tauri.conf.json,tauri.conf.json5,Tauri.toml}`,n),doesContainTemplateYaml:e.existsSync(t.resolve(n,`template.yaml`)),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,`.vscode`,`settings.json`)),doesContainJavaScript:$(`{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}`,n),doesContainTypeScript:$(`{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}`,n),doesContainJsxOrTsx:$(`{app,src,test}/**/*.{t,j}sx`,n),doesContainJava:$(`**/*.java`,n),doesContainJavaScriptInPackages:$(`packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}`,n),doesContainTypeScriptInPackages:$(`packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}`,n),doesContainJsxOrTsxInPackages:$(`packages/**/{app,src,test}/**/*.{t,j}sx`,n),doesContainJavaInPackages:$(`packages/**/*.java`,n),depending:{blitz:!!s.blitz,chakra:!!c[`@chakra-ui/cli`],drizzle:!!s[`drizzle-orm`]||!!c[`drizzle-kit`],firebase:!!c[`firebase-tools`],genI18nTs:!!s[`gen-i18n-ts`]||!!c[`gen-i18n-ts`],litestream:ee.includes(`install-litestream.sh`),react:!!s.react,next:!!s.next,playwrightTest:!!s[`@playwright/test`]||!!c[`@playwright/test`]||!!c.playwright,playwrightRuntime:Io(n),prisma:!!s[`@prisma/client`]||!!c.prisma,pyright:!!c.pyright,reactNative:!!s[`react-native`],semanticRelease:!!(c[`semantic-release`]||d.length>0||f.length>0),storybook:!!c[`@storybook/react`],tauri:!!s[`@tauri-apps/api`]||!!c[`@tauri-apps/api`]||!!s[`@tauri-apps/cli`]||!!c[`@tauri-apps/cli`]||ae,vinext:!!s.vinext||!!c.vinext,vite:!!s.vite||!!c.vite,wb:!!s[`@willbooster/wb`]||!!c[`@willbooster/wb`]},release:{branches:d,github:f.includes(`@semantic-release/github`),npm:f.includes(`@semantic-release/npm`)},hasVersionSettings:h,miseTasks:await Po(n),packageJson:l,wbfyJson:ne};if(v.doesContainGemfile||v.doesContainGoMod||v.doesContainPackageJson||v.doesContainPoetryLock||v.doesContainUvLock||v.doesContainPomXml||v.doesContainPubspecYaml||v.doesContainTauriConfig||v.doesContainTemplateYaml)return v}catch{}}function ko(n){let r=t.resolve(n);return e.existsSync(t.join(r,`mise.toml`))||e.existsSync(t.join(r,`.mise.toml`))||e.existsSync(t.join(r,`.tool-versions`))}function Ao(n,r){let i=r.scripts;return i&&Object.values(i).some(e=>typeof e==`string`&&e.includes(`wrangler`))||[`wrangler.jsonc`,`wrangler.json`,`wrangler.toml`].some(r=>e.existsSync(t.resolve(n,r)))?!0:Mo(n,/cloudflare|wrangler/iu)}function jo(n,r){let i=r.scripts;return i&&Object.values(i).some(e=>typeof e==`string`&&e.includes(`railway`))||e.existsSync(t.resolve(n,`.railwayignore`))||e.existsSync(t.resolve(n,`railway.json`))?!0:Mo(n,/railway/iu)}function Mo(n,r){let i=t.resolve(n,`.github`,`workflows`);try{return e.readdirSync(i).some(e=>/\.ya?ml$/iu.test(e)&&No(i,e,r))}catch{return!1}}function No(n,r,i){try{return i.test(e.readFileSync(t.join(n,r),`utf8`))}catch{return!1}}async function Po(e){let n={};for(let r of[`mise.toml`,`.mise.toml`]){let i=t.resolve(e,r);try{let e=f(await o.readFile(i,`utf8`));for(let[t,r]of Object.entries(e.tasks??{}))n[t]=Fo(r)}catch{}}return n}function Fo(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>typeof e==`string`).join(`
434
- `):e&&typeof e==`object`?Fo(e.run):``}function $(e,t){return s.globSync(e,{dot:!0,cwd:t,ignore:E}).length>0}function Io(n){return s.globSync(`{app,src}/**/*.{cjs,cts,js,jsx,mjs,mts,ts,tsx}`,{dot:!0,cwd:n,ignore:[...E,`**/__tests__/**`,`**/*.spec.*`,`**/*.test.*`,`**/playwright.config.*`]}).some(r=>{let i=e.readFileSync(t.resolve(n,r),`utf8`);return/\bfrom\s+['"]playwright['"]|\bimport\s*\(\s*['"]playwright['"]\s*\)|\brequire\s*\(\s*['"]playwright['"]\s*\)/u.test(i)})}async function Lo(e,t){let n=(await re(e).getRemotes(!0)).find(e=>e.name===`origin`),r=n?.refs.fetch??n?.refs.push;if(typeof r==`string`){let e=await Ro(r);if(e)return e}let i=typeof t.repository==`string`?t.repository:t.repository?.url;if(i){let e=await Ro(i);if(e&&e.message!==`Not Found`)return e}}async function Ro(e){let[t,n]=W.getOrgAndName(e);if(!(!t||!n))try{return(await G().request(`GET /repos/{owner}/{repo}`,{owner:t,repo:n})).data}catch(e){let t=zo(e);if(t)return{full_name:t}}}function zo(e){if(!e||typeof e!=`object`)return;let t=`response`in e?e.response:void 0,n=t?.status??e.status;if(n!==301&&n!==302)return;let r=t?.headers?.location;if(typeof r!=`string`)return;let[i,a]=W.getOrgAndName(r);if(!(!i||!a))return`${i}/${a}`}const Bo=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Vo=String.raw`(?:WillBooster|WillBoosterLab)`,Ho=[RegExp(`^${Vo}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^github:${Vo}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?https://github\\.com/${Vo}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?ssh://git@github\\.com[:/]${Vo}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?git@github\\.com:${Vo}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`)];function Uo(e){let n=e.flatMap(Wo);if(n.length===0)return;let r=n.map(({dependencyName:e,dirPath:n,sectionName:r,specifier:i})=>`- ${t.join(n,`package.json`)}: ${r}.${e} uses ${i}`).join(`
435
- `);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function Wo(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of Bo){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&Go(a)&&(qo(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function Go(e){return Ko(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 Ko(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function qo(e){return Ho.some(t=>t.test(e))}async function Jo(){let e=await n(process.argv.slice(2)).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({env:{description:`Upload environment variables as secrets to GitHub`,type:`boolean`,default:!1,alias:`e`},skipDeps:{description:`Skip dependency installation`,type:`boolean`,default:!1,alias:`d`},verbose:{description:`Whether or not to enable verbose mode`,type:`boolean`,default:!1,alias:`v`}}).version(Zo()).strict().argv;y.isVerbose=e.verbose,y.doesUploadEnvVars=e.env;let t=!1;try{t=await Yo(e.paths,e.skipDeps)}finally{ue()}t&&(process.exitCode=1)}async function Yo(n,r){let i=!1;for(let a of n){let n=t.join(a,`packages`),o=(await ae(()=>e.promises.readdir(n,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(n,e.name));await Ht([a,...o]);let s=await Oo(a);if(y.isVerbose,!s){console.error(`there is no valid package.json in ${a}`),i=!0;continue}let c=on(s),l=[s,...(await Promise.all(o.map(e=>Oo(e,s)))).filter(e=>!!e)];if(y.isVerbose)for(let e of l)console.info(e);Uo(l),await mr(s),s.isBun&&await On(s);let u=!Qt(s.repository)&&(s.repository?.startsWith(`github:WillBooster/`)||s.repository?.startsWith(`github:WillBoosterLab/`));await Promise.all([We(s),c.then(()=>ka(s)),gn(s,l),Rn(s),Bn(s),Un(s,l),Wn(s),Kn(s),To(s),Qn(s),Oa(s),Fa(s),Na(s),...u?[Zt(s)]:[],lo(s),po(s),yo(s),xo(s),ia(s),ma(s)]),await S.promiseAll();let d=[];for(let e of l)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Wt(e,e.isRoot?l:[e])),e.depending.playwrightTest&&d.push(Ee(e)),e.depending.next&&d.push(fe(e)),await Jn(e,s),await S.promiseAll(),!(!e.isRoot&&!e.doesContainPackageJson)&&(await Ta(e),await Ar(e,s,r),d.push(ma(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&d.push(so(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Ba(e)),C(e)?(d.push(va(e)),d.push(ba(e,s))):!e.isRoot&&e.doesContainPackageJson&&C(s)&&d.push(ba(e,s)),e.depending.pyright&&d.push(Da(e)));await Promise.all(d),await S.promiseAll(),await fn(s,l);let f=s.isBun?`bun`:`yarn`;s.isBun?await b.functionIgnoringException(`refreshBunLock`,async()=>{await Promise.resolve(),Xo(a)}):H(f,[`install`,`--no-immutable`],a),H(f,[`cleanup`],a),await La(s)}return i}function Xo(e){let t=nr(`bun`,[`install`],e);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}function Zo(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,`package.json`));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`)).version}await Jo();
436
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZnMiLCJmcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNvbW1vbkNvbnRlbnQiLCJjaGlsZFByb2Nlc3MiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJjb3JlIiwiZXNjYXBlUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwibWFuYWdlZENvbmZpZ0Jsb2NrcyIsImdldENvbmZpZ0NvbnRlbnQiLCJqc29uT2JqIiwiaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IiLCJmc3AiLCJwYXJzZVRvbWwiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliL3NyYy9zbGVlcC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi9zcmMvZml4ZXJzL3Rlc3REaXJlY3RvcnkudHMiLCIuLi9zcmMvZml4ZXJzL3R5cGVEZWZpbml0aW9uLnRzIiwiLi4vc3JjL3V0aWxzL21lcmdlVXRpbC50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL2ZpeGVycy93YkRiQ29tbWFuZC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9jb25maWdDb250ZW50LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWFuYWdlZENvbmZpZ0Jsb2NrLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hmbXRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGxpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2UgPSBmYWxzZTtcbiAgZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpO1xuIiwiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5cbmNsYXNzIExvZ2dlciB7XG4gIGFzeW5jIGZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24obmFtZTogc3RyaW5nLCBmdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLSAke25hbWV9IHN0YXJ0IC0tLS0tLS0tLWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnVuYygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEVycm9yIG9jY3VycmVkIGluICR7bmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogU3RyaW5nKGVycm9yKX19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgKz0gJ1xcbic7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IEFQSSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvc3luYyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbi8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIChHbykgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGFuZCBub1xuLy8gbG9uZ2VyIGV4cG9zZXMgYW4gaW4tcHJvY2VzcyBwYXJzZXIgc3VjaCBhcyBgdHMuY3JlYXRlU291cmNlRmlsZWAuIFBhcnNpbmcgbm93XG4vLyBoYXBwZW5zIGluIGEgc3Bhd25lZCBjb21waWxlciBzZXJ2ZXIgcmVhY2hlZCB0aHJvdWdoIHRoZSBzeW5jaHJvbm91cyBBUEksIHNvIHdlXG4vLyBrZWVwIGEgc2luZ2xlIGxhemlseS1jcmVhdGVkIGluc3RhbmNlIGFuZCByZXVzZSBpdCBhY3Jvc3MgZXZlcnkgZml4ZXIgdG8gYXZvaWRcbi8vIHBheWluZyB0aGUgcHJvY2Vzcy1zcGF3biBjb3N0IHBlciBmaWxlLlxubGV0IGFwaTogQVBJIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRBcGkoKTogQVBJIHtcbiAgcmV0dXJuIChhcGkgPz89IG5ldyBBUEkoeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSkpO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHNvdXJjZSBmaWxlIGludG8gYSBUeXBlU2NyaXB0IEFTVCB1c2luZyB0aGUgYnVuZGxlZCBuYXRpdmUgY29tcGlsZXIuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGNvbXBpbGVyIGNhbm5vdCBsb2FkIHRoZSBmaWxlIChlLmcuIGl0IGlzIG1pc3NpbmdcbiAqIG9yIHVucGFyc2FibGUpIHNvIGNhbGxlcnMgY2FuIGZhbGwgYmFjayB0byBjb25zZXJ2YXRpdmUgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFNvdXJjZUZpbGUgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gZ2V0QXBpKCkudXBkYXRlU25hcHNob3QoeyBvcGVuRmlsZXM6IFtmaWxlUGF0aF0gfSk7XG4gICAgcmV0dXJuIHNuYXBzaG90LmdldERlZmF1bHRQcm9qZWN0Rm9yRmlsZShmaWxlUGF0aCk/LnByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaHV0cyBkb3duIHRoZSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlci4gVGhlIHNlcnZlciBrZWVwcyBhbiBvcGVuIElQQyBjaGFubmVsXG4gKiB0aGF0IHdvdWxkIG90aGVyd2lzZSBrZWVwIHRoZSBOb2RlLmpzIGV2ZW50IGxvb3AgYWxpdmUsIHNvIHdiZnkgbXVzdCBjYWxsIHRoaXNcbiAqIG9uY2UgaXRzIHJ1biBmaW5pc2hlcyBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk6IHZvaWQge1xuICBhcGk/LmNsb3NlKCk7XG4gIGFwaSA9IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG4vLyBTZXR0aW5ncyBldmVyeSBXaWxsQm9vc3RlciBOZXh0LmpzIHByb2plY3Qgc2hvdWxkIGNhcnJ5LiBgbmFtZWAgaXMgdGhlIHRvcC1sZXZlbFxuLy8gcHJvcGVydHkga2V5IHVzZWQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHNldHRpbmcgYWxyZWFkeSBleGlzdHM7IGB0ZXh0YCBpcyBpbnNlcnRlZFxuLy8gdmVyYmF0aW0gKGEgd2hvbGUgYGtleTogdmFsdWVgIHBhaXIpIHdoZW4gdGhlIGtleSBpcyBtaXNzaW5nLlxuY29uc3QgbWFuYWdlZFByb3BlcnRpZXM6IHJlYWRvbmx5IHsgbmFtZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVtdID0gW1xuICB7IG5hbWU6ICdyZWFjdENvbXBpbGVyJywgdGV4dDogJ3JlYWN0Q29tcGlsZXI6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3JlYWN0U3RyaWN0TW9kZScsIHRleHQ6ICdyZWFjdFN0cmljdE1vZGU6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB0ZXh0OiAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9JyB9LFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeE5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeE5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWyd0cycsICdtdHMnLCAnY3RzJywgJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBleHRyYWN0ZWQgPSBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWQpIHJldHVybjtcbiAgICBjb25zdCB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9ID0gZXh0cmFjdGVkO1xuXG4gICAgLy8gYHByb3BlcnRpZXNgIGluY2x1ZGVzIHNwcmVhZCBhc3NpZ25tZW50cyAoYC4uLnJlc3RgKSB0aGF0IGNhcnJ5IG5vIG5hbWUsIHNvIGd1YXJkIGJlZm9yZSByZWFkaW5nIGl0LlxuICAgIGNvbnN0IGV4aXN0aW5nUHJvcGVydGllcyA9IG5ldyBTZXQoXG4gICAgICBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT5cbiAgICAgICAgJ25hbWUnIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm5hbWUgPyBnZXRQcm9wZXJ0eUtleShwcm9wZXJ0eS5uYW1lLCBzb3VyY2UpIDogdW5kZWZpbmVkXG4gICAgICApXG4gICAgKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzID0gbWFuYWdlZFByb3BlcnRpZXNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5KSA9PiAhZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcyhwcm9wZXJ0eS5uYW1lKSlcbiAgICAgIC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS50ZXh0KTtcbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBzb3VyY2UudGV4dDtcbiAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG9iamVjdExpdGVyYWwuZ2V0RW5kKCkgLSAxO1xuICAgIC8vIFRoZSBuYXRpdmUgVFMgQVNUIGRvZXMgbm90IHJlbGlhYmx5IGV4cG9zZSBgcHJvcGVydGllcy5oYXNUcmFpbGluZ0NvbW1hYCwgc28gc2NhbiB0aGUgc291cmNlXG4gICAgLy8gYmV0d2VlbiB0aGUgbGFzdCBwcm9wZXJ0eSBhbmQgdGhlIGNsb3NpbmcgYnJhY2UuIFN0cmlwIGNvbW1lbnRzIGZpcnN0IHNvIGEgY29tbWEgaW5zaWRlIGFcbiAgICAvLyB0cmFpbGluZyBjb21tZW50IChlLmcuIGBmb286IDEgLy8gYSwgYmApIGlzIG5vdCBtaXN0YWtlbiBmb3IgYSByZWFsIHRyYWlsaW5nIGNvbW1hLlxuICAgIGNvbnN0IGxhc3RQcm9wZXJ0eSA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5hdCgtMSk7XG4gICAgY29uc3QgaGFzVHJhaWxpbmdDb21tYSA9IGxhc3RQcm9wZXJ0eVxuICAgICAgPyBzdHJpcENvbW1lbnRzKG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkpLmluY2x1ZGVzKCcsJylcbiAgICAgIDogZmFsc2U7XG4gICAgY29uc3QgcHJlZml4ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgJiYgIWhhc1RyYWlsaW5nQ29tbWEgPyAnLCAnIDogJyc7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpfSR7cHJlZml4fSR7cHJvcGVydHlUZXh0cy5qb2luKCcsICcpfSR7b2xkQ29udGVudC5zbGljZShcbiAgICAgIGluc2VydGlvblBvaW50XG4gICAgKX1gO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogeyBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlOyBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCBkZWNsYXJlcyB0aGUgY29uZmlnIGFzIGBjb25zdCBuZXh0Q29uZmlnOiBOZXh0Q29uZmlnID0geyAuLi4gfWAgYW5kXG4gIC8vIGV4cG9ydHMgaXQgKHBvc3NpYmx5IHdyYXBwZWQsIGUuZy4gYHdpdGhTZW50cnlDb25maWcoLi4uKWApLCBzbyB0aGUgb2JqZWN0IGxpdGVyYWwgaXMgcmFyZWx5XG4gIC8vIHRoZSBkaXJlY3Qgb3BlcmFuZCBvZiBgZXhwb3J0IGRlZmF1bHRgL2Btb2R1bGUuZXhwb3J0c2AuIENvbGxlY3QgZXZlcnkgY2FuZGlkYXRlIGFuZCBwaWNrIHRoZVxuICAvLyBtb3N0IGF1dGhvcml0YXRpdmUgb25lIGJlbG93LlxuICBsZXQgZGlyZWN0T2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBsZXQgZXhwb3J0ZWRJZGVudGlmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMgPSBuZXcgTWFwPHN0cmluZywgYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uPigpO1xuICBjb25zdCB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25bXSA9IFtdO1xuXG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGFzdC5pc0V4cG9ydEFzc2lnbm1lbnQobm9kZSkpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuZXhwcmVzc2lvbik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBhc3QuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gYXN0LlN5bnRheEtpbmQuRXF1YWxzVG9rZW4gJiZcbiAgICAgIG5vZGUubGVmdC5nZXRUZXh0KHNvdXJjZSkgPT09ICdtb2R1bGUuZXhwb3J0cydcbiAgICApIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUucmlnaHQpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLnJpZ2h0KSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUucmlnaHQuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXN0LmlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSAmJiBub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmluaXRpYWxpemVyKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsICYmIGFzdC5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLnNldChub2RlLm5hbWUuZ2V0VGV4dChzb3VyY2UpLCBvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgLy8gQSBgOiBOZXh0Q29uZmlnYCBhbm5vdGF0aW9uIG9yIGEgYHNhdGlzZmllc2AvYGFzIE5leHRDb25maWdgIGFzc2VydGlvbiBtYXJrcyB0aGUgY2Fub25pY2FsXG4gICAgICAgIC8vIGNvbmZpZyBvYmplY3QgKGFjY2VwdGluZyBxdWFsaWZpZWQgbmFtZXMgc3VjaCBhcyBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2ApLlxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uVHlwZSA9IG5vZGUudHlwZT8uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgICBjb25zdCBhc3NlcnRlZFR5cGUgPSBnZXRBc3NlcnRlZFR5cGUobm9kZS5pbml0aWFsaXplcik/LmdldFRleHQoc291cmNlKTtcbiAgICAgICAgY29uc3QgaXNUeXBlZEFzTmV4dENvbmZpZyA9XG4gICAgICAgICAgKGFubm90YXRpb25UeXBlICE9PSB1bmRlZmluZWQgJiYgaXNOZXh0Q29uZmlnVHlwZShhbm5vdGF0aW9uVHlwZSkpIHx8XG4gICAgICAgICAgKGFzc2VydGVkVHlwZSAhPT0gdW5kZWZpbmVkICYmIGlzTmV4dENvbmZpZ1R5cGUoYXNzZXJ0ZWRUeXBlKSk7XG4gICAgICAgIGlmIChpc1R5cGVkQXNOZXh0Q29uZmlnKSB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzLnB1c2gob2JqZWN0TGl0ZXJhbCk7XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9XG4gICAgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsc1swXSA/P1xuICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz9cbiAgICAoZXhwb3J0ZWRJZGVudGlmaWVyID8gdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoZXhwb3J0ZWRJZGVudGlmaWVyKSA6IHVuZGVmaW5lZCkgPz9cbiAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldCgnbmV4dENvbmZpZycpO1xuICByZXR1cm4gb2JqZWN0TGl0ZXJhbCA/IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gOiB1bmRlZmluZWQ7XG59XG5cbi8vIFVud3JhcCBgKHsgLi4uIH0pYCAvIGB7IC4uLiB9IGFzIE5leHRDb25maWdgIC8gYHsgLi4uIH0gc2F0aXNmaWVzIE5leHRDb25maWdgIHRvIHRoZSBvYmplY3QgbGl0ZXJhbC5cbmZ1bmN0aW9uIHVud3JhcE9iamVjdExpdGVyYWwobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBjdXJyZW50ID0gdW53cmFwRXhwcmVzc2lvbihub2RlKTtcbiAgcmV0dXJuIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGN1cnJlbnQpID8gY3VycmVudCA6IHVuZGVmaW5lZDtcbn1cblxuLy8gUmV0dXJuIHRoZSBhc3NlcnRlZCB0eXBlIG9mIGEgYHNhdGlzZmllc2AvYGFzYCBleHByZXNzaW9uLCBpZiBhbnkgKGlnbm9yaW5nIHdyYXBwaW5nIHBhcmVudGhlc2VzKS5cbmZ1bmN0aW9uIGdldEFzc2VydGVkVHlwZShub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5UeXBlTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGN1cnJlbnQgPSB1bndyYXBQYXJlbnRoZXNlcyhub2RlKTtcbiAgcmV0dXJuIGFzdC5pc0FzRXhwcmVzc2lvbihjdXJyZW50KSB8fCBhc3QuaXNTYXRpc2ZpZXNFeHByZXNzaW9uKGN1cnJlbnQpID8gY3VycmVudC50eXBlIDogdW5kZWZpbmVkO1xufVxuXG4vLyBQZWVsIHBhcmVudGhlc2VzIGFuZCBgYXNgL2BzYXRpc2ZpZXNgIGFzc2VydGlvbnMgb2ZmIGFuIGV4cHJlc3Npb24uXG5mdW5jdGlvbiB1bndyYXBFeHByZXNzaW9uKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0Lk5vZGUge1xuICBsZXQgY3VycmVudDogYXN0Lk5vZGUgPSB1bndyYXBQYXJlbnRoZXNlcyhub2RlKTtcbiAgd2hpbGUgKGFzdC5pc0FzRXhwcmVzc2lvbihjdXJyZW50KSB8fCBhc3QuaXNTYXRpc2ZpZXNFeHByZXNzaW9uKGN1cnJlbnQpKSB7XG4gICAgY3VycmVudCA9IHVud3JhcFBhcmVudGhlc2VzKGN1cnJlbnQuZXhwcmVzc2lvbik7XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8vIFBlZWwgd3JhcHBpbmcgcGFyZW50aGVzZXMgb2ZmIGFuIGV4cHJlc3Npb24uXG5mdW5jdGlvbiB1bndyYXBQYXJlbnRoZXNlcyhub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5FeHByZXNzaW9uIHtcbiAgbGV0IGN1cnJlbnQgPSBub2RlO1xuICB3aGlsZSAoYXN0LmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oY3VycmVudCkpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5leHByZXNzaW9uO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyBNYXRjaCBib3RoIHRoZSBiYXJlIGBOZXh0Q29uZmlnYCBhbmQgcXVhbGlmaWVkIGZvcm1zIGxpa2UgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgLlxuZnVuY3Rpb24gaXNOZXh0Q29uZmlnVHlwZSh0eXBlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlVGV4dCA9PT0gJ05leHRDb25maWcnIHx8IHR5cGVUZXh0LmVuZHNXaXRoKCcuTmV4dENvbmZpZycpO1xufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBrZXkgd2l0aG91dCBzdXJyb3VuZGluZyBxdW90ZXMsIHNvIGAncmVhY3RDb21waWxlcidgIG1hdGNoZXMgYHJlYWN0Q29tcGlsZXJgLlxuLy8gSWRlbnRpZmllciwgc3RyaW5nLWxpdGVyYWwgYW5kIG51bWVyaWMtbGl0ZXJhbCBuYW1lcyBhbGwgZXhwb3NlIHRoZSB1bnF1b3RlZCB2YWx1ZSB2aWEgYC50ZXh0YC5cbmZ1bmN0aW9uIGdldFByb3BlcnR5S2V5KG5hbWU6IGFzdC5Qcm9wZXJ0eU5hbWUsIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmcge1xuICByZXR1cm4gJ3RleHQnIGluIG5hbWUgJiYgdHlwZW9mIG5hbWUudGV4dCA9PT0gJ3N0cmluZycgPyBuYW1lLnRleHQgOiBuYW1lLmdldFRleHQoc291cmNlKTtcbn1cblxuLy8gUmVtb3ZlIGxpbmUgYW5kIGJsb2NrIGNvbW1lbnRzIGZyb20gYSBzb3VyY2Ugc25pcHBldC5cbmZ1bmN0aW9uIHN0cmlwQ29tbWVudHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvXFwvXFwvW15cXG5dKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csICcnKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnaXNCdW4nPik6ICdidW4nIHwgJ3lhcm4nIHtcbiAgcmV0dXJuIGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgT2JqZWN0TWVtYmVyID0geyBraW5kOiAnZXh0cmEnOyBpbmRleDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdwcm9wZXJ0eSc7IGtleTogc3RyaW5nIH07XG5pbnRlcmZhY2UgUGFyc2VkT2JqZWN0IHtcbiAgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXTtcbiAgbWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT47XG59XG5pbnRlcmZhY2UgRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB7XG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7XG4gIG5vZGU6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0czogYm9vbGVhbik6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IHVzZSA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb24nXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSk7XG5cbiAgaWYgKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKSB7XG4gICAgdXNlLnByb3BlcnRpZXMuYmFzZVVSTCA9IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyk7XG4gICAgdXNlLm1lbWJlck9yZGVyLnVuc2hpZnQoeyBraW5kOiAncHJvcGVydHknLCBrZXk6ICdiYXNlVVJMJyB9KTtcbiAgfVxuXG4gIHJldHVybiB0b1BhcnNlZE9iamVjdCh7XG4gICAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICAgIHVzZTogeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHVzZSB9LFxuICAgIC4uLihzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0c1xuICAgICAgPyB7XG4gICAgICAgICAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgICAgICAgICBjb21tYW5kOiBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZChjb25maWcpKSxcbiAgICAgICAgICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICAgICAgICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICAgICAgICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgICAgICAgICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyA9XG4gICAgICAoYXdhaXQgZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKSkgJiYgc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnLCBwYXJzZWQpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpO1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKG1lcmdlZCwgZGVmYXVsdENvbmZpZyk7XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChtZXJnZWQsIGNvbmZpZyk7XG5cbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5VmFsdWUoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlZCB9LCAwKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UudGV4dDtcbiAgICBjb25zdCBzdGFydCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRTdGFydChleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgY29uc3QgZW5kID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIHN0YXJ0KX0ke25ld09iamVjdExpdGVyYWx9JHtvbGRDb250ZW50LnNsaWNlKGVuZCl9YDtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZTogUGFyc2VkT2JqZWN0LCBvdmVycmlkZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wZXJ0eUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG92ZXJyaWRlLnByb3BlcnRpZXMpKTtcbiAgY29uc3QgZXh0cmFNZW1iZXJzID0gWy4uLmJhc2UuZXh0cmFNZW1iZXJzLCAuLi5vdmVycmlkZS5leHRyYU1lbWJlcnNdO1xuICAvLyBLZWVwIGRlZmF1bHQtb25seSBtZW1iZXJzIGJlZm9yZSBwYXJzZWQgbWVtYmVycyBzbyBzcHJlYWRzIGFuZCBleHBsaWNpdCBsb2NhbCBwcm9wZXJ0aWVzIHJldGFpbiBwcmVjZWRlbmNlLlxuICBjb25zdCBtZW1iZXJPcmRlciA9IFtcbiAgICAuLi5iYXNlLm1lbWJlck9yZGVyLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPT0gJ3Byb3BlcnR5JyB8fCAhb3ZlcnJpZGVQcm9wZXJ0eUtleXMuaGFzKG1lbWJlci5rZXkpKSxcbiAgICAuLi5vdmVycmlkZS5tZW1iZXJPcmRlci5tYXAoKG1lbWJlcik6IE9iamVjdE1lbWJlciA9PiB7XG4gICAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHJldHVybiBtZW1iZXI7XG4gICAgICByZXR1cm4geyBraW5kOiAnZXh0cmEnLCBpbmRleDogYmFzZS5leHRyYU1lbWJlcnMubGVuZ3RoICsgbWVtYmVyLmluZGV4IH07XG4gICAgfSksXG4gIF07XG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7IC4uLmJhc2UucHJvcGVydGllcyB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZS5wcm9wZXJ0aWVzKSkge1xuICAgIHByb3BlcnRpZXNba2V5XSA9IG1lcmdlUGFyc2VkVmFsdWUocHJvcGVydGllc1trZXldLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHsgZXh0cmFNZW1iZXJzLCBtZW1iZXJPcmRlciwgcHJvcGVydGllcyB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZFZhbHVlKGJhc2U6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkLCBvdmVycmlkZTogUGFyc2VkVmFsdWUpOiBQYXJzZWRWYWx1ZSB7XG4gIGlmIChiYXNlPy5raW5kID09PSAnb2JqZWN0JyAmJiBvdmVycmlkZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2UudmFsdWUsIG92ZXJyaWRlLnZhbHVlKSB9O1xuICB9XG4gIHJldHVybiBvdmVycmlkZTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMoY29uZmlnOiBQYXJzZWRPYmplY3QsIGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB1c2UgPSBjb25maWcucHJvcGVydGllcy51c2U7XG4gIGNvbnN0IGRlZmF1bHRVc2UgPSBkZWZhdWx0Q29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBpZiAodXNlPy5raW5kICE9PSAnb2JqZWN0JyB8fCBkZWZhdWx0VXNlPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIFsndHJhY2UnLCAnc2NyZWVuc2hvdCcsICd2aWRlbyddKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV07XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwYXJzZWQ6IFBhcnNlZE9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fFxuICAgIHBhcnNlZC5wcm9wZXJ0aWVzLndlYlNlcnZlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgZG9lc09iamVjdEhhdmVCYXNlVXJsKHBhcnNlZC5wcm9wZXJ0aWVzLnVzZSkgfHxcbiAgICBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkIH0sICdORVhUX1BVQkxJQ19CQVNFX1VSTCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRvZXNPYmplY3RIYXZlQmFzZVVybCh2YWx1ZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlPy5raW5kID09PSAnb2JqZWN0JyAmJiB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzLmJhc2VVUkwgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwodmFsdWU6IFBhcnNlZFZhbHVlLCBsaXRlcmFsVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZS5pbmNsdWRlcyhsaXRlcmFsVGV4dCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSByZXR1cm4gdmFsdWUudmFsdWUuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpO1xuICByZXR1cm4gKFxuICAgIHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVycy5zb21lKChtZW1iZXIpID0+IG1lbWJlci5pbmNsdWRlcyhsaXRlcmFsVGV4dCkpIHx8XG4gICAgT2JqZWN0LnZhbHVlcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGdldEVudkZpbGVQYXRocyhkaXJQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgLy8gU29tZSBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb25seSBkZWZpbmUgYnJvd3NlciBwcm9qZWN0cyBvciBmaXh0dXJlcyBhbmQgZG8gbm90XG4gIC8vIHN0YXJ0IGEgd2ViIGFwcC4gQXZvaWQgZm9yY2luZyBhbiBhcHAtc2VydmVyIFVSTCBpbnRvIHRob3NlIHBhY2thZ2VzLlxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEVudkZpbGVQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVudkZpbGVOYW1lcyA9IFsnLmVudicsICcuZW52LnRlc3QnLCAnLmVudi5leGFtcGxlJywgJ21pc2UudG9tbCcsICdtaXNlLnRlc3QudG9tbCddO1xuICBjb25zdCBlbnZGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpKSB7XG4gICAgZW52RmlsZVBhdGhzLnB1c2goLi4uZW52RmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG5cbiAgICAvLyBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb2Z0ZW4gbGl2ZSBpbiBwYWNrYWdlcy8qIHdoaWxlIHNoYXJlZCBlbnYgZmlsZXMgbGl2ZSBhdCB0aGVcbiAgICAvLyByZXBvc2l0b3J5IHJvb3QsIHNvIHdhbGsgdXB3YXJkIHVudGlsIHRoZSB0YXJnZXQgcmVwbyBib3VuZGFyeS5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsICcuZ2l0JykpKSBicmVhaztcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZW52RmlsZVBhdGhzO1xufVxuXG5mdW5jdGlvbiBzZXRXZWJTZXJ2ZXJDb21tYW5kKG9iamVjdDogUGFyc2VkT2JqZWN0LCBjb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgY29uc3Qgd2ViU2VydmVyID0gb2JqZWN0LnByb3BlcnRpZXMud2ViU2VydmVyO1xuICBpZiAod2ViU2VydmVyPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIC8vIHdiIG93bnMgdGhlIGNhbm9uaWNhbCB0ZXN0LXNlcnZlciBzdGFydHVwIHBhdGg7IGtlZXAgY3VzdG9tIFBsYXl3cmlnaHRcbiAgLy8gc2VydmVyIHNldHRpbmdzIHdoaWxlIG5vcm1hbGl6aW5nIHRoZSBjb21tYW5kIGl0c2VsZi4gSW52b2tlIHdiIHRocm91Z2ggdGhlXG4gIC8vIHBhY2thZ2UgbWFuYWdlciBiZWNhdXNlIHRhcmdldCByZXBvcyBpbnN0YWxsIHdiIGFzIGEgcGFja2FnZSBkZXBlbmRlbmN5LlxuICB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kID0gbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoY29uZmlnKSk7XG59XG5cbmZ1bmN0aW9uIGdldFdiU3RhcnRUZXN0Q29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke2dldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZChjb25maWcpfSB3YiBzdGFydCAtLW1vZGUgdGVzdCdgO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aDogc3RyaW5nKTogRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmIChhc3QuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBhc3QuRXhwcmVzc2lvbiwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKGFzdC5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8XG4gICAgICAoIWFzdC5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIWFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy5hbnRpZ3Jhdml0eWNsaS8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0ID0gc2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0KGNvbmZpZyk7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAgICAgL0RBVEFCQVNFX1VSTFxccyo9XFxzKlwiPyhbXlwiI1xcbl0rP1xcLnNxbGl0ZTNbXlwiI1xcbl0qKVwiPy9nLFxuICAgICAgICAobWF0Y2gsIHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGBEQVRBQkFTRV9VUkw9XCIke25vcm1hbGl6ZVNxbGl0ZURhdGFiYXNlVXJsKHVybCwgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0KX1cImA7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAobmV3Q29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEFkZFNxbGl0ZUNvbm5lY3Rpb25MaW1pdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICAvLyBgY29ubmVjdGlvbl9saW1pdD0xYCBvbmx5IGFwcGxpZXMgdG8gUHJpc21hJ3MgU1FMaXRlIGRhdGFzb3VyY2UgaGFuZGxpbmcuXG4gIC8vIFJlcG9zIHRoYXQgb3B0IGludG8gbm9uLXB1cmUgU1FMaXRlIGFkYXB0ZXJzIHNob3VsZCBrZWVwIHRoZWlyIFVSTCBhcy1pcy5cbiAgcmV0dXJuICFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvYWRhcHRlci1iZXR0ZXItc3FsaXRlMyddICYmICFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvYWRhcHRlci1saWJzcWwnXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwodXJsOiBzdHJpbmcsIHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHF1ZXJ5U3RhcnQgPSB1cmwuaW5kZXhPZignPycpO1xuICBjb25zdCBwYXRoUGFydCA9IHF1ZXJ5U3RhcnQgIT09IC0xID8gdXJsLnNsaWNlKDAsIHF1ZXJ5U3RhcnQpIDogdXJsO1xuICBjb25zdCBxdWVyeVBhcnQgPSBxdWVyeVN0YXJ0ICE9PSAtMSA/IHVybC5zbGljZShxdWVyeVN0YXJ0ICsgMSkgOiAnJztcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeVBhcnQpO1xuXG4gIHBhcmFtcy5kZWxldGUoJ2Nvbm5lY3Rpb25fbGltaXQnKTtcbiAgaWYgKHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCkge1xuICAgIHBhcmFtcy5zZXQoJ2Nvbm5lY3Rpb25fbGltaXQnLCAnMScpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gIHJldHVybiBub3JtYWxpemVkUXVlcnkgPyBgJHtwYXRoUGFydH0/JHtub3JtYWxpemVkUXVlcnl9YCA6IHBhdGhQYXJ0O1xufVxuIiwiY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNvcnRPYmplY3RCeUtleU5hbWVMaXN0KG9iamVjdCwgc29ydFdpdGgpIHtcbiAgbGV0IGtleXMsIHNvcnRGbiwga2V5XG5cbiAgaWYgKHR5cGVvZiBzb3J0V2l0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNvcnRGbiA9IHNvcnRXaXRoXG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IHNvcnRXaXRoXG4gIH1cblxuICBjb25zdCB0b3RhbCA9IHt9XG4gIGNvbnN0IG9iamVjdEtleXMgPSBbLi4uKGtleXMgPz8gW10pLCAuLi5PYmplY3Qua2V5cyhvYmplY3QpLnNvcnQoc29ydEZuKV1cblxuICBmb3IgKGtleSBvZiBvYmplY3RLZXlzKSB7XG4gICAgaWYgKGhhcyhvYmplY3QsIGtleSkpIHtcbiAgICAgIHRvdGFsW2tleV0gPSBvYmplY3Rba2V5XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b3RhbFxufVxuIiwiLy8gRGV0ZWN0IGVpdGhlciBzcGFjZXMgb3IgdGFicyBidXQgbm90IGJvdGggdG8gcHJvcGVybHkgaGFuZGxlIHRhYnMgZm9yIGluZGVudGF0aW9uIGFuZCBzcGFjZXMgZm9yIGFsaWdubWVudFxuY29uc3QgSU5ERU5UX1JFR0VYID0gL14oPzooICkrfFxcdCspLztcblxuY29uc3QgSU5ERU5UX1RZUEVfU1BBQ0UgPSAnc3BhY2UnO1xuY29uc3QgSU5ERU5UX1RZUEVfVEFCID0gJ3RhYic7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiB3ZSBzaG91bGQgaWdub3JlIHNpbmdsZSBzcGFjZSBwYXR0ZXJuc1xuZnVuY3Rpb24gc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCB2YWx1ZSkge1xuXHRyZXR1cm4gaWdub3JlU2luZ2xlU3BhY2VzICYmIGluZGVudFR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFICYmIHZhbHVlID09PSAxO1xufVxuXG4vKipcbk1ha2UgYSBNYXAgdGhhdCBjb3VudHMgaG93IG1hbnkgaW5kZW50cy91bmluZGVudHMgaGF2ZSBvY2N1cnJlZCBmb3IgYSBnaXZlbiBzaXplIGFuZCBob3cgbWFueSBsaW5lcyBmb2xsb3cgYSBnaXZlbiBpbmRlbnRhdGlvbi5cblxuVGhlIGtleSBpcyBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIGluZGVudGF0aW9uIHR5cGUgKHMgPSBzcGFjZSBhbmQgdCA9IHRhYikgYW5kIHRoZSBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cy5cblxuYGBgXG5pbmRlbnRzID0ge1xuXHR0MzogWzEsIDBdLFxuXHR0NDogWzEsIDVdLFxuXHRzNTogWzEsIDBdLFxuXHRzMTI6IFsxLCAwXSxcbn1cbmBgYFxuKi9cbmZ1bmN0aW9uIG1ha2VJbmRlbnRzTWFwKHN0cmluZywgaWdub3JlU2luZ2xlU3BhY2VzKSB7XG5cdGNvbnN0IGluZGVudHMgPSBuZXcgTWFwKCk7XG5cblx0Ly8gUmVtZW1iZXIgdGhlIHNpemUgb2YgcHJldmlvdXMgbGluZSdzIGluZGVudGF0aW9uXG5cdGxldCBwcmV2aW91c1NpemUgPSAwO1xuXHRsZXQgcHJldmlvdXNJbmRlbnRUeXBlO1xuXG5cdC8vIEluZGVudHMga2V5IChpZGVudCB0eXBlICsgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMpXG5cdGxldCBrZXk7XG5cblx0Zm9yIChjb25zdCBsaW5lIG9mIHN0cmluZy5zcGxpdCgvXFxuL2cpKSB7XG5cdFx0aWYgKCFsaW5lKSB7XG5cdFx0XHQvLyBJZ25vcmUgZW1wdHkgbGluZXNcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1hdGNoZXMgPSBsaW5lLm1hdGNoKElOREVOVF9SRUdFWCk7XG5cblx0XHRpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBpbmRlbnQgPSBtYXRjaGVzWzBdLmxlbmd0aDtcblx0XHRcdGNvbnN0IGluZGVudFR5cGUgPSBtYXRjaGVzWzFdID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgdW5sZXNzIGl0J3MgdGhlIG9ubHkgaW5kZW50IGRldGVjdGVkIHRvIHByZXZlbnQgY29tbW9uIGZhbHNlIHBvc2l0aXZlc1xuXHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgaW5kZW50KSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGluZGVudFR5cGUgIT09IHByZXZpb3VzSW5kZW50VHlwZSkge1xuXHRcdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSBpbmRlbnRUeXBlO1xuXG5cdFx0XHRsZXQgdXNlID0gMTtcblx0XHRcdGxldCB3ZWlnaHQgPSAwO1xuXG5cdFx0XHRjb25zdCBpbmRlbnREaWZmZXJlbmNlID0gaW5kZW50IC0gcHJldmlvdXNTaXplO1xuXHRcdFx0cHJldmlvdXNTaXplID0gaW5kZW50O1xuXG5cdFx0XHQvLyBQcmV2aW91cyBsaW5lIGhhdmUgc2FtZSBpbmRlbnQ/XG5cdFx0XHRpZiAoaW5kZW50RGlmZmVyZW5jZSA9PT0gMCkge1xuXHRcdFx0XHQvLyBOb3QgYSBuZXcgXCJ1c2VcIiBvZiB0aGUgY3VycmVudCBpbmRlbnQ6XG5cdFx0XHRcdHVzZSA9IDA7XG5cdFx0XHRcdC8vIEJ1dCBkbyBhZGQgYSBiaXQgdG8gaXQgZm9yIGJyZWFraW5nIHRpZXM6XG5cdFx0XHRcdHdlaWdodCA9IDE7XG5cdFx0XHRcdC8vIFdlIHVzZSB0aGUga2V5IGZyb20gcHJldmlvdXMgbG9vcFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlID0gTWF0aC5hYnMoaW5kZW50RGlmZmVyZW5jZSk7XG5cblx0XHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSBjaGFuZ2VzIHdoZW4gaWdub3JlU2luZ2xlU3BhY2VzIGlzIHRydWVcblx0XHRcdFx0Ly8gVGhpcyBwcmV2ZW50cyBjb21tb24gZmFsc2UgcG9zaXRpdmVzIGZyb20gdGhpbmdzIGxpa2UgYWxpZ25lZCBjb21tZW50c1xuXHRcdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSB0aGUgc3RhdHNcblx0XHRcdGNvbnN0IGVudHJ5ID0gaW5kZW50cy5nZXQoa2V5KTtcblx0XHRcdGluZGVudHMuc2V0KGtleSwgZW50cnkgPT09IHVuZGVmaW5lZCA/IFsxLCAwXSA6IFtlbnRyeVswXSArIHVzZSwgZW50cnlbMV0gKyB3ZWlnaHRdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gaW5kZW50cztcbn1cblxuLy8gRW5jb2RlIHRoZSBpbmRlbnQgdHlwZSBhbmQgYW1vdW50IGFzIGEgc3RyaW5nIChlLmcuICdzNCcpIGZvciB1c2UgYXMgYSBjb21wb3VuZCBrZXkgaW4gdGhlIGluZGVudHMgTWFwLlxuZnVuY3Rpb24gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBpbmRlbnRBbW91bnQpIHtcblx0Y29uc3QgdHlwZUNoYXJhY3RlciA9IGluZGVudFR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJ3MnIDogJ3QnO1xuXHRyZXR1cm4gdHlwZUNoYXJhY3RlciArIFN0cmluZyhpbmRlbnRBbW91bnQpO1xufVxuXG4vLyBFeHRyYWN0IHRoZSBpbmRlbnQgdHlwZSBhbmQgYW1vdW50IGZyb20gYSBrZXkgb2YgdGhlIGluZGVudHMgTWFwLlxuZnVuY3Rpb24gZGVjb2RlSW5kZW50c0tleShpbmRlbnRzS2V5KSB7XG5cdGNvbnN0IGtleUhhc1R5cGVTcGFjZSA9IGluZGVudHNLZXlbMF0gPT09ICdzJztcblx0Y29uc3QgdHlwZSA9IGtleUhhc1R5cGVTcGFjZSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdGNvbnN0IGFtb3VudCA9IE51bWJlcihpbmRlbnRzS2V5LnNsaWNlKDEpKTtcblxuXHRyZXR1cm4ge3R5cGUsIGFtb3VudH07XG59XG5cbi8vIFJldHVybiB0aGUga2V5IChlLmcuICdzNCcpIGZyb20gdGhlIGluZGVudHMgTWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgbW9zdCBjb21tb24gaW5kZW50LFxuLy8gb3IgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGVyZSBhcmUgbm8gaW5kZW50cy5cbmZ1bmN0aW9uIGdldE1vc3RVc2VkS2V5KGluZGVudHMpIHtcblx0bGV0IHJlc3VsdDtcblx0bGV0IG1heFVzZWQgPSAwO1xuXHRsZXQgbWF4V2VpZ2h0ID0gMDtcblxuXHRmb3IgKGNvbnN0IFtrZXksIFt1c2VkQ291bnQsIHdlaWdodF1dIG9mIGluZGVudHMpIHtcblx0XHRpZiAodXNlZENvdW50ID4gbWF4VXNlZCB8fCAodXNlZENvdW50ID09PSBtYXhVc2VkICYmIHdlaWdodCA+IG1heFdlaWdodCkpIHtcblx0XHRcdG1heFVzZWQgPSB1c2VkQ291bnQ7XG5cdFx0XHRtYXhXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0XHRyZXN1bHQgPSBrZXk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbWFrZUluZGVudFN0cmluZyh0eXBlLCBhbW91bnQpIHtcblx0Y29uc3QgaW5kZW50Q2hhcmFjdGVyID0gdHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAnICcgOiAnXFx0Jztcblx0cmV0dXJuIGluZGVudENoYXJhY3Rlci5yZXBlYXQoYW1vdW50KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0SW5kZW50KHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Ly8gSWRlbnRpZnkgaW5kZW50cyB3aGlsZSBza2lwcGluZyBzaW5nbGUgc3BhY2UgaW5kZW50cyB0byBhdm9pZCBjb21tb24gZWRnZSBjYXNlcyAoZS5nLiBjb2RlIGNvbW1lbnRzKVxuXHQvLyBJZiBubyBpbmRlbnRzIGFyZSBpZGVudGlmaWVkLCBydW4gYWdhaW4gYW5kIGluY2x1ZGUgYWxsIGluZGVudHMgZm9yIGNvbXByZWhlbnNpdmUgZGV0ZWN0aW9uXG5cdGxldCBpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCB0cnVlKTtcblx0aWYgKGluZGVudHMuc2l6ZSA9PT0gMCkge1xuXHRcdGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIGZhbHNlKTtcblx0fVxuXG5cdGNvbnN0IGtleU9mTW9zdFVzZWRJbmRlbnQgPSBnZXRNb3N0VXNlZEtleShpbmRlbnRzKTtcblxuXHRsZXQgdHlwZTtcblx0bGV0IGFtb3VudCA9IDA7XG5cdGxldCBpbmRlbnQgPSAnJztcblxuXHRpZiAoa2V5T2ZNb3N0VXNlZEluZGVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0KHt0eXBlLCBhbW91bnR9ID0gZGVjb2RlSW5kZW50c0tleShrZXlPZk1vc3RVc2VkSW5kZW50KSk7XG5cdFx0aW5kZW50ID0gbWFrZUluZGVudFN0cmluZyh0eXBlLCBhbW91bnQpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRhbW91bnQsXG5cdFx0dHlwZSxcblx0XHRpbmRlbnQsXG5cdH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZShzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdGNvbnN0IG5ld2xpbmVzID0gc3RyaW5nLm1hdGNoKC8oPzpcXHI/XFxuKS9nKSB8fCBbXTtcblxuXHRpZiAobmV3bGluZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgY3JsZiA9IG5ld2xpbmVzLmZpbHRlcihuZXdsaW5lID0+IG5ld2xpbmUgPT09ICdcXHJcXG4nKS5sZW5ndGg7XG5cdGNvbnN0IGxmID0gbmV3bGluZXMubGVuZ3RoIC0gY3JsZjtcblxuXHRyZXR1cm4gY3JsZiA+IGxmID8gJ1xcclxcbicgOiAnXFxuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmVHcmFjZWZ1bChzdHJpbmcpIHtcblx0cmV0dXJuICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyAmJiBkZXRlY3ROZXdsaW5lKHN0cmluZykpIHx8ICdcXG4nO1xufVxuIiwiIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG5cdHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHNvcnRPYmplY3RLZXlzIGZyb20gJ3NvcnQtb2JqZWN0LWtleXMnXG5pbXBvcnQgZGV0ZWN0SW5kZW50IGZyb20gJ2RldGVjdC1pbmRlbnQnXG5pbXBvcnQgeyBkZXRlY3ROZXdsaW5lR3JhY2VmdWwgYXMgZGV0ZWN0TmV3bGluZSB9IGZyb20gJ2RldGVjdC1uZXdsaW5lJ1xuaW1wb3J0IGdpdEhvb2tzIGZyb20gJ2dpdC1ob29rcy1saXN0J1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnaXMtcGxhaW4tb2JqJ1xuaW1wb3J0IHNlbXZlckNvbXBhcmUgZnJvbSAnc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLmpzJ1xuaW1wb3J0IHNlbXZlck1pblZlcnNpb24gZnJvbSAnc2VtdmVyL3Jhbmdlcy9taW4tdmVyc2lvbi5qcydcblxuY29uc3QgcGlwZSA9XG4gIChmbnMpID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGZucy5yZWR1Y2UoKHJlc3VsdCwgZm4pID0+IGZuKHJlc3VsdCwgLi4uYXJncyksIHgpXG5jb25zdCBvbkFycmF5ID0gKGZuKSA9PiAoeCkgPT4gKEFycmF5LmlzQXJyYXkoeCkgPyBmbih4KSA6IHgpXG5jb25zdCBvblN0cmluZ0FycmF5ID0gKGZuKSA9PiAoeCkgPT5cbiAgQXJyYXkuaXNBcnJheSh4KSAmJiB4LmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpID8gZm4oeCkgOiB4XG5jb25zdCB1bmlxID0gb25TdHJpbmdBcnJheSgoeHMpID0+IFsuLi5uZXcgU2V0KHhzKV0pXG5jb25zdCBzb3J0QXJyYXkgPSBvblN0cmluZ0FycmF5KChhcnJheSkgPT4gYXJyYXkudG9Tb3J0ZWQoKSlcbmNvbnN0IHVuaXFBbmRTb3J0QXJyYXkgPSBwaXBlKFt1bmlxLCBzb3J0QXJyYXldKVxuY29uc3Qgb25PYmplY3QgPVxuICAoZm4pID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGlzUGxhaW5PYmplY3QoeCkgPyBmbih4LCAuLi5hcmdzKSA6IHhcbmNvbnN0IHNvcnRPYmplY3RCeSA9IChjb21wYXJhdG9yLCBkZWVwKSA9PiB7XG4gIGNvbnN0IG92ZXIgPSBvbk9iamVjdCgob2JqZWN0KSA9PiB7XG4gICAgaWYgKGRlZXApIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgb3Zlcih2YWx1ZSldKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMob2JqZWN0LCBjb21wYXJhdG9yKVxuICB9KVxuXG4gIHJldHVybiBvdmVyXG59XG5jb25zdCBzb3J0T2JqZWN0ID0gc29ydE9iamVjdEJ5KClcbmNvbnN0IHNvcnRVUkxPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyd0eXBlJywgJ3VybCddKVxuY29uc3Qgc29ydFBlb3BsZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ25hbWUnLCAnZW1haWwnLCAndXJsJ10pXG5jb25zdCBzb3J0RGlyZWN0b3JpZXMgPSBzb3J0T2JqZWN0QnkoW1xuICAnbGliJyxcbiAgJ2JpbicsXG4gICdtYW4nLFxuICAnZG9jJyxcbiAgJ2V4YW1wbGUnLFxuICAndGVzdCcsXG5dKVxuY29uc3Qgb3ZlclByb3BlcnR5ID0gKHByb3BlcnR5LCBvdmVyKSA9PlxuICBvbk9iamVjdCgob2JqZWN0LCAuLi5hcmdzKSA9PlxuICAgIE9iamVjdC5oYXNPd24ob2JqZWN0LCBwcm9wZXJ0eSlcbiAgICAgID8geyAuLi5vYmplY3QsIFtwcm9wZXJ0eV06IG92ZXIob2JqZWN0W3Byb3BlcnR5XSwgLi4uYXJncykgfVxuICAgICAgOiBvYmplY3QsXG4gIClcbmNvbnN0IHNvcnRHaXRIb29rcyA9IHNvcnRPYmplY3RCeShnaXRIb29rcylcblxuY29uc3QgcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlID0gKHNwZWNpZmllcikgPT4ge1xuICAvLyBJZ25vcmUgYW55dGhpbmcgYWZ0ZXIgPiAmIHJlbHkgb24gZmFsbGJhY2sgYWxwaGFudW1lcmljIHNvcnRpbmcgZm9yIHRoYXRcbiAgY29uc3QgW25hbWVBbmRWZXJzaW9uXSA9IHNwZWNpZmllci5zcGxpdCgnPicpXG4gIGNvbnN0IGF0TWF0Y2hlcyA9IFsuLi5uYW1lQW5kVmVyc2lvbi5tYXRjaEFsbCgnQCcpXVxuICBpZiAoXG4gICAgIWF0TWF0Y2hlcy5sZW5ndGggfHxcbiAgICAoYXRNYXRjaGVzLmxlbmd0aCA9PT0gMSAmJiBhdE1hdGNoZXNbMF0uaW5kZXggPT09IDApXG4gICkge1xuICAgIHJldHVybiB7IG5hbWU6IHNwZWNpZmllciB9XG4gIH1cbiAgY29uc3Qgc3BsaXRJbmRleCA9IGF0TWF0Y2hlcy5wb3AoKS5pbmRleFxuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZygwLCBzcGxpdEluZGV4KSxcbiAgICByYW5nZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKHNwbGl0SW5kZXggKyAxKSxcbiAgfVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlTZW12ZXIgPSBzb3J0T2JqZWN0QnkoKGEsIGIpID0+IHtcbiAgY29uc3QgeyBuYW1lOiBhTmFtZSwgcmFuZ2U6IGFSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGEpXG4gIGNvbnN0IHsgbmFtZTogYk5hbWUsIHJhbmdlOiBiUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShiKVxuXG4gIGlmIChhTmFtZSAhPT0gYk5hbWUpIHtcbiAgICByZXR1cm4gYU5hbWUubG9jYWxlQ29tcGFyZShiTmFtZSwgJ2VuJylcbiAgfVxuICBpZiAoIWFSYW5nZSkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmICghYlJhbmdlKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICByZXR1cm4gc2VtdmVyQ29tcGFyZShzZW12ZXJNaW5WZXJzaW9uKGFSYW5nZSksIHNlbXZlck1pblZlcnNpb24oYlJhbmdlKSlcbn0pXG5cbmNvbnN0IGdldFBhY2thZ2VOYW1lID0gKGlkZW50KSA9PiB7XG4gIGNvbnN0IGluZGV4ID0gaWRlbnQuaW5kZXhPZignQCcsIGlkZW50LnN0YXJ0c1dpdGgoJ0AnKSA/IDEgOiAwKVxuICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB1bmxlc3MgdXNlciBtYW51YWxseSBlZGl0IHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICByZXR1cm4gaW5kZXggPT09IC0xID8gaWRlbnQgOiBpZGVudC5zbGljZSgwLCBpbmRleClcbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5SWRlbnQgPSAoYSwgYikgPT4ge1xuICBjb25zdCBwYWNrYWdlTmFtZUEgPSBnZXRQYWNrYWdlTmFtZShhKVxuICBjb25zdCBwYWNrYWdlTmFtZUIgPSBnZXRQYWNrYWdlTmFtZShiKVxuXG4gIGlmIChwYWNrYWdlTmFtZUEgPCBwYWNrYWdlTmFtZUIpIHJldHVybiAtMVxuICBpZiAocGFja2FnZU5hbWVBID4gcGFja2FnZU5hbWVCKSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBDYWNoZSBieSBgcHJvY2Vzcy5jd2QoKWAgaW5zdGVhZCBvZiBhIHZhcmlhYmxlIHRvIGFsbG93IHVzZXIgY2FsbCBgcHJvY2Vzcy5jaGRpcigpYFxuY29uc3QgY2FjaGUgPSBuZXcgTWFwKClcbmNvbnN0IGhhc1lhcm5PclBucG1GaWxlcyA9ICgpID0+IHtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKVxuICBpZiAoIWNhY2hlLmhhcyhjd2QpKSB7XG4gICAgY2FjaGUuc2V0KFxuICAgICAgY3dkLFxuICAgICAgZnMuZXhpc3RzU3luYygneWFybi5sb2NrJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm4vJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm5yYy55bWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLWxvY2sueWFtbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0td29ya3NwYWNlLnlhbWwnKSxcbiAgICApXG4gIH1cbiAgcmV0dXJuIGNhY2hlLmdldChjd2QpXG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgcGFja2FnZSBtYW5hZ2VyIGZyb20gcGFja2FnZS5qc29uIGFuZCBsb2NrIGZpbGVzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZUpzb24gLSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRoZSBkZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXIuIERlZmF1bHQgdG8gbnBtIGlmIG5vdCBkZXRlY3RlZC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9jb3JlcGFja1xuICBpZiAodHlwZW9mIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCducG1AJylcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5kZXZFbmdpbmVzPy5wYWNrYWdlTWFuYWdlcj8ubmFtZSkge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5kZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyLm5hbWUgPT09ICducG0nXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24ucG5wbSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gT3B0aW1pc2F0aW9uOiBDaGVjayBpZiBucG0gaXMgZXhwbGljaXQgYmVmb3JlIHJlYWRpbmcgRlMuXG4gIGlmIChwYWNrYWdlSnNvbi5lbmdpbmVzPy5ucG0pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGhhc1lhcm5PclBucG1GaWxlcygpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFNvcnQgZGVwZW5kZW5jaWVzIGFscGhhYmV0aWNhbGx5LCBkZXRlY3RpbmcgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZSB0aGVcbiAqIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24uIG5wbSB1c2VzIGxvY2FsZS1hd2FyZSBjb21wYXJpc29uLCB5YXJuIGFuZCBwbnBtIHVzZVxuICogc2ltcGxlIHN0cmluZyBjb21wYXJpc29uXG4gKi9cbmNvbnN0IHNvcnREZXBlbmRlbmNpZXMgPSBvbk9iamVjdCgoZGVwZW5kZW5jaWVzLCBwYWNrYWdlSnNvbikgPT4ge1xuICAvLyBBdm9pZCBmaWxlIGFjY2Vzc1xuICBpZiAoT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llc1xuICB9XG5cbiAgLy8gc29ydCBkZXBzIGxpa2UgdGhlIG5wbSBDTEkgZG9lcyAodmlhIHRoZSBwYWNrYWdlIEBucG1jbGkvcGFja2FnZS1qc29uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbnBtL3BhY2thZ2UtanNvbi9ibG9iL2I2NDY1ZjQ0YzcyN2Q2NTEzZGI2ODk4YzdjYmU0MWRkMzU1Y2ViZTgvbGliL3VwZGF0ZS1kZXBlbmRlbmNpZXMuanMjTDgtTDIxXG4gIGlmIChzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikpIHtcbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzLCAoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIsICdlbicpKVxuICB9XG5cbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcylcbn0pXG5cbi8qKlxuICogXCJ3b3Jrc3BhY2VzXCIgY2FuIGJlIGFuIGFycmF5IChucG0gb3IgeWFybiBjbGFzc2ljKSBvciBhbiBvYmplY3QgKHBucG0vYnVuKS5cbiAqIEluIHRoZSBjYXNlIG9mIGFuIGFycmF5LCB3ZSBkbyBub3Qgd2FudCB0byBhbHBoYWJldGljYWxseSBzb3J0IGl0IGluIGNhc2VcbiAqIHNjcmlwdHMgbmVlZCB0byBydW4gaW4gYSBzcGVjaWZpYyBvcmRlci5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y3L3VzaW5nLW5wbS93b3Jrc3BhY2VzP3Y9dHJ1ZSNydW5uaW5nLWNvbW1hbmRzLWluLXRoZS1jb250ZXh0LW9mLXdvcmtzcGFjZXNcbiAqL1xuY29uc3Qgc29ydFdvcmtzcGFjZXMgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KFsncGFja2FnZXMnLCAnY2F0YWxvZyddKSxcbiAgb3ZlclByb3BlcnR5KCdwYWNrYWdlcycsIHVuaXFBbmRTb3J0QXJyYXkpLFxuICBvdmVyUHJvcGVydHkoJ2NhdGFsb2cnLCBzb3J0RGVwZW5kZW5jaWVzKSxcbl0pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvYWNjMGU0NzU3MmE5MzkwMjkyYjRlMzEzYjRhNGJmMzYwZDIzNjM1OC9jb25mL2NvbmZpZy1zY2hlbWEuanNcbmNvbnN0IGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAvLyBgZmlsZXNgIGFuZCBgZXhjbHVkZWRGaWxlc2AgYXJlIG9ubHkgb24gYG92ZXJyaWRlc1tdYFxuICAvLyBmb3IgZWFzaWVyIHNvcnQgYG92ZXJyaWRlc1tdYCxcbiAgLy8gYWRkIHRoZW0gdG8gaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCBzb3J0IGBvdmVycmlkZXNbXWAgdHdpY2VcbiAgJ2ZpbGVzJyxcbiAgJ2V4Y2x1ZGVkRmlsZXMnLFxuICAvLyBiYXNlQ29uZmlnXG4gICdlbnYnLFxuICAncGFyc2VyJyxcbiAgJ3BhcnNlck9wdGlvbnMnLFxuICAnc2V0dGluZ3MnLFxuICAncGx1Z2lucycsXG4gICdleHRlbmRzJyxcbiAgJ3J1bGVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdnbG9iYWxzJyxcbiAgJ3Byb2Nlc3NvcicsXG4gICdub0lubGluZUNvbmZpZycsXG4gICdyZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcycsXG5dXG5jb25zdCBzb3J0RXNsaW50Q29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eSgnZW52Jywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eSgnZ2xvYmFscycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PiBvdmVycmlkZXMubWFwKHNvcnRFc2xpbnRDb25maWcpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdwYXJzZXJPcHRpb25zJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAncnVsZXMnLFxuICAgIHNvcnRPYmplY3RCeShcbiAgICAgIChydWxlMSwgcnVsZTIpID0+XG4gICAgICAgIHJ1bGUxLnNwbGl0KCcvJykubGVuZ3RoIC0gcnVsZTIuc3BsaXQoJy8nKS5sZW5ndGggfHxcbiAgICAgICAgcnVsZTEubG9jYWxlQ29tcGFyZShydWxlMiksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdzZXR0aW5ncycsIHNvcnRPYmplY3QpLFxuXSlcbmNvbnN0IHNvcnRWU0NvZGVCYWRnZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ2Rlc2NyaXB0aW9uJywgJ3VybCcsICdocmVmJ10pXG5cbmNvbnN0IHNvcnRQcmV0dGllckNvbmZpZyA9IHBpcGUoW1xuICAvLyBzb3J0IGtleXMgYWxwaGFiZXRpY2FsbHksIGJ1dCBwdXQgYG92ZXJyaWRlc2AgYXQgYm90dG9tXG4gIG9uT2JqZWN0KChjb25maWcpID0+XG4gICAgc29ydE9iamVjdEtleXMoY29uZmlnLCBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhjb25maWcpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnb3ZlcnJpZGVzJylcbiAgICAgICAgLnNvcnQoKSxcbiAgICAgICdvdmVycmlkZXMnLFxuICAgIF0pLFxuICApLFxuICAvLyBpZiBgY29uZmlnLm92ZXJyaWRlc2AgZXhpc3RzXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICAvLyBhbmQgYGNvbmZpZy5vdmVycmlkZXNgIGlzIGFuIGFycmF5XG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PlxuICAgICAgb3ZlcnJpZGVzLm1hcChcbiAgICAgICAgcGlwZShbXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIHNvcnRPYmplY3QsXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdLm9wdGlvbnNgIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgb3ZlclByb3BlcnR5KCdvcHRpb25zJywgc29ydE9iamVjdCksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuXSlcblxuY29uc3Qgc29ydFZvbHRhID0gc29ydE9iamVjdEJ5KFsnbm9kZScsICducG0nLCAneWFybiddKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3dpcmVpdFxuY29uc3Qgd2lyZWl0U2NyaXB0UHJvcGVydGllcyA9IFsnY29tbWFuZCcsICdkZXBlbmRlbmNpZXMnLCAnZmlsZXMnLCAnb3V0cHV0J11cbmNvbnN0IHNvcnRXaXJlaXRTY3JpcHQgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHdpcmVpdFNjcmlwdFByb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2RlcGVuZGVuY2llcycsXG4gICAgb25BcnJheSgoZGVwcykgPT4gZGVwcy5tYXAoc29ydE9iamVjdEJ5KFsnc2NyaXB0JywgJ2Nhc2NhZGUnXSkpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdlbnYnLFxuICAgIG9uT2JqZWN0KChlbnYpID0+XG4gICAgICBzb3J0T2JqZWN0S2V5cyhcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGVudikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHNvcnRPYmplY3RCeShbJ2V4dGVybmFsJywgJ2RlZmF1bHQnXSkodmFsdWUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3NlcnZpY2UnLFxuICAgIHBpcGUoW3NvcnRPYmplY3RCeShbJ3JlYWR5V2hlbiddKSwgb3ZlclByb3BlcnR5KCdyZWFkeVdoZW4nLCBzb3J0T2JqZWN0KV0pLFxuICApLFxuXSlcbmNvbnN0IHNvcnRXaXJlaXQgPSBvbk9iamVjdCgod2lyZWl0KSA9PlxuICBzb3J0T2JqZWN0S2V5cyhcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh3aXJlaXQpLm1hcCgoW25hbWUsIGNvbmZpZ10pID0+IFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc29ydFdpcmVpdFNjcmlwdChjb25maWcpLFxuICAgICAgXSksXG4gICAgKSxcbiAgKSxcbilcbmNvbnN0IHNvcnREZXZFbmdpbmVzID0gb3ZlclByb3BlcnR5KFxuICAncGFja2FnZU1hbmFnZXInLFxuICBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ3ZlcnNpb24nLCAnb25GYWlsJ10pLFxuKVxuXG5jb25zdCBwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gICdwZWVyRGVwZW5kZW5jeVJ1bGVzJyxcbiAgJ25ldmVyQnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llc0ZpbGUnLFxuICAnYWxsb3dlZERlcHJlY2F0ZWRWZXJzaW9ucycsXG4gICdhbGxvd05vbkFwcGxpZWRQYXRjaGVzJyxcbiAgJ3VwZGF0ZUNvbmZpZycsXG4gICdhdWRpdENvbmZpZycsXG4gICdyZXF1aXJlZFNjcmlwdHMnLFxuICAnc3VwcG9ydGVkQXJjaGl0ZWN0dXJlcycsXG4gICdvdmVycmlkZXMnLFxuICAncGF0Y2hlZERlcGVuZGVuY2llcycsXG4gICdwYWNrYWdlRXh0ZW5zaW9ucycsXG5dXG5cbmNvbnN0IHNvcnRQbnBtQ29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMsIHRydWUpLFxuICBvdmVyUHJvcGVydHkoJ292ZXJyaWRlcycsIHNvcnRPYmplY3RCeVNlbXZlciksXG5dKVxuXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9taXNjL3NjcmlwdHNcbmNvbnN0IGRlZmF1bHROcG1TY3JpcHRzID0gbmV3IFNldChbXG4gICdpbnN0YWxsJyxcbiAgJ3BhY2snLFxuICAncHJlcGFyZScsXG4gICdwdWJsaXNoJyxcbiAgJ3Jlc3RhcnQnLFxuICAnc2hyaW5rd3JhcCcsXG4gICdzdGFydCcsXG4gICdzdG9wJyxcbiAgJ3Rlc3QnLFxuICAndW5pbnN0YWxsJyxcbiAgJ3ZlcnNpb24nLFxuXSlcblxuY29uc3QgaGFzRGV2RGVwZW5kZW5jeSA9IChkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbikgPT4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24sICdkZXZEZXBlbmRlbmNpZXMnKSAmJlxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5KVxuICApXG59XG5cbmNvbnN0IHJ1blNSZWdFeHAgPVxuICAvKD88PV58W1xccyY7PD58KF0pKD86cnVuLXN8bnBtLXJ1bi1hbGwyPyAuKig/Oi0tc2VxdWVudGlhbHwtLXNlcmlhbHwtcykpKD89JHxbXFxzJjs8PnwpXSkvXG5cbmNvbnN0IGlzU2VxdWVudGlhbFNjcmlwdCA9IChjb21tYW5kKSA9PlxuICBjb21tYW5kLmluY2x1ZGVzKCcqJykgJiYgcnVuU1JlZ0V4cC50ZXN0KGNvbW1hbmQpXG5cbmNvbnN0IGhhc1NlcXVlbnRpYWxTY3JpcHQgPSAocGFja2FnZUpzb24pID0+IHtcbiAgaWYgKFxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbCcsIHBhY2thZ2VKc29uKSAmJlxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbDInLCBwYWNrYWdlSnNvbilcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3Qgc2NyaXB0cyA9IFsnc2NyaXB0cycsICdiZXR0ZXJTY3JpcHRzJ10uZmxhdE1hcCgoZmllbGQpID0+XG4gICAgcGFja2FnZUpzb25bZmllbGRdID8gT2JqZWN0LnZhbHVlcyhwYWNrYWdlSnNvbltmaWVsZF0pIDogW10sXG4gIClcbiAgcmV0dXJuIHNjcmlwdHMuc29tZSgoc2NyaXB0KSA9PiBpc1NlcXVlbnRpYWxTY3JpcHQoc2NyaXB0KSlcbn1cblxuZnVuY3Rpb24gc29ydFNjcmlwdE5hbWVzKGtleXMsIHByZWZpeCA9ICcnKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0gcHJlZml4ID8ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKSA6IGtleVxuICAgIGNvbnN0IGlkeCA9IHJlc3QuaW5kZXhPZignOicpXG4gICAgaWYgKGlkeCA+IDApIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBrZXkuc2xpY2UoMCwgKHByZWZpeCA/IHByZWZpeC5sZW5ndGggKyAxIDogMCkgKyBpZHgpXG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhiYXNlKSkgZ3JvdXBNYXAuc2V0KGJhc2UsIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGJhc2UpLnB1c2goa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhrZXkpKSBncm91cE1hcC5zZXQoa2V5LCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChrZXkpLnB1c2goa2V5KVxuICAgIH1cbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShncm91cE1hcC5rZXlzKCkpXG4gICAgLnNvcnQoKVxuICAgIC5mbGF0TWFwKChncm91cEtleSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBncm91cE1hcC5nZXQoZ3JvdXBLZXkpXG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkcmVuLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgY2hpbGRyZW4uc29tZSgoaykgPT4gayAhPT0gZ3JvdXBLZXkgJiYgay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkaXJlY3QgPSBjaGlsZHJlblxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IGsgPT09IGdyb3VwS2V5IHx8ICFrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgY29uc3QgbmVzdGVkID0gY2hpbGRyZW4uZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICByZXR1cm4gWy4uLmRpcmVjdCwgLi4uc29ydFNjcmlwdE5hbWVzKG5lc3RlZCwgZ3JvdXBLZXkpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNvcnQoKVxuICAgIH0pXG59XG5cbmNvbnN0IHNvcnRTY3JpcHRzID0gb25PYmplY3QoKHNjcmlwdHMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIGxldCBuYW1lcyA9IE9iamVjdC5rZXlzKHNjcmlwdHMpXG4gIGNvbnN0IHByZWZpeGFibGUgPSBuZXcgU2V0KClcblxuICBuYW1lcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IG9taXR0ZWQgPSBuYW1lLnJlcGxhY2UoL14oPzpwcmV8cG9zdCkvLCAnJylcbiAgICBpZiAoZGVmYXVsdE5wbVNjcmlwdHMuaGFzKG9taXR0ZWQpIHx8IG5hbWVzLmluY2x1ZGVzKG9taXR0ZWQpKSB7XG4gICAgICBwcmVmaXhhYmxlLmFkZChvbWl0dGVkKVxuICAgICAgcmV0dXJuIG9taXR0ZWRcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVcbiAgfSlcblxuICBpZiAoIWhhc1NlcXVlbnRpYWxTY3JpcHQocGFja2FnZUpzb24pKSB7XG4gICAgbmFtZXMgPSBzb3J0U2NyaXB0TmFtZXMobmFtZXMpXG4gIH1cbiAgbmFtZXMgPSBuYW1lcy5mbGF0TWFwKChrZXkpID0+XG4gICAgcHJlZml4YWJsZS5oYXMoa2V5KSA/IFtgcHJlJHtrZXl9YCwga2V5LCBgcG9zdCR7a2V5fWBdIDogW2tleV0sXG4gIClcbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKHNjcmlwdHMsIG5hbWVzKVxufSlcblxuLypcbi0gTW92ZSBgZGVmYXVsdGAgY29uZGl0aW9uIHRvIGJvdHRvbVxuKi9cbmNvbnN0IHNvcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0Q29uZGl0aW9ucyA9IFtdLCByZXN0Q29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBjb25kaXRpb25zLFxuICAgIChjb25kaXRpb24pID0+IHtcbiAgICAgIGlmIChjb25kaXRpb24gPT09ICdkZWZhdWx0Jykge1xuICAgICAgICByZXR1cm4gJ2RlZmF1bHRDb25kaXRpb25zJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ3Jlc3RDb25kaXRpb25zJ1xuICAgIH0sXG4gIClcblxuICByZXR1cm4gWy4uLnJlc3RDb25kaXRpb25zLCAuLi5kZWZhdWx0Q29uZGl0aW9uc11cbn1cblxuY29uc3Qgc29ydEV4cG9ydHMgPSBvbk9iamVjdCgoZXhwb3J0cykgPT4ge1xuICBjb25zdCB7IHBhdGhzID0gW10sIGNvbmRpdGlvbnMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgT2JqZWN0LmtleXMoZXhwb3J0cyksXG4gICAgKGtleSkgPT4gKGtleS5zdGFydHNXaXRoKCcuJykgPyAncGF0aHMnIDogJ2NvbmRpdGlvbnMnKSxcbiAgKVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgWy4uLnBhdGhzLCAuLi5zb3J0Q29uZGl0aW9ucyhjb25kaXRpb25zKV0ubWFwKChrZXkpID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHNvcnRFeHBvcnRzKGV4cG9ydHNba2V5XSksXG4gICAgXSksXG4gIClcbn0pXG5cbi8vIGZpZWxkcyBtYXJrZWQgYHZzY29kZWAgYXJlIGZvciBgVmlzdWFsIFN0dWRpbyBDb2RlIGV4dGVuc2lvbiBtYW5pZmVzdGAgb25seVxuLy8gaHR0cHM6Ly9jb2RlLnZpc3VhbHN0dWRpby5jb20vYXBpL3JlZmVyZW5jZXMvZXh0ZW5zaW9uLW1hbmlmZXN0XG4vLyBTdXBwb3J0ZWQgZmllbGRzOlxuLy8gcHVibGlzaGVyLCBkaXNwbGF5TmFtZSwgY2F0ZWdvcmllcywgZ2FsbGVyeUJhbm5lciwgcHJldmlldywgY29udHJpYnV0ZXMsXG4vLyBhY3RpdmF0aW9uRXZlbnRzLCBiYWRnZXMsIG1hcmtkb3duLCBxbmEsIGV4dGVuc2lvblBhY2ssXG4vLyBleHRlbnNpb25EZXBlbmRlbmNpZXMsIGljb25cblxuLy8gZmllbGQua2V5e3N0cmluZ306IGZpZWxkIG5hbWVcbi8vIGZpZWxkLm92ZXJ7ZnVuY3Rpb259OiBzb3J0IGZpZWxkIHN1YktleVxuY29uc3QgZmllbGRzID0gW1xuICB7IGtleTogJyRzY2hlbWEnIH0sXG4gIHsga2V5OiAnbmFtZScgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZGlzcGxheU5hbWUnIH0sXG4gIHsga2V5OiAndmVyc2lvbicgfSxcbiAgLyogeWFybiAqLyB7IGtleTogJ3N0YWJsZVZlcnNpb24nIH0sXG4gIHsga2V5OiAncHJpdmF0ZScgfSxcbiAgeyBrZXk6ICdkZXNjcmlwdGlvbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY2F0ZWdvcmllcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdrZXl3b3JkcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdob21lcGFnZScgfSxcbiAgeyBrZXk6ICdidWdzJywgb3Zlcjogc29ydE9iamVjdEJ5KFsndXJsJywgJ2VtYWlsJ10pIH0sXG4gIHsga2V5OiAncmVwb3NpdG9yeScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdmdW5kaW5nJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2xpY2Vuc2UnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3FuYScgfSxcbiAgeyBrZXk6ICdhdXRob3InLCBvdmVyOiBzb3J0UGVvcGxlT2JqZWN0IH0sXG4gIHtcbiAgICBrZXk6ICdtYWludGFpbmVycycsXG4gICAgb3Zlcjogb25BcnJheSgobWFpbnRhaW5lcnMpID0+IG1haW50YWluZXJzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb250cmlidXRvcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGNvbnRyaWJ1dG9ycykgPT4gY29udHJpYnV0b3JzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3B1Ymxpc2hlcicgfSxcbiAgeyBrZXk6ICdzaWRlRWZmZWN0cycgfSxcbiAgeyBrZXk6ICd0eXBlJyB9LFxuICB7IGtleTogJ2ltcG9ydHMnIH0sXG4gIHsga2V5OiAnZXhwb3J0cycsIG92ZXI6IHNvcnRFeHBvcnRzIH0sXG4gIHsga2V5OiAnbWFpbicgfSxcbiAgeyBrZXk6ICdzdmVsdGUnIH0sXG4gIHsga2V5OiAndW1kOm1haW4nIH0sXG4gIHsga2V5OiAnanNkZWxpdnInIH0sXG4gIHsga2V5OiAndW5wa2cnIH0sXG4gIHsga2V5OiAnbW9kdWxlJyB9LFxuICB7IGtleTogJ3NvdXJjZScgfSxcbiAgeyBrZXk6ICdqc25leHQ6bWFpbicgfSxcbiAgeyBrZXk6ICdicm93c2VyJyB9LFxuICB7IGtleTogJ3JlYWN0LW5hdGl2ZScgfSxcbiAgeyBrZXk6ICd0eXBlcycgfSxcbiAgeyBrZXk6ICd0eXBlc1ZlcnNpb25zJyB9LFxuICB7IGtleTogJ3R5cGluZ3MnIH0sXG4gIHsga2V5OiAnc3R5bGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlc3R5bGUnIH0sXG4gIHsga2V5OiAnYXNzZXRzJyB9LFxuICB7IGtleTogJ2JpbicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtYW4nIH0sXG4gIHsga2V5OiAnZGlyZWN0b3JpZXMnLCBvdmVyOiBzb3J0RGlyZWN0b3JpZXMgfSxcbiAgeyBrZXk6ICdmaWxlcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICd3b3Jrc3BhY2VzJywgb3Zlcjogc29ydFdvcmtzcGFjZXMgfSxcbiAgLy8gbm9kZS1wcmUtZ3lwIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL25vZGUtcHJlLWd5cCMxLWFkZC1uZXctZW50cmllcy10by15b3VyLXBhY2thZ2Vqc29uXG4gIHtcbiAgICBrZXk6ICdiaW5hcnknLFxuICAgIG92ZXI6IHNvcnRPYmplY3RCeShbXG4gICAgICAnbW9kdWxlX25hbWUnLFxuICAgICAgJ21vZHVsZV9wYXRoJyxcbiAgICAgICdyZW1vdGVfcGF0aCcsXG4gICAgICAncGFja2FnZV9uYW1lJyxcbiAgICAgICdob3N0JyxcbiAgICBdKSxcbiAgfSxcbiAgeyBrZXk6ICdzY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICdiZXR0ZXJTY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICd3aXJlaXQnLCBvdmVyOiBzb3J0V2lyZWl0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2wxMG4nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NvbnRyaWJ1dGVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdhY3RpdmF0aW9uRXZlbnRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2h1c2t5Jywgb3Zlcjogb3ZlclByb3BlcnR5KCdob29rcycsIHNvcnRHaXRIb29rcykgfSxcbiAgeyBrZXk6ICdzaW1wbGUtZ2l0LWhvb2tzJywgb3Zlcjogc29ydEdpdEhvb2tzIH0sXG4gIHsga2V5OiAncHJlLWNvbW1pdCcgfSxcbiAgeyBrZXk6ICdjb21taXRsaW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2xpbnQtc3RhZ2VkJyB9LFxuICB7IGtleTogJ25hbm8tc3RhZ2VkJyB9LFxuICB7IGtleTogJ2NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdub2RlbW9uQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJpZnknLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYmFiZWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcnNsaXN0JyB9LFxuICB7IGtleTogJ3hvJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3ByZXR0aWVyJywgb3Zlcjogc29ydFByZXR0aWVyQ29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50Q29uZmlnJywgb3Zlcjogc29ydEVzbGludENvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludElnbm9yZScgfSxcbiAgeyBrZXk6ICducG1wa2dqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1QYWNrYWdlSnNvbkxpbnRDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtcGFja2FnZWpzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbGVhc2UnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVtYXJrQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3N0eWxlbGludCcgfSxcbiAgeyBrZXk6ICdhdmEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LWp1bml0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3Qtc3RhcmUnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbW9jaGEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnljJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2M4Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3RhcCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvY2xpZicsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAncmVzb2x1dGlvbnMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb3ZlcnJpZGVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXZEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeShzb3J0T2JqZWN0QnlJZGVudCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICAvLyBUT0RPOiBvbmx5IHNvcnQgZGVwdGggPSAyXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2J1bmRsZWREZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnYnVuZGxlRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25QYWNrJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25EZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnZmxhdCcgfSxcbiAgeyBrZXk6ICdwYWNrYWdlTWFuYWdlcicgfSxcbiAgeyBrZXk6ICdlbmdpbmVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2VuZ2luZVN0cmljdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdkZXZFbmdpbmVzJywgb3Zlcjogc29ydERldkVuZ2luZXMgfSxcbiAgeyBrZXk6ICd2b2x0YScsIG92ZXI6IHNvcnRWb2x0YSB9LFxuICB7IGtleTogJ2xhbmd1YWdlTmFtZScgfSxcbiAgeyBrZXk6ICdvcycgfSxcbiAgeyBrZXk6ICdjcHUnIH0sXG4gIHsga2V5OiAncHJlZmVyR2xvYmFsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3B1Ymxpc2hDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2ljb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7XG4gICAga2V5OiAnYmFkZ2VzJyxcbiAgICBvdmVyOiBvbkFycmF5KChiYWRnZSkgPT4gYmFkZ2UubWFwKHNvcnRWU0NvZGVCYWRnZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdnYWxsZXJ5QmFubmVyJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwcmV2aWV3JyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdtYXJrZG93bicgfSxcbiAgeyBrZXk6ICdwbnBtJywgb3Zlcjogc29ydFBucG1Db25maWcgfSxcbl1cblxuY29uc3QgZGVmYXVsdFNvcnRPcmRlciA9IGZpZWxkcy5tYXAoKHsga2V5IH0pID0+IGtleSlcbmNvbnN0IG92ZXJGaWVsZHMgPSBwaXBlKFxuICBmaWVsZHNcbiAgICAubWFwKCh7IGtleSwgb3ZlciB9KSA9PiAob3ZlciA/IG92ZXJQcm9wZXJ0eShrZXksIG92ZXIpIDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pLFxuKVxuXG5mdW5jdGlvbiBlZGl0U3RyaW5nSlNPTihqc29uLCBvdmVyKSB7XG4gIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7IGluZGVudCwgdHlwZSB9ID0gZGV0ZWN0SW5kZW50KGpzb24pXG4gICAgY29uc3QgZW5kQ2hhcmFjdGVycyA9IGpzb24uc2xpY2UoLTEpID09PSAnXFxuJyA/ICdcXG4nIDogJydcbiAgICBjb25zdCBuZXdsaW5lID0gZGV0ZWN0TmV3bGluZShqc29uKVxuICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pXG5cbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIEpTT04uc3RyaW5naWZ5KG92ZXIoanNvbiksIG51bGwsIHR5cGUgPT09ICd0YWInID8gJ1xcdCcgOiBpbmRlbnQpICtcbiAgICAgIGVuZENoYXJhY3RlcnNcbiAgICBpZiAobmV3bGluZSA9PT0gJ1xcclxcbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXG4vZywgbmV3bGluZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG92ZXIoanNvbilcbn1cblxuZnVuY3Rpb24gc29ydFBhY2thZ2VKc29uKGpzb25Jc2gsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gZWRpdFN0cmluZ0pTT04oXG4gICAganNvbklzaCxcbiAgICBvbk9iamVjdCgoanNvbikgPT4ge1xuICAgICAgbGV0IHNvcnRPcmRlciA9IG9wdGlvbnMuc29ydE9yZGVyIHx8IGRlZmF1bHRTb3J0T3JkZXJcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc29ydE9yZGVyKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbilcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5cyA9IFtdLCBwdWJsaWNLZXlzID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgICAgICAgIGtleXMsXG4gICAgICAgICAgKGtleSkgPT4gKGtleVswXSA9PT0gJ18nID8gJ3ByaXZhdGVLZXlzJyA6ICdwdWJsaWNLZXlzJyksXG4gICAgICAgIClcbiAgICAgICAgc29ydE9yZGVyID0gW1xuICAgICAgICAgIC4uLnNvcnRPcmRlcixcbiAgICAgICAgICAuLi5kZWZhdWx0U29ydE9yZGVyLFxuICAgICAgICAgIC4uLnB1YmxpY0tleXMuc29ydCgpLFxuICAgICAgICAgIC4uLnByaXZhdGVLZXlzLnNvcnQoKSxcbiAgICAgICAgXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3ZlckZpZWxkcyhzb3J0T2JqZWN0S2V5cyhqc29uLCBzb3J0T3JkZXIpLCBqc29uKVxuICAgIH0pLFxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvcnRQYWNrYWdlSnNvblxuZXhwb3J0IHsgc29ydFBhY2thZ2VKc29uLCBkZWZhdWx0U29ydE9yZGVyIGFzIHNvcnRPcmRlciB9XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgICAgICBzY3JpcHRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgZGlkVXBkYXRlU2NyaXB0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NjcmlwdE5hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gc2NyaXB0LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICAgIGlmIChzY3JpcHQgIT09IG5ld1NjcmlwdCkge1xuICAgICAgICAgICAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBuZXdTY3JpcHQ7XG4gICAgICAgICAgICAgICAgZGlkVXBkYXRlU2NyaXB0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2FnZUpzb24uc2NyaXB0cyA9IHNjcmlwdHM7XG4gICAgICAgICAgICBpZiAoIWRpZFVwZGF0ZVNjcmlwdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKHBhY2thZ2VKc29uKSwgdW5kZWZpbmVkLCAyKSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aDogc3RyaW5nLCBuZXdUZXN0RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhuZXdUZXN0RGlyUGF0aCkpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihvbGRUZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBkaXJlbnRzLm1hcChhc3luYyAoZGlyZW50KSA9PiB7XG4gICAgICBjb25zdCBvbGRQYXRoID0gcGF0aC5qb2luKG9sZFRlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoID0gcGF0aC5qb2luKG5ld1Rlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoU3RhdCA9IGZzLmV4aXN0c1N5bmMobmV3UGF0aCkgPyBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KG5ld1BhdGgpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIG5ld1BhdGhTdGF0Py5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ob2xkVGVzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJywgJ3diZnknXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGxpbnRlciBmaXhcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHBrZy1wcmVmbGlnaHQgUFIgZmlsZSBsaXN0aW5nXG4gICAgICAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveScgfCAnYXV0b2ZpeCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICFpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGVudHJ5Lm5hbWUpKSBjb250aW51ZTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZW50cnkubmFtZSksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAuLi5lbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykgJiYgIWlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUoZGlyZW50Lm5hbWUpXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAvLyBUaGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBhbHJlYWR5IGZpeGVzIGFuZCBwdXNoZXMgY29kZSBvbiBwcml2YXRlIHJlcG9zLFxuICAgICAgLy8gc28gYSBzZXBhcmF0ZSBhdXRvZml4IHdvcmtmbG93IG9ubHkgZHVwbGljYXRlcyB0aGUgc2FtZSBwcm9jZXNzLlxuICAgICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdhdXRvZml4LnltbCcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnYXV0b2ZpeC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZXBvc2l0b3J5Py5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eZ2VuLXByKD86LS4rKT9cXC55YT9tbCQvdS50ZXN0KGZpbGVOYW1lKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKTtcblxuICBpZiAoa2luZCA9PT0gJ2F1dG9maXgnKSB7XG4gICAgYXdhaXQgd3JpdGVZYW1sKGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZyksIGZpbGVQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cykge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJztcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIC8vIFRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IG5vIGxvbmdlciBuZWVkcyBBY3Rpb25zIHdyaXRlIGFjY2Vzcy5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uYWN0aW9ucztcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcblxuICBpZiAoa2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICdyZWxlYXNlJykge1xuICAgIGpvYi5zZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICBpZiAoam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU4pIHtcbiAgICBqb2Iuc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFID0gJyR7eyBzZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgfX0nO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTjtcbiAgfVxuICBpZiAoXG4gICAgKGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSkgfHxcbiAgICAoam9iLndpdGguc2VydmVyX3VybCAmJiBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKVxuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMID0gJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFTEVBU0UgfX0nO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyTGFiLycsICdXaWxsQm9vc3Rlci8nKTtcbiAgfSBlbHNlIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXIvJywgJ1dpbGxCb29zdGVyTGFiLycpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXJzXG4gIGlmIChqb2Iud2l0aC5kb3RfZW52X3BhdGggPT09ICcuZW52Jykge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5kb3RfZW52X3BhdGg7XG4gIH1cblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHMuRkxZX0FQSV9UT0tFTiAmJiB0eXBlb2Ygam9iLndpdGguZGVwbG95X2NvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGguZGVwbG95X2NvbW1hbmQgPSBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZC5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFdvcmtmbG93IHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY2JyB9LFxuICAgIHsgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NicsIHdpdGg6IHsgJ2NoZWNrLWxhdGVzdCc6IHRydWUsICdub2RlLXZlcnNpb24nOiAnbHRzLyonIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYyJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AYzViMmQ2N2FhMjI3NGU3YjVhMTgyMjRlODE3MTU1MDg3MWZjN2U0YScgfSk7XG5cbiAgY29uc3QgYXV0b2ZpeFdvcmtmbG93ID0gc3RydWN0dXJlZENsb25lKHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3cpO1xuICBjb25zdCBhdXRvZml4Sm9iID0gYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA/PyB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH07XG4gIGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPSB7IC4uLmF1dG9maXhKb2IsIHN0ZXBzIH07XG4gIHJldHVybiBhdXRvZml4V29ya2Zsb3c7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSByZW1vdmVUcmFpbGluZ1NwYWNlcyhcbiAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSwgbm9Db21wYXRNb2RlOiB0cnVlLCBzdHlsZXM6IHsgJyEhbnVsbCc6ICdlbXB0eScgfSB9KVxuICApO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVHJhaWxpbmdTcGFjZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8ganMteWFtbCBlbWl0cyB2YWx1ZWxlc3MgR2l0SHViIEFjdGlvbnMgZXZlbnRzIGFzIGBldmVudDogYCB3aGVuIHVzaW5nIHRoZSBlbXB0eSBudWxsIHN0eWxlLlxuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bIFxcdF0rJC9nbSwgJycpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0cycpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJ2NmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKD89XFxzfCQpL2csICdlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oPz1cXHMpL2csICdpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyljXFwuZlxcLi9nLCAnJDEvLyQyY2YuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pZWdcXC4vZywgJyQxLy8kMmUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylpZVxcLi9nLCAnJDEvLyQyaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuY29uc3Qgd2JEYXRhYmFzZUNvbW1hbmRSZWdleCA9IC9cXGJ3YlxccysoPzpkYnxwcmlzbWEpXFxiL2d1O1xuY29uc3QgbWF4VGV4dEZpbGVCeXRlcyA9IDEwMjQgKiAxMDI0O1xuY29uc3QgbWlncmF0aW9uVGFyZ2V0cyA9IFtcbiAgJyoqLyoue2NqcyxjdHMsanMsanNvbixqc3gsbWQsbWRjLG1qcyxtdHMsc2gsdHN4LHRzLHRvbWwsdHh0LHlhbWwseW1sfScsXG4gICcqKi8uZW52JyxcbiAgJyoqLy5lbnYuKicsXG4gICcqKi8uZ2l0aHViL3dvcmtmbG93cy8qJyxcbiAgJyoqLy5naXRpZ25vcmUnLFxuICAnKiovLmRvY2tlcmlnbm9yZScsXG4gICcqKi9Eb2NrZXJmaWxlJyxcbiAgJyoqL0RvY2tlcmZpbGUuKicsXG4gICcqKi9NYWtlZmlsZScsXG4gICcqKi9taXNlLnRvbWwnLFxuICAnKiovLm1pc2UudG9tbCcsXG4gICcqKi9sZWZ0aG9vay55bWwnLFxuICAnKiovcGFja2FnZS5qc29uJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhXYkRiQ29tbWFuZChyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocm9vdENvbmZpZy5yZXBvQXV0aG9yID09PSAnV2lsbEJvb3N0ZXInICYmIHJvb3RDb25maWcucmVwb05hbWUgPT09ICdzaGFyZWQnKSByZXR1cm47XG5cbiAgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2w8dm9pZD4oKTtcbiAgLy8gYHJ1bigpYCByZXNvbHZlcyBhZnRlciBhIHRhc2sgZW50ZXJzIHRoZSBwb29sLCB3aGlsZSBgcHJvbWlzZUFsbCgpYCB3YWl0c1xuICAvLyBmb3IgYWRtaXR0ZWQgdGFza3MgdG8gZmluaXNoLiBCb3RoIHdhaXRzIGFyZSBuZWVkZWQgdG8gY292ZXIgcXVldWVkIHdvcmsuXG4gIGNvbnN0IHJlcGxhY2VtZW50UHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBwYWNrYWdlQ29uZmlncykge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBzZWxlY3RXYkRhdGFiYXNlQ29tbWFuZChjb25maWcpO1xuICAgIGlmICghY29tbWFuZCkgY29udGludWU7XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZyhtaWdyYXRpb25UYXJnZXRzLCB7XG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBpZ25vcmU6IFsnKiovLmdpdC8qKicsIC4uLihjb25maWcuaXNSb290ID8gWydwYWNrYWdlcy8qKiddIDogW10pLCAuLi5nbG9iSWdub3JlXSxcbiAgICAgIG9ubHlGaWxlczogdHJ1ZSxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgcmVwbGFjZW1lbnRQcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiByZXBsYWNlV2JEYXRhYmFzZUNvbW1hbmQoZmlsZVBhdGgsIGNvbW1hbmQpKSk7XG4gICAgfVxuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKHJlcGxhY2VtZW50UHJvbWlzZXMpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICd3YiBkYicgfCAnd2IgcHJpc21hJyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuICd3YiBwcmlzbWEnO1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSByZXR1cm4gJ3diIGRiJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZVdiRGF0YWJhc2VDb21tYW5kKGZpbGVQYXRoOiBzdHJpbmcsIGNvbW1hbmQ6ICd3YiBkYicgfCAnd2IgcHJpc21hJyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZFRleHRGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gVGVtcG9yYXJ5IG1pZ3JhdGlvbjogbm9ybWFsaXplIGNvbW1hbmQgc3BlbGxpbmcgYnkgT1JNIHNvIFByaXNtYSBrZWVwcyB0aGVcbiAgLy8gbmF0aXZlIGNvbW1hbmQgbmFtZSB3aGlsZSBEcml6emxlIHVzZXMgdGhlIGdlbmVyaWMgZGF0YWJhc2UgY29tbWFuZC5cbiAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCh3YkRhdGFiYXNlQ29tbWFuZFJlZ2V4LCBjb21tYW5kKTtcbiAgaWYgKG5ld0NvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRleHRGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICBpZiAoc3RhdHMuc2l6ZSA+IG1heFRleHRGaWxlQnl0ZXMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYnVmZmVyID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICBpZiAoYnVmZmVyLmluY2x1ZGVzKDApKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcoJ3V0ZjgnKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQocm9vdENvbmZpZyk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb247XG4gIC8vIFdpbGxCb29zdGVyIFJhaWx3YXkgcHJvamVjdCBpZGVudGlmaWVycyBhcmUgbWFuYWdlZCBpbiBkZXBsb3kgd29ya2Zsb3cgc2V0dGluZ3MuXG4gIGNvbnN0IHJhaWx3YXlJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNSYWlsd2F5XG4gICAgPyAnXFxuLSBSYWlsd2F5IHByb2plY3QgaW5mb3JtYXRpb24gaXMgaW4gdGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYC4nXG4gICAgOiAnJztcbiAgY29uc3QgcGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbiA9IGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGFsbENvbmZpZ3MpXG4gICAgPyBgXFxuLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJyc7XG4gIGNvbnN0IGNvQXV0aG9ySW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuICAtIEVuZCB5b3VyIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBibGFuayBsaW5lIGZvbGxvd2VkIGJ5IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgLmBcbiAgICA6ICcnO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYCR7ZGVzY3JpcHRpb24gPyBgXFxuLSBEZXNjcmlwdGlvbjogJHtkZXNjcmlwdGlvbn1gIDogJyd9XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBJZiBvbiBcXGBtYWluXFxgLCBjcmVhdGUgYSBuZXcgYnJhbmNoOyBvdGhlcndpc2Ugd29yayBvbiB0aGUgY3VycmVudCBicmFuY2guXG4tIFJ1biBcXGBnaXRcXGAgY29tbWFuZHMgb25lIGF0IGEgdGltZSB0byBhdm9pZCBcXGBpbmRleC5sb2NrXFxgIGNvbmZsaWN0cy5cbi0gV3JpdGUgdGVzdHMgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCwgb3Igd2hlbiB5b3UganVkZ2UgdGhlIGNoYW5nZSB3b3J0aCB0ZXN0aW5nOyB3aXRob3V0IGEgcmVxdWVzdCwgY292ZXIgb25seSB0aGUgZXNzZW50aWFsIGJlaGF2aW9yLlxuLSBXaGVuIHdyaXRpbmcgdGVzdHMsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBDb250aW51ZSBtb2RpZnlpbmcgdGVzdHMgYW5kL29yIGNvZGUgdW50aWwgYWxsIHRlc3RzIHBhc3MuXG4gIC0gRW5zdXJlIHRlc3RzIGFyZSBpZGVtcG90ZW50IGFuZCBpbmRlcGVuZGVudCAoZS5nLiwgcmVzZXQgcGVyc2lzdGVudCBkYXRhKSBzbyB0aGV5IGNhbiBydW4gcmVwZWF0ZWRseSBvciBpbiBwYXJhbGxlbC5cbiAgLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAtIEF2b2lkIGZpeGVkIHdhaXRzIGluIEUyRSB0ZXN0czsgd2FpdCBmb3IgY29uZGl0aW9ucyBpbnN0ZWFkLlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMgKGluY2x1ZGluZyB0ZXN0IGZhaWx1cmVzKSwgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIHZpYSBkZWJ1ZyBsb2dzIG9yIHNjcmVlbnNob3RzKSBhbmQgZml4IGl0IGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gdmVyaWZ5XFxgICh0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nOyB0YWtlcyB1cCB0byAxMCBtaW51dGVzKSwgb3IgXFxgJHtwYWNrYWdlTWFuYWdlcn0gdmVyaWZ5LWZ1bGxcXGAgKGFsbCB0ZXN0czsgdGFrZXMgdXAgdG8gMSBob3VyKSBpZiB5b3UgY2hhbmdlZCBydW50aW1lIGJlaGF2aW9yIG9yIHRlc3RzLiBGaXggZXJyb3JzIGFuZCByZS1ydW4gdW50aWwgaXQgcGFzc2VzLlxuLSBPbmNlIHZlcmlmaWVkLCBjb21taXQgYW5kIHB1c2ggdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2gsIGFuZCBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAgaWYgbm9uZSBleGlzdHMgZm9yIHRoZSBicmFuY2guXG4gIC0gRm9sbG93IHRoZSBDb252ZW50aW9uYWwgQ29tbWl0cyBmb3JtYXQgKGUuZy4sIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgKS4ke2NvQXV0aG9ySW5zdHJ1Y3Rpb259XG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0czsgYXZvaWQgXFxgLS1hbWVuZFxcYC5cbi0gVXNlIGhlcmVkb2MgZm9yIG11bHRpLWxpbmUgY29tbWFuZCBpbnB1dCAoZS5nLiwgXFxgZ2l0IGNvbW1pdCAtRiAtXFxgLCBcXGBnaCBwciBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCkuXG4tIFB1dCB0ZW1wb3JhcnkgZmlsZXMgaW4gXFxgLnRtcFxcYDsgdXNlIFxcYC90bXBcXGAgb25seSBmb3IgZmlsZXMgdGhhdCBtdXN0IGxpdmUgb3V0c2lkZSB0aGUgcmVwby4ke3JhaWx3YXlJbnN0cnVjdGlvbn0ke3BsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb259XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZpbGUgbmFtZXMgZm9yIEphdmFTY3JpcHQvVHlwZVNjcmlwdCAoUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIG1vZHVsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGggaGlnaCBjb2hlc2lvbiBhbmQgbG93IGNvdXBsaW5nOyBzcGxpdCBsYXJnZSBtb2R1bGVzIHdoZW4gbmVlZGVkLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCAodG9wLWRvd24gb3JkZXIpOyBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgYWJvdmUgdGhlaXIgdXNhZ2UuXG4tIFdyaXRlIGNvbW1lbnRzIGFuZCBKU0RvYyBvbmx5IGZvciBoYXJkLXRvLXVuZGVyc3RhbmQgY29kZTogZXhwbGFpbiBcIndoeVwiIGluIGNvbW1lbnRzIGFuZCBcIndoYXRcIiBpbiBKU0RvYy5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gQnVpbGQgcHJvbXB0cyBhcyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIG9uIGEgcHJlLWNvbXB1dGFibGUgYXJyYXkgb2Ygc3RyaW5ncy5cbi0gQXNzdW1lIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWQ7IGlmIHZhbGlkYXRpb24gaXMgbmVlZGVkLCBcXGBhc3NlcnRcXGAgYXQgc3RhcnR1cCB0byBmYWlsIGZhc3QuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFdoZW4gYWRkaW5nIHN0cmluZyBsaXRlcmFscyBpbiBSZWFjdCBjb21wb25lbnRzLCByZWdpc3RlciB0aGVtIGluIHRoZSBcXGBpMThuXFxgIHJlc291cmNlIGZpbGVzIChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApIGFuZCByZWZlcmVuY2UgdGhlbSB2aWEgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eSAoZS5nLiwgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYCkuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIG92ZXIgXFxgdXNlU3RhdGVcXGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbi0gVXNlIFxcYGF1dG9Gb2N1c1xcYCB3aGVyZSBpdCByZWR1Y2VzIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgXG4tIFRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgc28gXFxgdXNlQ2FsbGJhY2tcXGAgYW5kIFxcYHVzZU1lbW9cXGAgYXJlIHVubmVjZXNzYXJ5IGZvciBwZXJmb3JtYW5jZS5cbi0gQXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS5cbmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgfTtcbiAgcnVuPzoge1xuICAgIGJ1bj86IGJvb2xlYW47XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSA0MzJfMDAwO1xuXG4vLyBQbGF0Zm9ybSBzZXRzIG11c3QgbWF0Y2ggZWFjaCBwYWNrYWdlJ3Mgb3B0aW9uYWxEZXBlbmRlbmNpZXMgb24gbnBtIGJlY2F1c2Vcbi8vIEJ1biBjaGVja3MgYWxsIHBsYXRmb3JtIGJpbmFyaWVzIGluIHRoZSBsb2NrZmlsZSwgbm90IGp1c3QgdGhlIGN1cnJlbnQgb25lLlxuLy8gS2VlcCB3aW4zMiBlbnRyaWVzIGV2ZW4gdGhvdWdoIHdlIGRyb3AgV2luZG93cyBzdXBwb3J0OiBvbWl0dGluZyBhbnlcbi8vIHBsYXRmb3JtIG1ha2VzIGBidW4gYWRkYCBmYWlsIHVudGlsIHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdyBlbGFwc2VzLlxuY29uc3QgdHlwZXNjcmlwdFBsYXRmb3JtcyA9IFtcbiAgJ2FpeC1wcGM2NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLWFybTY0JyxcbiAgJ2ZyZWVic2QteDY0JyxcbiAgJ2xpbnV4LWFybScsXG4gICdsaW51eC1hcm02NCcsXG4gICdsaW51eC1sb29uZzY0JyxcbiAgJ2xpbnV4LW1pcHM2NGVsJyxcbiAgJ2xpbnV4LXBwYzY0JyxcbiAgJ2xpbnV4LXJpc2N2NjQnLFxuICAnbGludXgtczM5MHgnLFxuICAnbGludXgteDY0JyxcbiAgJ25ldGJzZC1hcm02NCcsXG4gICduZXRic2QteDY0JyxcbiAgJ29wZW5ic2QtYXJtNjQnLFxuICAnb3BlbmJzZC14NjQnLFxuICAnc3Vub3MteDY0JyxcbiAgJ3dpbjMyLWFybTY0JyxcbiAgJ3dpbjMyLXg2NCcsXG5dO1xuY29uc3Qgb3hjQmluZGluZ1BsYXRmb3JtcyA9IFtcbiAgJ2FuZHJvaWQtYXJtLWVhYmknLFxuICAnYW5kcm9pZC1hcm02NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLXg2NCcsXG4gICdsaW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ2xpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ2xpbnV4LWFybTY0LWdudScsXG4gICdsaW51eC1hcm02NC1tdXNsJyxcbiAgJ2xpbnV4LXBwYzY0LWdudScsXG4gICdsaW51eC1yaXNjdjY0LWdudScsXG4gICdsaW51eC1yaXNjdjY0LW11c2wnLFxuICAnbGludXgtczM5MHgtZ251JyxcbiAgJ2xpbnV4LXg2NC1nbnUnLFxuICAnbGludXgteDY0LW11c2wnLFxuICAnb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnd2luMzItYXJtNjQtbXN2YycsXG4gICd3aW4zMi1pYTMyLW1zdmMnLFxuICAnd2luMzIteDY0LW1zdmMnLFxuXTtcbmNvbnN0IHRzZ29saW50UGxhdGZvcm1zID0gWydkYXJ3aW4tYXJtNjQnLCAnZGFyd2luLXg2NCcsICdsaW51eC1hcm02NCcsICdsaW51eC14NjQnLCAnd2luMzItYXJtNjQnLCAnd2luMzIteDY0J107XG5jb25zdCBuZXh0UnNwYWNrUGxhdGZvcm1zID0gW1xuICAnYW5kcm9pZC1hcm0tZWFiaScsXG4gICdhbmRyb2lkLWFybTY0JyxcbiAgJ2Rhcndpbi1hcm02NCcsXG4gICdkYXJ3aW4teDY0JyxcbiAgJ2xpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnbGludXgtYXJtNjQtZ251JyxcbiAgJ2xpbnV4LWFybTY0LW11c2wnLFxuICAnbGludXgteDY0LWdudScsXG4gICdsaW51eC14NjQtbXVzbCcsXG4gICd3aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ3dpbjMyLWlhMzItbXN2YycsXG4gICd3aW4zMi14NjQtbXN2YycsXG5dO1xuY29uc3QgbmV4dFN3Y1BsYXRmb3JtcyA9IFtcbiAgJ2FuZHJvaWQtYXJtLWVhYmknLFxuICAnYW5kcm9pZC1hcm02NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLXg2NCcsXG4gICdsaW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ2xpbnV4LWFybTY0LWdudScsXG4gICdsaW51eC1hcm02NC1tdXNsJyxcbiAgJ2xpbnV4LXg2NC1nbnUnLFxuICAnbGludXgteDY0LW11c2wnLFxuICAnd2FzbS1ub2RlanMnLFxuICAnd2FzbS13ZWInLFxuICAnd2luMzItYXJtNjQtbXN2YycsXG4gICd3aW4zMi1pYTMyLW1zdmMnLFxuICAnd2luMzIteDY0LW1zdmMnLFxuXTtcblxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgJ0BleGVyY29kZS9wcm9ibGVtLXV0aWxzJyxcbiAgJ0B3aWxsYm9vc3Rlci1wcml2YXRlL2FnZW50aWMtd29ya2Zsb3dzJyxcbiAgJ0B3aWxsYm9vc3Rlci9hZ2VudC1za2lsbHMnLFxuICAnQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3MnLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1sb2FkZXInLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYicsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZScsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvd2InLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnYXQtZGVjb3JhdG9ycycsXG4gICdidWlsZC10cycsXG4gICdnZW4taTE4bi10cycsXG4gICdvbmUtd2F5LWdpdC1zeW5jJyxcbiAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAvLyB3YmZ5IHBpbnMgdGhlc2UgdG9vbGluZyBwYWNrYWdlcyBhbmQgbWF5IGFwcGx5IHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgYVxuICAvLyByZWxlYXNlLCBiZWZvcmUgdGhlIGdsb2JhbCBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdyBoYXMgZWxhcHNlZC5cbiAgJ3R5cGVzY3JpcHQnLFxuICAuLi50eXBlc2NyaXB0UGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAdHlwZXNjcmlwdC90eXBlc2NyaXB0LSR7cGxhdGZvcm19YCksXG4gIC8vIEJ1biBpdHNlbGYgcmVsZWFzZXMgaXRzIGZpcnN0LXBhcnR5IHR5cGUgcGFja2FnZXMgaW4gbG9ja3N0ZXAgd2l0aCB0aGVcbiAgLy8gcnVudGltZSwgc28gZ2VuZXJhdGVkIEJ1biByZXBvcyBtdXN0IGJlIGFibGUgdG8gaW5zdGFsbCB0aGVtIGltbWVkaWF0ZWx5LlxuICAnQHR5cGVzL2J1bicsXG4gICdidW4tdHlwZXMnLFxuICAnb3hmbXQnLFxuICAuLi5veGNCaW5kaW5nUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAb3hmbXQvYmluZGluZy0ke3BsYXRmb3JtfWApLFxuICAnb3hsaW50JyxcbiAgLi4ub3hjQmluZGluZ1BsYXRmb3Jtcy5tYXAoKHBsYXRmb3JtKSA9PiBgQG94bGludC9iaW5kaW5nLSR7cGxhdGZvcm19YCksXG4gICdveGxpbnQtdHNnb2xpbnQnLFxuICAuLi50c2dvbGludFBsYXRmb3Jtcy5tYXAoKHBsYXRmb3JtKSA9PiBgQG94bGludC10c2dvbGludC8ke3BsYXRmb3JtfWApLFxuICAnQG5leHQvZW52JyxcbiAgJ0BuZXh0L2ZvbnQnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmcnLFxuICAuLi5uZXh0UnNwYWNrUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAbmV4dC9yc3BhY2stYmluZGluZy0ke3BsYXRmb3JtfWApLFxuICAuLi5uZXh0U3djUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAbmV4dC9zd2MtJHtwbGF0Zm9ybX1gKSxcbiAgJ0BuZXh0L3RoaXJkLXBhcnRpZXMnLFxuICAnbmV4dCcsXG4gICdyZWFjdCcsXG4gICdyZWFjdC1kb20nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7Z2VuZXJhdGVSdW5TZWN0aW9uKGJ1bmZpZ1RvbWwpfVxuW2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9ICR7YnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzfSAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiR7YnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5tYXAoKHBhY2thZ2VOYW1lKSA9PiBgICAgIFwiJHtwYWNrYWdlTmFtZX1cIixgKS5qb2luKCdcXG4nKX1cbl1cbmA7XG59O1xuXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1RvbWwoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29udGVudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2UoY29udGVudCkgYXMgQnVuZmlnVG9tbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbDogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYnVuZmlnVG9tbD8ucnVuPy5idW4gPT09ICdib29sZWFuJyA/IGBbcnVuXVxcbmJ1biA9ICR7YnVuZmlnVG9tbC5ydW4uYnVufVxcbmAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZSBkZXBsb3lzIEdpdC1iYXNlZCBwcml2YXRlIHBhY2thZ2VzIGZyb20gbm9kZV9tb2R1bGVzLCBidXQgdGhlIERvY2tlciBjb250ZXh0IHNob3VsZCBzdGF5IG5hcnJvdy5cbmNvbnN0IGluY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJucyA9IFsnQHdpbGxib29zdGVyJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uRFNfU3RvcmVcbioqLy5jYWNoZVxuKiovLmNsYXVkZVxuKiovLmN1cnNvclxuKiovLmVkaXRvcmNvbmZpZ1xuKiovLmVzbGludGNhY2hlXG4qKi8uZ2VtaW5pXG4qKi8uZ2l0XG4qKi8uZ2l0YXR0cmlidXRlc1xuKiovLmdpdGh1YlxuKiovLmdpdGlnbm9yZVxuKiovLmlkZWFcbioqLy5sZWZ0aG9va1xuKiovLm15cHlfY2FjaGVcbioqLy5uZXh0L2NhY2hlXG4qKi8ubnBtXG4qKi8ucGFyY2VsLWNhY2hlXG4qKi8ucG5wbS1zdG9yZVxuKiovLnB5dGVzdF9jYWNoZVxuKiovLnJhaWx3YXlpZ25vcmVcbioqLy5yZWxlYXNlcmMuanNvblxuKiovLnJ1ZmZfY2FjaGVcbioqLy50bXBcbioqLy50dXJib1xuKiovLnRveFxuKiovLnZzY29kZVxuKiovLnlhcm4vY2FjaGVcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG4qKi9fX3B5Y2FjaGVfX1xuKiovKi5sb2dcbioqLyoucHljXG4qKi8qLnRzYnVpbGRpbmZvXG4qKi9jb3ZlcmFnZVxuKiovbm9kZV9tb2R1bGVzLyoqXG4ke2luY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJuc1xuICAubWFwKFxuICAgIChwYXR0ZXJuKSA9PiBgISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59XG4hKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn0vKipgXG4gIClcbiAgLmpvaW4oJ1xcbicpfVxuKiovbm9kZV9tb2R1bGVzLy5jYWNoZVxuKiovcGxheXdyaWdodC1yZXBvcnRcbioqL3N0b3J5Ym9vay1zdGF0aWNcbioqL3RhcmdldFxuKiovdGVzdC1yZXN1bHRzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgb3hsaW50OiBbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXS50b1NvcnRlZCgpLFxuICBveGZtdDogW1xuICAgICdhc3RybycsXG4gICAgJ2NqcycsXG4gICAgJ2NzcycsXG4gICAgJ2N0cycsXG4gICAgJ2dxbCcsXG4gICAgJ2dyYXBocWwnLFxuICAgICdoYnMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnanMnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2pzeCcsXG4gICAgJ2xlc3MnLFxuICAgICdtZCcsXG4gICAgJ21keCcsXG4gICAgJ21qcycsXG4gICAgJ210cycsXG4gICAgJ3Njc3MnLFxuICAgICdzdmVsdGUnLFxuICAgICd0b21sJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICBwcmV0dGllck9ubHk6IFsnamF2YSddLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHJldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb24gPSBjb25maWcuaXNQdWJsaWNSZXBvXG4gICAgICA/ICdSZXZpZXcgaW4gRW5nbGlzaCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuJ1xuICAgICAgOiAn5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGAke3Jldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb259XFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG5fX2dlbmVyYXRlZF9fL1xuIS5rZWVwXG4uYWlkZXIqXG4uYW50aWdyYXZpdHljbGkvXG4uY2xhdWRlLyoubG9jYWwuKlxuLmNsYXVkZS9zY2hlZHVsZWRfdGFza3MubG9ja1xuLmRldmNvbnRhaW5lci9cbi5lbnYucHJvZHVjdGlvblxuLmlkZWEvQXVnbWVudFdlYnZpZXdTdGF0ZVN0b3JlLnhtbFxuLmlkZWEvY29waWxvdC4qXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5wbGF5d3JpZ2h0LWNsaS9cbi5wbGF5d3JpZ2h0LW1jcC9cbi5zZXJlbmEvXG4udG1wL1xuLnRva2Vuc2F2ZS9cbi53Yi9cbkB3aWxsYm9vc3Rlci9cbiovbW91bnQvKi5oYXNoXG5DTEFVREUubG9jYWwubWRcbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHwgY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydXN0Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZykge1xuICAgICAgLy8gIUNhcmdvLmxvY2sgb3ZlcnJpZGVzIGFueSBwcmUtZXhpc3RpbmcgdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgZnJvbSBhXG4gICAgICAvLyBwYXJlbnQgLmdpdGlnbm9yZSwgc28gdGhlIGFwcGxpY2F0aW9uIGxvY2tmaWxlIHN0YXlzIGNvbW1pdHRhYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAhQ2FyZ28ubG9ja1xuc3JjLXRhdXJpL2dlbi9zY2hlbWFzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNDbG91ZGZsYXJlIHx8IHJvb3RDb25maWcuaXNDbG91ZGZsYXJlKSB7XG4gICAgICAvLyAuZGV2LnZhcnMqIGhvbGQgbG9jYWwgc2VjcmV0cyBmb3Igd3JhbmdsZXIgZGV2IGFuZCBtdXN0IG5ldmVyIGJlIGNvbW1pdHRlZCxcbiAgICAgIC8vIHVubGlrZSB0aGUgY29tbWl0dGVkIC5lbnYvLmVudi5zdGFnaW5nIGZpbGVzIG9mIHRoZSBXaWxsQm9vc3RlciBjb252ZW50aW9uLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZGV2LnZhcnMqXG4ud3JhbmdsZXIvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcudmluZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52aW5leHQvXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUncyB1bmFuY2hvcmVkIGRlYnVnLyB3b3VsZCBhbHNvIGhpZGUgZnJvbnRlbmQgc291cmNlXG4gICAgICAvLyBkaXJlY3RvcmllcyBzdWNoIGFzIHNyYy9kZWJ1Zy87IGNhcmdvIG91dHB1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGFyZ2V0Ly5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eZGVidWdcXC8kL2dtLCAnIyBkZWJ1Zy8nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8IGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcykge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUgaWdub3JlcyBDYXJnby5sb2NrLCBidXQgYSBzcmMtdGF1cmkgY29uZmlndXJhdGlvbiBtYXJrcyBhblxuICAgICAgLy8gYXBwbGljYXRpb24sIHdob3NlIENhcmdvLmxvY2sgbXVzdCBiZSBjb21taXR0ZWQgZm9yIHJlcHJvZHVjaWJsZSBidWlsZHMuIFRoZVxuICAgICAgLy8gcnVsZSBpcyBhbHNvIGRpc2FibGVkIHdoZW4gYSBzdWIgcGFja2FnZSBjb250YWlucyBhIFRhdXJpIGFwcGxpY2F0aW9uLCBiZWNhdXNlXG4gICAgICAvLyBhbiB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBpbiBhIHBhcmVudCAuZ2l0aWdub3JlIHdvdWxkIGhpZGUgdGhlIG5lc3RlZFxuICAgICAgLy8gYXBwbGljYXRpb24ncyBsb2NrZmlsZS4gVGF1cmkgcGx1Z2luIGxpYnJhcmllcyAoZGV0ZWN0ZWQgb25seSB2aWFcbiAgICAgIC8vIEB0YXVyaS1hcHBzLyogZGVwZW5kZW5jaWVzKSBrZWVwIHRoZSB0ZW1wbGF0ZSdzIHBvbGljeSBvZiBpZ25vcmluZyBDYXJnby5sb2NrLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15DYXJnb1xcLmxvY2skL2dtLCAnIyBDYXJnby5sb2NrJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gS2VlcCBwYWNrYWdlLW1hbmFnZXIgc2hpbXMgaW4gdGhlIEZpbGUgV2F0Y2hlciBwcm9ncmFtIGZpZWxkIHNvIG5vZGUgZG9lcyBub3Rcbi8vIHBhcnNlIHdyYXBwZXIgc2NyaXB0cyBwYXNzZWQgdGhyb3VnaCBhcmd1bWVudHMuXG5jb25zdCBveGZtdFByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9veGZtdCc7XG5jb25zdCBwcmV0dGllclByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnKSkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB0YXNrT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBhcmdzOiAnLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICEqKi9wYWNrYWdlLmpzb24nLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5veGZtdCxcbiAgICAgIG5hbWU6ICdPeGZtdCcsXG4gICAgICBwcm9ncmFtOiBveGZtdFByb2dyYW0sXG4gICAgfSxcbiAgICB7XG4gICAgICBhcmdzOiAnLS1jYWNoZSAtLXdyaXRlJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLnByZXR0aWVyT25seSxcbiAgICAgIG5hbWU6ICdQcmV0dGllcicsXG4gICAgICBwcm9ncmFtOiBwcmV0dGllclByb2dyYW0sXG4gICAgfSxcbiAgXVxuICAgIC5maWx0ZXIoKHRhc2spID0+IHRhc2suY29uZGl0aW9uKVxuICAgIC5mbGF0TWFwKCh0YXNrKSA9PiB0YXNrLmV4dGVuc2lvbnMubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKHRhc2sucHJvZ3JhbSwgdGFzay5hcmdzLCB0YXNrLm5hbWUsIGV4dCkpKTtcblxuICByZXR1cm4gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuICAgICR7dGFza09wdGlvbnMuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZycgfCAnaXNCdW4nPixcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCAhc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYCR7Y29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybid9IHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbGA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IFtcbiAgJ0B0c2NvbmZpZy9idW4nLFxuICAnQHRzY29uZmlnL25vZGUtbHRzJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLXRzJyxcbiAgJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9idW4vdHNjb25maWcuanNvbic7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzL3RzY29uZmlnLmpzb24nLCAnQHRzY29uZmlnL25vZGUtdHMvdHNjb25maWcuanNvbiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbnR5cGUgU2V0dGluZ3MgPSB7XG4gIGFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzPzogc3RyaW5nW107XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBlbmFibGVTY3JpcHRzPzogYm9vbGVhbjtcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgeWFybk5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbmV4cG9ydCBjb25zdCB5YXJuTnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IFtcbiAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlLyonLFxuICAnQHdpbGxib29zdGVyLyonLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnYXQtZGVjb3JhdG9ycycsXG4gICdidWlsZC10cycsXG4gICdnZW4taTE4bi10cycsXG4gICdvbmUtd2F5LWdpdC1zeW5jJyxcbiAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgJ25leHQnLFxuICAnQG5leHQvKicsXG4gICdAdHlwZXMvKicsXG4gIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIGB0eXBlc2NyaXB0YDsgYEB0eXBlc2NyaXB0LypgIGNvdmVycyBpdHMgcGxhdGZvcm0gYmluYXJpZXMuXG4gICd0eXBlc2NyaXB0JyxcbiAgJ0B0eXBlc2NyaXB0LyonLFxuICAnQG94Zm10LyonLFxuICAnQG94bGludC8qJyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvKicsXG4gICdveGZtdCcsXG4gICdveGxpbnQnLFxuICAnb3hsaW50LXRzZ29saW50JyxcbiAgJ3JlYWN0JyxcbiAgJ3JlYWN0LWRvbScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGlzTmV3ZXJWZXJzaW9uKGxhdGVzdFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKSkge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGxldCBzZXR0aW5ncyA9IHt9IGFzIFNldHRpbmdzO1xuICAgIHRyeSB7XG4gICAgICBzZXR0aW5ncyA9ICh5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3MgfCB1bmRlZmluZWQpID8/IHNldHRpbmdzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICAvLyBJbnN0YWxsLXRpbWUgc2NyaXB0cyBhcmUgYSBjb21tb24gc3VwcGx5LWNoYWluIGV4ZWN1dGlvbiBwYXRoLiBLZWVwIHRoaXNcbiAgICAvLyBleHBsaWNpdCBzbyBzdGFsZSBwcm9qZWN0IHNldHRpbmdzIGNhbm5vdCByZS1lbmFibGUgdGhlbSBnbG9iYWxseS5cbiAgICBzZXR0aW5ncy5lbmFibGVTY3JpcHRzID0gZmFsc2U7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBzZXR0aW5ncy5ucG1NaW5pbWFsQWdlR2F0ZSA9IHlhcm5OcG1NaW5pbWFsQWdlR2F0ZTtcbiAgICBzZXR0aW5ncy5hcHByb3ZlZEdpdFJlcG9zaXRvcmllcyA9IFtcbiAgICAgIC8vIFlhcm4gNC4xNCBibG9ja3MgZ2l0IGRlcGVuZGVuY2llcyB1bmxlc3MgdGhlIHJlcG9zaXRvcnkgVVJMIGlzIGV4cGxpY2l0bHkgYWxsb3dlZC5cbiAgICAgICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvKi5naXQnLFxuICAgICAgJ3NzaDovL2dpdEBnaXRodWIuY29tL1dpbGxCb29zdGVyLyouZ2l0JyxcbiAgICAgICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgICAgJ3NzaDovL2dpdEBnaXRodWIuY29tL1dpbGxCb29zdGVyTGFiLyouZ2l0JyxcbiAgICBdO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSB5YXJuTnBtUHJlYXBwcm92ZWRQYWNrYWdlcztcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicsICdwbHVnaW5zJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgLy8gVGhlIHRhcmdldCByZXBvIG1heSBub3QgaGF2ZSBwcmV0dGllciBpbnN0YWxsZWQgeWV0LCBhbmQgeWFybi1wbHVnaW4tYXV0by1pbnN0YWxsIGVkaXRzIHRoaXMgZmlsZSBhZnRlciBqcy15YW1sLlxuICAgIHNwYXduU3luYygneWFybicsIGdldFlhcm5yY1ByZXR0aWVyQXJncyhjb25maWcuZGlyUGF0aCwgeWFybnJjWW1sUGF0aCksIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRZYXJucmNQcmV0dGllckFyZ3MoZGlyUGF0aDogc3RyaW5nLCB5YXJucmNZbWxQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbJ2RseCcsICdwcmV0dGllcicsICctLW5vLWNvbmZpZycsICctLXdyaXRlJywgcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCB5YXJucmNZbWxQYXRoKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbiddLCBkaXJQYXRoKSB8fCAnMC4wLjAnO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyVmVyc2lvbihuZXdWZXJzaW9uOiBzdHJpbmcsIG9sZFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWxpZE5ld1ZlcnNpb24gPSBzZW12ZXIudmFsaWQobmV3VmVyc2lvbik7XG4gIGlmICghdmFsaWROZXdWZXJzaW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHNlbXZlci5ndCh2YWxpZE5ld1ZlcnNpb24sIHNlbXZlci52YWxpZChvbGRWZXJzaW9uKSA/PyAnMC4wLjAnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5pbXBvcnQgeyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgfSBmcm9tICcuL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyB5YXJuTnBtTWluaW1hbEFnZUdhdGUsIHlhcm5OcG1QcmVhcHByb3ZlZFBhY2thZ2VzIH0gZnJvbSAnLi95YXJucmMuanMnO1xuXG5jb25zdCBveGxpbnREZXBzID0gWydAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ294Zm10JywgJ294bGludCcsICdveGxpbnQtdHNnb2xpbnQnXTtcbmNvbnN0IHR5cGVzY3JpcHREZXBlbmRlbmN5ID0gJ3R5cGVzY3JpcHQnO1xuLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCByZXBsYWNpbmdcbi8vIHRoZSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSBwcmV2aWV3IHdiZnkgcmVsaWVkIG9uIGJlZm9yZSB0aGUgcmVsZWFzZS5cbmNvbnN0IGRlcHJlY2F0ZWRUeXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3QgbGVmdGhvb2tEZXBlbmRlbmN5ID0gJ2xlZnRob29rJztcbmNvbnN0IGRlZmF1bHRHZW5JMThuVHNTY3JpcHQgPSAnZ2VuLWkxOG4tdHMgLWkgaTE4biAtbyBzcmMvX19nZW5lcmF0ZWRfXy9pMThuLnRzIC1kIGphLUpQJztcbmNvbnN0IG1hbmFnZWREZXBlbmRlbmN5TmFtZXMgPSBuZXcgU2V0KFtcbiAgd2JEZXBlbmRlbmN5LFxuICBidWlsZFRzRGVwZW5kZW5jeSxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0RGVwZW5kZW5jeSxcbiAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgLi4ub3hsaW50RGVwcyxcbl0pO1xuY29uc3Qgd2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyA9IFtcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAuLi5veGxpbnREZXBzLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpLFxuXTtcbmNvbnN0IG9ic29sZXRlTGludERlcGVuZGVuY2llcyA9IFtcbiAgJ0BiaW9tZWpzL2Jpb21lJyxcbiAgJ0Blc2xpbnQtcmVhY3QvZXNsaW50LXBsdWdpbicsXG4gICdAZXNsaW50L2pzJyxcbiAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICdAdHlwZXMvZXNsaW50JyxcbiAgJ0B0eXBlcy9taWNyb21hdGNoJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLFxuICAnYmlvbWUnLFxuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgJ2VzbGludC1wbHVnaW4tcGVyZmVjdGlvbmlzdCcsXG4gICdlc2xpbnQtcGx1Z2luLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QnLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1jb21waWxlcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tc3Rvcnlib29rJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuICAnbWljcm9tYXRjaCcsXG4gICd0eXBlc2NyaXB0LWVzbGludCcsXG5dO1xuY29uc3QgbWljcm9tYXRjaFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWydtaWNyb21hdGNoJywgJ0B0eXBlcy9taWNyb21hdGNoJ10pO1xuY29uc3QgbWljcm9tYXRjaEltcG9ydFBhdHRlcm4gPVxuICAvXFxiZnJvbVxccytbJ1wiXW1pY3JvbWF0Y2hbJ1wiXXxcXGJyZXF1aXJlXFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKXxcXGJpbXBvcnRcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpL3U7XG5cbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgbnBtUGFja2FnZVRpbWVzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgdXBkYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKGNvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMsIHNraXBBZGRpbmdEZXBzKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGdlbmVyYXRlZFxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcywgcGFja2FnZU1hbmFnZXIpO1xuICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZmlsZVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoanNvbk9iai5zY3JpcHRzKTtcblxuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzdGFydC10ZXN0LXNlcnZlciddO1xuXG4gIGNvbnN0IHNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHM7XG4gIGlmIChjb25maWcuaXNCdW4gfHwgIWRvZXNDb250YWluSmF2YShjb25maWcpKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0cy5wcmV0dGlmeSA9IChzY3JpcHRzLnByZXR0aWZ5ID8/ICcnKSArIChhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKSk7XG4gIH1cbiAgbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHMpO1xuICBub3JtYWxpemVSYWlsd2F5Q2xpU2NyaXB0KGNvbmZpZywgc2NyaXB0cyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEZyZXNoIHJlcG9zIHN0aWxsIHJlcXVpcmUgc3RhbmRhbG9uZSBgeWFybiBpbnN0YWxsYDsgb25seSByZW1vdmUgbGVnYWN5IGluc3RhbGwgcHJlZml4ZXMgYmVmb3JlIGFub3RoZXIgY29tbWFuZC5cbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgveWFyblxccyooPzppbnN0YWxsXFxzKik/JiZcXHMqL2d1LCAnJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgaWYgKHNjcmlwdHNbJ2dlbi1jb2RlJ10pIHtcbiAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID0gJ3diIGdlbi1jb2RlJztcbiAgfSBlbHNlIGlmIChzY3JpcHRzLnBvc3RpbnN0YWxsPy5pbmNsdWRlcygnZ2VuLWkxOG4tdHMnKSkge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnBvc3RpbnN0YWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbChcbiAgICAgIC95YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCg/IVxccysoPzotQXwtUnwtLSg/OmFsbHxyZWN1cnNpdmV8c2luY2V8d29ya3RyZWV8ZnJvbXxpbmNsdWRlfGV4Y2x1ZGV8cHVibGljfHByaXZhdGUpKSkvZ3UsXG4gICAgICAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSYWlsd2F5Q2xpU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBpZiAoY29uZmlnLmlzQnVuIHx8ICFzY3JpcHRzLnJhaWx3YXk/LmluY2x1ZGVzKCdAcmFpbHdheS9jbGknKSkgcmV0dXJuO1xuXG4gIHNjcmlwdHMucmFpbHdheSA9ICdZQVJOX0VOQUJMRV9TQ1JJUFRTPXRydWUgeWFybiBkbHggQHJhaWx3YXkvY2xpJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9IGVsc2Uge1xuICAgIHJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzKGpzb25PYmopO1xuICB9XG5cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICBkZWxldGUgKGpzb25PYmogYXMgUGFja2FnZUpzb24gJiB7ICdsaW50LXN0YWdlZCc/OiB1bmtub3duIH0pWydsaW50LXN0YWdlZCddO1xuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmh1c2t5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHB1Ymxpc2g7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwdWJsaXNoT25seTtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXBhY2s7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjaztcbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGxlZnRob29rRGVwZW5kZW5jeSk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2UoanNvbk9iai5zY3JpcHRzLnJlbGVhc2UpKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFJ1bnRpbWUpIHtcbiAgICAgICAgLy8gUnVudGltZSBpbXBvcnRzIG5lZWQgdGhlIHN0YW5kYWxvbmUgcGFja2FnZSBhZnRlciBEb2NrZXIgcHJ1bmluZyByZW1vdmVzIGRldkRlcGVuZGVuY2llcy5cbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodCA/Pz1cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/XG4gICAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSA/P1xuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdwbGF5d3JpZ2h0Jyk7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpeGVycy9uZXh0Q29uZmlnLnRzIGVuYWJsZXMgYHJlYWN0Q29tcGlsZXI6IHRydWVgIGZvciBldmVyeSBOZXh0LmpzIHByb2plY3QsIGFuZCBOZXh0LmpzXG4gIC8vIHJlc29sdmVzIGBiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXJgIGF0IGJ1aWxkIHRpbWUgd2hlbiBSZWFjdCBDb21waWxlciBpcyBvbi4gQWRkIGl0IGhlcmUgc29cbiAgLy8gdGhlIG1hbmFnZWQgbmV4dC5jb25maWcgbmV2ZXIgYnJlYWtzIGBuZXh0IGJ1aWxkYCB3aXRoIGFuIHVucmVzb2x2ZWQtcGFja2FnZSBlcnJvci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXInKTtcbiAgfVxuXG4gIGlmICghaXNXYlBhY2thZ2UoanNvbk9iaikpIHtcbiAgICBpZiAoc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgaWYgKHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBjb25zdCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykgOiBbXTtcbiAgYXdhaXQgcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaiwgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4udHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSwgc28gaXQgaXNcbiAgICAvLyBub3cgdGhlIG1hbmFnZWQgY29tcGlsZXIgZm9yIGV2ZXJ5IFR5cGVTY3JpcHQgcmVwbyAodHlwZWNoZWNraW5nIHJ1bnMgYHRzY2ApLlxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHREZXBlbmRlbmN5KTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvbm9kZScpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1sndHMtamVzdCddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICAgKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2plc3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcGVuZGVuY2llczogZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBweXRob25EZXZEZXBlbmRlbmNpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBweXRob25EZXZEZXBlbmRlbmNpZXMgfTtcbn1cblxuZnVuY3Rpb24gZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9cXGIoPzpidW54fG5weHxwbnBtXFxzK2RseHx5YXJuXFxzK2RseClcXHMrc2VtYW50aWMtcmVsZWFzZSg/OkBcXFMrKT9cXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbZGVwZW5kZW5jeSwga2VlcEFzUnVudGltZV0gb2YgW1xuICAgIFt3YkRlcGVuZGVuY3ksIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICAgIFtidWlsZFRzRGVwZW5kZW5jeSwgc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgXSBhcyBjb25zdCkge1xuICAgIGlmIChrZWVwQXNSdW50aW1lKSB7XG4gICAgICBjb25zdCBkZXZWZXJzaW9uID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWRldlZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb24gPSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghcnVudGltZVZlcnNpb24gfHwgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGRldlZlcnNpb24sIHJ1bnRpbWVWZXJzaW9uKSkge1xuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGRldlZlcnNpb247XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfSBlbHNlIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkge1xuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPz89IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBvc3RpbnN0YWxsU2NyaXB0ID0ganNvbk9iai5zY3JpcHRzPy5wb3N0aW5zdGFsbDtcbiAgcmV0dXJuIHR5cGVvZiBwb3N0aW5zdGFsbFNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiXFxiL3UudGVzdChwb3N0aW5zdGFsbFNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmlzbWEgPSBqc29uT2JqLnByaXNtYSBhcyB7IHNlZWQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHByaXNtYT8uc2VlZCkgfHwgZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhqc29uT2JqLnNjcmlwdHM/LnNlZWQpO1xufVxuXG5mdW5jdGlvbiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHNlZWRDb21tYW5kOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gRG9ja2VyIGltYWdlcyBydW4gc2VlZCBzY3JpcHRzIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLFxuICAvLyBzbyBUeXBlU2NyaXB0IHNlZWQgcnVubmVycyBtdXN0IHJlbWFpbiBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAgcmV0dXJuIHR5cGVvZiBzZWVkQ29tbWFuZCA9PT0gJ3N0cmluZycgJiYgLyg/PCFbXFx3LV0pYnVpbGQtdHMoPyFbXFx3LV0pL3UudGVzdChzZWVkQ29tbWFuZCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIFlhcm4gdHJlYXRzIHRoZSBsZWdhY3kgbnBtL2NoYWxrIHJlc29sdXRpb24gYWxpYXMgYXMgYW4gaW52YWxpZCBwYWNrYWdlIHRva2VuLlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0ganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID8/ICd5YXJuIGxpbnQgLS1maXgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NyaXB0UnVubmVyID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGAke3NjcmlwdFJ1bm5lcn0gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzZXR1cC1wb2V0cnktYXNkZiddO1xuICAgICAganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWBdID0gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHB5dGhvblBhY2thZ2VNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcHl0aG9uUnVubmVyID0gYCR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9IHJ1bmA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYCR7cHl0aG9uUnVubmVyfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgJHtweXRob25SdW5uZXJ9IGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gYCR7c2NyaXB0UnVubmVyfSBsaW50YDtcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgaWYgKGdlbkNvZGVTY3JpcHQ/LmluY2x1ZGVzKCdObyBjb2RlIGdlbmVyYXRpb24gbmVlZGVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddO1xuICB9IGVsc2UgaWYgKHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZywgZ2VuQ29kZVNjcmlwdCkpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBgJHtjb25maWcuaXNCdW4gPyAnYnVuIC0tYnVuICcgOiAnJ313YiBnZW4tY29kZWA7XG4gIH1cbiAgbm9ybWFsaXplR2VuSTE4blRzU2NyaXB0KGNvbmZpZywganNvbk9iaik7XG4gIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KGpzb25PYmouc2NyaXB0cyk7XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZEdlbkNvZGVTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHxcbiAgICBjb25maWcuZGVwZW5kaW5nLmNoYWtyYSB8fFxuICAgIGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8XG4gICAgY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHxcbiAgICAoY29uZmlnLmRlcGVuZGluZy5kcml6emxlICYmICEhb2xkR2VuQ29kZVNjcmlwdD8uaW5jbHVkZXMoJ2RyaXp6bGUta2l0IGNoZWNrJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGZvcm1hdFNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcHJvamVjdHMgbWF5IG5vdCBoYXZlIGEgWWFybiBsb2NrZmlsZSwgc28gZ2VuZXJhdGVkIHBhY2thZ2Ugc2NyaXB0c1xuICAvLyBtdXN0IGludm9rZSBsb2NhbCBwYWNrYWdlIHNjcmlwdHMgdGhyb3VnaCB0aGUgcmVwb3NpdG9yeSdzIHBhY2thZ2UgbWFuYWdlci5cbiAgY29uc3Qgc2NyaXB0UnVubmVyID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gZm9ybWF0U2NyaXB0ID8gYCR7Zm9ybWF0U2NyaXB0fSAmJiAke3NjcmlwdFJ1bm5lcn0gZm9ybWF0LWNvZGVgIDogYCR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWA7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUdlbkkxOG5Uc1NjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRNYW5hZ2VHZW5JMThuVHMoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGlmIChqc29uT2JqLnNjcmlwdHNbJ2dlbi1pMThuLXRzJ10gPT09IGRlZmF1bHRHZW5JMThuVHNTY3JpcHQpIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydnZW4taTE4bi10cyddO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbmZpZ01qc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcubWpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdNanNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmoudHlwZSA9ICdtb2R1bGUnO1xuXG4gIGNvbnN0IGNvbmZpZ0R0c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC50cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRHRzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLmZpbGVzID0gWy4uLm5ldyBTZXQoWy4uLihqc29uT2JqLmZpbGVzID8/IFtdKSwgJ2NvbmZpZy5kLm10cyddKV07XG4gIC8vIE5vZGVOZXh0IHJlc29sdmVzIGEgcmVsYXRpdmUgYC4vY29uZmlnLm1qc2AgaW1wb3J0IHRvIGBjb25maWcuZC5tdHNgLCBub3RcbiAgLy8gdGhlIHBhY2thZ2UtbGV2ZWwgYHR5cGVzYCBmaWVsZC4gS2VlcCB0aGUgcHVibGlzaGVkIGNvbmZpZyBpbXBvcnRhYmxlIGZyb21cbiAgLy8gcGFja2FnZS1sb2NhbCBUeXBlU2NyaXB0IGxpbnRlciBzZXR0aW5ncy5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQubXRzJyksIGNvbmZpZ0RtdHNDb250ZW50KSk7XG59XG5cbmNvbnN0IGNvbmZpZ0RtdHNDb250ZW50ID0gYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5gO1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICBjb25zdCBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nXG4pOiB2b2lkIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBkZXBlbmRlbmNpZXMsIGZhbHNlKTtcblxuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgcmV0dXJuICdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZSAmJiBwb2V0cnkgZW52IHVzZSAkKG1pc2UgY3VycmVudCBweXRob24pICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nLFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnLCBkZXBlbmRlbmN5KSkpLFxuICBdO1xuICBzcGF3blN5bmMoXG4gICAgcGFja2FnZU1hbmFnZXIsXG4gICAgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAuLi4oY29uZmlnLmlzQnVuID8gWyctLWV4YWN0J10gOiBbXSksIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSxcbiAgICBjb25maWcuZGlyUGF0aFxuICApO1xufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGNvbmZpZyxcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoIXNraXBBZGRpbmdEZXBzKSBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICBpZiAobGF0ZXN0VmVyc2lvbiA9PT0gJyonICYmIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSBjb250aW51ZTtcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGxhdGVzdFZlcnNpb247XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY2llc1RvSW5zdGFsbDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICBpZiAoIXJlbGF0aXZlRmlsZVBhdGgpIHJldHVybjtcblxuICAvLyBSZXVzZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBvd24gZm9ybWF0dGVyIGFmdGVyIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uIHNvXG4gIC8vIHBhY2thZ2UuanNvbiBtYXRjaGVzIHdoYXRldmVyIGl0cyBjdXJyZW50IHNvcnQtcGFja2FnZS1qc29uIHZlcnNpb24gZXhwZWN0cy5cbiAgLy8gVGhpcyBhdm9pZHMgZm9sbG93LXVwIGF1dG9maXggY29tbWl0cyBjYXVzZWQgb25seSBieSBmb3JtYXR0ZXIgdmVyc2lvbiBkcmlmdFxuICAvLyBiZXR3ZWVuIHdiZnkgYW5kIHRoZSBwcm9qZWN0IGJlaW5nIHVwZGF0ZWQuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ2J1bicpIHtcbiAgICBzcGF3blN5bmMoJ2J1bngnLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICByZW1vdmVTZWxmRGVwZW5kZW5jeShjb25maWcsIGpzb25PYmopO1xuICByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWcsIGpzb25PYmopO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsLWZvci1haSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy50c2xpYjtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIC8vIFR5cGVTY3JpcHQgNyByZXBsYWNlZCB0aGUgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgcHJldmlldyB3aXRoIHRoZVxuICAvLyBuYXRpdmUgYHR5cGVzY3JpcHRgIHBhY2thZ2UsIHNvIGRyb3AgdGhlIGRlcHJlY2F0ZWQgcHJldmlldyBmcm9tIGV4aXN0aW5nIHJlcG9zLlxuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwcmVjYXRlZFR5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwcmVjYXRlZFR5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICAvLyBOb24tVHlwZVNjcmlwdCByZXBvcyBzaG91bGQgbm90IGtlZXAgYSBzdHJheSBgdHlwZXNjcmlwdGAgcGFja2FnZS5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUtd2l0aC10ZXN0cyddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbGVybmEuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICByZW1vdmVXaWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIHJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyhqc29uT2JqLCBjb25maWcpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTZWxmRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGpzb25PYmoubmFtZSB8fCBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcblxuICAvLyBBIHBhY2thZ2UgY2FuIGltcG9ydCBpdHNlbGYgdGhyb3VnaCBOb2RlJ3MgcGFja2FnZSBzZWxmLXJlZmVyZW5jZSB3aXRob3V0XG4gIC8vIGRlY2xhcmluZyBpdHNlbGY7IGtlZXBpbmcgdGhhdCBlZGdlIGJyZWFrcyBtb25vcmVwbyByZWxlYXNlIHRvcG9sb2dpY2FsIHNvcnRpbmcuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbikpIGNvbnRpbnVlO1xuICAgICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgdGhlc2UgcGFja2FnZXMgaW5kZXBlbmRlbnRseSwgc28gZ2VuZXJhdGVkXG4gICAgICAvLyBwYWNrYWdlIG1ldGFkYXRhIG11c3QgZGVzY3JpYmUgbnBtIHJlbGVhc2UgZWRnZXMgaW5zdGVhZCBvZiBsb2NhbFxuICAgICAgLy8gd29ya3NwYWNlIGVkZ2VzIHRoYXQgcmVsZWFzZSB0b29saW5nIHRyZWF0cyBhcyBtb25vcmVwbyBncmFwaCBsaW5rcy5cbiAgICAgIC8vIFRoZSBmaW5hbCBgeWFybiBpbnN0YWxsIC0tbm8taW1tdXRhYmxlYCBzeW5jcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgdGhpc1xuICAgICAgLy8gbWlncmF0aW9uLCBldmVuIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgbm90IHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgbGlzdC5cbiAgICAgIHNlY3Rpb25bZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVXaWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm47XG5cbiAgY29uc3Qgc2VjdGlvbnMgPSBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB3aWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKSB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBvd25zIHRoZXNlIGNvbmZpZyBwYWNrYWdlcy4gUGFja2FnZS1sb2NhbCBmb3JtYXR0ZXJcbiAgICAvLyBhbmQgbGludGVyIGNvbmZpZyBmaWxlcyBhcmUgcmVwbyB0b29saW5nLCBub3QgcHVibGlzaGVkIHBhY2thZ2UgZGF0YSwgc29cbiAgICAvLyB0aGUgcGFja2FnZSBtZXRhZGF0YSBvbmx5IG5lZWRzIHRoZSBmb3JtYXR0ZXIvbGludGVyIGV4ZWN1dGFibGVzLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHVzZWREZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlZERlcGVuZGVuY3lTZXQgPSBuZXcgU2V0KHVzZWREZXBlbmRlbmNpZXMpO1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGF3YWl0IGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHVzZWREZXBlbmRlbmN5U2V0LmhhcyhkZXBlbmRlbmN5KSB8fCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBiYXNlLWNvbmZpZyBwYWNrYWdlcy4gUmVtb3ZlIHN0YWxlIHZhcmlhbnRzIHdoZW4gcmVwb1xuICAgIC8vIGNhcGFiaWxpdGllcyBjaGFuZ2UsIHN1Y2ggYXMgTmV4dC5qcyB0YWtpbmcgb3duZXJzaGlwIG9mIHRzY29uZmlnLmpzb24uXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90c2NvbmZpZyouanNvbicsIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgY29uc3QgYWJzb2x1dGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIC8vIFR5cGVTY3JpcHQgNydzIG5hdGl2ZSBjb21waWxlciBkcm9wcGVkIHRoZSBpbi1wcm9jZXNzIGBwYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uYFxuICAgIC8vIGhlbHBlciwgc28gcGFyc2UgdGhlIHRzY29uZmlnIGludG8gYW4gQVNUIGFuZCByZWFkIGl0cyB0b3AtbGV2ZWwgYGV4dGVuZHNgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHNvdXJjZSA9IHBhcnNlU291cmNlRmlsZShhYnNvbHV0ZUZpbGVQYXRoKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgY29uc29sZS53YXJuKGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQuYCk7XG4gICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZSkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gZGVwZW5kZW5jeSB8fCB2YWx1ZS5zdGFydHNXaXRoKGAke2RlcGVuZGVuY3l9L2ApKSB7XG4gICAgICAgICAgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzO1xufVxuXG4vKiogUmVhZHMgdGhlIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZW50cmllcyAoYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncykgZnJvbSBhIHBhcnNlZCB0c2NvbmZpZy4gKi9cbmZ1bmN0aW9uIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlKSkge1xuICAgIGlmIChhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpICYmIGFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkgJiYgcHJvcGVydHkubmFtZS50ZXh0ID09PSAnZXh0ZW5kcycpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKHByb3BlcnR5LmluaXRpYWxpemVyLCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiByZWFkb25seSBhc3QuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlW10ge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzb3VyY2Uuc3RhdGVtZW50cykge1xuICAgIGlmIChhc3QuaXNFeHByZXNzaW9uU3RhdGVtZW50KHN0YXRlbWVudCkgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24pKSB7XG4gICAgICByZXR1cm4gc3RhdGVtZW50LmV4cHJlc3Npb24ucHJvcGVydGllcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhub2RlOiBhc3QuRXhwcmVzc2lvbiwgdmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBpZiAoYXN0LmlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgIHZhbHVlcy5wdXNoKG5vZGUudGV4dCk7XG4gIH0gZWxzZSBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihub2RlKSkge1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBub2RlLmVsZW1lbnRzKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhlbGVtZW50LCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+W10ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBqc29uT2JqW2tleV0pXG4gICAgLmZpbHRlcigoc2VjdGlvbik6IHNlY3Rpb24gaXMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiAhIXNlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybid9OiR7ZGVwZW5kZW5jeX1gO1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoY2FjaGVLZXkpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShjb25maWcsIGRlcGVuZGVuY3kpO1xuICBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLnNldChjYWNoZUtleSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyB3YmZ5LW1hbmFnZWQgdG9vbGluZyAocHJlYXBwcm92ZWQgcGFja2FnZXMpIGFkb3B0cyB0aGUgbGF0ZXN0IHJlbGVhc2UgaW1tZWRpYXRlbHksXG4gIC8vIGJ5cGFzc2luZyB0aGUgbWluaW11bS1yZWxlYXNlLWFnZSBnYXRlIGFwcGxpZWQgdG8gdW5yZXZpZXdlZCBkZXBlbmRlbmNpZXMuXG4gIGlmICghc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShjb25maWcsIGRlcGVuZGVuY3kpKSB7XG4gICAgcmV0dXJuIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3ksIGdldFBhY2thZ2VBZ2VHYXRlTXMoY29uZmlnKSk7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nLCBwYWNrYWdlQWdlR2F0ZU1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCB0aW1lcyA9IGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5KTtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgaWYgKGxhdGVzdFZlcnNpb24gIT09ICcqJyAmJiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUodGltZXNbbGF0ZXN0VmVyc2lvbl0sIHBhY2thZ2VBZ2VHYXRlTXMpKSB7XG4gICAgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCB2ZXJzaW9ucyA9IE9iamVjdC5lbnRyaWVzKHRpbWVzKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gc2VtdmVyLnZhbGlkKHZlcnNpb24pKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gKHNlbXZlci5wcmVyZWxlYXNlKHZlcnNpb24pPy5sZW5ndGggPz8gMCkgPT09IDApXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkpKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gbm93IC0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkgPj0gcGFja2FnZUFnZUdhdGVNcylcbiAgICAudG9Tb3J0ZWQoKFt2ZXJzaW9uQV0sIFt2ZXJzaW9uQl0pID0+IHNlbXZlci5yY29tcGFyZSh2ZXJzaW9uQSwgdmVyc2lvbkIpKTtcblxuICByZXR1cm4gdmVyc2lvbnNbMF0/LlswXSA/PyAnKic7XG59XG5cbmZ1bmN0aW9uIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZShwdWJsaXNoZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkLCBwYWNrYWdlQWdlR2F0ZU1zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaXNoZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwdWJsaXNoZWRUaW1lID0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHVibGlzaGVkVGltZSkgJiYgRGF0ZS5ub3coKSAtIHB1Ymxpc2hlZFRpbWUgPj0gcGFja2FnZUFnZUdhdGVNcztcbn1cblxuZnVuY3Rpb24gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3k6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGRlcGVuZGVuY3kucmVwbGFjZSgvQFteQC9dKyQvdSwgJycpO1xuICBjb25zdCBjYWNoZWRUaW1lcyA9IG5wbVBhY2thZ2VUaW1lc0NhY2hlLmdldChwYWNrYWdlTmFtZSk7XG4gIGlmIChjYWNoZWRUaW1lcykgcmV0dXJuIGNhY2hlZFRpbWVzO1xuXG4gIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnbnBtJyxcbiAgICBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3RpbWUnLCAnLS1qc29uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLFxuICAgIHByb2Nlc3MuY3dkKClcbiAgKTtcbiAgaWYgKCFzdGRvdXQpIHJldHVybiB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIG5wbVBhY2thZ2VUaW1lc0NhY2hlLnNldChwYWNrYWdlTmFtZSwgcGFyc2VkKTtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwcmVhcHByb3ZlZFBhY2thZ2VzID0gY29uZmlnLmlzQnVuID8gYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA6IHlhcm5OcG1QcmVhcHByb3ZlZFBhY2thZ2VzO1xuICByZXR1cm4gIXByZWFwcHJvdmVkUGFja2FnZXMuc29tZSgocGF0dGVybikgPT4gZG9lc1BhY2thZ2VQYXR0ZXJuTWF0Y2gocGF0dGVybiwgZGVwZW5kZW5jeSkpO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlQWdlR2F0ZU1zKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IG51bWJlciB7XG4gIGlmIChjb25maWcuaXNCdW4pIHJldHVybiBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgKiAxMDAwO1xuXG4gIGNvbnN0IG1hdGNoZWQgPSAvXig/PGRheXM+XFxkKylkJC91LmV4ZWMoeWFybk5wbU1pbmltYWxBZ2VHYXRlKTtcbiAgcmV0dXJuIE51bWJlcihtYXRjaGVkPy5ncm91cHM/LmRheXMgPz8gMCkgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xufVxuXG5mdW5jdGlvbiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocGF0dGVybiA9PT0gZGVwZW5kZW5jeSkgcmV0dXJuIHRydWU7XG4gIGlmICghcGF0dGVybi5pbmNsdWRlcygnKicpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2VBbGwoL1suKz9eJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKS5yZXBsYWNlQWxsKCcqJywgJy4qJyk7XG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtlc2NhcGVkUGF0dGVybn0kYCwgJ3UnKS50ZXN0KGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgZGVwZW5kZW5jeSwgJ3ZlcnNpb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sIHByb2Nlc3MuY3dkKCkpIHx8ICcqJztcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoZGVwZW5kZW5jeSA9PT0gd2JEZXBlbmRlbmN5KSByZXR1cm4gYCR7ZGVwZW5kZW5jeX1AJHtnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3kpfWA7XG4gIHJldHVybiBkZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPixcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgY29uc3QgcHJlc2VydmVNaWNyb21hdGNoID0gc2hvdWxkUHJlc2VydmVNaWNyb21hdGNoKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAocHJlc2VydmVNaWNyb21hdGNoICYmIG1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICBpZiAoc2hvdWxkUHJlc2VydmVDb25maWdQYWNrYWdlTGludERlcGVuZGVuY3koanNvbk9iaiwgY29uZmlnLCBkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jeTogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBQdWJsaXNoZWQgY29uZmlnIHBhY2thZ2VzIG5lZWQgbG9jYWwgdHlwZS1vbmx5IGRlcHMgdG8gdmFsaWRhdGUgdGhlXG4gIC8vIHBhY2thZ2UtcHJvdmlkZWQgY29uZmlnIGRlY2xhcmF0aW9ucyB1bmRlciBZYXJuIFBuUC5cbiAgcmV0dXJuIGRlcGVuZGVuY3kgPT09ICdAdHlwZXMvZXNsaW50JyAmJiAhIWpzb25PYmoucGVlckRlcGVuZGVuY2llcy5lc2xpbnQ7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBzdWJwYWNrYWdlcyBwdWJsaXNoIGNvbmZpZyBmaWxlcyBhcyB0aGVpciBwcm9kdWN0LCBzb1xuICAvLyBtaWNyb21hdGNoIGlzIHBhY2thZ2UgZGF0YSB0aGVyZS4gT3RoZXIgcmVwb3Mga2VlcCBtaWNyb21hdGNoIG9ubHkgd2hlblxuICAvLyBwcm9kdWN0IGNvZGUgaW1wb3J0cyBpdDsgb3RoZXJ3aXNlIGl0IGlzIHRyZWF0ZWQgYXMgb2Jzb2xldGUgRVNMaW50LWVyYVxuICAvLyB0b29saW5nLlxuICByZXR1cm4gKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJiAhY29uZmlnLmlzUm9vdCkgfHwgZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaChjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGZnLmdsb2JTeW5jKCdzcmMvKiovKi57anMsanN4LG1qcyxjanMsdHMsdHN4LG10cyxjdHN9Jywge1xuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcbiAgcmV0dXJuIGZpbGVQYXRocy5zb21lKChmaWxlUGF0aCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbWljcm9tYXRjaEltcG9ydFBhdHRlcm4udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVQYXRoKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGN1cnJlbnRWZXJzaW9uID09PSAnKicpIHJldHVybiB0cnVlO1xuICBpZiAoaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkgcmV0dXJuIHRydWU7XG4gIC8vIHdiZnkgb3ducyB0aGVzZSB0b29sIGRlcGVuZGVuY2llcywgYnV0IGFwcGx5aW5nIHdiZnkgc2hvdWxkIG5vdCBkb3duZ3JhZGUgYVxuICAvLyByZXBvc2l0b3J5IHRoYXQgYWxyZWFkeSBwaW5zIGEgbmV3ZXIgcmV2aWV3ZWQgcmVsZWFzZS5cbiAgcmV0dXJuIG1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpICYmIGlzTmV3ZXJNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCBkZXBlbmRlbmN5LCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgZGVwZW5kZW5jeSk7XG4gIHJldHVybiBpc05ld2VyUGFja2FnZVZlcnNpb24obGF0ZXN0VmVyc2lvbiwgY3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyUGFja2FnZVZlcnNpb24oY2FuZGlkYXRlVmVyc2lvbjogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChjYW5kaWRhdGVWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIHJldHVybiAhdmFsaWRMYXRlc3RWZXJzaW9uIHx8ICF2YWxpZEN1cnJlbnRWZXJzaW9uIHx8IHNlbXZlci5ndCh2YWxpZExhdGVzdFZlcnNpb24sIHZhbGlkQ3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgICB2ZXJpZnk6ICdidW4gLS1idW4gd2IgdmVyaWZ5JyxcbiAgICAgIC8vIGB2ZXJpZnkgLS1mdWxsYCBydW5zIFBsYXl3cmlnaHQsIGFuZCBCdW4ncyBgLS1idW5gIGZsYWcgaW5zdGFsbHMgYSBub2RlLT5idW4gUEFUSCBzaGltIHRoYXRcbiAgICAgIC8vIHByb3BhZ2F0ZXMgaW50byBQbGF5d3JpZ2h0J3MgY2hpbGQgcHJvY2Vzc2VzLCBjcmFzaGluZyB0ZXN0IGxvYWRpbmcgd2l0aCBhbiBvcGFxdWVcbiAgICAgIC8vIFwiUmVzb2x2ZU1lc3NhZ2Uge31cIi4gT21pdCBgLS1idW5gIGZvciBQbGF5d3JpZ2h0IHByb2plY3RzIHNvIGB3YiB2ZXJpZnkgLS1mdWxsYCAoYW5kIHRodXNcbiAgICAgIC8vIFBsYXl3cmlnaHQpIHJ1bnMgdW5kZXIgTm9kZS5qczsgd2Igc3RpbGwgdXNlcyBCdW4gZm9yIGl0cyBvd24gaW5uZXIgY29tbWFuZHMuXG4gICAgICAndmVyaWZ5LWZ1bGwnOiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0ID8gJ2J1biB3YiB2ZXJpZnkgLS1mdWxsJyA6ICdidW4gLS1idW4gd2IgdmVyaWZ5IC0tZnVsbCcsXG4gICAgfTtcbiAgICBhcHBseURhdGFiYXNlU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIGBidW4gLS1idW4gJHtnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWcpfWApO1xuICAgIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJyAmJiBweXJpZ2h0JztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBoYXNKc09yVHMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpO1xuICAgIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgICBjb25zdCBvbGRUZXN0ID0gb2xkU2NyaXB0cy50ZXN0O1xuICAgIGxldCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHMsIGhhc0phdmEpLFxuICAgICAgLy8gUGFja2FnZS1sb2NhbCBjb25maWdzIG11c3QgZGVsZXRlIHRoZSByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zLCBzbyBwYXNzIHRoZSBmbGFnc1xuICAgICAgLy8gZXhwbGljaXRseS4gT3RoZXJ3aXNlIHRoaXMgc2NyaXB0IHdvdWxkIHNpbGVudGx5IHNraXAgdHlwZSBjaGVja2luZyBpbiB3b3Jrc3BhY2UgcGFja2FnZXMuXG4gICAgICBsaW50OiBgb3hsaW50JHtoYXNUeXBlY2hlY2sgPyAnIC0tdHlwZS1hd2FyZSAtLXR5cGUtY2hlY2snIDogJyd9IC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgICdmb3JtYXQtY29kZSc6IGBveGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLiAnISoqL3BhY2thZ2UuanNvbidgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0JyxcbiAgICB9O1xuICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICBzY3JpcHRzLnByZXR0aWZ5ID0gYHByZXR0aWVyIC0tY2FjaGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgJHtzY3JpcHRzLmZvcm1hdH0gJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLiBDb2xvciBwb2xpY3kgYmVsb25ncyB0byB3Yiwgbm90IGdlbmVyYXRlZCBwYWNrYWdlIHNjcmlwdHMuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXJPbmx5LmpvaW4oXG4gICAgICAgICAgJywnXG4gICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cbiAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICB9XG4gICAgaWYgKCFoYXNKc09yVHMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydmb3JtYXQtY29kZSddO1xuICAgICAgZGVsZXRlIHNjcmlwdHMubGludDtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydsaW50LWZpeCddO1xuICAgIH1cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgaWYgKGlzV2JQYWNrYWdlKGNvbmZpZy5wYWNrYWdlSnNvbikpIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gb2xkU2NyaXB0cy52ZXJpZnkgPz8gJ3lhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJElOSVRfQ1dEXCIgdmVyaWZ5JztcbiAgICAgIHNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPSBvbGRTY3JpcHRzWyd2ZXJpZnktZnVsbCddID8/ICd5YXJuIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzLnZlcmlmeSA9ICd3YiB2ZXJpZnknO1xuICAgICAgc2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA9ICd3YiB2ZXJpZnkgLS1mdWxsJztcbiAgICB9XG4gICAgYXBwbHlEYXRhYmFzZVNjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWcpKTtcbiAgICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1hbmFnZUdlbkkxOG5Ucyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnaTE4bicpKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgd2JEYkNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuO1xuXG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLWNyZWF0ZS1taWdyYXRpb24nLCBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZS1kZXZgKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItbWlncmF0ZScsIGAke3diRGJDb21tYW5kfSBtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3lgKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItdmlldycsIGAke3diRGJDb21tYW5kfSBzdHVkaW9gKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZTogc3RyaW5nLFxuICBnZW5lcmF0ZWRTY3JpcHQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbbmFtZV07XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgbWlncmF0aW9uIGNvbW1hbmRzIHRvIHByZXBhcmUgU1FMaXRlIGRpcmVjdG9yaWVzLFxuICAvLyBmYW4gb3V0IG92ZXIgdGVuYW50cywgb3IgcGVyZm9ybSBjbGVhbnVwIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5LlxuICBzY3JpcHRzW25hbWVdID0gb2xkU2NyaXB0ICYmICFpc0dlbmVyYXRlZERhdGFiYXNlU2NyaXB0KG9sZFNjcmlwdCkgPyBvbGRTY3JpcHQgOiBnZW5lcmF0ZWRTY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkRGF0YWJhc2VTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGJ3YlxccysoPzpkYnxwcmlzbWEpXFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgcmV0dXJuICd3YiBkYic7XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgLy8gUHJlc2VydmUgYSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYgcHJlZml4IChlLmcuIGBNSVNFX0VOVj10ZXN0YCkgb24gYW4gZXhpc3RpbmcgbWlzZSBicmlkZ2UuXG4gICAgLy8gU3VjaCBhIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgbWlzZSBjb25maWcgZW52aXJvbm1lbnRzIChtaXNlLjxNSVNFX0VOVj4udG9tbCksIHdoaWNoIGFyZVxuICAgIC8vIHNlbGVjdGVkIGZyb20gTUlTRV9FTlYgKmJlZm9yZSogbWlzZSBzdGFydHMgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCBmcm9tIGluc2lkZSBhIHRhc2s7IGRyb3BwaW5nXG4gICAgLy8gaXQgd291bGQgc2lsZW50bHkgcnVuIHRoZSB0YXNrIGluIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LlxuICAgIGNvbnN0IGVudlByZWZpeCA9IGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpO1xuICAgIGlmIChlbnZQcmVmaXggPT09IHVuZGVmaW5lZCAmJiBvbGRTY3JpcHRzW25hbWVdICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGAke2VudlByZWZpeCA/PyAnJ31taXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudi12YXIgcHJlZml4IG9mIGFuIGV4aXN0aW5nIGBtaXNlIHJ1biA8bmFtZT5gIGJyaWRnZSBzY3JpcHRcbiAqIChwb3NzaWJseSBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYnJpZGdlIGhhcyBubyBwcmVmaXgpLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzY3JpcHQgaXMgbm90IGFcbiAqIG1pc2UgYnJpZGdlIGZvciB0aGUgZ2l2ZW4gdGFzay5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEVhY2ggYXNzaWdubWVudCB2YWx1ZSBtYXkgYmUgZG91YmxlLXF1b3RlZCwgc2luZ2xlLXF1b3RlZCwgb3IgYW4gdW5xdW90ZWQgcnVuIG9mIG5vbi13aGl0ZXNwYWNlLFxuICAvLyBzbyBwcmVmaXhlcyBsaWtlIGBNSVNFX0VOVj1cImEgYlwiYCAod2hvc2UgdmFsdWUgY29udGFpbnMgc3BhY2VzKSBhcmUgbWF0Y2hlZCBpbnN0ZWFkIG9mIGRyb3BwZWQuXG4gIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF4oKD86XFx3Kz0oPzpcIlteXCJdKlwifCdbXiddKid8XFxTKylcXHMrKSopbWlzZSBydW4gJHtlc2NhcGVSZWdFeHAobmFtZSl9JGAsICd1JykuZXhlYyhcbiAgICBzY3JpcHQudHJpbSgpXG4gICk7XG4gIHJldHVybiBtYXRjaD8uWzFdO1xufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRm9ybWF0U2NyaXB0KGhhc0pzT3JUczogYm9vbGVhbiwgaGFzSmF2YTogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGNvbW1hbmRzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBpZiAoaGFzSnNPclRzKSB7XG4gICAgY29tbWFuZHMucHVzaCgneWFybiBmb3JtYXQtY29kZScpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgY29tbWFuZHMucHVzaCgneWFybiBwcmV0dGlmeScpO1xuICB9XG4gIHJldHVybiBjb21tYW5kcy5qb2luKCcgJiYgJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKS5jYXRjaCgoKSA9PiAnJyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gYCR7bGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpfSB8fCB0cnVlYDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUganNvbk9iai5wcmV0dGllcjtcbiAgY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25zOiBBcnJheTxQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkPiA9IFtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llcyxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyxcbiAgICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMsXG4gIF07XG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBkZXBlbmRlbmN5U2VjdGlvbnMpIHtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBzZWN0aW9uLnByZXR0aWVyO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydwcmV0dGllci1wbHVnaW4tamF2YSddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydwcmV0dGllci1wbHVnaW4tcHJpc21hJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzOiB7XG4gICAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgICByZXBvOiBzdHJpbmc7XG4gICAgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnO1xuICB9W10gPSBbXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9hdXRoJywgcmVwbzogJ2F1dGgnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0BkaXNjb3JkLWJvdC9zaGFyZWQnLCByZXBvOiAnZGlzY29yZC1ib3QnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJywgcmVwbzogJ2NvZGUtYW5hbHl6ZXInLCB0YXJnZXQ6ICdkZXZEZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9qdWRnZScsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIHJlcG86ICdsbG0tcHJveHknLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gIF07XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcHJpdmF0ZVBhY2thZ2VzLm1hcChhc3luYyAoeyBwYWNrYWdlTmFtZSwgcmVwbywgdGFyZ2V0IH0pID0+IHtcbiAgICAgIGlmICghcGFja2FnZU5hbWVzLmhhcyhwYWNrYWdlTmFtZSkgfHwgaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosIHBhY2thZ2VOYW1lKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvdGhlclRhcmdldCA9IHRhcmdldCA9PT0gJ2RlcGVuZGVuY2llcycgPyAnZGV2RGVwZW5kZW5jaWVzJyA6ICdkZXBlbmRlbmNpZXMnO1xuICAgICAgLy8gVGhlIGxpbnQgcnVsZSBkaXNhbGxvd3MgYGRlbGV0ZWAgd2l0aCBjb21wdXRlZCBwYWNrYWdlIG5hbWVzOyBSZWZsZWN0IGhhcyB0aGUgc2FtZSBkZWxldGlvbiBzZW1hbnRpY3MgaGVyZS5cbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9ialtvdGhlclRhcmdldF0sIHBhY2thZ2VOYW1lKTtcbiAgICAgIGpzb25PYmpbdGFyZ2V0XVtwYWNrYWdlTmFtZV0gPSBhd2FpdCBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgam9iczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdjbGVhbnVwJyxcbiAgICAgIGdsb2I6ICcnLFxuICAgICAgcnVuOiAnJyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2NoZWNrLW1pZ3JhdGlvbnMnLFxuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5mYWlsZWQ9MFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCBodXNreURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgY29uc3QgaGFzSHVza3lEaXIgPSBmcy5leGlzdHNTeW5jKGh1c2t5RGlyUGF0aCk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChzZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG4gIGlmIChoYXNIdXNreURpcikge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnByb21pc2VzLnJtKGh1c2t5RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pLFxuICAgIF0pO1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAobGludCkge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZVB1c2hTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgbGV0IGxpbnRDb21tYW5kOiBzdHJpbmc7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gICAgLy8gZmluYWwgaG9vayBjb21tYW5kIG9uIHRoZSBmaXJzdCBydW4gaW5zdGVhZCBvZiBjaGFuZ2luZyBpdCBvbiB0aGUgc2Vjb25kLlxuICAgIGxpbnRDb21tYW5kID0gJ2J1biAtLWJ1biB3YiBsaW50JztcbiAgfSBlbHNlIHtcbiAgICBsaW50Q29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAneWFybiB3YiBsaW50JyA6ICd5YXJuIHJ1biBsaW50JztcbiAgfVxuICBjb25zdCBxdWlldExpbnRDb21tYW5kID0gYCR7bGludENvbW1hbmR9IC0tcXVpZXRgO1xuICAvLyBObyBzZXBhcmF0ZSB0eXBlY2hlY2sgc3RlcCBuZWVkZWQg4oCUIHRoZSBsaW50IGNvbW1hbmQgYWxyZWFkeSBpbmNsdWRlcyB0eXBlY2hlY2tpbmcuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgcmV0dXJuIGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG4ke3F1aWV0TGludENvbW1hbmR9XG5gLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcXVpZXRMaW50Q29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlQ29tbWl0Sm9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBMZWZ0aG9va0pvYltdIHtcbiAgcmV0dXJuIHByZUNvbW1pdFNldHRpbmdzLmpvYnMubWFwKChqb2IpID0+XG4gICAgam9iLm5hbWUgPT09ICdjbGVhbnVwJ1xuICAgICAgPyB7XG4gICAgICAgICAgLi4uam9iLFxuICAgICAgICAgIGdsb2I6IGdldENsZWFudXBHbG9icyhjb25maWcpLFxuICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgfVxuICAgICAgOiBqb2JcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIExldCBgd2IgbGludCAtLWZvcm1hdGAgZGVjaWRlIHdoZXRoZXIgUHJldHRpZXIgaXMgYXZhaWxhYmxlOyB0aGUgaG9va1xuICAvLyBzdGlsbCBuZWVkcyB0byB0cmlnZ2VyIHdoZW4gYWRkaW5nIHRoZSBmaXJzdCBwcmV0dGllci1vbmx5IGZpbGUuXG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPVxuICAgIGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLndiIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpID8gWy4uLmV4dGVuc2lvbnMucHJldHRpZXJPbmx5XSA6IFtdO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdweScpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnZGFydCcpO1xuICB9XG4gIGNvbnN0IGZpbHRlcmVkRXh0ZW5zaW9ucyA9IFsuLi5uZXcgU2V0KHN1cHBvcnRlZEV4dGVuc2lvbnMpXS50b1NvcnRlZCgpO1xuICByZXR1cm4gYCoqLyoueyR7ZmlsdGVyZWRFeHRlbnNpb25zLmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnKSkge1xuICAgIHJldHVybiBTdHJpbmcucmF3YFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG55YXJuIHdvcmtzcGFjZSBAd2lsbGJvb3N0ZXIvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cbiAgLy8gUHl0aG9uLW9ubHkgQnVuIHJlcG9zIGluc3RhbGwgd2IgZm9yIHNoYXJlZCBzY3JpcHRzIGJ1dCBub3QgT3hsaW50LCBzb1xuICAvLyBzdGFnZWQtZmlsZSBob29rcyBtdXN0IHVzZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgZm9ybWF0dGVyIHBhdGggYmVsb3cuXG4gIGNvbnN0IGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICBpZiAoKGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLndiKSAmJiBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzKSB7XG4gICAgcmV0dXJuIGBcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuJHtjb25maWcuaXNCdW4gPyAnYnVuIC0tYnVuIHdiJyA6ICd5YXJuIHdiJ30gbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cblxuICBjb25zdCBveGxpbnRQYXR0ZXJuID0gZXh0ZW5zaW9ucy5veGxpbnQubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3Qgb3hmbXRQYXR0ZXJuID0gZXh0ZW5zaW9ucy5veGZtdC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBwcmV0dGllclBhdHRlcm4gPSBleHRlbnNpb25zLnByZXR0aWVyT25seS5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBoYXNKc09yVHMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgcmV0dXJuIFN0cmluZy5yYXdgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbiR7aGFzSnNPclRzID8gU3RyaW5nLnJhd2BveGxpbnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7b3hsaW50UGF0dGVybn0pJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtoYXNKc09yVHMgPyBTdHJpbmcucmF3YG94Zm10X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke294Zm10UGF0dGVybn0pJyB8IGdyZXAgLXYgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtoYXNKYXZhID8gU3RyaW5nLnJhd2BwcmV0dGllcl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtwcmV0dGllclBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbnBhY2thZ2VfanNvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcIlxuJHtoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpID8gU3RyaW5nLnJhd2BweXRob25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwucHkkJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCA/IFN0cmluZy5yYXdgZGFydF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5kYXJ0JCcgfCBncmVwIC12ICdnZW5lcmF0ZWQnIHwgZ3JlcCAtdiAnXFwuZnJlZXplZFxcLmRhcnQkJyB8IGdyZXAgLXYgJ1xcLmdcXC5kYXJ0JCcgfHwgdHJ1ZSlcImAgOiAnJ31cblxuJHtcbiAgaGFzSnNPclRzXG4gICAgPyBTdHJpbmcucmF3YFxuaWYgWyAtbiBcIiRveGZtdF9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9veGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gJyEqKi9wYWNrYWdlLmpzb24nICRveGZtdF9maWxlc1xuZmlcbmBcbiAgICA6ICcnXG59XG4ke1xuICBoYXNKYXZhXG4gICAgPyBTdHJpbmcucmF3YGlmIFsgLW4gXCIkcHJldHRpZXJfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIC0taWdub3JlLXVua25vd24gLS0gJHByZXR0aWVyX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBoYXNKc09yVHNcbiAgICA/IFN0cmluZy5yYXdgXG5pZiBbIC1uIFwiJG94bGludF9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9veGxpbnQgLS1maXggJG94bGludF9maWxlc1xuZmlcbmBcbiAgICA6ICcnXG59XG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9zb3J0LXBhY2thZ2UtanNvbiAtLSAkcGFja2FnZV9qc29uX2ZpbGVzXG5maVxuJHtcbiAgaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKVxuICAgID8gYGlmIFsgLW4gXCIkcHl0aG9uX2ZpbGVzXCIgXTsgdGhlblxuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBibGFjayAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGZsYWtlOCAkcHl0aG9uX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbFxuICAgID8gYGlmIFsgLW4gXCIkZGFydF9maWxlc1wiIF07IHRoZW5cbiAgZGFydCBmb3JtYXQgJGRhcnRfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2NhbFdiUGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZXMnLCAnd2InLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci93Yic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcuaGFzVmVyc2lvblNldHRpbmdzKSB7XG4gICAgY29uc3QgdG9vbHNDaGFuZ2VkUGF0dGVybiA9IFN0cmluZy5yYXdgKG1pc2VcXC50b21sfFxcLm1pc2VcXC50b21sfFxcLnRvb2wtdmVyc2lvbnN8XFwuListdmVyc2lvbilgO1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIiR7dG9vbHNDaGFuZ2VkUGF0dGVybn1cIiBcIm1pc2UgaW5zdGFsbFwiYCk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIGluc3RhbGwnIDogJ3lhcm4nO1xuICBjb25zdCBybU5leHREaXJlY3RvcnkgPSBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCA/ICcgJiYgcm0gLVJmIC5uZXh0JyA6ICcnO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwYWNrYWdlXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBjb2RlZ2VuXCJgXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vd2IgcHJpc21hIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiBwcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuZnVuY3Rpb24gaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUnVubmVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnkgcnVuJyB8ICd1diBydW4nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayA/ICd1diBydW4nIDogJ3BvZXRyeSBydW4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGludHN0YWdlZHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5janNgLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5qc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzb25gLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29uZmlnQ29udGVudChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGVudD8udHJpbSgpO1xufVxuIiwiZXhwb3J0IHR5cGUgQ29uZmlnQmxvY2tOYW1lID0gJ2Jhc2UnIHwgJ2V4cG9ydCc7XG5cbmludGVyZmFjZSBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucyB7XG4gIGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuICBtYXJrZXJQcmVmaXg6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgZGVzaXJlZENvbnRlbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQ29uZmlnQmxvY2tzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlclByZWZpeDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucykge1xuICAgIHRoaXMuYmxvY2tOYW1lcyA9IG9wdGlvbnMuYmxvY2tOYW1lcztcbiAgICB0aGlzLm1hcmtlclByZWZpeCA9IG9wdGlvbnMubWFya2VyUHJlZml4O1xuICAgIHRoaXMudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICB9XG5cbiAgZ2V0Q29uZmlnQ29udGVudChvcHRpb25zOiBHZXRDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFvcHRpb25zLmV4aXN0aW5nQ29udGVudCkgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gICAgaWYgKHRoaXMuaGFzTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50LCBvcHRpb25zLmRlc2lyZWRDb250ZW50LCBvcHRpb25zLmZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gIH1cblxuICBnZXRCbG9jayhibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHt0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG4gIH1cblxuICBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJsb2NrTmFtZXMuc29tZSgoYmxvY2tOYW1lKSA9PiBjb250ZW50LmluY2x1ZGVzKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgdGhpcy5ibG9ja05hbWVzKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRoaXMuZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMucmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluICR7dGhpcy50b29sTmFtZX0gY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgICAgfVxuICAgICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBgJHtlc2NhcGVSZWdFeHAodGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0ICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OmVuZCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294Zm10JyxcbiAgdG9vbE5hbWU6ICdveGZtdCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsZWdhY3lKc29uQ29uZmlnUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5veGZtdHJjLmpzb24nKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294Zm10LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICBmaWxlUGF0aCxcbiAgICB9KTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0obGVnYWN5SnNvbkNvbmZpZ1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpXTtcbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gQ29tbW9uSlMgcGFja2FnZXMgbmVlZCByZXF1aXJlL21vZHVsZS5leHBvcnRzIGhlcmU6IG94Zm10IGNvbmZpZyBmaWxlcyBhcmVcbiAgLy8gb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgdGhlIHNoYXJlZCBjb25maWcgcGFja2FnZSBpcyBFU00tb25seS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIgLz5cbmltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGZtdCBjb25maWcgZmlsZXMgYXJlIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94Zm10Q29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IG94Zm10Q29uZmlnLmRlZmF1bHQgPz8gb3hmbXRDb25maWc7YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZyc7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gY29uZmlnO2BcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294bGludCcsXG4gIHRvb2xOYW1lOiAnb3hsaW50Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hsaW50Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIGNvbmZpZyBmaWxlcyBhcyBwcm9kdWN0IGNvZGUsIHNvIG1pZ3JhdGlvblxuICAgIC8vIG11c3Qgbm90IHJlbW92ZSBwYWNrYWdlLXByb3ZpZGVkIGxpbnRlciBzZXR0aW5ncy4gR2VuZXJhdGVkIGZpbGVzIHdpdGhcbiAgICAvLyBtYW5hZ2VkIGJsb2NrcyBhcmUgc3RpbGwgc2FmZSB0byB1cGRhdGUuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudCA9XG4gICAgICBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyAmJiBleGlzdGluZ0NvbnRlbnQgJiYgIW1hbmFnZWRDb25maWdCbG9ja3MuaGFzTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnRcbiAgICAgID8gZXhpc3RpbmdDb250ZW50XG4gICAgICA6IHJlcGxhY2VMZWdhY3lDb25maWdSZWZlcmVuY2VzKFxuICAgICAgICAgIG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICAgICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBpZiAoIXNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94bGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbmMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMueWFtbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLmNqcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLm1qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcudHMnKSwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCkpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUxlZ2FjeUNvbmZpZ1JlZmVyZW5jZXMoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUFsbCgvKD88IVsuL10pXFxiY29uZmlnXFwuL2d1LCAnb3hsaW50UmVzb2x2ZWRDb25maWcuJyk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgaXNSb290Q29uZmlnID0gY29uZmlnLmlzUm9vdDtcbiAgY29uc3Qgb3hsaW50QmFzZUNvbmZpZ01vZHVsZSA9IGdldE94bGludEJhc2VDb25maWdNb2R1bGUoY29uZmlnKTtcblxuICAvLyBEbyBub3QgY29sbGFwc2UgdGhpcyB0byBhIHN0YXRpYyBpbXBvcnQgZm9yIGV2ZXJ5IHBhY2thZ2UuIENvbW1vbkpTIHBhY2thZ2VzXG4gIC8vIHR5cGUtY2hlY2sgYXV0by1kaXNjb3ZlcmVkIG94bGludC5jb25maWcudHMgYXMgQ29tbW9uSlMsIHNvIGltcG9ydGluZyB0aGUgRVNNXG4gIC8vIEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnIHBhY2thZ2UgdHJpZ2dlcnMgVFMxNDc5LiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoXG4gIC8vIGxpdGVyYWN5LXRlc3QncyBnZW5lcmF0ZWQgY29uZmlnIHBhdHRlcm4uXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwibm9kZVwiIC8+XG5pbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGxpbnQgb25seSBhdXRvLWRpc2NvdmVycyAudHMgY29uZmlnIGZpbGVzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hsaW50QmFzZUNvbmZpZyA9IHJlcXVpcmUoJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyk7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnLmRlZmF1bHQgPz8gb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbmltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG5cbmZ1bmN0aW9uIGdldE94bGludEJhc2VDb25maWdNb2R1bGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyA/ICcuL2NvbmZpZy5tanMnIDogJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJztcbn1cblxuZnVuY3Rpb24gZ2V0UmVzb2x2ZWRDb25maWdDb250ZW50KGJhc2VDb25maWdOYW1lOiBzdHJpbmcsIGlzUm9vdENvbmZpZzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpc1Jvb3RDb25maWcpIHtcbiAgICByZXR1cm4gYC8vIEtlZXAgYSBwYWNrYWdlLWxvY2FsIGNvcHkgc28gcmVwb3NpdG9yaWVzIGNhbiBhZGQgc2V0dGluZ3Mgb3V0c2lkZVxuLy8gbWFuYWdlZCBibG9ja3Mgd2l0aG91dCBtdXRhdGluZyB0aGUgc2hhcmVkIGltcG9ydGVkIGNvbmZpZyBvYmplY3QuXG5jb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbi8vIFRoZSB0eXBlLWF3YXJlIG9wdGlvbnMgbWFrZSBsaW50IHBlcmZvcm0gdHlwZSBjaGVja2luZy4gQWx3YXlzIGZvcmNlIHRoZW0gb24gaGVyZSxcbi8vIGluc2lkZSB0aGUgbWFuYWdlZCBibG9jaywgc28gbm8gY3VzdG9taXphdGlvbiBjYW4gc2lsZW50bHkgZGlzYWJsZSB0eXBlIGNoZWNraW5nLlxub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucyA9IHsgLi4ub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucywgdHlwZUF3YXJlOiB0cnVlLCB0eXBlQ2hlY2s6IHRydWUgfTtgO1xuICB9XG5cbiAgcmV0dXJuIGAvLyBPeGxpbnQgcmVqZWN0cyB0aGUgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBvdXRzaWRlIHRoZSByb290IGNvbmZpZywgc28gZGVsZXRlIHRoZW1cbi8vIGhlcmUuIFRoaXMgZG9lcyBOT1QgZGlzYWJsZSB0eXBlIGNoZWNraW5nOiB0aGUgbGludCBjb21tYW5kcyBwYXNzIHRoZSAtLXR5cGUtYXdhcmUgYW5kXG4vLyAtLXR5cGUtY2hlY2sgZmxhZ3MgZXhwbGljaXRseS5cbmNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuZGVsZXRlIG94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnM7YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBpZiAoIWRvZXNDb250YWluSmF2YShjb25maWcpKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBtYW5hZ2VkU2NyaXB0c0Jsb2NrID0gYHNjcmlwdHMvKipcbiFzY3JpcHRzL1xuIXNjcmlwdHMvKi5zaGA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhSYWlsd2F5aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFJhaWx3YXlpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmFpbHdheWlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15zY3JpcHRzXFwvJC9tLCBtYW5hZ2VkU2NyaXB0c0Jsb2NrKTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeS5pbmRleE9mKCc6JykgKyAxKTtcbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpID8gZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkgOiBbXTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcblxuICAgICAgbGV0IGJhZGdlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgYmFkZ2VOYW1lID0gKGJhZGdlTmFtZVswXSB8fCAnJykudG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGlmICghcmVwb3NpdG9yeSkgY29udGludWU7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gcmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlKG5ld0NvbnRlbnQsIGJhZGdlTmFtZSwgZmlsZU5hbWUpO1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUdpdEh1YkFjdGlvbnNCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2VOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBlc2NhcGVkQmFkZ2VOYW1lID0gZXNjYXBlUmVnRXhwKGJhZGdlTmFtZSk7XG4gIGNvbnN0IGVzY2FwZWRGaWxlTmFtZSA9IGVzY2FwZVJlZ0V4cChmaWxlTmFtZSk7XG4gIHJldHVybiByZWFkbWVcbiAgICAucmVwbGFjZUFsbChcbiAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgIFN0cmluZy5yYXdgXFxbIVxcWyR7ZXNjYXBlZEJhZGdlTmFtZX1cXF1cXChodHRwczovL2dpdGh1YlxcLmNvbS9bXi9cXHMpXSsvW14vXFxzKV0rL2FjdGlvbnMvd29ya2Zsb3dzLyR7ZXNjYXBlZEZpbGVOYW1lfS9iYWRnZVxcLnN2Z1xcKVxcXVxcKGh0dHBzOi8vZ2l0aHViXFwuY29tL1teL1xccyldKy9bXi9cXHMpXSsvYWN0aW9ucy93b3JrZmxvd3MvJHtlc2NhcGVkRmlsZU5hbWV9XFwpXFxuP2AsXG4gICAgICAgICdndSdcbiAgICAgICksXG4gICAgICAnJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gT21pdDx0eXBlb2YganNvbk9iaiwgJ2V4dGVuZHMnPiAmIHtcbiAgZXh0ZW5kcz86IHN0cmluZ1tdO1xuICBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VSZW5vdmF0ZUV4dGVuZHMoanNvbk9iai5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzID8/IFtdKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM/OiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXM/LmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVJlbm92YXRlRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzOiBzdHJpbmdbXSwgZXhpc3RpbmdFeHRlbmRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5nZW5lcmF0ZWRFeHRlbmRzLCAuLi5leGlzdGluZ0V4dGVuZHNdKV0uZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG59XG4iLCJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQWdlbnRTa2lsbHMoX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdpbnN0YWxsQWdlbnRTa2lsbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVE9ETzogV2UgYXJlIHRlbXBvcmFyaWx5IG5vdCBpbnN0YWxsaW5nIG1hbmFnZWQgYWdlbnQgc2tpbGxzIGludG8gcmVwb3MuXG4gICAgLy8gYXdhaXQgcnVuSW5zdGFsbEFnZW50U2tpbGxzKF9yb290Q29uZmlnKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0V4dGVuZHMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi8qLmNvbmZpZy50cycsXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIC8vIHdiZnkgZ2VuZXJhdGVzIHJvb3QtbGV2ZWwgdG9vbCBjb25maWdzIHN1Y2ggYXMgcGxheXdyaWdodC5jb25maWcudHMsIGFuZFxuICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgbmVlZHMgdGhvc2UgZmlsZXMgaW4gdGhlIHByb2plY3QgdG8gc2VlIE5vZGUvQnVuIGdsb2JhbHMuXG4gIGluY2x1ZGU6IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIGF3YWl0IGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRUeXBlcyA9IGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnJvb3REaXIgPSBnZXRSb290RGlyKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmlzQnVuICYmICFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywganN4OiAncmVhY3QtanN4JyB9O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICAvLyB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZy5qc29uIGlzIGEgbGludC90eXBlY2hlY2sgcHJvamVjdCwgbm90IHRoZSBlbWl0XG4gICAgICAvLyBjb250cmFjdC4gSXQgbXVzdCBrZWVwIHJvb3REaXIgYnJvYWQgZW5vdWdoIGZvciByb290IGNvbmZpZyBmaWxlcyxcbiAgICAgIC8vIHNjcmlwdHMsIHNyYywgYW5kIHRlc3RzLiBidWlsZC10cyBvd25zIGVtaXQgYW5kIGNyZWF0ZXMgYSB0ZW1wb3JhcnlcbiAgICAgIC8vIHNyYy1vbmx5IHRzY29uZmlnIHdpdGggbm9FbWl0PWZhbHNlLCBlbWl0RGVjbGFyYXRpb25Pbmx5PXRydWUsXG4gICAgICAvLyByb290RGlyPVwic3JjXCIsIGFuZCBpbmNsdWRlPVtcInNyYy8qKi8qXCJdLCBzbyBwcmVzZXJ2aW5nIG5vRW1pdD1mYWxzZSBvclxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiIGhlcmUgd291bGQgb25seSBicmVhayBub24tc3JjIHR5cGUtYXdhcmUgbGludCBjb3ZlcmFnZS5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRNZXRhZGF0YSB9O1xuICAgICAgZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuXG4gICAgICBjb25zdCBtZXJnZWRUeXBlcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXMsIGdlbmVyYXRlZFR5cGVzKSwgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgLy8gUGFja2FnZSBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHRocm91Z2ggcGFja2FnZSBleHBvcnRzIGluc3RlYWQgb2YgYmFzZVVybC5cbiAgICAvLyBwYXRocyBpcyBpbnRlbnRpb25hbGx5IHByZXNlcnZlZCBzbyByZXBvLWxvY2FsIHRvb2xpbmcgY2FuIGtlZXAgZXhwbGljaXRcbiAgICAvLyBhbGlhc2VzIHdpdGhvdXQgcmVseWluZyBvbiBiYXNlVXJsJ3MgYnJvYWQgZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuICAgIGRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzKG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgY29uZmlnKTtcbiAgICBub3JtYWxpemVDb21tb25Kc1RzY29uZmlnU2V0dGluZ3MobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBjb25maWcpO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy52ZXJiYXRpbU1vZHVsZVN5bnRheDtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwTGVnYWN5VHNjb25maWdNb2R1bGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTmV4dC9CbGl0eiBvd24gdGhlaXIgdHNjb25maWcgc2hhcGUsIGJ1dCBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGFjY2VwdHNcbiAgICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIC8vIE9taXR0aW5nIGluY2x1ZGUgbGV0cyBmcmFtZXdvcmsgdHNjb25maWdzIGtlZXAgVHlwZVNjcmlwdCdzIGRlZmF1bHRcbiAgLy8gXCJhbGwgVFMvVFNYIGZpbGVzXCIgYmVoYXZpb3IsIHdoaWNoIGFscmVhZHkgY292ZXJzIHNjcmlwdHMuXG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZSkgcmV0dXJuO1xuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcygnc2NyaXB0cy8qKi8qJykpIHJldHVybjtcblxuICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goJ3NjcmlwdHMvKiovKicpO1xuICBzZXR0aW5ncy5pbmNsdWRlLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGNvbnN0IG1vZHVsZVJlc29sdXRpb24gPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uKTtcbiAgaWYgKG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoc2V0dGluZ3MuZXh0ZW5kcykge1xuICAgICAgLy8gQW4gZXh0ZW5kZWQgY29uZmlnIG1heSBhbHJlYWR5IHN1cHBseSBhIHZhbGlkIG1vZHVsZS9yZXNvbHZlciBwYWlyLCBzbyBvbmx5XG4gICAgICAvLyByZW1vdmUgdGhlIHJlbW92ZWQtaW4tVFM2IG5vZGUxMCBzcGVsbGluZ3MgaW5zdGVhZCBvZiBmb3JjaW5nIGJ1bmRsZXIgb24gaXQuXG4gICAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5leHQuanMgd3JpdGVzIFwibm9kZVwiIGR1cmluZyBidWlsZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG1pc3NpbmcsIGJ1dFxuICAgICAgLy8gdHNnb2xpbnQgdHJlYXRzIHRoYXQgc3BlbGxpbmcgYXMgdGhlIHJlbW92ZWQgbm9kZTEwIHJlc29sdmVyLlxuICAgICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIHRzZ29saW50IGZvbGxvd3MgVHlwZVNjcmlwdCA2IHZhbGlkYXRpb24sIHdoZXJlIGJhc2VVcmwgaXMgcmVtb3ZlZCBhbmRcbiAgLy8gcGF0aCB0YXJnZXRzIG11c3QgYmUgZXhwbGljaXRseSByZWxhdGl2ZS4gTmV4dC5qcyBzdGlsbCBhY2NlcHRzIHRoZSBhbGlhc1xuICAvLyBzaGFwZSBhZnRlciBlYWNoIHRhcmdldCBpcyB3cml0dGVuIHdpdGggYSBsZWFkaW5nIC4vLlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLmJhc2VVcmw7XG4gIGlmICghY29tcGlsZXJPcHRpb25zLnBhdGhzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBpbGVyT3B0aW9ucy5wYXRocykpIHtcbiAgICBjb21waWxlck9wdGlvbnMucGF0aHNbYWxpYXNdID0gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSB8fCB0YXJnZXQuc3RhcnRzV2l0aCgnLi4vJykgfHwgcGF0aC5pc0Fic29sdXRlKHRhcmdldCkpIHJldHVybiB0YXJnZXQ7XG4gICAgcmV0dXJuIGAuLyR7dGFyZ2V0fWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RGlyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWcuaXNSb290KSByZXR1cm4gJy4nO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkgPyAnLi4vLi4nIDogJy4nO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBhZGRJbmNsdWRlUGF0aChzZXR0aW5nczogVHNDb25maWdKc29uLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0dGluZ3MuaW5jbHVkZSA/Pz0gW107XG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcyhkaXJQYXRoKSkge1xuICAgIHNldHRpbmdzLmluY2x1ZGUucHVzaChkaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlczogc3RyaW5nW10sIGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2VuZXJhdGVkVHlwZVNldCA9IG5ldyBTZXQoZ2VuZXJhdGVkVHlwZXMpO1xuICByZXR1cm4gZXhpc3RpbmdUeXBlcy5maWx0ZXIoKHR5cGVOYW1lKSA9PiB7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIHBhY2thZ2UtcHJvdmlkZWQgdGVzdCBnbG9iYWxzLiBEcm9wIHN0YWxlIGVudHJpZXMgd2hlbiB0aGVcbiAgICAvLyBjb3JyZXNwb25kaW5nIGRlcGVuZGVuY3kgaXMgbm8gbG9uZ2VyIHByZXNlbnQgc28gVHlwZVNjcmlwdCB3b24ndCByZXF1aXJlXG4gICAgLy8gbWlzc2luZyBwYWNrYWdlcyBzdWNoIGFzIHZpdGVzdC5cbiAgICBpZiAoaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZSkgJiYgIWdlbmVyYXRlZFR5cGVTZXQuaGFzKHR5cGVOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lID09PSAnamVzdCcgfHwgdHlwZU5hbWUgPT09ICdtb2NoYScgfHwgdHlwZU5hbWUgPT09ICd2aXRlc3QvZ2xvYmFscyc7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVRzRXh0ZW5zaW9uRW1pdENvbXBhdGliaWxpdHkoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGlmIChjb21waWxlck9wdGlvbnMubm9FbWl0ICE9PSBmYWxzZSB8fCBjb21waWxlck9wdGlvbnMuZW1pdERlY2xhcmF0aW9uT25seSA9PT0gdHJ1ZSkgcmV0dXJuO1xuXG4gIC8vIEB0c2NvbmZpZy9idW4gZW5hYmxlcyBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9ucywgd2hpY2ggVHlwZVNjcmlwdCBwZXJtaXRzXG4gIC8vIGR1cmluZyBlbWl0IG9ubHkgd2hlbiByZWxhdGl2ZSBUUyBleHRlbnNpb25zIGFyZSByZXdyaXR0ZW4uXG4gIGNvbXBpbGVyT3B0aW9ucy5yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcblxuICAvLyBUeXBlU2NyaXB0IHRyZWF0cyBvcHRpb24gdmFsdWVzIGNhc2UtaW5zZW5zaXRpdmVseSwgc28gbm9ybWFsaXplIGJlZm9yZSBjb21wYXJpc29uLlxuICBjb25zdCBtb2R1bGVSZXNvbHV0aW9uID0gbG93ZXJDYXNlU2V0dGluZyhjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbik7XG4gIC8vIFR5cGVTY3JpcHQgNiByZW1vdmVkIHRoZSBvbGQgbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5nLCBzbyBpbmhlcml0ZWQgYmFzZSBjb25maWdzXG4gIC8vIHNob3VsZCBjaG9vc2UgdGhlIHJlc29sdmVyIHVubGVzcyBhIHByb2plY3QgYWxyZWFkeSBvcHRlZCBpbnRvIGEgbW9kZXJuIG9uZS5cbiAgaWYgKG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJykge1xuICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgfVxuICBpZiAoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHJldHVybjtcblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy52aXRlIHx8IGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAvLyBWaXRlIG93bnMgbW9kdWxlIHNlbWFudGljcyBmb3IgdGhlc2UgcGFja2FnZXMgYW5kIHRoZWlyIHNvdXJjZXMgcmVseSBvblxuICAgIC8vIGJ1bmRsZXItbW9kZSByZXNvbHV0aW9uIChlLmcuIGV4dGVuc2lvbmxlc3MgaW1wb3J0cyksIHNvIHBpbiB0aGUgYnVuZGxlciBwYWlyXG4gICAgLy8gZXZlbiB3aGVuIGEgbGVnYWN5IGNvbmZpZyB1c2VkIHRoZSBub2RlIHJlc29sdmVyLCBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0b1xuICAgIC8vIHRoZSBub2RlIGJhc2UgY29uZmlncycgTm9kZU5leHQuXG4gICAgaWYgKG1vZHVsZVJlc29sdXRpb24gIT09ICdidW5kbGVyJykge1xuICAgICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gICAgfVxuICAgIGNvbnN0IG1vZHVsZUtpbmQgPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGUpO1xuICAgIC8vIFR5cGVTY3JpcHQgcGFpcnMgdGhlIGJ1bmRsZXIgcmVzb2x2ZXIgd2l0aCBQcmVzZXJ2ZSBvciBFUy1tb2R1bGUga2luZHMuIEtlZXAgYW5cbiAgICAvLyBleGlzdGluZyB2YWxpZCBraW5kIChlLmcuIFByZXNlcnZlLCB3aGljaCBoYW5kbGVzIGltcG9ydCBhbmQgcmVxdWlyZSBzeW50YXhcbiAgICAvLyBzZXBhcmF0ZWx5KSBhbmQgZmlsbCBpbiBFU05leHQgb25seSB3aGVuIHRoZSBwYWlyIHdvdWxkIG90aGVyd2lzZSBiZSBpbnZhbGlkLlxuICAgIGlmIChtb2R1bGVLaW5kID09PSB1bmRlZmluZWQgfHwgKG1vZHVsZUtpbmQgIT09ICdwcmVzZXJ2ZScgJiYgIW1vZHVsZUtpbmQuc3RhcnRzV2l0aCgnZXMnKSkpIHtcbiAgICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGUgPSAnRVNOZXh0JztcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG1vZHVsZVJlc29sdXRpb24gPT09ICdidW5kbGVyJykge1xuICAgIC8vIFRoZSBub2RlIGJhc2UgY29uZmlncyBwcm92aWRlIGEgY29uc2lzdGVudCBtb2R1bGUvcmVzb2x2ZXIgcGFpciwgYW5kIGV2ZXJ5XG4gICAgLy8gbW9kdWxlIGtpbmQgdGhleSBtYXkgY2hvb3NlIGlzIGludmFsaWQgd2l0aCBhIGxlZnRvdmVyIGJ1bmRsZXIgcmVzb2x2ZXIuXG4gICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlS2luZCA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZSk7XG4gIGlmIChtb2R1bGVLaW5kID09PSAncHJlc2VydmUnIHx8IG1vZHVsZUtpbmQ/LnN0YXJ0c1dpdGgoJ2VzJykpIHtcbiAgICAvLyBOb2RlIGJhc2UgY29uZmlncyBwYWlyIHRoZWlyIHJlc29sdmVyIHdpdGggYSBtYXRjaGluZyBtb2R1bGUga2luZDsgbGVmdG92ZXJcbiAgICAvLyBFUy9QcmVzZXJ2ZSBvdmVycmlkZXMgYXJlIGludmFsaWQgd2l0aCBldmVyeSBwYWlyIHRoZXkgbWF5IGNob29zZS5cbiAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VTZXR0aW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb21tb25Kc1RzY29uZmlnU2V0dGluZ3MoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMgfHwgY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmlzRXNtUGFja2FnZSkgcmV0dXJuO1xuXG4gIGlmIChjb21waWxlck9wdGlvbnMubW9kdWxlPy50b0xvd2VyQ2FzZSgpID09PSAnY29tbW9uanMnKSB7XG4gICAgLy8gQHRzY29uZmlnL25vZGUtbHRzIG5vdyBwcm92aWRlcyBtb2R1bGVSZXNvbHV0aW9uPW5vZGUxNi4gVHlwZVNjcmlwdCByZXF1aXJlc1xuICAgIC8vIHRoZSBtb2R1bGUga2luZCB0byBtb3ZlIHdpdGggdGhhdCByZXNvbHZlciwgd2hpbGUgdmVyYmF0aW1Nb2R1bGVTeW50YXg9ZmFsc2VcbiAgICAvLyBwcmVzZXJ2ZXMgdGhlIGxvbmctc3RhbmRpbmcgQ29tbW9uSlMgZW1pdCBzaGFwZSBmb3IgZXhpc3RpbmcgcGFja2FnZXMuXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZSA9ICdOb2RlMTYnO1xuICB9XG4gIGNvbXBpbGVyT3B0aW9ucy52ZXJiYXRpbU1vZHVsZVN5bnRheCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdidW4nKTtcbiAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ25vZGUnKTtcbiAgfVxuICBpZiAoXG4gICAgZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICBkZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgIGRlcGVuZGVuY2llc1snamVzdC1lbnZpcm9ubWVudC1qc2RvbSddIHx8XG4gICAgZGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnamVzdCcpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMudml0ZXN0KSB7XG4gICAgdHlwZU5hbWVzLmFkZCgndml0ZXN0L2dsb2JhbHMnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLm1vY2hhKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbW9jaGEnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLmN5cHJlc3MpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdjeXByZXNzJyk7XG4gIH1cblxuICByZXR1cm4gWy4uLnR5cGVOYW1lc107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhcmdldDogJ2JyYW5jaCc7XG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJztcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBpbmNsdWRlOiBzdHJpbmdbXTtcbiAgICAgIGV4Y2x1ZGU6IHN0cmluZ1tdO1xuICAgIH07XG4gIH07XG4gIHJ1bGVzOiAoXG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdkZWxldGlvbicgfCAnbm9uX2Zhc3RfZm9yd2FyZCc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogYm9vbGVhbjtcbiAgICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczoge1xuICAgICAgICAgICAgY29udGV4dDogc3RyaW5nO1xuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IG51bWJlcjtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogbnVtYmVyO1xuICAgICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW107XG4gICAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGJvb2xlYW47XG4gICAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddO1xuICAgICAgICB9O1xuICAgICAgfVxuICApW107XG4gIGJ5cGFzc19hY3RvcnM6IHtcbiAgICBhY3Rvcl9pZDogbnVtYmVyO1xuICAgIGFjdG9yX3R5cGU6ICdUZWFtJztcbiAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCc7XG4gIH1bXTtcbn1cblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBzb3VyY2VfdHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUiA9IHtcbiAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxufSBhcyBjb25zdDtcblxuY29uc3QgUFJPVEVDVF9NQUlOX1JVTEVTRVQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCA9IHtcbiAgbmFtZTogJ1Byb3RlY3QgbWFpbicsXG4gIHRhcmdldDogJ2JyYW5jaCcsXG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJyxcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBleGNsdWRlOiBbXSxcbiAgICAgIGluY2x1ZGU6IFsnfkRFRkFVTFRfQlJBTkNIJ10sXG4gICAgfSxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZGVsZXRpb24nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGZhbHNlLFxuICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAndGVzdCAvIHRlc3QnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IDE1XzM2OCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICdzZW1hbnRpYy1wciAvIHNlbWFudGljLXByJyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiAxNV8zNjgsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbm9uX2Zhc3RfZm9yd2FyZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogMCxcbiAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdLFxuICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGZhbHNlLFxuICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIGJ5cGFzc19hY3RvcnM6IFtcbiAgICB7XG4gICAgICBhY3Rvcl9pZDogMTdfNzc3XzQ5NSxcbiAgICAgIGFjdG9yX3R5cGU6ICdUZWFtJyxcbiAgICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICB9LFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwUmVwb3NpdG9yeVJ1bGVzZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVwc2VydFByb3RlY3RNYWluUnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gUmVwb3NpdG9yeSBydWxlc2V0cyByZXF1aXJlIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHdoaWNoIGxvY2FsIHJ1bnNcbiAgICAgIC8vIG1heSBub3QgaGF2ZSBldmVuIHdoZW4gZmlsZS1nZW5lcmF0aW9uIGFuZCBwdXNoZXMgYXJlIGFsbG93ZWQuXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldCA9IGF3YWl0IGZpbmRSZXBvc2l0b3J5UnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgUFJPVEVDVF9NQUlOX1JVTEVTRVQubmFtZSk7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldElkID0gZXhpc3RpbmdSdWxlc2V0Py5pZDtcblxuICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nUnVsZXNldElkKSB7XG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBydWxlc2V0X2lkOiBleGlzdGluZ1J1bGVzZXRJZCxcbiAgICAgICAgICAuLi5QUk9URUNUX01BSU5fUlVMRVNFVCxcbiAgICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgLi4uUFJPVEVDVF9NQUlOX1JVTEVTRVQsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldE5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3aXRoUmV0cnkoXG4gICAgKCkgPT5cbiAgICAgIG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIGluY2x1ZGVzX3BhcmVudHM6IGZhbHNlLFxuICAgICAgICB0YXJnZXRzOiAnYnJhbmNoJyxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pLFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xuICBjb25zdCBydWxlc2V0cyA9IHJlc3BvbnNlLmRhdGE7XG4gIGlmICghQXJyYXkuaXNBcnJheShydWxlc2V0cykpIHJldHVybjtcbiAgcmV0dXJuIHJ1bGVzZXRzLmZpbmQoKHJ1bGVzZXQpID0+IHJ1bGVzZXQubmFtZSA9PT0gcnVsZXNldE5hbWUgJiYgcnVsZXNldC5zb3VyY2VfdHlwZSA9PT0gJ1JlcG9zaXRvcnknKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIHJldHVybiBzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMyB8fCBzdGF0dXMgPT09IDQwNDtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSBzb2RpdW1Nb2R1bGUgZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnLCAnR0hfQk9UX1BBVCcsICdQVUJMSUNfR0hfQk9UX1BBVCddO1xuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVudicpLCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIERFUFJFQ0FURURfU0VDUkVUX05BTUVTKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGNvbnN0IHNvZGl1bSA9IGdldFNvZGl1bSgpO1xuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUicgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUInXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U29kaXVtKCk6IHR5cGVvZiBzb2RpdW1Nb2R1bGUge1xuICAvLyBsaWJzb2RpdW0td3JhcHBlcnMnIEVTTSBlbnRyeSBjYW4gYmluZCB0byBsaWJzb2RpdW1AMC44LjMsIHdob3NlIGRlZmF1bHRcbiAgLy8gZXhwb3J0IG5vIGxvbmdlciBleHBvc2VzIHJlYWR5LiBUaGUgQ29tbW9uSlMgZW50cnkga2VlcHMgdGhlIEFQSSBzaGFwZS5cbiAgcmV0dXJuIHJlcXVpcmUoJ2xpYnNvZGl1bS13cmFwcGVycycpIGFzIHR5cGVvZiBzb2RpdW1Nb2R1bGU7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cEdpdEh1YlNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgc2V0dGluZ3MgbmVlZCBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB1bmxpa2UgZmlsZSBnZW5lcmF0aW9uLlxuICAgICAgYXdhaXQgd2l0aFJldHJ5KFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gTG9jYWwgd2JmeSBydW5zIG9mdGVuIGhhdmUgcHVzaCBwZXJtaXNzaW9uIHdpdGhvdXQgYWRtaW4gcGVybWlzc2lvbi5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cEdpdEh1YlNldHRpbmdzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8ICEoJ3N0YXR1cycgaW4gZXJyb3IpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlcnJvci5zdGF0dXMgPT09IDQwMSB8fCBlcnJvci5zdGF0dXMgPT09IDQwMyB8fCBlcnJvci5zdGF0dXMgPT09IDQwNDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgcGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciA9ICdfX1BNX1JVTl9fJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKG5ld0NvbnRlbnQsIGNvbmZpZyk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgY29udGVudCkgPiBjb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVRvbWwgfSBmcm9tICdzbW9sLXRvbWwnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICByZXBvQXV0aG9yPzogc3RyaW5nO1xuICByZXBvTmFtZT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQ2xvdWRmbGFyZTogYm9vbGVhbjtcbiAgaXNSYWlsd2F5OiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICAvLyBzb3VyY2UgY29kZSBmaWxlc1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRSdW50aW1lOiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgdGF1cmk6IGJvb2xlYW47XG4gICAgdmluZXh0OiBib29sZWFuO1xuICAgIHZpdGU6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gICAgY2hha3JhOiBib29sZWFuO1xuICAgIGRyaXp6bGU6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgaGFzVmVyc2lvblNldHRpbmdzOiBib29sZWFuO1xuICBtaXNlVGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVsZWFzZXJjSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY0pzb25QYXRoLCAndXRmOCcpKSBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICAgIHBsdWdpbnM/OiBzdHJpbmdbXVtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSBqc29uPy5icmFuY2hlcyA/PyBbXTtcbiAgICAgIHJlbGVhc2VQbHVnaW5zID0ganNvbj8ucGx1Z2lucz8uZmxhdCgpID8/IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGlzUm9vdCA9XG4gICAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nKSkgIT09ICdwYWNrYWdlcycgfHxcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCBoYXNWZXJzaW9uU2V0dGluZ3MgPSBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgcHJlZml4IG9mIFsnamF2YScsICdub2RlJywgJ3B5dGhvbiddKSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApKSkge1xuICAgICAgICBoYXNWZXJzaW9uU2V0dGluZ3MgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIFJlYWQgd2JmeS5qc29uXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9GdWxsTmFtZSA9IHR5cGVvZiByZXBvSW5mbz8uZnVsbF9uYW1lID09PSAnc3RyaW5nJyA/IHJlcG9JbmZvLmZ1bGxfbmFtZSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb0F1dGhvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXBvRnVsbE5hbWUpIHtcbiAgICAgIGNvbnN0IHJlcG9QYXJ0cyA9IHJlcG9GdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlcG9QYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXBvQXV0aG9yID0gcmVwb1BhcnRzWzBdO1xuICAgICAgICByZXBvTmFtZSA9IHJlcG9QYXJ0c1sxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHJlcG9GdWxsTmFtZSA/IGBnaXRodWI6JHtyZXBvRnVsbE5hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICAvLyBUYXVyaSBvZmZpY2lhbGx5IHN1cHBvcnRzIEpTT04sIEpTT041LCBhbmQgVE9NTCBjb25maWd1cmF0aW9uIGZvcm1hdHMuXG4gICAgY29uc3QgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyA9IFsndGF1cmkuY29uZi5qc29uJywgJ3RhdXJpLmNvbmYuanNvbjUnLCAnVGF1cmkudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NyYy10YXVyaScsIGZpbGVOYW1lKSlcbiAgICApO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0Nsb3VkZmxhcmU6IGRldGVjdENsb3VkZmxhcmUoZGlyUGF0aCwgcGFja2FnZUpzb24pLFxuICAgICAgaXNSYWlsd2F5OiBkZXRlY3RSYWlsd2F5KGRpclBhdGgsIHBhY2thZ2VKc29uKSxcbiAgICAgIGlzQnVuOlxuICAgICAgICByb290Q29uZmlnPy5pc0J1biB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2tiJykpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW4ubG9jaycpKSB8fFxuICAgICAgICAvLyBTb21lIHJlcG9zIGdpdGlnbm9yZSBidW4ubG9jaywgc28gaXQgbWF5IGJlIG1pc3Npbmcgb24gZnJlc2ggY2xvbmVzLlxuICAgICAgICAvLyBidW5maWcudG9tbCBpcyBjb21taXR0ZWQgYW5kIGdlbmVyYXRlZCBvbmx5IGZvciBCdW4gcHJvamVjdHMsIG1ha2luZyBpdCBhIHJlbGlhYmxlIHNpZ25hbC5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3NyYy10YXVyaS97dGF1cmkuY29uZi5qc29uLHRhdXJpLmNvbmYuanNvbjUsVGF1cmkudG9tbH0nLFxuICAgICAgICBkaXJQYXRoXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBjaGFrcmE6ICEhZGV2RGVwZW5kZW5jaWVzWydAY2hha3JhLXVpL2NsaSddLFxuICAgICAgICBkcml6emxlOiAhIWRlcGVuZGVuY2llc1snZHJpenpsZS1vcm0nXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZHJpenpsZS1raXQnXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcGxheXdyaWdodFJ1bnRpbWU6IGRvZXNJbXBvcnRQbGF5d3JpZ2h0QXRSdW50aW1lKGRpclBhdGgpLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHRhdXJpOlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICAgIHZpbmV4dDogISFkZXBlbmRlbmNpZXMudmluZXh0IHx8ICEhZGV2RGVwZW5kZW5jaWVzLnZpbmV4dCxcbiAgICAgICAgdml0ZTogISFkZXBlbmRlbmNpZXMudml0ZSB8fCAhIWRldkRlcGVuZGVuY2llcy52aXRlLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICBoYXNWZXJzaW9uU2V0dGluZ3MsXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY3VycmVudCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgcmV0dXJuIChcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnbWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5taXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLnRvb2wtdmVyc2lvbnMnKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0Q2xvdWRmbGFyZShkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygnd3JhbmdsZXInKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChcbiAgICBbJ3dyYW5nbGVyLmpzb25jJywgJ3dyYW5nbGVyLmpzb24nLCAnd3JhbmdsZXIudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpKVxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dGaWxlc01hdGNoKGRpclBhdGgsIC9jbG91ZGZsYXJlfHdyYW5nbGVyL2l1KTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UmFpbHdheShkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygncmFpbHdheScpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmFpbHdheWlnbm9yZScpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS5qc29uJykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dGaWxlc01hdGNoKGRpclBhdGgsIC9yYWlsd2F5L2l1KTtcbn1cblxuZnVuY3Rpb24gd29ya2Zsb3dGaWxlc01hdGNoKGRpclBhdGg6IHN0cmluZywgcmVnZXg6IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpXG4gICAgICAuc29tZSgoZmlsZU5hbWUpID0+IC9cXC55YT9tbCQvaXUudGVzdChmaWxlTmFtZSkgJiYgd29ya2Zsb3dGaWxlTWF0Y2hlcyh3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSwgcmVnZXgpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtmbG93RmlsZU1hdGNoZXMod29ya2Zsb3dzUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCByZWdleDogUmVnRXhwKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JykpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gcGFyc2VUb21sKGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgeyB0YXNrcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MudGFza3MgPz8ge30pKSB7XG4gICAgICAgIHRhc2tzW25hbWVdID0gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHRlbXBvcmFyaWx5IGludmFsaWQgbWlzZSBmaWxlcyBzaG91bGQgbm90IGJsb2NrIG90aGVyIHdiZnkgZ2VuZXJhdG9ycy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhc2tzO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgLy8gUHJlc2VydmUgYXJyYXktZm9ybSBtaXNlIGNvbW1hbmRzIHNvIHJlY3Vyc2lvbiBjaGVja3MgY2FuIHN0aWxsIHNlZSBwYWNrYWdlIHNjcmlwdCBjYWxscy5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKS5qb2luKCdcXG4nKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiByZWFkTWlzZVRhc2tDb21tYW5kKCh2YWx1ZSBhcyB7IHJ1bj86IHVua25vd24gfSkucnVuKTtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIGRvZXNJbXBvcnRQbGF5d3JpZ2h0QXRSdW50aW1lKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlcyA9IGZnLmdsb2JTeW5jKCd7YXBwLHNyY30vKiovKi57Y2pzLGN0cyxqcyxqc3gsbWpzLG10cyx0cyx0c3h9Jywge1xuICAgIGRvdDogdHJ1ZSxcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgaWdub3JlOiBbLi4uZ2xvYklnbm9yZSwgJyoqL19fdGVzdHNfXy8qKicsICcqKi8qLnNwZWMuKicsICcqKi8qLnRlc3QuKicsICcqKi9wbGF5d3JpZ2h0LmNvbmZpZy4qJ10sXG4gIH0pO1xuICByZXR1cm4gZmlsZXMuc29tZSgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGUpLCAndXRmOCcpO1xuICAgIHJldHVybiAvXFxiZnJvbVxccytbJ1wiXXBsYXl3cmlnaHRbJ1wiXXxcXGJpbXBvcnRcXHMqXFwoXFxzKlsnXCJdcGxheXdyaWdodFsnXCJdXFxzKlxcKXxcXGJyZXF1aXJlXFxzKlxcKFxccypbJ1wiXXBsYXl3cmlnaHRbJ1wiXVxccypcXCkvdS50ZXN0KFxuICAgICAgY29udGVudFxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzLmZldGNoID8/IG9yaWdpbj8ucmVmcy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb25cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQoKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgcmV0dXJuIHsgZnVsbF9uYW1lOiByZWRpcmVjdGVkRnVsbE5hbWUgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3QgYWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm4gPSBTdHJpbmcucmF3YCg/OldpbGxCb29zdGVyfFdpbGxCb29zdGVyTGFiKWA7XG5jb25zdCBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zID0gW1xuICBuZXcgUmVnRXhwKGBeJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKGBeZ2l0aHViOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9odHRwczovL2dpdGh1YlxcXFwuY29tLyR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/c3NoOi8vZ2l0QGdpdGh1YlxcXFwuY29tWzovXSR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoYF4oPzpnaXRcXFxcKyk/Z2l0QGdpdGh1YlxcXFwuY29tOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsICd1JyksXG5dO1xuXG5pbnRlcmZhY2UgRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2Uge1xuICBkZXBlbmRlbmN5TmFtZTogc3RyaW5nO1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIHNlY3Rpb25OYW1lOiAodHlwZW9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cylbbnVtYmVyXTtcbiAgc3BlY2lmaWVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzID0gY29uZmlncy5mbGF0TWFwKGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyk7XG4gIGlmIChkaXNhbGxvd2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXRhaWxzID0gZGlzYWxsb3dlZFNvdXJjZXNcbiAgICAubWFwKFxuICAgICAgKHsgZGVwZW5kZW5jeU5hbWUsIGRpclBhdGgsIHNlY3Rpb25OYW1lLCBzcGVjaWZpZXIgfSkgPT5cbiAgICAgICAgYC0gJHtwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfTogJHtzZWN0aW9uTmFtZX0uJHtkZXBlbmRlbmN5TmFtZX0gdXNlcyAke3NwZWNpZmllcn1gXG4gICAgKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc2FsbG93ZWQgR2l0IGRlcGVuZGVuY3kgc291cmNlcyBmb3VuZC5cXG5Pbmx5IFdpbGxCb29zdGVyIGFuZCBXaWxsQm9vc3RlckxhYiBHaXRIdWIgZGVwZW5kZW5jaWVzIGFyZSBhbGxvd2VkLlxcbiR7ZGV0YWlsc31gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIGlmICghcGFja2FnZUpzb24pIHJldHVybiBbXTtcblxuICBjb25zdCBkaXNhbGxvd2VkU291cmNlczogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNlY3Rpb25OYW1lIG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBwYWNrYWdlSnNvbltzZWN0aW9uTmFtZV07XG4gICAgaWYgKCFzZWN0aW9uKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3lOYW1lLCBzcGVjaWZpZXJdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXNwZWNpZmllcikgY29udGludWU7XG4gICAgICBpZiAoIWlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuXG4gICAgICBkaXNhbGxvd2VkU291cmNlcy5wdXNoKHtcbiAgICAgICAgZGVwZW5kZW5jeU5hbWUsXG4gICAgICAgIGRpclBhdGg6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBzZWN0aW9uTmFtZSxcbiAgICAgICAgc3BlY2lmaWVyLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXNhbGxvd2VkU291cmNlcztcbn1cblxuZnVuY3Rpb24gaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86Yml0YnVja2V0fGdpc3R8Z2l0aHVifGdpdGxhYik6L3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15odHRwcz86XFwvXFwvKD86Yml0YnVja2V0XFwub3JnfGdpdGh1YlxcLmNvbXxnaXRsYWJcXC5jb20pXFwvL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpodHRwcz98c3NoKTpcXC9cXC9cXFMrXFwuZ2l0KD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXlteQFxcc10rQFteOlxcc10rOlxcUysoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQ6JykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0KycpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3NzaDovL2dpdEAnKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bYS16QS1aMC05XVtcXHcuLV0qXFwvW1xcdy4tXSsoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuZnVuY3Rpb24gaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3Qoc3BlY2lmaWVyKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeE5leHRDb25maWdKc29uIH0gZnJvbSAnLi9maXhlcnMvbmV4dENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGZpeFdiRGJDb21tYW5kIH0gZnJvbSAnLi9maXhlcnMvd2JEYkNvbW1hbmQuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhSYWlsd2F5aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24uanMnO1xuaW1wb3J0IHsgaW5zdGFsbEFnZW50U2tpbGxzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NraWxscy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlVHlwZVNjcmlwdEFwaSB9IGZyb20gJy4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGF3YWl0IHdpbGxib29zdGVyaWZ5UGF0aHMoYXJndi5wYXRocyBhcyBzdHJpbmdbXSwgYXJndi5za2lwRGVwcyk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgY29tcGlsZXIgc2VydmVyIHNwYXduZWQgZm9yIEFTVCBwYXJzaW5nIGtlZXBzIGFuIG9wZW4gSVBDXG4gICAgLy8gY2hhbm5lbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBwcmV2ZW50IHRoZSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAgIGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk7XG4gIH1cbiAgaWYgKGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnKSB7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2lsbGJvb3N0ZXJpZnlQYXRocyhwYXRoczogc3RyaW5nW10sIHNraXBEZXBzOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIHBhdGhzKSB7XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gZGlyZW50cy5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSkubWFwKChkKSA9PiBwYXRoLmpvaW4ocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcblxuICAgIGF3YWl0IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24oW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10pO1xuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHJvb3RDb25maWcpKVxuICAgICk7XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGZpeFJhaWx3YXlpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBza2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiYgZG9lc0NvbnRhaW5Kc09yVHMocm9vdENvbmZpZykpIHtcbiAgICAgICAgLy8gTW9ub3JlcG8gdmVyaWZpY2F0aW9uIGNhbiBpbnZva2Ugb3hsaW50IGZyb20gZXZlcnkgd29ya3NwYWNlLiBHaXZlXG4gICAgICAgIC8vIG5vbi1jb2RlIHBhY2thZ2VzIGEgbG9jYWwgY29uZmlnIHNvIG94bGludCBkb2VzIG5vdCBjbGltYiB0byB0aGVcbiAgICAgICAgLy8gcm9vdCBjb25maWcgYW5kIHJlamVjdCByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIGZyb20gYSBwYWNrYWdlIGN3ZC5cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIGF3YWl0IGZpeFdiRGJDb21tYW5kKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbigncmVmcmVzaEJ1bkxvY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG5cbiAgICBhd2FpdCBpbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZyk7XG4gIH1cbiAgcmV0dXJuIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoKTtcbiAgaWYgKHN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlsxMiwxMywxNCwxNSwxNiwxN10sIm1hcHBpbmdzIjoiOHRCQUFBLGVBQXNCLEdBQU0sRUFBcUMsQ0FDL0QsT0FBTyxJQUFJLFFBQVMsR0FBWSxXQUFXLEVBQVMsQ0FBWSxDQUFDLENBQ25FLENDaUNBLGVBQXNCLEdBQW9CLEVBQThDLENBQ3RGLEdBQUksQ0FDRixPQUFPLE1BQU0sRUFBRyxDQUNsQixNQUFRLENBRVIsQ0FDRixDQUVBLGVBQXNCLEVBQXFCLEVBQThDLENBQ3ZGLEdBQUksQ0FDRixPQUFPLE1BQU0sRUFBRyxDQUNsQixPQUFTLEVBQU8sQ0FDZCxHQUFJLE9BQU8sR0FBVSxVQUFZLEdBQVMsU0FBVSxHQUFTLEVBQU0sT0FBUyxTQUMxRSxPQUVGLE1BQU0sQ0FDUixDQUNGLENBMEJBLGVBQXNCLEdBQ3BCLEVBQ0EsQ0FDRSxjQUNBLGNBQ0EsYUFBYSxFQUNiLGNBQ0EsY0FDQSxvQkFBb0IsRUFDcEIsMkJBQ2dCLENBQUMsRUFDUCxDQUNaLElBQUksRUFBYyxFQUNsQixPQUNFLEdB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
433
+ `.trim()};async function Do(n){return b.functionIgnoringException(`generateGitHubTemplates`,async()=>{if(n.isWillBoosterRepo)for(let[r,i]of Object.entries(Eo)){let a=Oo(i,n),o=t.resolve(n.dirPath,`.github`,r);e.existsSync(o)&&g(await e.promises.readFile(o,`utf8`),a)>a.length/2||(await e.promises.mkdir(t.resolve(n.dirPath,`.github`),{recursive:!0}),await S.run(()=>x.generateFile(o,a)))}})}function Oo(e,t){let n=t.isBun?`bun run`:`yarn`;return e.replaceAll(To,n)}const ko=_.object({typos:_.object({all:_.record(_.string(),_.string()).optional(),doc:_.record(_.string(),_.string()).optional(),ts:_.record(_.string(),_.string()).optional(),text:_.record(_.string(),_.string()).optional()}).optional()});async function Ao(n,r){let i=t.resolve(n,`package.json`);try{let a=e.existsSync(i),s={},c={},l={},u=!1;if(a){let t=e.readFileSync(i,`utf8`);l=JSON.parse(t),s=l.dependencies??{},c=l.devDependencies??{},u=l.type===`module`}let d=[],f=[];try{let e=t.resolve(n,`.releaserc.json`),r=JSON.parse(await o.readFile(e,`utf8`));d=r?.branches??[],f=r?.plugins?.flat()??[]}catch{}let p=t.basename(t.resolve(n,`..`))!==`packages`||!e.existsSync(t.resolve(n,`..`,`..`,`package.json`)),m;p&&(m=await Bo(n,l));let h=jo(n);for(let r of[`java`,`node`,`python`])if(e.existsSync(t.resolve(n,`.${r}-version`))){h=!0;break}let ee=``;try{ee=await o.readFile(t.resolve(n,`Dockerfile`),`utf8`)}catch{}let te=t.resolve(n,`wbfy.json`),ne;try{let e=await o.readFile(te,`utf8`);ne=ko.parse(JSON.parse(e))}catch{}let g=typeof m?.full_name==`string`?m.full_name:void 0,re,_;if(g){let e=g.split(`/`);e.length>=2&&(re=e[0],_=e[1])}let ie=g?`github:${g}`:void 0,ae=[`tauri.conf.json`,`tauri.conf.json5`,`Tauri.toml`].some(r=>e.existsSync(t.resolve(n,`src-tauri`,r))),v={dirPath:n,dockerfile:ee,isRoot:p,isPublicRepo:m?.private===!1,isReferredByOtherRepo:!!l.files,repository:ie,repoAuthor:re,repoName:_,isWillBoosterRepo:!!(ie?.startsWith(`github:WillBooster/`)||ie?.startsWith(`github:WillBoosterLab/`)),isCloudflare:Mo(n,l),isRailway:No(n,l),isBun:r?.isBun||e.existsSync(t.join(n,`bun.lockb`))||e.existsSync(t.join(n,`bun.lock`))||e.existsSync(t.join(n,`bunfig.toml`)),isEsmPackage:u,isWillBoosterConfigs:i.includes(`/willbooster-configs`),cargoTomlDirPaths:Ro(n),doesContainSubPackageJsons:$(`packages/**/package.json`,n),doesContainDockerfile:!!ee||e.existsSync(t.resolve(n,`docker-compose.yml`)),doesContainGemfile:e.existsSync(t.resolve(n,`Gemfile`)),doesContainGoMod:e.existsSync(t.resolve(n,`go.mod`)),doesContainPackageJson:e.existsSync(t.resolve(n,`package.json`)),doesContainPoetryLock:e.existsSync(t.resolve(n,`poetry.lock`)),doesContainUvLock:e.existsSync(t.resolve(n,`uv.lock`)),doesContainPomXml:e.existsSync(t.resolve(n,`pom.xml`)),doesContainPubspecYaml:e.existsSync(t.resolve(n,`pubspec.yaml`)),doesContainTauriConfig:ae,doesContainTauriConfigInPackages:$(`packages/**/src-tauri/{tauri.conf.json,tauri.conf.json5,Tauri.toml}`,n),doesContainTemplateYaml:e.existsSync(t.resolve(n,`template.yaml`)),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,`.vscode`,`settings.json`)),doesContainJavaScript:$(`{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}`,n),doesContainTypeScript:$(`{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}`,n),doesContainJsxOrTsx:$(`{app,src,test}/**/*.{t,j}sx`,n),doesContainJava:$(`**/*.java`,n),doesContainJavaScriptInPackages:$(`packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}`,n),doesContainTypeScriptInPackages:$(`packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}`,n),doesContainJsxOrTsxInPackages:$(`packages/**/{app,src,test}/**/*.{t,j}sx`,n),doesContainJavaInPackages:$(`packages/**/*.java`,n),depending:{blitz:!!s.blitz,chakra:!!c[`@chakra-ui/cli`],drizzle:!!s[`drizzle-orm`]||!!c[`drizzle-kit`],firebase:!!c[`firebase-tools`],genI18nTs:!!s[`gen-i18n-ts`]||!!c[`gen-i18n-ts`],litestream:ee.includes(`install-litestream.sh`),react:!!s.react,next:!!s.next,playwrightTest:!!s[`@playwright/test`]||!!c[`@playwright/test`]||!!c.playwright,playwrightRuntime:zo(n),prisma:!!s[`@prisma/client`]||!!c.prisma,pyright:!!c.pyright,reactNative:!!s[`react-native`],semanticRelease:!!(c[`semantic-release`]||d.length>0||f.length>0),storybook:!!c[`@storybook/react`],tauri:!!s[`@tauri-apps/api`]||!!c[`@tauri-apps/api`]||!!s[`@tauri-apps/cli`]||!!c[`@tauri-apps/cli`]||ae,vinext:!!s.vinext||!!c.vinext,vite:!!s.vite||!!c.vite,wb:!!s[`@willbooster/wb`]||!!c[`@willbooster/wb`]},release:{branches:d,github:f.includes(`@semantic-release/github`),npm:f.includes(`@semantic-release/npm`)},hasVersionSettings:h,miseTasks:await Io(n),packageJson:l,wbfyJson:ne};if(v.doesContainGemfile||v.doesContainGoMod||v.doesContainPackageJson||v.doesContainPoetryLock||v.doesContainUvLock||v.doesContainPomXml||v.doesContainPubspecYaml||v.doesContainTauriConfig||v.doesContainTemplateYaml)return v}catch{}}function jo(n){let r=t.resolve(n);return e.existsSync(t.join(r,`mise.toml`))||e.existsSync(t.join(r,`.mise.toml`))||e.existsSync(t.join(r,`.tool-versions`))}function Mo(n,r){let i=r.scripts;return i&&Object.values(i).some(e=>typeof e==`string`&&e.includes(`wrangler`))||[`wrangler.jsonc`,`wrangler.json`,`wrangler.toml`].some(r=>e.existsSync(t.resolve(n,r)))?!0:Po(n,/cloudflare|wrangler/iu)}function No(n,r){let i=r.scripts;return i&&Object.values(i).some(e=>typeof e==`string`&&e.includes(`railway`))||e.existsSync(t.resolve(n,`.railwayignore`))||e.existsSync(t.resolve(n,`railway.json`))?!0:Po(n,/railway/iu)}function Po(n,r){let i=t.resolve(n,`.github`,`workflows`);try{return e.readdirSync(i).some(e=>/\.ya?ml$/iu.test(e)&&Fo(i,e,r))}catch{return!1}}function Fo(n,r,i){try{return i.test(e.readFileSync(t.join(n,r),`utf8`))}catch{return!1}}async function Io(e){let n={};for(let r of[`mise.toml`,`.mise.toml`]){let i=t.resolve(e,r);try{let e=f(await o.readFile(i,`utf8`));for(let[t,r]of Object.entries(e.tasks??{}))n[t]=Lo(r)}catch{}}return n}function Lo(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>typeof e==`string`).join(`
434
+ `):e&&typeof e==`object`?Lo(e.run):``}function $(e,t){return s.globSync(e,{dot:!0,cwd:t,ignore:E}).length>0}function Ro(e){return s.globSync(`**/Cargo.toml`,{dot:!0,cwd:e,ignore:E}).map(e=>t.dirname(e)).toSorted((e,t)=>e.split(`/`).length-t.split(`/`).length||e.localeCompare(t))}function zo(n){return s.globSync(`{app,src}/**/*.{cjs,cts,js,jsx,mjs,mts,ts,tsx}`,{dot:!0,cwd:n,ignore:[...E,`**/__tests__/**`,`**/*.spec.*`,`**/*.test.*`,`**/playwright.config.*`]}).some(r=>{let i=e.readFileSync(t.resolve(n,r),`utf8`);return/\bfrom\s+['"]playwright['"]|\bimport\s*\(\s*['"]playwright['"]\s*\)|\brequire\s*\(\s*['"]playwright['"]\s*\)/u.test(i)})}async function Bo(e,t){let n=(await re(e).getRemotes(!0)).find(e=>e.name===`origin`),r=n?.refs.fetch??n?.refs.push;if(typeof r==`string`){let e=await Vo(r);if(e)return e}let i=typeof t.repository==`string`?t.repository:t.repository?.url;if(i){let e=await Vo(i);if(e&&e.message!==`Not Found`)return e}}async function Vo(e){let[t,n]=W.getOrgAndName(e);if(!(!t||!n))try{return(await G().request(`GET /repos/{owner}/{repo}`,{owner:t,repo:n})).data}catch(e){let t=Ho(e);if(t)return{full_name:t}}}function Ho(e){if(!e||typeof e!=`object`)return;let t=`response`in e?e.response:void 0,n=t?.status??e.status;if(n!==301&&n!==302)return;let r=t?.headers?.location;if(typeof r!=`string`)return;let[i,a]=W.getOrgAndName(r);if(!(!i||!a))return`${i}/${a}`}const Uo=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Wo=String.raw`(?:WillBooster|WillBoosterLab)`,Go=[RegExp(`^${Wo}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^github:${Wo}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?https://github\\.com/${Wo}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?ssh://git@github\\.com[:/]${Wo}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?git@github\\.com:${Wo}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`)];function Ko(e){let n=e.flatMap(qo);if(n.length===0)return;let r=n.map(({dependencyName:e,dirPath:n,sectionName:r,specifier:i})=>`- ${t.join(n,`package.json`)}: ${r}.${e} uses ${i}`).join(`
435
+ `);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function qo(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of Uo){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&Jo(a)&&(Xo(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function Jo(e){return Yo(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 Yo(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function Xo(e){return Go.some(t=>t.test(e))}async function Zo(){let e=await n(process.argv.slice(2)).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({env:{description:`Upload environment variables as secrets to GitHub`,type:`boolean`,default:!1,alias:`e`},skipDeps:{description:`Skip dependency installation`,type:`boolean`,default:!1,alias:`d`},verbose:{description:`Whether or not to enable verbose mode`,type:`boolean`,default:!1,alias:`v`}}).version(es()).strict().argv;y.isVerbose=e.verbose,y.doesUploadEnvVars=e.env;let t=!1;try{t=await Qo(e.paths,e.skipDeps)}finally{ue()}t&&(process.exitCode=1)}async function Qo(n,r){let i=!1;for(let a of n){let n=t.join(a,`packages`),o=(await ae(()=>e.promises.readdir(n,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(n,e.name));await Ht([a,...o]);let s=await Ao(a);if(y.isVerbose,!s){console.error(`there is no valid package.json in ${a}`),i=!0;continue}let c=on(s),l=[s,...(await Promise.all(o.map(e=>Ao(e,s)))).filter(e=>!!e)];if(y.isVerbose)for(let e of l)console.info(e);Ko(l),await mr(s),s.isBun&&await On(s);let u=!Qt(s.repository)&&(s.repository?.startsWith(`github:WillBooster/`)||s.repository?.startsWith(`github:WillBoosterLab/`));await Promise.all([We(s),c.then(()=>ka(s)),gn(s,l),Rn(s),Bn(s),Un(s,l),Wn(s),Kn(s),Do(s),Qn(s),Oa(s),Fa(s),Na(s),...u?[Zt(s)]:[],lo(s),mo(s),xo(s),Co(s),ia(s),ma(s)]),await S.promiseAll();let d=[];for(let e of l)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Wt(e,e.isRoot?l:[e])),e.depending.playwrightTest&&d.push(Ee(e)),e.depending.next&&d.push(fe(e)),await Jn(e,s),await S.promiseAll(),!(!e.isRoot&&!e.doesContainPackageJson)&&(await Ta(e),await Ar(e,s,r),d.push(ma(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&d.push(so(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Ba(e)),C(e)?(d.push(va(e)),d.push(ba(e,s))):!e.isRoot&&e.doesContainPackageJson&&C(s)&&d.push(ba(e,s)),e.depending.pyright&&d.push(Da(e)));await Promise.all(d),await S.promiseAll(),await fn(s,l);let f=s.isBun?`bun`:`yarn`;s.isBun?await b.functionIgnoringException(`refreshBunLock`,async()=>{await Promise.resolve(),$o(a)}):H(f,[`install`,`--no-immutable`],a),H(f,[`cleanup`],a),await La(s)}return i}function $o(e){let t=nr(`bun`,[`install`],e);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}function es(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,`package.json`));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`)).version}await Zo();
436
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZnMiLCJmcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNvbW1vbkNvbnRlbnQiLCJjaGlsZFByb2Nlc3MiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJjb3JlIiwiZXNjYXBlUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwibWFuYWdlZENvbmZpZ0Jsb2NrcyIsImdldENvbmZpZ0NvbnRlbnQiLCJqc29uT2JqIiwiaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IiLCJmc3AiLCJwYXJzZVRvbWwiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliL3NyYy9zbGVlcC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi9zcmMvZml4ZXJzL3Rlc3REaXJlY3RvcnkudHMiLCIuLi9zcmMvZml4ZXJzL3R5cGVEZWZpbml0aW9uLnRzIiwiLi4vc3JjL3V0aWxzL21lcmdlVXRpbC50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL2ZpeGVycy93YkRiQ29tbWFuZC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9jb25maWdDb250ZW50LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWFuYWdlZENvbmZpZ0Jsb2NrLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hmbXRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGxpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2UgPSBmYWxzZTtcbiAgZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpO1xuIiwiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5cbmNsYXNzIExvZ2dlciB7XG4gIGFzeW5jIGZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24obmFtZTogc3RyaW5nLCBmdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLSAke25hbWV9IHN0YXJ0IC0tLS0tLS0tLWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnVuYygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEVycm9yIG9jY3VycmVkIGluICR7bmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogU3RyaW5nKGVycm9yKX19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgKz0gJ1xcbic7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IEFQSSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvc3luYyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbi8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIChHbykgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGFuZCBub1xuLy8gbG9uZ2VyIGV4cG9zZXMgYW4gaW4tcHJvY2VzcyBwYXJzZXIgc3VjaCBhcyBgdHMuY3JlYXRlU291cmNlRmlsZWAuIFBhcnNpbmcgbm93XG4vLyBoYXBwZW5zIGluIGEgc3Bhd25lZCBjb21waWxlciBzZXJ2ZXIgcmVhY2hlZCB0aHJvdWdoIHRoZSBzeW5jaHJvbm91cyBBUEksIHNvIHdlXG4vLyBrZWVwIGEgc2luZ2xlIGxhemlseS1jcmVhdGVkIGluc3RhbmNlIGFuZCByZXVzZSBpdCBhY3Jvc3MgZXZlcnkgZml4ZXIgdG8gYXZvaWRcbi8vIHBheWluZyB0aGUgcHJvY2Vzcy1zcGF3biBjb3N0IHBlciBmaWxlLlxubGV0IGFwaTogQVBJIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRBcGkoKTogQVBJIHtcbiAgcmV0dXJuIChhcGkgPz89IG5ldyBBUEkoeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSkpO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHNvdXJjZSBmaWxlIGludG8gYSBUeXBlU2NyaXB0IEFTVCB1c2luZyB0aGUgYnVuZGxlZCBuYXRpdmUgY29tcGlsZXIuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGNvbXBpbGVyIGNhbm5vdCBsb2FkIHRoZSBmaWxlIChlLmcuIGl0IGlzIG1pc3NpbmdcbiAqIG9yIHVucGFyc2FibGUpIHNvIGNhbGxlcnMgY2FuIGZhbGwgYmFjayB0byBjb25zZXJ2YXRpdmUgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFNvdXJjZUZpbGUgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gZ2V0QXBpKCkudXBkYXRlU25hcHNob3QoeyBvcGVuRmlsZXM6IFtmaWxlUGF0aF0gfSk7XG4gICAgcmV0dXJuIHNuYXBzaG90LmdldERlZmF1bHRQcm9qZWN0Rm9yRmlsZShmaWxlUGF0aCk/LnByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaHV0cyBkb3duIHRoZSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlci4gVGhlIHNlcnZlciBrZWVwcyBhbiBvcGVuIElQQyBjaGFubmVsXG4gKiB0aGF0IHdvdWxkIG90aGVyd2lzZSBrZWVwIHRoZSBOb2RlLmpzIGV2ZW50IGxvb3AgYWxpdmUsIHNvIHdiZnkgbXVzdCBjYWxsIHRoaXNcbiAqIG9uY2UgaXRzIHJ1biBmaW5pc2hlcyBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk6IHZvaWQge1xuICBhcGk/LmNsb3NlKCk7XG4gIGFwaSA9IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG4vLyBTZXR0aW5ncyBldmVyeSBXaWxsQm9vc3RlciBOZXh0LmpzIHByb2plY3Qgc2hvdWxkIGNhcnJ5LiBgbmFtZWAgaXMgdGhlIHRvcC1sZXZlbFxuLy8gcHJvcGVydHkga2V5IHVzZWQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHNldHRpbmcgYWxyZWFkeSBleGlzdHM7IGB0ZXh0YCBpcyBpbnNlcnRlZFxuLy8gdmVyYmF0aW0gKGEgd2hvbGUgYGtleTogdmFsdWVgIHBhaXIpIHdoZW4gdGhlIGtleSBpcyBtaXNzaW5nLlxuY29uc3QgbWFuYWdlZFByb3BlcnRpZXM6IHJlYWRvbmx5IHsgbmFtZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVtdID0gW1xuICB7IG5hbWU6ICdyZWFjdENvbXBpbGVyJywgdGV4dDogJ3JlYWN0Q29tcGlsZXI6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3JlYWN0U3RyaWN0TW9kZScsIHRleHQ6ICdyZWFjdFN0cmljdE1vZGU6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB0ZXh0OiAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9JyB9LFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeE5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeE5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWyd0cycsICdtdHMnLCAnY3RzJywgJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBleHRyYWN0ZWQgPSBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWQpIHJldHVybjtcbiAgICBjb25zdCB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9ID0gZXh0cmFjdGVkO1xuXG4gICAgLy8gYHByb3BlcnRpZXNgIGluY2x1ZGVzIHNwcmVhZCBhc3NpZ25tZW50cyAoYC4uLnJlc3RgKSB0aGF0IGNhcnJ5IG5vIG5hbWUsIHNvIGd1YXJkIGJlZm9yZSByZWFkaW5nIGl0LlxuICAgIGNvbnN0IGV4aXN0aW5nUHJvcGVydGllcyA9IG5ldyBTZXQoXG4gICAgICBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT5cbiAgICAgICAgJ25hbWUnIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm5hbWUgPyBnZXRQcm9wZXJ0eUtleShwcm9wZXJ0eS5uYW1lLCBzb3VyY2UpIDogdW5kZWZpbmVkXG4gICAgICApXG4gICAgKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzID0gbWFuYWdlZFByb3BlcnRpZXNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5KSA9PiAhZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcyhwcm9wZXJ0eS5uYW1lKSlcbiAgICAgIC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS50ZXh0KTtcbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBzb3VyY2UudGV4dDtcbiAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG9iamVjdExpdGVyYWwuZ2V0RW5kKCkgLSAxO1xuICAgIC8vIFRoZSBuYXRpdmUgVFMgQVNUIGRvZXMgbm90IHJlbGlhYmx5IGV4cG9zZSBgcHJvcGVydGllcy5oYXNUcmFpbGluZ0NvbW1hYCwgc28gc2NhbiB0aGUgc291cmNlXG4gICAgLy8gYmV0d2VlbiB0aGUgbGFzdCBwcm9wZXJ0eSBhbmQgdGhlIGNsb3NpbmcgYnJhY2UuIFN0cmlwIGNvbW1lbnRzIGZpcnN0IHNvIGEgY29tbWEgaW5zaWRlIGFcbiAgICAvLyB0cmFpbGluZyBjb21tZW50IChlLmcuIGBmb286IDEgLy8gYSwgYmApIGlzIG5vdCBtaXN0YWtlbiBmb3IgYSByZWFsIHRyYWlsaW5nIGNvbW1hLlxuICAgIGNvbnN0IGxhc3RQcm9wZXJ0eSA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5hdCgtMSk7XG4gICAgY29uc3QgaGFzVHJhaWxpbmdDb21tYSA9IGxhc3RQcm9wZXJ0eVxuICAgICAgPyBzdHJpcENvbW1lbnRzKG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkpLmluY2x1ZGVzKCcsJylcbiAgICAgIDogZmFsc2U7XG4gICAgY29uc3QgcHJlZml4ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgJiYgIWhhc1RyYWlsaW5nQ29tbWEgPyAnLCAnIDogJyc7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpfSR7cHJlZml4fSR7cHJvcGVydHlUZXh0cy5qb2luKCcsICcpfSR7b2xkQ29udGVudC5zbGljZShcbiAgICAgIGluc2VydGlvblBvaW50XG4gICAgKX1gO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogeyBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlOyBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCBkZWNsYXJlcyB0aGUgY29uZmlnIGFzIGBjb25zdCBuZXh0Q29uZmlnOiBOZXh0Q29uZmlnID0geyAuLi4gfWAgYW5kXG4gIC8vIGV4cG9ydHMgaXQgKHBvc3NpYmx5IHdyYXBwZWQsIGUuZy4gYHdpdGhTZW50cnlDb25maWcoLi4uKWApLCBzbyB0aGUgb2JqZWN0IGxpdGVyYWwgaXMgcmFyZWx5XG4gIC8vIHRoZSBkaXJlY3Qgb3BlcmFuZCBvZiBgZXhwb3J0IGRlZmF1bHRgL2Btb2R1bGUuZXhwb3J0c2AuIENvbGxlY3QgZXZlcnkgY2FuZGlkYXRlIGFuZCBwaWNrIHRoZVxuICAvLyBtb3N0IGF1dGhvcml0YXRpdmUgb25lIGJlbG93LlxuICBsZXQgZGlyZWN0T2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBsZXQgZXhwb3J0ZWRJZGVudGlmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMgPSBuZXcgTWFwPHN0cmluZywgYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uPigpO1xuICBjb25zdCB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25bXSA9IFtdO1xuXG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGFzdC5pc0V4cG9ydEFzc2lnbm1lbnQobm9kZSkpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuZXhwcmVzc2lvbik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBhc3QuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gYXN0LlN5bnRheEtpbmQuRXF1YWxzVG9rZW4gJiZcbiAgICAgIG5vZGUubGVmdC5nZXRUZXh0KHNvdXJjZSkgPT09ICdtb2R1bGUuZXhwb3J0cydcbiAgICApIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUucmlnaHQpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLnJpZ2h0KSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUucmlnaHQuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXN0LmlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSAmJiBub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmluaXRpYWxpemVyKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsICYmIGFzdC5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLnNldChub2RlLm5hbWUuZ2V0VGV4dChzb3VyY2UpLCBvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgLy8gQSBgOiBOZXh0Q29uZmlnYCBhbm5vdGF0aW9uIG9yIGEgYHNhdGlzZmllc2AvYGFzIE5leHRDb25maWdgIGFzc2VydGlvbiBtYXJrcyB0aGUgY2Fub25pY2FsXG4gICAgICAgIC8vIGNvbmZpZyBvYmplY3QgKGFjY2VwdGluZyBxdWFsaWZpZWQgbmFtZXMgc3VjaCBhcyBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2ApLlxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uVHlwZSA9IG5vZGUudHlwZT8uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgICBjb25zdCBhc3NlcnRlZFR5cGUgPSBnZXRBc3NlcnRlZFR5cGUobm9kZS5pbml0aWFsaXplcik/LmdldFRleHQoc291cmNlKTtcbiAgICAgICAgY29uc3QgaXNUeXBlZEFzTmV4dENvbmZpZyA9XG4gICAgICAgICAgKGFubm90YXRpb25UeXBlICE9PSB1bmRlZmluZWQgJiYgaXNOZXh0Q29uZmlnVHlwZShhbm5vdGF0aW9uVHlwZSkpIHx8XG4gICAgICAgICAgKGFzc2VydGVkVHlwZSAhPT0gdW5kZWZpbmVkICYmIGlzTmV4dENvbmZpZ1R5cGUoYXNzZXJ0ZWRUeXBlKSk7XG4gICAgICAgIGlmIChpc1R5cGVkQXNOZXh0Q29uZmlnKSB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzLnB1c2gob2JqZWN0TGl0ZXJhbCk7XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9XG4gICAgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsc1swXSA/P1xuICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz9cbiAgICAoZXhwb3J0ZWRJZGVudGlmaWVyID8gdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoZXhwb3J0ZWRJZGVudGlmaWVyKSA6IHVuZGVmaW5lZCkgPz9cbiAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldCgnbmV4dENvbmZpZycpO1xuICByZXR1cm4gb2JqZWN0TGl0ZXJhbCA/IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gOiB1bmRlZmluZWQ7XG59XG5cbi8vIFVud3JhcCBgKHsgLi4uIH0pYCAvIGB7IC4uLiB9IGFzIE5leHRDb25maWdgIC8gYHsgLi4uIH0gc2F0aXNmaWVzIE5leHRDb25maWdgIHRvIHRoZSBvYmplY3QgbGl0ZXJhbC5cbmZ1bmN0aW9uIHVud3JhcE9iamVjdExpdGVyYWwobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBjdXJyZW50ID0gdW53cmFwRXhwcmVzc2lvbihub2RlKTtcbiAgcmV0dXJuIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGN1cnJlbnQpID8gY3VycmVudCA6IHVuZGVmaW5lZDtcbn1cblxuLy8gUmV0dXJuIHRoZSBhc3NlcnRlZCB0eXBlIG9mIGEgYHNhdGlzZmllc2AvYGFzYCBleHByZXNzaW9uLCBpZiBhbnkgKGlnbm9yaW5nIHdyYXBwaW5nIHBhcmVudGhlc2VzKS5cbmZ1bmN0aW9uIGdldEFzc2VydGVkVHlwZShub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5UeXBlTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGN1cnJlbnQgPSB1bndyYXBQYXJlbnRoZXNlcyhub2RlKTtcbiAgcmV0dXJuIGFzdC5pc0FzRXhwcmVzc2lvbihjdXJyZW50KSB8fCBhc3QuaXNTYXRpc2ZpZXNFeHByZXNzaW9uKGN1cnJlbnQpID8gY3VycmVudC50eXBlIDogdW5kZWZpbmVkO1xufVxuXG4vLyBQZWVsIHBhcmVudGhlc2VzIGFuZCBgYXNgL2BzYXRpc2ZpZXNgIGFzc2VydGlvbnMgb2ZmIGFuIGV4cHJlc3Npb24uXG5mdW5jdGlvbiB1bndyYXBFeHByZXNzaW9uKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0Lk5vZGUge1xuICBsZXQgY3VycmVudDogYXN0Lk5vZGUgPSB1bndyYXBQYXJlbnRoZXNlcyhub2RlKTtcbiAgd2hpbGUgKGFzdC5pc0FzRXhwcmVzc2lvbihjdXJyZW50KSB8fCBhc3QuaXNTYXRpc2ZpZXNFeHByZXNzaW9uKGN1cnJlbnQpKSB7XG4gICAgY3VycmVudCA9IHVud3JhcFBhcmVudGhlc2VzKGN1cnJlbnQuZXhwcmVzc2lvbik7XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8vIFBlZWwgd3JhcHBpbmcgcGFyZW50aGVzZXMgb2ZmIGFuIGV4cHJlc3Npb24uXG5mdW5jdGlvbiB1bndyYXBQYXJlbnRoZXNlcyhub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5FeHByZXNzaW9uIHtcbiAgbGV0IGN1cnJlbnQgPSBub2RlO1xuICB3aGlsZSAoYXN0LmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oY3VycmVudCkpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5leHByZXNzaW9uO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyBNYXRjaCBib3RoIHRoZSBiYXJlIGBOZXh0Q29uZmlnYCBhbmQgcXVhbGlmaWVkIGZvcm1zIGxpa2UgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgLlxuZnVuY3Rpb24gaXNOZXh0Q29uZmlnVHlwZSh0eXBlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlVGV4dCA9PT0gJ05leHRDb25maWcnIHx8IHR5cGVUZXh0LmVuZHNXaXRoKCcuTmV4dENvbmZpZycpO1xufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBrZXkgd2l0aG91dCBzdXJyb3VuZGluZyBxdW90ZXMsIHNvIGAncmVhY3RDb21waWxlcidgIG1hdGNoZXMgYHJlYWN0Q29tcGlsZXJgLlxuLy8gSWRlbnRpZmllciwgc3RyaW5nLWxpdGVyYWwgYW5kIG51bWVyaWMtbGl0ZXJhbCBuYW1lcyBhbGwgZXhwb3NlIHRoZSB1bnF1b3RlZCB2YWx1ZSB2aWEgYC50ZXh0YC5cbmZ1bmN0aW9uIGdldFByb3BlcnR5S2V5KG5hbWU6IGFzdC5Qcm9wZXJ0eU5hbWUsIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmcge1xuICByZXR1cm4gJ3RleHQnIGluIG5hbWUgJiYgdHlwZW9mIG5hbWUudGV4dCA9PT0gJ3N0cmluZycgPyBuYW1lLnRleHQgOiBuYW1lLmdldFRleHQoc291cmNlKTtcbn1cblxuLy8gUmVtb3ZlIGxpbmUgYW5kIGJsb2NrIGNvbW1lbnRzIGZyb20gYSBzb3VyY2Ugc25pcHBldC5cbmZ1bmN0aW9uIHN0cmlwQ29tbWVudHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvXFwvXFwvW15cXG5dKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csICcnKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnaXNCdW4nPik6ICdidW4nIHwgJ3lhcm4nIHtcbiAgcmV0dXJuIGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgT2JqZWN0TWVtYmVyID0geyBraW5kOiAnZXh0cmEnOyBpbmRleDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdwcm9wZXJ0eSc7IGtleTogc3RyaW5nIH07XG5pbnRlcmZhY2UgUGFyc2VkT2JqZWN0IHtcbiAgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXTtcbiAgbWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT47XG59XG5pbnRlcmZhY2UgRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB7XG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7XG4gIG5vZGU6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0czogYm9vbGVhbik6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IHVzZSA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb24nXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSk7XG5cbiAgaWYgKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKSB7XG4gICAgdXNlLnByb3BlcnRpZXMuYmFzZVVSTCA9IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyk7XG4gICAgdXNlLm1lbWJlck9yZGVyLnVuc2hpZnQoeyBraW5kOiAncHJvcGVydHknLCBrZXk6ICdiYXNlVVJMJyB9KTtcbiAgfVxuXG4gIHJldHVybiB0b1BhcnNlZE9iamVjdCh7XG4gICAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICAgIHVzZTogeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHVzZSB9LFxuICAgIC4uLihzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0c1xuICAgICAgPyB7XG4gICAgICAgICAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgICAgICAgICBjb21tYW5kOiBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZChjb25maWcpKSxcbiAgICAgICAgICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICAgICAgICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICAgICAgICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgICAgICAgICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyA9XG4gICAgICAoYXdhaXQgZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKSkgJiYgc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnLCBwYXJzZWQpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpO1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKG1lcmdlZCwgZGVmYXVsdENvbmZpZyk7XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChtZXJnZWQsIGNvbmZpZyk7XG5cbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5VmFsdWUoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlZCB9LCAwKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UudGV4dDtcbiAgICBjb25zdCBzdGFydCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRTdGFydChleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgY29uc3QgZW5kID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIHN0YXJ0KX0ke25ld09iamVjdExpdGVyYWx9JHtvbGRDb250ZW50LnNsaWNlKGVuZCl9YDtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZTogUGFyc2VkT2JqZWN0LCBvdmVycmlkZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wZXJ0eUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG92ZXJyaWRlLnByb3BlcnRpZXMpKTtcbiAgY29uc3QgZXh0cmFNZW1iZXJzID0gWy4uLmJhc2UuZXh0cmFNZW1iZXJzLCAuLi5vdmVycmlkZS5leHRyYU1lbWJlcnNdO1xuICAvLyBLZWVwIGRlZmF1bHQtb25seSBtZW1iZXJzIGJlZm9yZSBwYXJzZWQgbWVtYmVycyBzbyBzcHJlYWRzIGFuZCBleHBsaWNpdCBsb2NhbCBwcm9wZXJ0aWVzIHJldGFpbiBwcmVjZWRlbmNlLlxuICBjb25zdCBtZW1iZXJPcmRlciA9IFtcbiAgICAuLi5iYXNlLm1lbWJlck9yZGVyLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPT0gJ3Byb3BlcnR5JyB8fCAhb3ZlcnJpZGVQcm9wZXJ0eUtleXMuaGFzKG1lbWJlci5rZXkpKSxcbiAgICAuLi5vdmVycmlkZS5tZW1iZXJPcmRlci5tYXAoKG1lbWJlcik6IE9iamVjdE1lbWJlciA9PiB7XG4gICAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHJldHVybiBtZW1iZXI7XG4gICAgICByZXR1cm4geyBraW5kOiAnZXh0cmEnLCBpbmRleDogYmFzZS5leHRyYU1lbWJlcnMubGVuZ3RoICsgbWVtYmVyLmluZGV4IH07XG4gICAgfSksXG4gIF07XG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7IC4uLmJhc2UucHJvcGVydGllcyB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZS5wcm9wZXJ0aWVzKSkge1xuICAgIHByb3BlcnRpZXNba2V5XSA9IG1lcmdlUGFyc2VkVmFsdWUocHJvcGVydGllc1trZXldLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHsgZXh0cmFNZW1iZXJzLCBtZW1iZXJPcmRlciwgcHJvcGVydGllcyB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZFZhbHVlKGJhc2U6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkLCBvdmVycmlkZTogUGFyc2VkVmFsdWUpOiBQYXJzZWRWYWx1ZSB7XG4gIGlmIChiYXNlPy5raW5kID09PSAnb2JqZWN0JyAmJiBvdmVycmlkZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2UudmFsdWUsIG92ZXJyaWRlLnZhbHVlKSB9O1xuICB9XG4gIHJldHVybiBvdmVycmlkZTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMoY29uZmlnOiBQYXJzZWRPYmplY3QsIGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB1c2UgPSBjb25maWcucHJvcGVydGllcy51c2U7XG4gIGNvbnN0IGRlZmF1bHRVc2UgPSBkZWZhdWx0Q29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBpZiAodXNlPy5raW5kICE9PSAnb2JqZWN0JyB8fCBkZWZhdWx0VXNlPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIFsndHJhY2UnLCAnc2NyZWVuc2hvdCcsICd2aWRlbyddKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV07XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwYXJzZWQ6IFBhcnNlZE9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fFxuICAgIHBhcnNlZC5wcm9wZXJ0aWVzLndlYlNlcnZlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgZG9lc09iamVjdEhhdmVCYXNlVXJsKHBhcnNlZC5wcm9wZXJ0aWVzLnVzZSkgfHxcbiAgICBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkIH0sICdORVhUX1BVQkxJQ19CQVNFX1VSTCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRvZXNPYmplY3RIYXZlQmFzZVVybCh2YWx1ZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlPy5raW5kID09PSAnb2JqZWN0JyAmJiB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzLmJhc2VVUkwgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwodmFsdWU6IFBhcnNlZFZhbHVlLCBsaXRlcmFsVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZS5pbmNsdWRlcyhsaXRlcmFsVGV4dCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSByZXR1cm4gdmFsdWUudmFsdWUuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpO1xuICByZXR1cm4gKFxuICAgIHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVycy5zb21lKChtZW1iZXIpID0+IG1lbWJlci5pbmNsdWRlcyhsaXRlcmFsVGV4dCkpIHx8XG4gICAgT2JqZWN0LnZhbHVlcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGdldEVudkZpbGVQYXRocyhkaXJQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgLy8gU29tZSBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb25seSBkZWZpbmUgYnJvd3NlciBwcm9qZWN0cyBvciBmaXh0dXJlcyBhbmQgZG8gbm90XG4gIC8vIHN0YXJ0IGEgd2ViIGFwcC4gQXZvaWQgZm9yY2luZyBhbiBhcHAtc2VydmVyIFVSTCBpbnRvIHRob3NlIHBhY2thZ2VzLlxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEVudkZpbGVQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVudkZpbGVOYW1lcyA9IFsnLmVudicsICcuZW52LnRlc3QnLCAnLmVudi5leGFtcGxlJywgJ21pc2UudG9tbCcsICdtaXNlLnRlc3QudG9tbCddO1xuICBjb25zdCBlbnZGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpKSB7XG4gICAgZW52RmlsZVBhdGhzLnB1c2goLi4uZW52RmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG5cbiAgICAvLyBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb2Z0ZW4gbGl2ZSBpbiBwYWNrYWdlcy8qIHdoaWxlIHNoYXJlZCBlbnYgZmlsZXMgbGl2ZSBhdCB0aGVcbiAgICAvLyByZXBvc2l0b3J5IHJvb3QsIHNvIHdhbGsgdXB3YXJkIHVudGlsIHRoZSB0YXJnZXQgcmVwbyBib3VuZGFyeS5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsICcuZ2l0JykpKSBicmVhaztcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZW52RmlsZVBhdGhzO1xufVxuXG5mdW5jdGlvbiBzZXRXZWJTZXJ2ZXJDb21tYW5kKG9iamVjdDogUGFyc2VkT2JqZWN0LCBjb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgY29uc3Qgd2ViU2VydmVyID0gb2JqZWN0LnByb3BlcnRpZXMud2ViU2VydmVyO1xuICBpZiAod2ViU2VydmVyPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIC8vIHdiIG93bnMgdGhlIGNhbm9uaWNhbCB0ZXN0LXNlcnZlciBzdGFydHVwIHBhdGg7IGtlZXAgY3VzdG9tIFBsYXl3cmlnaHRcbiAgLy8gc2VydmVyIHNldHRpbmdzIHdoaWxlIG5vcm1hbGl6aW5nIHRoZSBjb21tYW5kIGl0c2VsZi4gSW52b2tlIHdiIHRocm91Z2ggdGhlXG4gIC8vIHBhY2thZ2UgbWFuYWdlciBiZWNhdXNlIHRhcmdldCByZXBvcyBpbnN0YWxsIHdiIGFzIGEgcGFja2FnZSBkZXBlbmRlbmN5LlxuICB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kID0gbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoY29uZmlnKSk7XG59XG5cbmZ1bmN0aW9uIGdldFdiU3RhcnRUZXN0Q29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke2dldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZChjb25maWcpfSB3YiBzdGFydCAtLW1vZGUgdGVzdCdgO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aDogc3RyaW5nKTogRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmIChhc3QuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBhc3QuRXhwcmVzc2lvbiwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKGFzdC5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8XG4gICAgICAoIWFzdC5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIWFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy5hbnRpZ3Jhdml0eWNsaS8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0ID0gc2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0KGNvbmZpZyk7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAgICAgL0RBVEFCQVNFX1VSTFxccyo9XFxzKlwiPyhbXlwiI1xcbl0rP1xcLnNxbGl0ZTNbXlwiI1xcbl0qKVwiPy9nLFxuICAgICAgICAobWF0Y2gsIHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGBEQVRBQkFTRV9VUkw9XCIke25vcm1hbGl6ZVNxbGl0ZURhdGFiYXNlVXJsKHVybCwgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0KX1cImA7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAobmV3Q29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEFkZFNxbGl0ZUNvbm5lY3Rpb25MaW1pdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICAvLyBgY29ubmVjdGlvbl9saW1pdD0xYCBvbmx5IGFwcGxpZXMgdG8gUHJpc21hJ3MgU1FMaXRlIGRhdGFzb3VyY2UgaGFuZGxpbmcuXG4gIC8vIFJlcG9zIHRoYXQgb3B0IGludG8gbm9uLXB1cmUgU1FMaXRlIGFkYXB0ZXJzIHNob3VsZCBrZWVwIHRoZWlyIFVSTCBhcy1pcy5cbiAgcmV0dXJuICFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvYWRhcHRlci1iZXR0ZXItc3FsaXRlMyddICYmICFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvYWRhcHRlci1saWJzcWwnXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwodXJsOiBzdHJpbmcsIHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHF1ZXJ5U3RhcnQgPSB1cmwuaW5kZXhPZignPycpO1xuICBjb25zdCBwYXRoUGFydCA9IHF1ZXJ5U3RhcnQgIT09IC0xID8gdXJsLnNsaWNlKDAsIHF1ZXJ5U3RhcnQpIDogdXJsO1xuICBjb25zdCBxdWVyeVBhcnQgPSBxdWVyeVN0YXJ0ICE9PSAtMSA/IHVybC5zbGljZShxdWVyeVN0YXJ0ICsgMSkgOiAnJztcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeVBhcnQpO1xuXG4gIHBhcmFtcy5kZWxldGUoJ2Nvbm5lY3Rpb25fbGltaXQnKTtcbiAgaWYgKHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCkge1xuICAgIHBhcmFtcy5zZXQoJ2Nvbm5lY3Rpb25fbGltaXQnLCAnMScpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gIHJldHVybiBub3JtYWxpemVkUXVlcnkgPyBgJHtwYXRoUGFydH0/JHtub3JtYWxpemVkUXVlcnl9YCA6IHBhdGhQYXJ0O1xufVxuIiwiY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNvcnRPYmplY3RCeUtleU5hbWVMaXN0KG9iamVjdCwgc29ydFdpdGgpIHtcbiAgbGV0IGtleXMsIHNvcnRGbiwga2V5XG5cbiAgaWYgKHR5cGVvZiBzb3J0V2l0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNvcnRGbiA9IHNvcnRXaXRoXG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IHNvcnRXaXRoXG4gIH1cblxuICBjb25zdCB0b3RhbCA9IHt9XG4gIGNvbnN0IG9iamVjdEtleXMgPSBbLi4uKGtleXMgPz8gW10pLCAuLi5PYmplY3Qua2V5cyhvYmplY3QpLnNvcnQoc29ydEZuKV1cblxuICBmb3IgKGtleSBvZiBvYmplY3RLZXlzKSB7XG4gICAgaWYgKGhhcyhvYmplY3QsIGtleSkpIHtcbiAgICAgIHRvdGFsW2tleV0gPSBvYmplY3Rba2V5XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b3RhbFxufVxuIiwiLy8gRGV0ZWN0IGVpdGhlciBzcGFjZXMgb3IgdGFicyBidXQgbm90IGJvdGggdG8gcHJvcGVybHkgaGFuZGxlIHRhYnMgZm9yIGluZGVudGF0aW9uIGFuZCBzcGFjZXMgZm9yIGFsaWdubWVudFxuY29uc3QgSU5ERU5UX1JFR0VYID0gL14oPzooICkrfFxcdCspLztcblxuY29uc3QgSU5ERU5UX1RZUEVfU1BBQ0UgPSAnc3BhY2UnO1xuY29uc3QgSU5ERU5UX1RZUEVfVEFCID0gJ3RhYic7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiB3ZSBzaG91bGQgaWdub3JlIHNpbmdsZSBzcGFjZSBwYXR0ZXJuc1xuZnVuY3Rpb24gc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCB2YWx1ZSkge1xuXHRyZXR1cm4gaWdub3JlU2luZ2xlU3BhY2VzICYmIGluZGVudFR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFICYmIHZhbHVlID09PSAxO1xufVxuXG4vKipcbk1ha2UgYSBNYXAgdGhhdCBjb3VudHMgaG93IG1hbnkgaW5kZW50cy91bmluZGVudHMgaGF2ZSBvY2N1cnJlZCBmb3IgYSBnaXZlbiBzaXplIGFuZCBob3cgbWFueSBsaW5lcyBmb2xsb3cgYSBnaXZlbiBpbmRlbnRhdGlvbi5cblxuVGhlIGtleSBpcyBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIGluZGVudGF0aW9uIHR5cGUgKHMgPSBzcGFjZSBhbmQgdCA9IHRhYikgYW5kIHRoZSBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cy5cblxuYGBgXG5pbmRlbnRzID0ge1xuXHR0MzogWzEsIDBdLFxuXHR0NDogWzEsIDVdLFxuXHRzNTogWzEsIDBdLFxuXHRzMTI6IFsxLCAwXSxcbn1cbmBgYFxuKi9cbmZ1bmN0aW9uIG1ha2VJbmRlbnRzTWFwKHN0cmluZywgaWdub3JlU2luZ2xlU3BhY2VzKSB7XG5cdGNvbnN0IGluZGVudHMgPSBuZXcgTWFwKCk7XG5cblx0Ly8gUmVtZW1iZXIgdGhlIHNpemUgb2YgcHJldmlvdXMgbGluZSdzIGluZGVudGF0aW9uXG5cdGxldCBwcmV2aW91c1NpemUgPSAwO1xuXHRsZXQgcHJldmlvdXNJbmRlbnRUeXBlO1xuXG5cdC8vIEluZGVudHMga2V5IChpZGVudCB0eXBlICsgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMpXG5cdGxldCBrZXk7XG5cblx0Zm9yIChjb25zdCBsaW5lIG9mIHN0cmluZy5zcGxpdCgvXFxuL2cpKSB7XG5cdFx0aWYgKCFsaW5lKSB7XG5cdFx0XHQvLyBJZ25vcmUgZW1wdHkgbGluZXNcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1hdGNoZXMgPSBsaW5lLm1hdGNoKElOREVOVF9SRUdFWCk7XG5cblx0XHRpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBpbmRlbnQgPSBtYXRjaGVzWzBdLmxlbmd0aDtcblx0XHRcdGNvbnN0IGluZGVudFR5cGUgPSBtYXRjaGVzWzFdID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgdW5sZXNzIGl0J3MgdGhlIG9ubHkgaW5kZW50IGRldGVjdGVkIHRvIHByZXZlbnQgY29tbW9uIGZhbHNlIHBvc2l0aXZlc1xuXHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgaW5kZW50KSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGluZGVudFR5cGUgIT09IHByZXZpb3VzSW5kZW50VHlwZSkge1xuXHRcdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSBpbmRlbnRUeXBlO1xuXG5cdFx0XHRsZXQgdXNlID0gMTtcblx0XHRcdGxldCB3ZWlnaHQgPSAwO1xuXG5cdFx0XHRjb25zdCBpbmRlbnREaWZmZXJlbmNlID0gaW5kZW50IC0gcHJldmlvdXNTaXplO1xuXHRcdFx0cHJldmlvdXNTaXplID0gaW5kZW50O1xuXG5cdFx0XHQvLyBQcmV2aW91cyBsaW5lIGhhdmUgc2FtZSBpbmRlbnQ/XG5cdFx0XHRpZiAoaW5kZW50RGlmZmVyZW5jZSA9PT0gMCkge1xuXHRcdFx0XHQvLyBOb3QgYSBuZXcgXCJ1c2VcIiBvZiB0aGUgY3VycmVudCBpbmRlbnQ6XG5cdFx0XHRcdHVzZSA9IDA7XG5cdFx0XHRcdC8vIEJ1dCBkbyBhZGQgYSBiaXQgdG8gaXQgZm9yIGJyZWFraW5nIHRpZXM6XG5cdFx0XHRcdHdlaWdodCA9IDE7XG5cdFx0XHRcdC8vIFdlIHVzZSB0aGUga2V5IGZyb20gcHJldmlvdXMgbG9vcFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlID0gTWF0aC5hYnMoaW5kZW50RGlmZmVyZW5jZSk7XG5cblx0XHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSBjaGFuZ2VzIHdoZW4gaWdub3JlU2luZ2xlU3BhY2VzIGlzIHRydWVcblx0XHRcdFx0Ly8gVGhpcyBwcmV2ZW50cyBjb21tb24gZmFsc2UgcG9zaXRpdmVzIGZyb20gdGhpbmdzIGxpa2UgYWxpZ25lZCBjb21tZW50c1xuXHRcdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSB0aGUgc3RhdHNcblx0XHRcdGNvbnN0IGVudHJ5ID0gaW5kZW50cy5nZXQoa2V5KTtcblx0XHRcdGluZGVudHMuc2V0KGtleSwgZW50cnkgPT09IHVuZGVmaW5lZCA/IFsxLCAwXSA6IFtlbnRyeVswXSArIHVzZSwgZW50cnlbMV0gKyB3ZWlnaHRdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gaW5kZW50cztcbn1cblxuLy8gRW5jb2RlIHRoZSBpbmRlbnQgdHlwZSBhbmQgYW1vdW50IGFzIGEgc3RyaW5nIChlLmcuICdzNCcpIGZvciB1c2UgYXMgYSBjb21wb3VuZCBrZXkgaW4gdGhlIGluZGVudHMgTWFwLlxuZnVuY3Rpb24gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBpbmRlbnRBbW91bnQpIHtcblx0Y29uc3QgdHlwZUNoYXJhY3RlciA9IGluZGVudFR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJ3MnIDogJ3QnO1xuXHRyZXR1cm4gdHlwZUNoYXJhY3RlciArIFN0cmluZyhpbmRlbnRBbW91bnQpO1xufVxuXG4vLyBFeHRyYWN0IHRoZSBpbmRlbnQgdHlwZSBhbmQgYW1vdW50IGZyb20gYSBrZXkgb2YgdGhlIGluZGVudHMgTWFwLlxuZnVuY3Rpb24gZGVjb2RlSW5kZW50c0tleShpbmRlbnRzS2V5KSB7XG5cdGNvbnN0IGtleUhhc1R5cGVTcGFjZSA9IGluZGVudHNLZXlbMF0gPT09ICdzJztcblx0Y29uc3QgdHlwZSA9IGtleUhhc1R5cGVTcGFjZSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdGNvbnN0IGFtb3VudCA9IE51bWJlcihpbmRlbnRzS2V5LnNsaWNlKDEpKTtcblxuXHRyZXR1cm4ge3R5cGUsIGFtb3VudH07XG59XG5cbi8vIFJldHVybiB0aGUga2V5IChlLmcuICdzNCcpIGZyb20gdGhlIGluZGVudHMgTWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgbW9zdCBjb21tb24gaW5kZW50LFxuLy8gb3IgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGVyZSBhcmUgbm8gaW5kZW50cy5cbmZ1bmN0aW9uIGdldE1vc3RVc2VkS2V5KGluZGVudHMpIHtcblx0bGV0IHJlc3VsdDtcblx0bGV0IG1heFVzZWQgPSAwO1xuXHRsZXQgbWF4V2VpZ2h0ID0gMDtcblxuXHRmb3IgKGNvbnN0IFtrZXksIFt1c2VkQ291bnQsIHdlaWdodF1dIG9mIGluZGVudHMpIHtcblx0XHRpZiAodXNlZENvdW50ID4gbWF4VXNlZCB8fCAodXNlZENvdW50ID09PSBtYXhVc2VkICYmIHdlaWdodCA+IG1heFdlaWdodCkpIHtcblx0XHRcdG1heFVzZWQgPSB1c2VkQ291bnQ7XG5cdFx0XHRtYXhXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0XHRyZXN1bHQgPSBrZXk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbWFrZUluZGVudFN0cmluZyh0eXBlLCBhbW91bnQpIHtcblx0Y29uc3QgaW5kZW50Q2hhcmFjdGVyID0gdHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAnICcgOiAnXFx0Jztcblx0cmV0dXJuIGluZGVudENoYXJhY3Rlci5yZXBlYXQoYW1vdW50KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0SW5kZW50KHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Ly8gSWRlbnRpZnkgaW5kZW50cyB3aGlsZSBza2lwcGluZyBzaW5nbGUgc3BhY2UgaW5kZW50cyB0byBhdm9pZCBjb21tb24gZWRnZSBjYXNlcyAoZS5nLiBjb2RlIGNvbW1lbnRzKVxuXHQvLyBJZiBubyBpbmRlbnRzIGFyZSBpZGVudGlmaWVkLCBydW4gYWdhaW4gYW5kIGluY2x1ZGUgYWxsIGluZGVudHMgZm9yIGNvbXByZWhlbnNpdmUgZGV0ZWN0aW9uXG5cdGxldCBpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCB0cnVlKTtcblx0aWYgKGluZGVudHMuc2l6ZSA9PT0gMCkge1xuXHRcdGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIGZhbHNlKTtcblx0fVxuXG5cdGNvbnN0IGtleU9mTW9zdFVzZWRJbmRlbnQgPSBnZXRNb3N0VXNlZEtleShpbmRlbnRzKTtcblxuXHRsZXQgdHlwZTtcblx0bGV0IGFtb3VudCA9IDA7XG5cdGxldCBpbmRlbnQgPSAnJztcblxuXHRpZiAoa2V5T2ZNb3N0VXNlZEluZGVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0KHt0eXBlLCBhbW91bnR9ID0gZGVjb2RlSW5kZW50c0tleShrZXlPZk1vc3RVc2VkSW5kZW50KSk7XG5cdFx0aW5kZW50ID0gbWFrZUluZGVudFN0cmluZyh0eXBlLCBhbW91bnQpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRhbW91bnQsXG5cdFx0dHlwZSxcblx0XHRpbmRlbnQsXG5cdH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZShzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdGNvbnN0IG5ld2xpbmVzID0gc3RyaW5nLm1hdGNoKC8oPzpcXHI/XFxuKS9nKSB8fCBbXTtcblxuXHRpZiAobmV3bGluZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgY3JsZiA9IG5ld2xpbmVzLmZpbHRlcihuZXdsaW5lID0+IG5ld2xpbmUgPT09ICdcXHJcXG4nKS5sZW5ndGg7XG5cdGNvbnN0IGxmID0gbmV3bGluZXMubGVuZ3RoIC0gY3JsZjtcblxuXHRyZXR1cm4gY3JsZiA+IGxmID8gJ1xcclxcbicgOiAnXFxuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmVHcmFjZWZ1bChzdHJpbmcpIHtcblx0cmV0dXJuICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyAmJiBkZXRlY3ROZXdsaW5lKHN0cmluZykpIHx8ICdcXG4nO1xufVxuIiwiIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG5cdHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHNvcnRPYmplY3RLZXlzIGZyb20gJ3NvcnQtb2JqZWN0LWtleXMnXG5pbXBvcnQgZGV0ZWN0SW5kZW50IGZyb20gJ2RldGVjdC1pbmRlbnQnXG5pbXBvcnQgeyBkZXRlY3ROZXdsaW5lR3JhY2VmdWwgYXMgZGV0ZWN0TmV3bGluZSB9IGZyb20gJ2RldGVjdC1uZXdsaW5lJ1xuaW1wb3J0IGdpdEhvb2tzIGZyb20gJ2dpdC1ob29rcy1saXN0J1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnaXMtcGxhaW4tb2JqJ1xuaW1wb3J0IHNlbXZlckNvbXBhcmUgZnJvbSAnc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLmpzJ1xuaW1wb3J0IHNlbXZlck1pblZlcnNpb24gZnJvbSAnc2VtdmVyL3Jhbmdlcy9taW4tdmVyc2lvbi5qcydcblxuY29uc3QgcGlwZSA9XG4gIChmbnMpID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGZucy5yZWR1Y2UoKHJlc3VsdCwgZm4pID0+IGZuKHJlc3VsdCwgLi4uYXJncyksIHgpXG5jb25zdCBvbkFycmF5ID0gKGZuKSA9PiAoeCkgPT4gKEFycmF5LmlzQXJyYXkoeCkgPyBmbih4KSA6IHgpXG5jb25zdCBvblN0cmluZ0FycmF5ID0gKGZuKSA9PiAoeCkgPT5cbiAgQXJyYXkuaXNBcnJheSh4KSAmJiB4LmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpID8gZm4oeCkgOiB4XG5jb25zdCB1bmlxID0gb25TdHJpbmdBcnJheSgoeHMpID0+IFsuLi5uZXcgU2V0KHhzKV0pXG5jb25zdCBzb3J0QXJyYXkgPSBvblN0cmluZ0FycmF5KChhcnJheSkgPT4gYXJyYXkudG9Tb3J0ZWQoKSlcbmNvbnN0IHVuaXFBbmRTb3J0QXJyYXkgPSBwaXBlKFt1bmlxLCBzb3J0QXJyYXldKVxuY29uc3Qgb25PYmplY3QgPVxuICAoZm4pID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGlzUGxhaW5PYmplY3QoeCkgPyBmbih4LCAuLi5hcmdzKSA6IHhcbmNvbnN0IHNvcnRPYmplY3RCeSA9IChjb21wYXJhdG9yLCBkZWVwKSA9PiB7XG4gIGNvbnN0IG92ZXIgPSBvbk9iamVjdCgob2JqZWN0KSA9PiB7XG4gICAgaWYgKGRlZXApIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgb3Zlcih2YWx1ZSldKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMob2JqZWN0LCBjb21wYXJhdG9yKVxuICB9KVxuXG4gIHJldHVybiBvdmVyXG59XG5jb25zdCBzb3J0T2JqZWN0ID0gc29ydE9iamVjdEJ5KClcbmNvbnN0IHNvcnRVUkxPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyd0eXBlJywgJ3VybCddKVxuY29uc3Qgc29ydFBlb3BsZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ25hbWUnLCAnZW1haWwnLCAndXJsJ10pXG5jb25zdCBzb3J0RGlyZWN0b3JpZXMgPSBzb3J0T2JqZWN0QnkoW1xuICAnbGliJyxcbiAgJ2JpbicsXG4gICdtYW4nLFxuICAnZG9jJyxcbiAgJ2V4YW1wbGUnLFxuICAndGVzdCcsXG5dKVxuY29uc3Qgb3ZlclByb3BlcnR5ID0gKHByb3BlcnR5LCBvdmVyKSA9PlxuICBvbk9iamVjdCgob2JqZWN0LCAuLi5hcmdzKSA9PlxuICAgIE9iamVjdC5oYXNPd24ob2JqZWN0LCBwcm9wZXJ0eSlcbiAgICAgID8geyAuLi5vYmplY3QsIFtwcm9wZXJ0eV06IG92ZXIob2JqZWN0W3Byb3BlcnR5XSwgLi4uYXJncykgfVxuICAgICAgOiBvYmplY3QsXG4gIClcbmNvbnN0IHNvcnRHaXRIb29rcyA9IHNvcnRPYmplY3RCeShnaXRIb29rcylcblxuY29uc3QgcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlID0gKHNwZWNpZmllcikgPT4ge1xuICAvLyBJZ25vcmUgYW55dGhpbmcgYWZ0ZXIgPiAmIHJlbHkgb24gZmFsbGJhY2sgYWxwaGFudW1lcmljIHNvcnRpbmcgZm9yIHRoYXRcbiAgY29uc3QgW25hbWVBbmRWZXJzaW9uXSA9IHNwZWNpZmllci5zcGxpdCgnPicpXG4gIGNvbnN0IGF0TWF0Y2hlcyA9IFsuLi5uYW1lQW5kVmVyc2lvbi5tYXRjaEFsbCgnQCcpXVxuICBpZiAoXG4gICAgIWF0TWF0Y2hlcy5sZW5ndGggfHxcbiAgICAoYXRNYXRjaGVzLmxlbmd0aCA9PT0gMSAmJiBhdE1hdGNoZXNbMF0uaW5kZXggPT09IDApXG4gICkge1xuICAgIHJldHVybiB7IG5hbWU6IHNwZWNpZmllciB9XG4gIH1cbiAgY29uc3Qgc3BsaXRJbmRleCA9IGF0TWF0Y2hlcy5wb3AoKS5pbmRleFxuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZygwLCBzcGxpdEluZGV4KSxcbiAgICByYW5nZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKHNwbGl0SW5kZXggKyAxKSxcbiAgfVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlTZW12ZXIgPSBzb3J0T2JqZWN0QnkoKGEsIGIpID0+IHtcbiAgY29uc3QgeyBuYW1lOiBhTmFtZSwgcmFuZ2U6IGFSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGEpXG4gIGNvbnN0IHsgbmFtZTogYk5hbWUsIHJhbmdlOiBiUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShiKVxuXG4gIGlmIChhTmFtZSAhPT0gYk5hbWUpIHtcbiAgICByZXR1cm4gYU5hbWUubG9jYWxlQ29tcGFyZShiTmFtZSwgJ2VuJylcbiAgfVxuICBpZiAoIWFSYW5nZSkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmICghYlJhbmdlKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICByZXR1cm4gc2VtdmVyQ29tcGFyZShzZW12ZXJNaW5WZXJzaW9uKGFSYW5nZSksIHNlbXZlck1pblZlcnNpb24oYlJhbmdlKSlcbn0pXG5cbmNvbnN0IGdldFBhY2thZ2VOYW1lID0gKGlkZW50KSA9PiB7XG4gIGNvbnN0IGluZGV4ID0gaWRlbnQuaW5kZXhPZignQCcsIGlkZW50LnN0YXJ0c1dpdGgoJ0AnKSA/IDEgOiAwKVxuICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB1bmxlc3MgdXNlciBtYW51YWxseSBlZGl0IHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICByZXR1cm4gaW5kZXggPT09IC0xID8gaWRlbnQgOiBpZGVudC5zbGljZSgwLCBpbmRleClcbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5SWRlbnQgPSAoYSwgYikgPT4ge1xuICBjb25zdCBwYWNrYWdlTmFtZUEgPSBnZXRQYWNrYWdlTmFtZShhKVxuICBjb25zdCBwYWNrYWdlTmFtZUIgPSBnZXRQYWNrYWdlTmFtZShiKVxuXG4gIGlmIChwYWNrYWdlTmFtZUEgPCBwYWNrYWdlTmFtZUIpIHJldHVybiAtMVxuICBpZiAocGFja2FnZU5hbWVBID4gcGFja2FnZU5hbWVCKSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBDYWNoZSBieSBgcHJvY2Vzcy5jd2QoKWAgaW5zdGVhZCBvZiBhIHZhcmlhYmxlIHRvIGFsbG93IHVzZXIgY2FsbCBgcHJvY2Vzcy5jaGRpcigpYFxuY29uc3QgY2FjaGUgPSBuZXcgTWFwKClcbmNvbnN0IGhhc1lhcm5PclBucG1GaWxlcyA9ICgpID0+IHtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKVxuICBpZiAoIWNhY2hlLmhhcyhjd2QpKSB7XG4gICAgY2FjaGUuc2V0KFxuICAgICAgY3dkLFxuICAgICAgZnMuZXhpc3RzU3luYygneWFybi5sb2NrJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm4vJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm5yYy55bWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLWxvY2sueWFtbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0td29ya3NwYWNlLnlhbWwnKSxcbiAgICApXG4gIH1cbiAgcmV0dXJuIGNhY2hlLmdldChjd2QpXG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgcGFja2FnZSBtYW5hZ2VyIGZyb20gcGFja2FnZS5qc29uIGFuZCBsb2NrIGZpbGVzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZUpzb24gLSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRoZSBkZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXIuIERlZmF1bHQgdG8gbnBtIGlmIG5vdCBkZXRlY3RlZC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9jb3JlcGFja1xuICBpZiAodHlwZW9mIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCducG1AJylcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5kZXZFbmdpbmVzPy5wYWNrYWdlTWFuYWdlcj8ubmFtZSkge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5kZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyLm5hbWUgPT09ICducG0nXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24ucG5wbSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gT3B0aW1pc2F0aW9uOiBDaGVjayBpZiBucG0gaXMgZXhwbGljaXQgYmVmb3JlIHJlYWRpbmcgRlMuXG4gIGlmIChwYWNrYWdlSnNvbi5lbmdpbmVzPy5ucG0pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGhhc1lhcm5PclBucG1GaWxlcygpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFNvcnQgZGVwZW5kZW5jaWVzIGFscGhhYmV0aWNhbGx5LCBkZXRlY3RpbmcgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZSB0aGVcbiAqIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24uIG5wbSB1c2VzIGxvY2FsZS1hd2FyZSBjb21wYXJpc29uLCB5YXJuIGFuZCBwbnBtIHVzZVxuICogc2ltcGxlIHN0cmluZyBjb21wYXJpc29uXG4gKi9cbmNvbnN0IHNvcnREZXBlbmRlbmNpZXMgPSBvbk9iamVjdCgoZGVwZW5kZW5jaWVzLCBwYWNrYWdlSnNvbikgPT4ge1xuICAvLyBBdm9pZCBmaWxlIGFjY2Vzc1xuICBpZiAoT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llc1xuICB9XG5cbiAgLy8gc29ydCBkZXBzIGxpa2UgdGhlIG5wbSBDTEkgZG9lcyAodmlhIHRoZSBwYWNrYWdlIEBucG1jbGkvcGFja2FnZS1qc29uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbnBtL3BhY2thZ2UtanNvbi9ibG9iL2I2NDY1ZjQ0YzcyN2Q2NTEzZGI2ODk4YzdjYmU0MWRkMzU1Y2ViZTgvbGliL3VwZGF0ZS1kZXBlbmRlbmNpZXMuanMjTDgtTDIxXG4gIGlmIChzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikpIHtcbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzLCAoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIsICdlbicpKVxuICB9XG5cbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcylcbn0pXG5cbi8qKlxuICogXCJ3b3Jrc3BhY2VzXCIgY2FuIGJlIGFuIGFycmF5IChucG0gb3IgeWFybiBjbGFzc2ljKSBvciBhbiBvYmplY3QgKHBucG0vYnVuKS5cbiAqIEluIHRoZSBjYXNlIG9mIGFuIGFycmF5LCB3ZSBkbyBub3Qgd2FudCB0byBhbHBoYWJldGljYWxseSBzb3J0IGl0IGluIGNhc2VcbiAqIHNjcmlwdHMgbmVlZCB0byBydW4gaW4gYSBzcGVjaWZpYyBvcmRlci5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y3L3VzaW5nLW5wbS93b3Jrc3BhY2VzP3Y9dHJ1ZSNydW5uaW5nLWNvbW1hbmRzLWluLXRoZS1jb250ZXh0LW9mLXdvcmtzcGFjZXNcbiAqL1xuY29uc3Qgc29ydFdvcmtzcGFjZXMgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KFsncGFja2FnZXMnLCAnY2F0YWxvZyddKSxcbiAgb3ZlclByb3BlcnR5KCdwYWNrYWdlcycsIHVuaXFBbmRTb3J0QXJyYXkpLFxuICBvdmVyUHJvcGVydHkoJ2NhdGFsb2cnLCBzb3J0RGVwZW5kZW5jaWVzKSxcbl0pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvYWNjMGU0NzU3MmE5MzkwMjkyYjRlMzEzYjRhNGJmMzYwZDIzNjM1OC9jb25mL2NvbmZpZy1zY2hlbWEuanNcbmNvbnN0IGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAvLyBgZmlsZXNgIGFuZCBgZXhjbHVkZWRGaWxlc2AgYXJlIG9ubHkgb24gYG92ZXJyaWRlc1tdYFxuICAvLyBmb3IgZWFzaWVyIHNvcnQgYG92ZXJyaWRlc1tdYCxcbiAgLy8gYWRkIHRoZW0gdG8gaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCBzb3J0IGBvdmVycmlkZXNbXWAgdHdpY2VcbiAgJ2ZpbGVzJyxcbiAgJ2V4Y2x1ZGVkRmlsZXMnLFxuICAvLyBiYXNlQ29uZmlnXG4gICdlbnYnLFxuICAncGFyc2VyJyxcbiAgJ3BhcnNlck9wdGlvbnMnLFxuICAnc2V0dGluZ3MnLFxuICAncGx1Z2lucycsXG4gICdleHRlbmRzJyxcbiAgJ3J1bGVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdnbG9iYWxzJyxcbiAgJ3Byb2Nlc3NvcicsXG4gICdub0lubGluZUNvbmZpZycsXG4gICdyZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcycsXG5dXG5jb25zdCBzb3J0RXNsaW50Q29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eSgnZW52Jywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eSgnZ2xvYmFscycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PiBvdmVycmlkZXMubWFwKHNvcnRFc2xpbnRDb25maWcpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdwYXJzZXJPcHRpb25zJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAncnVsZXMnLFxuICAgIHNvcnRPYmplY3RCeShcbiAgICAgIChydWxlMSwgcnVsZTIpID0+XG4gICAgICAgIHJ1bGUxLnNwbGl0KCcvJykubGVuZ3RoIC0gcnVsZTIuc3BsaXQoJy8nKS5sZW5ndGggfHxcbiAgICAgICAgcnVsZTEubG9jYWxlQ29tcGFyZShydWxlMiksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdzZXR0aW5ncycsIHNvcnRPYmplY3QpLFxuXSlcbmNvbnN0IHNvcnRWU0NvZGVCYWRnZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ2Rlc2NyaXB0aW9uJywgJ3VybCcsICdocmVmJ10pXG5cbmNvbnN0IHNvcnRQcmV0dGllckNvbmZpZyA9IHBpcGUoW1xuICAvLyBzb3J0IGtleXMgYWxwaGFiZXRpY2FsbHksIGJ1dCBwdXQgYG92ZXJyaWRlc2AgYXQgYm90dG9tXG4gIG9uT2JqZWN0KChjb25maWcpID0+XG4gICAgc29ydE9iamVjdEtleXMoY29uZmlnLCBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhjb25maWcpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnb3ZlcnJpZGVzJylcbiAgICAgICAgLnNvcnQoKSxcbiAgICAgICdvdmVycmlkZXMnLFxuICAgIF0pLFxuICApLFxuICAvLyBpZiBgY29uZmlnLm92ZXJyaWRlc2AgZXhpc3RzXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICAvLyBhbmQgYGNvbmZpZy5vdmVycmlkZXNgIGlzIGFuIGFycmF5XG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PlxuICAgICAgb3ZlcnJpZGVzLm1hcChcbiAgICAgICAgcGlwZShbXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIHNvcnRPYmplY3QsXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdLm9wdGlvbnNgIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgb3ZlclByb3BlcnR5KCdvcHRpb25zJywgc29ydE9iamVjdCksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuXSlcblxuY29uc3Qgc29ydFZvbHRhID0gc29ydE9iamVjdEJ5KFsnbm9kZScsICducG0nLCAneWFybiddKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3dpcmVpdFxuY29uc3Qgd2lyZWl0U2NyaXB0UHJvcGVydGllcyA9IFsnY29tbWFuZCcsICdkZXBlbmRlbmNpZXMnLCAnZmlsZXMnLCAnb3V0cHV0J11cbmNvbnN0IHNvcnRXaXJlaXRTY3JpcHQgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHdpcmVpdFNjcmlwdFByb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2RlcGVuZGVuY2llcycsXG4gICAgb25BcnJheSgoZGVwcykgPT4gZGVwcy5tYXAoc29ydE9iamVjdEJ5KFsnc2NyaXB0JywgJ2Nhc2NhZGUnXSkpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdlbnYnLFxuICAgIG9uT2JqZWN0KChlbnYpID0+XG4gICAgICBzb3J0T2JqZWN0S2V5cyhcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGVudikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHNvcnRPYmplY3RCeShbJ2V4dGVybmFsJywgJ2RlZmF1bHQnXSkodmFsdWUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3NlcnZpY2UnLFxuICAgIHBpcGUoW3NvcnRPYmplY3RCeShbJ3JlYWR5V2hlbiddKSwgb3ZlclByb3BlcnR5KCdyZWFkeVdoZW4nLCBzb3J0T2JqZWN0KV0pLFxuICApLFxuXSlcbmNvbnN0IHNvcnRXaXJlaXQgPSBvbk9iamVjdCgod2lyZWl0KSA9PlxuICBzb3J0T2JqZWN0S2V5cyhcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh3aXJlaXQpLm1hcCgoW25hbWUsIGNvbmZpZ10pID0+IFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc29ydFdpcmVpdFNjcmlwdChjb25maWcpLFxuICAgICAgXSksXG4gICAgKSxcbiAgKSxcbilcbmNvbnN0IHNvcnREZXZFbmdpbmVzID0gb3ZlclByb3BlcnR5KFxuICAncGFja2FnZU1hbmFnZXInLFxuICBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ3ZlcnNpb24nLCAnb25GYWlsJ10pLFxuKVxuXG5jb25zdCBwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gICdwZWVyRGVwZW5kZW5jeVJ1bGVzJyxcbiAgJ25ldmVyQnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llc0ZpbGUnLFxuICAnYWxsb3dlZERlcHJlY2F0ZWRWZXJzaW9ucycsXG4gICdhbGxvd05vbkFwcGxpZWRQYXRjaGVzJyxcbiAgJ3VwZGF0ZUNvbmZpZycsXG4gICdhdWRpdENvbmZpZycsXG4gICdyZXF1aXJlZFNjcmlwdHMnLFxuICAnc3VwcG9ydGVkQXJjaGl0ZWN0dXJlcycsXG4gICdvdmVycmlkZXMnLFxuICAncGF0Y2hlZERlcGVuZGVuY2llcycsXG4gICdwYWNrYWdlRXh0ZW5zaW9ucycsXG5dXG5cbmNvbnN0IHNvcnRQbnBtQ29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMsIHRydWUpLFxuICBvdmVyUHJvcGVydHkoJ292ZXJyaWRlcycsIHNvcnRPYmplY3RCeVNlbXZlciksXG5dKVxuXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9taXNjL3NjcmlwdHNcbmNvbnN0IGRlZmF1bHROcG1TY3JpcHRzID0gbmV3IFNldChbXG4gICdpbnN0YWxsJyxcbiAgJ3BhY2snLFxuICAncHJlcGFyZScsXG4gICdwdWJsaXNoJyxcbiAgJ3Jlc3RhcnQnLFxuICAnc2hyaW5rd3JhcCcsXG4gICdzdGFydCcsXG4gICdzdG9wJyxcbiAgJ3Rlc3QnLFxuICAndW5pbnN0YWxsJyxcbiAgJ3ZlcnNpb24nLFxuXSlcblxuY29uc3QgaGFzRGV2RGVwZW5kZW5jeSA9IChkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbikgPT4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24sICdkZXZEZXBlbmRlbmNpZXMnKSAmJlxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5KVxuICApXG59XG5cbmNvbnN0IHJ1blNSZWdFeHAgPVxuICAvKD88PV58W1xccyY7PD58KF0pKD86cnVuLXN8bnBtLXJ1bi1hbGwyPyAuKig/Oi0tc2VxdWVudGlhbHwtLXNlcmlhbHwtcykpKD89JHxbXFxzJjs8PnwpXSkvXG5cbmNvbnN0IGlzU2VxdWVudGlhbFNjcmlwdCA9IChjb21tYW5kKSA9PlxuICBjb21tYW5kLmluY2x1ZGVzKCcqJykgJiYgcnVuU1JlZ0V4cC50ZXN0KGNvbW1hbmQpXG5cbmNvbnN0IGhhc1NlcXVlbnRpYWxTY3JpcHQgPSAocGFja2FnZUpzb24pID0+IHtcbiAgaWYgKFxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbCcsIHBhY2thZ2VKc29uKSAmJlxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbDInLCBwYWNrYWdlSnNvbilcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3Qgc2NyaXB0cyA9IFsnc2NyaXB0cycsICdiZXR0ZXJTY3JpcHRzJ10uZmxhdE1hcCgoZmllbGQpID0+XG4gICAgcGFja2FnZUpzb25bZmllbGRdID8gT2JqZWN0LnZhbHVlcyhwYWNrYWdlSnNvbltmaWVsZF0pIDogW10sXG4gIClcbiAgcmV0dXJuIHNjcmlwdHMuc29tZSgoc2NyaXB0KSA9PiBpc1NlcXVlbnRpYWxTY3JpcHQoc2NyaXB0KSlcbn1cblxuZnVuY3Rpb24gc29ydFNjcmlwdE5hbWVzKGtleXMsIHByZWZpeCA9ICcnKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0gcHJlZml4ID8ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKSA6IGtleVxuICAgIGNvbnN0IGlkeCA9IHJlc3QuaW5kZXhPZignOicpXG4gICAgaWYgKGlkeCA+IDApIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBrZXkuc2xpY2UoMCwgKHByZWZpeCA/IHByZWZpeC5sZW5ndGggKyAxIDogMCkgKyBpZHgpXG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhiYXNlKSkgZ3JvdXBNYXAuc2V0KGJhc2UsIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGJhc2UpLnB1c2goa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhrZXkpKSBncm91cE1hcC5zZXQoa2V5LCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChrZXkpLnB1c2goa2V5KVxuICAgIH1cbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShncm91cE1hcC5rZXlzKCkpXG4gICAgLnNvcnQoKVxuICAgIC5mbGF0TWFwKChncm91cEtleSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBncm91cE1hcC5nZXQoZ3JvdXBLZXkpXG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkcmVuLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgY2hpbGRyZW4uc29tZSgoaykgPT4gayAhPT0gZ3JvdXBLZXkgJiYgay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkaXJlY3QgPSBjaGlsZHJlblxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IGsgPT09IGdyb3VwS2V5IHx8ICFrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgY29uc3QgbmVzdGVkID0gY2hpbGRyZW4uZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICByZXR1cm4gWy4uLmRpcmVjdCwgLi4uc29ydFNjcmlwdE5hbWVzKG5lc3RlZCwgZ3JvdXBLZXkpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNvcnQoKVxuICAgIH0pXG59XG5cbmNvbnN0IHNvcnRTY3JpcHRzID0gb25PYmplY3QoKHNjcmlwdHMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIGxldCBuYW1lcyA9IE9iamVjdC5rZXlzKHNjcmlwdHMpXG4gIGNvbnN0IHByZWZpeGFibGUgPSBuZXcgU2V0KClcblxuICBuYW1lcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IG9taXR0ZWQgPSBuYW1lLnJlcGxhY2UoL14oPzpwcmV8cG9zdCkvLCAnJylcbiAgICBpZiAoZGVmYXVsdE5wbVNjcmlwdHMuaGFzKG9taXR0ZWQpIHx8IG5hbWVzLmluY2x1ZGVzKG9taXR0ZWQpKSB7XG4gICAgICBwcmVmaXhhYmxlLmFkZChvbWl0dGVkKVxuICAgICAgcmV0dXJuIG9taXR0ZWRcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVcbiAgfSlcblxuICBpZiAoIWhhc1NlcXVlbnRpYWxTY3JpcHQocGFja2FnZUpzb24pKSB7XG4gICAgbmFtZXMgPSBzb3J0U2NyaXB0TmFtZXMobmFtZXMpXG4gIH1cbiAgbmFtZXMgPSBuYW1lcy5mbGF0TWFwKChrZXkpID0+XG4gICAgcHJlZml4YWJsZS5oYXMoa2V5KSA/IFtgcHJlJHtrZXl9YCwga2V5LCBgcG9zdCR7a2V5fWBdIDogW2tleV0sXG4gIClcbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKHNjcmlwdHMsIG5hbWVzKVxufSlcblxuLypcbi0gTW92ZSBgZGVmYXVsdGAgY29uZGl0aW9uIHRvIGJvdHRvbVxuKi9cbmNvbnN0IHNvcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0Q29uZGl0aW9ucyA9IFtdLCByZXN0Q29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBjb25kaXRpb25zLFxuICAgIChjb25kaXRpb24pID0+IHtcbiAgICAgIGlmIChjb25kaXRpb24gPT09ICdkZWZhdWx0Jykge1xuICAgICAgICByZXR1cm4gJ2RlZmF1bHRDb25kaXRpb25zJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ3Jlc3RDb25kaXRpb25zJ1xuICAgIH0sXG4gIClcblxuICByZXR1cm4gWy4uLnJlc3RDb25kaXRpb25zLCAuLi5kZWZhdWx0Q29uZGl0aW9uc11cbn1cblxuY29uc3Qgc29ydEV4cG9ydHMgPSBvbk9iamVjdCgoZXhwb3J0cykgPT4ge1xuICBjb25zdCB7IHBhdGhzID0gW10sIGNvbmRpdGlvbnMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgT2JqZWN0LmtleXMoZXhwb3J0cyksXG4gICAgKGtleSkgPT4gKGtleS5zdGFydHNXaXRoKCcuJykgPyAncGF0aHMnIDogJ2NvbmRpdGlvbnMnKSxcbiAgKVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgWy4uLnBhdGhzLCAuLi5zb3J0Q29uZGl0aW9ucyhjb25kaXRpb25zKV0ubWFwKChrZXkpID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHNvcnRFeHBvcnRzKGV4cG9ydHNba2V5XSksXG4gICAgXSksXG4gIClcbn0pXG5cbi8vIGZpZWxkcyBtYXJrZWQgYHZzY29kZWAgYXJlIGZvciBgVmlzdWFsIFN0dWRpbyBDb2RlIGV4dGVuc2lvbiBtYW5pZmVzdGAgb25seVxuLy8gaHR0cHM6Ly9jb2RlLnZpc3VhbHN0dWRpby5jb20vYXBpL3JlZmVyZW5jZXMvZXh0ZW5zaW9uLW1hbmlmZXN0XG4vLyBTdXBwb3J0ZWQgZmllbGRzOlxuLy8gcHVibGlzaGVyLCBkaXNwbGF5TmFtZSwgY2F0ZWdvcmllcywgZ2FsbGVyeUJhbm5lciwgcHJldmlldywgY29udHJpYnV0ZXMsXG4vLyBhY3RpdmF0aW9uRXZlbnRzLCBiYWRnZXMsIG1hcmtkb3duLCBxbmEsIGV4dGVuc2lvblBhY2ssXG4vLyBleHRlbnNpb25EZXBlbmRlbmNpZXMsIGljb25cblxuLy8gZmllbGQua2V5e3N0cmluZ306IGZpZWxkIG5hbWVcbi8vIGZpZWxkLm92ZXJ7ZnVuY3Rpb259OiBzb3J0IGZpZWxkIHN1YktleVxuY29uc3QgZmllbGRzID0gW1xuICB7IGtleTogJyRzY2hlbWEnIH0sXG4gIHsga2V5OiAnbmFtZScgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZGlzcGxheU5hbWUnIH0sXG4gIHsga2V5OiAndmVyc2lvbicgfSxcbiAgLyogeWFybiAqLyB7IGtleTogJ3N0YWJsZVZlcnNpb24nIH0sXG4gIHsga2V5OiAncHJpdmF0ZScgfSxcbiAgeyBrZXk6ICdkZXNjcmlwdGlvbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY2F0ZWdvcmllcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdrZXl3b3JkcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdob21lcGFnZScgfSxcbiAgeyBrZXk6ICdidWdzJywgb3Zlcjogc29ydE9iamVjdEJ5KFsndXJsJywgJ2VtYWlsJ10pIH0sXG4gIHsga2V5OiAncmVwb3NpdG9yeScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdmdW5kaW5nJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2xpY2Vuc2UnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3FuYScgfSxcbiAgeyBrZXk6ICdhdXRob3InLCBvdmVyOiBzb3J0UGVvcGxlT2JqZWN0IH0sXG4gIHtcbiAgICBrZXk6ICdtYWludGFpbmVycycsXG4gICAgb3Zlcjogb25BcnJheSgobWFpbnRhaW5lcnMpID0+IG1haW50YWluZXJzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb250cmlidXRvcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGNvbnRyaWJ1dG9ycykgPT4gY29udHJpYnV0b3JzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3B1Ymxpc2hlcicgfSxcbiAgeyBrZXk6ICdzaWRlRWZmZWN0cycgfSxcbiAgeyBrZXk6ICd0eXBlJyB9LFxuICB7IGtleTogJ2ltcG9ydHMnIH0sXG4gIHsga2V5OiAnZXhwb3J0cycsIG92ZXI6IHNvcnRFeHBvcnRzIH0sXG4gIHsga2V5OiAnbWFpbicgfSxcbiAgeyBrZXk6ICdzdmVsdGUnIH0sXG4gIHsga2V5OiAndW1kOm1haW4nIH0sXG4gIHsga2V5OiAnanNkZWxpdnInIH0sXG4gIHsga2V5OiAndW5wa2cnIH0sXG4gIHsga2V5OiAnbW9kdWxlJyB9LFxuICB7IGtleTogJ3NvdXJjZScgfSxcbiAgeyBrZXk6ICdqc25leHQ6bWFpbicgfSxcbiAgeyBrZXk6ICdicm93c2VyJyB9LFxuICB7IGtleTogJ3JlYWN0LW5hdGl2ZScgfSxcbiAgeyBrZXk6ICd0eXBlcycgfSxcbiAgeyBrZXk6ICd0eXBlc1ZlcnNpb25zJyB9LFxuICB7IGtleTogJ3R5cGluZ3MnIH0sXG4gIHsga2V5OiAnc3R5bGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlc3R5bGUnIH0sXG4gIHsga2V5OiAnYXNzZXRzJyB9LFxuICB7IGtleTogJ2JpbicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtYW4nIH0sXG4gIHsga2V5OiAnZGlyZWN0b3JpZXMnLCBvdmVyOiBzb3J0RGlyZWN0b3JpZXMgfSxcbiAgeyBrZXk6ICdmaWxlcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICd3b3Jrc3BhY2VzJywgb3Zlcjogc29ydFdvcmtzcGFjZXMgfSxcbiAgLy8gbm9kZS1wcmUtZ3lwIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL25vZGUtcHJlLWd5cCMxLWFkZC1uZXctZW50cmllcy10by15b3VyLXBhY2thZ2Vqc29uXG4gIHtcbiAgICBrZXk6ICdiaW5hcnknLFxuICAgIG92ZXI6IHNvcnRPYmplY3RCeShbXG4gICAgICAnbW9kdWxlX25hbWUnLFxuICAgICAgJ21vZHVsZV9wYXRoJyxcbiAgICAgICdyZW1vdGVfcGF0aCcsXG4gICAgICAncGFja2FnZV9uYW1lJyxcbiAgICAgICdob3N0JyxcbiAgICBdKSxcbiAgfSxcbiAgeyBrZXk6ICdzY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICdiZXR0ZXJTY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICd3aXJlaXQnLCBvdmVyOiBzb3J0V2lyZWl0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2wxMG4nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NvbnRyaWJ1dGVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdhY3RpdmF0aW9uRXZlbnRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2h1c2t5Jywgb3Zlcjogb3ZlclByb3BlcnR5KCdob29rcycsIHNvcnRHaXRIb29rcykgfSxcbiAgeyBrZXk6ICdzaW1wbGUtZ2l0LWhvb2tzJywgb3Zlcjogc29ydEdpdEhvb2tzIH0sXG4gIHsga2V5OiAncHJlLWNvbW1pdCcgfSxcbiAgeyBrZXk6ICdjb21taXRsaW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2xpbnQtc3RhZ2VkJyB9LFxuICB7IGtleTogJ25hbm8tc3RhZ2VkJyB9LFxuICB7IGtleTogJ2NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdub2RlbW9uQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJpZnknLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYmFiZWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcnNsaXN0JyB9LFxuICB7IGtleTogJ3hvJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3ByZXR0aWVyJywgb3Zlcjogc29ydFByZXR0aWVyQ29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50Q29uZmlnJywgb3Zlcjogc29ydEVzbGludENvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludElnbm9yZScgfSxcbiAgeyBrZXk6ICducG1wa2dqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1QYWNrYWdlSnNvbkxpbnRDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtcGFja2FnZWpzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbGVhc2UnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVtYXJrQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3N0eWxlbGludCcgfSxcbiAgeyBrZXk6ICdhdmEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LWp1bml0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3Qtc3RhcmUnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbW9jaGEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnljJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2M4Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3RhcCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvY2xpZicsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAncmVzb2x1dGlvbnMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb3ZlcnJpZGVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXZEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeShzb3J0T2JqZWN0QnlJZGVudCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICAvLyBUT0RPOiBvbmx5IHNvcnQgZGVwdGggPSAyXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2J1bmRsZWREZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnYnVuZGxlRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25QYWNrJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25EZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnZmxhdCcgfSxcbiAgeyBrZXk6ICdwYWNrYWdlTWFuYWdlcicgfSxcbiAgeyBrZXk6ICdlbmdpbmVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2VuZ2luZVN0cmljdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdkZXZFbmdpbmVzJywgb3Zlcjogc29ydERldkVuZ2luZXMgfSxcbiAgeyBrZXk6ICd2b2x0YScsIG92ZXI6IHNvcnRWb2x0YSB9LFxuICB7IGtleTogJ2xhbmd1YWdlTmFtZScgfSxcbiAgeyBrZXk6ICdvcycgfSxcbiAgeyBrZXk6ICdjcHUnIH0sXG4gIHsga2V5OiAncHJlZmVyR2xvYmFsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3B1Ymxpc2hDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2ljb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7XG4gICAga2V5OiAnYmFkZ2VzJyxcbiAgICBvdmVyOiBvbkFycmF5KChiYWRnZSkgPT4gYmFkZ2UubWFwKHNvcnRWU0NvZGVCYWRnZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdnYWxsZXJ5QmFubmVyJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwcmV2aWV3JyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdtYXJrZG93bicgfSxcbiAgeyBrZXk6ICdwbnBtJywgb3Zlcjogc29ydFBucG1Db25maWcgfSxcbl1cblxuY29uc3QgZGVmYXVsdFNvcnRPcmRlciA9IGZpZWxkcy5tYXAoKHsga2V5IH0pID0+IGtleSlcbmNvbnN0IG92ZXJGaWVsZHMgPSBwaXBlKFxuICBmaWVsZHNcbiAgICAubWFwKCh7IGtleSwgb3ZlciB9KSA9PiAob3ZlciA/IG92ZXJQcm9wZXJ0eShrZXksIG92ZXIpIDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pLFxuKVxuXG5mdW5jdGlvbiBlZGl0U3RyaW5nSlNPTihqc29uLCBvdmVyKSB7XG4gIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7IGluZGVudCwgdHlwZSB9ID0gZGV0ZWN0SW5kZW50KGpzb24pXG4gICAgY29uc3QgZW5kQ2hhcmFjdGVycyA9IGpzb24uc2xpY2UoLTEpID09PSAnXFxuJyA/ICdcXG4nIDogJydcbiAgICBjb25zdCBuZXdsaW5lID0gZGV0ZWN0TmV3bGluZShqc29uKVxuICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pXG5cbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIEpTT04uc3RyaW5naWZ5KG92ZXIoanNvbiksIG51bGwsIHR5cGUgPT09ICd0YWInID8gJ1xcdCcgOiBpbmRlbnQpICtcbiAgICAgIGVuZENoYXJhY3RlcnNcbiAgICBpZiAobmV3bGluZSA9PT0gJ1xcclxcbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXG4vZywgbmV3bGluZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG92ZXIoanNvbilcbn1cblxuZnVuY3Rpb24gc29ydFBhY2thZ2VKc29uKGpzb25Jc2gsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gZWRpdFN0cmluZ0pTT04oXG4gICAganNvbklzaCxcbiAgICBvbk9iamVjdCgoanNvbikgPT4ge1xuICAgICAgbGV0IHNvcnRPcmRlciA9IG9wdGlvbnMuc29ydE9yZGVyIHx8IGRlZmF1bHRTb3J0T3JkZXJcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc29ydE9yZGVyKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbilcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5cyA9IFtdLCBwdWJsaWNLZXlzID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgICAgICAgIGtleXMsXG4gICAgICAgICAgKGtleSkgPT4gKGtleVswXSA9PT0gJ18nID8gJ3ByaXZhdGVLZXlzJyA6ICdwdWJsaWNLZXlzJyksXG4gICAgICAgIClcbiAgICAgICAgc29ydE9yZGVyID0gW1xuICAgICAgICAgIC4uLnNvcnRPcmRlcixcbiAgICAgICAgICAuLi5kZWZhdWx0U29ydE9yZGVyLFxuICAgICAgICAgIC4uLnB1YmxpY0tleXMuc29ydCgpLFxuICAgICAgICAgIC4uLnByaXZhdGVLZXlzLnNvcnQoKSxcbiAgICAgICAgXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3ZlckZpZWxkcyhzb3J0T2JqZWN0S2V5cyhqc29uLCBzb3J0T3JkZXIpLCBqc29uKVxuICAgIH0pLFxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvcnRQYWNrYWdlSnNvblxuZXhwb3J0IHsgc29ydFBhY2thZ2VKc29uLCBkZWZhdWx0U29ydE9yZGVyIGFzIHNvcnRPcmRlciB9XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgICAgICBzY3JpcHRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgZGlkVXBkYXRlU2NyaXB0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NjcmlwdE5hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gc2NyaXB0LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICAgIGlmIChzY3JpcHQgIT09IG5ld1NjcmlwdCkge1xuICAgICAgICAgICAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBuZXdTY3JpcHQ7XG4gICAgICAgICAgICAgICAgZGlkVXBkYXRlU2NyaXB0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2FnZUpzb24uc2NyaXB0cyA9IHNjcmlwdHM7XG4gICAgICAgICAgICBpZiAoIWRpZFVwZGF0ZVNjcmlwdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKHBhY2thZ2VKc29uKSwgdW5kZWZpbmVkLCAyKSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aDogc3RyaW5nLCBuZXdUZXN0RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhuZXdUZXN0RGlyUGF0aCkpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihvbGRUZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBkaXJlbnRzLm1hcChhc3luYyAoZGlyZW50KSA9PiB7XG4gICAgICBjb25zdCBvbGRQYXRoID0gcGF0aC5qb2luKG9sZFRlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoID0gcGF0aC5qb2luKG5ld1Rlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoU3RhdCA9IGZzLmV4aXN0c1N5bmMobmV3UGF0aCkgPyBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KG5ld1BhdGgpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIG5ld1BhdGhTdGF0Py5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ob2xkVGVzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJywgJ3diZnknXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGxpbnRlciBmaXhcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHBrZy1wcmVmbGlnaHQgUFIgZmlsZSBsaXN0aW5nXG4gICAgICAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3Rlc3QtcnVzdCc6IHtcbiAgICBuYW1lOiAnVGVzdCBSdXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJywgJ3diZnknXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LXJ1c3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUoZW50cnkubmFtZSkpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBlbnRyeS5uYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ2F1dG9maXgueW1sJyxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnLFxuICAgICAgJ2Nsb3NlLWNvbW1lbnQueW1sJyxcbiAgICAgIC4uLmVudHJpZXNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSAmJiAhaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZShkaXJlbnQubmFtZSlcbiAgICAgICAgKVxuICAgICAgICAubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgndGVzdC1ydXN0LnltbCcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAvLyBUaGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBhbHJlYWR5IGZpeGVzIGFuZCBwdXNoZXMgY29kZSBvbiBwcml2YXRlIHJlcG9zLFxuICAgICAgLy8gc28gYSBzZXBhcmF0ZSBhdXRvZml4IHdvcmtmbG93IG9ubHkgZHVwbGljYXRlcyB0aGUgc2FtZSBwcm9jZXNzLlxuICAgICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdhdXRvZml4LnltbCcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnYXV0b2ZpeC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZXBvc2l0b3J5Py5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eZ2VuLXByKD86LS4rKT9cXC55YT9tbCQvdS50ZXN0KGZpbGVOYW1lKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKTtcblxuICBpZiAoa2luZCA9PT0gJ2F1dG9maXgnKSB7XG4gICAgYXdhaXQgd3JpdGVZYW1sKGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZyksIGZpbGVQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBIHRlc3QtcnVzdC55bWwgaW4gYSByZXBvIHdpdGhvdXQgUnVzdCBjb2RlIGlzIGEgY3VzdG9tIHdvcmtmbG93IHRoYXQgbWVyZWx5IHNoYXJlcyB0aGUgbmFtZTsgbGVhdmUgaXQgYWxvbmUuXG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0JyAmJiBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgLy8gU2tpcCBhIGJyb2tlbiB3b3JrZmxvd1xuICBpZiAoISgnam9icycgaW4gbmV3U2V0dGluZ3MpKSByZXR1cm47XG5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnKSB7XG4gICAgLy8gTWlncmF0ZSBoYW5kLXdyaXR0ZW4gUnVzdCB3b3JrZmxvd3MgKGUuZy4gYW4gaW5saW5lIGNhcmdvLWNoZWNrIGpvYikgdG8gdGhlIHJldXNhYmxlIHdvcmtmbG93LlxuICAgIGZvciAoY29uc3QgW2pvYk5hbWUsIGpvYl0gb2YgT2JqZWN0LmVudHJpZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzW2pvYk5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gIH1cblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cykge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJztcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOlxuICAgIGNhc2UgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgLy8gVGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3cgbm8gbG9uZ2VyIG5lZWRzIEFjdGlvbnMgd3JpdGUgYWNjZXNzLlxuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5hY3Rpb25zO1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuXG4gIGlmIChraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgam9iLnNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0Jykge1xuICAgIGNvbnN0IFtydXN0RGlyUGF0aF0gPSBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHM7XG4gICAgaWYgKHJ1c3REaXJQYXRoICYmIHJ1c3REaXJQYXRoICE9PSAnLicpIHtcbiAgICAgIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5ID0gcnVzdERpclBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyTGFiLycsICdXaWxsQm9vc3Rlci8nKTtcbiAgfSBlbHNlIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXIvJywgJ1dpbGxCb29zdGVyTGFiLycpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXJzXG4gIGlmIChqb2Iud2l0aC5kb3RfZW52X3BhdGggPT09ICcuZW52Jykge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5kb3RfZW52X3BhdGg7XG4gIH1cblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHMuRkxZX0FQSV9UT0tFTiAmJiB0eXBlb2Ygam9iLndpdGguZGVwbG95X2NvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGguZGVwbG95X2NvbW1hbmQgPSBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZC5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjYnIH0sXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9zZXR1cC1ub2RlQHY2Jywgd2l0aDogeyAnY2hlY2stbGF0ZXN0JzogdHJ1ZSwgJ25vZGUtdmVyc2lvbic6ICdsdHMvKicgfSB9LFxuICAgIC4uLihjb25maWcuaXNCdW4gPyBbeyB1c2VzOiAnb3Zlbi1zaC9zZXR1cC1idW5AdjInLCB3aXRoOiB7ICdidW4tdmVyc2lvbic6ICdsYXRlc3QnIH0gfV0gOiBbXSksXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCB9LFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGNsZWFudXBgIH0sXG4gIF07XG4gIGlmIChjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/LmJ1aWxkKSB7XG4gICAgc3RlcHMucHVzaCh7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBidWlsZGAgfSk7XG4gIH1cbiAgc3RlcHMucHVzaCh7IHVzZXM6ICdhdXRvZml4LWNpL2FjdGlvbkBjNWIyZDY3YWEyMjc0ZTdiNWExODIyNGU4MTcxNTUwODcxZmM3ZTRhJyB9KTtcblxuICBjb25zdCBhdXRvZml4V29ya2Zsb3cgPSBzdHJ1Y3R1cmVkQ2xvbmUocHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIGNvbnN0IGF1dG9maXhKb2IgPSBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID8/IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfTtcbiAgYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA9IHsgLi4uYXV0b2ZpeEpvYiwgc3RlcHMgfTtcbiAgcmV0dXJuIGF1dG9maXhXb3JrZmxvdztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB5YW1sVGV4dCA9IHJlbW92ZVRyYWlsaW5nU3BhY2VzKFxuICAgIHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xLCBub0NvbXBhdE1vZGU6IHRydWUsIHN0eWxlczogeyAnISFudWxsJzogJ2VtcHR5JyB9IH0pXG4gICk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVUcmFpbGluZ1NwYWNlcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBqcy15YW1sIGVtaXRzIHZhbHVlbGVzcyBHaXRIdWIgQWN0aW9ucyBldmVudHMgYXMgYGV2ZW50OiBgIHdoZW4gdXNpbmcgdGhlIGVtcHR5IG51bGwgc3R5bGUuXG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1sgXFx0XSskL2dtLCAnJyk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgXSxcbiAgICAgIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5Db2RlKG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWNcXC5mXFwuL2csICckMS8vJDJjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyllZ1xcLi9nLCAnJDEvLyQyZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWllXFwuL2csICckMS8vJDJpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5jb25zdCB3YkRhdGFiYXNlQ29tbWFuZFJlZ2V4ID0gL1xcYndiXFxzKyg/OmRifHByaXNtYSlcXGIvZ3U7XG5jb25zdCBtYXhUZXh0RmlsZUJ5dGVzID0gMTAyNCAqIDEwMjQ7XG5jb25zdCBtaWdyYXRpb25UYXJnZXRzID0gW1xuICAnKiovKi57Y2pzLGN0cyxqcyxqc29uLGpzeCxtZCxtZGMsbWpzLG10cyxzaCx0c3gsdHMsdG9tbCx0eHQseWFtbCx5bWx9JyxcbiAgJyoqLy5lbnYnLFxuICAnKiovLmVudi4qJyxcbiAgJyoqLy5naXRodWIvd29ya2Zsb3dzLyonLFxuICAnKiovLmdpdGlnbm9yZScsXG4gICcqKi8uZG9ja2VyaWdub3JlJyxcbiAgJyoqL0RvY2tlcmZpbGUnLFxuICAnKiovRG9ja2VyZmlsZS4qJyxcbiAgJyoqL01ha2VmaWxlJyxcbiAgJyoqL21pc2UudG9tbCcsXG4gICcqKi8ubWlzZS50b21sJyxcbiAgJyoqL2xlZnRob29rLnltbCcsXG4gICcqKi9wYWNrYWdlLmpzb24nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFdiRGJDb21tYW5kKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWddKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChyb290Q29uZmlnLnJlcG9BdXRob3IgPT09ICdXaWxsQm9vc3RlcicgJiYgcm9vdENvbmZpZy5yZXBvTmFtZSA9PT0gJ3NoYXJlZCcpIHJldHVybjtcblxuICBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbDx2b2lkPigpO1xuICAvLyBgcnVuKClgIHJlc29sdmVzIGFmdGVyIGEgdGFzayBlbnRlcnMgdGhlIHBvb2wsIHdoaWxlIGBwcm9taXNlQWxsKClgIHdhaXRzXG4gIC8vIGZvciBhZG1pdHRlZCB0YXNrcyB0byBmaW5pc2guIEJvdGggd2FpdHMgYXJlIG5lZWRlZCB0byBjb3ZlciBxdWV1ZWQgd29yay5cbiAgY29uc3QgcmVwbGFjZW1lbnRQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGZvciAoY29uc3QgY29uZmlnIG9mIHBhY2thZ2VDb25maWdzKSB7XG4gICAgY29uc3QgY29tbWFuZCA9IHNlbGVjdFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyk7XG4gICAgaWYgKCFjb21tYW5kKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnKG1pZ3JhdGlvblRhcmdldHMsIHtcbiAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGlnbm9yZTogWycqKi8uZ2l0LyoqJywgLi4uKGNvbmZpZy5pc1Jvb3QgPyBbJ3BhY2thZ2VzLyoqJ10gOiBbXSksIC4uLmdsb2JJZ25vcmVdLFxuICAgICAgb25seUZpbGVzOiB0cnVlLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgICByZXBsYWNlbWVudFByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IHJlcGxhY2VXYkRhdGFiYXNlQ29tbWFuZChmaWxlUGF0aCwgY29tbWFuZCkpKTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwocmVwbGFjZW1lbnRQcm9taXNlcyk7XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3diIGRiJyB8ICd3YiBwcmlzbWEnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSByZXR1cm4gJ3diIHByaXNtYSc7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHJldHVybiAnd2IgZGInO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXBsYWNlV2JEYXRhYmFzZUNvbW1hbmQoZmlsZVBhdGg6IHN0cmluZywgY29tbWFuZDogJ3diIGRiJyB8ICd3YiBwcmlzbWEnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkVGV4dEZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIWNvbnRlbnQpIHJldHVybjtcblxuICAvLyBUZW1wb3JhcnkgbWlncmF0aW9uOiBub3JtYWxpemUgY29tbWFuZCBzcGVsbGluZyBieSBPUk0gc28gUHJpc21hIGtlZXBzIHRoZVxuICAvLyBuYXRpdmUgY29tbWFuZCBuYW1lIHdoaWxlIERyaXp6bGUgdXNlcyB0aGUgZ2VuZXJpYyBkYXRhYmFzZSBjb21tYW5kLlxuICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKHdiRGF0YWJhc2VDb21tYW5kUmVnZXgsIGNvbW1hbmQpO1xuICBpZiAobmV3Q29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkVGV4dEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gIGlmIChzdGF0cy5zaXplID4gbWF4VGV4dEZpbGVCeXRlcykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBidWZmZXIgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gIGlmIChidWZmZXIuaW5jbHVkZXMoMCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygndXRmOCcpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgQUdFTlRTX0VYVFJBLm1kIGV4aXN0cyBhbmQgcmVhZCBpdHMgY29udGVudFxuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgdG9vbE5hbWVdIG9mIFtcbiAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgIFsnR0VNSU5JLm1kJywgJ0dlbWluaSBDTEknXSxcbiAgICBdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCBleHRyYUNvbnRlbnQpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCBleHRyYUNvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZChyb290Q29uZmlnKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbjtcbiAgLy8gV2lsbEJvb3N0ZXIgUmFpbHdheSBwcm9qZWN0IGlkZW50aWZpZXJzIGFyZSBtYW5hZ2VkIGluIGRlcGxveSB3b3JrZmxvdyBzZXR0aW5ncy5cbiAgY29uc3QgcmFpbHdheUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1JhaWx3YXlcbiAgICA/ICdcXG4tIFJhaWx3YXkgcHJvamVjdCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgLidcbiAgICA6ICcnO1xuICBjb25zdCBwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9uID0gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncylcbiAgICA/IGBcXG4tIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBzdGFydCAtLW1vZGUgdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJztcbiAgY29uc3QgY29BdXRob3JJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4gIC0gRW5kIHlvdXIgY29tbWl0IG1lc3NhZ2Ugd2l0aCBhIGJsYW5rIGxpbmUgZm9sbG93ZWQgYnkgXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGAuYFxuICAgIDogJyc7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCAndW5rbm93bid9XFxgJHtkZXNjcmlwdGlvbiA/IGBcXG4tIERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWAgOiAnJ31cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIElmIG9uIFxcYG1haW5cXGAsIGNyZWF0ZSBhIG5ldyBicmFuY2g7IG90aGVyd2lzZSB3b3JrIG9uIHRoZSBjdXJyZW50IGJyYW5jaC5cbi0gUnVuIFxcYGdpdFxcYCBjb21tYW5kcyBvbmUgYXQgYSB0aW1lIHRvIGF2b2lkIFxcYGluZGV4LmxvY2tcXGAgY29uZmxpY3RzLlxuLSBXcml0ZSB0ZXN0cyB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBvciB3aGVuIHlvdSBqdWRnZSB0aGUgY2hhbmdlIHdvcnRoIHRlc3Rpbmc7IHdpdGhvdXQgYSByZXF1ZXN0LCBjb3ZlciBvbmx5IHRoZSBlc3NlbnRpYWwgYmVoYXZpb3IuXG4tIFdoZW4gd3JpdGluZyB0ZXN0cywgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIENvbnRpbnVlIG1vZGlmeWluZyB0ZXN0cyBhbmQvb3IgY29kZSB1bnRpbCBhbGwgdGVzdHMgcGFzcy5cbiAgLSBFbnN1cmUgdGVzdHMgYXJlIGlkZW1wb3RlbnQgYW5kIGluZGVwZW5kZW50IChlLmcuLCByZXNldCBwZXJzaXN0ZW50IGRhdGEpIHNvIHRoZXkgY2FuIHJ1biByZXBlYXRlZGx5IG9yIGluIHBhcmFsbGVsLlxuICAtIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MsIHVubGVzcyBhY3R1YWwgY2FsbHMgYXJlIGltcHJhY3RpY2FsLCBoYXZlIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLCBvciBtb2NrcyBhcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gIC0gQXZvaWQgZml4ZWQgd2FpdHMgaW4gRTJFIHRlc3RzOyB3YWl0IGZvciBjb25kaXRpb25zIGluc3RlYWQuXG4tIFdoZW4gZml4aW5nIGlzc3VlcyAoaW5jbHVkaW5nIHRlc3QgZmFpbHVyZXMpLCBpbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBmaXJzdCAoZS5nLiwgdmlhIGRlYnVnIGxvZ3Mgb3Igc2NyZWVuc2hvdHMpIGFuZCBmaXggaXQgaW5zdGVhZCBvZiBhcHBseWluZyB3b3JrYXJvdW5kcy5cbi0gQWZ0ZXIgbWFraW5nIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSB2ZXJpZnlcXGAgKHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmc7IHRha2VzIHVwIHRvIDEwIG1pbnV0ZXMpLCBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSB2ZXJpZnktZnVsbFxcYCAoYWxsIHRlc3RzOyB0YWtlcyB1cCB0byAxIGhvdXIpIGlmIHlvdSBjaGFuZ2VkIHJ1bnRpbWUgYmVoYXZpb3Igb3IgdGVzdHMuIEZpeCBlcnJvcnMgYW5kIHJlLXJ1biB1bnRpbCBpdCBwYXNzZXMuXG4tIE9uY2UgdmVyaWZpZWQsIGNvbW1pdCBhbmQgcHVzaCB0byB0aGUgY3VycmVudCAobm9uLW1haW4pIGJyYW5jaCwgYW5kIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYCBpZiBub25lIGV4aXN0cyBmb3IgdGhlIGJyYW5jaC5cbiAgLSBGb2xsb3cgdGhlIENvbnZlbnRpb25hbCBDb21taXRzIGZvcm1hdCAoZS5nLiwgXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGApLiR7Y29BdXRob3JJbnN0cnVjdGlvbn1cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzOyBhdm9pZCBcXGAtLWFtZW5kXFxgLlxuLSBVc2UgaGVyZWRvYyBmb3IgbXVsdGktbGluZSBjb21tYW5kIGlucHV0IChlLmcuLCBcXGBnaXQgY29tbWl0IC1GIC1cXGAsIFxcYGdoIHByIGNyZWF0ZSAtLWJvZHktZmlsZSAtXFxgKS5cbi0gUHV0IHRlbXBvcmFyeSBmaWxlcyBpbiBcXGAudG1wXFxgOyB1c2UgXFxgL3RtcFxcYCBvbmx5IGZvciBmaWxlcyB0aGF0IG11c3QgbGl2ZSBvdXRzaWRlIHRoZSByZXBvLiR7cmFpbHdheUluc3RydWN0aW9ufSR7cGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZmlsZSBuYW1lcyBmb3IgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IChQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzKS5cbi0gU2ltcGxpZnkgY29kZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSByZWR1bmRhbmN5LlxuLSBEZXNpZ24gbW9kdWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aCBoaWdoIGNvaGVzaW9uIGFuZCBsb3cgY291cGxpbmc7IHNwbGl0IGxhcmdlIG1vZHVsZXMgd2hlbiBuZWVkZWQuXG4tIFBsYWNlIGNhbGxpbmcgZnVuY3Rpb25zIGFib3ZlIHRoZSBmdW5jdGlvbnMgdGhleSBjYWxsICh0b3AtZG93biBvcmRlcik7IHBsYWNlIHZhcmlhYmxlIGFuZCB0eXBlIGRlY2xhcmF0aW9ucyBhYm92ZSB0aGVpciB1c2FnZS5cbi0gV3JpdGUgY29tbWVudHMgYW5kIEpTRG9jIG9ubHkgZm9yIGhhcmQtdG8tdW5kZXJzdGFuZCBjb2RlOiBleHBsYWluIFwid2h5XCIgaW4gY29tbWVudHMgYW5kIFwid2hhdFwiIGluIEpTRG9jLlxuLSBJZiBsaW50IGVycm9ycyBvciB3YXJuaW5ncyBjYW5ub3QgYmUgZml4ZWQsIHVzZSBpZ25vcmUgY29tbWVudHMgd2l0aCByZWFzb25zIChlLmcuLCBcXGAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgPHJ1bGU+IC0tIDxyZWFzb24+XFxgKS5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBCdWlsZCBwcm9tcHRzIGFzIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgb24gYSBwcmUtY29tcHV0YWJsZSBhcnJheSBvZiBzdHJpbmdzLlxuLSBBc3N1bWUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZDsgaWYgdmFsaWRhdGlvbiBpcyBuZWVkZWQsIFxcYGFzc2VydFxcYCBhdCBzdGFydHVwIHRvIGZhaWwgZmFzdC5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gV2hlbiBhZGRpbmcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHJlZ2lzdGVyIHRoZW0gaW4gdGhlIFxcYGkxOG5cXGAgcmVzb3VyY2UgZmlsZXMgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGUgXFxgaTE4blxcYCB1dGlsaXR5IChlLmcuLCBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgKS5gXG4gICAgOiAnJ1xufVxuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBQcmVmZXIgbGFtYmRhIG92ZXIgXFxgZnVuY3Rpb25cXGAgZm9yIFJlYWN0IGNvbXBvbmVudHMsIGUuZy4sIFxcYGNvbnN0IEJ1dHRvbjogUmVhY3QuRkMgPSAoKSA9PiB7XFxgLlxuLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgb3ZlciBcXGB1c2VTdGF0ZVxcYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzLlxuLSBVc2UgXFxgYXV0b0ZvY3VzXFxgIHdoZXJlIGl0IHJlZHVjZXMgdXNlciBlZmZvcnQuYFxuICAgIDogJydcbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGBcbi0gVGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCBzbyBcXGB1c2VDYWxsYmFja1xcYCBhbmQgXFxgdXNlTWVtb1xcYCBhcmUgdW5uZWNlc3NhcnkgZm9yIHBlcmZvcm1hbmNlLlxuLSBBc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLlxuYFxuICAgIDogJydcbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnc21vbC10b21sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgQnVuZmlnVG9tbCB7XG4gIGluc3RhbGw/OiB7XG4gICAgZXhhY3Q/OiBib29sZWFuO1xuICB9O1xuICBydW4/OiB7XG4gICAgYnVuPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyA9IDQzMl8wMDA7XG5cbi8vIFBsYXRmb3JtIHNldHMgbXVzdCBtYXRjaCBlYWNoIHBhY2thZ2UncyBvcHRpb25hbERlcGVuZGVuY2llcyBvbiBucG0gYmVjYXVzZVxuLy8gQnVuIGNoZWNrcyBhbGwgcGxhdGZvcm0gYmluYXJpZXMgaW4gdGhlIGxvY2tmaWxlLCBub3QganVzdCB0aGUgY3VycmVudCBvbmUuXG4vLyBLZWVwIHdpbjMyIGVudHJpZXMgZXZlbiB0aG91Z2ggd2UgZHJvcCBXaW5kb3dzIHN1cHBvcnQ6IG9taXR0aW5nIGFueVxuLy8gcGxhdGZvcm0gbWFrZXMgYGJ1biBhZGRgIGZhaWwgdW50aWwgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93IGVsYXBzZXMuXG5jb25zdCB0eXBlc2NyaXB0UGxhdGZvcm1zID0gW1xuICAnYWl4LXBwYzY0JyxcbiAgJ2Rhcndpbi1hcm02NCcsXG4gICdkYXJ3aW4teDY0JyxcbiAgJ2ZyZWVic2QtYXJtNjQnLFxuICAnZnJlZWJzZC14NjQnLFxuICAnbGludXgtYXJtJyxcbiAgJ2xpbnV4LWFybTY0JyxcbiAgJ2xpbnV4LWxvb25nNjQnLFxuICAnbGludXgtbWlwczY0ZWwnLFxuICAnbGludXgtcHBjNjQnLFxuICAnbGludXgtcmlzY3Y2NCcsXG4gICdsaW51eC1zMzkweCcsXG4gICdsaW51eC14NjQnLFxuICAnbmV0YnNkLWFybTY0JyxcbiAgJ25ldGJzZC14NjQnLFxuICAnb3BlbmJzZC1hcm02NCcsXG4gICdvcGVuYnNkLXg2NCcsXG4gICdzdW5vcy14NjQnLFxuICAnd2luMzItYXJtNjQnLFxuICAnd2luMzIteDY0Jyxcbl07XG5jb25zdCBveGNCaW5kaW5nUGxhdGZvcm1zID0gW1xuICAnYW5kcm9pZC1hcm0tZWFiaScsXG4gICdhbmRyb2lkLWFybTY0JyxcbiAgJ2Rhcndpbi1hcm02NCcsXG4gICdkYXJ3aW4teDY0JyxcbiAgJ2ZyZWVic2QteDY0JyxcbiAgJ2xpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnbGludXgtYXJtNjQtZ251JyxcbiAgJ2xpbnV4LWFybTY0LW11c2wnLFxuICAnbGludXgtcHBjNjQtZ251JyxcbiAgJ2xpbnV4LXJpc2N2NjQtZ251JyxcbiAgJ2xpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdsaW51eC1zMzkweC1nbnUnLFxuICAnbGludXgteDY0LWdudScsXG4gICdsaW51eC14NjQtbXVzbCcsXG4gICdvcGVuaGFybW9ueS1hcm02NCcsXG4gICd3aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ3dpbjMyLWlhMzItbXN2YycsXG4gICd3aW4zMi14NjQtbXN2YycsXG5dO1xuY29uc3QgdHNnb2xpbnRQbGF0Zm9ybXMgPSBbJ2Rhcndpbi1hcm02NCcsICdkYXJ3aW4teDY0JywgJ2xpbnV4LWFybTY0JywgJ2xpbnV4LXg2NCcsICd3aW4zMi1hcm02NCcsICd3aW4zMi14NjQnXTtcbmNvbnN0IG5leHRSc3BhY2tQbGF0Zm9ybXMgPSBbXG4gICdhbmRyb2lkLWFybS1lYWJpJyxcbiAgJ2FuZHJvaWQtYXJtNjQnLFxuICAnZGFyd2luLWFybTY0JyxcbiAgJ2Rhcndpbi14NjQnLFxuICAnbGludXgtYXJtLWdudWVhYmloZicsXG4gICdsaW51eC1hcm02NC1nbnUnLFxuICAnbGludXgtYXJtNjQtbXVzbCcsXG4gICdsaW51eC14NjQtZ251JyxcbiAgJ2xpbnV4LXg2NC1tdXNsJyxcbiAgJ3dpbjMyLWFybTY0LW1zdmMnLFxuICAnd2luMzItaWEzMi1tc3ZjJyxcbiAgJ3dpbjMyLXg2NC1tc3ZjJyxcbl07XG5jb25zdCBuZXh0U3djUGxhdGZvcm1zID0gW1xuICAnYW5kcm9pZC1hcm0tZWFiaScsXG4gICdhbmRyb2lkLWFybTY0JyxcbiAgJ2Rhcndpbi1hcm02NCcsXG4gICdkYXJ3aW4teDY0JyxcbiAgJ2ZyZWVic2QteDY0JyxcbiAgJ2xpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnbGludXgtYXJtNjQtZ251JyxcbiAgJ2xpbnV4LWFybTY0LW11c2wnLFxuICAnbGludXgteDY0LWdudScsXG4gICdsaW51eC14NjQtbXVzbCcsXG4gICd3YXNtLW5vZGVqcycsXG4gICd3YXNtLXdlYicsXG4gICd3aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ3dpbjMyLWlhMzItbXN2YycsXG4gICd3aW4zMi14NjQtbXN2YycsXG5dO1xuXG5leHBvcnQgY29uc3QgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAnQHdpbGxib29zdGVyLXByaXZhdGUvYWdlbnRpYy13b3JrZmxvd3MnLFxuICAnQHdpbGxib29zdGVyL2FnZW50LXNraWxscycsXG4gICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLWxvYWRlcicsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICdhdC1kZWNvcmF0b3JzJyxcbiAgJ2J1aWxkLXRzJyxcbiAgJ2dlbi1pMThuLXRzJyxcbiAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gIC8vIHdiZnkgcGlucyB0aGVzZSB0b29saW5nIHBhY2thZ2VzIGFuZCBtYXkgYXBwbHkgdGhlbSBpbW1lZGlhdGVseSBhZnRlciBhXG4gIC8vIHJlbGVhc2UsIGJlZm9yZSB0aGUgZ2xvYmFsIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93IGhhcyBlbGFwc2VkLlxuICAndHlwZXNjcmlwdCcsXG4gIC4uLnR5cGVzY3JpcHRQbGF0Zm9ybXMubWFwKChwbGF0Zm9ybSkgPT4gYEB0eXBlc2NyaXB0L3R5cGVzY3JpcHQtJHtwbGF0Zm9ybX1gKSxcbiAgLy8gQnVuIGl0c2VsZiByZWxlYXNlcyBpdHMgZmlyc3QtcGFydHkgdHlwZSBwYWNrYWdlcyBpbiBsb2Nrc3RlcCB3aXRoIHRoZVxuICAvLyBydW50aW1lLCBzbyBnZW5lcmF0ZWQgQnVuIHJlcG9zIG11c3QgYmUgYWJsZSB0byBpbnN0YWxsIHRoZW0gaW1tZWRpYXRlbHkuXG4gICdAdHlwZXMvYnVuJyxcbiAgJ2J1bi10eXBlcycsXG4gICdveGZtdCcsXG4gIC4uLm94Y0JpbmRpbmdQbGF0Zm9ybXMubWFwKChwbGF0Zm9ybSkgPT4gYEBveGZtdC9iaW5kaW5nLSR7cGxhdGZvcm19YCksXG4gICdveGxpbnQnLFxuICAuLi5veGNCaW5kaW5nUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAb3hsaW50L2JpbmRpbmctJHtwbGF0Zm9ybX1gKSxcbiAgJ294bGludC10c2dvbGludCcsXG4gIC4uLnRzZ29saW50UGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAb3hsaW50LXRzZ29saW50LyR7cGxhdGZvcm19YCksXG4gICdAbmV4dC9lbnYnLFxuICAnQG5leHQvZm9udCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZycsXG4gIC4uLm5leHRSc3BhY2tQbGF0Zm9ybXMubWFwKChwbGF0Zm9ybSkgPT4gYEBuZXh0L3JzcGFjay1iaW5kaW5nLSR7cGxhdGZvcm19YCksXG4gIC4uLm5leHRTd2NQbGF0Zm9ybXMubWFwKChwbGF0Zm9ybSkgPT4gYEBuZXh0L3N3Yy0ke3BsYXRmb3JtfWApLFxuICAnQG5leHQvdGhpcmQtcGFydGllcycsXG4gICduZXh0JyxcbiAgJ3JlYWN0JyxcbiAgJ3JlYWN0LWRvbScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IG5ld0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbCl9XG5baW5zdGFsbF1cbmV4YWN0ID0gJHtidW5maWdUb21sPy5pbnN0YWxsPy5leGFjdCA9PT0gZmFsc2UgPyAnZmFsc2UnIDogJ3RydWUnfVxubGlua2VyID0gXCJob2lzdGVkXCJcbm1pbmltdW1SZWxlYXNlQWdlID0gJHtidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHN9ICMgNSBkYXlzXG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHtidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBidW5maWdUb21sPy5ydW4/LmJ1biA9PT0gJ2Jvb2xlYW4nID8gYFtydW5dXFxuYnVuID0gJHtidW5maWdUb21sLnJ1bi5idW59XFxuYCA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2RlIGRlcGxveXMgR2l0LWJhc2VkIHByaXZhdGUgcGFja2FnZXMgZnJvbSBub2RlX21vZHVsZXMsIGJ1dCB0aGUgRG9ja2VyIGNvbnRleHQgc2hvdWxkIHN0YXkgbmFycm93LlxuY29uc3QgaW5jbHVkZWROb2RlTW9kdWxlc1BhdHRlcm5zID0gWydAd2lsbGJvb3N0ZXInXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5EU19TdG9yZVxuKiovLmNhY2hlXG4qKi8uY2xhdWRlXG4qKi8uY3Vyc29yXG4qKi8uZWRpdG9yY29uZmlnXG4qKi8uZXNsaW50Y2FjaGVcbioqLy5nZW1pbmlcbioqLy5naXRcbioqLy5naXRhdHRyaWJ1dGVzXG4qKi8uZ2l0aHViXG4qKi8uZ2l0aWdub3JlXG4qKi8uaWRlYVxuKiovLmxlZnRob29rXG4qKi8ubXlweV9jYWNoZVxuKiovLm5leHQvY2FjaGVcbioqLy5ucG1cbioqLy5wYXJjZWwtY2FjaGVcbioqLy5wbnBtLXN0b3JlXG4qKi8ucHl0ZXN0X2NhY2hlXG4qKi8ucmFpbHdheWlnbm9yZVxuKiovLnJlbGVhc2VyYy5qc29uXG4qKi8ucnVmZl9jYWNoZVxuKiovLnRtcFxuKiovLnR1cmJvXG4qKi8udG94XG4qKi8udnNjb2RlXG4qKi8ueWFybi9jYWNoZVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbioqL19fcHljYWNoZV9fXG4qKi8qLmxvZ1xuKiovKi5weWNcbioqLyoudHNidWlsZGluZm9cbioqL2NvdmVyYWdlXG4qKi9ub2RlX21vZHVsZXMvKipcbiR7aW5jbHVkZWROb2RlTW9kdWxlc1BhdHRlcm5zXG4gIC5tYXAoXG4gICAgKHBhdHRlcm4pID0+IGAhKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn1cbiEqKi9ub2RlX21vZHVsZXMvJHtwYXR0ZXJufS8qKmBcbiAgKVxuICAuam9pbignXFxuJyl9XG4qKi9ub2RlX21vZHVsZXMvLmNhY2hlXG4qKi9wbGF5d3JpZ2h0LXJlcG9ydFxuKiovc3Rvcnlib29rLXN0YXRpY1xuKiovdGFyZ2V0XG4qKi90ZXN0LXJlc3VsdHNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGRlZmF1bHRDb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkXG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAobmV3Q29uZmlnLCB7XG4gICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcbiAgICBjb25zdCBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50Py50cmltU3RhcnQoKS5zdGFydHNXaXRoKCcjJykgPyB1bmRlZmluZWQgOiBleHRyYUNvbnRlbnQ7XG4gICAgY29uc3QgcmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbiA9IGNvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICAgID8gJ1JldmlldyBpbiBFbmdsaXNoIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy4nXG4gICAgICA6ICfku6XkuIvjga7jgrPjg7zjg4fjgqPjg7PjgrDopo/ntITjgpLouI/jgb7jgYjjgabjgIHml6XmnKzoqp7jgafjg6zjg5Pjg6Xjg7zjgZfjgabjgY/jgaDjgZXjgYTjgIInO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYCR7cmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbn1cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX0ke1xuICAgICAgY29kaW5nUnVsZUV4dHJhQ29udGVudCA/IGBcXG4ke2NvZGluZ1J1bGVFeHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSxcbiAgICBdO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBEbyBub3QgcmVtb3ZlIGB3aW5kb3dzYDogZ2VuZXJhdGVkIC5naXRpZ25vcmUgZmlsZXMgbXVzdCBrZWVwIGlnbm9yaW5nIFdpbmRvd3MtY3JlYXRlZCBsb2NhbCBhcnRpZmFjdHMuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbl9fZ2VuZXJhdGVkX18vXG4hLmtlZXBcbi5haWRlcipcbi5hbnRpZ3Jhdml0eWNsaS9cbi5jbGF1ZGUvKi5sb2NhbC4qXG4uY2xhdWRlL3NjaGVkdWxlZF90YXNrcy5sb2NrXG4uZGV2Y29udGFpbmVyL1xuLmVudi5wcm9kdWN0aW9uXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnBsYXl3cmlnaHQtbWNwL1xuLnNlcmVuYS9cbi50bXAvXG4udG9rZW5zYXZlL1xuLndiL1xuQHdpbGxib29zdGVyL1xuKi9tb3VudC8qLmhhc2hcbkNMQVVERS5sb2NhbC5tZFxuZGlzdC9cbmRyaXp6bGUvbW91bnQvXG50ZW1wL1xudG1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSB8fCBjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1c3QnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnKSB7XG4gICAgICAvLyAhQ2FyZ28ubG9jayBvdmVycmlkZXMgYW55IHByZS1leGlzdGluZyB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBmcm9tIGFcbiAgICAgIC8vIHBhcmVudCAuZ2l0aWdub3JlLCBzbyB0aGUgYXBwbGljYXRpb24gbG9ja2ZpbGUgc3RheXMgY29tbWl0dGFibGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCFDYXJnby5sb2NrXG5zcmMtdGF1cmkvZ2VuL3NjaGVtYXMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0Nsb3VkZmxhcmUgfHwgcm9vdENvbmZpZy5pc0Nsb3VkZmxhcmUpIHtcbiAgICAgIC8vIC5kZXYudmFycyogaG9sZCBsb2NhbCBzZWNyZXRzIGZvciB3cmFuZ2xlciBkZXYgYW5kIG11c3QgbmV2ZXIgYmUgY29tbWl0dGVkLFxuICAgICAgLy8gdW5saWtlIHRoZSBjb21taXR0ZWQgLmVudi8uZW52LnN0YWdpbmcgZmlsZXMgb2YgdGhlIFdpbGxCb29zdGVyIGNvbnZlbnRpb24uXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi53cmFuZ2xlci9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICAvLyBUaGUgcnVzdCB0ZW1wbGF0ZSdzIHVuYW5jaG9yZWQgZGVidWcvIHdvdWxkIGFsc28gaGlkZSBmcm9udGVuZCBzb3VyY2VcbiAgICAgIC8vIGRpcmVjdG9yaWVzIHN1Y2ggYXMgc3JjL2RlYnVnLzsgY2FyZ28gb3V0cHV0IGlzIGFscmVhZHkgY292ZXJlZCBieSB0YXJnZXQvLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15kZWJ1Z1xcLyQvZ20sICcjIGRlYnVnLycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWcgfHwgY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKSB7XG4gICAgICAvLyBUaGUgcnVzdCB0ZW1wbGF0ZSBpZ25vcmVzIENhcmdvLmxvY2ssIGJ1dCBhIHNyYy10YXVyaSBjb25maWd1cmF0aW9uIG1hcmtzIGFuXG4gICAgICAvLyBhcHBsaWNhdGlvbiwgd2hvc2UgQ2FyZ28ubG9jayBtdXN0IGJlIGNvbW1pdHRlZCBmb3IgcmVwcm9kdWNpYmxlIGJ1aWxkcy4gVGhlXG4gICAgICAvLyBydWxlIGlzIGFsc28gZGlzYWJsZWQgd2hlbiBhIHN1YiBwYWNrYWdlIGNvbnRhaW5zIGEgVGF1cmkgYXBwbGljYXRpb24sIGJlY2F1c2VcbiAgICAgIC8vIGFuIHVuYW5jaG9yZWQgQ2FyZ28ubG9jayBydWxlIGluIGEgcGFyZW50IC5naXRpZ25vcmUgd291bGQgaGlkZSB0aGUgbmVzdGVkXG4gICAgICAvLyBhcHBsaWNhdGlvbidzIGxvY2tmaWxlLiBUYXVyaSBwbHVnaW4gbGlicmFyaWVzIChkZXRlY3RlZCBvbmx5IHZpYVxuICAgICAgLy8gQHRhdXJpLWFwcHMvKiBkZXBlbmRlbmNpZXMpIGtlZXAgdGhlIHRlbXBsYXRlJ3MgcG9saWN5IG9mIGlnbm9yaW5nIENhcmdvLmxvY2suXG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXkNhcmdvXFwubG9jayQvZ20sICcjIENhcmdvLmxvY2snKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBLZWVwIHBhY2thZ2UtbWFuYWdlciBzaGltcyBpbiB0aGUgRmlsZSBXYXRjaGVyIHByb2dyYW0gZmllbGQgc28gbm9kZSBkb2VzIG5vdFxuLy8gcGFyc2Ugd3JhcHBlciBzY3JpcHRzIHBhc3NlZCB0aHJvdWdoIGFyZ3VtZW50cy5cbmNvbnN0IG94Zm10UHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL294Zm10JztcbmNvbnN0IHByZXR0aWVyUHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZylcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWcpKSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhc2tPcHRpb25zID0gW1xuICAgIHtcbiAgICAgIGFyZ3M6ICctLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLm94Zm10LFxuICAgICAgbmFtZTogJ094Zm10JyxcbiAgICAgIHByb2dyYW06IG94Zm10UHJvZ3JhbSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFyZ3M6ICctLWNhY2hlIC0td3JpdGUnLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkphdmEoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5LFxuICAgICAgbmFtZTogJ1ByZXR0aWVyJyxcbiAgICAgIHByb2dyYW06IHByZXR0aWVyUHJvZ3JhbSxcbiAgICB9LFxuICBdXG4gICAgLmZpbHRlcigodGFzaykgPT4gdGFzay5jb25kaXRpb24pXG4gICAgLmZsYXRNYXAoKHRhc2spID0+IHRhc2suZXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnModGFzay5wcm9ncmFtLCB0YXNrLmFyZ3MsIHRhc2submFtZSwgZXh0KSkpO1xuXG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4gICAgJHt0YXNrT3B0aW9ucy5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJyB8ICdpc0J1bic+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBgJHtjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJ30gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICByZXR1cm4gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQudHJpbSgpIDogc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgY29uc3Qga2V5ID0gb3duZXIgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gW1xuICAnQHRzY29uZmlnL2J1bicsXG4gICdAdHNjb25maWcvbm9kZS1sdHMnLFxuICAnQHRzY29uZmlnL25vZGUtdHMnLFxuICAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZScsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZS90c2NvbmZpZy5qc29uJztcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvbm9kZS1sdHMvdHNjb25maWcuanNvbicsICdAdHNjb25maWcvbm9kZS10cy90c2NvbmZpZy5qc29uJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9idW4nXTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnXTtcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvbm9kZS1sdHMnLCAnQHRzY29uZmlnL25vZGUtdHMnXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJlxuICAgICFjb25maWcuaXNSb290ICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5wcml2YXRlICE9PSB0cnVlICYmXG4gICAgQXJyYXkuaXNBcnJheShjb25maWcucGFja2FnZUpzb24/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxudHlwZSBTZXR0aW5ncyA9IHtcbiAgYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXM/OiBzdHJpbmdbXTtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIGVuYWJsZVNjcmlwdHM/OiBib29sZWFuO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBucG1NaW5pbWFsQWdlR2F0ZT86IHN0cmluZztcbiAgbnBtUHJlYXBwcm92ZWRQYWNrYWdlcz86IHN0cmluZ1tdO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59ICYgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+O1xuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCB5YXJuTnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuZXhwb3J0IGNvbnN0IHlhcm5OcG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAvLyAtLS0tLS0tLS0tIFNUQVJUOiBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG4gICdAZXhlcmNvZGUvKicsXG4gICdAd2lsbGJvb3N0ZXIvKicsXG4gICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICdhdC1kZWNvcmF0b3JzJyxcbiAgJ2J1aWxkLXRzJyxcbiAgJ2dlbi1pMThuLXRzJyxcbiAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gIC8vIFRvIGRlYWwgd2l0aCBDVkUgbGlrZSBodHRwczovL25leHRqcy5vcmcvYmxvZy9DVkUtMjAyNS02NjQ3OFxuICAnbmV4dCcsXG4gICdAbmV4dC8qJyxcbiAgJ0B0eXBlcy8qJyxcbiAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgYHR5cGVzY3JpcHRgOyBgQHR5cGVzY3JpcHQvKmAgY292ZXJzIGl0cyBwbGF0Zm9ybSBiaW5hcmllcy5cbiAgJ3R5cGVzY3JpcHQnLFxuICAnQHR5cGVzY3JpcHQvKicsXG4gICdAb3hmbXQvKicsXG4gICdAb3hsaW50LyonLFxuICAnQG94bGludC10c2dvbGludC8qJyxcbiAgJ294Zm10JyxcbiAgJ294bGludCcsXG4gICdveGxpbnQtdHNnb2xpbnQnLFxuICAncmVhY3QnLFxuICAncmVhY3QtZG9tJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoaXNOZXdlclZlcnNpb24obGF0ZXN0VmVyc2lvbiwgY3VycmVudFZlcnNpb24pKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgbGV0IHNldHRpbmdzID0ge30gYXMgU2V0dGluZ3M7XG4gICAgdHJ5IHtcbiAgICAgIHNldHRpbmdzID0gKHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncyB8IHVuZGVmaW5lZCkgPz8gc2V0dGluZ3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIC8vIEluc3RhbGwtdGltZSBzY3JpcHRzIGFyZSBhIGNvbW1vbiBzdXBwbHktY2hhaW4gZXhlY3V0aW9uIHBhdGguIEtlZXAgdGhpc1xuICAgIC8vIGV4cGxpY2l0IHNvIHN0YWxlIHByb2plY3Qgc2V0dGluZ3MgY2Fubm90IHJlLWVuYWJsZSB0aGVtIGdsb2JhbGx5LlxuICAgIHNldHRpbmdzLmVuYWJsZVNjcmlwdHMgPSBmYWxzZTtcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIHNldHRpbmdzLm5wbU1pbmltYWxBZ2VHYXRlID0geWFybk5wbU1pbmltYWxBZ2VHYXRlO1xuICAgIHNldHRpbmdzLmFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzID0gW1xuICAgICAgLy8gWWFybiA0LjE0IGJsb2NrcyBnaXQgZGVwZW5kZW5jaWVzIHVubGVzcyB0aGUgcmVwb3NpdG9yeSBVUkwgaXMgZXhwbGljaXRseSBhbGxvd2VkLlxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvKi5naXQnLFxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgIF07XG4gICAgc2V0dGluZ3MubnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IHlhcm5OcG1QcmVhcHByb3ZlZFBhY2thZ2VzO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3BsdWdpbnMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAvLyBUaGUgdGFyZ2V0IHJlcG8gbWF5IG5vdCBoYXZlIHByZXR0aWVyIGluc3RhbGxlZCB5ZXQsIGFuZCB5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwgZWRpdHMgdGhpcyBmaWxlIGFmdGVyIGpzLXlhbWwuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgZ2V0WWFybnJjUHJldHRpZXJBcmdzKGNvbmZpZy5kaXJQYXRoLCB5YXJucmNZbWxQYXRoKSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFlhcm5yY1ByZXR0aWVyQXJncyhkaXJQYXRoOiBzdHJpbmcsIHlhcm5yY1ltbFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsnZGx4JywgJ3ByZXR0aWVyJywgJy0tbm8tY29uZmlnJywgJy0td3JpdGUnLCBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIHlhcm5yY1ltbFBhdGgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9uJ10sIGRpclBhdGgpIHx8ICcwLjAuMCc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJWZXJzaW9uKG5ld1ZlcnNpb246IHN0cmluZywgb2xkVmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTmV3VmVyc2lvbiA9IHNlbXZlci52YWxpZChuZXdWZXJzaW9uKTtcbiAgaWYgKCF2YWxpZE5ld1ZlcnNpb24pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gc2VtdmVyLmd0KHZhbGlkTmV3VmVyc2lvbiwgc2VtdmVyLnZhbGlkKG9sZFZlcnNpb24pID8/ICcwLjAuMCcpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMsIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcbmltcG9ydCB7IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMsIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyB9IGZyb20gJy4vYnVuZmlnLmpzJztcbmltcG9ydCB7IHlhcm5OcG1NaW5pbWFsQWdlR2F0ZSwgeWFybk5wbVByZWFwcHJvdmVkUGFja2FnZXMgfSBmcm9tICcuL3lhcm5yYy5qcyc7XG5cbmNvbnN0IG94bGludERlcHMgPSBbJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLCAnb3hmbXQnLCAnb3hsaW50JywgJ294bGludC10c2dvbGludCddO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG4vLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UsIHJlcGxhY2luZ1xuLy8gdGhlIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHByZXZpZXcgd2JmeSByZWxpZWQgb24gYmVmb3JlIHRoZSByZWxlYXNlLlxuY29uc3QgZGVwcmVjYXRlZFR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCBsZWZ0aG9va0RlcGVuZGVuY3kgPSAnbGVmdGhvb2snO1xuY29uc3QgZGVmYXVsdEdlbkkxOG5Uc1NjcmlwdCA9ICdnZW4taTE4bi10cyAtaSBpMThuIC1vIHNyYy9fX2dlbmVyYXRlZF9fL2kxOG4udHMgLWQgamEtSlAnO1xuY29uc3QgbWFuYWdlZERlcGVuZGVuY3lOYW1lcyA9IG5ldyBTZXQoW1xuICB3YkRlcGVuZGVuY3ksXG4gIGJ1aWxkVHNEZXBlbmRlbmN5LFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHREZXBlbmRlbmN5LFxuICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAuLi5veGxpbnREZXBzLFxuXSk7XG5jb25zdCB3aWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzID0gW1xuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gIC4uLm94bGludERlcHMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSksXG5dO1xuY29uc3Qgb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzID0gW1xuICAnQGJpb21lanMvYmlvbWUnLFxuICAnQGVzbGludC1yZWFjdC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0Blc2xpbnQvanMnLFxuICAnQG5leHQvZXNsaW50LXBsdWdpbi1uZXh0JyxcbiAgJ0B0eXBlcy9lc2xpbnQnLFxuICAnQHR5cGVzL21pY3JvbWF0Y2gnLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicsXG4gICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICdiaW9tZScsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1wZXJmZWN0aW9uaXN0JyxcbiAgJ2VzbGludC1wbHVnaW4tcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdCcsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi1zdG9yeWJvb2snLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG4gICdtaWNyb21hdGNoJyxcbiAgJ3R5cGVzY3JpcHQtZXNsaW50Jyxcbl07XG5jb25zdCBtaWNyb21hdGNoUGFja2FnZU5hbWVzID0gbmV3IFNldChbJ21pY3JvbWF0Y2gnLCAnQHR5cGVzL21pY3JvbWF0Y2gnXSk7XG5jb25zdCBtaWNyb21hdGNoSW1wb3J0UGF0dGVybiA9XG4gIC9cXGJmcm9tXFxzK1snXCJdbWljcm9tYXRjaFsnXCJdfFxcYnJlcXVpcmVcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpfFxcYmltcG9ydFxcKFxccypbJ1wiXW1pY3JvbWF0Y2hbJ1wiXVxccypcXCkvdTtcblxuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBucG1QYWNrYWdlVGltZXNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxudHlwZSBXcml0YWJsZVBhY2thZ2VKc29uID0gU2V0UmVxdWlyZWQ8XG4gIFBhY2thZ2VKc29uLFxuICAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnXG4+O1xuXG5pbnRlcmZhY2UgRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBkZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25PYmogPSBhd2FpdCByZWFkUGFja2FnZUpzb24oZmlsZVBhdGgpO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuXG4gIGF3YWl0IHJlbW92ZURlcHJlY2F0ZWRTdHVmZihjb25maWcsIGpzb25PYmopO1xuICBhd2FpdCB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaik7XG4gIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGF3YWl0IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oY29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcywgc2tpcEFkZGluZ0RlcHMpO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICAvLyBZYXJuIHJlYWRzIHBhY2thZ2UuanNvbiBmcm9tIGRpc2sgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgYHlhcm4gYWRkIC1EYFxuICAvLyBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyByZWd1bGFyIGRlcGVuZGVuY3ksIHNvIHRoaXMgd3JpdGUgbXVzdCBmaW5pc2hcbiAgLy8gYmVmb3JlIGluc3RhbGxpbmcgdGhlIG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGVzIGJlbG93LiBLZWVwIHRoaXMgZ2VuZXJhdGVkXG4gIC8vIGZpbGUgc29ydGVkIGV2ZW4gd2hlbiB3ZSBsYXRlciBydW4gdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgZm9ybWF0dGVyIHNvIGFcbiAgLy8gbWlkLXJ1biBpbnRlcnJ1cHRpb24gbmV2ZXIgbGVhdmVzIHBhY2thZ2UuanNvbiBpbiBhIHBhcnRpYWxseSBtYW5hZ2VkIG9yZGVyLlxuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqKSk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzLCBwYWNrYWdlTWFuYWdlcik7XG4gICAgZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBmaWxlUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHN0cmluZyB7XG4gIC8vIGZzVXRpbC5nZW5lcmF0ZUZpbGUoKSBub3JtYWxpemVzIHRoZSB0cmFpbGluZyBuZXdsaW5lLCBzbyBrZWVwIHRoZSBzZXJpYWxpemVyXG4gIC8vIGZvY3VzZWQgb24gdGhlIEpTT04gcGF5bG9hZCBpdHNlbGYuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24oanNvbk9iaiksIHVuZGVmaW5lZCwgMik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxXcml0YWJsZVBhY2thZ2VKc29uPiB7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhqc29uT2JqLnNjcmlwdHMpO1xuXG4gIGpzb25PYmouc2NyaXB0cyA9IHsgLi4uanNvbk9iai5zY3JpcHRzLCAuLi5nZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpIH07XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3N0YXJ0LXRlc3Qtc2VydmVyJ107XG5cbiAgY29uc3Qgc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cztcbiAgaWYgKGNvbmZpZy5pc0J1biB8fCAhZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICBkZWxldGUgc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBzY3JpcHRzLnByZXR0aWZ5ID0gKHNjcmlwdHMucHJldHRpZnkgPz8gJycpICsgKGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpKTtcbiAgfVxuICBub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMoc2NyaXB0cyk7XG4gIG5vcm1hbGl6ZVJhaWx3YXlDbGlTY3JpcHQoY29uZmlnLCBzY3JpcHRzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgLy8gRnJlc2ggcmVwb3Mgc3RpbGwgcmVxdWlyZSBzdGFuZGFsb25lIGB5YXJuIGluc3RhbGxgOyBvbmx5IHJlbW92ZSBsZWdhY3kgaW5zdGFsbCBwcmVmaXhlcyBiZWZvcmUgYW5vdGhlciBjb21tYW5kLlxuICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJ2dpdCBjbG9uZScpKSB7XG4gICAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC95YXJuXFxzKig/Omluc3RhbGxcXHMqKT8mJlxccyovZ3UsICcnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSkge1xuICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPSAnd2IgZ2VuLWNvZGUnO1xuICB9IGVsc2UgaWYgKHNjcmlwdHMucG9zdGluc3RhbGw/LmluY2x1ZGVzKCdnZW4taTE4bi10cycpKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMucG9zdGluc3RhbGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKFxuICAgICAgL3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoKD8hXFxzKyg/Oi1BfC1SfC0tKD86YWxsfHJlY3Vyc2l2ZXxzaW5jZXx3b3JrdHJlZXxmcm9tfGluY2x1ZGV8ZXhjbHVkZXxwdWJsaWN8cHJpdmF0ZSkpKS9ndSxcbiAgICAgICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCdcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhaWx3YXlDbGlTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGlmIChjb25maWcuaXNCdW4gfHwgIXNjcmlwdHMucmFpbHdheT8uaW5jbHVkZXMoJ0ByYWlsd2F5L2NsaScpKSByZXR1cm47XG5cbiAgc2NyaXB0cy5yYWlsd2F5ID0gJ1lBUk5fRU5BQkxFX1NDUklQVFM9dHJ1ZSB5YXJuIGRseCBAcmFpbHdheS9jbGknO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH0gZWxzZSB7XG4gICAgcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iaik7XG4gIH1cblxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIGRlbGV0ZSAoanNvbk9iaiBhcyBQYWNrYWdlSnNvbiAmIHsgJ2xpbnQtc3RhZ2VkJz86IHVua25vd24gfSlbJ2xpbnQtc3RhZ2VkJ107XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2gobGVmdGhvb2tEZXBlbmRlbmN5KTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShqc29uT2JqLnNjcmlwdHMucmVsZWFzZSkpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ107XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0UnVudGltZSkge1xuICAgICAgICAvLyBSdW50aW1lIGltcG9ydHMgbmVlZCB0aGUgc3RhbmRhbG9uZSBwYWNrYWdlIGFmdGVyIERvY2tlciBwcnVuaW5nIHJlbW92ZXMgZGV2RGVwZW5kZW5jaWVzLlxuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/PVxuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz9cbiAgICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddID8/XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ3BsYXl3cmlnaHQnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZml4ZXJzL25leHRDb25maWcudHMgZW5hYmxlcyBgcmVhY3RDb21waWxlcjogdHJ1ZWAgZm9yIGV2ZXJ5IE5leHQuanMgcHJvamVjdCwgYW5kIE5leHQuanNcbiAgLy8gcmVzb2x2ZXMgYGJhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcmAgYXQgYnVpbGQgdGltZSB3aGVuIFJlYWN0IENvbXBpbGVyIGlzIG9uLiBBZGQgaXQgaGVyZSBzb1xuICAvLyB0aGUgbWFuYWdlZCBuZXh0LmNvbmZpZyBuZXZlciBicmVha3MgYG5leHQgYnVpbGRgIHdpdGggYW4gdW5yZXNvbHZlZC1wYWNrYWdlIGVycm9yLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcicpO1xuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIGlmIChzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBpZiAoc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCBzbyBpdCBpc1xuICAgIC8vIG5vdyB0aGUgbWFuYWdlZCBjb21waWxlciBmb3IgZXZlcnkgVHlwZVNjcmlwdCByZXBvICh0eXBlY2hlY2tpbmcgcnVucyBgdHNjYCkuXG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2Uoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL1xcYig/OmJ1bnh8bnB4fHBucG1cXHMrZGx4fHlhcm5cXHMrZGx4KVxccytzZW1hbnRpYy1yZWxlYXNlKD86QFxcUyspP1xcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCBrZWVwQXNSdW50aW1lXSBvZiBbXG4gICAgW3diRGVwZW5kZW5jeSwgc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gICAgW2J1aWxkVHNEZXBlbmRlbmN5LCBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICBdIGFzIGNvbnN0KSB7XG4gICAgaWYgKGtlZXBBc1J1bnRpbWUpIHtcbiAgICAgIGNvbnN0IGRldlZlcnNpb24gPSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZGV2VmVyc2lvbikgY29udGludWU7XG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFydW50aW1lVmVyc2lvbiB8fCBpc05ld2VyUGFja2FnZVZlcnNpb24oZGV2VmVyc2lvbiwgcnVudGltZVZlcnNpb24pKSB7XG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZGV2VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9IGVsc2UgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSB7XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgY29uc3QgcG9zdGluc3RhbGxTY3JpcHQgPSBqc29uT2JqLnNjcmlwdHM/LnBvc3RpbnN0YWxsO1xuICByZXR1cm4gdHlwZW9mIHBvc3RpbnN0YWxsU2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2JcXGIvdS50ZXN0KHBvc3RpbnN0YWxsU2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByaXNtYSA9IGpzb25PYmoucHJpc21hIGFzIHsgc2VlZD86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMocHJpc21hPy5zZWVkKSB8fCBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKGpzb25PYmouc2NyaXB0cz8uc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoc2VlZENvbW1hbmQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBEb2NrZXIgaW1hZ2VzIHJ1biBzZWVkIHNjcmlwdHMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsXG4gIC8vIHNvIFR5cGVTY3JpcHQgc2VlZCBydW5uZXJzIG11c3QgcmVtYWluIGF2YWlsYWJsZSBhdCBydW50aW1lLlxuICByZXR1cm4gdHlwZW9mIHNlZWRDb21tYW5kID09PSAnc3RyaW5nJyAmJiAvKD88IVtcXHctXSlidWlsZC10cyg/IVtcXHctXSkvdS50ZXN0KHNlZWRDb21tYW5kKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gIH1cbiAgY29uc3QgW293bmVyXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGF3YWl0IG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShjb25maWcsIGpzb25PYmopO1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gWWFybiB0cmVhdHMgdGhlIGxlZ2FjeSBucG0vY2hhbGsgcmVzb2x1dGlvbiBhbGlhcyBhcyBhbiBpbnZhbGlkIHBhY2thZ2UgdG9rZW4uXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnXSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICAgICAgICBpZiAoIXNjcmlwdCkgY29udGludWU7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdID0gc2NyaXB0LnJlcGxhY2UoLyA/JiYgP3lhcm4gbGludC1maXgoPzogLS1xdWlldCk/LywgJycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJ3lhcm4gbGludCAtLWZpeCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NvbW1vbi9jaS1zZXR1cCddID0gYCR7c2NyaXB0UnVubmVyfSBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NldHVwLXBvZXRyeS1hc2RmJ107XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBgJHtzY3JpcHRSdW5uZXJ9IGxpbnRgO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0LCBjb25maWcpO1xuICAgICAgICBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBnZW5Db2RlU2NyaXB0ID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddO1xuICBpZiAoZ2VuQ29kZVNjcmlwdD8uaW5jbHVkZXMoJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIH0gZWxzZSBpZiAoc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnLCBnZW5Db2RlU2NyaXB0KSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGAke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gJyA6ICcnfXdiIGdlbi1jb2RlYDtcbiAgfVxuICBub3JtYWxpemVHZW5JMThuVHNTY3JpcHQoY29uZmlnLCBqc29uT2JqKTtcbiAgdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoanNvbk9iai5zY3JpcHRzKTtcblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzLnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkR2VuQ29kZVNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fFxuICAgIGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhIHx8XG4gICAgY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHxcbiAgICBjb25maWcuZGVwZW5kaW5nLnByaXNtYSB8fFxuICAgIChjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUgJiYgISFvbGRHZW5Db2RlU2NyaXB0Py5pbmNsdWRlcygnZHJpenpsZS1raXQgY2hlY2snKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biBwcm9qZWN0cyBtYXkgbm90IGhhdmUgYSBZYXJuIGxvY2tmaWxlLCBzbyBnZW5lcmF0ZWQgcGFja2FnZSBzY3JpcHRzXG4gIC8vIG11c3QgaW52b2tlIGxvY2FsIHBhY2thZ2Ugc2NyaXB0cyB0aHJvdWdoIHRoZSByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyLlxuICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmICR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWAgOiBgJHtzY3JpcHRSdW5uZXJ9IGZvcm1hdC1jb2RlYDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplR2VuSTE4blRzU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIXNob3VsZE1hbmFnZUdlbkkxOG5Ucyhjb25maWcpKSByZXR1cm47XG5cbiAgaWYgKGpzb25PYmouc2NyaXB0c1snZ2VuLWkxOG4tdHMnXSA9PT0gZGVmYXVsdEdlbkkxOG5Uc1NjcmlwdCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1pMThuLXRzJ107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlnTWpzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5tanMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ01qc1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai50eXBlID0gJ21vZHVsZSc7XG5cbiAgY29uc3QgY29uZmlnRHRzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLnRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEdHNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmouZmlsZXMgPSBbLi4ubmV3IFNldChbLi4uKGpzb25PYmouZmlsZXMgPz8gW10pLCAnY29uZmlnLmQubXRzJ10pXTtcbiAgLy8gTm9kZU5leHQgcmVzb2x2ZXMgYSByZWxhdGl2ZSBgLi9jb25maWcubWpzYCBpbXBvcnQgdG8gYGNvbmZpZy5kLm10c2AsIG5vdFxuICAvLyB0aGUgcGFja2FnZS1sZXZlbCBgdHlwZXNgIGZpZWxkLiBLZWVwIHRoZSBwdWJsaXNoZWQgY29uZmlnIGltcG9ydGFibGUgZnJvbVxuICAvLyBwYWNrYWdlLWxvY2FsIFR5cGVTY3JpcHQgbGludGVyIHNldHRpbmdzLlxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpKTtcbn1cblxuY29uc3QgY29uZmlnRG10c0NvbnRlbnQgPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29uZmlnLmpzJztcbmA7XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyldLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMpXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcykuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IHZvaWQge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcblxuICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gIGlmIChweXRob25QYWNrYWdlTWFuYWdlciAmJiBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcyldO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScpIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYygndXYnLCBbJ2FkZCcsICctLWRldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeScgfCAndXYnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykgcmV0dXJuICd1dic7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSByZXR1cm4gJ3BvZXRyeSc7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblNldHVwQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogJ3BvZXRyeScgfCAndXYnKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAndXYnKSByZXR1cm4gJ3V2IHN5bmMgLS1mcm96ZW4nO1xuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHBvZXRyeSBlbnYgdXNlICQobWlzZSBjdXJyZW50IHB5dGhvbikgJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIGRldjogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbXG4gICAgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWcsIGRlcGVuZGVuY3kpKSksXG4gIF07XG4gIHNwYXduU3luYyhcbiAgICBwYWNrYWdlTWFuYWdlcixcbiAgICBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksIC4uLihjb25maWcuaXNCdW4gPyBbJy0tZXhhY3QnXSA6IFtdKSwgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLFxuICAgIGNvbmZpZy5kaXJQYXRoXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgY29uZmlnLFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICAgIGlmICghc2tpcEFkZGluZ0RlcHMpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAmJlxuICAgICAgIXNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSAmJlxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gIT09ICcqJ1xuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3kpO1xuICAgIGlmIChsYXRlc3RWZXJzaW9uID09PSAnKicgJiYgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAnYnVuJykge1xuICAgIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9IGVsc2Uge1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIHJlbW92ZVNlbGZEZXBlbmRlbmN5KGNvbmZpZywganNvbk9iaik7XG4gIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZywganNvbk9iaik7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwtZm9yLWFpJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgLy8gVHlwZVNjcmlwdCA3IHJlcGxhY2VkIHRoZSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSBwcmV2aWV3IHdpdGggdGhlXG4gIC8vIG5hdGl2ZSBgdHlwZXNjcmlwdGAgcGFja2FnZSwgc28gZHJvcCB0aGUgZGVwcmVjYXRlZCBwcmV2aWV3IGZyb20gZXhpc3RpbmcgcmVwb3MuXG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXByZWNhdGVkVHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXByZWNhdGVkVHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIC8vIE5vbi1UeXBlU2NyaXB0IHJlcG9zIHNob3VsZCBub3Qga2VlcCBhIHN0cmF5IGB0eXBlc2NyaXB0YCBwYWNrYWdlLlxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd2ZXJpZnktY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd2ZXJpZnktY29kZS13aXRoLXRlc3RzJ107XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdsZXJuYS5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIHJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKGpzb25PYmosIGNvbmZpZyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNlbGZEZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0ganNvbk9iai5uYW1lIHx8IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuXG4gIC8vIEEgcGFja2FnZSBjYW4gaW1wb3J0IGl0c2VsZiB0aHJvdWdoIE5vZGUncyBwYWNrYWdlIHNlbGYtcmVmZXJlbmNlIHdpdGhvdXRcbiAgLy8gZGVjbGFyaW5nIGl0c2VsZjsga2VlcGluZyB0aGF0IGVkZ2UgYnJlYWtzIG1vbm9yZXBvIHJlbGVhc2UgdG9wb2xvZ2ljYWwgc29ydGluZy5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgcGFja2FnZU5hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeSwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghdmVyc2lvbikgY29udGludWU7XG4gICAgICBpZiAoIWlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uKSkgY29udGludWU7XG4gICAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyB0aGVzZSBwYWNrYWdlcyBpbmRlcGVuZGVudGx5LCBzbyBnZW5lcmF0ZWRcbiAgICAgIC8vIHBhY2thZ2UgbWV0YWRhdGEgbXVzdCBkZXNjcmliZSBucG0gcmVsZWFzZSBlZGdlcyBpbnN0ZWFkIG9mIGxvY2FsXG4gICAgICAvLyB3b3Jrc3BhY2UgZWRnZXMgdGhhdCByZWxlYXNlIHRvb2xpbmcgdHJlYXRzIGFzIG1vbm9yZXBvIGdyYXBoIGxpbmtzLlxuICAgICAgLy8gVGhlIGZpbmFsIGB5YXJuIGluc3RhbGwgLS1uby1pbW11dGFibGVgIHN5bmNzIHRoZSBsb2NrZmlsZSBhZnRlciB0aGlzXG4gICAgICAvLyBtaWdyYXRpb24sIGV2ZW4gd2hlbiB0aGUgZGVwZW5kZW5jeSBpcyBub3QgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCBsaXN0LlxuICAgICAgc2VjdGlvbltkZXBlbmRlbmN5XSA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybjtcblxuICBjb25zdCBzZWN0aW9ucyA9IGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIG93bnMgdGhlc2UgY29uZmlnIHBhY2thZ2VzLiBQYWNrYWdlLWxvY2FsIGZvcm1hdHRlclxuICAgIC8vIGFuZCBsaW50ZXIgY29uZmlnIGZpbGVzIGFyZSByZXBvIHRvb2xpbmcsIG5vdCBwdWJsaXNoZWQgcGFja2FnZSBkYXRhLCBzb1xuICAgIC8vIHRoZSBwYWNrYWdlIG1ldGFkYXRhIG9ubHkgbmVlZHMgdGhlIGZvcm1hdHRlci9saW50ZXIgZXhlY3V0YWJsZXMuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgdXNlZERlcGVuZGVuY2llczogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQodXNlZERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodXNlZERlcGVuZGVuY3lTZXQuaGFzKGRlcGVuZGVuY3kpIHx8IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIGJhc2UtY29uZmlnIHBhY2thZ2VzLiBSZW1vdmUgc3RhbGUgdmFyaWFudHMgd2hlbiByZXBvXG4gICAgLy8gY2FwYWJpbGl0aWVzIGNoYW5nZSwgc3VjaCBhcyBOZXh0LmpzIHRha2luZyBvd25lcnNoaXAgb2YgdHNjb25maWcuanNvbi5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RzY29uZmlnKi5qc29uJywge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgLy8gVHlwZVNjcmlwdCA3J3MgbmF0aXZlIGNvbXBpbGVyIGRyb3BwZWQgdGhlIGluLXByb2Nlc3MgYHBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb25gXG4gICAgLy8gaGVscGVyLCBzbyBwYXJzZSB0aGUgdHNjb25maWcgaW50byBhbiBBU1QgYW5kIHJlYWQgaXRzIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZGlyZWN0bHkuXG4gICAgY29uc3Qgc291cmNlID0gcGFyc2VTb3VyY2VGaWxlKGFic29sdXRlRmlsZVBhdGgpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHBhcnNlZC5gKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlKSkge1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXM7XG59XG5cbi8qKiBSZWFkcyB0aGUgdG9wLWxldmVsIGBleHRlbmRzYCBlbnRyaWVzIChhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzKSBmcm9tIGEgcGFyc2VkIHRzY29uZmlnLiAqL1xuZnVuY3Rpb24gcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nW10ge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2UpKSB7XG4gICAgaWYgKGFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgJiYgYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSAmJiBwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICdleHRlbmRzJykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHZhbHVlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHJlYWRvbmx5IGFzdC5PYmplY3RMaXRlcmFsRWxlbWVudExpa2VbXSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHNvdXJjZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKGFzdC5pc0V4cHJlc3Npb25TdGF0ZW1lbnQoc3RhdGVtZW50KSAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbikpIHtcbiAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5wcm9wZXJ0aWVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKG5vZGU6IGFzdC5FeHByZXNzaW9uLCB2YWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGlmIChhc3QuaXNTdHJpbmdMaXRlcmFsKG5vZGUpKSB7XG4gICAgdmFsdWVzLnB1c2gobm9kZS50ZXh0KTtcbiAgfSBlbHNlIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG5vZGUuZWxlbWVudHMpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKGVsZW1lbnQsIHZhbHVlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj5bXSB7XG4gIHJldHVybiBkZXBlbmRlbmN5U2VjdGlvbktleXNcbiAgICAubWFwKChrZXkpID0+IGpzb25PYmpba2V5XSlcbiAgICAuZmlsdGVyKChzZWN0aW9uKTogc2VjdGlvbiBpcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+ICEhc2VjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJ306JHtkZXBlbmRlbmN5fWA7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID0gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGNvbmZpZywgZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGNhY2hlS2V5LCB2ZXJzaW9uKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIHdiZnktbWFuYWdlZCB0b29saW5nIChwcmVhcHByb3ZlZCBwYWNrYWdlcykgYWRvcHRzIHRoZSBsYXRlc3QgcmVsZWFzZSBpbW1lZGlhdGVseSxcbiAgLy8gYnlwYXNzaW5nIHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIGdhdGUgYXBwbGllZCB0byB1bnJldmlld2VkIGRlcGVuZGVuY2llcy5cbiAgaWYgKCFzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGNvbmZpZywgZGVwZW5kZW5jeSkpIHtcbiAgICByZXR1cm4gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICB9XG5cbiAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSwgZ2V0UGFja2FnZUFnZUdhdGVNcyhjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcsIHBhY2thZ2VBZ2VHYXRlTXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzID0gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3kpO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBpZiAobGF0ZXN0VmVyc2lvbiAhPT0gJyonICYmIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZSh0aW1lc1tsYXRlc3RWZXJzaW9uXSwgcGFja2FnZUFnZUdhdGVNcykpIHtcbiAgICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHZlcnNpb25zID0gT2JqZWN0LmVudHJpZXModGltZXMpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiBzZW12ZXIudmFsaWQodmVyc2lvbikpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiAoc2VtdmVyLnByZXJlbGVhc2UodmVyc2lvbik/Lmxlbmd0aCA/PyAwKSA9PT0gMClcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IE51bWJlci5pc0Zpbml0ZShEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSkpXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBub3cgLSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSA+PSBwYWNrYWdlQWdlR2F0ZU1zKVxuICAgIC50b1NvcnRlZCgoW3ZlcnNpb25BXSwgW3ZlcnNpb25CXSkgPT4gc2VtdmVyLnJjb21wYXJlKHZlcnNpb25BLCB2ZXJzaW9uQikpO1xuXG4gIHJldHVybiB2ZXJzaW9uc1swXT8uWzBdID8/ICcqJztcbn1cblxuZnVuY3Rpb24gaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHB1Ymxpc2hlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQsIHBhY2thZ2VBZ2VHYXRlTXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoIXB1Ymxpc2hlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHB1Ymxpc2hlZFRpbWUgPSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwdWJsaXNoZWRUaW1lKSAmJiBEYXRlLm5vdygpIC0gcHVibGlzaGVkVGltZSA+PSBwYWNrYWdlQWdlR2F0ZU1zO1xufVxuXG5mdW5jdGlvbiBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZGVwZW5kZW5jeS5yZXBsYWNlKC9AW15AL10rJC91LCAnJyk7XG4gIGNvbnN0IGNhY2hlZFRpbWVzID0gbnBtUGFja2FnZVRpbWVzQ2FjaGUuZ2V0KHBhY2thZ2VOYW1lKTtcbiAgaWYgKGNhY2hlZFRpbWVzKSByZXR1cm4gY2FjaGVkVGltZXM7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICducG0nLFxuICAgIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndGltZScsICctLWpzb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgcHJvY2Vzcy5jd2QoKVxuICApO1xuICBpZiAoIXN0ZG91dCkgcmV0dXJuIHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdGRvdXQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgbnBtUGFja2FnZVRpbWVzQ2FjaGUuc2V0KHBhY2thZ2VOYW1lLCBwYXJzZWQpO1xuICAgIHJldHVybiBwYXJzZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByZWFwcHJvdmVkUGFja2FnZXMgPSBjb25maWcuaXNCdW4gPyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIDogeWFybk5wbVByZWFwcHJvdmVkUGFja2FnZXM7XG4gIHJldHVybiAhcHJlYXBwcm92ZWRQYWNrYWdlcy5zb21lKChwYXR0ZXJuKSA9PiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuLCBkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VBZ2VHYXRlTXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogbnVtYmVyIHtcbiAgaWYgKGNvbmZpZy5pc0J1bikgcmV0dXJuIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyAqIDEwMDA7XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD88ZGF5cz5cXGQrKWQkL3UuZXhlYyh5YXJuTnBtTWluaW1hbEFnZUdhdGUpO1xuICByZXR1cm4gTnVtYmVyKG1hdGNoZWQ/Lmdyb3Vwcz8uZGF5cyA/PyAwKSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG59XG5cbmZ1bmN0aW9uIGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJuID09PSBkZXBlbmRlbmN5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApLnJlcGxhY2VBbGwoJyonLCAnLionKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgLCAndScpLnRlc3QoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBkZXBlbmRlbmN5LCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSwgcHJvY2Vzcy5jd2QoKSkgfHwgJyonO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChkZXBlbmRlbmN5ID09PSB3YkRlcGVuZGVuY3kpIHJldHVybiBgJHtkZXBlbmRlbmN5fUAke2dldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgZGVwZW5kZW5jeSl9YDtcbiAgcmV0dXJuIGRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyhcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBjb25zdCBwcmVzZXJ2ZU1pY3JvbWF0Y2ggPSBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG9ic29sZXRlTGludERlcGVuZGVuY2llcykge1xuICAgIGlmIChwcmVzZXJ2ZU1pY3JvbWF0Y2ggJiYgbWljcm9tYXRjaFBhY2thZ2VOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGlmIChzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShqc29uT2JqLCBjb25maWcsIGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJlc2VydmVDb25maWdQYWNrYWdlTGludERlcGVuZGVuY3koXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPixcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHJldHVybiB0cnVlO1xuXG4gIC8vIFB1Ymxpc2hlZCBjb25maWcgcGFja2FnZXMgbmVlZCBsb2NhbCB0eXBlLW9ubHkgZGVwcyB0byB2YWxpZGF0ZSB0aGVcbiAgLy8gcGFja2FnZS1wcm92aWRlZCBjb25maWcgZGVjbGFyYXRpb25zIHVuZGVyIFlhcm4gUG5QLlxuICByZXR1cm4gZGVwZW5kZW5jeSA9PT0gJ0B0eXBlcy9lc2xpbnQnICYmICEhanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzLmVzbGludDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJlc2VydmVNaWNyb21hdGNoKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHN1YnBhY2thZ2VzIHB1Ymxpc2ggY29uZmlnIGZpbGVzIGFzIHRoZWlyIHByb2R1Y3QsIHNvXG4gIC8vIG1pY3JvbWF0Y2ggaXMgcGFja2FnZSBkYXRhIHRoZXJlLiBPdGhlciByZXBvcyBrZWVwIG1pY3JvbWF0Y2ggb25seSB3aGVuXG4gIC8vIHByb2R1Y3QgY29kZSBpbXBvcnRzIGl0OyBvdGhlcndpc2UgaXQgaXMgdHJlYXRlZCBhcyBvYnNvbGV0ZSBFU0xpbnQtZXJhXG4gIC8vIHRvb2xpbmcuXG4gIHJldHVybiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmICFjb25maWcuaXNSb290KSB8fCBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZVBhdGhzID0gZmcuZ2xvYlN5bmMoJ3NyYy8qKi8qLntqcyxqc3gsbWpzLGNqcyx0cyx0c3gsbXRzLGN0c30nLCB7XG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICByZXR1cm4gZmlsZVBhdGhzLnNvbWUoKGZpbGVQYXRoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtaWNyb21hdGNoSW1wb3J0UGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZVBhdGgpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgLy8gd2JmeSBvd25zIHRoZXNlIHRvb2wgZGVwZW5kZW5jaWVzLCBidXQgYXBwbHlpbmcgd2JmeSBzaG91bGQgbm90IGRvd25ncmFkZSBhXG4gIC8vIHJlcG9zaXRvcnkgdGhhdCBhbHJlYWR5IHBpbnMgYSBuZXdlciByZXZpZXdlZCByZWxlYXNlLlxuICByZXR1cm4gbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkgJiYgaXNOZXdlck1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNOZXdlck1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZywgY3VycmVudFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgcmV0dXJuIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihsYXRlc3RWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihjYW5kaWRhdGVWZXJzaW9uOiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGNhbmRpZGF0ZVZlcnNpb24pO1xuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgcmV0dXJuICF2YWxpZExhdGVzdFZlcnNpb24gfHwgIXZhbGlkQ3VycmVudFZlcnNpb24gfHwgc2VtdmVyLmd0KHZhbGlkTGF0ZXN0VmVyc2lvbiwgdmFsaWRDdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICAgIHZlcmlmeTogJ2J1biAtLWJ1biB3YiB2ZXJpZnknLFxuICAgICAgLy8gYHZlcmlmeSAtLWZ1bGxgIHJ1bnMgUGxheXdyaWdodCwgYW5kIEJ1bidzIGAtLWJ1bmAgZmxhZyBpbnN0YWxscyBhIG5vZGUtPmJ1biBQQVRIIHNoaW0gdGhhdFxuICAgICAgLy8gcHJvcGFnYXRlcyBpbnRvIFBsYXl3cmlnaHQncyBjaGlsZCBwcm9jZXNzZXMsIGNyYXNoaW5nIHRlc3QgbG9hZGluZyB3aXRoIGFuIG9wYXF1ZVxuICAgICAgLy8gXCJSZXNvbHZlTWVzc2FnZSB7fVwiLiBPbWl0IGAtLWJ1bmAgZm9yIFBsYXl3cmlnaHQgcHJvamVjdHMgc28gYHdiIHZlcmlmeSAtLWZ1bGxgIChhbmQgdGh1c1xuICAgICAgLy8gUGxheXdyaWdodCkgcnVucyB1bmRlciBOb2RlLmpzOyB3YiBzdGlsbCB1c2VzIEJ1biBmb3IgaXRzIG93biBpbm5lciBjb21tYW5kcy5cbiAgICAgICd2ZXJpZnktZnVsbCc6IGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgPyAnYnVuIHdiIHZlcmlmeSAtLWZ1bGwnIDogJ2J1biAtLWJ1biB3YiB2ZXJpZnkgLS1mdWxsJyxcbiAgICB9O1xuICAgIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgYGJ1biAtLWJ1biAke2dldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyl9YCk7XG4gICAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAnICYmIHB5cmlnaHQnO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gICAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGdlbmVyYXRlRm9ybWF0U2NyaXB0KGhhc0pzT3JUcywgaGFzSmF2YSksXG4gICAgICAvLyBQYWNrYWdlLWxvY2FsIGNvbmZpZ3MgbXVzdCBkZWxldGUgdGhlIHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMsIHNvIHBhc3MgdGhlIGZsYWdzXG4gICAgICAvLyBleHBsaWNpdGx5LiBPdGhlcndpc2UgdGhpcyBzY3JpcHQgd291bGQgc2lsZW50bHkgc2tpcCB0eXBlIGNoZWNraW5nIGluIHdvcmtzcGFjZSBwYWNrYWdlcy5cbiAgICAgIGxpbnQ6IGBveGxpbnQke2hhc1R5cGVjaGVjayA/ICcgLS10eXBlLWF3YXJlIC0tdHlwZS1jaGVjaycgOiAnJ30gLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAuYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgJ2Zvcm1hdC1jb2RlJzogYG94Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAuICchKiovcGFja2FnZS5qc29uJ2AsXG4gICAgICB0eXBlY2hlY2s6ICd0c2MgLS1ub0VtaXQnLFxuICAgIH07XG4gICAgaWYgKGhhc0phdmEpIHtcbiAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXJPbmx5LmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGAke3NjcmlwdHMuZm9ybWF0fSAmJiB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gZm9ybWF0YCxcbiAgICAgICAgICBsaW50OiBgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnRgLFxuICAgICAgICAgICdsaW50LWZpeCc6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludC1maXgnLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guIENvbG9yIHBvbGljeSBiZWxvbmdzIHRvIHdiLCBub3QgZ2VuZXJhdGVkIHBhY2thZ2Ugc2NyaXB0cy5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKGhhc0phdmEpIHtcbiAgICAgICAgc2NyaXB0cy5wcmV0dGlmeSA9IGBwcmV0dGllciAtLWNhY2hlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbihcbiAgICAgICAgICAnLCdcbiAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cbiAgICBpZiAoIWhhc0pzT3JUcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ107XG4gICAgICBkZWxldGUgc2NyaXB0cy5saW50O1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgfVxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICBpZiAoaXNXYlBhY2thZ2UoY29uZmlnLnBhY2thZ2VKc29uKSkge1xuICAgICAgc2NyaXB0cy52ZXJpZnkgPSBvbGRTY3JpcHRzLnZlcmlmeSA/PyAneWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkSU5JVF9DV0RcIiB2ZXJpZnknO1xuICAgICAgc2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA9IG9sZFNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPz8gJ3lhcm4gdmVyaWZ5IC0tZnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gJ3diIHZlcmlmeSc7XG4gICAgICBzY3JpcHRzWyd2ZXJpZnktZnVsbCddID0gJ3diIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH1cbiAgICBhcHBseURhdGFiYXNlU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZykpO1xuICAgIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkTWFuYWdlR2VuSTE4blRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdpMThuJykpO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICB3YkRiQ29tbWFuZDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSByZXR1cm47XG5cbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItY3JlYXRlLW1pZ3JhdGlvbicsIGAke3diRGJDb21tYW5kfSBtaWdyYXRlLWRldmApO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi1taWdyYXRlJywgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeWApO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi12aWV3JywgYCR7d2JEYkNvbW1hbmR9IHN0dWRpb2ApO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0KFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lOiBzdHJpbmcsXG4gIGdlbmVyYXRlZFNjcmlwdDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tuYW1lXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBtaWdyYXRpb24gY29tbWFuZHMgdG8gcHJlcGFyZSBTUUxpdGUgZGlyZWN0b3JpZXMsXG4gIC8vIGZhbiBvdXQgb3ZlciB0ZW5hbnRzLCBvciBwZXJmb3JtIGNsZWFudXAgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHkuXG4gIHNjcmlwdHNbbmFtZV0gPSBvbGRTY3JpcHQgJiYgIWlzR2VuZXJhdGVkRGF0YWJhc2VTY3JpcHQob2xkU2NyaXB0KSA/IG9sZFNjcmlwdCA6IGdlbmVyYXRlZFNjcmlwdDtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWREYXRhYmFzZVNjcmlwdChzY3JpcHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndiXFxzKyg/OmRifHByaXNtYSlcXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICd3YiBkYicgfCAnd2IgcHJpc21hJyB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuICd3YiBwcmlzbWEnO1xuICByZXR1cm4gJ3diIGRiJztcbn1cblxuZnVuY3Rpb24gaXNXYlBhY2thZ2UocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlSnNvbj8ubmFtZSA9PT0gd2JEZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBhcHBseU1pc2VUYXNrU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoIWhhc01pc2VUYXNrKGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICAvLyBQcmVzZXJ2ZSBhIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudiBwcmVmaXggKGUuZy4gYE1JU0VfRU5WPXRlc3RgKSBvbiBhbiBleGlzdGluZyBtaXNlIGJyaWRnZS5cbiAgICAvLyBTdWNoIGEgcHJlZml4IGlzIHJlcXVpcmVkIGZvciBtaXNlIGNvbmZpZyBlbnZpcm9ubWVudHMgKG1pc2UuPE1JU0VfRU5WPi50b21sKSwgd2hpY2ggYXJlXG4gICAgLy8gc2VsZWN0ZWQgZnJvbSBNSVNFX0VOViAqYmVmb3JlKiBtaXNlIHN0YXJ0cyBhbmQgY2Fubm90IGJlIHN3aXRjaGVkIGZyb20gaW5zaWRlIGEgdGFzazsgZHJvcHBpbmdcbiAgICAvLyBpdCB3b3VsZCBzaWxlbnRseSBydW4gdGhlIHRhc2sgaW4gdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gICAgY29uc3QgZW52UHJlZml4ID0gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgob2xkU2NyaXB0c1tuYW1lXSwgbmFtZSk7XG4gICAgaWYgKGVudlByZWZpeCA9PT0gdW5kZWZpbmVkICYmIG9sZFNjcmlwdHNbbmFtZV0gJiYgIShuYW1lIGluIHNjcmlwdHMpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW25hbWVdID0gYCR7ZW52UHJlZml4ID8/ICcnfW1pc2UgcnVuICR7bmFtZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52LXZhciBwcmVmaXggb2YgYW4gZXhpc3RpbmcgYG1pc2UgcnVuIDxuYW1lPmAgYnJpZGdlIHNjcmlwdFxuICogKHBvc3NpYmx5IGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBicmlkZ2UgaGFzIG5vIHByZWZpeCksIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNjcmlwdCBpcyBub3QgYVxuICogbWlzZSBicmlkZ2UgZm9yIHRoZSBnaXZlbiB0YXNrLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gRWFjaCBhc3NpZ25tZW50IHZhbHVlIG1heSBiZSBkb3VibGUtcXVvdGVkLCBzaW5nbGUtcXVvdGVkLCBvciBhbiB1bnF1b3RlZCBydW4gb2Ygbm9uLXdoaXRlc3BhY2UsXG4gIC8vIHNvIHByZWZpeGVzIGxpa2UgYE1JU0VfRU5WPVwiYSBiXCJgICh3aG9zZSB2YWx1ZSBjb250YWlucyBzcGFjZXMpIGFyZSBtYXRjaGVkIGluc3RlYWQgb2YgZHJvcHBlZC5cbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXigoPzpcXHcrPSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xcXFMrKVxccyspKiltaXNlIHJ1biAke2VzY2FwZVJlZ0V4cChuYW1lKX0kYCwgJ3UnKS5leGVjKFxuICAgIHNjcmlwdC50cmltKClcbiAgKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV07XG59XG5cbmZ1bmN0aW9uIGhhc01pc2VUYXNrKGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKGNvbmZpZy5taXNlVGFza3MsIG5hbWUpO1xufVxuXG5mdW5jdGlvbiBkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXNrID0gY29uZmlnLm1pc2VUYXNrc1tuYW1lXTtcbiAgaWYgKCF0YXNrKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VycyA9IFsnYnVuJywgJ3lhcm4nLCAnbnBtJywgJ3BucG0nXTtcbiAgcmV0dXJuIHBhY2thZ2VNYW5hZ2Vycy5zb21lKChwYWNrYWdlTWFuYWdlcikgPT5cbiAgICBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxiJHtwYWNrYWdlTWFuYWdlcn1cXHMrKD86cnVuXFxzKyk/JHtlc2NhcGVSZWdFeHAobmFtZSl9KD8hW2EtekEtWjAtOV9cXC06Ll0pYCwgJ3UnKS50ZXN0KHRhc2spXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVGb3JtYXRTY3JpcHQoaGFzSnNPclRzOiBib29sZWFuLCBoYXNKYXZhOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGlmIChoYXNKc09yVHMpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIGZvcm1hdC1jb2RlJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIHByZXR0aWZ5Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpLmNhdGNoKCgpID0+ICcnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBgJHtsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVQcmV0dGllckFydGlmYWN0cyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBqc29uT2JqLnByZXR0aWVyO1xuICBjb25zdCBkZXBlbmRlbmN5U2VjdGlvbnM6IEFycmF5PFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWQ+ID0gW1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyxcbiAgXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lTZWN0aW9ucykge1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG4gICAgZGVsZXRlIHNlY3Rpb24ucHJldHRpZXI7XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1wcmlzbWEnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBkdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IGh1c2t5RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBjb25zdCBoYXNIdXNreURpciA9IGZzLmV4aXN0c1N5bmMoaHVza3lEaXJQYXRoKTtcbiAgY29uc3QgeyBsaW50IH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIGpvYnM6IGdldFByZUNvbW1pdEpvYnMoY29uZmlnKSxcbiAgICB9LFxuICB9O1xuICBpZiAoIWxpbnQpIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKHNldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGhhc0h1c2t5RGlyKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucHJvbWlzZXMucm0oaHVza3lEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSksXG4gICAgXSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBsZXQgbGludENvbW1hbmQ6IHN0cmluZztcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIC8vIEJ1biByZXBvcyByZWNlaXZlIHdiIGFzIHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgdG9vbGNoYWluLCBzbyBnZW5lcmF0ZSB0aGVcbiAgICAvLyBmaW5hbCBob29rIGNvbW1hbmQgb24gdGhlIGZpcnN0IHJ1biBpbnN0ZWFkIG9mIGNoYW5naW5nIGl0IG9uIHRoZSBzZWNvbmQuXG4gICAgbGludENvbW1hbmQgPSAnYnVuIC0tYnVuIHdiIGxpbnQnO1xuICB9IGVsc2Uge1xuICAgIGxpbnRDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICd5YXJuIHdiIGxpbnQnIDogJ3lhcm4gcnVuIGxpbnQnO1xuICB9XG4gIGNvbnN0IHF1aWV0TGludENvbW1hbmQgPSBgJHtsaW50Q29tbWFuZH0gLS1xdWlldGA7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9icy5tYXAoKGpvYikgPT5cbiAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICB9XG4gICAgICA6IGpvYlxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gTGV0IGB3YiBsaW50IC0tZm9ybWF0YCBkZWNpZGUgd2hldGhlciBQcmV0dGllciBpcyBhdmFpbGFibGU7IHRoZSBob29rXG4gIC8vIHN0aWxsIG5lZWRzIHRvIHRyaWdnZXIgd2hlbiBhZGRpbmcgdGhlIGZpcnN0IHByZXR0aWVyLW9ubHkgZmlsZS5cbiAgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9XG4gICAgY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykgPyBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldIDogW107XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKC4uLmV4dGVuc2lvbnMub3hmbXQsIC4uLmV4dGVuc2lvbnMub3hsaW50KTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuIFN0cmluZy5yYXdgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbnlhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmICgoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IpICYmIGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMpIHtcbiAgICByZXR1cm4gYFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIGNvbnN0IG94bGludFBhdHRlcm4gPSBleHRlbnNpb25zLm94bGludC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBveGZtdFBhdHRlcm4gPSBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IHByZXR0aWVyUGF0dGVybiA9IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuJHtoYXNKc09yVHMgPyBTdHJpbmcucmF3YG94bGludF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGxpbnRQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hmbXRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7b3hmbXRQYXR0ZXJufSknIHwgZ3JlcCAtdiAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0phdmEgPyBTdHJpbmcucmF3YHByZXR0aWVyX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke3ByZXR0aWVyUGF0dGVybn0pJyB8fCB0cnVlKVwiYCA6ICcnfVxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG4ke1xuICBoYXNKc09yVHNcbiAgICA/IFN0cmluZy5yYXdgXG5pZiBbIC1uIFwiJG94Zm10X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAnISoqL3BhY2thZ2UuanNvbicgJG94Zm10X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0phdmFcbiAgICA/IFN0cmluZy5yYXdgaWYgWyAtbiBcIiRwcmV0dGllcl9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgLS1pZ25vcmUtdW5rbm93biAtLSAkcHJldHRpZXJfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hsaW50X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294bGludCAtLWZpeCAkb3hsaW50X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3NvcnQtcGFja2FnZS1qc29uIC0tICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiBwcmlzbWEgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL3diIHByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmNqc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNvbmAsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJleHBvcnQgdHlwZSBDb25maWdCbG9ja05hbWUgPSAnYmFzZScgfCAnZXhwb3J0JztcblxuaW50ZXJmYWNlIE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zIHtcbiAgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG4gIG1hcmtlclByZWZpeDogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0Q29uZmlnQ29udGVudE9wdGlvbnMge1xuICBkZXNpcmVkQ29udGVudDogc3RyaW5nO1xuICBleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZmlsZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRDb25maWdCbG9ja3Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFya2VyUHJlZml4OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zKSB7XG4gICAgdGhpcy5ibG9ja05hbWVzID0gb3B0aW9ucy5ibG9ja05hbWVzO1xuICAgIHRoaXMubWFya2VyUHJlZml4ID0gb3B0aW9ucy5tYXJrZXJQcmVmaXg7XG4gICAgdGhpcy50b29sTmFtZSA9IG9wdGlvbnMudG9vbE5hbWU7XG4gIH1cblxuICBnZXRDb25maWdDb250ZW50KG9wdGlvbnM6IEdldENvbmZpZ0NvbnRlbnRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIW9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgICBpZiAodGhpcy5oYXNNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZU1hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQsIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQsIG9wdGlvbnMuZmlsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgfVxuXG4gIGdldEJsb2NrKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSl9XG4ke2NvbnRlbnR9XG4ke3RoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSl9YDtcbiAgfVxuXG4gIGhhc01hbmFnZWRCbG9ja3MoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tOYW1lcy5zb21lKChibG9ja05hbWUpID0+IGNvbnRlbnQuaW5jbHVkZXModGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudDogc3RyaW5nLCBkZXNpcmVkQ29udGVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgY29udGVudCA9IGV4aXN0aW5nQ29udGVudDtcbiAgICBmb3IgKGNvbnN0IGJsb2NrTmFtZSBvZiB0aGlzLmJsb2NrTmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gdGhpcy5leHRyYWN0TWFuYWdlZEJsb2NrKGRlc2lyZWRDb250ZW50LCBibG9ja05hbWUpO1xuICAgICAgaWYgKCFyZXBsYWNlbWVudCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZW50ID0gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQsIGJsb2NrTmFtZSwgcmVwbGFjZW1lbnQpO1xuICAgICAgaWYgKCFuZXh0Q29udGVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgaW5jb21wbGV0ZSAke2Jsb2NrTmFtZX0gYmxvY2sgaW4gJHt0aGlzLnRvb2xOYW1lfSBjb25maWc6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbnRlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZW50ID0gbmV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0TWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpLmV4ZWMoY29udGVudCk/LlswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKTtcbiAgICBpZiAoIXBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogUmVnRXhwIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICAgIGAke2VzY2FwZVJlZ0V4cCh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpfVtcXFxcc1xcXFxTXSo/JHtlc2NhcGVSZWdFeHAodGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6c3RhcnQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kTWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6ZW5kICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hmbXQnLFxuICB0b29sTmFtZTogJ294Zm10Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94Zm10Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxlZ2FjeUpzb25Db25maWdQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94Zm10cmMuanNvbicpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgIGZpbGVQYXRoLFxuICAgIH0pO1xuICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShsZWdhY3lKc29uQ29uZmlnUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSldO1xuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCkpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBDb21tb25KUyBwYWNrYWdlcyBuZWVkIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMgaGVyZTogb3hmbXQgY29uZmlnIGZpbGVzIGFyZVxuICAvLyBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCB0aGUgc2hhcmVkIGNvbmZpZyBwYWNrYWdlIGlzIEVTTS1vbmx5LlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIm5vZGVcIiAvPlxuaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94Zm10IGNvbmZpZyBmaWxlcyBhcmUgb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hmbXRDb25maWcgPSByZXF1aXJlKCdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyk7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuaW1wb3J0IGNvbmZpZyBmcm9tICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJztcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBjb25maWc7YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gbWlncmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVtb3ZlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLiBHZW5lcmF0ZWQgZmlsZXMgd2l0aFxuICAgIC8vIG1hbmFnZWQgYmxvY2tzIGFyZSBzdGlsbCBzYWZlIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogcmVwbGFjZUxlZ2FjeUNvbmZpZ1JlZmVyZW5jZXMoXG4gICAgICAgICAgbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGlmICghc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55YW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlTGVnYWN5Q29uZmlnUmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKC8oPzwhWy4vXSlcXGJjb25maWdcXC4vZ3UsICdveGxpbnRSZXNvbHZlZENvbmZpZy4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBpc1Jvb3RDb25maWcgPSBjb25maWcuaXNSb290O1xuICBjb25zdCBveGxpbnRCYXNlQ29uZmlnTW9kdWxlID0gZ2V0T3hsaW50QmFzZUNvbmZpZ01vZHVsZShjb25maWcpO1xuXG4gIC8vIERvIG5vdCBjb2xsYXBzZSB0aGlzIHRvIGEgc3RhdGljIGltcG9ydCBmb3IgZXZlcnkgcGFja2FnZS4gQ29tbW9uSlMgcGFja2FnZXNcbiAgLy8gdHlwZS1jaGVjayBhdXRvLWRpc2NvdmVyZWQgb3hsaW50LmNvbmZpZy50cyBhcyBDb21tb25KUywgc28gaW1wb3J0aW5nIHRoZSBFU01cbiAgLy8gQHdpbGxib29zdGVyL294bGludC1jb25maWcgcGFja2FnZSB0cmlnZ2VycyBUUzE0NzkuIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGhcbiAgLy8gbGl0ZXJhY3ktdGVzdCdzIGdlbmVyYXRlZCBjb25maWcgcGF0dGVybi5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIgLz5cbmltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuaW1wb3J0IG94bGludEJhc2VDb25maWcgZnJvbSAnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3hsaW50QmFzZUNvbmZpZ01vZHVsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID09PSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnID8gJy4vY29uZmlnLm1qcycgOiAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnO1xufVxuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgLy8gS2VlcCBhIHBhY2thZ2UtbG9jYWwgY29weSBzbyByZXBvc2l0b3JpZXMgY2FuIGFkZCBzZXR0aW5ncyBvdXRzaWRlXG4vLyBtYW5hZ2VkIGJsb2NrcyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgaW1wb3J0ZWQgY29uZmlnIG9iamVjdC5cbmNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuLy8gVGhlIHR5cGUtYXdhcmUgb3B0aW9ucyBtYWtlIGxpbnQgcGVyZm9ybSB0eXBlIGNoZWNraW5nLiBBbHdheXMgZm9yY2UgdGhlbSBvbiBoZXJlLFxuLy8gaW5zaWRlIHRoZSBtYW5hZ2VkIGJsb2NrLCBzbyBubyBjdXN0b21pemF0aW9uIGNhbiBzaWxlbnRseSBkaXNhYmxlIHR5cGUgY2hlY2tpbmcuXG5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zID0geyAuLi5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zLCB0eXBlQXdhcmU6IHRydWUsIHR5cGVDaGVjazogdHJ1ZSB9O2A7XG4gIH1cblxuICByZXR1cm4gYC8vIE94bGludCByZWplY3RzIHRoZSByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIG91dHNpZGUgdGhlIHJvb3QgY29uZmlnLCBzbyBkZWxldGUgdGhlbVxuLy8gaGVyZS4gVGhpcyBkb2VzIE5PVCBkaXNhYmxlIHR5cGUgY2hlY2tpbmc6IHRoZSBsaW50IGNvbW1hbmRzIHBhc3MgdGhlIC0tdHlwZS1hd2FyZSBhbmRcbi8vIC0tdHlwZS1jaGVjayBmbGFncyBleHBsaWNpdGx5LlxuY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5kZWxldGUgb3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucztgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGlmICghZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG1hbmFnZWRTY3JpcHRzQmxvY2sgPSBgc2NyaXB0cy8qKlxuIXNjcmlwdHMvXG4hc2NyaXB0cy8qLnNoYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFJhaWx3YXlpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UmFpbHdheWlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXnNjcmlwdHNcXC8kL20sIG1hbmFnZWRTY3JpcHRzQmxvY2spO1xuICAgIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkgPyBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSA6IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSAoYmFkZ2VOYW1lWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgaWYgKCFyZXBvc2l0b3J5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UobmV3Q29udGVudCwgYmFkZ2VOYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZU5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWRCYWRnZU5hbWUgPSBlc2NhcGVSZWdFeHAoYmFkZ2VOYW1lKTtcbiAgY29uc3QgZXNjYXBlZEZpbGVOYW1lID0gZXNjYXBlUmVnRXhwKGZpbGVOYW1lKTtcbiAgcmV0dXJuIHJlYWRtZVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgU3RyaW5nLnJhd2BcXFshXFxbJHtlc2NhcGVkQmFkZ2VOYW1lfVxcXVxcKGh0dHBzOi8vZ2l0aHViXFwuY29tL1teL1xccyldKy9bXi9cXHMpXSsvYWN0aW9ucy93b3JrZmxvd3MvJHtlc2NhcGVkRmlsZU5hbWV9L2JhZGdlXFwuc3ZnXFwpXFxdXFwoaHR0cHM6Ly9naXRodWJcXC5jb20vW14vXFxzKV0rL1teL1xccyldKy9hY3Rpb25zL3dvcmtmbG93cy8ke2VzY2FwZWRGaWxlTmFtZX1cXClcXG4/YCxcbiAgICAgICAgJ2d1J1xuICAgICAgKSxcbiAgICAgICcnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSBPbWl0PHR5cGVvZiBqc29uT2JqLCAnZXh0ZW5kcyc+ICYge1xuICBleHRlbmRzPzogc3RyaW5nW107XG4gIHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W107XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVJlbm92YXRlRXh0ZW5kcyhqc29uT2JqLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMgPz8gW10pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVub3ZhdGVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHM6IHN0cmluZ1tdLCBleGlzdGluZ0V4dGVuZHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmdlbmVyYXRlZEV4dGVuZHMsIC4uLmV4aXN0aW5nRXh0ZW5kc10pXS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbn1cbiIsImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBZ2VudFNraWxscyhfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgdGVtcG9yYXJpbHkgbm90IGluc3RhbGxpbmcgbWFuYWdlZCBhZ2VudCBza2lsbHMgaW50byByZXBvcy5cbiAgICAvLyBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMoX3Jvb3RDb25maWcpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAnKi5jb25maWcudHMnLFxuICAgICdwYWNrYWdlcy8qLyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgYXdhaXQgY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNCdW4gJiYgIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBqc3g6ICdyZWFjdC1qc3gnIH07XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgICBuZXdTZXR0aW5ncy5leGNsdWRlID0gbmV3U2V0dGluZ3MuZXhjbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG4gICAgICBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBjb25maWcpO1xuICAgIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGNvbmZpZyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSkpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOZXh0L0JsaXR6IG93biB0aGVpciB0c2NvbmZpZyBzaGFwZSwgYnV0IFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYWNjZXB0c1xuICAgIC8vIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZ3MgdGhhdCBvbGRlciBwcm9qZWN0cyBjb21tb25seSBpbmhlcml0ZWQuXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGlmIChzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKCdzY3JpcHRzLyoqLyonKSkgcmV0dXJuO1xuXG4gIHNldHRpbmdzLmluY2x1ZGUucHVzaCgnc2NyaXB0cy8qKi8qJyk7XG4gIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSA/ICcuLi8uLicgOiAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKGNvbXBpbGVyT3B0aW9ucy5ub0VtaXQgIT09IGZhbHNlIHx8IGNvbXBpbGVyT3B0aW9ucy5lbWl0RGVjbGFyYXRpb25Pbmx5ID09PSB0cnVlKSByZXR1cm47XG5cbiAgLy8gQHRzY29uZmlnL2J1biBlbmFibGVzIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zLCB3aGljaCBUeXBlU2NyaXB0IHBlcm1pdHNcbiAgLy8gZHVyaW5nIGVtaXQgb25seSB3aGVuIHJlbGF0aXZlIFRTIGV4dGVuc2lvbnMgYXJlIHJld3JpdHRlbi5cbiAgY29tcGlsZXJPcHRpb25zLnJld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbnMgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVMZWdhY3lNb2R1bGVTZXR0aW5ncyhcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIFR5cGVTY3JpcHQgdHJlYXRzIG9wdGlvbiB2YWx1ZXMgY2FzZS1pbnNlbnNpdGl2ZWx5LCBzbyBub3JtYWxpemUgYmVmb3JlIGNvbXBhcmlzb24uXG4gIGNvbnN0IG1vZHVsZVJlc29sdXRpb24gPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uKTtcbiAgLy8gVHlwZVNjcmlwdCA2IHJlbW92ZWQgdGhlIG9sZCBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmcsIHNvIGluaGVyaXRlZCBiYXNlIGNvbmZpZ3NcbiAgLy8gc2hvdWxkIGNob29zZSB0aGUgcmVzb2x2ZXIgdW5sZXNzIGEgcHJvamVjdCBhbHJlYWR5IG9wdGVkIGludG8gYSBtb2Rlcm4gb25lLlxuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnKSB7XG4gICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkgcmV0dXJuO1xuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnZpdGUgfHwgY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgIC8vIFZpdGUgb3ducyBtb2R1bGUgc2VtYW50aWNzIGZvciB0aGVzZSBwYWNrYWdlcyBhbmQgdGhlaXIgc291cmNlcyByZWx5IG9uXG4gICAgLy8gYnVuZGxlci1tb2RlIHJlc29sdXRpb24gKGUuZy4gZXh0ZW5zaW9ubGVzcyBpbXBvcnRzKSwgc28gcGluIHRoZSBidW5kbGVyIHBhaXJcbiAgICAvLyBldmVuIHdoZW4gYSBsZWdhY3kgY29uZmlnIHVzZWQgdGhlIG5vZGUgcmVzb2x2ZXIsIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvXG4gICAgLy8gdGhlIG5vZGUgYmFzZSBjb25maWdzJyBOb2RlTmV4dC5cbiAgICBpZiAobW9kdWxlUmVzb2x1dGlvbiAhPT0gJ2J1bmRsZXInKSB7XG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlS2luZCA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZSk7XG4gICAgLy8gVHlwZVNjcmlwdCBwYWlycyB0aGUgYnVuZGxlciByZXNvbHZlciB3aXRoIFByZXNlcnZlIG9yIEVTLW1vZHVsZSBraW5kcy4gS2VlcCBhblxuICAgIC8vIGV4aXN0aW5nIHZhbGlkIGtpbmQgKGUuZy4gUHJlc2VydmUsIHdoaWNoIGhhbmRsZXMgaW1wb3J0IGFuZCByZXF1aXJlIHN5bnRheFxuICAgIC8vIHNlcGFyYXRlbHkpIGFuZCBmaWxsIGluIEVTTmV4dCBvbmx5IHdoZW4gdGhlIHBhaXIgd291bGQgb3RoZXJ3aXNlIGJlIGludmFsaWQuXG4gICAgaWYgKG1vZHVsZUtpbmQgPT09IHVuZGVmaW5lZCB8fCAobW9kdWxlS2luZCAhPT0gJ3ByZXNlcnZlJyAmJiAhbW9kdWxlS2luZC5zdGFydHNXaXRoKCdlcycpKSkge1xuICAgICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZSA9ICdFU05leHQnO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ2J1bmRsZXInKSB7XG4gICAgLy8gVGhlIG5vZGUgYmFzZSBjb25maWdzIHByb3ZpZGUgYSBjb25zaXN0ZW50IG1vZHVsZS9yZXNvbHZlciBwYWlyLCBhbmQgZXZlcnlcbiAgICAvLyBtb2R1bGUga2luZCB0aGV5IG1heSBjaG9vc2UgaXMgaW52YWxpZCB3aXRoIGEgbGVmdG92ZXIgYnVuZGxlciByZXNvbHZlci5cbiAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gIH1cblxuICBjb25zdCBtb2R1bGVLaW5kID0gbG93ZXJDYXNlU2V0dGluZyhjb21waWxlck9wdGlvbnMubW9kdWxlKTtcbiAgaWYgKG1vZHVsZUtpbmQgPT09ICdwcmVzZXJ2ZScgfHwgbW9kdWxlS2luZD8uc3RhcnRzV2l0aCgnZXMnKSkge1xuICAgIC8vIE5vZGUgYmFzZSBjb25maWdzIHBhaXIgdGhlaXIgcmVzb2x2ZXIgd2l0aCBhIG1hdGNoaW5nIG1vZHVsZSBraW5kOyBsZWZ0b3ZlclxuICAgIC8vIEVTL1ByZXNlcnZlIG92ZXJyaWRlcyBhcmUgaW52YWxpZCB3aXRoIGV2ZXJ5IHBhaXIgdGhleSBtYXkgY2hvb3NlLlxuICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxvd2VyQ2FzZVNldHRpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucyB8fCBjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuaXNFc21QYWNrYWdlKSByZXR1cm47XG5cbiAgaWYgKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGU/LnRvTG93ZXJDYXNlKCkgPT09ICdjb21tb25qcycpIHtcbiAgICAvLyBAdHNjb25maWcvbm9kZS1sdHMgbm93IHByb3ZpZGVzIG1vZHVsZVJlc29sdXRpb249bm9kZTE2LiBUeXBlU2NyaXB0IHJlcXVpcmVzXG4gICAgLy8gdGhlIG1vZHVsZSBraW5kIHRvIG1vdmUgd2l0aCB0aGF0IHJlc29sdmVyLCB3aGlsZSB2ZXJiYXRpbU1vZHVsZVN5bnRheD1mYWxzZVxuICAgIC8vIHByZXNlcnZlcyB0aGUgbG9uZy1zdGFuZGluZyBDb21tb25KUyBlbWl0IHNoYXBlIGZvciBleGlzdGluZyBwYWNrYWdlcy5cbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlID0gJ05vZGUxNic7XG4gIH1cbiAgY29tcGlsZXJPcHRpb25zLnZlcmJhdGltTW9kdWxlU3ludGF4ID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddXG4pOiBQaWNrPE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LCAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnPiB7XG4gIGNvbnN0IGVtaXRPcHRpb25zID0ge30gYXMgUGljazxcbiAgICBOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPixcbiAgICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbm9kZScpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0OiAnYnJhbmNoJztcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnO1xuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGluY2x1ZGU6IHN0cmluZ1tdO1xuICAgICAgZXhjbHVkZTogc3RyaW5nW107XG4gICAgfTtcbiAgfTtcbiAgcnVsZXM6IChcbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2RlbGV0aW9uJyB8ICdub25fZmFzdF9mb3J3YXJkJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBib29sZWFuO1xuICAgICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiB7XG4gICAgICAgICAgICBjb250ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogbnVtYmVyO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiBudW1iZXI7XG4gICAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXTtcbiAgICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogYm9vbGVhbjtcbiAgICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ107XG4gICAgICAgIH07XG4gICAgICB9XG4gIClbXTtcbiAgYnlwYXNzX2FjdG9yczoge1xuICAgIGFjdG9yX2lkOiBudW1iZXI7XG4gICAgYWN0b3JfdHlwZTogJ1RlYW0nO1xuICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JztcbiAgfVtdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNvdXJjZV90eXBlPzogc3RyaW5nO1xufVxuXG5jb25zdCBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSID0ge1xuICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCA9IDE1XzM2ODtcblxuY29uc3QgUFJPVEVDVF9NQUlOX1JVTEVTRVQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCA9IHtcbiAgbmFtZTogJ1Byb3RlY3QgbWFpbicsXG4gIHRhcmdldDogJ2JyYW5jaCcsXG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJyxcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBleGNsdWRlOiBbXSxcbiAgICAgIGluY2x1ZGU6IFsnfkRFRkFVTFRfQlJBTkNIJ10sXG4gICAgfSxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZGVsZXRpb24nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGZhbHNlLFxuICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAndGVzdCAvIHRlc3QnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3NlbWFudGljLXByIC8gc2VtYW50aWMtcHInLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ25vbl9mYXN0X2ZvcndhcmQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IDAsXG4gICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXSxcbiAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBmYWxzZSxcbiAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBieXBhc3NfYWN0b3JzOiBbXG4gICAge1xuICAgICAgYWN0b3JfaWQ6IDE3Xzc3N180OTUsXG4gICAgICBhY3Rvcl90eXBlOiAnVGVhbScsXG4gICAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIFJlcG9zaXRvcnkgcnVsZXNldHMgcmVxdWlyZSBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB3aGljaCBsb2NhbCBydW5zXG4gICAgICAvLyBtYXkgbm90IGhhdmUgZXZlbiB3aGVuIGZpbGUtZ2VuZXJhdGlvbiBhbmQgcHVzaGVzIGFyZSBhbGxvd2VkLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgY29uc3QgcnVsZXNldCA9IHN0cnVjdHVyZWRDbG9uZShQUk9URUNUX01BSU5fUlVMRVNFVCk7XG4gIGlmIChjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlc2V0LnJ1bGVzKSB7XG4gICAgICBpZiAocnVsZS50eXBlICE9PSAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIGNvbnRleHQgaXMgYDxjYWxsZXIgam9iIGlkPiAvIDxyZXVzYWJsZSBqb2IgaWQ+YCBvZiB0aGUgd2JmeS1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbC5cbiAgICAgIHJ1bGUucGFyYW1ldGVycy5yZXF1aXJlZF9zdGF0dXNfY2hlY2tzLnB1c2goe1xuICAgICAgICBjb250ZXh0OiAndGVzdC1ydXN0IC8gdGVzdC1ydXN0JyxcbiAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydWxlc2V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0ID0gYXdhaXQgZmluZFJlcG9zaXRvcnlSdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBydWxlc2V0Lm5hbWUpO1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXRJZCA9IGV4aXN0aW5nUnVsZXNldD8uaWQ7XG5cbiAgYXdhaXQgd2l0aFJldHJ5KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChleGlzdGluZ1J1bGVzZXRJZCkge1xuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgcnVsZXNldF9pZDogZXhpc3RpbmdSdWxlc2V0SWQsXG4gICAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5UnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdpdGhSZXRyeShcbiAgICAoKSA9PlxuICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgaW5jbHVkZXNfcGFyZW50czogZmFsc2UsXG4gICAgICAgIHRhcmdldHM6ICdicmFuY2gnLFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSksXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG4gIGNvbnN0IHJ1bGVzZXRzID0gcmVzcG9uc2UuZGF0YTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzZXRzKSkgcmV0dXJuO1xuICByZXR1cm4gcnVsZXNldHMuZmluZCgocnVsZXNldCkgPT4gcnVsZXNldC5uYW1lID09PSBydWxlc2V0TmFtZSAmJiBydWxlc2V0LnNvdXJjZV90eXBlID09PSAnUmVwb3NpdG9yeScpO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgcmV0dXJuIHN0YXR1cyA9PT0gNDAxIHx8IHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDA0O1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHNvZGl1bU1vZHVsZSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5jb25zdCBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCcsICdHSF9CT1RfUEFUJywgJ1BVQkxJQ19HSF9CT1RfUEFUJ107XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikgfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZW52JyksIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNlY3JldE5hbWUgb2YgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgY29uc3Qgc29kaXVtID0gZ2V0U29kaXVtKCk7XG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTb2RpdW0oKTogdHlwZW9mIHNvZGl1bU1vZHVsZSB7XG4gIC8vIGxpYnNvZGl1bS13cmFwcGVycycgRVNNIGVudHJ5IGNhbiBiaW5kIHRvIGxpYnNvZGl1bUAwLjguMywgd2hvc2UgZGVmYXVsdFxuICAvLyBleHBvcnQgbm8gbG9uZ2VyIGV4cG9zZXMgcmVhZHkuIFRoZSBDb21tb25KUyBlbnRyeSBrZWVwcyB0aGUgQVBJIHNoYXBlLlxuICByZXR1cm4gcmVxdWlyZSgnbGlic29kaXVtLXdyYXBwZXJzJykgYXMgdHlwZW9mIHNvZGl1bU1vZHVsZTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwR2l0SHViU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVwb3NpdG9yeSBzZXR0aW5ncyBuZWVkIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHVubGlrZSBmaWxlIGdlbmVyYXRpb24uXG4gICAgICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBMb2NhbCB3YmZ5IHJ1bnMgb2Z0ZW4gaGF2ZSBwdXNoIHBlcm1pc3Npb24gd2l0aG91dCBhZG1pbiBwZXJtaXNzaW9uLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwR2l0SHViU2V0dGluZ3MgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcgfHwgISgnc3RhdHVzJyBpbiBlcnJvcikpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVycm9yLnN0YXR1cyA9PT0gNDAxIHx8IGVycm9yLnN0YXR1cyA9PT0gNDAzIHx8IGVycm9yLnN0YXR1cyA9PT0gNDA0O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyID0gJ19fUE1fUlVOX18nO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUobmV3Q29udGVudCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBjb250ZW50KSA+IGNvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlckNvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlQWxsKHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIsIHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlVG9tbCB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNDbG91ZGZsYXJlOiBib29sZWFuO1xuICBpc1JhaWx3YXk6IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIC8qKiBEaXJlY3RvcmllcyBjb250YWluaW5nIENhcmdvLnRvbWwgKHJlbGF0aXZlIHRvIGRpclBhdGgsIHJvb3QtbW9zdCBmaXJzdCkuIEVtcHR5IGlmIHRoZSByZXBvIGhhcyBubyBSdXN0IGNvZGUuICovXG4gIGNhcmdvVG9tbERpclBhdGhzOiBzdHJpbmdbXTtcbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZzogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0UnVudGltZTogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHRhdXJpOiBib29sZWFuO1xuICAgIHZpbmV4dDogYm9vbGVhbjtcbiAgICB2aXRlOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICAgIGNoYWtyYTogYm9vbGVhbjtcbiAgICBkcml6emxlOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgbWlzZVRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGF1cmkgb2ZmaWNpYWxseSBzdXBwb3J0cyBKU09OLCBKU09ONSwgYW5kIFRPTUwgY29uZmlndXJhdGlvbiBmb3JtYXRzLlxuICAgIGNvbnN0IGRvZXNDb250YWluVGF1cmlDb25maWcgPSBbJ3RhdXJpLmNvbmYuanNvbicsICd0YXVyaS5jb25mLmpzb241JywgJ1RhdXJpLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdzcmMtdGF1cmknLCBmaWxlTmFtZSkpXG4gICAgKTtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIHJlcG9BdXRob3IsXG4gICAgICByZXBvTmFtZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNDbG91ZGZsYXJlOiBkZXRlY3RDbG91ZGZsYXJlKGRpclBhdGgsIHBhY2thZ2VKc29uKSxcbiAgICAgIGlzUmFpbHdheTogZGV0ZWN0UmFpbHdheShkaXJQYXRoLCBwYWNrYWdlSnNvbiksXG4gICAgICBpc0J1bjpcbiAgICAgICAgcm9vdENvbmZpZz8uaXNCdW4gfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrYicpKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKSkgfHxcbiAgICAgICAgLy8gU29tZSByZXBvcyBnaXRpZ25vcmUgYnVuLmxvY2ssIHNvIGl0IG1heSBiZSBtaXNzaW5nIG9uIGZyZXNoIGNsb25lcy5cbiAgICAgICAgLy8gYnVuZmlnLnRvbWwgaXMgY29tbWl0dGVkIGFuZCBnZW5lcmF0ZWQgb25seSBmb3IgQnVuIHByb2plY3RzLCBtYWtpbmcgaXQgYSByZWxpYWJsZSBzaWduYWwuXG4gICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW5maWcudG9tbCcpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoJy93aWxsYm9vc3Rlci1jb25maWdzJyksXG4gICAgICBjYXJnb1RvbWxEaXJQYXRoczogZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXM6IGNvbnRhaW5zQW55KFxuICAgICAgICAncGFja2FnZXMvKiovc3JjLXRhdXJpL3t0YXVyaS5jb25mLmpzb24sdGF1cmkuY29uZi5qc29uNSxUYXVyaS50b21sfScsXG4gICAgICAgIGRpclBhdGhcbiAgICAgICksXG4gICAgICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhOiBjb250YWluc0FueSgnKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGNoYWtyYTogISFkZXZEZXBlbmRlbmNpZXNbJ0BjaGFrcmEtdWkvY2xpJ10sXG4gICAgICAgIGRyaXp6bGU6ICEhZGVwZW5kZW5jaWVzWydkcml6emxlLW9ybSddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydkcml6emxlLWtpdCddLFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGdlbkkxOG5UczogISFkZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICByZWFjdDogISFkZXBlbmRlbmNpZXMucmVhY3QsXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzLm5leHQsXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0LFxuICAgICAgICBwbGF5d3JpZ2h0UnVudGltZTogZG9lc0ltcG9ydFBsYXl3cmlnaHRBdFJ1bnRpbWUoZGlyUGF0aCksXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgdGF1cmk6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2FwaSddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2FwaSddIHx8XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2NsaSddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2NsaSddIHx8XG4gICAgICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyxcbiAgICAgICAgdmluZXh0OiAhIWRlcGVuZGVuY2llcy52aW5leHQgfHwgISFkZXZEZXBlbmRlbmNpZXMudmluZXh0LFxuICAgICAgICB2aXRlOiAhIWRlcGVuZGVuY2llcy52aXRlIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnZpdGUsXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyxcbiAgICAgIG1pc2VUYXNrczogYXdhaXQgcmVhZE1pc2VUYXNrcyhkaXJQYXRoKSxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWcgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICdtaXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLm1pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcudG9vbC12ZXJzaW9ucycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RDbG91ZGZsYXJlKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCd3cmFuZ2xlcicpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKFxuICAgIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0ZpbGVzTWF0Y2goZGlyUGF0aCwgL2Nsb3VkZmxhcmV8d3JhbmdsZXIvaXUpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RSYWlsd2F5KGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCdyYWlsd2F5JykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5Lmpzb24nKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0ZpbGVzTWF0Y2goZGlyUGF0aCwgL3JhaWx3YXkvaXUpO1xufVxuXG5mdW5jdGlvbiB3b3JrZmxvd0ZpbGVzTWF0Y2goZGlyUGF0aDogc3RyaW5nLCByZWdleDogUmVnRXhwKTogYm9vbGVhbiB7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzXG4gICAgICAucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aClcbiAgICAgIC5zb21lKChmaWxlTmFtZSkgPT4gL1xcLnlhP21sJC9pdS50ZXN0KGZpbGVOYW1lKSAmJiB3b3JrZmxvd0ZpbGVNYXRjaGVzKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lLCByZWdleCkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gd29ya2Zsb3dGaWxlTWF0Y2hlcyh3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIHJlZ2V4OiBSZWdFeHApOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVnZXgudGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBwYXJzZVRvbWwoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZnXG4gICAgLmdsb2JTeW5jKCcqKi9DYXJnby50b21sJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pXG4gICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnNwbGl0KCcvJykubGVuZ3RoIC0gYi5zcGxpdCgnLycpLmxlbmd0aCB8fCBhLmxvY2FsZUNvbXBhcmUoYikpO1xufVxuXG5mdW5jdGlvbiBkb2VzSW1wb3J0UGxheXdyaWdodEF0UnVudGltZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZXMgPSBmZy5nbG9iU3luYygne2FwcCxzcmN9LyoqLyoue2NqcyxjdHMsanMsanN4LG1qcyxtdHMsdHMsdHN4fScsIHtcbiAgICBkb3Q6IHRydWUsXG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsICcqKi9fX3Rlc3RzX18vKionLCAnKiovKi5zcGVjLionLCAnKiovKi50ZXN0LionLCAnKiovcGxheXdyaWdodC5jb25maWcuKiddLFxuICB9KTtcbiAgcmV0dXJuIGZpbGVzLnNvbWUoKGZpbGUpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlKSwgJ3V0ZjgnKTtcbiAgICByZXR1cm4gL1xcYmZyb21cXHMrWydcIl1wbGF5d3JpZ2h0WydcIl18XFxiaW1wb3J0XFxzKlxcKFxccypbJ1wiXXBsYXl3cmlnaHRbJ1wiXVxccypcXCl8XFxicmVxdWlyZVxccypcXChcXHMqWydcIl1wbGF5d3JpZ2h0WydcIl1cXHMqXFwpL3UudGVzdChcbiAgICAgIGNvbnRlbnRcbiAgICApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIHJldHVybiB7IGZ1bGxfbmFtZTogcmVkaXJlY3RlZEZ1bGxOYW1lIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IGFsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilgO1xuY29uc3QgYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucyA9IFtcbiAgbmV3IFJlZ0V4cChgXiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChgXmdpdGh1Yjoke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/aHR0cHM6Ly9naXRodWJcXFxcLmNvbS8ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP3NzaDovL2dpdEBnaXRodWJcXFxcLmNvbVs6L10ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKGBeKD86Z2l0XFxcXCspP2dpdEBnaXRodWJcXFxcLmNvbToke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLCAndScpLFxuXTtcblxuaW50ZXJmYWNlIERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlIHtcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZztcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBzZWN0aW9uTmFtZTogKHR5cGVvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpW251bWJlcl07XG4gIHNwZWNpZmllcjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHZvaWQge1xuICBjb25zdCBkaXNhbGxvd2VkU291cmNlcyA9IGNvbmZpZ3MuZmxhdE1hcChnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMpO1xuICBpZiAoZGlzYWxsb3dlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlscyA9IGRpc2FsbG93ZWRTb3VyY2VzXG4gICAgLm1hcChcbiAgICAgICh7IGRlcGVuZGVuY3lOYW1lLCBkaXJQYXRoLCBzZWN0aW9uTmFtZSwgc3BlY2lmaWVyIH0pID0+XG4gICAgICAgIGAtICR7cGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKX06ICR7c2VjdGlvbk5hbWV9LiR7ZGVwZW5kZW5jeU5hbWV9IHVzZXMgJHtzcGVjaWZpZXJ9YFxuICAgIClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEaXNhbGxvd2VkIEdpdCBkZXBlbmRlbmN5IHNvdXJjZXMgZm91bmQuXFxuT25seSBXaWxsQm9vc3RlciBhbmQgV2lsbEJvb3N0ZXJMYWIgR2l0SHViIGRlcGVuZGVuY2llcyBhcmUgYWxsb3dlZC5cXG4ke2RldGFpbHN9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm4gW107XG5cbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXM6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uTmFtZSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFja2FnZUpzb25bc2VjdGlvbk5hbWVdO1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgc3BlY2lmaWVyXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCFzcGVjaWZpZXIpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAoaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcblxuICAgICAgZGlzYWxsb3dlZFNvdXJjZXMucHVzaCh7XG4gICAgICAgIGRlcGVuZGVuY3lOYW1lLFxuICAgICAgICBkaXJQYXRoOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgc2VjdGlvbk5hbWUsXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlzYWxsb3dlZFNvdXJjZXM7XG59XG5cbmZ1bmN0aW9uIGlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcikgfHxcbiAgICAvXig/OmJpdGJ1Y2tldHxnaXN0fGdpdGh1YnxnaXRsYWIpOi91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eaHR0cHM/OlxcL1xcLyg/OmJpdGJ1Y2tldFxcLm9yZ3xnaXRodWJcXC5jb218Z2l0bGFiXFwuY29tKVxcLy91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86aHR0cHM/fHNzaCk6XFwvXFwvXFxTK1xcLmdpdCg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15bXkBcXHNdK0BbXjpcXHNdKzpcXFMrKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0OicpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdCsnKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdzc2g6Ly9naXRAJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eW2EtekEtWjAtOV1bXFx3Li1dKlxcL1tcXHcuLV0rKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmZ1bmN0aW9uIGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHNwZWNpZmllcikpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBmaXhXYkRiQ29tbWFuZCB9IGZyb20gJy4vZml4ZXJzL3diRGJDb21tYW5kLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdlbWluaUNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcuanMnO1xuaW1wb3J0IHsgcmVtb3ZlR2VtaW5pU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGZtdENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGZtdENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94bGludENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGxpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UmFpbHdheWlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyB9IGZyb20gJy4vZ2l0aHViL3J1bGVzZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBTZWNyZXRzIH0gZnJvbSAnLi9naXRodWIvc2VjcmV0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMgfSBmcm9tICcuL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVR5cGVTY3JpcHRBcGkgfSBmcm9tICcuL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuICBvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzID0gYXJndi5lbnY7XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBhd2FpdCB3aWxsYm9vc3RlcmlmeVBhdGhzKGFyZ3YucGF0aHMgYXMgc3RyaW5nW10sIGFyZ3Yuc2tpcERlcHMpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIHNlcnZlciBzcGF3bmVkIGZvciBBU1QgcGFyc2luZyBrZWVwcyBhbiBvcGVuIElQQ1xuICAgIC8vIGNoYW5uZWwgdGhhdCB3b3VsZCBvdGhlcndpc2UgcHJldmVudCB0aGUgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgICBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdpbGxib29zdGVyaWZ5UGF0aHMocGF0aHM6IHN0cmluZ1tdLCBza2lwRGVwczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCByb290RGlyUGF0aCBvZiBwYXRocykge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBmaXhSYWlsd2F5aWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcERlcHMpO1xuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmIGRvZXNDb250YWluSnNPclRzKHJvb3RDb25maWcpKSB7XG4gICAgICAgIC8vIE1vbm9yZXBvIHZlcmlmaWNhdGlvbiBjYW4gaW52b2tlIG94bGludCBmcm9tIGV2ZXJ5IHdvcmtzcGFjZS4gR2l2ZVxuICAgICAgICAvLyBub24tY29kZSBwYWNrYWdlcyBhIGxvY2FsIGNvbmZpZyBzbyBveGxpbnQgZG9lcyBub3QgY2xpbWIgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgY29uZmlnIGFuZCByZWplY3Qgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBmcm9tIGEgcGFja2FnZSBjd2QuXG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICBhd2FpdCBmaXhXYkRiQ29tbWFuZChyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3JlZnJlc2hCdW5Mb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG4gIHJldHVybiBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZztcbn1cblxuZnVuY3Rpb24gcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAvLyB3YmZ5IHNob3VsZCB1cGRhdGUgb25seSB0aGUgcGFja2FnZXMgaXQgZXhwbGljaXRseSBtYW5hZ2VzIHRocm91Z2ggYnVuIGFkZC5cbiAgLy8gUnVubmluZyBidW4gdXBkYXRlIGhlcmUgcmVmcmVzaGVzIHVucmVsYXRlZCBhcHBsaWNhdGlvbiBkZXBlbmRlbmNpZXMgYW5kXG4gIC8vIGNhbiBjaGFuZ2UgcHJvZHVjdCBiZWhhdmlvciwgc28ga2VlcCB0aGUgZXhpc3RpbmcgbG9jayBhbmQgcmVjb25jaWxlIGl0LlxuICBjb25zdCBzdGF0dXMgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gIGlmIChzdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMTIsMTMsMTQsMTUsMTYsMTddLCJtYXBwaW5ncyI6Ijh0QkFBQSxlQUFzQixHQUFNLEVBQXFDLENBQy9ELE9BQU8sSUFBSSxRQUFTLEdBQVksV0FBVyxFQUFTLENBQVksQ0FBQyxDQUNuRSxDQ2lDQSxlQUFzQixHQUFvQixFQUE4QyxDQUN0RixHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUcsQ0FDbEIsTUFBUSxDQUVSLENBQ0YsQ0FFQSxlQUFzQixFQUFxQixFQUE4QyxDQUN2RixHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUcsQ0FDbEIsT0FBUyxFQUFPLENBQ2QsR0FBSSxPQUFPLEdBQVUsVUFBWSxHQUFTLFNBQVUsR0FBUyxFQUFNLE9BQVMsU0FDMUUsT0FFRixNQUFNLENBQ1IsQ0FDRixDQTBCQSxlQUFzQixHQUNwQixFQUNBLENBQ0UsY0FDQSxjQUNBLGFBQWEsRUFDYixjQUNBLGNBQ0Esb0JBQW9CLEVBQ3BCLDJCQUNnQixDQUFDLEVBQ1AsQ0FDWixJQUFJLEVBQWMsRUFDbEIsT0FDRSxHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUssQ0FBVyxDQUMvQixPQUFTLEVBQU8sQ0FNZCxHQUxBLE1BQU0sSUFBYyxDQUFLLEVBQ3pCLElBQ0ksR0FBZSxHQUdmLEdBQWUsQ0FBQyxFQUFZLENBQUssRUFDbkMsTUFBTSxFQUVKLEVBQW9CLEdBQ3RCLE1BQU0sR0FBTSxDQUFpQixFQUUzQixJQUNGLEVBQW9CLEVBQXdCLENBQWlCLEdBRS9ELElBQWMsaUJBQWlCLEVBQU07RUFDekMsYUFBaUIsTUFBUTtHQUFXLEVBQU0sT0FBUyxJQUFNLElBQUksRUFDekQsTUFBTSxJQUFjLENBQUssQ0FDM0IsQ0FFSixDQzdHQSxNQUFhLEVBQVUsSUFBSSxLQUxiLENBQ1osVUFBWSxHQUNaLGtCQUFvQixFQUN0QixFQ2VhLEVBQVMsSUFBSSxLQWhCYixDQUNYLE1BQU0sMEJBQTBCLEVBQWMsRUFBMEMsQ0FDbEYsRUFBUSxXQUNWLFFBQVEsS0FBSyxhQUFhLEVBQUssaUJBQWlCLEVBRWxELEdBQUksQ0FDRixNQUFNLEVBQUssQ0FDYixPQUFTLEVBQU8sQ0FDZCxRQUFRLEtBQUsscUJBQXFCLEVBQUssSUFBSSxhQUFpQixNQUFRLEVBQU0sTUFBUSxPQUFPLENBQUssRUFBRSxFQUFFLENBQ3BHLENBQ0ksRUFBUSxXQUNWLFFBQVEsS0FBSyxjQUFjLEVBQUssZ0JBQWdCLENBRXBELENBQ0YsRUNiYSxFQUFTLENBQ3BCLE1BQU0sc0JBQXNCLEVBQStDLENBQ3pFLEdBQUksQ0FDRixPQUFPLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLENBQ3BELE1BQVEsQ0FFUixDQUNGLEVBQ0EsTUFBTSxhQUFhLEVBQWtCLEVBQWdDLENBQ25FLE1BQU0sRUFBRyxTQUFTLE1BQU0sRUFBSyxRQUFRLENBQVEsRUFBRyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ25FLElBQUksRUFBb0IsRUFBUSxLQUFLLEVBQ2pDLElBQ0YsR0FBcUI7R0FFdkIsTUFBTSxFQUFHLFNBQVMsVUFBVSxFQUFVLENBQWlCLENBRXpELENBQ0YsRUNsQmEsRUFBYyxJQUFJLEVDTS9CLElBQUksR0FFSixTQUFTLElBQWMsQ0FDckIsTUFBUSxNQUFRLElBQUksRUFBSSxDQUFFLElBQUssUUFBUSxJQUFJLENBQUUsQ0FBQyxDQUNoRCxDQU9BLFNBQWdCLEdBQWdCLEVBQTBDLENBQ3hFLEdBQUksQ0FFRixPQURpQixHQUFPLENBQUMsQ0FBQyxlQUFlLENBQUUsVUFBVyxDQUFDLENBQVEsQ0FBRSxDQUNuRCxDQUFDLENBQUMseUJBQXlCLENBQVEsQ0FBQyxFQUFFLFFBQVEsY0FBYyxDQUFRLENBQ3BGLE1BQVEsQ0FDTixNQUNGLENBQ0YsQ0FPQSxTQUFnQixJQUE2QixDQUMzQyxJQUFLLE1BQU0sRUFDWCxHQUFNLElBQUEsRUFDUixDQ3RCQSxNQUFNLEdBQStELENBQ25FLENBQUUsS0FBTSxnQkFBaUIsS0FBTSxxQkFBc0IsRUFDckQsQ0FBRSxLQUFNLGtCQUFtQixLQUFNLHVCQUF3QixFQUN6RCxDQUFFLEtBQU0sYUFBYyxLQUFNLHlDQUEwQyxDQUN4RSxFQUVBLGVBQXNCLEdBQWtCLEVBQXNDLENBQzVFLE9BQU8sRUFBTywwQkFBMEIsb0JBQXFCLFNBQVksQ0FDdkUsSUFBTSxFQUFXLENBQUMsS0FBTSxNQUFPLE1BQU8sS0FBTSxNQUFPLEtBQUssQ0FBQyxDQUN0RCxJQUFLLEdBQVEsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEdBQUssQ0FBQyxDQUFDLENBQ2hFLEtBQU0sR0FBTSxFQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQy9CLEdBQUksQ0FBQyxFQUFVLE9BRWYsSUFBTSxFQUFZLEdBQTJCLENBQVEsRUFDckQsR0FBSSxDQUFDLEVBQVcsT0FDaEIsR0FBTSxDQUFFLFNBQVEsaUJBQWtCLEVBRzVCLEVBQXFCLElBQUksSUFDN0IsRUFBYyxXQUFXLElBQUssR0FDNUIsU0FBVSxHQUFZLEVBQVMsS0FBTyxHQUFlLEVBQVMsS0FBTSxDQUFNLEVBQUksSUFBQSxFQUNoRixDQUNGLEVBQ00sRUFBZ0IsR0FDbkIsT0FBUSxHQUFhLENBQUMsRUFBbUIsSUFBSSxFQUFTLElBQUksQ0FBQyxDQUFDLENBQzVELElBQUssR0FBYSxFQUFTLElBQUksRUFDbEMsR0FBSSxFQUFjLFNBQVcsRUFBRyxPQUVoQyxJQUFNLEVBQWEsRUFBTyxLQUNwQixFQUFpQixFQUFjLE9BQU8sRUFBSSxFQUkxQyxFQUFlLEVBQWMsV0FBVyxHQUFHLEVBQUUsRUFDN0MsRUFBbUIsRUFDckIsR0FBYyxFQUFXLE1BQU0sRUFBYSxPQUFPLEVBQUcsQ0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFDbkYsR0FDRSxFQUFTLEVBQWMsV0FBVyxPQUFTLEdBQUssQ0FBQyxFQUFtQixLQUFPLEdBQzNFLEVBQWEsR0FBRyxFQUFXLE1BQU0sRUFBRyxDQUFjLElBQUksSUFBUyxFQUFjLEtBQUssSUFBSSxJQUFJLEVBQVcsTUFDekcsQ0FDRixJQUNBLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FBQyxDQUN2RSxDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQ1AsRUFDb0YsQ0FDcEYsSUFBTSxFQUFTLEdBQWdCLENBQVEsRUFDdkMsR0FBSSxDQUFDLEVBQVEsT0FNYixJQUFJLEVBQ0EsRUFDRSxFQUF5QixJQUFJLElBQzdCLEVBQTJELENBQUMsRUFFNUQsRUFBUyxHQUF5QixDQUN0QyxHQUFJLEVBQUksbUJBQW1CLENBQUksRUFBRyxDQUNoQyxJQUFNLEVBQWdCLEdBQW9CLEVBQUssVUFBVSxFQUNyRCxFQUNGLElBQXdCLEVBQ2YsRUFBSSxhQUFhLEVBQUssVUFBVSxJQUN6QyxJQUF1QixFQUFLLFdBQVcsUUFBUSxDQUFNLEVBRXpELE1BQU8sR0FDTCxFQUFJLG1CQUFtQixDQUFJLEdBQzNCLEVBQUssY0FBYyxPQUFTLEVBQUksV0FBVyxhQUMzQyxFQUFLLEtBQUssUUFBUSxDQUFNLElBQU0saUJBQzlCLENBQ0EsSUFBTSxFQUFnQixHQUFvQixFQUFLLEtBQUssRUFDaEQsRUFDRixJQUF3QixFQUNmLEVBQUksYUFBYSxFQUFLLEtBQUssSUFDcEMsSUFBdUIsRUFBSyxNQUFNLFFBQVEsQ0FBTSxFQUVwRCxNQUFPLEdBQUksRUFBSSxzQkFBc0IsQ0FBSSxHQUFLLEVBQUssWUFBYSxDQUM5RCxJQUFNLEVBQWdCLEdBQW9CLEVBQUssV0FBVyxFQUMxRCxHQUFJLEdBQWlCLEVBQUksYUFBYSxFQUFLLElBQUksRUFBRyxDQUNoRCxFQUF1QixJQUFJLEVBQUssS0FBSyxRQUFRLENBQU0sRUFBRyxDQUFhLEVBR25FLElBQU0sRUFBaUIsRUFBSyxNQUFNLFFBQVEsQ0FBTSxFQUMxQyxFQUFlLEdBQWdCLEVBQUssV0FBVyxDQUFDLEVBQUUsUUFBUSxDQUFNLEdBRW5FLElBQW1CLElBQUEsSUFBYSxHQUFpQixDQUFjLEdBQy9ELElBQWlCLElBQUEsSUFBYSxHQUFpQixDQUFZLElBQ3JDLEVBQTBCLEtBQUssQ0FBYSxDQUN2RSxDQUNGLENBQ0EsRUFBSyxhQUFhLENBQUssQ0FDekIsRUFDQSxFQUFPLGFBQWEsQ0FBSyxFQUV6QixJQUFNLEVBQ0osRUFBMEIsSUFDMUIsSUFDQyxFQUFxQixFQUF1QixJQUFJLENBQWtCLEVBQUksSUFBQSxLQUN2RSxFQUF1QixJQUFJLFlBQVksRUFDekMsT0FBTyxFQUFnQixDQUFFLFNBQVEsZUFBYyxFQUFJLElBQUEsRUFDckQsQ0FHQSxTQUFTLEdBQW9CLEVBQStELENBQzFGLElBQU0sRUFBVSxHQUFpQixDQUFJLEVBQ3JDLE9BQU8sRUFBSSwwQkFBMEIsQ0FBTyxFQUFJLEVBQVUsSUFBQSxFQUM1RCxDQUdBLFNBQVMsR0FBZ0IsRUFBZ0QsQ0FDdkUsSUFBTSxFQUFVLEdBQWtCLENBQUksRUFDdEMsT0FBTyxFQUFJLGVBQWUsQ0FBTyxHQUFLLEVBQUksc0JBQXNCLENBQU8sRUFBSSxFQUFRLEtBQU8sSUFBQSxFQUM1RixDQUdBLFNBQVMsR0FBaUIsRUFBZ0MsQ0FDeEQsSUFBSSxFQUFvQixHQUFrQixDQUFJLEVBQzlDLEtBQU8sRUFBSSxlQUFlLENBQU8sR0FBSyxFQUFJLHNCQUFzQixDQUFPLEdBQ3JFLEVBQVUsR0FBa0IsRUFBUSxVQUFVLEVBRWhELE9BQU8sQ0FDVCxDQUdBLFNBQVMsR0FBa0IsRUFBc0MsQ0FDL0QsSUFBSSxFQUFVLEVBQ2QsS0FBTyxFQUFJLDBCQUEwQixDQUFPLEdBQzFDLEVBQVUsRUFBUSxXQUVwQixPQUFPLENBQ1QsQ0FHQSxTQUFTLEdBQWlCLEVBQTJCLENBQ25ELE9BQU8sSUFBYSxjQUFnQixFQUFTLFNBQVMsYUFBYSxDQUNyRSxDQUlBLFNBQVMsR0FBZSxFQUF3QixFQUFnQyxDQUM5RSxNQUFPLFNBQVUsR0FBUSxPQUFPLEVBQUssTUFBUyxTQUFXLEVBQUssS0FBTyxFQUFLLFFBQVEsQ0FBTSxDQUMxRixDQUdBLFNBQVMsR0FBYyxFQUFzQixDQUMzQyxPQUFPLEVBQUssV0FBVywrQkFBZ0MsRUFBRSxDQUMzRCxDQ2pLQSxTQUFnQixFQUFrQixFQUFnQyxDQUNoRSxPQUNFLEVBQU8sdUJBQ1AsRUFBTyxpQ0FDUCxFQUFPLHVCQUNQLEVBQU8sK0JBRVgsQ0FFQSxTQUFnQixFQUFnQixFQUFnQyxDQUM5RCxPQUFPLEVBQU8saUJBQW1CLEVBQU8seUJBQzFDLENBRUEsU0FBZ0IsR0FBeUIsRUFBc0QsQ0FDN0YsT0FBTyxFQUFPLE1BQVEsTUFBUSxNQUNoQyxDQ1VBLE1BQU0sRUFBVyxJQUFnQyxDQUFFLEtBQU0sVUFBVyxPQUFNLEdBQ3BFLEdBQVcsSUFBdUMsQ0FBRSxLQUFNLFFBQVMsT0FBTSxHQUN6RSxJQUFZLEVBQXlDLEVBQXlCLENBQUMsS0FBb0IsQ0FDdkcsS0FBTSxTQUNOLE1BQU8sR0FBZSxFQUFZLENBQVksQ0FDaEQsR0FFQSxTQUFTLEdBQW9CLEVBQXVCLEVBQW1ELENBQ3JHLElBQU0sRUFBTSxHQUFlLENBQ3pCLE1BQU8sRUFBUSx5REFBeUQsRUFDeEUsV0FBWSxFQUFRLDJDQUEyQyxFQUMvRCxNQUFPLEVBQVEseURBQXlELENBQzFFLENBQUMsRUFPRCxPQUxJLElBQ0YsRUFBSSxXQUFXLFFBQVUsRUFBUSxrQ0FBa0MsRUFDbkUsRUFBSSxZQUFZLFFBQVEsQ0FBRSxLQUFNLFdBQVksSUFBSyxTQUFVLENBQUMsR0FHdkQsR0FBZSxDQUNwQixXQUFZLEVBQVEsa0JBQWtCLEVBQ3RDLFFBQVMsRUFBUSxrREFBa0QsRUFDbkUsSUFBSyxDQUFFLEtBQU0sU0FBVSxNQUFPLENBQUksRUFDbEMsR0FBSSxFQUNBLENBQ0UsVUFBVyxHQUFTLENBQ2xCLFFBQVMsRUFBUSxHQUFzQixDQUFNLENBQUMsRUFDOUMsSUFBSyxFQUFRLGtDQUFrQyxFQUMvQyxvQkFBcUIsRUFBUSxrQkFBa0IsRUFDL0MsUUFBUyxFQUFRLFNBQVMsRUFDMUIsT0FBUSxFQUFRLFFBQVEsRUFDeEIsT0FBUSxFQUFRLFFBQVEsRUFDeEIsSUFBSyxFQUFROzs7RUFHdkIsRUFDVSxpQkFBa0IsRUFBUTs7O0VBR3BDLENBQ1EsQ0FBQyxDQUNILEVBQ0EsQ0FBQyxDQUNQLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBZSxFQUF5QyxFQUF5QixDQUFDLEVBQWlCLENBQzFHLE1BQU8sQ0FDTCxlQUNBLFlBQWEsQ0FDWCxHQUFHLE9BQU8sS0FBSyxDQUFVLENBQUMsQ0FBQyxJQUFLLElBQXVCLENBQUUsS0FBTSxXQUFZLEtBQUksRUFBRSxFQUNqRixHQUFHLEVBQWEsS0FBSyxFQUFHLEtBQXlCLENBQUUsS0FBTSxRQUFTLE9BQU0sRUFBRSxDQUM1RSxFQUNBLFlBQ0YsQ0FDRixDQUVBLGVBQXNCLEdBQW9CLEVBQXNDLENBQzlFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLHNCQUFzQixFQUMvRCxLQUFHLFdBQVcsQ0FBUSxFQUUzQixPQUFPLEVBQU8sMEJBQTBCLHNCQUF1QixTQUFZLENBQ3pFLElBQU0sRUFBeUIsR0FBaUMsQ0FBUSxFQUN4RSxHQUFJLENBQUMsRUFBd0IsT0FFN0IsSUFBTSxFQUFTLEdBQTZCLEVBQXVCLEtBQU0sRUFBdUIsTUFBTSxFQUN0RyxHQUFJLENBQUMsRUFBUSxPQUliLElBQU0sRUFBZ0IsR0FBb0IsRUFEdkMsTUFBTSxHQUE0QixFQUFPLE9BQU8sR0FBTSxHQUE4QixFQUFRLENBQU0sQ0FDekIsRUFDdEUsRUFBUyxHQUFtQixFQUFlLENBQU0sRUFDdkQsR0FBd0IsRUFBUSxDQUFhLEVBQzdDLEdBQW9CLEVBQVEsQ0FBTSxFQUVsQyxJQUFNLEVBQW1CLEdBQWUsQ0FBRSxLQUFNLFNBQVUsTUFBTyxDQUFPLEVBQUcsQ0FBQyxFQUN0RSxFQUFhLEVBQXVCLE9BQU8sS0FDM0MsRUFBUSxFQUF1QixLQUFLLFNBQVMsRUFBdUIsTUFBTSxFQUMxRSxFQUFNLEVBQXVCLEtBQUssT0FBTyxFQUN6QyxFQUFhLEdBQUcsRUFBVyxNQUFNLEVBQUcsQ0FBSyxJQUFJLElBQW1CLEVBQVcsTUFBTSxDQUFHLElBRTFGLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FBQyxDQUN2RSxDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQW1CLEVBQW9CLEVBQXNDLENBQ3BGLElBQU0sRUFBdUIsSUFBSSxJQUFJLE9BQU8sS0FBSyxFQUFTLFVBQVUsQ0FBQyxFQUMvRCxFQUFlLENBQUMsR0FBRyxFQUFLLGFBQWMsR0FBRyxFQUFTLFlBQVksRUFFOUQsRUFBYyxDQUNsQixHQUFHLEVBQUssWUFBWSxPQUFRLEdBQVcsRUFBTyxPQUFTLFlBQWMsQ0FBQyxFQUFxQixJQUFJLEVBQU8sR0FBRyxDQUFDLEVBQzFHLEdBQUcsRUFBUyxZQUFZLElBQUssR0FDdkIsRUFBTyxPQUFTLFdBQW1CLEVBQ2hDLENBQUUsS0FBTSxRQUFTLE1BQU8sRUFBSyxhQUFhLE9BQVMsRUFBTyxLQUFNLENBQ3hFLENBQ0gsRUFDTSxFQUFhLENBQUUsR0FBRyxFQUFLLFVBQVcsRUFDeEMsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxFQUFTLFVBQVUsRUFDM0QsRUFBVyxHQUFPLEdBQWlCLEVBQVcsR0FBTSxDQUFLLEVBRTNELE1BQU8sQ0FBRSxlQUFjLGNBQWEsWUFBVyxDQUNqRCxDQUVBLFNBQVMsR0FBaUIsRUFBK0IsRUFBb0MsQ0FJM0YsT0FISSxHQUFNLE9BQVMsVUFBWSxFQUFTLE9BQVMsU0FDeEMsQ0FBRSxLQUFNLFNBQVUsTUFBTyxHQUFtQixFQUFLLE1BQU8sRUFBUyxLQUFLLENBQUUsRUFFMUUsQ0FDVCxDQUVBLFNBQVMsR0FBd0IsRUFBc0IsRUFBbUMsQ0FDeEYsSUFBTSxFQUFNLEVBQU8sV0FBVyxJQUN4QixFQUFhLEVBQWMsV0FBVyxJQUN4QyxRQUFLLE9BQVMsVUFBWSxHQUFZLE9BQVMsVUFFbkQsSUFBSyxJQUFNLElBQU8sQ0FBQyxRQUFTLGFBQWMsT0FBTyxFQUFHLENBQ2xELElBQU0sRUFBZSxFQUFXLE1BQU0sV0FBVyxHQUM3QyxJQUNGLEVBQUksTUFBTSxXQUFXLEdBQU8sRUFFaEMsQ0FDRixDQUVBLFNBQVMsR0FBOEIsRUFBdUIsRUFBK0IsQ0FDM0YsT0FDRSxFQUFPLFVBQVUsTUFDakIsRUFBTyxXQUFXLFlBQWMsSUFBQSxJQUNoQyxHQUFzQixFQUFPLFdBQVcsR0FBRyxHQUMzQyxHQUF3QixDQUFFLEtBQU0sU0FBVSxNQUFPLENBQU8sRUFBRyxzQkFBc0IsQ0FFckYsQ0FFQSxTQUFTLEdBQXNCLEVBQXlDLENBQ3RFLE9BQU8sR0FBTyxPQUFTLFVBQVksRUFBTSxNQUFNLFdBQVcsVUFBWSxJQUFBLEVBQ3hFLENBRUEsU0FBUyxHQUF3QixFQUFvQixFQUE4QixDQUdqRixPQUZJLEVBQU0sT0FBUyxVQUFrQixFQUFNLE1BQU0sU0FBUyxDQUFXLEVBQ2pFLEVBQU0sT0FBUyxRQUFnQixFQUFNLE1BQU0sS0FBTSxHQUFVLEdBQXdCLEVBQU8sQ0FBVyxDQUFDLEVBRXhHLEVBQU0sTUFBTSxhQUFhLEtBQU0sR0FBVyxFQUFPLFNBQVMsQ0FBVyxDQUFDLEdBQ3RFLE9BQU8sT0FBTyxFQUFNLE1BQU0sVUFBVSxDQUFDLENBQUMsS0FBTSxHQUFVLEdBQXdCLEVBQU8sQ0FBVyxDQUFDLENBRXJHLENBRUEsZUFBZSxHQUE0QixFQUFtQyxDQUM1RSxJQUFLLElBQU0sS0FBZSxHQUFnQixDQUFPLEVBQy9DLEdBQUksQ0FDRixJQUFNLEVBQVUsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFhLE1BQU0sRUFDOUQsR0FBSSw0QkFBNEIsS0FBSyxDQUFPLEVBQzFDLE1BQU8sRUFFWCxNQUFRLENBRVIsQ0FLRixNQUFPLEVBQ1QsQ0FFQSxTQUFTLEdBQWdCLEVBQTJCLENBQ2xELElBQU0sRUFBZSxDQUFDLE9BQVEsWUFBYSxlQUFnQixZQUFhLGdCQUFnQixFQUNsRixFQUF5QixDQUFDLEVBRWhDLElBQUssSUFBSSxFQUFpQixFQUFLLFFBQVEsQ0FBTyxFQUM1QyxFQUFhLEtBQUssR0FBRyxFQUFhLElBQUssR0FBYSxFQUFLLFFBQVEsRUFBZ0IsQ0FBUSxDQUFDLENBQUMsRUFNckUsRUFGbEIsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFnQixNQUFNLENBQUMsR0FFaEMsRUFBSyxRQUFRLENBQ25CLElBQU0sR0FSMkIsRUFBaUIsRUFBSyxRQUFRLENBQWMsR0FXL0YsT0FBTyxDQUNULENBRUEsU0FBUyxHQUFvQixFQUFzQixFQUE2QixDQUM5RSxJQUFNLEVBQVksRUFBTyxXQUFXLFVBQ2hDLEdBQVcsT0FBUyxXQUt4QixFQUFVLE1BQU0sV0FBVyxRQUFVLEVBQVEsR0FBc0IsQ0FBTSxDQUFDLEVBQzVFLENBRUEsU0FBUyxHQUFzQixFQUErQixDQUM1RCxNQUFPLElBQUksR0FBeUIsQ0FBTSxFQUFFLHVCQUM5QyxDQUVBLFNBQVMsR0FBaUMsRUFBc0QsQ0FDOUYsSUFBTSxFQUFTLEdBQWdCLENBQVEsRUFDdkMsR0FBSSxDQUFDLEVBQVEsT0FJYixJQUFJLEVBQ0UsRUFBUyxHQUF5QixDQUNsQyxNQUNKLElBQUksRUFBSSxpQkFBaUIsQ0FBSSxHQUFLLEVBQUssV0FBVyxRQUFRLENBQU0sSUFBTSxlQUFnQixDQUNwRixJQUFNLEVBQWdCLEVBQUssVUFBVSxHQUNyQyxHQUFJLEdBQWlCLEVBQUksMEJBQTBCLENBQWEsRUFBRyxDQUNqRSxFQUFRLEVBQ1IsTUFDRixDQUNGLENBQ0EsRUFBSyxhQUFhLENBQUssQ0FEdkIsQ0FFRixFQUdBLE9BRkEsRUFBTyxhQUFhLENBQUssRUFFbEIsRUFBUSxDQUFFLFNBQVEsS0FBTSxDQUFNLEVBQUksSUFBQSxFQUMzQyxDQUVBLFNBQVMsR0FBZ0IsRUFBNEIsRUFBaUQsQ0FDcEcsR0FBSSxFQUFJLDBCQUEwQixDQUFVLEVBQUcsQ0FDN0MsSUFBTSxFQUFlLEdBQTZCLEVBQVksQ0FBTSxFQUNwRSxPQUFPLEVBQWUsQ0FBRSxLQUFNLFNBQVUsTUFBTyxDQUFhLEVBQUksRUFBUSxFQUFXLFFBQVEsQ0FBTSxDQUFDLENBQ3BHLENBQ0EsR0FBSSxFQUFJLHlCQUF5QixDQUFVLEVBQUcsQ0FDNUMsSUFBTSxFQUFXLEVBQVcsU0FBUyxJQUFLLEdBQVksR0FBZ0IsRUFBUyxDQUFNLENBQUMsRUFJdEYsT0FISSxFQUFTLEtBQU0sR0FBa0MsSUFBWSxJQUFBLEVBQVMsRUFDakUsRUFBUSxFQUFXLFFBQVEsQ0FBTSxDQUFDLEVBRXBDLEdBQVEsQ0FBeUIsQ0FDMUMsQ0FDQSxPQUFPLEVBQVEsRUFBVyxRQUFRLENBQU0sQ0FBQyxDQUMzQyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQzBCLENBQzFCLElBQU0sRUFBdUIsQ0FBRSxhQUFjLENBQUMsRUFBRyxZQUFhLENBQUMsRUFBRyxXQUFZLENBQUMsQ0FBRSxFQUNqRixJQUFLLElBQU0sS0FBWSxFQUFjLFdBQVksQ0FDL0MsR0FBSSxFQUFJLDhCQUE4QixDQUFRLEVBQUcsQ0FDL0MsSUFBTSxFQUFNLEVBQVMsS0FBSyxRQUFRLENBQU0sRUFDeEMsRUFBTyxXQUFXLEdBQU8sRUFBUSxDQUFHLEVBQ3BDLEVBQU8sWUFBWSxLQUFLLENBQUUsS0FBTSxXQUFZLEtBQUksQ0FBQyxFQUNqRCxRQUNGLENBQ0EsR0FDRSxDQUFDLEVBQUkscUJBQXFCLENBQVEsR0FDakMsQ0FBQyxFQUFJLGFBQWEsRUFBUyxJQUFJLEdBQUssQ0FBQyxFQUFJLGdCQUFnQixFQUFTLElBQUksRUFDdkUsQ0FDQSxJQUFNLEVBQVEsRUFBTyxhQUFhLEtBQUssRUFBUyxRQUFRLENBQU0sQ0FBQyxFQUFJLEVBQ25FLEVBQU8sWUFBWSxLQUFLLENBQUUsS0FBTSxRQUFTLE9BQU0sQ0FBQyxFQUNoRCxRQUNGLENBQ0EsSUFBTSxFQUFRLEdBQWdCLEVBQVMsWUFBYSxDQUFNLEVBQzFELEdBQUksSUFBVSxJQUFBLEdBQVcsT0FDekIsSUFBTSxFQUFNLEVBQVMsS0FBSyxRQUFRLENBQU0sRUFDeEMsRUFBTyxXQUFXLEdBQU8sRUFDekIsRUFBTyxZQUFZLEtBQUssQ0FBRSxLQUFNLFdBQVksS0FBSSxDQUFDLENBQ25ELENBQ0EsT0FBTyxDQUNULENBRUEsU0FBUyxHQUFlLEVBQW9CLEVBQXVCLENBQ2pFLElBQU0sRUFBZ0IsS0FBSyxPQUFPLENBQUssRUFDdkMsR0FBSSxFQUFNLE9BQVMsUUFBUyxDQUMxQixHQUFJLEVBQU0sTUFBTSxTQUFXLEVBQUcsTUFBTyxLQUNyQyxJQUFNLEVBQVMsS0FBSyxPQUFPLEVBQVEsQ0FBQyxFQVlwQyxNQUFPLE1BWE8sRUFBTSxNQUFNLElBQUssR0FBUyxDQUN0QyxJQUFNLEVBQWMsR0FBZSxFQUFNLEVBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTTtDQUFJLEVBRTlELEdBREEsRUFBWSxFQUFZLE9BQVMsR0FBSyxHQUFHLEVBQVksR0FBRyxFQUFFLEVBQUUsR0FDeEQsRUFBSyxPQUFTLFVBQ2hCLElBQUssSUFBSSxFQUFRLEVBQUcsRUFBUSxFQUFZLE9BQVEsR0FBUyxFQUN2RCxFQUFZLEdBQVMsR0FBRyxJQUFTLEVBQVksS0FJakQsTUFEQSxHQUFZLEdBQUssR0FBRyxJQUFTLEVBQVksS0FDbEMsRUFBWSxLQUFLO0NBQUksQ0FDOUIsQ0FDaUIsQ0FBQyxDQUFDLEtBQUs7Q0FBSSxFQUFFLElBQUksRUFBYyxFQUNsRCxDQUNBLEdBQUksRUFBTSxPQUFTLFVBQVcsT0FBTyxFQUFNLE1BRTNDLElBQU0sRUFBUyxLQUFLLE9BQU8sRUFBUSxDQUFDLEVBQzlCLEVBQW9CLElBQUksSUFDeEIsRUFBeUIsR0FBMEIsRUFBTSxNQUFNLFdBQVcsRUFDMUUsRUFBUSxFQUFNLE1BQU0sWUFBWSxTQUFTLEVBQVEsSUFBVSxDQUMvRCxHQUFJLEVBQU8sT0FBUyxRQUNsQixNQUFPLENBQUMsR0FBc0IsRUFBTSxNQUFNLGFBQWEsRUFBTyxRQUFVLEdBQUksQ0FBTSxDQUFDLEVBR3JGLEdBQUksRUFBdUIsSUFBSSxFQUFPLEdBQUcsSUFBTSxFQUFPLE1BQU8sQ0FBQyxFQUM5RCxJQUFNLEVBQU8sRUFBTSxNQUFNLFdBQVcsRUFBTyxLQUczQyxNQUZJLENBQUMsR0FBUSxFQUFrQixJQUFJLEVBQU8sR0FBRyxFQUFVLENBQUMsR0FDeEQsRUFBa0IsSUFBSSxFQUFPLEdBQUcsRUFDekIsQ0FBQyxHQUF3QixFQUFPLElBQUssRUFBTSxFQUFPLENBQU0sQ0FBQyxFQUNsRSxDQUFDLEVBT0QsT0FOQSxFQUFNLEtBQ0osR0FBRyxPQUFPLFFBQVEsRUFBTSxNQUFNLFVBQVUsQ0FBQyxDQUN0QyxRQUFRLENBQUMsS0FBUyxDQUFDLEVBQWtCLElBQUksQ0FBRyxDQUFDLENBQUMsQ0FDOUMsS0FBSyxDQUFDLEVBQUssS0FBVSxHQUF3QixFQUFLLEVBQU0sRUFBTyxDQUFNLENBQUMsQ0FDM0UsRUFDSSxFQUFNLFNBQVcsRUFBVSxNQUFNLEVBQWMsR0FDNUMsTUFBTSxFQUFNLEtBQUs7Q0FBSSxFQUFFLElBQUksRUFBYyxFQUNsRCxDQUVBLFNBQVMsR0FBMEIsRUFBa0QsQ0FDbkYsSUFBTSxFQUF5QixJQUFJLElBQ25DLElBQUssR0FBTSxDQUFDLEVBQU8sS0FBVyxFQUFZLFFBQVEsRUFDNUMsRUFBTyxPQUFTLFlBQ2xCLEVBQXVCLElBQUksRUFBTyxJQUFLLENBQUssRUFHaEQsT0FBTyxDQUNULENBRUEsU0FBUyxHQUF3QixFQUFhLEVBQW1CLEVBQWUsRUFBd0IsQ0FDdEcsSUFBTSxFQUFjLEdBQWUsRUFBTSxFQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07Q0FBSSxFQUU5RCxHQURBLEVBQVksRUFBWSxPQUFTLEdBQUssR0FBRyxFQUFZLEdBQUcsRUFBRSxFQUFFLEdBQ3hELEVBQUssT0FBUyxVQUNoQixJQUFLLElBQUksRUFBUSxFQUFHLEVBQVEsRUFBWSxPQUFRLEdBQVMsRUFDdkQsRUFBWSxHQUFTLEdBQUcsSUFBUyxFQUFZLEtBSWpELE1BREEsR0FBWSxHQUFLLEdBQUcsSUFBUyxFQUFJLElBQUksRUFBWSxLQUMxQyxFQUFZLEtBQUs7Q0FBSSxDQUM5QixDQUVBLFNBQVMsR0FBc0IsRUFBZ0IsRUFBd0IsQ0FDckUsSUFBTSxFQUFjLEVBQU8sTUFBTTtDQUFJLEVBQ3JDLEVBQVksRUFBWSxPQUFTLEdBQUssR0FBRyxFQUFZLEdBQUcsRUFBRSxFQUFFLEdBQzVELElBQUssR0FBTSxDQUFDLEVBQU8sS0FBUyxFQUFZLFFBQVEsRUFDOUMsRUFBWSxHQUFTLEdBQUcsSUFBUyxJQUVuQyxPQUFPLEVBQVksS0FBSztDQUFJLENBQzlCLENDeFdBLE1BQWEsRUFBYSxDQUN4QixxQkFDQSx3QkFDQSxjQUNBLHNCQUNBLHNCQUNBLGFBQ0EsY0FDQSxlQUNBLGFBQ0EsV0FDRixFQ0ZBLGVBQXNCLEdBQWtCLEVBQXNDLENBQzVFLE9BQU8sRUFBTywwQkFBMEIsb0JBQXFCLFNBQVksQ0FDdkUsSUFBTSxFQUEyQixHQUErQixDQUFNLEVBQ2hFLEVBQVcsTUFBTSxFQUFHLEtBQUssQ0FBQyxRQUFTLFNBQVMsRUFBRyxDQUFFLElBQUssR0FBTSxJQUFLLEVBQU8sUUFBUyxPQUFRLENBQVcsQ0FBQyxFQUMzRyxJQUFLLElBQU0sS0FBVyxFQUFVLENBQzlCLElBQU0sRUFBYyxFQUFLLFFBQVEsRUFBTyxRQUFTLENBQU8sRUFDbEQsRUFBVSxNQUFNQSxFQUFHLFNBQVMsRUFBYSxNQUFNLEVBQy9DLEVBQWEsRUFBUSxXQUN6Qix3REFDQyxFQUFPLElBQ0MsaUJBQWlCLEdBQTJCLEVBQUssQ0FBd0IsRUFBRSxFQUV0RixFQUNJLElBQWUsR0FDakIsTUFBTUEsRUFBRyxVQUFVLEVBQWEsQ0FBVSxDQUU5QyxDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBK0IsRUFBZ0MsQ0FDdEUsR0FBSSxDQUFDLEVBQU8sVUFBVSxPQUFRLE1BQU8sR0FFckMsSUFBTSxFQUFlLENBQ25CLEdBQUcsRUFBTyxhQUFhLGFBQ3ZCLEdBQUcsRUFBTyxhQUFhLGVBQ3pCLEVBSUEsTUFBTyxDQUFDLEVBQWEsbUNBQXFDLENBQUMsRUFBYSx5QkFDMUUsQ0FFQSxTQUFTLEdBQTJCLEVBQWEsRUFBMkMsQ0FDMUYsSUFBTSxFQUFhLEVBQUksUUFBUSxHQUFHLEVBQzVCLEVBQVcsSUFBZSxHQUFnQyxFQUEzQixFQUFJLE1BQU0sRUFBRyxDQUFVLEVBQ3RELEVBQVksSUFBZSxHQUFpQyxHQUE1QixFQUFJLE1BQU0sRUFBYSxDQUFDLEVBQ3hELEVBQVMsSUFBSSxnQkFBZ0IsQ0FBUyxFQUU1QyxFQUFPLE9BQU8sa0JBQWtCLEVBQzVCLEdBQ0YsRUFBTyxJQUFJLG1CQUFvQixHQUFHLEVBR3BDLElBQU0sRUFBa0IsRUFBTyxTQUFTLEVBQ3hDLE9BQU8sRUFBa0IsR0FBRyxFQUFTLEdBQUcsSUFBb0IsQ0FDOUQsQ0N2REEsTUFBTSxJQUFPLEVBQVEsSUFBUSxPQUFPLFVBQVUsZUFBZSxLQUFLLEVBQVEsQ0FBRyxFQUU3RSxTQUF3QixFQUF3QixFQUFRLEVBQVUsQ0FDaEUsSUFBSSxFQUFNLEVBQVEsRUFFZCxPQUFPLEdBQWEsV0FDdEIsRUFBUyxFQUVULEVBQU8sRUFHVCxJQUFNLEVBQVEsQ0FBQyxFQUdmLElBQUssSUFBTyxDQUZRLEdBQUksR0FBUSxDQUFDLEVBQUksR0FBRyxPQUFPLEtBQUssQ0FBTSxDQUFDLENBQUMsS0FBSyxDQUFNLENBRWxELEVBQ2YsR0FBSSxFQUFRLENBQUcsSUFDakIsRUFBTSxHQUFPLEVBQU8sSUFJeEIsT0FBTyxDQUNULENDcEJBLE1BQU0sR0FBZSxnQkFFZixHQUFvQixRQUkxQixTQUFTLEdBQXdCLEVBQW9CLEVBQVksRUFBTyxDQUN2RSxPQUFPLEdBQXNCLElBQWUsSUFBcUIsSUFBVSxDQUM1RSxDQWdCQSxTQUFTLEdBQWUsRUFBUSxFQUFvQixDQUNuRCxJQUFNLEVBQVUsSUFBSSxJQUdoQixFQUFlLEVBQ2YsRUFHQSxFQUVKLElBQUssSUFBTSxLQUFRLEVBQU8sTUFBTSxLQUFLLEVBQUcsQ0FDdkMsR0FBSSxDQUFDLEVBRUosU0FHRCxJQUFNLEVBQVUsRUFBSyxNQUFNLEVBQVksRUFFdkMsR0FBSSxJQUFZLEtBQ2YsRUFBZSxFQUNmLEVBQXFCLE9BQ2YsQ0FDTixJQUFNLEVBQVMsRUFBUSxFQUFFLENBQUMsT0FDcEIsRUFBYSxFQUFRLEdBQUssR0FBb0IsTUFHcEQsR0FBSSxHQUF3QixFQUFvQixFQUFZLENBQU0sRUFDakUsU0FHRyxJQUFlLElBQ2xCLEVBQWUsR0FHaEIsRUFBcUIsRUFFckIsSUFBSSxFQUFNLEVBQ04sRUFBUyxFQUVQLEVBQW1CLEVBQVMsRUFJbEMsR0FIQSxFQUFlLEVBR1gsSUFBcUIsRUFFeEIsRUFBTSxFQUVOLEVBQVMsTUFFSCxDQUNOLElBQU0sRUFBMkIsS0FBSyxJQUFJLENBQWdCLEVBSTFELEdBQUksR0FBd0IsRUFBb0IsRUFBWSxDQUF3QixFQUNuRixTQUdELEVBQU0sR0FBaUIsRUFBWSxDQUF3QixDQUM1RCxDQUdBLElBQU0sRUFBUSxFQUFRLElBQUksQ0FBRyxFQUM3QixFQUFRLElBQUksRUFBSyxJQUFVLElBQUEsR0FBWSxDQUFDLEVBQUcsQ0FBQyxFQUFJLENBQUMsRUFBTSxHQUFLLEVBQUssRUFBTSxHQUFLLENBQU0sQ0FBQyxDQUNwRixDQUNELENBRUEsT0FBTyxDQUNSLENBR0EsU0FBUyxHQUFpQixFQUFZLEVBQWMsQ0FFbkQsT0FEc0IsSUFBZSxHQUFvQixJQUFNLEtBQ3hDLE9BQU8sQ0FBWSxDQUMzQyxDQUdBLFNBQVMsR0FBaUIsRUFBWSxDQU1yQyxNQUFPLENBQUMsS0FMZ0IsRUFBVyxLQUFPLElBQ1gsR0FBb0IsTUFJckMsT0FGQyxPQUFPLEVBQVcsTUFBTSxDQUFDLENBRXJCLENBQUMsQ0FDckIsQ0FJQSxTQUFTLEdBQWUsRUFBUyxDQUNoQyxJQUFJLEVBQ0EsRUFBVSxFQUNWLEVBQVksRUFFaEIsSUFBSyxHQUFNLENBQUMsRUFBSyxDQUFDLEVBQVcsTUFBWSxHQUNwQyxFQUFZLEdBQVksSUFBYyxHQUFXLEVBQVMsS0FDN0QsRUFBVSxFQUNWLEVBQVksRUFDWixFQUFTLEdBSVgsT0FBTyxDQUNSLENBRUEsU0FBUyxHQUFpQixFQUFNLEVBQVEsQ0FFdkMsT0FEd0IsSUFBUyxHQUFvQixJQUFNLElBQUEsQ0FDcEMsT0FBTyxDQUFNLENBQ3JDLENBRUEsU0FBd0IsR0FBYSxFQUFRLENBQzVDLEdBQUksT0FBTyxHQUFXLFNBQ3JCLE1BQVUsVUFBVSxtQkFBbUIsRUFLeEMsSUFBSSxFQUFVLEdBQWUsRUFBUSxFQUFJLEVBQ3JDLEVBQVEsT0FBUyxJQUNwQixFQUFVLEdBQWUsRUFBUSxFQUFLLEdBR3ZDLElBQU0sRUFBc0IsR0FBZSxDQUFPLEVBRTlDLEVBQ0EsRUFBUyxFQUNULEVBQVMsR0FPYixPQUxJLElBQXdCLElBQUEsS0FDMUIsa0JBQWlCLEdBQWlCLENBQW1CLEVBQ3RELEVBQVMsR0FBaUIsRUFBTSxDQUFNLEdBR2hDLENBQ04sU0FDQSxPQUNBLFFBQ0QsQ0FDRCxDQ2xLQSxTQUFnQixHQUFjLEVBQVEsQ0FDckMsR0FBSSxPQUFPLEdBQVcsU0FDckIsTUFBVSxVQUFVLG1CQUFtQixFQUd4QyxJQUFNLEVBQVcsRUFBTyxNQUFNLFlBQVksR0FBSyxDQUFDLEVBRWhELEdBQUksRUFBUyxTQUFXLEVBQ3ZCLE9BR0QsSUFBTSxFQUFPLEVBQVMsT0FBTyxHQUFXLElBQVk7Q0FBTSxDQUFDLENBQUMsT0FHNUQsT0FBTyxFQUZJLEVBQVMsT0FBUyxFQUVWO0VBQVM7Q0FDN0IsQ0FFQSxTQUFnQixHQUFzQixFQUFRLENBQzdDLE9BQVEsT0FBTyxHQUFXLFVBQVksR0FBYyxDQUFNLEdBQU07Q0FDakUsNGFFbkJBLFNBQXdCLEdBQWMsRUFBTyxDQUM1QyxHQUFJLE9BQU8sR0FBVSxXQUFZLEVBQ2hDLE1BQU8sR0FHUixJQUFNLEVBQVksT0FBTyxlQUFlLENBQUssRUFDN0MsT0FBUSxJQUFjLE1BQVEsSUFBYyxPQUFPLFdBQWEsT0FBTyxlQUFlLENBQVMsSUFBTSxPQUFTLEVBQUUsT0FBTyxlQUFlLElBQVUsRUFBRSxPQUFPLFlBQVksRUFDdEssQ0NFQSxNQUFNLEVBQ0gsSUFDQSxFQUFHLEdBQUcsSUFDTCxFQUFJLFFBQVEsRUFBUSxJQUFPLEVBQUcsRUFBUSxHQUFHLENBQUksRUFBRyxDQUFDLEVBQy9DLEVBQVcsR0FBUSxHQUFPLE1BQU0sUUFBUSxDQUFDLEVBQUksRUFBRyxDQUFDLEVBQUksRUFDckQsR0FBaUIsR0FBUSxHQUM3QixNQUFNLFFBQVEsQ0FBQyxHQUFLLEVBQUUsTUFBTyxHQUFTLE9BQU8sR0FBUyxRQUFRLEVBQUksRUFBRyxDQUFDLEVBQUksRUFDdEUsRUFBTyxHQUFlLEdBQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFFLENBQUMsQ0FBQyxFQUU3QyxFQUFtQixFQUFLLENBQUMsRUFEYixHQUFlLEdBQVUsRUFBTSxTQUFTLENBQ2IsQ0FBQyxDQUFDLEVBQ3pDLEVBQ0gsSUFDQSxFQUFHLEdBQUcsSUFDTCxHQUFjLENBQUMsRUFBSSxFQUFHLEVBQUcsR0FBRyxDQUFJLEVBQUksRUFDbEMsR0FBZ0IsRUFBWSxJQUFTLENBQ3pDLElBQU0sRUFBTyxFQUFVLElBQ2pCLElBQ0YsRUFBUyxPQUFPLFlBQ2QsT0FBTyxRQUFRLENBQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFLLEtBQVcsQ0FBQyxFQUFLLEVBQUssQ0FBSyxDQUFDLENBQUMsQ0FDakUsR0FHS0MsRUFBZSxFQUFRLENBQVUsRUFDekMsRUFFRCxPQUFPLENBQ1QsRUFDTSxFQUFhLEVBQWEsRUFDMUIsR0FBZ0IsRUFBYSxDQUFDLE9BQVEsS0FBSyxDQUFDLEVBQzVDLEdBQW1CLEVBQWEsQ0FBQyxPQUFRLFFBQVMsS0FBSyxDQUFDLEVBQ3hELEdBQWtCLEVBQWEsQ0FDbkMsTUFDQSxNQUNBLE1BQ0EsTUFDQSxVQUNBLE1BQ0YsQ0FBQyxFQUNLLEdBQWdCLEVBQVUsSUFDOUIsR0FBVSxFQUFRLEdBQUcsSUFDbkIsT0FBTyxPQUFPLEVBQVEsQ0FBUSxFQUMxQixDQUFFLEdBQUcsR0FBUyxHQUFXLEVBQUssRUFBTyxHQUFXLEdBQUcsQ0FBSSxDQUFFLEVBQ3pELENBQ04sRUFDSSxHQUFlLEVBQWFDLEVBQVEsRUFFcEMsR0FBNEIsR0FBYyxDQUU5QyxHQUFNLENBQUMsR0FBa0IsRUFBVSxNQUFNLEdBQUcsRUFDdEMsRUFBWSxDQUFDLEdBQUcsRUFBZSxTQUFTLEdBQUcsQ0FBQyxFQUNsRCxHQUNFLENBQUMsRUFBVSxRQUNWLEVBQVUsU0FBVyxHQUFLLEVBQVUsRUFBRSxDQUFDLFFBQVUsRUFFbEQsTUFBTyxDQUFFLEtBQU0sQ0FBVSxFQUUzQixJQUFNLEVBQWEsRUFBVSxJQUFJLENBQUMsQ0FBQyxNQUNuQyxNQUFPLENBQ0wsS0FBTSxFQUFlLFVBQVUsRUFBRyxDQUFVLEVBQzVDLE1BQU8sRUFBZSxVQUFVLEVBQWEsQ0FBQyxDQUNoRCxDQUNGLEVBRU0sR0FBcUIsR0FBYyxFQUFHLElBQU0sQ0FDaEQsR0FBTSxDQUFFLEtBQU0sRUFBTyxNQUFPLEdBQVcsR0FBeUIsQ0FBQyxFQUMzRCxDQUFFLEtBQU0sRUFBTyxNQUFPLEdBQVcsR0FBeUIsQ0FBQyxFQVdqRSxPQVRJLElBQVUsRUFHVCxFQUdBLEVBR0UsRUFBYyxFQUFpQixDQUFNLEVBQUcsRUFBaUIsQ0FBTSxDQUFDLEVBRjlELEVBSEEsR0FIQSxFQUFNLGNBQWMsRUFBTyxJQUFJLENBUzFDLENBQUMsRUFFSyxHQUFrQixHQUFVLENBQ2hDLElBQU0sRUFBUSxFQUFNLFFBQVEsSUFBSyxLQUFNLFdBQVcsR0FBRyxDQUFTLEVBRTlELE9BQU8sSUFBVSxHQUFLLEVBQVEsRUFBTSxNQUFNLEVBQUcsQ0FBSyxDQUNwRCxFQUVNLElBQXFCLEVBQUcsSUFBTSxDQUNsQyxJQUFNLEVBQWUsR0FBZSxDQUFDLEVBQy9CLEVBQWUsR0FBZSxDQUFDLEVBSXJDLE9BRkksRUFBZSxFQUFxQixHQUN4QyxFQUFJLEVBQWUsRUFFckIsRUFHTSxHQUFRLElBQUksSUFDWixPQUEyQixDQUMvQixJQUFNLEVBQU0sUUFBUSxJQUFJLEVBV3hCLE9BVkssR0FBTSxJQUFJLENBQUcsR0FDaEIsR0FBTSxJQUNKLEVBQ0EsRUFBRyxXQUFXLFdBQVcsR0FDdkIsRUFBRyxXQUFXLFFBQVEsR0FDdEIsRUFBRyxXQUFXLGFBQWEsR0FDM0IsRUFBRyxXQUFXLGdCQUFnQixHQUM5QixFQUFHLFdBQVcscUJBQXFCLENBQ3ZDLEVBRUssR0FBTSxJQUFJLENBQUcsQ0FDdEIsRUFPQSxTQUFTLEdBQThCLEVBQWEsQ0F1QmxELE9BckJJLE9BQU8sRUFBWSxnQkFBbUIsU0FDakMsRUFBWSxlQUFlLFdBQVcsTUFBTSxFQUdqRCxFQUFZLFlBQVksZ0JBQWdCLEtBQ25DLEVBQVksV0FBVyxlQUFlLE9BQVMsTUFHcEQsRUFBWSxLQUNQLEdBSUwsRUFBWSxTQUFTLElBQ2hCLEdBR1QsQ0FBSSxHQUFtQixDQUt6QixDQU9BLE1BQU0sRUFBbUIsR0FBVSxFQUFjLElBRTNDLE9BQU8sS0FBSyxDQUFZLENBQUMsQ0FBQyxPQUFTLEVBQzlCLEVBS0wsR0FBOEIsQ0FBVyxFQUNwQ0QsRUFBZSxHQUFlLEVBQUcsSUFBTSxFQUFFLGNBQWMsRUFBRyxJQUFJLENBQUMsRUFHakVBLEVBQWUsQ0FBWSxDQUNuQyxFQVNLLEdBQWlCLEVBQUssQ0FDMUIsRUFBYSxDQUFDLFdBQVksU0FBUyxDQUFDLEVBQ3BDLEVBQWEsV0FBWSxDQUFnQixFQUN6QyxFQUFhLFVBQVcsQ0FBZ0IsQ0FDMUMsQ0FBQyxFQXVCSyxHQUFtQixFQUFLLENBQzVCLEVBQWEsQ0FqQmIsUUFDQSxnQkFFQSxNQUNBLFNBQ0EsZ0JBQ0EsV0FDQSxVQUNBLFVBQ0EsUUFDQSxZQUNBLFVBQ0EsWUFDQSxpQkFDQSwrQkFHc0MsQ0FBQyxFQUN2QyxFQUFhLE1BQU8sQ0FBVSxFQUM5QixFQUFhLFVBQVcsQ0FBVSxFQUNsQyxFQUNFLFlBQ0EsRUFBUyxHQUFjLEVBQVUsSUFBSSxFQUFnQixDQUFDLENBQ3hELEVBQ0EsRUFBYSxnQkFBaUIsQ0FBVSxFQUN4QyxFQUNFLFFBQ0EsR0FDRyxFQUFPLElBQ04sRUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE9BQVMsRUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQzNDLEVBQU0sY0FBYyxDQUFLLENBQzdCLENBQ0YsRUFDQSxFQUFhLFdBQVksQ0FBVSxDQUNyQyxDQUFDLEVBQ0ssR0FBd0IsRUFBYSxDQUFDLGNBQWUsTUFBTyxNQUFNLENBQUMsRUFFbkUsR0FBcUIsRUFBSyxDQUU5QixFQUFVLEdBQ1JBLEVBQWUsRUFBUSxDQUNyQixHQUFHLE9BQU8sS0FBSyxDQUFNLENBQUMsQ0FDbkIsT0FBUSxHQUFRLElBQVEsV0FBVyxDQUFDLENBQ3BDLEtBQUssRUFDUixXQUNGLENBQUMsQ0FDSCxFQUVBLEVBQ0UsWUFFQSxFQUFTLEdBQ1AsRUFBVSxJQUNSLEVBQUssQ0FFSCxFQUVBLEVBQWEsVUFBVyxDQUFVLENBQ3BDLENBQUMsQ0FDSCxDQUNGLENBQ0YsQ0FDRixDQUFDLEVBRUssR0FBWSxFQUFhLENBQUMsT0FBUSxNQUFPLE1BQU0sQ0FBQyxFQUloRCxHQUFtQixFQUFLLENBQzVCLEVBQWEsQ0FGaUIsVUFBVyxlQUFnQixRQUFTLFFBRWhDLENBQUMsRUFDbkMsRUFDRSxlQUNBLEVBQVMsR0FBUyxFQUFLLElBQUksRUFBYSxDQUFDLFNBQVUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNqRSxFQUNBLEVBQ0UsTUFDQSxFQUFVLEdBQ1JBLEVBQ0UsT0FBTyxZQUNMLE9BQU8sUUFBUSxDQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBSyxLQUFXLENBQ3hDLEVBQ0EsRUFBYSxDQUFDLFdBQVksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFLLENBQzdDLENBQUMsQ0FDSCxDQUNGLENBQ0YsQ0FDRixFQUNBLEVBQ0UsVUFDQSxFQUFLLENBQUMsRUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFHLEVBQWEsWUFBYSxDQUFVLENBQUMsQ0FBQyxDQUMzRSxDQUNGLENBQUMsRUFDSyxHQUFhLEVBQVUsR0FDM0JBLEVBQ0UsT0FBTyxZQUNMLE9BQU8sUUFBUSxDQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBTSxLQUFZLENBQzdDLEVBQ0EsR0FBaUIsQ0FBTSxDQUN6QixDQUFDLENBQ0gsQ0FDRixDQUNGLEVBQ00sR0FBaUIsRUFDckIsaUJBQ0EsRUFBYSxDQUFDLE9BQVEsVUFBVyxRQUFRLENBQUMsQ0FDNUMsRUFrQk0sR0FBaUIsRUFBSyxDQUMxQixFQUFhLENBaEJiLHNCQUNBLHlCQUNBLHdCQUNBLDRCQUNBLDRCQUNBLHlCQUNBLGVBQ0EsY0FDQSxrQkFDQSx5QkFDQSxZQUNBLHNCQUNBLG1CQUlvQyxFQUFHLEVBQUksRUFDM0MsRUFBYSxZQUFhLEVBQWtCLENBQzlDLENBQUMsRUFHSyxHQUFvQixJQUFJLElBQUksQ0FDaEMsVUFDQSxPQUNBLFVBQ0EsVUFDQSxVQUNBLGFBQ0EsUUFDQSxPQUNBLE9BQ0EsWUFDQSxTQUNGLENBQUMsRUFFSyxJQUFvQixFQUFZLElBRWxDLE9BQU8sT0FBTyxFQUFhLGlCQUFpQixHQUM1QyxPQUFPLE9BQU8sRUFBWSxnQkFBaUIsQ0FBVSxFQUluRCxHQUNKLDBGQUVJLEdBQXNCLEdBQzFCLEVBQVEsU0FBUyxHQUFHLEdBQUssR0FBVyxLQUFLLENBQU8sRUFFNUMsR0FBdUIsR0FFekIsQ0FBQyxHQUFpQixjQUFlLENBQVcsR0FDNUMsQ0FBQyxHQUFpQixlQUFnQixDQUFXLEVBRXRDLEdBRU8sQ0FBQyxVQUFXLGVBQWUsQ0FBQyxDQUFDLFFBQVMsR0FDcEQsRUFBWSxHQUFTLE9BQU8sT0FBTyxFQUFZLEVBQU0sRUFBSSxDQUFDLENBRS9DLENBQUMsQ0FBQyxLQUFNLEdBQVcsR0FBbUIsQ0FBTSxDQUFDLEVBRzVELFNBQVMsR0FBZ0IsRUFBTSxFQUFTLEdBQUksQ0FDMUMsSUFBTSxFQUFXLElBQUksSUFDckIsSUFBSyxJQUFNLEtBQU8sRUFBTSxDQUV0QixJQUFNLEdBRE8sRUFBUyxFQUFJLE1BQU0sRUFBTyxPQUFTLENBQUMsRUFBSSxFQUFBLENBQ3BDLFFBQVEsR0FBRyxFQUM1QixHQUFJLEVBQU0sRUFBRyxDQUNYLElBQU0sRUFBTyxFQUFJLE1BQU0sR0FBSSxFQUFTLEVBQU8sT0FBUyxFQUFJLEdBQUssQ0FBRyxFQUMzRCxFQUFTLElBQUksQ0FBSSxHQUFHLEVBQVMsSUFBSSxFQUFNLENBQUMsQ0FBQyxFQUM5QyxFQUFTLElBQUksQ0FBSSxDQUFDLENBQUMsS0FBSyxDQUFHLENBQzdCLE1BQ08sRUFBUyxJQUFJLENBQUcsR0FBRyxFQUFTLElBQUksRUFBSyxDQUFDLENBQUMsRUFDNUMsRUFBUyxJQUFJLENBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBRyxDQUU5QixDQUNBLE9BQU8sTUFBTSxLQUFLLEVBQVMsS0FBSyxDQUFDLENBQUMsQ0FDL0IsS0FBSyxDQUFDLENBQ04sUUFBUyxHQUFhLENBQ3JCLElBQU0sRUFBVyxFQUFTLElBQUksQ0FBUSxFQUN0QyxHQUNFLEVBQVMsT0FBUyxHQUNsQixFQUFTLEtBQU0sR0FBTSxJQUFNLEdBQVksRUFBRSxXQUFXLEVBQVcsR0FBRyxDQUFDLEVBQ25FLENBQ0EsSUFBTSxFQUFTLEVBQ1osT0FBUSxHQUFNLElBQU0sR0FBWSxDQUFDLEVBQUUsV0FBVyxFQUFXLEdBQUcsQ0FBQyxDQUFDLENBQzlELEtBQUssRUFDRixFQUFTLEVBQVMsT0FBUSxHQUFNLEVBQUUsV0FBVyxFQUFXLEdBQUcsQ0FBQyxFQUNsRSxNQUFPLENBQUMsR0FBRyxFQUFRLEdBQUcsR0FBZ0IsRUFBUSxDQUFRLENBQUMsQ0FDekQsQ0FDQSxPQUFPLEVBQVMsS0FBSyxDQUN2QixDQUFDLENBQ0wsQ0FFQSxNQUFNLEdBQWMsR0FBVSxFQUFTLElBQWdCLENBQ3JELElBQUksRUFBUSxPQUFPLEtBQUssQ0FBTyxFQUN6QixFQUFhLElBQUksSUFpQnZCLE1BZkEsR0FBUSxFQUFNLElBQUssR0FBUyxDQUMxQixJQUFNLEVBQVUsRUFBSyxRQUFRLGdCQUFpQixFQUFFLEVBS2hELE9BSkksR0FBa0IsSUFBSSxDQUFPLEdBQUssRUFBTSxTQUFTLENBQU8sR0FDMUQsRUFBVyxJQUFJLENBQU8sRUFDZixHQUVGLENBQ1QsQ0FBQyxFQUVJLEdBQW9CLENBQVcsSUFDbEMsRUFBUSxHQUFnQixDQUFLLEdBRS9CLEVBQVEsRUFBTSxRQUFTLEdBQ3JCLEVBQVcsSUFBSSxDQUFHLEVBQUksQ0FBQyxNQUFNLElBQU8sRUFBSyxPQUFPLEdBQUssRUFBSSxDQUFDLENBQUcsQ0FDL0QsRUFDT0EsRUFBZSxFQUFTLENBQUssQ0FDdEMsQ0FBQyxFQUtLLEdBQWtCLEdBQWUsQ0FDckMsR0FBTSxDQUFFLG9CQUFvQixDQUFDLEVBQUcsaUJBQWlCLENBQUMsR0FBTSxPQUFPLFFBQzdELEVBQ0MsR0FDSyxJQUFjLFVBQ1Qsb0JBR0YsZ0JBRVgsRUFFQSxNQUFPLENBQUMsR0FBRyxFQUFnQixHQUFHLENBQWlCLENBQ2pELEVBRU0sR0FBYyxFQUFVLEdBQVksQ0FDeEMsR0FBTSxDQUFFLFFBQVEsQ0FBQyxFQUFHLGFBQWEsQ0FBQyxHQUFNLE9BQU8sUUFDN0MsT0FBTyxLQUFLLENBQU8sRUFDbEIsR0FBUyxFQUFJLFdBQVcsR0FBRyxFQUFJLFFBQVUsWUFDNUMsRUFFQSxPQUFPLE9BQU8sWUFDWixDQUFDLEdBQUcsRUFBTyxHQUFHLEdBQWUsQ0FBVSxDQUFDLENBQUMsQ0FBQyxJQUFLLEdBQVEsQ0FDckQsRUFDQSxHQUFZLEVBQVEsRUFBSSxDQUMxQixDQUFDLENBQ0gsQ0FDRixDQUFDLEVBV0ssR0FBUyxDQUNiLENBQUUsSUFBSyxTQUFVLEVBQ2pCLENBQUUsSUFBSyxNQUFPLEVBQ0QsQ0FBRSxJQUFLLGFBQWMsRUFDbEMsQ0FBRSxJQUFLLFNBQVUsRUFDTixDQUFFLElBQUssZUFBZ0IsRUFDbEMsQ0FBRSxJQUFLLFNBQVUsRUFDakIsQ0FBRSxJQUFLLGFBQWMsRUFDUixDQUFFLElBQUssYUFBYyxLQUFNLENBQUssRUFDN0MsQ0FBRSxJQUFLLFdBQVksS0FBTSxDQUFLLEVBQzlCLENBQUUsSUFBSyxVQUFXLEVBQ2xCLENBQUUsSUFBSyxPQUFRLEtBQU0sRUFBYSxDQUFDLE1BQU8sT0FBTyxDQUFDLENBQUUsRUFDcEQsQ0FBRSxJQUFLLGFBQWMsS0FBTSxFQUFjLEVBQ3pDLENBQUUsSUFBSyxVQUFXLEtBQU0sRUFBYyxFQUN0QyxDQUFFLElBQUssVUFBVyxLQUFNLEVBQWMsRUFDekIsQ0FBRSxJQUFLLEtBQU0sRUFDMUIsQ0FBRSxJQUFLLFNBQVUsS0FBTSxFQUFpQixFQUN4QyxDQUNFLElBQUssY0FDTCxLQUFNLEVBQVMsR0FBZ0IsRUFBWSxJQUFJLEVBQWdCLENBQUMsQ0FDbEUsRUFDQSxDQUNFLElBQUssZUFDTCxLQUFNLEVBQVMsR0FBaUIsRUFBYSxJQUFJLEVBQWdCLENBQUMsQ0FDcEUsRUFDYSxDQUFFLElBQUssV0FBWSxFQUNoQyxDQUFFLElBQUssYUFBYyxFQUNyQixDQUFFLElBQUssTUFBTyxFQUNkLENBQUUsSUFBSyxTQUFVLEVBQ2pCLENBQUUsSUFBSyxVQUFXLEtBQU0sRUFBWSxFQUNwQyxDQUFFLElBQUssTUFBTyxFQUNkLENBQUUsSUFBSyxRQUFTLEVBQ2hCLENBQUUsSUFBSyxVQUFXLEVBQ2xCLENBQUUsSUFBSyxVQUFXLEVBQ2xCLENBQUUsSUFBSyxPQUFRLEVBQ2YsQ0FBRSxJQUFLLFFBQVMsRUFDaEIsQ0FBRSxJQUFLLFFBQVMsRUFDaEIsQ0FBRSxJQUFLLGFBQWMsRUFDckIsQ0FBRSxJQUFLLFNBQVUsRUFDakIsQ0FBRSxJQUFLLGNBQWUsRUFDdEIsQ0FBRSxJQUFLLE9BQVEsRUFDZixDQUFFLElBQUssZUFBZ0IsRUFDdkIsQ0FBRSxJQUFLLFNBQVUsRUFDakIsQ0FBRSxJQUFLLE9BQVEsRUFDZixDQUFFLElBQUssU0FBVSxFQUNqQixDQUFFLElBQUssY0FBZSxFQUN0QixDQUFFLElBQUssUUFBUyxFQUNoQixDQUFFLElBQUssTUFBTyxLQUFNLENBQVcsRUFDL0IsQ0FBRSxJQUFLLEtBQU0sRUFDYixDQUFFLElBQUssY0FBZSxLQUFNLEVBQWdCLEVBQzVDLENBQUUsSUFBSyxRQUFTLEtBQU0sQ0FBSyxFQUMzQixDQUFFLElBQUssYUFBYyxLQUFNLEVBQWUsRUFFMUMsQ0FDRSxJQUFLLFNBQ0wsS0FBTSxFQUFhLENBQ2pCLGNBQ0EsY0FDQSxjQUNBLGVBQ0EsTUFDRixDQUFDLENBQ0gsRUFDQSxDQUFFLElBQUssVUFBVyxLQUFNLEVBQVksRUFDcEMsQ0FBRSxJQUFLLGdCQUFpQixLQUFNLEVBQVksRUFDMUMsQ0FBRSxJQUFLLFNBQVUsS0FBTSxFQUFXLEVBQ3JCLENBQUUsSUFBSyxNQUFPLEVBQ2QsQ0FBRSxJQUFLLGNBQWUsS0FBTSxDQUFXLEVBQ3ZDLENBQUUsSUFBSyxtQkFBb0IsS0FBTSxDQUFLLEVBQ25ELENBQUUsSUFBSyxRQUFTLEtBQU0sRUFBYSxRQUFTLEVBQVksQ0FBRSxFQUMxRCxDQUFFLElBQUssbUJBQW9CLEtBQU0sRUFBYSxFQUM5QyxDQUFFLElBQUssWUFBYSxFQUNwQixDQUFFLElBQUssYUFBYyxLQUFNLENBQVcsRUFDdEMsQ0FBRSxJQUFLLGFBQWMsRUFDckIsQ0FBRSxJQUFLLGFBQWMsRUFDckIsQ0FBRSxJQUFLLFNBQVUsS0FBTSxDQUFXLEVBQ2xDLENBQUUsSUFBSyxnQkFBaUIsS0FBTSxDQUFXLEVBQ3pDLENBQUUsSUFBSyxhQUFjLEtBQU0sQ0FBVyxFQUN0QyxDQUFFLElBQUssUUFBUyxLQUFNLENBQVcsRUFDakMsQ0FBRSxJQUFLLGNBQWUsRUFDdEIsQ0FBRSxJQUFLLEtBQU0sS0FBTSxDQUFXLEVBQzlCLENBQUUsSUFBSyxXQUFZLEtBQU0sRUFBbUIsRUFDNUMsQ0FBRSxJQUFLLGVBQWdCLEtBQU0sRUFBaUIsRUFDOUMsQ0FBRSxJQUFLLGNBQWUsRUFDdEIsQ0FBRSxJQUFLLGlCQUFrQixLQUFNLENBQVcsRUFDMUMsQ0FBRSxJQUFLLDJCQUE0QixLQUFNLENBQVcsRUFDcEQsQ0FBRSxJQUFLLHFCQUFzQixLQUFNLENBQVcsRUFDOUMsQ0FBRSxJQUFLLFVBQVcsS0FBTSxDQUFXLEVBQ25DLENBQUUsSUFBSyxlQUFnQixLQUFNLENBQVcsRUFDeEMsQ0FBRSxJQUFLLFdBQVksRUFDbkIsQ0FBRSxJQUFLLE1BQU8sS0FBTSxDQUFXLEVBQy9CLENBQUUsSUFBSyxPQUFRLEtBQU0sQ0FBVyxFQUNoQyxDQUFFLElBQUssYUFBYyxLQUFNLENBQVcsRUFDdEMsQ0FBRSxJQUFLLGFBQWMsS0FBTSxDQUFXLEVBQ3RDLENBQUUsSUFBSyxRQUFTLEtBQU0sQ0FBVyxFQUNqQyxDQUFFLElBQUssTUFBTyxLQUFNLENBQVcsRUFDL0IsQ0FBRSxJQUFLLEtBQU0sS0FBTSxDQUFXLEVBQzlCLENBQUUsSUFBSyxNQUFPLEtBQU0sQ0FBVyxFQUMvQixDQUFFLElBQUssUUFBUyxLQUFNLEVBQWEsSUFBQSxHQUFXLEVBQUksQ0FBRSxFQUNwRCxDQUFFLElBQUssY0FBZSxLQUFNLENBQVcsRUFDdkMsQ0FBRSxJQUFLLFlBQWEsS0FBTSxDQUFpQixFQUMzQyxDQUFFLElBQUssZUFBZ0IsS0FBTSxDQUFpQixFQUM5QyxDQUFFLElBQUssa0JBQW1CLEtBQU0sQ0FBaUIsRUFDakQsQ0FBRSxJQUFLLG1CQUFvQixLQUFNLEVBQWEsR0FBbUIsRUFBSSxDQUFFLEVBQ3ZFLENBQUUsSUFBSyxtQkFBb0IsS0FBTSxDQUFpQixFQUVsRCxDQUFFLElBQUssdUJBQXdCLEtBQU0sRUFBYSxJQUFBLEdBQVcsRUFBSSxDQUFFLEVBQ25FLENBQUUsSUFBSyx1QkFBd0IsS0FBTSxDQUFpQixFQUN0RCxDQUFFLElBQUssc0JBQXVCLEtBQU0sQ0FBaUIsRUFDckQsQ0FBRSxJQUFLLHFCQUFzQixLQUFNLENBQWlCLEVBQ3ZDLENBQUUsSUFBSyxnQkFBaUIsS0FBTSxDQUFpQixFQUMvQyxDQUFFLElBQUssd0JBQXlCLEtBQU0sQ0FBaUIsRUFDcEUsQ0FBRSxJQUFLLE1BQU8sRUFDZCxDQUFFLElBQUssZ0JBQWlCLEVBQ3hCLENBQUUsSUFBSyxVQUFXLEtBQU0sQ0FBVyxFQUNuQyxDQUFFLElBQUssZUFBZ0IsS0FBTSxDQUFXLEVBQ3hDLENBQUUsSUFBSyxhQUFjLEtBQU0sRUFBZSxFQUMxQyxDQUFFLElBQUssUUFBUyxLQUFNLEVBQVUsRUFDaEMsQ0FBRSxJQUFLLGNBQWUsRUFDdEIsQ0FBRSxJQUFLLElBQUssRUFDWixDQUFFLElBQUssS0FBTSxFQUNiLENBQUUsSUFBSyxlQUFnQixLQUFNLENBQVcsRUFDeEMsQ0FBRSxJQUFLLGdCQUFpQixLQUFNLENBQVcsRUFDNUIsQ0FBRSxJQUFLLE1BQU8sRUFDZCxDQUNYLElBQUssU0FDTCxLQUFNLEVBQVMsR0FBVSxFQUFNLElBQUksRUFBcUIsQ0FBQyxDQUMzRCxFQUNhLENBQUUsSUFBSyxnQkFBaUIsS0FBTSxDQUFXLEVBQ3pDLENBQUUsSUFBSyxTQUFVLEVBQ2pCLENBQUUsSUFBSyxVQUFXLEVBQy9CLENBQUUsSUFBSyxPQUFRLEtBQU0sRUFBZSxDQUN0QyxFQUVNLEdBQW1CLEdBQU8sS0FBSyxDQUFFLFNBQVUsQ0FBRyxFQUM5QyxHQUFhLEVBQ2pCLEdBQ0csS0FBSyxDQUFFLE1BQUssVUFBWSxFQUFPLEVBQWEsRUFBSyxDQUFJLEVBQUksSUFBQSxFQUFVLENBQUMsQ0FDcEUsT0FBTyxPQUFPLENBQ25CLEVBRUEsU0FBUyxHQUFlLEVBQU0sRUFBTSxDQUNsQyxHQUFJLE9BQU8sR0FBUyxTQUFVLENBQzVCLEdBQU0sQ0FBRSxTQUFRLFFBQVMsR0FBYSxDQUFJLEVBQ3BDLEVBQWdCLEVBQUssTUFBTSxFQUFFLElBQU07RUFBTztFQUFPLEdBQ2pELEVBQVVFLEdBQWMsQ0FBSSxFQUNsQyxFQUFPLEtBQUssTUFBTSxDQUFJLEVBRXRCLElBQUksRUFDRixLQUFLLFVBQVUsRUFBSyxDQUFJLEVBQUcsS0FBTSxJQUFTLE1BQVEsSUFBTyxDQUFNLEVBQy9ELEVBSUYsT0FISSxJQUFZO0lBQ2QsRUFBUyxFQUFPLFFBQVEsTUFBTyxDQUFPLEdBRWpDLENBQ1QsQ0FFQSxPQUFPLEVBQUssQ0FBSSxDQUNsQixDQUVBLFNBQVMsR0FBZ0IsRUFBUyxFQUFVLENBQUMsRUFBRyxDQUM5QyxPQUFPLEdBQ0wsRUFDQSxFQUFVLEdBQVMsQ0FDakIsSUFBSSxFQUFZLEVBQVEsV0FBYSxHQUVyQyxHQUFJLE1BQU0sUUFBUSxDQUFTLEVBQUcsQ0FDNUIsSUFBTSxFQUFPLE9BQU8sS0FBSyxDQUFJLEVBQ3ZCLENBQUUsY0FBYyxDQUFDLEVBQUcsYUFBYSxDQUFDLEdBQU0sT0FBTyxRQUNuRCxFQUNDLEdBQVMsRUFBSSxLQUFPLElBQU0sY0FBZ0IsWUFDN0MsRUFDQSxFQUFZLENBQ1YsR0FBRyxFQUNILEdBQUcsR0FDSCxHQUFHLEVBQVcsS0FBSyxFQUNuQixHQUFHLEVBQVksS0FBSyxDQUN0QixDQUNGLENBRUEsT0FBTyxHQUFXRixFQUFlLEVBQU0sQ0FBUyxFQUFHLENBQUksQ0FDekQsQ0FBQyxDQUNILENBQ0YsQ0NwbkJBLGVBQXNCLEdBQXNDLEVBQTBDLENBQ3BHLE9BQU8sRUFBTywwQkFBMEIsd0NBQXlDLFNBQVksQ0FDM0YsTUFBTSxRQUFRLElBQ1osRUFBZ0IsSUFBSSxLQUFPLElBQW1CLENBQzVDLElBQU0sRUFBa0IsRUFBSyxLQUFLLEVBQWdCLGNBQWMsRUFDaEUsR0FBSSxDQUFDLEVBQUcsV0FBVyxDQUFlLEVBQUcsT0FFckMsSUFBTSxFQUFpQixFQUFLLEtBQUssRUFBZ0IsTUFBTSxFQUN2RCxJQUFLLElBQU0sSUFBa0IsQ0FBQyxZQUFhLE9BQU8sRUFBRyxDQUNuRCxJQUFNLEVBQWlCLEVBQUssS0FBSyxFQUFnQixDQUFjLEVBQy9ELEdBQUksQ0FDRixNQUFNLEdBQWtCLEVBQWdCLENBQWMsRUFDdEQsSUFBTSxFQUFjLEtBQUssTUFBTSxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQWlCLE1BQU0sQ0FBQyxFQUc5RSxFQUFrQixHQUNoQixFQUFVLEVBQVksU0FBVyxDQUFDLEVBQ3hDLElBQUssR0FBTSxDQUFDLEVBQVksS0FBVyxPQUFPLFFBQVEsQ0FBTyxFQUFHLENBQzFELElBQU0sRUFBWSxFQUFPLFdBQVcsRUFBZ0IsTUFBTSxFQUN0RCxJQUFXLElBQ2IsRUFBUSxHQUFjLEVBQ3RCLEVBQWtCLEdBRXRCLENBRUEsR0FEQSxFQUFZLFFBQVUsRUFDbEIsQ0FBQyxFQUFpQixPQUV0QixNQUFNLEVBQU8sYUFBYSxFQUFpQixLQUFLLFVBQVUsR0FBZ0IsQ0FBVyxFQUFHLElBQUEsR0FBVyxDQUFDLENBQUMsQ0FDdkcsTUFBUSxDQUVSLENBQ0YsQ0FDRixDQUFDLENBQ0gsQ0FDRixDQUFDLENBQ0gsQ0FFQSxlQUFlLEdBQWtCLEVBQXdCLEVBQXVDLENBQzlGLEdBQUksQ0FBQyxFQUFHLFdBQVcsQ0FBYyxFQUFHLENBQ2xDLE1BQU0sRUFBRyxTQUFTLE9BQU8sRUFBZ0IsQ0FBYyxFQUN2RCxNQUNGLENBRUEsSUFBTSxFQUFVLE1BQU0sRUFBRyxTQUFTLFFBQVEsRUFBZ0IsQ0FBRSxjQUFlLEVBQUssQ0FBQyxFQUNqRixNQUFNLFFBQVEsSUFDWixFQUFRLElBQUksS0FBTyxJQUFXLENBQzVCLElBQU0sRUFBVSxFQUFLLEtBQUssRUFBZ0IsRUFBTyxJQUFJLEVBQy9DLEVBQVUsRUFBSyxLQUFLLEVBQWdCLEVBQU8sSUFBSSxFQUMvQyxFQUFjLEVBQUcsV0FBVyxDQUFPLEVBQUksTUFBTSxFQUFHLFNBQVMsS0FBSyxDQUFPLEVBQUksSUFBQSxHQUMvRSxHQUFJLEVBQU8sWUFBWSxHQUFLLEdBQWEsWUFBWSxFQUFHLENBQ3RELE1BQU0sR0FBa0IsRUFBUyxDQUFPLEVBQ3hDLE1BQ0YsQ0FDQSxNQUFNLEVBQUcsU0FBUyxPQUFPLEVBQVMsQ0FBTyxDQUMzQyxDQUFDLENBQ0gsRUFDQSxNQUFNLEVBQUcsU0FBUyxHQUFHLEVBQWdCLENBQUUsVUFBVyxFQUFLLENBQUMsQ0FDMUQsQ0N4REEsZUFBc0IsR0FDcEIsRUFDQSxFQUNlLENBQ2YsT0FBTyxFQUFPLDBCQUEwQixxQkFBc0IsU0FBWSxDQUN4RSxJQUFNLEVBQWlCLEVBQUssUUFBUSxFQUFPLFFBQVMsUUFBUSxFQUN0RCxFQUNKLEVBQU8sUUFBVSxFQUFPLDJCQUE2QixJQUFBLEdBQVksRUFBSyxRQUFRLEVBQU8sUUFBUyxNQUFPLE9BQU8sRUFFeEcsRUFBVSxNQUFNLE1BQXdCRyxFQUFHLFFBQVEsRUFBZ0IsQ0FBRSxjQUFlLEVBQUssQ0FBQyxDQUFDLEVBQzVGLEtBRUwsSUFBSyxJQUFNLEtBQVUsRUFBUyxDQUM1QixJQUFNLEVBQVUsRUFBTyxLQUFLLE1BQU0sRUFBRyxFQUFFLEVBQ2pDLEVBQThCLEVBQU8sS0FBSyxTQUFTLE9BQU8sRUFDNUQsRUFBYyxFQUE4QixFQUFVLEVBQU8sS0FDN0QsRUFBWSxTQUFTLElBQUksSUFDM0IsRUFBYyxJQUFJLEVBQVksUUFBUSxLQUFNLEdBQUcsS0FFakQsSUFBTSxFQUFhLEVBQXlCLEtBQ3pDLEdBQ0MsRUFBTyxhQUFhLGVBQWUsSUFBZ0IsRUFBTyxhQUFhLGtCQUFrQixFQUM3RixFQUVJLEVBQU8sT0FBTyxHQUFLLEVBQ2pCLEdBRUYsTUFBTUEsRUFBRyxNQUFNLEVBQUssS0FBSyxFQUFnQixDQUFPLEVBQUcsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUN0RSxNQUFNLEVBQVksUUFDaEJBLEVBQUcsT0FBTyxFQUFLLEtBQUssRUFBZ0IsRUFBTyxJQUFJLEVBQUcsRUFBSyxLQUFLLEVBQWdCLEVBQVMsWUFBWSxDQUFDLENBQ3BHLEdBQ1MsSUFFVCxNQUFNQSxFQUFHLE1BQU0sRUFBZ0IsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUNsRCxNQUFNLEVBQVksUUFDaEJBLEVBQUcsT0FBTyxFQUFLLEtBQUssRUFBZ0IsRUFBTyxJQUFJLEVBQUcsRUFBSyxLQUFLLEVBQWdCLEVBQU8sSUFBSSxDQUFDLENBQzFGLEdBRU8sRUFBTyxZQUFZLEdBQUssR0FBa0IsQ0FBQyxJQUVwRCxNQUFNQSxFQUFHLE1BQU0sRUFBZ0IsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUNsRCxNQUFNLEVBQVksUUFDaEIsTUFDRUEsRUFBRyxPQUNELEVBQUssS0FBSyxFQUFnQixFQUFPLEtBQU0sWUFBWSxFQUNuRCxFQUFLLEtBQUssRUFBZ0IsR0FBRyxFQUFPLEtBQUssTUFBTSxDQUNqRCxDQUNGLENBQ0YsRUFFSixDQUNGLENBQUMsQ0FDSCxDQzNEQSxTQUFnQixFQUFrQixFQUF1QixFQUF1QixDQUM5RSxPQUFPLENBQ1QsQ0FFQSxTQUFnQixHQUFhLEVBQW1CLEVBQW1CLEVBQTZDLENBQzlHLElBQU0sRUFBYyxDQUFDLEdBQUcsQ0FBTSxFQUU5QixJQUFLLEdBQU0sQ0FBQyxFQUFPLEtBQVMsRUFBTyxRQUFRLEVBQ3JDLEVBQVksS0FBVyxJQUFBLEdBQ3pCLEVBQVksR0FBUyxHQUE4QixFQUFNLENBQU8sRUFDdkQsR0FBa0IsRUFBTyxHQUFRLENBQU8sR0FBSyxHQUFrQixFQUFNLENBQU8sRUFDckYsRUFBWSxHQUFTLEVBQU0sRUFBTyxHQUFRLEVBQU0sQ0FBTyxFQUM3QyxFQUFPLFNBQVMsQ0FBSSxHQUM5QixFQUFZLEtBQUssQ0FBSSxFQUd6QixPQUFPLENBQ1QsQ0FFQSxTQUFTLEdBQThCLEVBQWdCLEVBQTJDLENBQ2hHLE9BQU8sR0FBa0IsRUFBTyxDQUFPLEVBQUksRUFBUSw4QkFBOEIsRUFBTyxDQUFPLEVBQUksQ0FDckcsQ0FFQSxTQUFTLEdBQWtCLEVBQWdCLEVBQW1ELENBQzVGLE1BQU8sQ0FBQyxDQUFDLEdBQVMsT0FBTyxHQUFVLFVBQVksRUFBUSxrQkFBa0IsQ0FBSyxDQUNoRixDQzNCQSxTQUFnQixHQUNkLEVBQ0EsRUFDTSxDQUNOLElBQU0sRUFBUSxFQUFJLEdBSWxCLE9BRkEsT0FBTyxFQUFJLEdBQ1gsRUFBK0IsR0FBTyxFQUMvQixDQUNULENBRUEsU0FBZ0IsRUFBNEMsRUFBVyxDQUNyRSxJQUFNLEVBQWUsT0FBTyxRQUFRLENBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFPLENBQUMsS0FBVSxFQUFLLGNBQWMsQ0FBSSxDQUFDLEVBQzlGLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxFQUd6QixPQUFPLEVBQUksR0FDWCxFQUFpQyxHQUFPLEVBR3BDLEdBQVMsT0FBTyxHQUFVLFVBQVksQ0FBQyxNQUFNLFFBQVEsQ0FBSyxHQUM1RCxFQUFTLENBQWdDLEVBRzdDLE9BQU8sQ0FDVCxDQ2lEQSxNQUFNLEdBQXNDLENBQzFDLEtBQU0sYUFDTixHQUFJLENBQ0YsYUFBYyxLQUNkLEtBQU0sQ0FDSixTQUFVLENBQUMsTUFBTSxDQUNuQixDQUNGLEVBQ0EsWUFBYSxDQUNYLFNBQVUsTUFDWixFQUNBLFlBQWEsQ0FDWCxNQUFPLGlDQUNQLHFCQUFzQixFQUN4QixFQUNBLEtBQU0sQ0FDSixRQUFTLENBQUUsVUFBVyxlQUFnQixDQUN4QyxDQUNGLEVBRU0sR0FBWSxDQUNoQixLQUFNLENBQ0osS0FBTSxPQUNOLEdBQUksQ0FDRixhQUFjLEtBQ2QsS0FBTSxDQUNKLFNBQVUsQ0FBQyxPQUFRLE1BQU0sQ0FDM0IsQ0FDRixFQUVBLFlBQWEsQ0FDWCxNQUFPLDJDQUNQLHFCQUFzQixFQUN4QixFQUNBLFlBQWEsQ0FFWCxTQUFVLFFBRVYsZ0JBQWlCLE1BQ25CLEVBQ0EsS0FBTSxDQUNKLEtBQU0sQ0FDSixLQUFNLGdFQUNSLENBQ0YsQ0FDRixFQUNBLFlBQWEsQ0FDWCxLQUFNLFlBQ04sR0FBSSxDQUNGLGFBQWMsS0FDZCxLQUFNLENBQ0osU0FBVSxDQUFDLE9BQVEsTUFBTSxDQUMzQixDQUNGLEVBQ0EsWUFBYSxDQUNYLE1BQU8sMkNBQ1AscUJBQXNCLEVBQ3hCLEVBQ0EsS0FBTSxDQUNKLFlBQWEsQ0FDWCxLQUFNLHFFQUNSLENBQ0YsQ0FDRixFQUNBLFFBQVMsQ0FDUCxLQUFNLFVBQ04sR0FBSSxDQUNGLEtBQU0sQ0FDSixTQUFVLENBQUMsQ0FDYixDQUNGLEVBQ0EsWUFBYSxDQUNYLE1BQU8seUJBQ1AscUJBQXNCLEVBQ3hCLEVBQ0EsWUFBYSxDQUVYLFdBQVksUUFFWixTQUFVLE9BQ1osRUFDQSxLQUFNLENBQ0osUUFBUyxDQUNQLEtBQU0sbUVBQ1IsQ0FDRixDQUNGLEVBQ0EsY0FBZSxDQUNiLEtBQU0sZ0JBQ04sR0FBSSxDQUNGLG9CQUFxQixDQUNuQixNQUFPLENBQUMsU0FBVSxTQUFVLGFBQWEsQ0FDM0MsQ0FDRixFQUNBLEtBQU0sQ0FDSixjQUFlLENBQ2IsS0FBTSx1RUFDUixDQUNGLENBQ0YsRUFDQSxLQUFNLENBQ0osS0FBTSxPQUNOLEdBQUksQ0FBQyxFQUNMLFlBQWEsQ0FFWCxTQUFVLE9BQ1osRUFDQSxLQUFNLENBQ0osS0FBTSxDQUFFLEtBQU0sZ0VBQWlFLENBQ2pGLENBQ0YsRUFDQSxnQkFBaUIsQ0FDZixLQUFNLG9CQUNOLEdBQUksQ0FDRixhQUFjLENBQ1osTUFBTyxDQUFDLFFBQVEsQ0FDbEIsQ0FDRixFQUNBLEtBQU0sQ0FDSixnQkFBaUIsQ0FDZixLQUFNLHlFQUNSLENBQ0YsQ0FDRixDQUNGLEVBSUEsZUFBc0IsR0FBa0IsRUFBMEMsQ0FDaEYsT0FBTyxFQUFPLDBCQUEwQixtQkFBb0IsU0FBWSxDQUN0RSxHQUFJLEdBQXdCLEVBQVcsVUFBVSxFQUUvQyxPQUdGLElBQU0sRUFBZ0IsRUFBSyxRQUFRLEVBQVcsUUFBUyxVQUFXLFdBQVcsRUFDN0UsTUFBTSxFQUFHLFNBQVMsTUFBTSxFQUFlLENBQUUsVUFBVyxFQUFLLENBQUMsRUFHMUQsSUFBTSxFQUFrQixFQUFLLFFBQVEsRUFBVyxRQUFTLFVBQVcsY0FBYyxFQUNsRixNQUFNLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFpQixDQUFFLE1BQU8sR0FBTSxVQUFXLEVBQUssQ0FBQyxDQUFDLEVBRTdGLElBQU0sRUFBVSxNQUFNLEVBQUcsU0FBUyxRQUFRLEVBQWUsQ0FBRSxjQUFlLEVBQUssQ0FBQyxFQUNoRixJQUFLLElBQU0sS0FBUyxFQUNkLENBQUMsRUFBTSxPQUFPLEdBQUssQ0FBQyxHQUFnQyxFQUFNLElBQUksR0FDbEUsTUFBTSxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxLQUFLLEVBQWUsRUFBTSxJQUFJLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBRW5HLElBQU0sRUFBYyxJQUFJLElBQUksQ0FDMUIsV0FDQSxjQUNBLGtCQUNBLG9CQUNBLEdBQUcsRUFDQSxPQUNFLEdBQVcsRUFBTyxPQUFPLEdBQUssRUFBTyxLQUFLLFNBQVMsTUFBTSxHQUFLLENBQUMsR0FBZ0MsRUFBTyxJQUFJLENBQzdHLENBQUMsQ0FDQSxJQUFLLEdBQVcsRUFBTyxJQUFJLENBQ2hDLENBQUMsRUFDRyxFQUFXLFVBQVUsaUJBQ3ZCLEVBQVksSUFBSSxhQUFhLEVBRTNCLEVBQVcsa0JBQWtCLE9BQVMsR0FDeEMsRUFBWSxJQUFJLGVBQWUsRUFFNUIsRUFBVyxlQUdkLEVBQVksT0FBTyxhQUFhLEVBQ2hDLE1BQU0sRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssS0FBSyxFQUFlLGFBQWEsRUFBRyxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsR0FHdEcsSUFBSyxJQUFNLEtBQVksRUFBYSxDQUVsQyxJQUFNLEVBQU8sRUFBSyxTQUFTLEVBQVUsTUFBTSxFQUMzQyxNQUFNLEVBQVksUUFBVSxHQUFrQixFQUFZLEVBQWUsQ0FBSSxDQUFDLENBQ2hGLENBQ0YsQ0FBQyxDQUNILENBRUEsU0FBZ0IsR0FBd0IsRUFBOEIsQ0FDcEUsT0FBTyxHQUFZLFNBQVMscUJBQXFCLEdBQUssRUFDeEQsQ0FFQSxTQUFTLEdBQWdDLEVBQTJCLENBQ2xFLE1BQU8sMkJBQTJCLEtBQUssQ0FBUSxDQUNqRCxDQUVBLGVBQWUsR0FBa0IsRUFBdUIsRUFBdUIsRUFBZ0MsQ0FDN0csSUFBTSxFQUFXLEVBQUssS0FBSyxFQUFlLEdBQUcsRUFBSyxLQUFLLEVBQ2pELEVBQWlDLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBZSx1QkFBdUIsQ0FBQyxFQUV0RyxHQUFJLElBQVMsVUFBVyxDQUN0QixNQUFNLEdBQVUsR0FBd0IsQ0FBTSxFQUFHLENBQVEsRUFDekQsTUFDRixDQUdBLEdBQUksSUFBUyxhQUFlLEVBQU8sa0JBQWtCLFNBQVcsRUFBRyxPQUVuRSxJQUFJLEVBQWMsZ0JBQWdCLEtBQVEsR0FBWSxHQUFVLEdBQWtDLENBQUMsQ0FBQyxFQUVwRyxHQUFJLENBQ0YsSUFBTSxFQUFhLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLEVBQ3hELEVBQWMsRUFBSyxLQUFLLENBQVUsRUFDeEMsRUFBYyxFQUFNLElBQUksQ0FBQyxFQUFhLEVBQWEsQ0FBVyxFQUFHLENBQUUsV0FBWSxFQUFhLENBQUMsQ0FDL0YsTUFBUSxDQUVSLENBR0EsR0FBSSxFQUFFLFNBQVUsR0FBYyxPQUU5QixHQUFJLElBQVMsWUFBYSxDQUV4QixJQUFLLEdBQU0sQ0FBQyxFQUFTLEtBQVEsT0FBTyxRQUFRLEVBQVksSUFBSSxFQUNyRCxFQUFJLE1BQU0sU0FBUyxzQkFBc0IsR0FDNUMsT0FBTyxFQUFZLEtBQUssR0FHNUIsR0FBYSxFQUFhLE1BQU0sQ0FDbEMsQ0FFSSxFQUFLLFdBQVcsUUFBUSxJQUMxQixFQUFjLENBQ1osR0FBRyxFQUNILFlBQWEsQ0FDWCxNQUFPLHlCQUNQLHFCQUFzQixFQUN4QixDQUNGLEVBRUEsR0FBYSxFQUFhLE1BQU0sRUFDNUIsRUFBWSxJQUFJLE9BQ2xCLEVBQVksR0FBRyxLQUFLLGdCQUFrQixDQUNwQyxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVMsYUFBYyxHQUFJLEVBQVksR0FBRyxLQUFLLGlCQUFtQixDQUFDLENBQUUsQ0FBQyxDQUNwRixJQUlBLElBQVMsV0FBYSxFQUFZLEtBQUssU0FBVyxJQUNwRCxFQUFZLGNBQWdCLENBQUMsRUFDN0IsRUFBWSxZQUFZLFFBQVUsUUFDbEMsRUFBWSxLQUFLLFFBQVEsT0FBUyxDQUFDLEVBQ25DLEVBQVksS0FBSyxRQUFRLEtBQUssd0JBQTBCLHlCQUcxRCxJQUFJLEVBQXFCLEdBQ3pCLElBQUssSUFBTSxLQUFPLE9BQU8sT0FBTyxFQUFZLElBQUksRUFFekMsRUFBSSxNQUFNLFNBQVMsc0JBQXNCLElBRTlDLEdBQWEsRUFBUSxFQUFLLENBQUksRUFDOUIsRUFBcUIsSUFFbEIsS0FFTCxRQUFRLEVBQVIsQ0FDRSxJQUFLLFVBQ0gsR0FBSSxFQUFZLElBQUksU0FDbEIsT0FBTyxFQUFZLEdBQUcsVUFDakIsR0FBSSxFQUFZLElBQUksTUFBUSxFQUFPLFFBQVEsU0FBUyxPQUFTLEVBQ2xFLEVBQVksR0FBRyxLQUFLLFNBQVcsRUFBTyxRQUFRLGFBQ3pDLENBRUwsTUFBTSxFQUFHLFNBQVMsR0FBRyxFQUFLLEtBQUssRUFBZSxhQUFhLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxFQUM3RSxNQUNGLENBQ0ksRUFBTyxjQUNULEVBQVksY0FBZ0IsQ0FBQyxFQUM3QixFQUFZLFlBQVksWUFBYyxTQUV0QyxPQUFPLEVBQVksY0FBYyxZQUVuQyxNQUVGLElBQUssT0FDTCxJQUFLLFlBR0gsT0FBTyxFQUFZLGFBQWEsUUFDNUIsRUFBWSxJQUFJLGNBQ2xCLE9BQU8sRUFBWSxHQUFHLGFBQWEsZ0JBRWpDLEVBQVksSUFBSSxPQUNsQixPQUFPLEVBQVksR0FBRyxLQUFLLGdCQUMzQixFQUFZLEdBQUcsS0FBSyxTQUFXLEVBQVksR0FBRyxLQUFLLFNBQVMsT0FBUSxHQUFXLElBQVcsYUFBYSxHQUV6RyxLQUdKLENBR0EsR0FGQSxNQUFNLEdBQVUsRUFBYSxDQUFRLEVBRWpDLElBQVMsT0FBUSxDQUVuQixHQURBLE1BQU0sRUFBRyxTQUFTLEdBQUcsRUFBSyxLQUFLLEVBQWUsZUFBZSxFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsRUFDM0UsQ0FBQyxFQUFZLEtBQUssTUFBTSxLQUFNLE9BR2xDLEVBQVksS0FBSyxjQUFnQixFQUFZLEtBQUssS0FDbEQsSUFBTSxFQUFTLEVBQVksS0FBSyxLQUFLLEtBQUsseUJBQzFDLEdBQUksT0FBTyxHQUFXLFNBQVUsT0FFaEMsRUFBWSxLQUFLLEtBQUssS0FBSyx5QkFBMkIsV0FBVyxJQUNqRSxFQUFZLEtBQU8sZ0JBQ25CLEVBQVksR0FBSyxDQUFFLGtCQUFtQixJQUFLLEVBQzNDLE9BQU8sRUFBWSxLQUFLLEtBQ3hCLE1BQU0sR0FBVSxFQUFhLEVBQUssS0FBSyxFQUFlLGdCQUFnQixDQUFDLENBQ3pFLENBakJBLENBa0JGLENBRUEsU0FBUyxHQUFhLEVBQXVCLEVBQVUsRUFBdUIsQ0FtQjVFLEdBbEJBLEVBQUksT0FBUyxDQUFDLEVBQ2QsRUFBSSxVQUFZLENBQUMsR0FFYixJQUFTLFFBQVUsSUFBUyxhQUM5QixFQUFJLFFBQVEsU0FBVywrQkFHckIsRUFBSSxRQUFRLGlCQUNkLEVBQUksUUFBUSw2QkFBK0IsOENBQzNDLE9BQU8sRUFBSSxRQUFRLGlCQUdsQixFQUFJLFFBQVEsc0JBQXdCLElBQVMsV0FBYSxFQUFLLFdBQVcsUUFBUSxJQUNsRixFQUFJLEtBQUssWUFBYyxFQUFLLFdBQVcsUUFBUSxLQUVoRCxFQUFJLFFBQVEsb0JBQXNCLGtEQUdoQyxJQUFTLE9BQVEsQ0FDbkIsSUFBTSxFQUFTLEVBQUksS0FBSyx5QkFDcEIsT0FBTyxHQUFXLFdBQ3BCLEVBQUksS0FBSyx5QkFBMkIsRUFBTyxRQUFRLFFBQVMsRUFBRSxFQUVsRSxDQUVBLEdBQUksSUFBUyxZQUFhLENBQ3hCLEdBQU0sQ0FBQyxHQUFlLEVBQU8sa0JBQ3pCLEdBQWUsSUFBZ0IsSUFDakMsRUFBSSxLQUFLLGtCQUFvQixFQUU3QixPQUFPLEVBQUksS0FBSyxpQkFFcEIsQ0FrQ0EsR0FoQ0ksRUFBTyxZQUFZLFdBQVcscUJBQXFCLEVBQ3JELEVBQUksS0FBTyxFQUFJLE1BQU0sUUFBUSxrQkFBbUIsY0FBYyxFQUNyRCxFQUFPLFlBQVksV0FBVyx3QkFBd0IsSUFDL0QsRUFBSSxLQUFPLEVBQUksTUFBTSxRQUFRLGVBQWdCLGlCQUFpQixHQUk1RCxFQUFJLEtBQUssZUFBaUIsUUFDNUIsT0FBTyxFQUFJLEtBQUssYUFJZCxFQUFLLFdBQVcsUUFBUSxHQUFLLEVBQUksUUFBUSxlQUFpQixPQUFPLEVBQUksS0FBSyxnQkFBbUIsV0FDL0YsRUFBSSxLQUFLLGVBQWlCLEVBQUksS0FBSyxlQUFlLFFBQVEsWUFBYSxFQUFFLEdBRXZFLEVBQU8sdUJBQXlCLENBQUMsRUFBSSxLQUFLLFVBQVksRUFBSyxXQUFXLE1BQU0sSUFDOUUsRUFBSSxLQUFLLFNBQVcsU0FHbEIsSUFBUyxXQUFhLEVBQUssV0FBVyxNQUFNLEdBQUssRUFBSyxXQUFXLFFBQVEsRUFDdkUsRUFBTyxlQUNULEVBQUksS0FBSyxxQkFBdUIsSUFHbEMsT0FBTyxFQUFJLEtBQUsscUJBR2QsT0FBTyxLQUFLLEVBQUksSUFBSSxDQUFDLENBQUMsT0FBUyxFQUNqQyxFQUFTLEVBQUksSUFBSSxFQUVqQixPQUFPLEVBQUksS0FFVCxPQUFPLEtBQUssRUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFTLEVBQUcsQ0FFdkMsSUFBTSxFQUFhLEVBQVMsRUFBSSxPQUFPLEVBQ3ZDLE9BQU8sRUFBSSxRQUNYLEVBQUksUUFBVSxDQUNoQixNQUNFLE9BQU8sRUFBSSxPQUVmLENBRUEsU0FBUyxHQUF3QixFQUFpQyxDQUNoRSxJQUFNLEVBQWlCLEVBQU8sTUFBUSxNQUFRLE9BQ3hDLEVBQWdCLENBQ3BCLENBQUUsS0FBTSxxQkFBc0IsRUFDOUIsQ0FBRSxLQUFNLHdCQUF5QixLQUFNLENBQUUsZUFBZ0IsR0FBTSxlQUFnQixPQUFRLENBQUUsRUFDekYsR0FBSSxFQUFPLE1BQVEsQ0FBQyxDQUFFLEtBQU0sdUJBQXdCLEtBQU0sQ0FBRSxjQUFlLFFBQVMsQ0FBRSxDQUFDLEVBQUksQ0FBQyxFQUM1RixDQUFFLElBQUssR0FBRyxFQUFlLFNBQVUsRUFDbkMsQ0FBRSxJQUFLLEdBQUcsRUFBZSxhQUFjLENBQ3pDLEVBQ0ksRUFBTyxhQUFhLFNBQVMsT0FDL0IsRUFBTSxLQUFLLENBQUUsSUFBSyxHQUFHLEVBQWUsV0FBWSxDQUFDLEVBRW5ELEVBQU0sS0FBSyxDQUFFLEtBQU0sNERBQTZELENBQUMsRUFFakYsSUFBTSxFQUFrQixnQkFBZ0IsRUFBeUIsRUFDM0QsRUFBYSxFQUFnQixLQUFLLFNBQVcsQ0FBRSxVQUFXLGVBQWdCLEVBRWhGLE1BREEsR0FBZ0IsS0FBSyxRQUFVLENBQUUsR0FBRyxFQUFZLE9BQU0sRUFDL0MsQ0FDVCxDQUVBLGVBQWUsR0FBVSxFQUF1QixFQUFpQyxDQUMvRSxJQUFNLEVBQVcsR0FDZixFQUFLLEtBQUssRUFBYSxDQUFFLFVBQVcsR0FBSSxhQUFjLEdBQU0sT0FBUSxDQUFFLFNBQVUsT0FBUSxDQUFFLENBQUMsQ0FDN0YsRUFDQSxNQUFNLEVBQUcsU0FBUyxVQUFVLEVBQVUsQ0FBUSxDQUNoRCxDQUVBLFNBQVMsR0FBcUIsRUFBc0IsQ0FFbEQsT0FBTyxFQUFLLFdBQVcsWUFBYSxFQUFFLENBQ3hDLENDL2RBLGVBQXNCLEdBQVMsRUFBNkMsQ0FDMUUsT0FBTyxFQUFPLDBCQUEwQixXQUFZLFNBQVksQ0FDOUQsR0FBSSxHQUF3QixFQUFjLFVBQVUsRUFBRyxPQUV2RCxJQUFNLEVBQVUsRUFBYyxRQUN4QixFQUFXLE1BQU0sRUFBRyxLQUFLLFVBQVcsQ0FBRSxJQUFLLEdBQU0sSUFBSyxFQUFTLE9BQVEsQ0FBVyxDQUFDLEVBQ3JGLEVBQVEsV0FDVixRQUFRLEtBQUssU0FBUyxFQUFTLE9BQU8scUJBQXFCLEdBQVMsRUFFdEUsSUFBSyxJQUFNLEtBQVUsRUFBVSxDQUM3QixJQUFNLEVBQVcsRUFBSyxLQUFLLEVBQVMsQ0FBTSxFQUMxQyxFQUFpQixJQUFJLFNBQVksQ0FDL0IsSUFBTSxFQUFVLE1BQU0sRUFBTyxzQkFBc0IsQ0FBUSxFQUMzRCxHQUFJLElBQVksSUFBQSxHQUFXLE9BQzNCLElBQUksRUFBYSxHQUFlLENBQU8sRUFDdkMsRUFBYSxHQUFrQixFQUFZLEVBQWUsS0FBSyxFQUMzRCxJQUFZLEdBQ2QsTUFBTSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBRWxELENBQUMsQ0FDSCxDQUVBLElBQU0sRUFBVSxNQUFNLEVBQUcsS0FDdkIsQ0FDRSw4REFDQSx5RUFDRixFQUNBLENBQUUsSUFBSyxHQUFNLElBQUssRUFBUyxPQUFRLENBQVcsQ0FDaEQsRUFDSSxFQUFRLFdBQ1YsUUFBUSxLQUFLLFNBQVMsRUFBUSxPQUFPLHVCQUF1QixHQUFTLEVBRXZFLElBQUssSUFBTSxLQUFVLEVBQVMsQ0FDNUIsSUFBTSxFQUFXLEVBQUssS0FBSyxFQUFTLENBQU0sRUFDMUMsRUFBaUIsSUFBSSxTQUFZLENBQy9CLElBQU0sRUFBYSxNQUFNLEVBQU8sc0JBQXNCLENBQVEsRUFDOUQsR0FBSSxJQUFlLElBQUEsR0FBVyxPQUM5QixJQUFJLEVBQWEsR0FBZSxDQUFVLEVBQzFDLEVBQWEsR0FBa0IsRUFBWSxFQUFlLElBQUksRUFFMUQsSUFBZSxHQUNqQixNQUFNLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FFbEQsQ0FBQyxDQUNILENBRUEsSUFBTSxFQUFpQixNQUFNLEVBQUcsS0FBSyx1Q0FBd0MsQ0FDM0UsSUFBSyxHQUNMLElBQUssRUFDTCxPQUFRLENBQ1YsQ0FBQyxFQUNHLEVBQVEsV0FDVixRQUFRLEtBQUssU0FBUyxFQUFlLE9BQU8sdUJBQXVCLEdBQVMsRUFFOUUsSUFBSyxJQUFNLEtBQVEsRUFBZ0IsQ0FDakMsSUFBTSxFQUFXLEVBQUssS0FBSyxFQUFTLENBQUksRUFDeEMsRUFBaUIsSUFBSSxTQUFZLENBQy9CLElBQU0sRUFBYSxNQUFNLEVBQU8sc0JBQXNCLENBQVEsRUFDOUQsR0FBSSxJQUFlLElBQUEsR0FBVyxPQUM5QixJQUFJLEVBQWEsR0FBZSxDQUFVLEVBQzFDLEVBQWEsR0FBa0IsRUFBWSxFQUFlLE1BQU0sRUFFNUQsSUFBZSxHQUNqQixNQUFNLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FFbEQsQ0FBQyxDQUNILENBRUEsTUFBTSxFQUFZLFdBQVcsQ0FDL0IsQ0FBQyxDQUNILENBRUEsU0FBZ0IsR0FBZSxFQUF5QixDQUN0RCxPQUFPLEVBQ0osV0FBVyxvQkFBcUIsS0FBSyxDQUFDLENBQ3RDLFdBQVcsa0JBQW1CLE1BQU0sQ0FBQyxDQUNyQyxXQUFXLGdCQUFpQixNQUFNLENBQ3ZDLENBRUEsU0FBUyxHQUFlLEVBQXlCLENBQy9DLE9BQU8sRUFDSixXQUFXLG9CQUFzQixHQUFZLEdBQWUsQ0FBTyxDQUFDLENBQUMsQ0FDckUsV0FBVyx5QkFBMEIsV0FBVyxDQUFDLENBQ2pELFdBQVcsdUJBQXdCLFlBQVksQ0FBQyxDQUNoRCxXQUFXLHVCQUF3QixZQUFZLENBQ3BELENBRUEsU0FBUyxHQUFrQixFQUFvQixFQUE4QixFQUF5QyxDQUNwSCxJQUFLLEdBQU0sQ0FBQyxFQUFRLEtBQVUsT0FBTyxRQUFRLEVBQWMsVUFBVSxPQUFPLEtBQU8sQ0FBQyxDQUFDLEVBQ25GLEVBQWEsRUFBVyxXQUFXLEVBQVEsQ0FBSyxFQUVsRCxJQUFLLEdBQU0sQ0FBQyxFQUFRLEtBQVUsT0FBTyxRQUFRLEVBQWMsVUFBVSxRQUFRLElBQWEsQ0FBQyxDQUFDLEVBQzFGLEVBQWEsRUFBVyxXQUFXLEVBQVEsQ0FBSyxFQUVsRCxPQUFPLENBQ1QsQ0NsR0EsTUFBTSxHQUF5QiwyQkFFekIsR0FBbUIsQ0FDdkIsd0VBQ0EsVUFDQSxZQUNBLHlCQUNBLGdCQUNBLG1CQUNBLGdCQUNBLGtCQUNBLGNBQ0EsZUFDQSxnQkFDQSxrQkFDQSxpQkFDRixFQUVBLGVBQXNCLEdBQWUsRUFBMkIsRUFBaUIsQ0FBQyxDQUFVLEVBQWtCLENBQzVHLEdBQUksRUFBVyxhQUFlLGVBQWlCLEVBQVcsV0FBYSxTQUFVLE9BRWpGLElBQU0sRUFBYyxJQUFJLEVBR2xCLEVBQXVDLENBQUMsRUFDOUMsSUFBSyxJQUFNLEtBQVUsRUFBZ0IsQ0FDbkMsSUFBTSxFQUFVLEdBQXdCLENBQU0sRUFDOUMsR0FBSSxDQUFDLEVBQVMsU0FFZCxJQUFNLEVBQVksTUFBTSxFQUFHLEdBQWtCLENBQzNDLFNBQVUsR0FDVixJQUFLLEVBQU8sUUFDWixJQUFLLEdBQ0wsT0FBUSxDQUFDLGFBQWMsR0FBSSxFQUFPLE9BQVMsQ0FBQyxhQUFhLEVBQUksQ0FBQyxFQUFJLEdBQUcsQ0FBVSxFQUMvRSxVQUFXLEVBQ2IsQ0FBQyxFQUNELElBQUssSUFBTSxLQUFZLEVBQ3JCLEVBQW9CLEtBQUssRUFBWSxRQUFVLEdBQXlCLEVBQVUsQ0FBTyxDQUFDLENBQUMsQ0FFL0YsQ0FDQSxNQUFNLFFBQVEsSUFBSSxDQUFtQixFQUNyQyxNQUFNLEVBQVksV0FBVyxDQUMvQixDQUVBLFNBQVMsR0FBd0IsRUFBMEQsQ0FDekYsR0FBSSxFQUFPLFVBQVUsT0FBUSxNQUFPLFlBQ3BDLEdBQUksRUFBTyxVQUFVLFFBQVMsTUFBTyxPQUN2QyxDQUVBLGVBQWUsR0FBeUIsRUFBa0IsRUFBK0MsQ0FDdkcsSUFBTSxFQUFVLE1BQU0sR0FBYSxDQUFRLEVBQzNDLEdBQUksQ0FBQyxFQUFTLE9BSWQsSUFBTSxFQUFhLEVBQVEsV0FBVyxHQUF3QixDQUFPLEVBQ2pFLElBQWUsR0FFbkIsTUFBTSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQ2hELENBRUEsZUFBZSxHQUFhLEVBQStDLENBRXpFLElBQUksTUFEZ0JDLEVBQUcsS0FBSyxDQUFRLEVBQUEsQ0FDMUIsS0FBTyxRQUFrQixPQUVuQyxJQUFNLEVBQVMsTUFBTUEsRUFBRyxTQUFTLENBQVEsRUFDckMsTUFBTyxTQUFTLENBQUMsRUFFckIsT0FBTyxFQUFPLFNBQVMsTUFBTSxDQUMvQixDQ3RFQSxlQUFzQixHQUEwQixFQUEyQixFQUE0QyxDQUNySCxPQUFPLEVBQU8sMEJBQTBCLDRCQUE2QixTQUFZLENBQy9FLEdBQUksQ0FBQyxFQUFXLE9BQVEsT0FHeEIsSUFBTSxFQUFrQixFQUFLLFFBQVEsRUFBVyxRQUFTLGlCQUFpQixFQUNwRSxFQUFlLE1BQU0sRUFBTyxzQkFBc0IsQ0FBZSxFQUV2RSxJQUFLLEdBQU0sQ0FBQyxFQUFVLElBQWEsQ0FDakMsQ0FBQyxZQUFhLFdBQVcsRUFDekIsQ0FBQyxZQUFhLGFBQWEsRUFDM0IsQ0FBQyxZQUFhLFlBQVksQ0FDNUIsRUFBWSxDQUNWLElBQU0sRUFBVSxHQUF5QixFQUFZLEVBQVksRUFBVSxDQUFZLEVBQ2pGLEVBQVcsRUFBSyxRQUFRLEVBQVcsUUFBUyxDQUFRLEVBQzFELE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQU8sQ0FBQyxDQUNwRSxDQUVBLElBQU0sRUFBa0IsRUFBSyxRQUFRLEVBQVcsUUFBUywyQkFBMkIsRUFDOUUsRUFBcUIsR0FBZ0MsRUFBWSxFQUFZLENBQVksRUFDL0YsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQWlCLENBQWtCLENBQUMsQ0FDdEYsQ0FBQyxDQUNILENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNRLENBR1IsTUFBTzs7OztTQURNLEdBQXlCLEVBQVEsRUFBWSxTQUFVLENBQ3JDLEdBQ2pDLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ1EsQ0FDUixJQUFNLEVBQWlCLEdBQXlCLENBQVUsRUFDcEQsRUFBYyxFQUFXLGFBQWEsWUFFdEMsRUFBcUIsRUFBVyxVQUNsQyx3RkFDQSxHQUNFLEVBQWtDLEdBQXdCLENBQVUsRUFDdEUsYUFBYSxFQUFlLDBFQUM1QixHQUNFLEVBQXNCLEVBQVcsa0JBQ25DLDhGQUE4RixFQUFTLDhCQUN2RyxHQUNFLEVBQWM7OztZQUdWLEVBQVcsYUFBYSxNQUFRLFVBQVUsSUFBSSxFQUFjLG9CQUFvQixJQUFnQixHQUFHO3FCQUMxRixFQUFlOzs7Ozs7Ozs7Ozs7O2dDQWFKLEVBQWUsc0VBQXNFLEVBQWU7O3lFQUUzRCxFQUFvQjs7O2lHQUdJLElBQXFCLEVBQWdDOztFQUVwSixHQUF5QixDQUFVLEVBQUU7RUFFbEMsV0FBVyxZQUFhO0VBQU0sQ0FBQyxDQUMvQixXQUFXLFVBQVc7O0NBQU0sQ0FBQyxDQUM3QixLQUFLLEVBRUYsRUFBZ0IsR0FBYyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUcsRUFNekQsT0FBTyxHQUx3QixFQUMzQixFQUNFOztFQUFTLEVBQWEsS0FBSyxFQUMzQjtFQUFPLEVBQ1QsR0FFTixDQUVBLFNBQWdCLEdBQXlCLEVBQXFDLENBRTVFLE1BQU87Ozs7Ozs7Ozs7OztFQWFQLEVBQVcsS0FBTSxHQUFNLEVBQUUsVUFBVSxTQUFTLEVBQ3hDLDRQQUNBLEdBQ0w7O0VBR0MsRUFBVyxLQUFNLEdBQU0sRUFBRSxVQUFVLE9BQVMsRUFBRSxVQUFVLElBQUksRUFDeEQsZ05BR0EsR0FDTDtFQUVDLEVBQVcsS0FBTSxHQUFNLEVBQUUsVUFBVSxJQUFJLEVBQ25DLGtKQUlBLEdBQ0w7RUFFSSxXQUFXLFlBQWE7RUFBTSxDQUFDLENBQy9CLFdBQVcsVUFBVzs7Q0FBTSxDQUFDLENBQzdCLEtBQUssQ0FDVixDQUVBLFNBQVMsR0FBd0IsRUFBbUMsQ0FDbEUsT0FBTyxFQUFRLEtBQU0sR0FBVyxFQUFPLFVBQVUsY0FBYyxDQUNqRSxDQzNIQSxNQUFhLEdBQThCLE1BTXJDLEdBQXNCLENBQzFCLFlBQ0EsZUFDQSxhQUNBLGdCQUNBLGNBQ0EsWUFDQSxjQUNBLGdCQUNBLGlCQUNBLGNBQ0EsZ0JBQ0EsY0FDQSxZQUNBLGVBQ0EsYUFDQSxnQkFDQSxjQUNBLFlBQ0EsY0FDQSxXQUNGLEVBQ00sR0FBc0IsQ0FDMUIsbUJBQ0EsZ0JBQ0EsZUFDQSxhQUNBLGNBQ0Esc0JBQ0EsdUJBQ0Esa0JBQ0EsbUJBQ0Esa0JBQ0Esb0JBQ0EscUJBQ0Esa0JBQ0EsZ0JBQ0EsaUJBQ0Esb0JBQ0EsbUJBQ0Esa0JBQ0EsZ0JBQ0YsRUFDTSxHQUFvQixDQUFDLGVBQWdCLGFBQWMsY0FBZSxZQUFhLGNBQWUsV0FBVyxFQUN6RyxHQUFzQixDQUMxQixtQkFDQSxnQkFDQSxlQUNBLGFBQ0Esc0JBQ0Esa0JBQ0EsbUJBQ0EsZ0JBQ0EsaUJBQ0EsbUJBQ0Esa0JBQ0EsZ0JBQ0YsRUFDTSxHQUFtQixDQUN2QixtQkFDQSxnQkFDQSxlQUNBLGFBQ0EsY0FDQSxzQkFDQSxrQkFDQSxtQkFDQSxnQkFDQSxpQkFDQSxjQUNBLFdBQ0EsbUJBQ0Esa0JBQ0EsZ0JBQ0YsRUFFYSxHQUErQixDQUUxQywwQkFDQSx5Q0FDQSw0QkFDQSw2QkFDQSw2QkFDQSw0QkFDQSw0QkFDQSw2QkFDQSwrQkFDQSwrQkFDQSwwQkFDQSxxQ0FDQSwrQkFDQSwrQkFDQSxnQ0FDQSxrQkFDQSxvQkFDQSxnQkFDQSxXQUNBLGNBQ0EsbUJBS0EsYUFDQSxHQUFHLEdBQW9CLElBQUssR0FBYSwwQkFBMEIsR0FBVSxFQUc3RSxhQUNBLFlBQ0EsUUFDQSxHQUFHLEdBQW9CLElBQUssR0FBYSxrQkFBa0IsR0FBVSxFQUNyRSxTQUNBLEdBQUcsR0FBb0IsSUFBSyxHQUFhLG1CQUFtQixHQUFVLEVBQ3RFLGtCQUNBLEdBQUcsR0FBa0IsSUFBSyxHQUFhLG9CQUFvQixHQUFVLEVBQ3JFLFlBQ0EsYUFDQSx1QkFDQSxHQUFHLEdBQW9CLElBQUssR0FBYSx3QkFBd0IsR0FBVSxFQUMzRSxHQUFHLEdBQWlCLElBQUssR0FBYSxhQUFhLEdBQVUsRUFDN0Qsc0JBQ0EsT0FDQSxRQUNBLFdBQ0YsRUFFQSxlQUFzQixHQUFtQixFQUFzQyxDQUM3RSxPQUFPLEVBQU8sMEJBQTBCLHFCQUFzQixTQUFZLENBQ3hFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGFBQWEsRUFDckQsRUFBa0IsRUFBRyxXQUFXLENBQVEsRUFBSSxFQUFHLGFBQWEsRUFBVSxNQUFNLEVBQUksSUFBQSxHQUNoRixFQUFVQyxHQUFXLENBQWUsRUFDMUMsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBTyxDQUFDLENBQ3BFLENBQUMsQ0FDSCxDQUVBLE1BQU1BLEdBQWMsR0FBZ0QsQ0FDbEUsSUFBTSxFQUFhLEdBQWdCLENBQWUsRUFDbEQsTUFBTzs7O0VBR1AsR0FBbUIsQ0FBVSxFQUFFOztVQUV2QixHQUFZLFNBQVMsUUFBVSxHQUFRLFFBQVUsT0FBTzs7c0JBRTVDLEdBQTRCOztFQUVoRCxHQUE2QixJQUFLLEdBQWdCLFFBQVEsRUFBWSxHQUFHLENBQUMsQ0FBQyxLQUFLO0NBQUksRUFBRTs7Q0FHeEYsRUFFQSxTQUFTLEdBQWdCLEVBQXFELENBQ3ZFLEtBR0wsR0FBSSxDQUNGLE9BQU8sRUFBTSxDQUFPLENBQ3RCLE1BQVEsQ0FDTixNQUNGLENBQ0YsQ0FFQSxTQUFTLEdBQW1CLEVBQTRDLENBQ3RFLE9BQU8sT0FBTyxHQUFZLEtBQUssS0FBUSxVQUFZLGdCQUFnQixFQUFXLElBQUksSUFBSSxJQUFNLEVBQzlGLENDM0xBLE1BQU0sRUFBb0IsOEJBQ3BCLEdBQXlCLHdDQUN6QixHQUFZLHNCQUVaLEdBQXlCLEdBQUcsRUFBa0I7OztFQUdsRCxHQUFVO0VBRU4sR0FBeUI7RUFDN0IsRUFBa0I7RUFHUCxFQUFpQixDQUM1QixhQUNBLGtDQUNBLDBCQUNBLDBCQUNBLE1BQU0sK0JBQStCLEVBQStDLENBQ2xGLEdBQUksQ0FDRixJQUFJLEVBQVUsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sRUFDbkQsRUFBa0IsR0FBZ0MsQ0FBTyxFQUkvRCxPQUhJLEVBQWtCLElBQ3BCLEVBQVUsRUFBUSxNQUFNLEVBQUcsRUFBa0IsQ0FBQyxHQUc5QyxFQUNHLFdBQVcsR0FBd0IsRUFBRSxDQUFDLENBQ3RDLFdBQVcsNEJBQTZCLEVBQUUsQ0FBQyxDQUMzQyxXQUFXLHVCQUF3Qjs7Q0FBTSxDQUFDLENBQzFDLEtBQUssRUFBSTtDQUVoQixNQUFRLENBRVIsQ0FDRixFQUNBLG1CQUFtQixFQUF5QixDQUMxQyxJQUFNLEVBQVEsRUFBUSxRQUFRLEtBQUssZUFBZSxFQU1sRCxPQUxJLElBQVUsR0FLUCxHQUpFLEVBQ0osTUFBTSxFQUFHLEVBQVEsUUFBUTtFQUFNLENBQUssRUFBSSxDQUFDLENBQUMsQ0FDMUMsV0FBVyxHQUF3QixHQUFHLEVBQWtCLFVBQVUsQ0FHekUsRUFDQSxtQkFBbUIsRUFBeUIsQ0FDMUMsSUFBTSxFQUFrQixHQUFnQyxDQUFPLEVBSS9ELE9BSEksRUFBa0IsRUFDYixFQUFRLE1BQU0sRUFBa0IsQ0FBQyxFQUVuQyxFQUNULEVBQ0EsTUFBTSwwQkFBMEIsRUFBb0MsQ0FDbEUsR0FBSSxDQUVGLE9BQU8sTUFEZSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sRUFBQSxDQUM1QyxTQUFTO2FBQWdCLENBQzFDLE1BQVEsQ0FDTixNQUFPLEVBQ1QsQ0FDRixDQUNGLEVBRUEsU0FBUyxHQUFnQyxFQUF5QixDQUNoRSxJQUFNLEVBQVEsRUFBUSxRQUFRLENBQWlCLEVBQ3pDLEVBQVksRUFBUSxZQUFZLENBQWlCLEVBQ3ZELE9BQU8sRUFBWSxFQUFRLEVBQVksRUFDekMsQ0N4REEsTUFBTUMsR0FBZ0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFxQ3BCLENBdkNtQyxjQXVDVCxDQUFDLENBQzFCLElBQ0UsR0FBWSxvQkFBb0IsRUFBUTttQkFDMUIsRUFBUSxJQUN6QixDQUFDLENBQ0EsS0FBSztDQUFJLEVBQUU7Ozs7OztFQVFkLGVBQXNCLEdBQXFCLEVBQXNDLENBQy9FLE9BQU8sRUFBTywwQkFBMEIsdUJBQXdCLFNBQVksQ0FDMUUsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsZUFBZSxFQUM3RCxHQUFJLEVBQU8sc0JBQXVCLENBQ2hDLElBQU0sRUFBVyxNQUFNLEVBQU8sc0JBQXNCLENBQVEsR0FBTSxHQUM1RCxFQUFrQixFQUFlLG1CQUFtQixDQUFPLEVBQzNELEVBQWtCLEVBQWUsbUJBQW1CLENBQU8sRUFFM0QsRUFBYSxFQUFrQkEsR0FBZ0IsRUFDckQsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLE1BQ0UsTUFBTSxFQUFHLFNBQVMsR0FBRyxFQUFVLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FFbEQsQ0FBQyxDQUNILENDNUVBLE1BQWEsRUFBYSxDQUN4QixvQkFBcUIsQ0FDbkIsTUFDQSxNQUNBLEtBQ0EsTUFDQSxNQUNBLE1BQ0EsS0FDQSxNQUNBLE9BQ0EsUUFDQSxRQUNBLE1BQ0EsT0FDQSxNQUNBLE9BQ0EsS0FDQSxPQUNBLEtBQ0EsTUFDQSxNQUNBLE9BQ0EsTUFDQSxJQUNGLENBQUMsQ0FBQyxTQUFTLEVBQ1gsb0JBQXFCLENBQUMsS0FBTSxTQUFVLE9BQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUM3RCxhQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUM5QixPQUFRLENBQUMsUUFBUyxNQUFPLE1BQU8sS0FBTSxNQUFPLE1BQU8sTUFBTyxTQUFVLEtBQU0sTUFBTyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQ2xHLE1BQU8sdUlBNEJQLENBQUMsQ0FBQyxTQUFTLEVBQ1gsYUFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FDbEMsRUNuRE1DLEdBQWE7Ozs7Ozs7O0VBUWpCLEdBQW1CLEVBQVcsbUJBQW1CLEVBQUU7Ozs7RUFJbkQsR0FBbUIsRUFBVyxtQkFBbUIsRUFBRTs7OztFQUluRCxHQUFtQixFQUFXLFlBQVksRUFBRTs7Ozs7O0VBUTlDLGVBQXNCLEdBQXFCLEVBQXNDLENBQy9FLE9BQU8sRUFBTywwQkFBMEIsdUJBQXdCLFNBQVksQ0FDMUUsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsZUFBZSxFQUM3RCxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVUEsRUFBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBbUIsRUFBOEIsQ0FDeEQsT0FBTyxFQUFXLE9BQVMsRUFBSSxPQUFPLEVBQVcsS0FBSyxHQUFHLEVBQUUsSUFBTSxNQUFNLEVBQVcsR0FBRyxFQUN2RixDQzFCQSxNQUFNLEdBQWdCLENBQ3BCLFNBQVUsR0FDVixZQUFhLENBQ1gsUUFBUyxHQUNULDJCQUE0QixTQUM1QixvQkFBcUIsR0FDckIsb0JBQXFCLENBQ25CLEtBQU0sR0FDTixRQUFTLEdBQ1QsWUFBYSxFQUNmLENBQ0YsRUFDQSxnQkFBaUIsQ0FBQyxrQkFBa0IsQ0FDdEMsRUFFQSxlQUFzQixHQUFxQixFQUF1QixFQUE0QyxDQUM1RyxPQUFPLEVBQU8sMEJBQTBCLHVCQUF3QixTQUFZLENBQzFFLEdBQUksQ0FBQyxFQUFPLE9BQVEsT0FFcEIsSUFBTSxFQUFVLEVBQUssUUFBUSxFQUFPLFFBQVMsU0FBUyxFQUNoRCxFQUFpQixFQUFLLFFBQVEsRUFBUyxZQUFZLEVBQ25ELEVBQXFCLEVBQUssUUFBUSxFQUFTLGVBQWUsRUFDMUQsRUFBa0IsRUFBSyxRQUFRLEVBQU8sUUFBUyxpQkFBaUIsRUFFbEUsRUFBb0IsZ0JBQWdCLEVBQWEsRUFDckQsR0FBSSxDQUNGLElBQU0sRUFBYSxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQWdCLE1BQU0sRUFDOUQsRUFBWSxFQUFLLEtBQUssQ0FBVSxFQUN0QyxFQUFZLEVBQU0sSUFBSSxDQUFDLEVBQVcsRUFBVyxDQUFTLEVBQUcsQ0FBRSxXQUFZLENBQWUsQ0FBQyxDQUN6RixNQUFRLENBRVIsQ0FFQSxJQUFNLEVBQWMsRUFBSyxLQUFLLEVBQVcsQ0FDdkMsVUFBVyxHQUNYLGFBQWMsR0FDZCxPQUFRLENBQ04sU0FBVSxPQUNaLENBQ0YsQ0FBQyxFQUVLLEVBQWUsTUFBTSxFQUFPLHNCQUFzQixDQUFlLEVBQ2pFLEVBQXlCLEdBQWMsVUFBVSxDQUFDLENBQUMsV0FBVyxHQUFHLEVBQUksSUFBQSxHQUFZLEVBSWpGLEVBQW9CLEdBSFEsRUFBTyxhQUNyQyw2REFDQSxtQ0FDbUQsTUFBTSxHQUF5QixDQUFVLElBQzlGLEVBQXlCLEtBQUssRUFBdUIsUUFBUSxJQUFNLEtBRy9ELEVBQVcsQ0FDZixFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQWdCLENBQVcsQ0FBQyxFQUN0RSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQW9CLENBQWlCLENBQUMsQ0FDbEYsRUFDQSxNQUFNLFFBQVEsSUFBSSxDQUFRLENBQzVCLENBQUMsQ0FDSCxDQ2pFQSxlQUFzQixHQUFxQixFQUFzQyxDQUMvRSxPQUFPLEVBQU8sMEJBQTBCLHlCQUEwQixTQUFZLENBQzVFLEdBQUksQ0FBQyxFQUFPLE9BQVEsT0FFcEIsSUFBTSxFQUFVLEVBQUssUUFBUSxFQUFPLFFBQVMsU0FBUyxFQUNoRCxFQUFXLEVBQUssUUFBUSxFQUFTLGVBQWUsRUFDdEQsTUFBTSxFQUFHLFNBQVMsR0FBRyxFQUFVLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FDaEQsQ0FBQyxDQUNILENDTEEsTUFBTSxHQUFhOzs7OztFQUtqQixDQUFDLEdBQUcsRUFBVyxvQkFBcUIsR0FBRyxFQUFXLG9CQUFxQixHQUFHLEVBQVcsWUFBWSxDQUFDLENBQ2pHLElBQUssR0FBUSxLQUFLLEVBQUksYUFBYSxDQUFDLENBQ3BDLEtBQUs7Q0FBSSxFQUFFOzs7RUFLZCxlQUFzQixHQUFzQixFQUFzQyxDQUNoRixPQUFPLEVBQU8sMEJBQTBCLHdCQUF5QixTQUFZLENBQzNFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGdCQUFnQixFQUM5RCxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxFQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENDZEEsTUFBTSxHQUFlLENBQUMsVUFBVyxRQUFTLFFBQVMsWUFBYSxtQkFBb0IsUUFBUyxNQUFPLE1BQU0sRUE2QjFHLGVBQXNCLEdBQWtCLEVBQXVCLEVBQTBDLENBQ3ZHLE9BQU8sRUFBTywwQkFBMEIsb0JBQXFCLFNBQVksQ0FDdkUsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsWUFBWSxFQUNwRCxFQUFXLE1BQU0sRUFBTyxzQkFBc0IsQ0FBUSxHQUFNLEdBQzlELEVBQWtCLEVBQWUsbUJBQW1CLENBQU8sRUFBSUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFDN0QsRUFBa0IsRUFBZSxtQkFBbUIsQ0FBTyxFQUUzRCxFQUFRLENBQUMsR0FBRyxFQUFZLEVBQzFCLEVBQU8sb0JBQ1QsRUFBTSxLQUFLLE1BQU0sRUFFZixFQUFPLG1CQUNULEVBQU0sS0FBSyxJQUFJLEVBQ2YsR0FBbUIsR0FBRyxFQUFLLFNBQVMsRUFBTyxPQUFPLEVBQUU7R0FHbEQsRUFBTyx3QkFDVCxFQUFNLEtBQUssTUFBTSxFQUVmLEVBQU8sb0JBQ1QsRUFBTSxLQUFLLE9BQU8sRUFDbEIsR0FBbUI7R0FHakIsRUFBTyx5QkFDVCxFQUFNLEtBQUssVUFBVyxnQkFBaUIsTUFBTSxFQUM3QyxHQUFtQjs7OztHQU1qQixFQUFPLDBCQUNULEdBQW1COztJQUtqQixFQUFPLHVCQUF5QixFQUFPLHFCQUN6QyxFQUFNLEtBQUssUUFBUSxFQUNuQixHQUFtQjtHQUlqQixFQUFPLFVBQVUsUUFDbkIsR0FBbUI7O0dBSWpCLEVBQU8sVUFBVSxNQUNuQixFQUFNLEtBQUssUUFBUSxHQUVqQixFQUFXLFVBQVUsVUFBWSxFQUFPLFVBQVUsV0FDcEQsRUFBTSxLQUFLLFVBQVUsR0FFbkIsRUFBTyxVQUFVLFFBQVUsRUFBTyxVQUFVLFdBQzlDLEdBQW1CO0dBR2pCLEVBQU8sVUFBVSxpQkFDbkIsR0FBbUI7O0lBSWpCLEVBQVcsVUFBVSxhQUFlLEVBQU8sVUFBVSxlQUN2RCxFQUFNLEtBQUssYUFBYSxFQUN4QixHQUFtQjs7R0FJakIsRUFBTyxVQUFVLFdBQ25CLEVBQU0sS0FBSyxhQUFhLEVBRXRCLEVBQU8sVUFBVSxPQUNuQixFQUFNLEtBQUssTUFBTSxFQUVmLEVBQU8seUJBR1QsR0FBbUI7O0dBSWpCLEVBQU8sVUFBVSxhQUNuQixHQUFtQjtJQUdqQixFQUFPLGNBQWdCLEVBQVcsZ0JBR3BDLEdBQW1COztJQUlqQixFQUFXLFVBQVUsUUFBVSxFQUFPLFVBQVUsVUFDbEQsR0FBbUI7R0FJckIsSUFBSSxFQUFZLEdBQ2hCLElBQUssSUFBTSxLQUFRLEVBQU8sQ0FDeEIsSUFBSSxFQUFXLE1BQU0sR0FBVSxDQUFJLEdBQU0sR0FDekMsR0FBSSxDQUFDLEVBQVMsQ0FDWixJQUFNLEVBQU0sbURBQW1ELElBQ3pELEVBQVcsTUFBTSxNQUFNLENBQUcsRUFDMUIsRUFBZSxNQUFNLEVBQVMsS0FBSyxFQUN6QyxHQUFJLENBQUMsRUFBUyxJQUFNLEVBQWEsU0FBUyxxQkFBcUIsR0FBSyxFQUFhLFNBQVMsU0FBUyxFQUFHLENBQ3BHLFFBQVEsTUFBTSxtQkFBbUIsR0FBSyxFQUN0QyxNQUNGLENBQ0EsRUFBVSxFQUFhLEtBQUssRUFDNUIsTUFBTSxFQUFZLFFBQVUsR0FBVyxFQUFNLENBQU8sQ0FBQyxFQUNqRCxFQUFRLFdBQ1YsUUFBUSxLQUFLLFdBQVcsR0FBSyxDQUVqQyxDQUNJLElBQVcsR0FBYTtHQUM1QixHQUFhLEVBQVU7Q0FDekIsQ0FDTSxNQUFNLEVBQWUsMEJBQTBCLENBQVEsSUFDM0QsRUFBWSxFQUFVLFFBQVEsZUFBZ0IsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLFdBQVksUUFBUSxJQUUxRixFQUFPLG1CQUFxQixFQUFPLDBCQUNyQyxFQUFZLEVBQ1QsV0FBVyx5QkFBMEIsaUJBQWlCLENBQUMsQ0FDdkQsV0FBVyw0QkFBNkIsb0JBQW9CLENBQUMsQ0FDN0QsV0FBVyxtQ0FBb0MsMkJBQTJCLENBQUMsQ0FDM0UsV0FBVywyQkFBNEIsbUJBQW1CLENBQUMsQ0FDM0QsV0FBVyxxQkFBc0IsYUFBYSxDQUFDLENBQy9DLFdBQVcsdUJBQXdCLGVBQWUsQ0FBQyxDQUNuRCxXQUFXLGNBQWUsT0FBTyxDQUFDLENBQ2xDLFdBQVcsY0FBZSxPQUFPLEVBQ2hDLEVBQU8seUJBQ1QsRUFBWSxFQUFVLFdBQVcseUJBQTBCLHFCQUFxQixJQUdwRixFQUFZLEVBQVUsV0FBVyxlQUFnQixTQUFTLEVBQ3RELEVBQU8sVUFBVSxRQUduQixFQUFZLEVBQVUsV0FBVyxjQUFlLFVBQVUsSUFFeEQsRUFBTyx3QkFBMEIsRUFBTyxvQ0FPMUMsRUFBWSxFQUFVLFdBQVcsa0JBQW1CLGNBQWMsSUFFaEUsRUFBVyxVQUFVLGFBQWUsRUFBTyxVQUFVLGFBQWUsRUFBTywwQkFDN0UsRUFBWSxFQUFVLFdBQVcsa0JBQW1CO1dBQWdCLEdBRXRFLElBQU0sRUFBYSxFQUFrQjtFQUFPLEVBQVksRUFDeEQsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQUVBLE1BQU0sR0FBVSxFQUFLLEtBQUssRUFBRyxRQUFRLEVBQUcsU0FBVSxPQUFRLFdBQVcsRUFFckUsZUFBZSxHQUFXLEVBQWMsRUFBZ0MsQ0FDdEUsTUFBTSxFQUFHLFNBQVMsTUFBTSxHQUFTLENBQUUsVUFBVyxFQUFLLENBQUMsRUFDcEQsTUFBTSxFQUFHLFNBQVMsVUFBVSxFQUFLLEtBQUssR0FBUyxDQUFJLEVBQUcsQ0FBTyxDQUMvRCxDQUVBLGVBQWUsR0FBVSxFQUEyQyxDQUNsRSxHQUFJLENBQ0YsSUFBTSxFQUFPLE1BQU0sRUFBRyxTQUFTLEtBQUssRUFBSyxLQUFLLEdBQVMsQ0FBSSxDQUFDLEVBSTVELE9BSEksS0FBSyxJQUFJLEVBQUksRUFBSyxRQUFVLElBQVMsR0FBSyxJQUM1QyxPQUVLLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBSyxLQUFLLEdBQVMsQ0FBSSxFQUFHLE1BQU0sQ0FDcEUsTUFBUSxDQUVSLENBQ0YsQ0MxTUEsZUFBc0IsR0FBcUIsRUFBc0MsQ0FDL0UsT0FBTyxFQUFPLDBCQUEwQix1QkFBd0IsU0FBWSxDQUMxRSxJQUFNLEVBQVUsRUFBSyxRQUFRLEVBQU8sUUFBUyxPQUFPLEVBQ3BELEdBQUksRUFBRyxXQUFXLENBQU8sRUFBRyxDQUMxQixJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQVMsa0JBQWtCLEVBQ3pELE1BQU8sRUFBa0IsQ0FBTSxHQUFLLEVBQWdCLENBQU0sRUFDdEQsRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLEdBQXVCLENBQU0sQ0FBQyxDQUFDLEVBQ25GLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFVLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUNyRSxDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBdUIsRUFBK0IsQ0FvQjdELE1BQU87OztNQW5CYSxDQUNsQixDQUNFLEtBQU0sMkRBQ04sVUFBVyxFQUFrQixDQUFNLEVBQ25DLFdBQVksRUFBVyxNQUN2QixLQUFNLFFBQ04sUUFBUywwQ0FDWCxFQUNBLENBQ0UsS0FBTSxrQkFDTixVQUFXLEVBQWdCLENBQU0sRUFDakMsV0FBWSxFQUFXLGFBQ3ZCLEtBQU0sV0FDTixRQUFTLDZDQUNYLENBQ0YsQ0FBQyxDQUNFLE9BQVEsR0FBUyxFQUFLLFNBQVMsQ0FBQyxDQUNoQyxRQUFTLEdBQVMsRUFBSyxXQUFXLElBQUssR0FBUSxHQUFrQixFQUFLLFFBQVMsRUFBSyxLQUFNLEVBQUssS0FBTSxDQUFHLENBQUMsQ0FLOUYsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFOzs7Q0FJM0IsQ0FFQSxTQUFTLEdBQWtCLEVBQWdCLEVBQWMsRUFBYyxFQUEyQixDQUNoRyxNQUFPO3dDQUMrQixFQUFLOzs7OzRDQUlELEVBQVU7O21DQUVuQixFQUFLLEtBQUssRUFBVTs7Ozs7O3NDQU1qQixFQUFPOzs7Ozs7O0NBUTdDLENDMUVBLFNBQWdCLEdBQ2QsRUFDQSxFQUNvQixDQUNoQixNQUFDLEVBQU8sVUFBVSxXQUFhLENBQUMsSUFBVSxnQkFDOUMsTUFBTyxHQUFHLEVBQU8sTUFBUSxNQUFRLE9BQU8sNkJBQzFDLENDUEEsU0FBZ0IsRUFBVSxFQUFpQixFQUFnQixFQUFhLEVBQVEsRUFBUyxDQUN2RixHQUF5QixFQUFTLEVBQU0sRUFBSyxDQUFLLENBQ3BELENBRUEsU0FBZ0IsR0FBeUIsRUFBaUIsRUFBZ0IsRUFBYSxFQUFRLEVBQVcsQ0FDeEcsRUFBRyxDQUNELEdBQU0sQ0FBQyxFQUFRLEVBQVMsR0FBVyxHQUFpQixFQUFTLEVBQU0sQ0FBRyxFQUdoRSxFQURNLEVBQWMsVUFBVSxFQUFRLEVBQVMsQ0FDcEMsQ0FBQyxDQUFDLFFBQVUsRUFDN0IsR0FBSSxJQUFXLEVBQUcsTUFDbEIsR0FBSSxHQUFTLEVBQUcsT0FBTyxDQUN6QixPQUFTLEVBQUUsR0FBUyxHQUNwQixNQUFPLEVBQ1QsQ0FFQSxTQUFnQixFQUF5QixFQUFpQixFQUFnQixFQUFxQixDQUM3RixHQUFNLENBQUMsRUFBUSxFQUFTLEdBQVcsR0FBaUIsRUFBUyxFQUFNLENBQUcsRUFDdEUsRUFBUSxNQUFRLE9BQ2hCLElBQU0sRUFBTyxFQUFjLFVBQVUsRUFBUSxFQUFTLENBQU8sRUFFdkQsRUFBUyxFQUFLLFFBQVUsR0FDeEIsRUFBUSxPQUFPLEdBQVcsU0FBVyxFQUFPLEtBQUssRUFBSSxFQUFPLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFDOUUsRUFBSyxNQUNQLFFBQVEsTUFBTSxHQUFHLEVBQU8sSUFBSSxFQUFRLElBQUssR0FBTSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsaUJBQWlCLEVBQUssTUFBTSxTQUFTLEVBQ2hHLEdBQ1QsUUFBUSxNQUNOLEdBQUcsRUFBTyxJQUFJLEVBQVEsSUFBSyxHQUFNLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSw4Q0FBOEMsR0FDdEcsRUFHRixJQUFNLEVBQVMsRUFBSyxRQUFVLEdBQzlCLE9BQU8sT0FBTyxHQUFXLFNBQVcsRUFBTyxLQUFLLEVBQUksRUFBTyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQzdFLENBRUEsU0FBZ0IsR0FBaUIsRUFBaUIsRUFBZ0IsRUFBbUQsQ0FDbkgsSUFBTSxFQUFNLENBQUUsR0FBRyxRQUFRLEdBQUksRUFRN0IsT0FOSSxFQUFJLE1BQVEsRUFBSSxtQkFDbEIsRUFBSSxLQUFPLEVBQUksS0FBSyxNQUFNLEdBQUcsQ0FBQSxDQUMxQixPQUFRLEdBQU0sSUFBTSxFQUFJLGdCQUFnQixDQUFBLENBQ3hDLEtBQUssR0FBRyxHQUdOLENBQ0wsRUFDQSxFQUNBLENBQ0UsTUFDQSxNQUNBLFNBQVUsT0FDVixNQUFPLEdBQ1AsTUFBTyxTQUNULENBQ0YsQ0FDRixDQ3hEQSxTQUFnQixHQUFvQixFQUFzQixFQUErQixDQUN2RixHQUFJLENBR0YsSUFBTSxFQURTLEVBQXlCLE1BQU8sQ0FBQyxZQUFhLGtCQUQzQixFQUFhLEdBQUcsRUFBSyxNQUNlLE1BQU0sRUFBRyxRQUFRLElBQUksQ0FDbkUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsR0FDdkMsR0FBSSxDQUFDLEVBQ0gsTUFBVSxNQUFNLHdCQUF3QixFQUFhLEdBQUcsR0FBTSxFQUVoRSxPQUFPLFFBQVEsUUFBUSxDQUFVLENBQ25DLE9BQVMsRUFBTyxDQUNkLE9BQU8sUUFBUSxPQUFXLE1BQU0sK0JBQStCLEVBQWEsR0FBRyxFQUFLLElBQUksT0FBTyxDQUFLLEdBQUcsQ0FBQyxDQUMxRyxDQUNGLENDREEsTUFBYSxFQUFhLElBQUksS0FUYixDQUNmLGNBQWMsRUFBeUMsQ0FFckQsSUFBTSxFQURxQixFQUFjLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUN4QixDQUFDLEVBQUUsTUFBTSxHQUFHLEVBRzNDLE1BQU8sQ0FGSyxHQUFPLEdBQUcsRUFBRSxHQUFLLEdBQ2hCLEdBQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxRQUFRLFFBQVMsRUFBRSxHQUFLLEVBQ25DLENBQ25CLENBQ0YsRUFHTSxHQUFlLElBQUksSUFFekIsU0FBZ0IsRUFBVyxFQUF5QixDQUNsRCxJQUFNLEVBQU0sR0FBUyxHQUNmLEVBQVMsR0FBYSxJQUFJLENBQUcsRUFDbkMsR0FBSSxFQUFRLE9BQU8sRUFFbkIsSUFBTSxFQUFVLElBQUksR0FBUSxDQUMxQixLQUFNLEdBQWUsQ0FBSyxHQUFLLElBQUEsRUFDakMsQ0FBQyxFQUVELE9BREEsR0FBYSxJQUFJLEVBQUssQ0FBTyxFQUN0QixDQUNULENBRUEsU0FBZ0IsR0FBZSxFQUF3QixDQUNyRCxNQUFPLENBQUMsQ0FBQyxHQUFlLENBQUssQ0FDL0IsQ0FFQSxTQUFTLEdBQWUsRUFBb0MsQ0FPMUQsT0FOSSxJQUFVLGNBQ0wsUUFBUSxJQUFJLDRCQUE4QixHQUFrQixFQUVqRSxJQUFVLGlCQUNMLFFBQVEsSUFBSSwrQkFBaUMsR0FBa0IsRUFHdEUsUUFBUSxJQUFJLDRCQUNaLFFBQVEsSUFBSSwrQkFDWixRQUFRLElBQUksVUFDWixRQUFRLElBQUksY0FDWixHQUFrQixDQUV0QixDQUVBLElBQUksRUFFSixTQUFTLElBQXdDLENBQy9DLEdBQUksSUFBbUIsSUFBQSxHQUFXLE9BQU8sR0FBa0IsSUFBQSxHQUUzRCxHQUFJLENBRUYsRUFDRUMsRUFDRyxhQUFhLEtBQU0sQ0FBQyxPQUFRLE9BQU8sRUFBRyxDQUNyQyxTQUFVLE9BQ1YsTUFBTyxDQUFDLFNBQVUsT0FBUSxRQUFRLENBQ3BDLENBQUMsQ0FBQyxDQUNELEtBQUssR0FBSyxFQUNqQixNQUFRLENBQ04sRUFBaUIsRUFDbkIsQ0FDQSxPQUFPLEdBQWtCLElBQUEsRUFDM0IsQ0NqRUEsTUFBYSxHQUFrQyxDQUM3QyxnQkFDQSxxQkFDQSxvQkFDQSx3QkFDRixFQUVBLFNBQWdCLEdBQW1CLEVBQTBDLENBTzNFLE9BTkksRUFBTyxNQUNGLDhCQUVMLEVBQU8sVUFBVSxZQUNaLHVDQUVGLENBQUMsbUNBQW9DLGlDQUFpQyxDQUMvRSxDQUVBLFNBQWdCLEdBQTRCLEVBQWlDLENBVTNFLE9BVEksRUFBTyxVQUFVLE9BQVMsRUFBTyxVQUFVLEtBQ3RDLENBQUMsRUFFTixFQUFPLE1BQ0YsQ0FBQyxlQUFlLEVBRXJCLEVBQU8sVUFBVSxZQUNaLENBQUMsd0JBQXdCLEVBRTNCLENBQUMscUJBQXNCLG1CQUFtQixDQUNuRCxDQzVCQSxTQUFnQixHQUFxQyxFQUFnQyxDQUNuRixPQUNFLEVBQU8sc0JBQ1AsQ0FBQyxFQUFPLFFBQ1IsRUFBTyxhQUFhLFVBQVksSUFDaEMsTUFBTSxRQUFRLEVBQU8sYUFBYSxLQUFLLEdBQ3ZDLEVBQU8sWUFBWSxNQUFNLE9BQVMsQ0FFdEMsQ0NxQkEsTUFBYSxHQUE2QixDQUV4QyxjQUNBLGlCQUNBLG9CQUNBLGdCQUNBLFdBQ0EsY0FDQSxtQkFJQSxPQUNBLFVBQ0EsV0FFQSxhQUNBLGdCQUNBLFdBQ0EsWUFDQSxxQkFDQSxRQUNBLFNBQ0Esa0JBQ0EsUUFDQSxXQUNGLEVBRUEsZUFBc0IsR0FBa0IsRUFBc0MsQ0FDNUUsT0FBTyxFQUFPLDBCQUEwQixvQkFBcUIsU0FBWSxDQUN2RSxJQUFNLEVBQWdCLEVBQUssUUFBUSxFQUFPLFFBQVMsYUFBYSxFQUNoRSxHQUFJLEVBQU8sTUFBTyxDQUNoQixNQUFNLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFlLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUMxRSxNQUFNLEVBQVksUUFDaEIsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxPQUFPLEVBQUcsQ0FBRSxNQUFPLEdBQU0sVUFBVyxFQUFLLENBQUMsQ0FDeEYsRUFDQSxNQUFNLEVBQVksUUFDaEIsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxXQUFXLEVBQUcsQ0FBRSxNQUFPLEdBQU0sVUFBVyxFQUFLLENBQUMsQ0FDNUYsRUFDQSxNQUNGLENBRUEsSUFBTSxFQUFpQixFQUF5QixPQUFRLENBQUMsV0FBVyxFQUFHLEVBQU8sT0FBTyxFQUMvRSxFQUFnQixHQUFpQixlQUFnQixFQUFPLE9BQU8sRUFDakUsR0FBZSxFQUFlLENBQWMsR0FDOUMsRUFBVSxPQUFRLENBQUMsTUFBTyxVQUFXLENBQWEsRUFBRyxFQUFPLFFBQVMsQ0FBQyxFQUd4RSxJQUFNLEVBQWUsRUFBSyxLQUFLLEVBQU8sUUFBUyxRQUFTLFVBQVUsRUFDbEUsTUFBTSxFQUFHLFNBQVMsTUFBTSxFQUFjLENBQUUsVUFBVyxFQUFLLENBQUMsRUFDekQsSUFBSyxJQUFNLEtBQVEsTUFBTSxFQUFHLFNBQVMsUUFBUSxDQUFZLEVBQ25ELEVBQUssV0FBVyxPQUFPLEdBQUssQ0FBQyxFQUFLLFdBQVcsUUFBUSxFQUFjLEVBQUUsR0FDdkUsTUFBTSxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxLQUFLLEVBQWMsQ0FBSSxDQUFDLENBQUMsRUFLN0UsSUFBTSxFQUFhLEVBQUssUUFBUSxFQUFPLFFBQVMsU0FBUyxFQUN6RCxNQUFNLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFZLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUV2RSxJQUFJLEVBQVcsQ0FBQyxFQUNoQixHQUFJLENBQ0YsRUFBWSxFQUFLLEtBQUssTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFlLE1BQU0sQ0FBQyxHQUE4QixDQUN2RyxNQUFRLENBRVIsQ0FDQSxFQUFTLHlCQUEyQixHQUdwQyxFQUFTLGNBQWdCLEdBQ3pCLEVBQVMsV0FBYSxlQUN0QixFQUFTLE9BQVMsbUJBQ2xCLEVBQVMsa0JBQUEsS0FDVCxFQUFTLHdCQUEwQixDQUVqQyx1Q0FDQSx5Q0FDQSwwQ0FDQSwyQ0FDRixFQUNBLEVBQVMsdUJBQXlCLEdBQ2xDLE9BQU8sRUFBUyxpQkFDWixFQUFTLHdCQUF3QixTQUFXLEdBQzlDLE9BQU8sRUFBUyx1QkFHbEIsRUFBUyxrQkFBb0IsR0FDN0IsSUFBTSxFQUFpQixFQUFTLFNBQVMsUUFBVSxFQUVuRCxHQURBLEVBQVMsUUFBVSxFQUFTLFNBQVMsT0FBUSxHQUFNLEVBQUUsT0FBUyw2QkFBNkIsR0FBSyxDQUFDLEVBQzdGLEVBQVMsUUFBUSxTQUFXLEVBQWdCLENBQzlDLElBQU0sRUFBYSxFQUFLLFFBQVEsRUFBTyxRQUFTLFFBQVMsVUFBVyxlQUFlLEVBQ25GLE1BQU0sRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQVksQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLENBQ3pFLENBQ0ksRUFBUyxRQUFRLFNBQVcsR0FDOUIsT0FBTyxFQUFTLFFBRWxCLE1BQU0sRUFBRyxTQUFTLFVBQVUsRUFBZSxFQUFLLEtBQUssRUFBVSxDQUFFLFVBQVcsRUFBRyxDQUFDLENBQUMsRUFFakYsRUFBVSxPQUFRLENBQUMsTUFBTywwQkFBMEIsRUFBRyxFQUFPLE9BQU8sRUFFckUsRUFBVSxPQUFRLEdBQXNCLEVBQU8sUUFBUyxDQUFhLEVBQUcsRUFBTyxPQUFPLENBQ3hGLENBQUMsQ0FDSCxDQUVBLFNBQWdCLEdBQXNCLEVBQWlCLEVBQWlDLENBQ3RGLE1BQU8sQ0FBQyxNQUFPLFdBQVksY0FBZSxVQUFXLEVBQUssU0FBUyxFQUFTLENBQWEsQ0FBQyxDQUM1RixDQUVBLFNBQWdCLEdBQWlCLEVBQXFCLEVBQXlCLENBQzdFLE9BQU8sRUFBeUIsTUFBTyxDQUFDLE9BQVEsRUFBYSxTQUFTLEVBQUcsQ0FBTyxHQUFLLE9BQ3ZGLENBRUEsU0FBUyxHQUFlLEVBQW9CLEVBQTZCLENBQ3ZFLElBQU0sRUFBa0IsRUFBTyxNQUFNLENBQVUsRUFHL0MsT0FGSyxFQUVFLEVBQU8sR0FBRyxFQUFpQixFQUFPLE1BQU0sQ0FBVSxHQUFLLE9BQU8sRUFGeEMsRUFHL0IsQ0N4SEEsTUFBTSxHQUFhLENBQUMsNEJBQTZCLDZCQUE4QixRQUFTLFNBQVUsaUJBQWlCLEVBQzdHLEdBQXVCLGFBR3ZCLEdBQW1DLDZCQUNuQyxFQUFlLGtCQUNmLEVBQW9CLFdBQ3BCLEdBQXFCLFdBRXJCLEdBQXlCLElBQUksSUFBSSxDQUNyQyxFQUNBLEVBQ0EsR0FDQSxHQUNBLG9CQUNBLEdBQUcsRUFDTCxDQUFDLEVBQ0ssR0FBd0MsQ0FDNUMsK0JBQ0EsR0FBRyxHQUFXLE9BQVEsR0FBZSxFQUFXLFdBQVcsZUFBZSxDQUFDLENBQzdFLEVBQ00sR0FBMkIsczhCQXdDakMsRUFDTSxHQUF5QixJQUFJLElBQUksQ0FBQyxhQUFjLG1CQUFtQixDQUFDLEVBQ3BFLEdBQ0osMEdBRUksR0FBK0IsSUFBSSxJQUNuQyxHQUF1QixJQUFJLElBQzNCQyxHQUF3QixDQUFDLGVBQWdCLGtCQUFtQix1QkFBd0Isa0JBQWtCLEVBYTVHLGVBQXNCLEdBQ3BCLEVBQ0EsRUFDQSxFQUNlLENBQ2YsT0FBTyxFQUFPLDBCQUEwQixzQkFBdUIsU0FBWSxDQUN6RSxNQUFNQyxHQUFLLEVBQVEsRUFBWSxDQUFjLENBQy9DLENBQUMsQ0FDSCxDQUVBLGVBQWVBLEdBQUssRUFBdUIsRUFBMkIsRUFBd0MsQ0FDNUcsSUFBTSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsY0FBYyxFQUN0RCxFQUFVLE1BQU0sR0FBZ0IsQ0FBUSxFQUN4QyxFQUFpQixFQUFPLE1BQVEsTUFBUSxPQUU5QyxNQUFNLEdBQXNCLEVBQVEsQ0FBTyxFQUMzQyxNQUFNLEdBQWMsRUFBUSxDQUFPLEVBQ25DLEdBQTZDLENBQU8sRUFDcEQsSUFBTSxFQUFvQixNQUFNLEdBQTRCLEVBQVEsRUFBWSxDQUFPLEVBQ3ZGLE1BQU0sR0FBeUIsRUFBUSxFQUFZLEVBQVMsQ0FBaUIsRUFDN0UsR0FBbUMsRUFBUSxFQUFTLEVBQW1CLENBQWMsRUFDckYsTUFBTSxHQUFzQixDQUFPLEVBQ25DLEdBQThCLENBQU8sRUFFakMsRUFBTyxPQUFPLE9BQU8sRUFBUSxlQU1qQyxNQUFNLEVBQU8sYUFBYSxFQUFVLEdBQXFCLENBQU8sQ0FBQyxFQUU1RCxJQUNILEdBQXlCLEVBQVEsRUFBUyxFQUFtQixDQUFjLEVBQzNFLEdBQXNDLEVBQVEsRUFBZ0IsQ0FBUSxFQUUxRSxDQUVBLFNBQVMsR0FBcUIsRUFBc0MsQ0FHbEUsT0FBTyxLQUFLLFVBQVUsR0FBZ0IsQ0FBTyxFQUFHLElBQUEsR0FBVyxDQUFDLENBQzlELENBRUEsZUFBZSxHQUFnQixFQUFnRCxDQUM3RSxJQUFNLEVBQVcsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sRUFDdEQsRUFBVSxLQUFLLE1BQU0sQ0FBUSxFQUtuQyxNQUpBLEdBQVEsUUFBVSxFQUFRLFNBQVcsQ0FBQyxFQUN0QyxFQUFRLGFBQWUsRUFBUSxjQUFnQixDQUFDLEVBQ2hELEVBQVEsZ0JBQWtCLEVBQVEsaUJBQW1CLENBQUMsRUFDdEQsRUFBUSxpQkFBbUIsRUFBUSxrQkFBb0IsQ0FBQyxFQUNqRCxDQUNULENBRUEsZUFBZSxHQUFjLEVBQXVCLEVBQTZDLENBQy9GLEdBQTRCLEVBQVEsT0FBTyxFQUUzQyxFQUFRLFFBQVUsQ0FBRSxHQUFHLEVBQVEsUUFBUyxHQUFHLEdBQWdCLEVBQVEsRUFBUSxPQUFPLENBQUUsRUFDcEYsT0FBTyxFQUFRLFFBQVEscUJBRXZCLElBQU0sRUFBVSxFQUFRLFFBQ3BCLEVBQU8sT0FBUyxDQUFDLEVBQWdCLENBQU0sRUFDekMsT0FBTyxFQUFRLFNBRWYsRUFBUSxVQUFZLEVBQVEsVUFBWSxJQUFPLE1BQU0sR0FBdUIsRUFBTyxPQUFPLEVBRTVGLEdBQXFDLENBQU8sRUFDNUMsR0FBMEIsRUFBUSxDQUFPLENBQzNDLENBRUEsU0FBUyxHQUE0QixFQUFvQyxDQUN2RSxJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsT0FBTyxRQUFRLENBQU8sRUFDM0MsT0FBTyxHQUFVLFdBRWhCLEVBQU0sU0FBUyxXQUFXLElBQzdCLEVBQVEsR0FBTyxFQUFNLFdBQVcsZ0NBQWlDLEVBQUUsR0FHekUsQ0FFQSxTQUFTLEdBQXdCLEVBQW9DLENBQy9ELEVBQVEsWUFDVixFQUFRLFlBQWMsY0FDYixFQUFRLGFBQWEsU0FBUyxhQUFhLEdBQ3BELE9BQU8sRUFBUSxXQUVuQixDQUVBLFNBQVMsR0FBcUMsRUFBb0MsQ0FFaEYsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxDQUFPLEVBQzFDLEdBQU8sU0FBUyx5QkFBeUIsSUFDOUMsRUFBUSxHQUFPLEVBQU0sV0FDbkIsbUhBQ0EsK0JBQ0YsRUFFSixDQUVBLFNBQVMsR0FBMEIsRUFBdUIsRUFBb0MsQ0FDeEYsRUFBTyxPQUFTLENBQUMsRUFBUSxTQUFTLFNBQVMsY0FBYyxJQUU3RCxFQUFRLFFBQVUsaURBQ3BCLENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUM0QixDQUM1QixJQUFNLEVBQXlCLENBQUMsRUFDMUIsRUFBa0IsQ0FBQyxtQkFBbUIsRUFDdEMsRUFBa0MsQ0FBQyxFQUNuQyxFQUFVLEVBQWdCLENBQU0sRUFHcEMsR0FDQSxDQUFDLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBVyxRQUFTLGtCQUFrQixDQUFDLEdBQ2hFLENBQUMsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFPLFFBQVMsa0JBQWtCLENBQUMsSUFFNUQsRUFBUSxTQUFXLCtCQUNuQixFQUFnQixLQUFLLHVCQUF3Qiw4QkFBOEIsR0FFekUsRUFDRixFQUFnQixLQUFLLFVBQVUsRUFFL0IsR0FBd0IsQ0FBTyxFQUdqQyxPQUFPLEVBQVEsZ0JBQWdCLGVBQy9CLE9BQVEsRUFBc0QsZUFFMUQsRUFBTyxTQUNULE9BQU8sRUFBUSxnQkFBZ0IsTUFDL0IsT0FBTyxFQUFRLFFBQVEsWUFDdkIsT0FBTyxFQUFRLFFBQVEsZUFDdkIsT0FBTyxFQUFRLFFBQVEsUUFDdkIsT0FBTyxFQUFRLFFBQVEsU0FDdkIsRUFBUSxRQUFRLFFBQVUsMkJBQzFCLEVBQWdCLEtBQUssRUFBa0IsRUFFbkMsRUFBTyxVQUFVLGtCQUNmLEdBQXdDLEVBQVEsUUFBUSxPQUFPLEVBQ2pFLE9BQU8sRUFBUSxnQkFBZ0Isb0JBRS9CLENBQUMsRUFBUSxnQkFBZ0IscUJBQ3pCLENBQUMsRUFBUSxnQkFBZ0IsMkJBQ3pCLENBQUMsRUFBUSxnQkFBZ0IsaUNBRXpCLEVBQWdCLEtBQUssa0JBQWtCLEVBRXpDLEVBQVEsUUFBVSwrQkFHaEIsRUFBTyxVQUFVLGlCQUlmLEVBRmlCLEVBQVEsYUFBYSxXQUFhLEVBQVEsZ0JBQWdCLFlBRTFELENBQUMsRUFBUSxhQUFhLHFCQUN6QyxFQUFnQixLQUFLLGtCQUFrQixFQUVyQyxFQUFPLFVBQVUsbUJBRW5CLEVBQVEsYUFBYSxhQUNuQixFQUFRLGdCQUFnQixZQUN4QixFQUFRLGFBQWEscUJBQ3JCLEVBQVEsZ0JBQWdCLG9CQUMxQixFQUFhLEtBQUssWUFBWSxFQUM5QixPQUFPLEVBQVEsZ0JBQWdCLGFBRS9CLE9BQU8sRUFBUSxhQUFhLFdBQzVCLE9BQU8sRUFBUSxnQkFBZ0IsYUFJL0IsRUFBTywyQkFFVCxFQUFRLFdBQWEsTUFBTSxRQUFRLEVBQVEsVUFBVSxFQUNqRCxFQUFNLElBQUksQ0FBQyxFQUFRLFdBQVksQ0FBQyxZQUFZLENBQUMsRUFBRyxDQUM5QyxXQUFZLEVBQ2QsQ0FBQyxFQUNELENBQUMsWUFBWSxFQUNSLE1BQU0sUUFBUSxFQUFRLFVBQVUsSUFDekMsRUFBUSxXQUFhLEVBQVEsV0FBVyxPQUNyQyxHQUNDLEVBQUcsU0FBUyxFQUFXLENBQ3JCLElBQUssR0FDTCxJQUFLLEVBQU8sUUFDWixPQUFRLENBQ1YsQ0FBQyxDQUFDLENBQUMsT0FBUyxDQUNoQixFQUNJLEVBQVEsV0FBVyxTQUFXLEdBQ2hDLE9BQU8sRUFBUSxhQVFqQixFQUFPLFVBQVUsTUFDbkIsRUFBZ0IsS0FBSyw2QkFBNkIsRUFHL0MsR0FBWSxDQUFPLElBQ2xCLEdBQWdDLENBQU8sRUFDekMsRUFBYSxLQUFLLENBQVksRUFFOUIsRUFBZ0IsS0FBSyxDQUFZLElBT25DLEVBQVEsYUFBYSxJQUNyQixFQUFRLGdCQUFnQixJQUN4QixPQUFPLE9BQU8sRUFBUSxPQUFPLENBQUMsQ0FBQyxLQUFNLEdBQVcsR0FBUSxTQUFTLENBQWlCLENBQUMsS0FFL0UsR0FBcUMsQ0FBTyxFQUM5QyxFQUFhLEtBQUssQ0FBaUIsRUFFbkMsRUFBZ0IsS0FBSyxDQUFpQixHQUd0QyxFQUFrQixDQUFNLEdBQzFCLEVBQWdCLEtBQUssR0FBRyxFQUFVLEVBR3BDLElBQU0sRUFBMkIsRUFBa0IsQ0FBTSxFQUFJLEdBQTRCLENBQU0sRUFBSSxDQUFDLEVBaUNwRyxPQWhDQSxNQUFNLEdBQXFDLEVBQVEsRUFBUyxDQUF3QixFQUNwRixFQUFnQixLQUFLLEdBQUcsQ0FBd0IsR0FFNUMsRUFBTyx1QkFBeUIsRUFBTyxtQ0FHekMsRUFBZ0IsS0FBSyxFQUFvQixFQUNyQyxFQUFPLE1BQ1QsRUFBZ0IsS0FBSyxZQUFZLEVBQ3ZCLEVBQU8sVUFBVSxhQUMzQixFQUFnQixLQUFLLGFBQWEsR0FHbEMsRUFBUSxhQUFhLE1BQ3JCLEVBQVEsZ0JBQWdCLE1BQ3hCLEVBQVEsYUFBYSxrQkFDckIsRUFBUSxnQkFBZ0Isa0JBQ3hCLEVBQVEsYUFBYSxZQUNyQixFQUFRLGdCQUFnQixhQUV4QixFQUFnQixLQUFLLGFBQWEsR0FJbEMsRUFBTyxxQkFDRixDQUNMLGFBQWMsRUFBYSxPQUFRLEdBQVEsQ0FBQyxFQUFJLFNBQVMsZUFBZSxDQUFDLEVBQ3pFLGdCQUFpQixFQUFnQixPQUFRLEdBQVEsQ0FBQyxFQUFJLFNBQVMsZUFBZSxDQUFDLEVBQy9FLHVCQUNGLEVBR0ssQ0FBRSxlQUFjLGtCQUFpQix1QkFBc0IsQ0FDaEUsQ0FFQSxTQUFTLEdBQXdDLEVBQTBCLENBRXpFLE9BREksT0FBTyxHQUFXLFNBQ2Ysc0VBQXNFLEtBQUssQ0FBTSxFQURqRCxFQUV6QyxDQUVBLFNBQVMsR0FBNkMsRUFBb0MsQ0FDeEYsSUFBSyxHQUFNLENBQUMsRUFBWSxJQUFrQixDQUN4QyxDQUFDLEVBQWMsR0FBZ0MsQ0FBTyxDQUFDLEVBQ3ZELENBQUMsRUFBbUIsR0FBcUMsQ0FBTyxDQUFDLENBQ25FLEVBQ0UsR0FBSSxFQUFlLENBQ2pCLElBQU0sRUFBYSxFQUFRLGdCQUFnQixHQUMzQyxHQUFJLENBQUMsRUFBWSxTQUNqQixJQUFNLEVBQWlCLEVBQVEsYUFBYSxJQUN4QyxDQUFDLEdBQWtCLEdBQXNCLEVBQVksQ0FBYyxLQUNyRSxFQUFRLGFBQWEsR0FBYyxHQUVyQyxPQUFPLEVBQVEsZ0JBQWdCLEVBQ2pDLE1BQVcsRUFBUSxhQUFhLEtBQzlCLEVBQVEsZ0JBQWdCLEtBQWdCLEVBQVEsYUFBYSxHQUM3RCxPQUFPLEVBQVEsYUFBYSxHQUdsQyxDQUVBLFNBQVMsR0FBZ0MsRUFBK0IsQ0FDdEUsSUFBTSxFQUFvQixFQUFRLFNBQVMsWUFDM0MsT0FBTyxPQUFPLEdBQXNCLFVBQVksVUFBVSxLQUFLLENBQWlCLENBQ2xGLENBRUEsU0FBUyxHQUFxQyxFQUErQixDQUMzRSxJQUFNLEVBQVMsRUFBUSxPQUN2QixPQUFPLEdBQTBCLEdBQVEsSUFBSSxHQUFLLEdBQTBCLEVBQVEsU0FBUyxJQUFJLENBQ25HLENBRUEsU0FBUyxHQUEwQixFQUErQixDQUdoRSxPQUFPLE9BQU8sR0FBZ0IsVUFBWSwrQkFBK0IsS0FBSyxDQUFXLENBQzNGLENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUNBLEVBQ2UsQ0FDZixBQUNFLEVBQVEsT0FBTyxFQUFLLFNBQVMsRUFBTyxPQUFPLEVBR3pDLEVBQU8sNkJBQ1QsRUFBUSxRQUFVLElBRXBCLEFBQ0UsRUFBUSxVQUFVLGFBRWhCLENBQUMsRUFBUSxTQUFXLEVBQVEsVUFBWSxjQUFnQixFQUFXLGVBQ3JFLEVBQVEsZ0JBQWtCLENBQUMsRUFDM0IsRUFBUSxjQUFjLFNBQVcsVUFFbkMsR0FBTSxDQUFDLEdBQVMsRUFBVyxjQUFjLEVBQU8sWUFBYyxFQUFFLEVBYWhFLElBWkksSUFBVSxlQUFpQixJQUFVLG9CQUN2QyxFQUFRLE9BQVMsb0JBRW5CLE1BQU0sR0FBd0MsRUFBUSxDQUFPLEVBQ3pELENBQUMsRUFBTyxRQUFVLEVBQVEsU0FBVyxDQUFDLEVBQVEsT0FFaEQsRUFBUSxLQUFPLFNBSWpCLE9BQU8sRUFBUSxjQUFjLGFBRXpCLENBQUMsRUFBTywyQkFBNEIsQ0FDdEMsR0FBSSxDQUFDLEVBQU8sTUFDVixHQUFJLENBQUMsRUFBTyx1QkFBeUIsQ0FBQyxFQUFPLHNCQUF1QixDQUNsRSxPQUFPLEVBQVEsUUFBUSxLQUN2QixPQUFPLEVBQVEsUUFBUSxZQUN2QixJQUFLLElBQU0sSUFBYyxDQUFDLFNBQVMsRUFBRyxDQUNwQyxJQUFNLEVBQVMsRUFBUSxRQUFRLEdBQzFCLElBQ0wsRUFBUSxRQUFRLEdBQWMsRUFBTyxRQUFRLG1DQUFvQyxFQUFFLEVBQ3JGLENBQ0YsS0FDRSxHQUFRLFFBQVEsWUFBYyxFQUFRLFFBQVEsYUFBZSxrQkFJakUsR0FBSSxFQUFPLHVCQUF3QixDQUNqQyxFQUFRLFFBQVEsS0FBTyxrQkFDdkIsRUFBUSxRQUFRLFlBQWMsWUFDOUIsSUFBTSxFQUFPLENBQUMsTUFBTyxPQUFRLGFBQWEsQ0FBQyxDQUFDLE9BQVEsR0FBUSxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxDQUFHLENBQUMsQ0FBQyxFQUN4RyxFQUFLLE9BQVMsSUFDaEIsRUFBUSxRQUFRLGVBQWlCLHNCQUFzQixFQUFLLEtBQzFELEdBQ0YsRUFBRSwrR0FDRixFQUFRLFFBQVEsT0FBUyxHQUF3QixFQUFRLFFBQVEsT0FBUSxDQUFNLEVBRW5GLENBRUEsSUFBTSxFQUF1QixHQUF3QixDQUFNLEVBQzNELEdBQUksRUFBc0IsQ0FDcEIsRUFBUSxRQUFRLGNBQWdCLGtCQUNsQyxPQUFPLEVBQVEsUUFBUSxZQUV6QixJQUFNLEVBQWUsRUFBTyxNQUFRLFVBQVksT0FDaEQsRUFBUSxRQUFRLG1CQUFxQixHQUFHLEVBQWEsU0FBUyxJQUM5RCxPQUFPLEVBQVEsUUFBUSxTQUFTLElBQXlCLFNBQVcsS0FBTyxZQUMzRSxPQUFPLEVBQVEsUUFBUSxxQkFDdkIsRUFBUSxRQUFRLFNBQVMsS0FBMEIsR0FBc0IsQ0FBb0IsRUFDN0YsSUFBTSxFQUFjLE1BQU0sRUFBRyxLQUFLLFVBQVcsQ0FDM0MsSUFBSyxFQUFPLFFBQ1osSUFBSyxHQUNMLE9BQVEsQ0FDVixDQUFDLEVBQ0ssRUFBYSxJQUFJLElBQ3ZCLElBQUssSUFBTSxLQUFjLEVBQWEsQ0FDcEMsR0FBTSxDQUFDLEVBQU8sR0FBVSxFQUFXLE1BQU0sR0FBRyxFQUN4QyxHQUFTLEdBQ1gsRUFBVyxJQUFJLENBQUssQ0FFeEIsQ0FDQSxHQUFJLEVBQVcsS0FBTyxFQUFHLENBQ3ZCLElBQU0sRUFBYyxDQUFDLEdBQUcsQ0FBVSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQ3RDLEVBQWUsR0FBRyxFQUFxQixNQUM3QyxFQUFRLFFBQVEsZUFDZCxHQUFHLEVBQWEseUJBQXlCLEVBQVksTUFBTSxFQUFhLFNBQVMsSUFDL0UsRUFBUSxRQUFRLEtBQ2xCLEVBQVEsUUFBUSxLQUFPLEdBQUcsRUFBYSxVQUFVLEVBQVksTUFBTSxFQUFRLFFBQVEsUUFFbkYsRUFBUSxRQUFRLEtBQU8sR0FBRyxFQUFhLFVBQVUsSUFDakQsRUFBUSxRQUFRLFlBQWMsR0FBRyxFQUFhLFFBRWhELEVBQVEsUUFBUSxPQUFTLEdBQXdCLEVBQVEsUUFBUSxPQUFRLENBQU0sRUFDL0UsRUFBa0Isc0JBQXNCLEtBQUssUUFBUyxRQUFTLFFBQVEsQ0FDekUsQ0FDRixDQUNGLEVBRUksRUFBTyxZQUFjLEVBQVEsY0FDL0IsRUFBUSxXQUFhLEdBQStCLEVBQU8sWUFBYyxFQUFRLFdBQVksRUFBUSxVQUFVLEdBR2pILElBQU0sRUFBZ0IsRUFBUSxRQUFRLFlBQ2xDLEdBQWUsU0FBUywyQkFBMkIsRUFDckQsT0FBTyxFQUFRLFFBQVEsWUFDZCxHQUE4QixFQUFRLENBQWEsSUFDNUQsRUFBUSxRQUFRLFlBQWMsR0FBRyxFQUFPLE1BQVEsYUFBZSxHQUFHLGNBRXBFLEdBQXlCLEVBQVEsQ0FBTyxFQUN4QyxHQUF3QixFQUFRLE9BQU8sRUFFbEMsRUFBUSxhQUFhLFVBRXhCLE9BQU8sRUFBUSxnQkFBZ0Isa0JBRW5DLENBRUEsU0FBUyxHQUE4QixFQUF1QixFQUErQyxDQUMzRyxPQUNFLEVBQU8sVUFBVSxPQUNqQixFQUFPLFVBQVUsUUFDakIsRUFBTyxVQUFVLFdBQ2pCLEVBQU8sVUFBVSxRQUNoQixFQUFPLFVBQVUsU0FBVyxDQUFDLENBQUMsR0FBa0IsU0FBUyxtQkFBbUIsQ0FFakYsQ0FFQSxTQUFTLEdBQXdCLEVBQWtDLEVBQStCLENBR2hHLElBQU0sRUFBZSxFQUFPLE1BQVEsVUFBWSxPQUNoRCxPQUFPLEVBQWUsR0FBRyxFQUFhLE1BQU0sRUFBYSxjQUFnQixHQUFHLEVBQWEsYUFDM0YsQ0FFQSxTQUFTLEdBQXlCLEVBQXVCLEVBQW9DLENBQ3RGLEdBQXNCLENBQU0sR0FFN0IsRUFBUSxRQUFRLGlCQUFtQiw2REFDckMsT0FBTyxFQUFRLFFBQVEsY0FFM0IsQ0FFQSxlQUFlLEdBQ2IsRUFDQSxFQUNlLENBQ2YsR0FBSSxDQUFDLEdBQXFDLENBQU0sRUFBRyxPQUVuRCxJQUFNLEVBQWdCLEVBQUssUUFBUSxFQUFPLFFBQVMsWUFBWSxFQUMvRCxHQUFJLENBQUMsRUFBRyxXQUFXLENBQWEsRUFBRyxPQUVuQyxFQUFRLEtBQU8sU0FFZixJQUFNLEVBQWdCLEVBQUssUUFBUSxFQUFPLFFBQVMsYUFBYSxFQUMzRCxFQUFHLFdBQVcsQ0FBYSxJQUVoQyxFQUFRLE1BQVEsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUksRUFBUSxPQUFTLENBQUMsRUFBSSxjQUFjLENBQUMsQ0FBQyxFQUl2RSxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBSyxRQUFRLEVBQU8sUUFBUyxjQUFjLEVBQUcsRUFBaUIsQ0FBQyxFQUNsSCxDQUVBLE1BQU0sR0FBb0I7RUFHMUIsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ00sQ0FDTixJQUFNLEVBQTBCLEVBQVEsYUFDbEMsRUFBNkIsRUFBUSxnQkFDM0MsRUFBa0IsYUFBZSxHQUMvQixFQUNBLEVBQ0EsRUFDQSxDQUFDLEdBQUcsRUFBa0IsYUFBYyxHQUFHLEdBQStCLENBQXVCLENBQUMsRUFDOUYsQ0FDRixFQUNBLEVBQWtCLGdCQUFrQixFQUFrQixnQkFBZ0IsT0FBUSxHQUFRLENBQUMsRUFBd0IsRUFBSSxFQUNuSCxFQUFrQixnQkFBa0IsR0FDbEMsRUFDQSxFQUNBLEVBQ0EsQ0FBQyxHQUFHLEVBQWtCLGdCQUFpQixHQUFHLEdBQStCLENBQTBCLENBQUMsRUFDcEcsQ0FDRixDQUNGLENBRUEsU0FBUyxHQUErQixFQUFvRSxDQUMxRyxPQUFPLE9BQU8sS0FBSyxDQUF1QixDQUFDLENBQUMsT0FBUSxHQUFlLEdBQXVCLElBQUksQ0FBVSxDQUFDLENBQzNHLENBRUEsU0FBUyxHQUE4QixFQUE0QixDQUNqRSxJQUFLLElBQU0sS0FBT0QsR0FBdUIsQ0FDdkMsSUFBTSxFQUFVLEVBQVEsR0FDcEIsR0FBVyxPQUFPLEtBQUssQ0FBTyxDQUFDLENBQUMsU0FBVyxHQUM3QyxRQUFRLGVBQWUsRUFBUyxDQUFHLENBRXZDLENBQ0YsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUVOLEdBQXVCLEVBQVEsRUFEVixFQUFrQixhQUFhLE9BQVEsR0FBUSxDQUFDLEVBQVEsa0JBQWtCLEVBQ3JDLEVBQUcsRUFBSyxFQUdsRSxHQUF1QixFQUFRLEVBRFAsRUFBa0IsZ0JBQWdCLE9BQVEsR0FBUSxDQUFDLEVBQVEsZUFBZSxFQUNyQyxFQUFHLEVBQUksRUFFcEUsSUFBTSxFQUF1QixHQUF3QixDQUFNLEVBQzNELEdBQUksR0FBd0IsRUFBa0Isc0JBQXNCLE9BQVMsRUFBRyxDQUM5RSxJQUFNLEVBQWUsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFrQixxQkFBcUIsQ0FBQyxFQUNyRSxJQUF5QixTQUMzQixFQUFVLFNBQVUsQ0FBQyxNQUFPLFVBQVcsTUFBTyxHQUFHLENBQVksRUFBRyxFQUFPLE9BQU8sRUFFOUUsRUFBVSxLQUFNLENBQUMsTUFBTyxRQUFTLEdBQUcsQ0FBWSxFQUFHLEVBQU8sT0FBTyxDQUVyRSxDQUNGLENBRUEsU0FBUyxHQUF3QixFQUFvRCxDQUNuRixHQUFJLEVBQU8sa0JBQW1CLE1BQU8sS0FDckMsR0FBSSxFQUFPLHNCQUF1QixNQUFPLFFBQzNDLENBRUEsU0FBUyxHQUFzQixFQUF5QyxDQUV0RSxPQURJLElBQW1CLEtBQWEsbUJBQzdCLDhJQUNULENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ00sQ0FDTixHQUFJLEVBQWEsU0FBVyxFQUFHLE9BRS9CLElBQU0sRUFBdUIsQ0FDM0IsR0FBRyxJQUFJLElBQUksRUFBYSxJQUFLLEdBQWUsR0FBOEIsRUFBUSxDQUFVLENBQUMsQ0FBQyxDQUNoRyxFQUNBLEVBQ0UsRUFDQSxDQUFDLE1BQU8sR0FBSSxFQUFNLENBQUMsSUFBSSxFQUFJLENBQUMsRUFBSSxHQUFJLEVBQU8sTUFBUSxDQUFDLFNBQVMsRUFBSSxDQUFDLEVBQUksR0FBRyxDQUFvQixFQUM3RixFQUFPLE9BQ1QsQ0FDRixDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ1UsQ0FDVixJQUFNLEVBQWtDLENBQUMsRUFDekMsSUFBSyxJQUFNLEtBQWMsSUFBSSxJQUFJLENBQVksRUFBRyxDQUM5QyxJQUFNLEVBQWlDLEdBQ3JDLEVBQ0EsRUFDQSxFQUF3QixFQUMxQixFQUtBLEdBSkksSUFDRixFQUFzQixLQUFLLENBQVUsRUFDakMsQ0FBQyxJQUdMLEVBQXdCLElBQ3hCLENBQUMsR0FDRCxFQUF3QixLQUFnQixJQUV4QyxTQUNGLElBQU0sRUFBZ0IsR0FBMkIsRUFBUSxDQUFVLEVBQy9ELElBQWtCLEtBQU8sRUFBd0IsS0FDckQsRUFBd0IsR0FBYyxFQUN4QyxDQUNBLE9BQU8sQ0FDVCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDTSxDQUNOLElBQU0sRUFBbUIsRUFBSyxTQUFTLEVBQU8sUUFBUyxDQUFRLEVBQzFELEdBT0gsRUFERSxJQUFtQixNQUNYLE9BRUEsRUFGUSxDQUFDLG9CQUFxQixDQUFnQixFQUFHLEVBQU8sT0FFZSxDQUVyRixDQUdBLGVBQWUsR0FDYixFQUNBLEVBQ2UsQ0FDWCxFQUFRLFNBQVcsb0JBQ3JCLEVBQVEsT0FBUyxvQkFFbkIsR0FBcUIsRUFBUSxDQUFPLEVBQ3BDLEdBQW1ELEVBQVEsQ0FBTyxFQUNsRSxPQUFPLEVBQVEsUUFBUSxxQkFDdkIsT0FBTyxFQUFRLFFBQVEseUJBQ3ZCLE9BQU8sRUFBUSxRQUFRLG9CQUN2QixPQUFPLEVBQVEsUUFBUSxnQkFDdkIsT0FBTyxFQUFRLFFBQVEsa0JBQ3ZCLE9BQU8sRUFBUSxRQUFRLHNCQUN2QixPQUFPLEVBQVEsUUFBUSxxQkFDdkIsT0FBTyxFQUFRLGFBQWEsTUFDNUIsT0FBTyxFQUFRLGdCQUFnQixnQ0FDL0IsT0FBTyxFQUFRLGdCQUFnQix5QkFHL0IsT0FBTyxFQUFRLGFBQWEsSUFDNUIsT0FBTyxFQUFRLGdCQUFnQixJQUUzQixDQUFDLEVBQU8sdUJBQXlCLENBQUMsRUFBTyxrQ0FDM0MsT0FBTyxFQUFRLGFBQWEsSUFDNUIsT0FBTyxFQUFRLGdCQUFnQixLQUVqQyxPQUFPLEVBQVEsZ0JBQWdCLE1BRS9CLE9BQU8sRUFBUSxnQkFBZ0IsTUFDL0IsT0FBTyxFQUFRLFFBQVEsa0JBQ3ZCLE9BQU8sRUFBUSxRQUFRLGtCQUN2QixPQUFPLEVBQVEsUUFBUSxpQkFDdkIsT0FBTyxFQUFRLFFBQVEsaUJBQ3ZCLE9BQU8sRUFBUSxRQUFRLFNBQ3ZCLE9BQU8sRUFBUSxRQUFRLGFBQ3ZCLE9BQU8sRUFBUSxRQUFRLGVBQ3ZCLE9BQU8sRUFBUSxRQUFRLDBCQUN2QixNQUFNLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLFlBQVksRUFBRyxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsRUFFdkcsR0FBNEMsRUFBUSxDQUFPLEVBQzNELEdBQStCLEVBQVMsQ0FBTSxDQUNoRCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ00sQ0FDTixJQUFNLEVBQWMsRUFBUSxNQUFRLEVBQUssU0FBUyxFQUFPLE9BQU8sRUFJaEUsSUFBSyxJQUFNLEtBQVcsR0FBc0IsQ0FBTyxFQUNqRCxRQUFRLGVBQWUsRUFBUyxDQUFXLENBRS9DLENBRUEsU0FBUyxHQUFtRCxFQUF1QixFQUE0QixDQUN4RyxLQUFPLHFCQUVaLElBQUssSUFBTSxLQUFXLEdBQXNCLENBQU8sRUFDakQsSUFBSyxHQUFNLENBQUMsRUFBWSxLQUFZLE9BQU8sUUFBUSxDQUFPLEVBQ25ELEdBQ0EsR0FBeUIsQ0FBTyxJQU1yQyxFQUFRLEdBQWMsR0FBMkIsRUFBUSxDQUFVLEVBR3pFLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDTSxDQUNOLEdBQUksQ0FBQyxFQUFPLHFCQUFzQixPQUVsQyxJQUFNLEVBQVcsR0FBc0IsQ0FBTyxFQUM5QyxJQUFLLElBQU0sS0FBYyxHQUl2QixJQUFLLElBQU0sS0FBVyxFQUNwQixRQUFRLGVBQWUsRUFBUyxDQUFVLENBR2hELENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUNlLENBQ2YsSUFBTSxFQUFvQixJQUFJLElBQUksQ0FBZ0IsRUFDNUMsRUFBbUMsTUFBTSxHQUFvQyxDQUFNLEVBQ3pGLElBQUssSUFBTSxLQUFjLEdBQ25CLE9BQWtCLElBQUksQ0FBVSxHQUFLLEVBQWlDLElBQUksQ0FBVSxHQUd4RixJQUFLLElBQU0sS0FBVyxHQUFzQixDQUFPLEVBQ2pELFFBQVEsZUFBZSxFQUFTLENBQVUsQ0FHaEQsQ0FFQSxlQUFlLEdBQW9DLEVBQTZDLENBQzlGLElBQU0sRUFBbUMsSUFBSSxJQUN2QyxFQUFZLE1BQU0sRUFBRyxLQUFLLG9CQUFxQixDQUNuRCxJQUFLLEVBQU8sUUFDWixJQUFLLEdBQ0wsT0FBUSxDQUNWLENBQUMsRUFFRCxJQUFLLElBQU0sS0FBWSxFQUFXLENBQ2hDLElBQU0sRUFBbUIsRUFBSyxRQUFRLEVBQU8sUUFBUyxDQUFRLEVBR3hELEVBQVMsR0FBZ0IsQ0FBZ0IsRUFDL0MsR0FBSSxDQUFDLEVBRUgsT0FEQSxRQUFRLEtBQUssbURBQW1ELEVBQWlCLHNCQUFzQixFQUNoRyxJQUFJLElBQUksRUFBK0IsRUFFaEQsSUFBSyxJQUFNLEtBQVMsR0FBb0IsQ0FBTSxFQUM1QyxJQUFLLElBQU0sS0FBYyxJQUNuQixJQUFVLEdBQWMsRUFBTSxXQUFXLEdBQUcsRUFBVyxFQUFFLElBQzNELEVBQWlDLElBQUksQ0FBVSxDQUl2RCxDQUVBLE9BQU8sQ0FDVCxDQUdBLFNBQVMsR0FBb0IsRUFBa0MsQ0FDN0QsSUFBTSxFQUFtQixDQUFDLEVBQzFCLElBQUssSUFBTSxLQUFZLEdBQTBCLENBQU0sRUFDakQsRUFBSSxxQkFBcUIsQ0FBUSxHQUFLLEVBQUksZ0JBQWdCLEVBQVMsSUFBSSxHQUFLLEVBQVMsS0FBSyxPQUFTLFdBQ3JHLEdBQTJCLEVBQVMsWUFBYSxDQUFNLEVBRzNELE9BQU8sQ0FDVCxDQUVBLFNBQVMsR0FBMEIsRUFBaUUsQ0FDbEcsSUFBSyxJQUFNLEtBQWEsRUFBTyxXQUM3QixHQUFJLEVBQUksc0JBQXNCLENBQVMsR0FBSyxFQUFJLDBCQUEwQixFQUFVLFVBQVUsRUFDNUYsT0FBTyxFQUFVLFdBQVcsV0FHaEMsTUFBTyxDQUFDLENBQ1YsQ0FFQSxTQUFTLEdBQTJCLEVBQXNCLEVBQXdCLENBQ2hGLEdBQUksRUFBSSxnQkFBZ0IsQ0FBSSxFQUMxQixFQUFPLEtBQUssRUFBSyxJQUFJLE9BQ2hCLEdBQUksRUFBSSx5QkFBeUIsQ0FBSSxFQUMxQyxJQUFLLElBQU0sS0FBVyxFQUFLLFNBQ3pCLEdBQTJCLEVBQVMsQ0FBTSxDQUdoRCxDQUVBLFNBQVMsR0FBc0IsRUFBeUQsQ0FDdEYsT0FBT0EsR0FDSixJQUFLLEdBQVEsRUFBUSxFQUFJLENBQUMsQ0FDMUIsT0FBUSxHQUF3RCxDQUFDLENBQUMsQ0FBTyxDQUM5RSxDQUVBLFNBQVMsR0FBMkIsRUFBdUIsRUFBNEIsQ0FDckYsSUFBTSxFQUFXLEdBQUcsRUFBTyxNQUFRLE1BQVEsT0FBTyxHQUFHLElBQy9DLEVBQWdCLEdBQTZCLElBQUksQ0FBUSxFQUMvRCxHQUFJLEVBQWUsT0FBTyxFQUUxQixJQUFNLEVBQVUsR0FBNEIsRUFBUSxDQUFVLEVBRTlELE9BREEsR0FBNkIsSUFBSSxFQUFVLENBQU8sRUFDM0MsQ0FDVCxDQUVBLFNBQVMsR0FBNEIsRUFBdUIsRUFBNEIsQ0FPdEYsT0FKSyxHQUEwQixFQUFRLENBQVUsRUFJMUMsR0FBbUMsRUFBWSxHQUFvQixDQUFNLENBQUMsRUFIeEUsR0FBK0IsQ0FBVSxDQUlwRCxDQUVBLFNBQVMsR0FBbUMsRUFBb0IsRUFBa0MsQ0FDaEcsSUFBTSxFQUFRLEdBQW1CLENBQVUsRUFDckMsRUFBZ0IsR0FBK0IsQ0FBVSxFQUMvRCxHQUFJLElBQWtCLEtBQU8sR0FBeUIsRUFBTSxHQUFnQixDQUFnQixFQUMxRixPQUFPLEVBR1QsSUFBTSxFQUFNLEtBQUssSUFBSSxFQVFyQixPQVBpQixPQUFPLFFBQVEsQ0FBSyxDQUFDLENBQ25DLFFBQVEsQ0FBQyxLQUFhLEVBQU8sTUFBTSxDQUFPLENBQUMsQ0FBQyxDQUM1QyxRQUFRLENBQUMsTUFBYyxFQUFPLFdBQVcsQ0FBTyxDQUFDLEVBQUUsUUFBVSxLQUFPLENBQUMsQ0FBQyxDQUN0RSxRQUFRLEVBQUcsS0FBaUIsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFXLENBQUMsQ0FBQyxDQUFDLENBQ3JFLFFBQVEsRUFBRyxLQUFpQixFQUFNLEtBQUssTUFBTSxDQUFXLEdBQUssQ0FBZ0IsQ0FBQyxDQUM5RSxVQUFVLENBQUMsR0FBVyxDQUFDLEtBQWMsRUFBTyxTQUFTLEVBQVUsQ0FBUSxDQUU1RCxDQUFDLENBQUMsRUFBRSxHQUFHLElBQU0sR0FDN0IsQ0FFQSxTQUFTLEdBQXlCLEVBQWlDLEVBQW1DLENBQ3BHLEdBQUksQ0FBQyxFQUFhLE1BQU8sR0FDekIsSUFBTSxFQUFnQixLQUFLLE1BQU0sQ0FBVyxFQUM1QyxPQUFPLE9BQU8sU0FBUyxDQUFhLEdBQUssS0FBSyxJQUFJLEVBQUksR0FBaUIsQ0FDekUsQ0FFQSxTQUFTLEdBQW1CLEVBQTRDLENBQ3RFLElBQU0sRUFBYyxFQUFXLFFBQVEsWUFBYSxFQUFFLEVBQ2hELEVBQWMsR0FBcUIsSUFBSSxDQUFXLEVBQ3hELEdBQUksRUFBYSxPQUFPLEVBRXhCLElBQU0sRUFBUyxFQUNiLE1BQ0EsQ0FBQyxPQUFRLEVBQWEsT0FBUSxTQUFVLG9CQUFvQixFQUM1RCxRQUFRLElBQUksQ0FDZCxFQUNBLEdBQUksQ0FBQyxFQUFRLE1BQU8sQ0FBQyxFQUVyQixHQUFJLENBQ0YsSUFBTSxFQUFTLEtBQUssTUFBTSxDQUFNLEVBRWhDLE9BREEsR0FBcUIsSUFBSSxFQUFhLENBQU0sRUFDckMsQ0FDVCxNQUFRLENBQ04sTUFBTyxDQUFDLENBQ1YsQ0FDRixDQUVBLFNBQVMsR0FBMEIsRUFBdUIsRUFBNkIsQ0FFckYsTUFBTyxFQURxQixFQUFPLE1BQVEsR0FBK0IsR0FBQSxDQUM5QyxLQUFNLEdBQVksR0FBd0IsRUFBUyxDQUFVLENBQUMsQ0FDNUYsQ0FFQSxTQUFTLEdBQW9CLEVBQStCLENBQzFELEdBQUksRUFBTyxNQUFPLE9BQU8sR0FBOEIsSUFFdkQsSUFBTSxFQUFVLG1CQUFtQixLQUFBLElBQTBCLEVBQzdELE9BQU8sT0FBTyxHQUFTLFFBQVEsTUFBUSxDQUFDLEVBQUksR0FBSyxHQUFLLEdBQUssR0FDN0QsQ0FFQSxTQUFTLEdBQXdCLEVBQWlCLEVBQTZCLENBQzdFLEdBQUksSUFBWSxFQUFZLE1BQU8sR0FDbkMsR0FBSSxDQUFDLEVBQVEsU0FBUyxHQUFHLEVBQUcsTUFBTyxHQUVuQyxJQUFNLEVBQWlCLEVBQVEsV0FBVyxzQkFBdUIsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLFdBQVcsSUFBSyxJQUFJLEVBQ3RHLE9BQVcsT0FBTyxJQUFJLEVBQWUsR0FBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQVUsQ0FDL0QsQ0FFQSxTQUFTLEdBQStCLEVBQTRCLENBQ2xFLE9BQU8sRUFBeUIsTUFBTyxDQUFDLE9BQVEsRUFBWSxVQUFXLG9CQUFvQixFQUFHLFFBQVEsSUFBSSxDQUFDLEdBQUssR0FDbEgsQ0FFQSxTQUFTLEdBQThCLEVBQXVCLEVBQTRCLENBRXhGLE9BREksSUFBZSxFQUFxQixHQUFHLEVBQVcsR0FBRyxHQUEyQixFQUFRLENBQVUsSUFDL0YsQ0FDVCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ00sQ0FDTixJQUFNLEVBQXFCLEdBQXlCLENBQU0sRUFDMUQsSUFBSyxJQUFNLEtBQWMsR0FDbkIsR0FBc0IsR0FBdUIsSUFBSSxDQUFVLEdBQzNELEdBQTBDLEVBQVMsRUFBUSxDQUFVLElBQ3pFLE9BQU8sRUFBUSxhQUFhLEdBQzVCLE9BQU8sRUFBUSxnQkFBZ0IsR0FDL0IsT0FBTyxFQUFRLGlCQUFpQixHQUVwQyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDUyxDQU1ULE9BTEssR0FBcUMsQ0FBTSxFQUM1QyxFQUFRLGlCQUFpQixHQUFvQixHQUkxQyxJQUFlLGlCQUFtQixDQUFDLENBQUMsRUFBUSxpQkFBaUIsT0FMVixFQU01RCxDQUVBLFNBQVMsR0FBeUIsRUFBZ0MsQ0FLaEUsT0FBUSxFQUFPLHNCQUF3QixDQUFDLEVBQU8sUUFBVyxHQUFnQyxFQUFPLE9BQU8sQ0FDMUcsQ0FFQSxTQUFTLEdBQWdDLEVBQTBCLENBTWpFLE9BTGtCLEVBQUcsU0FBUywyQ0FBNEMsQ0FDeEUsSUFBSyxFQUNMLElBQUssR0FDTCxPQUFRLENBQ1YsQ0FDZSxDQUFDLENBQUMsS0FBTSxHQUFhLENBQ2xDLEdBQUksQ0FDRixPQUFPLEdBQXdCLEtBQUssRUFBRyxhQUFhLEVBQUssUUFBUSxFQUFTLENBQVEsRUFBRyxNQUFNLENBQUMsQ0FDOUYsTUFBUSxDQUNOLE1BQU8sRUFDVCxDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDUyxDQU1ULE1BTEksQ0FBQyxHQUNELElBQW1CLEtBQ25CLEdBQXlCLENBQWMsRUFBVSxHQUc5QyxHQUF1QixJQUFJLENBQVUsR0FBSyxHQUFnQyxFQUFRLEVBQVksQ0FBYyxDQUNySCxDQUVBLFNBQVMsR0FBZ0MsRUFBdUIsRUFBb0IsRUFBaUMsQ0FFbkgsT0FBTyxHQURlLEdBQTJCLEVBQVEsQ0FDaEIsRUFBRyxDQUFjLENBQzVELENBRUEsU0FBUyxHQUFzQixFQUEwQixFQUFpQyxDQUN4RixJQUFNLEVBQXFCLEVBQU8sTUFBTSxDQUFnQixFQUNsRCxFQUFzQixFQUFPLE1BQU0sQ0FBYyxFQUN2RCxNQUFPLENBQUMsR0FBc0IsQ0FBQyxHQUF1QixFQUFPLEdBQUcsRUFBb0IsQ0FBbUIsQ0FDekcsQ0FFQSxTQUFTLEdBQXlCLEVBQTBCLENBQzFELE9BQU8sRUFBUSxXQUFXLFlBQVksQ0FDeEMsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUMyQixDQUMzQixJQUFNLEVBQXVCLEdBQXFDLENBQVUsRUFDNUUsR0FBSSxFQUNGLE9BQU8sR0FBd0MsRUFBc0IsRUFBWSxDQUFrQixFQUdyRyxJQUFNLEVBQStCLEdBQXFDLENBQWtCLEVBSzVGLE9BSkksRUFDSyxHQUF3QyxFQUE4QixDQUFrQixFQUcxRixDQUNULENBRUEsU0FBUyxHQUFxQyxFQUEyRCxDQUN2RyxHQUFJLE9BQU8sR0FBZSxTQUFVLENBQ2xDLEdBQUksQ0FBQyxFQUFXLFdBQVcsU0FBUyxFQUFHLE9BRXZDLEdBQU0sQ0FBQyxFQUFPLEdBQVEsRUFBVyxjQUFjLENBQVUsRUFFekQsTUFESSxDQUFDLEdBQVMsQ0FBQyxFQUFNLE9BQ2QsMEJBQTBCLEVBQU0sR0FBRyxFQUFLLEtBQ2pELENBRUEsSUFBTSxFQUFnQixHQUFZLElBQ2xDLEdBQUksT0FBTyxHQUFrQixTQUFVLE9BRXZDLElBQU0sRUFBVSxrRUFBa0UsS0FBSyxDQUFhLEVBQ3BHLEdBQUksQ0FBQyxFQUFTLE9BRWQsR0FBTSxFQUFHLEVBQU8sR0FBUSxFQUN4QixNQUFPLDBCQUEwQixFQUFNLEdBQUcsRUFBSyxLQUNqRCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDMkIsQ0FRM0IsTUFBTyxDQUNMLEdBUEEsT0FBTyxHQUFlLFNBQ2xCLEVBQ0EsT0FBTyxHQUF1QixTQUM1QixFQUNBLElBQUEsR0FJTixLQUFNLE1BQ04sSUFBSyxDQUNQLENBQ0YsQ0FFQSxTQUFnQixHQUFnQixFQUF1QixFQUF5RCxDQUM5RyxHQUFJLEVBQU8sTUFBTyxDQUNoQixJQUFNLEVBQWUsRUFBTyx1QkFBeUIsRUFBTyxnQ0FDdEQsRUFBa0MsQ0FDdEMsUUFBUyxtQ0FDVCxPQUFRLDZCQUNSLEtBQU0sb0JBQ04sV0FBWSwwQkFDWixLQUFNLGNBQ04sVUFBVyx5QkFDWCxPQUFRLHNCQUtSLGNBQWUsRUFBTyxVQUFVLGVBQWlCLHVCQUF5Qiw0QkFDNUUsRUFRQSxPQVBBLEdBQXFCLEVBQVEsRUFBUyxFQUFZLGFBQWEsR0FBcUIsQ0FBTSxHQUFHLEVBQzdGLEdBQXFCLEVBQVEsRUFBUyxFQUFZLENBQUMsUUFBUyxNQUFPLFFBQVMsT0FBUSxXQUFXLENBQUMsRUFDM0YsRUFFTSxFQUFPLFVBQVUsVUFDMUIsRUFBUSxXQUFhLGVBRnJCLE9BQU8sRUFBUSxVQUlWLENBQ1QsS0FBTyxDQUNMLElBQU0sRUFBZSxFQUFPLHVCQUF5QixFQUFPLGdDQUN0RCxFQUFZLEVBQWtCLENBQU0sRUFDcEMsRUFBVSxFQUFnQixDQUFNLEVBQ2hDLEVBQVUsRUFBVyxLQUN2QixFQUFrQyxDQUNwQyxRQUFTLCtCQUNULE9BQVEsR0FBcUIsRUFBVyxDQUFPLEVBRy9DLEtBQU0sU0FBUyxFQUFlLDZCQUErQixHQUFHLG9DQUNoRSxXQUFZLGtCQUNaLGNBQWUscUVBQ2YsVUFBVyxjQUNiLEVBK0NBLE9BOUNJLElBQ0YsRUFBUSxTQUFXLHlFQUF5RSxFQUFXLGFBQWEsS0FBSyxHQUFHLEVBQUUsZ0NBRTVILEVBQU8sNEJBQ1QsRUFBVSxFQUNSLENBQUUsR0FBRyxDQUFRLEVBQ2IsQ0FDRSxPQUFRLEdBQUcsRUFBUSxPQUFPLG1FQUMxQixLQUFNLDhEQUNOLFdBQVksa0VBRVosS0FBTSx3REFDTixVQUFXLGtFQUNiLENBQ0YsRUFDSSxJQUNGLEVBQVEsU0FBVyx5RUFBeUUsRUFBVyxhQUFhLEtBQ2xILEdBQ0YsRUFBRSxtREFFSyxFQUFPLFVBQVUsVUFDMUIsRUFBUSxVQUFZLEVBQVEsVUFBWSxHQUFHLEVBQVEsVUFBVSxNQUFRLEdBQ3JFLEVBQVEsV0FBYSxXQUVuQixHQUFTLFNBQVMsU0FBUyxJQUM3QixFQUFRLEtBQU8sR0FFWixJQUNILE9BQU8sRUFBUSxlQUNmLE9BQU8sRUFBUSxLQUNmLE9BQU8sRUFBUSxhQUVaLEVBRU0sRUFBTyxVQUFVLEtBQzFCLEVBQVEsVUFBWSxnQkFGcEIsT0FBTyxFQUFRLFVBSWIsR0FBWSxFQUFPLFdBQVcsR0FDaEMsRUFBUSxPQUFTLEVBQVcsUUFBVSx3RUFDdEMsRUFBUSxlQUFpQixFQUFXLGdCQUFrQix1QkFFdEQsRUFBUSxPQUFTLFlBQ2pCLEVBQVEsZUFBaUIsb0JBRTNCLEdBQXFCLEVBQVEsRUFBUyxFQUFZLEdBQXFCLENBQU0sQ0FBQyxFQUM5RSxHQUFxQixFQUFRLEVBQVMsRUFBWSxDQUFDLFFBQVMsTUFBTyxRQUFTLE9BQVEsV0FBVyxDQUFDLEVBQ3pGLENBQ1QsQ0FDRixDQUVBLFNBQVMsR0FBc0IsRUFBZ0MsQ0FDN0QsT0FBTyxFQUFPLFVBQVUsV0FBYSxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQU8sUUFBUyxNQUFNLENBQUMsQ0FDdEYsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUNGLENBQUMsRUFBTyxVQUFVLFFBQVUsQ0FBQyxFQUFPLFVBQVUsVUFFbEQsR0FBb0IsRUFBUyxFQUFZLHNCQUF1QixHQUFHLEVBQVksYUFBYSxFQUM1RixHQUFvQixFQUFTLEVBQVksYUFBYyxHQUFHLEVBQVksNkJBQTZCLEVBQ25HLEdBQW9CLEVBQVMsRUFBWSxVQUFXLEdBQUcsRUFBWSxRQUFRLEVBQzdFLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ00sQ0FDTixJQUFNLEVBQVksRUFBVyxHQUc3QixFQUFRLEdBQVEsR0FBYSxDQUFDLEdBQTBCLENBQVMsRUFBSSxFQUFZLENBQ25GLENBRUEsU0FBUyxHQUEwQixFQUF5QixDQUMxRCxNQUFPLDBCQUEwQixLQUFLLENBQU0sQ0FDOUMsQ0FFQSxTQUFTLEdBQXFCLEVBQThDLENBRTFFLE9BREksRUFBTyxVQUFVLE9BQWUsWUFDN0IsT0FDVCxDQUVBLFNBQVMsR0FBWSxFQUErQyxDQUNsRSxPQUFPLEdBQWEsT0FBUyxDQUMvQixDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNNLENBQ04sSUFBSyxJQUFNLEtBQVEsRUFBTyxDQUV4QixHQURJLENBQUMsR0FBWSxFQUFRLENBQUksR0FDekIsR0FBOEIsRUFBUSxDQUFJLEVBQUcsU0FLakQsSUFBTSxFQUFZLEdBQTJCLEVBQVcsR0FBTyxDQUFJLEVBQy9ELElBQWMsSUFBQSxJQUFhLEVBQVcsSUFBUyxFQUFFLEtBQVEsS0FDN0QsRUFBUSxHQUFRLEdBQUcsR0FBYSxHQUFHLFdBQVcsSUFDaEQsQ0FDRixDQU9BLFNBQVMsR0FBMkIsRUFBaUIsRUFBa0MsQ0FDakYsVUFBTyxHQUFXLFNBTXRCLE9BSGMsSUFBSSxPQUFPLE9BQU8sR0FBRyxrREFBa0RFLEdBQWEsQ0FBSSxFQUFFLEdBQUksR0FBRyxDQUFDLENBQUMsS0FDL0csRUFBTyxLQUFLLENBRUgsQ0FBQyxHQUFHLEVBQ2pCLENBRUEsU0FBUyxHQUFZLEVBQXVCLEVBQXVCLENBQ2pFLE9BQU8sT0FBTyxPQUFPLEVBQU8sVUFBVyxDQUFJLENBQzdDLENBRUEsU0FBUyxHQUE4QixFQUF1QixFQUF1QixDQUNuRixJQUFNLEVBQU8sRUFBTyxVQUFVLEdBRzlCLE9BRkssRUFFRSxDQURrQixNQUFPLE9BQVEsTUFBTyxNQUMxQixDQUFDLENBQUMsS0FBTSxHQUMzQixJQUFJLE9BQU8sT0FBTyxHQUFHLEtBQUssRUFBZSxnQkFBZ0JBLEdBQWEsQ0FBSSxFQUFFLHNCQUF1QixHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUksQ0FDbkgsRUFKa0IsRUFLcEIsQ0FFQSxTQUFTQSxHQUFhLEVBQXVCLENBQzNDLE9BQU8sRUFBTSxXQUFXLHNCQUF1QixPQUFPLEdBQUcsS0FBSyxDQUNoRSxDQUVBLFNBQVMsR0FBcUIsRUFBb0IsRUFBMEIsQ0FDMUUsSUFBTSxFQUFXLENBQUMsbUJBQW1CLEVBT3JDLE9BTkksR0FDRixFQUFTLEtBQUssa0JBQWtCLEVBRTlCLEdBQ0YsRUFBUyxLQUFLLGVBQWUsRUFFeEIsRUFBUyxLQUFLLE1BQU0sQ0FDN0IsQ0FFQSxlQUFlLEdBQXVCLEVBQWtDLENBQ3RFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBUyxpQkFBaUIsRUFDbEQsRUFBa0IsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sQ0FBQyxDQUFDLFVBQVksRUFBRSxFQUM3RSxFQUFRLEVBQWdCLFFBQVEsRUFBZSxlQUFlLEVBWXBFLE9BWEksSUFBVSxHQUFXLEdBV2xCLEdBVGlCLEVBQWdCLE1BQU0sRUFBRyxDQUNyQixDQUFDLENBQzFCLE1BQU07Q0FBSSxDQUFDLENBQ1gsSUFBSyxHQUFTLENBQ2IsSUFBTSxFQUFVLEVBQUssS0FBSyxFQUMxQixPQUFPLEVBQVEsU0FBUyxHQUFHLEVBQUksRUFBUSxNQUFNLEVBQUcsRUFBRSxFQUFJLENBQ3hELENBQUMsQ0FBQyxDQUNELE9BQVEsR0FBTSxHQUFLLENBQUMsRUFBRSxXQUFXLEdBQUcsR0FBSyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBRTdDLENBQUMsQ0FBQyxJQUFLLEdBQVMsU0FBUyxFQUFLLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQzlELENBRUEsU0FBUyxHQUF3QixFQUFvQyxDQUNuRSxPQUFPLEVBQVEsU0FDZixJQUFNLEVBQXlFLENBQzdFLEVBQVEsYUFDUixFQUFRLGdCQUNSLEVBQVEsZ0JBQ1YsRUFDQSxJQUFLLElBQU0sS0FBVyxFQUNmLElBQ0wsT0FBTyxFQUFRLFNBQ2YsT0FBTyxFQUFRLHdCQUNmLE9BQU8sRUFBUSwwQkFDZixPQUFPLEVBQVEsZ0NBQ2YsT0FBTyxFQUFRLG1CQUVuQixDQUVBLGVBQWUsR0FBc0IsRUFBNkMsQ0FDaEYsSUFBTSxFQUFlLElBQUksSUFBSSxDQUFDLEdBQUcsT0FBTyxLQUFLLEVBQVEsWUFBWSxFQUFHLEdBQUcsT0FBTyxLQUFLLEVBQVEsZUFBZSxDQUFDLENBQUMsRUFhNUcsTUFBTSxRQUFRLElBQ1osQ0FSQSxDQUFFLFlBQWEsb0JBQXFCLEtBQU0sT0FBUSxPQUFRLGNBQWUsRUFDekUsQ0FBRSxZQUFhLHNCQUF1QixLQUFNLGNBQWUsT0FBUSxjQUFlLEVBQ2xGLENBQUUsWUFBYSw2QkFBOEIsS0FBTSxnQkFBaUIsT0FBUSxpQkFBa0IsRUFDOUYsQ0FBRSxZQUFhLHFCQUFzQixLQUFNLFFBQVMsT0FBUSxjQUFlLEVBQzNFLENBQUUsWUFBYSx5QkFBMEIsS0FBTSxZQUFhLE9BQVEsY0FBZSxDQUlyRSxDQUFDLENBQUMsSUFBSSxNQUFPLENBQUUsY0FBYSxPQUFNLFlBQWEsQ0FDdkQsQ0FBQyxFQUFhLElBQUksQ0FBVyxHQUFLLEdBQW1CLEVBQVMsQ0FBVyxJQUk3RSxRQUFRLGVBQWUsRUFGSCxJQUFXLGVBQWlCLGtCQUFvQixnQkFFdkIsQ0FBVyxFQUN4RCxFQUFRLEVBQU8sQ0FBQyxHQUFlLE1BQU0sR0FBaUMsQ0FBSSxFQUM1RSxDQUFDLENBQ0gsQ0FDRixDQUVBLGVBQWUsR0FBaUMsRUFBK0IsQ0FFN0UsTUFBTyxpQ0FBaUMsRUFBSyxPQUFPLE1BRDNCLEdBQW9CLGlCQUFrQixDQUFJLEdBRXJFLENBRUEsU0FBUyxHQUFtQixFQUFzQixFQUE4QixDQUM5RSxPQUFRLEVBQVEsa0JBQWtCLElBQWdCLEVBQVEsZUFBZSxJQUFnQixHQUFBLENBQUksU0FBUyxXQUFXLENBQ25ILENDcDBDQSxNQUFNLEdBQXFELENBQ3pELGFBQWMsYUFDZCxhQUFjLENBQ1osS0FBTSxDQUNKLENBQ0UsS0FBTSxVQUNOLE9BQVEsYUFDUixPQUFRLE1BQ1YsQ0FDRixDQUNGLEVBQ0EsV0FBWSxDQUNWLEtBQU0sQ0FDSixDQUNFLEtBQU0sUUFDTixPQUFRLFdBQ1IsT0FBUSxNQUNWLENBQ0YsQ0FDRixDQUNGLEVBRU0sR0FBb0QsQ0FDeEQsS0FBTSxDQUNKLENBQ0UsS0FBTSxVQUNOLEtBQU0sR0FDTixJQUFLLEdBQ0wsWUFBYSxFQUNmLEVBQ0EsQ0FDRSxLQUFNLG1CQUNOLEtBQU0sbUJBQ04sSUFBSzs7Ozs7Ozs7ZUFXUCxDQUNGLENBQ0YsRUFFTSxHQUFVLENBQ2QsVUFBVzs7Ozs7Ozs7RUFXYixFQUVBLGVBQXNCLEdBQW9DLEVBQXNDLENBQzlGLE9BQU8sRUFBTywwQkFBMEIsc0NBQXVDLFNBQVksQ0FDekYsTUFBTSxHQUFLLENBQU0sQ0FDbkIsQ0FBQyxDQUNILENBRUEsZUFBZSxHQUFLLEVBQXNDLENBQ3hELElBQU0sRUFBVSxFQUFLLFFBQVEsRUFBTyxRQUFTLFdBQVcsRUFDbEQsRUFBZSxFQUFLLFFBQVEsRUFBTyxRQUFTLFFBQVEsRUFDcEQsRUFBYyxFQUFHLFdBQVcsQ0FBWSxFQUN4QyxDQUFFLFFBQVMsR0FBZ0IsRUFBUSxDQUFDLENBQUMsRUFDckMsRUFBc0MsQ0FDMUMsR0FBRyxHQUNILGFBQWMsQ0FDWixLQUFNLEdBQWlCLENBQU0sQ0FDL0IsQ0FDRixFQXlCQSxHQXhCSyxHQUNILE9BQU8sRUFBUyxZQUVsQixNQUFNLFFBQVEsSUFBSSxDQUNoQixFQUFHLFNBQVMsVUFDVixFQUFLLEtBQUssRUFBTyxRQUFTLGNBQWMsRUFDeEMsRUFBSyxLQUFLLEVBQVUsQ0FDbEIsVUFBVyxHQUNYLGFBQWMsR0FDZCxPQUFRLENBQ04sU0FBVSxPQUNaLENBQ0YsQ0FBQyxDQUNILEVBQ0EsRUFBRyxTQUFTLEdBQUcsRUFBUyxDQUFFLE1BQU8sR0FBTSxVQUFXLEVBQUssQ0FBQyxDQUMxRCxDQUFDLEVBQ0csSUFDRixNQUFNLFFBQVEsSUFBSSxDQUNoQixFQUFHLFNBQVMsR0FBRyxFQUFjLENBQUUsTUFBTyxHQUFNLFVBQVcsRUFBSyxDQUFDLEVBQzdELEVBQUcsU0FBUyxHQUFHLEVBQUssUUFBUSxFQUFPLFFBQVMsZUFBZSxFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FDL0UsQ0FBQyxFQUNELEVBQVUsTUFBTyxDQUFDLFNBQVUsVUFBVyxnQkFBZ0IsRUFBRyxFQUFPLE9BQU8sR0FHdEUsRUFBTSxDQUNSLElBQU0sRUFBVSxHQUFpQixDQUFNLEVBQ3ZDLEVBQUcsVUFBVSxFQUFLLEtBQUssRUFBUyxVQUFVLEVBQUcsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUNoRSxNQUFNLEVBQUcsU0FBUyxVQUFVLEVBQUssS0FBSyxFQUFTLFdBQVksVUFBVSxFQUFHLEVBQVU7RUFBTSxDQUN0RixLQUFNLEdBQ1IsQ0FBQyxDQUNILENBQ0EsSUFBTSxFQUFtQixHQUFHLEdBQVEsVUFBVSxNQUFNLEdBQTBCLENBQU0sQ0FBQyxDQUFDLEtBQUs7Q0FBSSxFQUFFLElBQ2pHLEVBQUcsVUFBVSxFQUFLLEtBQUssRUFBUyxZQUFZLEVBQUcsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUNsRSxNQUFNLEVBQUcsU0FBUyxVQUFVLEVBQUssUUFBUSxFQUFTLGFBQWMsWUFBWSxFQUFHLEVBQWtCLENBQy9GLEtBQU0sR0FDUixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQWlCLEVBQStCLENBQ3ZELElBQUksRUFDSixBQUtFLEVBTEUsRUFBTyxNQUdLLG9CQUVBLEVBQU8sVUFBVSxHQUFLLGVBQWlCLGdCQUV2RCxJQUFNLEVBQW1CLEdBQUcsRUFBWSxVQWdCeEMsT0FkSSxFQUFPLFlBQVksV0FBVyx3QkFBd0IsRUFDakQ7Ozs7Ozs7Ozs7RUFVVCxFQUFpQjtFQUNqQixLQUFLLEVBRUUsQ0FDVCxDQUVBLFNBQVMsR0FBaUIsRUFBc0MsQ0FDOUQsT0FBTyxHQUFrQixLQUFLLElBQUssR0FDakMsRUFBSSxPQUFTLFVBQ1QsQ0FDRSxHQUFHLEVBQ0gsS0FBTSxHQUFnQixDQUFNLEVBQzVCLElBQUssR0FBa0IsQ0FBTSxDQUMvQixFQUNBLENBQ04sQ0FDRixDQUVBLFNBQVMsR0FBZ0IsRUFBK0IsQ0FHdEQsSUFBTSxFQUNKLEVBQU8sT0FBUyxFQUFPLFVBQVUsSUFBTSxFQUFnQixDQUFNLEVBQUksQ0FBQyxHQUFHLEVBQVcsWUFBWSxFQUFJLENBQUMsRUFXbkcsT0FWSSxFQUFrQixDQUFNLEdBQzFCLEVBQW9CLEtBQUssR0FBRyxFQUFXLE1BQU8sR0FBRyxFQUFXLE1BQU0sR0FFaEUsRUFBTyx1QkFBeUIsRUFBTyxvQkFDekMsRUFBb0IsS0FBSyxJQUFJLEVBRTNCLEVBQU8sd0JBQ1QsRUFBb0IsS0FBSyxNQUFNLEVBRzFCLFNBRG9CLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBbUIsQ0FBQyxDQUFDLENBQUMsU0FDNUIsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLEVBQy9DLENBRUEsU0FBUyxHQUFrQixFQUErQixDQUN4RCxHQUFJLEdBQW9CLENBQU0sRUFDNUIsTUFBTyxRQUFPLEdBQUc7OztFQUduQixLQUFLLEVBSUwsSUFBTSxFQUF5QixFQUFrQixDQUFNLEdBQUssRUFBZ0IsQ0FBTSxFQUNsRixJQUFLLEVBQU8sT0FBUyxFQUFPLFVBQVUsS0FBTyxFQUMzQyxNQUFPOztFQUVULEVBQU8sTUFBUSxlQUFpQixVQUFVO0VBQzFDLEtBQUssRUFHTCxJQUFNLEVBQWdCLEVBQVcsT0FBTyxJQUFLLEdBQWMsT0FBTyxHQUFHLEtBQUssRUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFDMUYsRUFBZSxFQUFXLE1BQU0sSUFBSyxHQUFjLE9BQU8sR0FBRyxLQUFLLEVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQ3hGLEVBQWtCLEVBQVcsYUFBYSxJQUFLLEdBQWMsT0FBTyxHQUFHLEtBQUssRUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFDbEcsRUFBWSxFQUFrQixDQUFNLEVBQ3BDLEVBQVUsRUFBZ0IsQ0FBTSxFQUV0QyxNQUFPLFFBQU8sR0FBRzs7RUFFakIsRUFBWSxPQUFPLEdBQUcsNERBQTRELEVBQWMsY0FBZ0IsR0FBRztFQUNuSCxFQUFZLE9BQU8sR0FBRywyREFBMkQsRUFBYSxpREFBbUQsR0FBRztFQUNwSixFQUFVLE9BQU8sR0FBRyw4REFBOEQsRUFBZ0IsY0FBZ0IsR0FBRzs7RUFFckgsR0FBd0IsQ0FBTSxFQUFJLE9BQU8sR0FBRywyRUFBNkUsR0FBRztFQUM1SCxFQUFPLHVCQUF5QixPQUFPLEdBQUcscUpBQXVKLEdBQUc7O0VBR3BNLEVBQ0ksT0FBTyxHQUFHOzs7O0VBS1YsR0FDTDtFQUVDLEVBQ0ksT0FBTyxHQUFHOztJQUdWLEdBQ0w7RUFFQyxFQUNJLE9BQU8sR0FBRzs7OztFQUtWLEdBQ0w7Ozs7RUFLQyxHQUF3QixDQUFNLEVBQzFCO0lBQ0YsR0FBZ0IsQ0FBTSxFQUFFO0lBQ3hCLEdBQWdCLENBQU0sRUFBRTtJQUN4QixHQUFnQixDQUFNLEVBQUU7SUFFdEIsR0FDTDtFQUVDLEVBQU8sdUJBQ0g7O0lBR0EsR0FDTDtFQUNDLEtBQUssQ0FDUCxDQUVBLFNBQVMsR0FBb0IsRUFBZ0MsQ0FDM0QsR0FBSSxDQUFDLEVBQU8sT0FBUSxNQUFPLEdBRTNCLElBQU0sRUFBeUIsRUFBSyxRQUFRLEVBQU8sUUFBUyxXQUFZLEtBQU0sY0FBYyxFQUM1RixHQUFJLENBQUMsRUFBRyxXQUFXLENBQXNCLEVBQUcsTUFBTyxHQUVuRCxHQUFJLENBRUYsT0FEb0IsS0FBSyxNQUFNLEVBQUcsYUFBYSxFQUF3QixNQUFNLENBQzVELENBQUMsQ0FBQyxPQUFTLGlCQUM5QixNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FFQSxTQUFTLEdBQTBCLEVBQWlDLENBQ2xFLElBQU0sRUFBOEIsQ0FBQyxFQUNyQyxHQUFJLEVBQU8sbUJBQW9CLENBQzdCLElBQU0sRUFBc0IsT0FBTyxHQUFHLHlEQUN0QyxFQUFrQixLQUFLLE9BQU8sR0FBRyxtQkFBbUIsRUFBb0IsaUJBQWlCLENBQzNGLENBQ0EsSUFBTSxFQUFpQixFQUFPLE1BQVEsY0FBZ0IsT0FDaEQsRUFBa0IsRUFBTyxVQUFVLE9BQVMsRUFBTyxVQUFVLEtBQU8sbUJBQXFCLEdBQy9GLEVBQWtCLEtBQUssT0FBTyxHQUFHLG1DQUFtQyxJQUFpQixFQUFnQixFQUFFLEVBQ25HLEVBQU8sdUJBQ1QsRUFBa0IsS0FBSyxPQUFPLEdBQUcsZ0RBQWdELEVBRS9FLEVBQU8sbUJBQ1QsRUFBa0IsS0FBSyxPQUFPLEdBQUcsOENBQThDLEVBRTdFLEVBQU8sVUFBVSxNQUNuQixFQUFrQixLQUNoQixPQUFPLEdBQUcsbUZBQ1YsT0FBTyxHQUFHLDZFQUNWLE9BQU8sR0FBRyxvRUFDWixFQUNTLEVBQU8sVUFBVSxRQUMxQixFQUFrQixLQUNoQixPQUFPLEdBQUcsd0VBQ1YsT0FBTyxHQUFHLHlFQUNaLEVBRUYsSUFBTSxFQUFtQixHQUFvQixFQUFRLEVBQU8sYUFBYSxPQUFPLEVBS2hGLE9BSkksR0FFRixFQUFrQixLQUFLLE9BQU8sR0FBRyx5Q0FBeUMsRUFBaUIsRUFBRSxFQUV4RixDQUNULENBRUEsU0FBUyxHQUF3QixFQUFnQyxDQUMvRCxPQUFPLEVBQU8sdUJBQXlCLEVBQU8saUJBQ2hELENBRUEsU0FBUyxHQUFnQixFQUFnRCxDQUN2RSxPQUFPLEVBQU8sa0JBQW9CLFNBQVcsWUFDL0MsQ0NwVkEsZUFBc0IsR0FBcUIsRUFBc0MsQ0FDL0UsT0FBTyxFQUFPLDBCQUEwQix1QkFBd0IsU0FBWSxDQUMxRSxNQUFNLFFBQVEsSUFBSSxDQUNoQixFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsR0FBRyxFQUFPLFFBQVEsb0JBQXFCLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUM1RixFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsR0FBRyxFQUFPLFFBQVEsbUJBQW9CLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUMzRixFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsR0FBRyxFQUFPLFFBQVEscUJBQXNCLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxDQUMvRixDQUFDLENBQ0gsQ0FBQyxDQUNILENDZEEsU0FBZ0IsR0FBdUIsRUFBaUQsQ0FDdEYsT0FBTyxHQUFTLEtBQUssQ0FDdkIsQ0NZQSxJQUFhLEdBQWIsS0FBaUMsQ0FDL0IsV0FFQSxhQUVBLFNBRUEsWUFBWSxFQUFxQyxDQUMvQyxLQUFLLFdBQWEsRUFBUSxXQUMxQixLQUFLLGFBQWUsRUFBUSxhQUM1QixLQUFLLFNBQVcsRUFBUSxRQUMxQixDQUVBLGlCQUFpQixFQUEwQyxDQUt6RCxPQUpLLEVBQVEsaUJBQ1QsS0FBSyxpQkFBaUIsRUFBUSxlQUFlLEVBQ3hDLEtBQUsscUJBQXFCLEVBQVEsZ0JBQWlCLEVBQVEsZUFBZ0IsRUFBUSxRQUFRLEVBRTdGLEVBQVEsY0FDakIsQ0FFQSxTQUFTLEVBQTRCLEVBQXlCLENBQzVELE1BQU8sR0FBRyxLQUFLLGVBQWUsQ0FBUyxFQUFFO0VBQzNDLEVBQVE7RUFDUixLQUFLLGFBQWEsQ0FBUyxHQUMzQixDQUVBLGlCQUFpQixFQUEwQixDQUN6QyxPQUFPLEtBQUssV0FBVyxLQUFNLEdBQWMsRUFBUSxTQUFTLEtBQUssZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUM3RixDQUVBLHFCQUE2QixFQUF5QixFQUF3QixFQUEwQixDQUN0RyxJQUFJLEVBQVUsRUFDZCxJQUFLLElBQU0sS0FBYSxLQUFLLFdBQVksQ0FDdkMsSUFBTSxFQUFjLEtBQUssb0JBQW9CLEVBQWdCLENBQVMsRUFDdEUsR0FBSSxDQUFDLEVBQWEsU0FFbEIsSUFBTSxFQUFjLEtBQUssb0JBQW9CLEVBQVMsRUFBVyxDQUFXLEVBQzVFLEdBQUksQ0FBQyxFQUVILE9BREEsUUFBUSxLQUFLLCtCQUErQixFQUFVLFlBQVksS0FBSyxTQUFTLFdBQVcsR0FBVSxFQUM5RixFQUVULEVBQVUsQ0FDWixDQUNBLE9BQU8sQ0FDVCxDQUVBLG9CQUE0QixFQUFpQixFQUFnRCxDQUMzRixPQUFPLEtBQUssc0JBQXNCLENBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBTyxDQUFDLEdBQUcsRUFDL0QsQ0FFQSxvQkFBNEIsRUFBaUIsRUFBNEIsRUFBeUMsQ0FDaEgsSUFBTSxFQUFVLEtBQUssc0JBQXNCLENBQVMsRUFDL0MsS0FBUSxLQUFLLENBQU8sRUFDekIsT0FBTyxFQUFRLFFBQVEsRUFBUyxDQUFXLENBQzdDLENBRUEsc0JBQThCLEVBQW9DLENBQ2hFLE9BQVcsT0FDVCxHQUFHQyxHQUFhLEtBQUssZUFBZSxDQUFTLENBQUMsRUFBRSxZQUFZQSxHQUFhLEtBQUssYUFBYSxDQUFTLENBQUMsR0FDdkcsQ0FDRixDQUVBLGVBQXVCLEVBQW9DLENBQ3pELE1BQU8saUJBQWlCLEtBQUssYUFBYSxHQUFHLEdBQy9DLENBRUEsYUFBcUIsRUFBb0MsQ0FDdkQsTUFBTyxlQUFlLEtBQUssYUFBYSxHQUFHLEdBQzdDLENBQ0YsRUFFQSxTQUFTQSxHQUFhLEVBQXVCLENBQzNDLE9BQU8sRUFBTSxXQUFXLHNCQUF1QixPQUFPLEdBQUcsS0FBSyxDQUNoRSxDQzdFQSxNQUFNQyxFQUFzQixJQUFJLEdBQW9CLENBQ2xELFdBQVksQ0FBQyxPQUFRLFFBQVEsRUFDN0IsYUFBYyxRQUNkLFNBQVUsT0FDWixDQUFDLEVBRUQsZUFBc0IsR0FBb0IsRUFBc0MsQ0FDOUUsT0FBTyxFQUFPLDBCQUEwQixzQkFBdUIsU0FBWSxDQUN6RSxJQUFNLEVBQXVCLEVBQUssUUFBUSxFQUFPLFFBQVMsZUFBZSxFQUNuRSxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsaUJBQWlCLEVBQ3pELEVBQWtCLE1BQU0sRUFBTyxzQkFBc0IsQ0FBUSxFQUM3RCxFQUFpQkEsRUFBb0IsaUJBQWlCLENBQzFELGVBQWdCQyxHQUFpQixDQUFNLEVBQ3ZDLGtCQUNBLFVBQ0YsQ0FBQyxFQUNLLEVBQVcsQ0FBQyxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBc0IsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLENBQUMsRUFDMUYsR0FBdUIsQ0FBZSxJQUFNLEdBQXVCLENBQWMsR0FDbkYsRUFBUyxLQUFLLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFjLENBQUMsQ0FBQyxFQUVwRixNQUFNLFFBQVEsSUFBSSxDQUFRLENBQzVCLENBQUMsQ0FDSCxDQUVBLFNBQVNBLEdBQWlCLEVBQStCLENBbUJ2RCxPQWhCSyxFQUFPLGFBZ0JMLEdBQUdELEVBQW9CLFNBQzVCLE9BQ0E7Ozs7aURBS0YsRUFBRTs7RUFFRkEsRUFBb0IsU0FBUyxTQUFVLHFDQUFxQyxFQUFFO0VBeEJyRSxHQUFHQSxFQUFvQixTQUM1QixPQUNBOzs7Ozs7NkVBT0YsRUFBRTs7RUFFSkEsRUFBb0IsU0FBUyxTQUFVLHVDQUF1QyxFQUFFO0NBZWxGLENDckRBLE1BQU0sRUFBc0IsSUFBSSxHQUFvQixDQUNsRCxXQUFZLENBQUMsT0FBUSxRQUFRLEVBQzdCLGFBQWMsU0FDZCxTQUFVLFFBQ1osQ0FBQyxFQUVELGVBQXNCLEdBQXFCLEVBQXVCLEVBQTJDLENBQzNHLE9BQU8sRUFBTywwQkFBMEIsdUJBQXdCLFNBQVksQ0FJMUUsSUFBTSxFQUFzQyxHQUFxQyxDQUFNLEVBQ2pGLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxrQkFBa0IsRUFDMUQsRUFBa0IsTUFBTSxFQUFPLHNCQUFzQixDQUFRLEVBRzdELEVBREosR0FBdUMsR0FBbUIsQ0FBQyxFQUFvQixpQkFBaUIsQ0FBZSxFQUU3RyxFQUNBLEdBQ0UsRUFBb0IsaUJBQWlCLENBQ25DLGVBQWdCLEdBQWlCLENBQU0sRUFDdkMsa0JBQ0EsVUFDRixDQUFDLENBQ0gsRUFFRSxFQUE0QixDQUFDLEVBQzlCLEdBQ0gsRUFBUyxLQUNQLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGdCQUFnQixFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUNyRyxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxZQUFZLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQ2pHLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGFBQWEsRUFBRyxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsRUFDbEcsRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssUUFBUSxFQUFPLFFBQVMsV0FBVyxFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUNoRyxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQ3BHLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGNBQWMsRUFBRyxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsRUFDbkcsRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssUUFBUSxFQUFPLFFBQVMsZ0JBQWdCLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQ3JHLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGdCQUFnQixFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUNyRyxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQ3BHLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLG1CQUFtQixFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUN4RyxFQUFZLFFBQVUsRUFBRyxTQUFTLEdBQUcsRUFBSyxRQUFRLEVBQU8sUUFBUyxrQkFBa0IsRUFBRyxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQUMsRUFDdkcsRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssUUFBUSxFQUFPLFFBQVMsbUJBQW1CLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLEVBQ3hHLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGtCQUFrQixFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxDQUN6RyxFQUVFLEdBQXVCLENBQWUsSUFBTSxHQUF1QixDQUFjLEdBQ25GLEVBQVMsS0FBSyxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBYyxDQUFDLENBQUMsRUFFcEYsTUFBTSxRQUFRLElBQUksQ0FBUSxDQUM1QixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQThCLEVBQXlCLENBQzlELE9BQU8sRUFBUSxXQUFXLHdCQUF5Qix1QkFBdUIsQ0FDNUUsQ0FFQSxTQUFTLEdBQWlCLEVBQStCLENBQ3ZELElBQU0sRUFBZSxFQUFPLE9BQ3RCLEVBQXlCLEdBQTBCLENBQU0sRUFzQi9ELE9BaEJLLEVBQU8sYUFnQkwsR0FBRyxFQUFvQixTQUM1QixPQUNBOztnQ0FFNEIsRUFBdUI7O0VBRXJELEdBQXlCLG1CQUFvQixDQUFZLEdBQ3pELEVBQUU7O0VBRUYsRUFBb0IsU0FBUyxTQUFVLHNDQUFzQyxFQUFFO0VBeEJ0RSxHQUFHLEVBQW9CLFNBQzVCLE9BQ0E7Ozs7OztFQU1KLEdBQXlCLCtDQUFnRCxDQUFZLEdBQ25GLEVBQUU7O0VBRUosRUFBb0IsU0FBUyxTQUFVLHdDQUF3QyxFQUFFO0NBZW5GLENBRUEsU0FBUyxHQUEwQixFQUErQixDQUNoRSxPQUFPLEVBQU8sYUFBYSxPQUFTLDZCQUErQixlQUFpQiw0QkFDdEYsQ0FFQSxTQUFTLEdBQXlCLEVBQXdCLEVBQStCLENBVXZGLE9BVEksRUFDSzs7NkRBRWtELEVBQWU7Ozt1R0FNbkU7Ozs2REFHb0QsRUFBZTtxQ0FFNUUsQ0NwR0EsZUFBc0IsR0FBdUIsRUFBc0MsQ0FDakYsT0FBTyxFQUFPLDBCQUEwQix5QkFBMEIsU0FBWSxDQUM1RSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxpQkFBaUIsRUFDL0QsR0FBSSxDQUFDLEVBQWdCLENBQU0sRUFBRyxDQUM1QixNQUFNLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFVLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUNyRSxNQUNGLENBQ0EsSUFBTSxFQUFXLE1BQU0sRUFBTyxzQkFBc0IsQ0FBUSxHQUFNLEdBQzVELEVBQWtCLEVBQWUsbUJBQW1CLENBQU8sRUFDM0QsRUFBa0IsRUFBZSxtQkFBbUIsQ0FBTyxFQUUzRCxFQUFvQixFQUFLLFFBQVEsRUFBTyxRQUFTLFlBQVksRUFDN0QsRUFBb0IsTUFBTSxFQUFlLCtCQUErQixDQUFpQixHQUFNLEdBRWpHLEVBQW9CLEdBQ3BCLEVBQU8seUJBQ1QsRUFBb0I7Ozs7R0FPdEIsSUFBTSxFQUFhLEVBQWtCOzs7Ozs7Ozs7OztFQUFnQixFQUFvQixFQUFtQixFQUM1RixNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENDdENBLE1BQU1FLEdBQVUsQ0FDZCxTQUFVLElBQ1YsS0FBTSxPQUNSLEVBRUEsZUFBc0IsR0FBMEIsRUFBc0MsQ0FDcEYsT0FBTyxFQUFPLDBCQUEwQiw0QkFBNkIsU0FBWSxDQUMvRSxJQUFJLEVBQXNCLGdCQUFnQkEsRUFBTyxFQUMzQyxFQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsb0JBQW9CLEVBQ2xFLEdBQUksQ0FDRixJQUFNLEVBQWEsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sRUFDeEQsRUFBYyxLQUFLLE1BQU0sQ0FBVSxFQUN6QyxFQUFjLEVBQU0sSUFBSSxDQUFDLEVBQWEsRUFBYSxDQUFXLEVBQUcsQ0FBRSxXQUFZLENBQWUsQ0FBQyxDQUNqRyxNQUFRLENBRVIsQ0FDQSxJQUFNLEVBQWEsS0FBSyxVQUFVLEVBQWEsSUFBQSxHQUFXLENBQUMsRUFDM0QsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQ25CQSxlQUFzQixHQUFpQixFQUFzQyxDQUMzRSxPQUFPLEVBQU8sMEJBQTBCLG1CQUFvQixTQUFZLENBQ3RFLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGdCQUFnQixFQUN4RCxFQUFVLE1BQU0sRUFBTyxzQkFBc0IsQ0FBUSxFQUMzRCxHQUFJLENBQUMsRUFBUyxPQUVkLElBQU0sRUFBYSxFQUFRLFFBQVEsZUFBZ0I7O2NBQW1CLEVBQ2xFLElBQWUsR0FFbkIsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQ1hBLGVBQXNCLEdBQWUsRUFBc0MsQ0FDekUsT0FBTyxFQUFPLDBCQUEwQixpQkFBa0IsU0FBWSxDQUNwRSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxXQUFXLEVBQ3JELEVBQWEsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sRUFFeEQsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMsaUJBQWlCLENBQUMsSUFDL0QsRUFBYSxHQUFZLEVBQVksdUtBQW9CLEdBRzNELElBQU0sRUFBYSxFQUFPLFlBQVksTUFBTSxFQUFPLFdBQVcsUUFBUSxHQUFHLEVBQUksQ0FBQyxFQUN4RSxFQUFnQixFQUFLLFFBQVEsRUFBTyxRQUFTLFVBQVcsV0FBVyxFQUNuRSxFQUFZLEVBQUcsV0FBVyxDQUFhLEVBQUksRUFBRyxZQUFZLENBQWEsRUFBSSxDQUFDLEVBQ2xGLElBQUssSUFBTSxLQUFZLEVBQVcsQ0FDaEMsR0FBSSxDQUFDLEVBQVMsV0FBVyxNQUFNLEdBQUssQ0FBQyxFQUFTLFdBQVcsUUFBUSxFQUFHLFNBRXBFLElBQUksRUFBWSxFQUdoQixHQUZBLEdBQWEsRUFBVSxJQUFNLEdBQUEsQ0FBSSxZQUFZLEVBQUksRUFBVSxNQUFNLEVBQUcsRUFBVSxRQUFRLEdBQUcsQ0FBQyxFQUMxRixFQUFZLEVBQVUsUUFBUSxJQUFLLEdBQUcsRUFDbEMsQ0FBQyxFQUFZLFNBQ2pCLElBQU0sRUFBUSxNQUFNLEVBQVUsdUJBQXVCLEVBQVcscUJBQXFCLEVBQVMsa0NBQWtDLEVBQVcscUJBQXFCLEVBQVMsR0FDckssRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFPLFFBQVMscUJBQXFCLEdBQVUsQ0FBQyxJQUM3RSxFQUFhLEdBQXlCLEVBQVksRUFBVyxDQUFRLEVBQ3JFLEVBQWEsR0FBWSxFQUFZLENBQUssRUFFOUMsQ0FFQSxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENBRUEsU0FBZ0IsR0FBWSxFQUFnQixFQUF1QixDQUVqRSxFQUFTLEVBQU8sUUFBUSxFQUFPLEVBQUUsQ0FBQyxDQUFDLFdBQVcsV0FBWTs7Q0FBTSxFQUVoRSxJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBTyxPQUFRLElBQ2pDLEdBQUksRUFBTyxFQUFJLEtBQU87R0FBUSxFQUFPLEtBQU87RUFBTSxDQUNoRCxJQUFNLEVBQVMsRUFBTyxNQUFNLEVBQUcsRUFBSSxDQUFDLEVBQ2hDLEVBQVEsRUFBTyxNQUFNLEVBQUksQ0FBQyxFQUk5QixNQUhJLENBQUMsRUFBTSxXQUFXLEdBQUcsR0FBSyxDQUFDLEVBQU0sV0FBVyxHQUFHLElBQ2pELEVBQVEsS0FBSyxLQUVSLEdBQUcsSUFBUyxFQUFNLElBQUksR0FDL0IsQ0FFRixNQUFPLEdBQUcsRUFBTyxJQUFJLEVBQU0sR0FDN0IsQ0FFQSxTQUFnQixHQUF5QixFQUFnQixFQUFtQixFQUEwQixDQUNwRyxJQUFNLEVBQW1CLEdBQWEsQ0FBUyxFQUN6QyxFQUFrQixHQUFhLENBQVEsRUFDN0MsT0FBTyxFQUNKLFdBQ0MsSUFBSSxPQUNGLE9BQU8sR0FBRyxRQUFRLEVBQWlCLDhEQUE4RCxFQUFnQiwyRUFBMkUsRUFBZ0IsT0FDNU0sSUFDRixFQUNBLEVBQ0YsQ0FBQyxDQUNBLFdBQVcsV0FBWTs7Q0FBTSxDQUNsQyxDQUVBLFNBQVMsR0FBYSxFQUF1QixDQUMzQyxPQUFPLEVBQU0sV0FBVyxzQkFBdUIsT0FBTyxHQUFHLEtBQUssQ0FDaEUsQ0MvREEsZUFBc0IsR0FBa0IsRUFBMEMsQ0FDaEYsT0FBTyxFQUFPLDBCQUEwQixvQkFBcUIsU0FBWSxDQUN2RSxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQVcsUUFBUyxpQkFBaUIsRUFDbkUsR0FBSSxDQUFDLEVBQUcsV0FBVyxDQUFRLEVBQUcsT0FFOUIsSUFBTSxFQUFXLEtBQUssTUFBTSxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQVUsTUFBTSxDQUFDLEVBR2xFLEVBQVUsRUFBUyxTQUFXLENBQUMsRUFDckMsSUFBSyxJQUFJLEVBQUksRUFBRyxFQUFJLEVBQVEsT0FBUSxJQUFLLENBQ3ZDLElBQU0sRUFBYyxFQUFRLEdBQ3RCLEVBQVUsTUFBTSxRQUFRLENBQVcsRUFDbkMsRUFBUyxFQUFVLEVBQVksR0FBSyxFQUNwQyxFQUFhLEdBQVcsRUFBWSxJQUFPLENBQUMsRUFDOUMsSUFBVyxvQ0FDYixFQUFRLEdBQUssQ0FDWCxvQ0FDQSxFQUFNLElBQ0osQ0FDRSxFQUNBLENBQ0UsT0FBUSxxQkFDVixDQUNGLEVBQ0EsQ0FBRSxXQUFZLENBQWUsQ0FDL0IsQ0FDRixFQUNTLElBQVcsNkJBQ3BCLEVBQVEsR0FBSyxDQUNYLDJCQUNBLEVBQU0sSUFDSixDQUNFLEVBQ0EsQ0FFRSx3QkFBeUIsR0FDekIscUJBQXNCLEdBQ3RCLE9BQVEsQ0FBQyxxQkFBcUIsRUFDOUIsZUFBZ0IsQ0FBQyxxQkFBcUIsQ0FDeEMsQ0FDRixFQUNBLENBQUUsV0FBWSxDQUFlLENBQy9CLENBQ0YsRUFFSixDQUNBLElBQU0sRUFBYSxLQUFLLFVBQVUsRUFBVSxJQUFBLEdBQVcsQ0FBQyxFQUN4RCxNQUFNLEVBQVksUUFBVSxFQUFPLGFBQWEsRUFBVSxDQUFVLENBQUMsQ0FDdkUsQ0FBQyxDQUNILENDakRBLE1BQU0sR0FBVSxDQUNkLFFBQVMsb0RBQ1QsUUFBUyxDQUFDLHVEQUF1RCxDQUNuRSxFQU9BLGVBQXNCLEdBQXFCLEVBQXNDLENBQy9FLE9BQU8sRUFBTywwQkFBMEIsdUJBQXdCLFNBQVksQ0FDMUUsSUFBSSxFQUFjLGdCQUFnQixFQUFPLEVBQ25DLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEVBQzdELEdBQUksRUFBRyxXQUFXLEdBQUcsRUFBUyxFQUFFLEVBRTlCLE9BRUYsR0FBSSxDQUNGLElBQU0sRUFBYSxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQVUsTUFBTSxFQUN4RCxFQUFjLEtBQUssTUFBTSxDQUFVLEVBQ3pDLEVBQWMsRUFBTSxJQUFJLENBQUMsRUFBYSxFQUFhLENBQVcsRUFBRyxDQUMvRCxXQUFZLENBQ2QsQ0FBQyxFQUNELEVBQVksUUFBVSxHQUFxQixHQUFRLFFBQVMsRUFBWSxTQUFXLENBQUMsQ0FBQyxDQUN2RixNQUFRLENBRVIsQ0FHSSxFQUFPLFVBQVUsUUFDbkIsRUFBWSxlQUFpQixDQUFDLEVBRTNCLEVBQVksYUFBYSxLQUFNLEdBQzlCLEVBQUssbUJBQW1CLFNBQVMsTUFBTSxDQUN6QyxHQUVBLEVBQVksYUFBYSxLQUFLLENBQUUsa0JBQW1CLENBQUMsTUFBTSxFQUFHLFFBQVMsRUFBTSxDQUFDLEdBSWpGLE1BQU0sRUFBWSxRQUFVLEVBQUcsU0FBUyxHQUFHLEVBQUssUUFBUSxFQUFPLFFBQVMsYUFBYSxFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUN4RyxNQUFNLEVBQVksUUFBVSxFQUFHLFNBQVMsR0FBRyxFQUFLLFFBQVEsRUFBTyxRQUFTLGtCQUFrQixFQUFHLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxFQUM3RyxJQUFNLEVBQWEsS0FBSyxVQUFVLEVBQWEsSUFBQSxHQUFXLENBQUMsRUFDM0QsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBcUIsRUFBNEIsRUFBcUMsQ0FDN0YsTUFBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFrQixHQUFHLENBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFRLEdBQVMsSUFBUyxjQUFjLENBQ3pHLENDMURBLGVBQXNCLEdBQW1CLEVBQTJDLENBQ2xGLE9BQU8sRUFBTywwQkFBMEIscUJBQXNCLFNBQVksQ0FHMUUsQ0FBQyxDQUNILENDTUEsTUFBTSxHQUFjLENBQ2xCLGdCQUFpQixDQUNmLGFBQWMsR0FDZCx5QkFBMEIsR0FDMUIsNkJBQThCLEdBQzlCLGdCQUFpQixHQUNqQixrQkFBbUIsR0FDbkIsY0FBZSxHQUNmLE9BQVEsRUFDVixFQUNBLFFBQVMsQ0FBQywyQkFBNEIsZUFBZSxFQUNyRCxRQUFTLENBQ1AsY0FDQSx5QkFDQSwwQkFDQSxzQkFDQSx1QkFDQSxlQUNBLFdBQ0EsV0FDRixDQUNGLEVBRU0sR0FBYSxDQUNqQixnQkFBaUIsQ0FDZixhQUFjLEdBQ2QseUJBQTBCLEdBQzFCLDZCQUE4QixHQUM5QixnQkFBaUIsR0FDakIsa0JBQW1CLEdBQ25CLGNBQWUsR0FDZixPQUFRLEVBQ1YsRUFDQSxRQUFTLENBQUMsZUFBZSxFQUd6QixRQUFTLENBQUMsY0FBZSxlQUFnQixXQUFZLFdBQVcsQ0FDbEUsRUFFQSxlQUFzQixHQUFpQixFQUFzQyxDQUMzRSxPQUFPLEVBQU8sMEJBQTBCLG1CQUFvQixTQUFZLENBQ3RFLEdBQUksRUFBTyxVQUFVLE9BQVMsRUFBTyxVQUFVLEtBQU0sQ0FDbkQsTUFBTSxHQUFvQyxDQUFNLEVBQ2hELE1BQ0YsQ0FFQSxJQUFJLEVBQWMsZ0JBQWdCLEVBQU8sT0FBUyxHQUFjLEVBQVUsRUFDcEUsRUFBaUIsR0FBa0IsQ0FBTSxFQUMvQyxFQUFZLFFBQVUsR0FBbUIsQ0FBTSxFQUMvQyxFQUFZLGtCQUFvQixDQUFDLEVBQ2pDLEVBQVksZ0JBQWdCLFFBQVUsR0FBVyxDQUFNLEVBQ25ELEVBQWUsT0FBUyxJQUMxQixFQUFZLGdCQUFrQixDQUFFLEdBQUcsRUFBWSxnQkFBaUIsTUFBTyxDQUFlLEdBRXBGLENBQUMsRUFBTyxxQkFBdUIsQ0FBQyxFQUFPLDhCQUN6QyxPQUFPLEVBQVksaUJBQWlCLElBQzNCLENBQUMsRUFBTyxPQUFTLENBQUMsRUFBTyxVQUFVLGNBQzVDLEVBQVksZ0JBQWtCLENBQUUsR0FBRyxFQUFZLGdCQUFpQixJQUFLLFdBQVksR0FFL0UsRUFBTyxRQUFVLENBQUMsRUFBTyw2QkFDM0IsRUFBWSxRQUFVLEVBQVksU0FBUyxPQUFRLEdBQW9CLENBQUMsRUFBUSxXQUFXLGFBQWEsQ0FBQyxFQUN6RyxFQUFZLFFBQVUsRUFBWSxTQUFTLE9BQVEsR0FBb0IsQ0FBQyxFQUFRLFdBQVcsYUFBYSxDQUFDLEdBRXZHLEVBQU8sVUFBVSxRQUduQixHQUFlLEVBQWEsYUFBYSxFQUczQyxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxlQUFlLEVBQzdELEdBQUksQ0FDRixJQUFNLEVBQWtCLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLEVBQzdELEVBQWMsS0FBSyxNQUFNLENBQWUsRUFDeEMsRUFBZ0IsR0FBcUIsRUFBWSxpQkFBaUIsS0FBSyxFQUN2RSxFQUF1QixHQUF5QixFQUFZLGVBQWUsRUFDakYsRUFBWSxRQUFVLEdBQXFCLEVBQVksUUFBUyxFQUFZLE9BQU8sRUFDbkYsT0FBTyxFQUFZLFFBQ25CLE9BQU8sRUFBWSxpQkFBaUIsSUFDcEMsRUFBYyxFQUFNLElBQUksQ0FBQyxFQUFhLEVBQWEsQ0FBVyxFQUFHLENBQUUsV0FBWSxFQUFhLENBQUMsRUFDN0YsRUFBWSxRQUFVLEVBQVksU0FBUyxPQUN4QyxHQUNDLENBQUMsRUFBUSxTQUFTLFFBQVEsR0FBSyxDQUFDLEVBQVEsU0FBUyxZQUFZLEdBQUssQ0FBQyxFQUFRLFNBQVMsUUFBUSxDQUNoRyxFQUNBLEVBQVksa0JBQW9CLENBQUMsRUFPakMsRUFBWSxnQkFBa0IsQ0FBRSxHQUFHLEVBQVksZ0JBQWlCLEdBQUcsQ0FBcUIsRUFDeEYsR0FBbUMsRUFBWSxlQUFlLEVBRTlELElBQU0sRUFBYyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFvQixFQUFlLENBQWMsRUFBRyxHQUFHLENBQWMsQ0FBQyxDQUFDLEVBQ3ZHLEVBQVksT0FBUyxFQUN2QixFQUFZLGdCQUFnQixNQUFRLEVBRXBDLE9BQU8sRUFBWSxnQkFBZ0IsTUFFakMsR0FBc0IsQ0FBYyxHQUN0QyxPQUFPLEVBQVksZ0JBQWdCLFNBRXZDLE1BQVEsQ0FFUixDQUNBLEVBQVMsQ0FBVyxFQUNwQixFQUFZLFNBQVMsS0FBSyxFQUUxQixPQUFPLEVBQVksaUJBQWlCLHVCQUlwQyxPQUFPLEVBQVksaUJBQWlCLFFBQ3BDLEdBQTJCLEVBQVksZ0JBQWlCLENBQU0sRUFDOUQsR0FBa0MsRUFBWSxnQkFBaUIsQ0FBTSxFQUNqRSxFQUFPLFVBQVUsYUFDbkIsT0FBTyxFQUFZLGlCQUFpQixxQkFFdEMsSUFBTSxFQUFhLEtBQUssVUFBVSxFQUFhLElBQUEsR0FBVyxDQUFDLEVBQzNELE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQVUsQ0FBQyxDQUN2RSxDQUFDLENBQ0gsQ0FFQSxlQUFlLEdBQW9DLEVBQXNDLENBQ3ZGLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLGVBQWUsRUFDN0QsR0FBSSxDQUNGLElBQU0sRUFBVyxLQUFLLE1BQU0sTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFVLE1BQU0sQ0FBQyxFQUN4RSxHQUFvQyxDQUFRLEVBQzVDLEdBQWlDLEVBQVMsZUFBZSxFQUN6RCxHQUFxQyxDQUFRLEVBQzdDLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLEtBQUssVUFBVSxFQUFVLElBQUEsR0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNuRyxNQUFRLENBR1IsQ0FDRixDQUVBLFNBQVMsR0FBcUMsRUFBOEIsQ0FHckUsRUFBUyxVQUNWLEVBQVMsUUFBUSxTQUFTLGNBQWMsSUFFNUMsRUFBUyxRQUFRLEtBQUssY0FBYyxFQUNwQyxFQUFTLFFBQVEsS0FBSyxHQUN4QixDQUVBLFNBQVMsR0FBb0MsRUFBOEIsQ0FDekUsSUFBTSxFQUFrQixFQUFTLGdCQUNqQyxHQUFJLENBQUMsRUFBaUIsT0FDdEIsSUFBTSxFQUFtQixHQUFpQixFQUFnQixnQkFBZ0IsR0FDdEUsSUFBcUIsUUFBVSxJQUFxQixVQUFZLElBQXFCLElBQUEsTUFDbkYsRUFBUyxRQUdYLE9BQU8sRUFBZ0IsaUJBSXZCLEVBQWdCLGlCQUFtQixVQUd6QyxDQUVBLFNBQVMsR0FBaUMsRUFBaUUsQ0FDcEcsT0FLTCxPQUFPLEVBQWdCLFFBQ2xCLEVBQWdCLE9BRXJCLElBQUssR0FBTSxDQUFDLEVBQU8sS0FBWSxPQUFPLFFBQVEsRUFBZ0IsS0FBSyxFQUNqRSxFQUFnQixNQUFNLEdBQVMsR0FBMEIsQ0FBTyxDQUVwRSxDQUVBLFNBQVMsR0FBMEIsRUFBNkIsQ0FDOUQsT0FBTyxFQUFRLElBQUssR0FDZCxFQUFPLFdBQVcsSUFBSSxHQUFLLEVBQU8sV0FBVyxLQUFLLEdBQUssRUFBSyxXQUFXLENBQU0sRUFBVSxFQUNwRixLQUFLLEdBQ2IsQ0FDSCxDQUVBLFNBQVMsR0FBVyxFQUErQixDQUVqRCxPQURJLEVBQU8sT0FBZSxJQUNuQixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQU8sUUFBUyxLQUFNLEtBQU0sY0FBYyxDQUFDLEVBQUksUUFBVSxHQUM3RixDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ3lCLENBQ3pCLElBQU0sRUFBZ0IsQ0FBQyxHQUFHLEdBQWlCLENBQWdCLEVBQUcsR0FBRyxHQUFpQixDQUFlLENBQUMsRUFDNUYsRUFBZ0IsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFhLENBQUMsRUFDNUMsS0FBYyxTQUFXLEVBRTdCLE9BREksRUFBYyxTQUFXLEVBQVUsRUFBYyxHQUM5QyxDQUNULENBRUEsU0FBUyxHQUFlLEVBQXdCLEVBQXVCLENBQ3JFLEVBQVMsVUFBWSxDQUFDLEVBQ2pCLEVBQVMsUUFBUSxTQUFTLENBQU8sR0FDcEMsRUFBUyxRQUFRLEtBQUssQ0FBTyxDQUVqQyxDQUVBLFNBQVMsR0FBaUIsRUFBMEMsQ0FFbEUsT0FESyxFQUNFLE1BQU0sUUFBUSxDQUFLLEVBQUksRUFBUSxDQUFDLENBQUssRUFEekIsQ0FBQyxDQUV0QixDQUVBLFNBQVMsR0FBcUIsRUFBMEIsQ0FHdEQsT0FGSSxPQUFPLEdBQVUsU0FBaUIsQ0FBQyxDQUFLLEVBQ3ZDLE1BQU0sUUFBUSxDQUFLLEVBQ2pCLEVBQU0sT0FBUSxHQUF5QixPQUFPLEdBQVMsUUFBUSxFQURwQyxDQUFDLENBRXJDLENBRUEsU0FBUyxHQUFzQixFQUE4QixDQUczRCxPQUFPLEVBQVUsS0FBTSxHQUFhLElBQWEsV0FBYSxFQUFTLFNBQVMsR0FBRyxDQUFDLENBQ3RGLENBRUEsU0FBUyxHQUFvQixFQUF5QixFQUFvQyxDQUN4RixJQUFNLEVBQW1CLElBQUksSUFBSSxDQUFjLEVBQy9DLE9BQU8sRUFBYyxPQUFRLEdBSTNCLEVBQUksR0FBMEIsQ0FBUSxHQUFLLENBQUMsRUFBaUIsSUFBSSxDQUFRLEVBRTFFLENBQ0gsQ0FFQSxTQUFTLEdBQTBCLEVBQTJCLENBQzVELE9BQU8sSUFBYSxXQUFhLElBQWEsUUFBVSxJQUFhLFNBQVcsSUFBYSxnQkFDL0YsQ0FFQSxTQUFTLEdBQW1DLEVBQWlFLENBQ3RHLElBQ0QsRUFBZ0IsU0FBVyxJQUFTLEVBQWdCLHNCQUF3QixLQUloRixFQUFnQixnQ0FBa0MsSUFDcEQsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNNLENBQ04sR0FBSSxDQUFDLEVBQWlCLE9BR3RCLElBQU0sRUFBbUIsR0FBaUIsRUFBZ0IsZ0JBQWdCLEVBTTFFLElBSEksSUFBcUIsUUFBVSxJQUFxQixXQUN0RCxPQUFPLEVBQWdCLGlCQUVyQixFQUFPLE9BQVMsRUFBTyxVQUFVLFlBQWEsT0FFbEQsR0FBSSxFQUFPLFVBQVUsTUFBUSxFQUFPLFVBQVUsTUFBTyxDQUsvQyxJQUFxQixZQUN2QixFQUFnQixpQkFBbUIsV0FFckMsSUFBTSxFQUFhLEdBQWlCLEVBQWdCLE1BQU0sR0FJdEQsSUFBZSxJQUFBLElBQWMsSUFBZSxZQUFjLENBQUMsRUFBVyxXQUFXLElBQUksS0FDdkYsRUFBZ0IsT0FBUyxVQUUzQixNQUNGLENBRUksSUFBcUIsV0FHdkIsT0FBTyxFQUFnQixpQkFHekIsSUFBTSxFQUFhLEdBQWlCLEVBQWdCLE1BQU0sR0FDdEQsSUFBZSxZQUFjLEdBQVksV0FBVyxJQUFJLElBRzFELE9BQU8sRUFBZ0IsTUFFM0IsQ0FFQSxTQUFTLEdBQWlCLEVBQW9DLENBQzVELE9BQU8sT0FBTyxHQUFVLFNBQVcsRUFBTSxZQUFZLEVBQUksSUFBQSxFQUMzRCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ00sQ0FDRixDQUFDLEdBQW1CLEVBQU8sT0FBUyxFQUFPLFVBQVUsYUFBZSxFQUFPLGVBRTNFLEVBQWdCLFFBQVEsWUFBWSxJQUFNLGFBSTVDLEVBQWdCLE9BQVMsVUFFM0IsRUFBZ0IscUJBQXVCLEdBQ3pDLENBRUEsU0FBUyxHQUNQLEVBQ29HLENBQ3BHLElBQU0sRUFBYyxDQUFDLEVBSXJCLElBQUssSUFBTSxJQUFPLENBQUMsY0FBZSxpQkFBa0IsV0FBVyxFQUFZLENBQ3pFLElBQU0sRUFBUSxJQUFrQixHQUM1QixJQUFVLElBQUEsS0FDWixFQUFZLEdBQU8sRUFFdkIsQ0FDQSxPQUFPLENBQ1QsQ0FFQSxTQUFTLEdBQWtCLEVBQWlDLENBQzFELElBQU0sRUFBWSxJQUFJLElBQ2hCLEVBQWUsQ0FDbkIsR0FBRyxFQUFPLGFBQWEsYUFDdkIsR0FBRyxFQUFPLGFBQWEsZUFDekIsRUF5QkEsT0F2QkksRUFBTyxNQUNULEVBQVUsSUFBSSxLQUFLLEVBQ1QsRUFBTyxVQUFVLGFBQzNCLEVBQVUsSUFBSSxNQUFNLEdBR3BCLEVBQWEsTUFDYixFQUFhLGtCQUNiLEVBQWEsMkJBQ2IsRUFBYSxhQUViLEVBQVUsSUFBSSxNQUFNLEVBRWxCLEVBQWEsUUFDZixFQUFVLElBQUksZ0JBQWdCLEVBRTVCLEVBQWEsT0FDZixFQUFVLElBQUksT0FBTyxFQUVuQixFQUFhLFNBQ2YsRUFBVSxJQUFJLFNBQVMsRUFHbEIsQ0FBQyxHQUFHLENBQVMsQ0FDdEIsQ0M3V0EsTUFBTSxHQUFzQixDQUMxQixxQkFDQSwyQkFDQSxxQkFDQSxZQUNBLGFBQ0EsWUFDRixFQUVBLGVBQXNCLEdBQXVCLEVBQXNDLENBQ2pGLE9BQU8sRUFBTywwQkFBMEIseUJBQTBCLFNBQVksQ0FDNUUsR0FBSSxDQUNGLElBQU0sRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLFVBQVcsZUFBZSxFQUNsRSxFQUFrQixNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQVUsTUFBTSxFQUMvRCxFQUFXLEtBQUssTUFBTSxDQUFlLEVBQ3pDLElBQUssSUFBTSxLQUFzQixHQUMvQixFQUFXLEVBQU0sSUFBSSxDQUFDLEVBQVUsR0FBZSxDQUFrQixDQUFDLENBQUMsR0FFakUsRUFBTyx1QkFBeUIsRUFBTyxxQkFDekMsRUFBVyxFQUFNLElBQUksQ0FBQyxFQUFVLEdBQWUsYUFBYSxDQUFDLENBQUMsR0FFNUQsRUFBTyxVQUFVLE9BQ25CLEVBQVcsRUFBTSxJQUFJLENBQUMsRUFBVSxHQUFlLGFBQWEsQ0FBQyxDQUFDLEdBSTVELDZCQUE4QixHQUNoQyxPQUFPLEVBQVMsNEJBRWQsd0JBQXlCLEdBQzNCLE9BQU8sRUFBUyx1QkFFbEIsRUFBUyxDQUFtQyxFQUM1QyxJQUFNLEVBQWEsS0FBSyxVQUFVLEVBQVUsSUFBQSxHQUFXLENBQUMsRUFDeEQsTUFBTSxFQUFZLFFBQVUsRUFBTyxhQUFhLEVBQVUsQ0FBVSxDQUFDLENBQ3ZFLE1BQVEsQ0FFUixDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBZSxFQUFvQyxDQUMxRCxNQUFPLENBQ0wsdUJBQXdCLEVBQ3JCLEdBQXFCLEVBQ3hCLENBQ0YsQ0FDRixDQ3BEQSxlQUFzQixHQUFZLEVBQXNDLENBQ3RFLE9BQU8sRUFBTywwQkFBMEIsY0FBZSxTQUFZLENBQ2pFLEdBQU0sQ0FBQyxFQUFPLEdBQVEsRUFBVyxjQUFjLEVBQU8sWUFBYyxFQUFFLEVBR3RFLEdBRkksQ0FBQyxHQUFTLENBQUMsR0FDWCxJQUFVLGVBQWlCLElBQVUsa0JBQ3JDLENBQUMsR0FBZSxDQUFLLEVBQUcsT0FFNUIsSUFBTSxFQUFVLEVBQVcsQ0FBSyxFQUVoQyxHQUFJLENBQ0YsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLHdCQUF5QixRQUFRLEVBQ3hFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxxQkFBc0IsUUFBUSxFQUNyRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sa0JBQW1CLFFBQVEsRUFDbEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLG1CQUFvQixRQUFRLEVBQ25FLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxzQkFBdUIsUUFBUSxFQUN0RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sa0NBQW1DLFFBQVEsRUFDbEYsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLDBCQUEyQixRQUFRLEVBQzFFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSx1QkFBd0IsUUFBUSxFQUN2RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sNkJBQThCLFFBQVEsRUFDN0UsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLFdBQVksUUFBUSxFQUMzRCxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sY0FBZSxRQUFRLEVBQzlELE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxZQUFhLFFBQVEsRUFDNUQsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLFdBQVksUUFBUSxFQUMzRCxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sWUFBYSxRQUFRLEVBQzVELE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxzQkFBdUIsUUFBUSxFQUN0RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0saUJBQWtCLFFBQVEsRUFDakUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLHlCQUEwQixRQUFRLEVBQ3pFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxzQkFBdUIsUUFBUSxFQUN0RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sc0JBQXVCLFFBQVEsRUFDdEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGlCQUFrQixRQUFRLEVBQ2pFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxpQkFBa0IsUUFBUSxFQUNqRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0saUJBQWtCLFFBQVEsRUFDakUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGlCQUFrQixRQUFRLEVBQ2pFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxpQkFBa0IsUUFBUSxFQUNqRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sa0JBQW1CLFFBQVEsRUFDbEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLG9CQUFxQixRQUFRLEVBQ3BFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxtQkFBb0IsUUFBUSxFQUNuRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sOEJBQStCLFFBQVEsRUFDOUUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLGlCQUFrQixRQUFRLEVBQ2pFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxxQkFBc0IsUUFBUSxFQUNyRSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sZUFBZ0IsUUFBUSxFQUMvRCxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sZ0JBQWlCLFFBQVEsRUFDaEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLHdCQUF5QixRQUFRLEVBQ3hFLE1BQU0sRUFBVyxFQUFTLEVBQU8sRUFBTSxzQkFBdUIsUUFBUSxFQUN0RSxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0sc0JBQXVCLFFBQVEsRUFDdEUsTUFBTSxFQUFXLEVBQVMsRUFBTyxFQUFNLFVBQVcsUUFBUSxFQUMxRCxNQUFNLEVBQVcsRUFBUyxFQUFPLEVBQU0saUJBQWtCLFFBQVEsRUFFakUsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLEtBQUssRUFDN0MsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLGVBQWUsRUFDdkQsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLFdBQVcsRUFDbkQsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLGFBQWEsRUFDckQsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLGtCQUFrQixFQUMxRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sYUFBYSxFQUNyRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sU0FBUyxFQUNqRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sVUFBVSxFQUNsRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sU0FBUyxFQUVqRCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sT0FBTyxFQUMvQyxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sa0JBQWtCLEVBQzFELE1BQU0sRUFBWSxFQUFTLEVBQU8sRUFBTSxVQUFVLEVBQ2xELE1BQU0sRUFBWSxFQUFTLEVBQU8sRUFBTSxrQkFBa0IsRUFDMUQsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLGdCQUFnQixFQUN4RCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sZUFBZSxFQUN2RCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sb0JBQW9CLEVBQzVELE1BQU0sRUFBWSxFQUFTLEVBQU8sRUFBTSx1QkFBdUIsRUFDL0QsTUFBTSxFQUFZLEVBQVMsRUFBTyxFQUFNLHNCQUFzQixFQUM5RCxNQUFNLEVBQVksRUFBUyxFQUFPLEVBQU0sdUJBQXVCLENBQ2pFLE9BQVMsRUFBTyxDQUNkLFFBQVEsS0FBSywyQkFBNkIsR0FBNkIsT0FBUyxDQUFLLENBQ3ZGLENBQ0YsQ0FBQyxDQUNILENBRUEsZUFBZSxFQUFXLEVBQWtCLEVBQWUsRUFBYyxFQUFjLEVBQThCLENBQ25ILEdBQUksQ0FFRixNQUFNLEVBQVEsUUFBUSxvQ0FBcUMsQ0FDekQsUUFDQSxPQUNBLE9BQ0EsT0FDRixDQUFDLENBQ0gsTUFBUSxDQUVOLE1BQU0sRUFBUSxRQUFRLDRDQUE2QyxDQUNqRSxRQUNBLE9BQ0EsT0FDQSxPQUNGLENBQUMsQ0FDSCxDQUNGLENBRUEsZUFBZSxFQUFZLEVBQWtCLEVBQWUsRUFBYyxFQUE2QixDQUNyRyxHQUFJLENBRUYsTUFBTSxFQUFRLFFBQVEsNkNBQThDLENBQ2xFLFFBQ0EsT0FDQSxNQUNGLENBQUMsQ0FDSCxNQUFRLENBRVIsQ0FDRixDQ3JEQSxNQUFNLEdBQTRCLENBQ2hDLHVCQUF3QixZQUMxQixFQUVNLEdBQWdDLE1BRWhDLEdBQWlELENBQ3JELEtBQU0sZUFDTixPQUFRLFNBQ1IsWUFBYSxTQUNiLFdBQVksQ0FDVixTQUFVLENBQ1IsUUFBUyxDQUFDLEVBQ1YsUUFBUyxDQUFDLGlCQUFpQixDQUM3QixDQUNGLEVBQ0EsTUFBTyxDQUNMLENBQ0UsS0FBTSxVQUNSLEVBQ0EsQ0FDRSxLQUFNLHlCQUNOLFdBQVksQ0FDVixxQ0FBc0MsR0FDdEMseUJBQTBCLEdBQzFCLHVCQUF3QixDQUN0QixDQUNFLFFBQVMsY0FDVCxlQUFnQixFQUNsQixFQUNBLENBQ0UsUUFBUyw0QkFDVCxlQUFnQixFQUNsQixDQUNGLENBQ0YsQ0FDRixFQUNBLENBQ0UsS0FBTSxrQkFDUixFQUNBLENBQ0UsS0FBTSxlQUNOLFdBQVksQ0FDVixnQ0FBaUMsRUFDakMsOEJBQStCLEdBQy9CLG1CQUFvQixDQUFDLEVBQ3JCLDBCQUEyQixHQUMzQiwyQkFBNEIsR0FDNUIsa0NBQW1DLEdBQ25DLHNCQUF1QixDQUFDLFFBQVEsQ0FDbEMsQ0FDRixDQUNGLEVBQ0EsY0FBZSxDQUNiLENBQ0UsU0FBVSxTQUNWLFdBQVksT0FDWixZQUFhLGNBQ2YsQ0FDRixDQUNGLEVBRUEsZUFBc0IsR0FBd0IsRUFBc0MsQ0FDbEYsT0FBTyxFQUFPLDBCQUEwQiwwQkFBMkIsU0FBWSxDQUM3RSxHQUFNLENBQUMsRUFBTyxHQUFRLEVBQVcsY0FBYyxFQUFPLFlBQWMsRUFBRSxFQUd0RSxHQUZJLENBQUMsR0FBUyxDQUFDLEdBQ1gsSUFBVSxlQUNWLENBQUMsR0FBZSxDQUFLLEVBQUcsT0FFNUIsSUFBTSxFQUFVLEVBQVcsQ0FBSyxFQUVoQyxHQUFJLENBQ0YsTUFBTSxHQUF5QixFQUFTLEVBQU8sRUFBTSxHQUF3QixDQUFNLENBQUMsQ0FDdEYsT0FBUyxFQUFPLENBQ2QsR0FBSSxDQUFDQyxHQUFvQyxDQUFLLEVBQUcsTUFBTSxFQUl2RCxRQUFRLEtBQUssdUNBQXlDLEdBQTZCLE9BQVMsQ0FBSyxDQUNuRyxDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBd0IsRUFBaUQsQ0FDaEYsSUFBTSxFQUFVLGdCQUFnQixFQUFvQixFQUNwRCxHQUFJLEVBQU8sa0JBQWtCLE9BQVMsRUFDcEMsSUFBSyxJQUFNLEtBQVEsRUFBUSxNQUNyQixFQUFLLE9BQVMsMEJBRWxCLEVBQUssV0FBVyx1QkFBdUIsS0FBSyxDQUMxQyxRQUFTLHdCQUNULGVBQWdCLEVBQ2xCLENBQUMsRUFHTCxPQUFPLENBQ1QsQ0FFQSxlQUFlLEdBQ2IsRUFDQSxFQUNBLEVBQ0EsRUFDZSxDQUVmLElBQU0sR0FBb0IsTUFESSxHQUFzQixFQUFTLEVBQU8sRUFBTSxFQUFRLElBQUksRUFBQSxFQUMzQyxHQUUzQyxNQUFNLEdBQ0osU0FBWSxDQUNWLEdBQUksRUFBbUIsQ0FDckIsTUFBTSxFQUFRLFFBQVEsa0RBQW1ELENBQ3ZFLFFBQ0EsT0FDQSxXQUFZLEVBQ1osR0FBRyxFQUNILFFBQVMsRUFDWCxDQUFDLEVBQ0QsTUFDRixDQUVBLE1BQU0sRUFBUSxRQUFRLHNDQUF1QyxDQUMzRCxRQUNBLE9BQ0EsR0FBRyxFQUNILFFBQVMsRUFDWCxDQUFDLENBQ0gsRUFDQSxDQUNFLFlBQWMsR0FBVSxDQUFDQSxHQUFvQyxDQUFLLENBQ3BFLENBQ0YsQ0FDRixDQUVBLGVBQWUsR0FDYixFQUNBLEVBQ0EsRUFDQSxFQUMrQyxDQWMvQyxJQUFNLEdBQVcsTUFiTSxPQUVuQixFQUFRLFFBQVEscUNBQXNDLENBQ3BELFFBQ0EsT0FDQSxpQkFBa0IsR0FDbEIsUUFBUyxTQUNULFFBQVMsRUFDWCxDQUFDLEVBQ0gsQ0FDRSxZQUFjLEdBQVUsQ0FBQ0EsR0FBb0MsQ0FBSyxDQUNwRSxDQUNGLEVBQUEsQ0FDMEIsS0FDckIsU0FBTSxRQUFRLENBQVEsRUFDM0IsT0FBTyxFQUFTLEtBQU0sR0FBWSxFQUFRLE9BQVMsR0FBZSxFQUFRLGNBQWdCLFlBQVksQ0FDeEcsQ0FFQSxTQUFTQSxHQUFvQyxFQUF5QixDQUNwRSxHQUFJLENBQUMsR0FBUyxPQUFPLEdBQVUsU0FBVSxNQUFPLEdBQ2hELElBQU0sRUFBVSxFQUE4QixPQUM5QyxPQUFPLElBQVcsS0FBTyxJQUFXLEtBQU8sSUFBVyxHQUN4RCxDQ2hOQSxNQUFNLEdBQTBCLENBQUMsNEJBQTZCLGFBQWMsbUJBQW1CLEVBQ3pGLEdBQVUsR0FBYyxPQUFPLEtBQUssR0FBRyxFQUU3QyxlQUFzQixHQUFhLEVBQXNDLENBQ3ZFLE9BQU8sRUFBTywwQkFBMEIsZUFBZ0IsU0FBWSxDQUNsRSxHQUFNLENBQUMsRUFBTyxHQUFRLEVBQVcsY0FBYyxFQUFPLFlBQWMsRUFBRSxFQUV0RSxHQURJLENBQUMsR0FBUyxDQUFDLEdBQVEsSUFBVSxrQkFDN0IsQ0FBQyxHQUFlLENBQUssR0FBSyxDQUFDLEVBQVEsa0JBQW1CLE9BRTFELElBQU0sRUFBUyxHQUFPLE9BQU8sQ0FBRSxLQUFNLEVBQUssUUFBUSxFQUFPLFFBQVMsTUFBTSxFQUFHLE1BQU8sRUFBSyxDQUFDLENBQUMsQ0FBQyxRQUFVLENBQUMsRUFDckcsR0FBSSxPQUFPLEtBQUssQ0FBTSxDQUFDLENBQUMsU0FBVyxFQUFHLE9BRXRDLElBQU0sRUFBVSxFQUFXLENBQUssRUFFaEMsR0FBSSxDQUNGLElBQUssSUFBTSxLQUFjLEdBQ3ZCLEdBQUksQ0FFRixNQUFNLEVBQVEsUUFBUSw2REFBOEQsQ0FDbEYsUUFDQSxPQUNBLFlBQWEsQ0FDZixDQUFDLENBQ0gsTUFBUSxDQUVSLENBUUYsR0FBTSxDQUFFLE1BQUssT0FBUSxJQUFVLE1BSlIsRUFBUSxRQUFRLHVEQUF3RCxDQUM3RixRQUNBLE1BQ0YsQ0FBQyxFQUFBLENBQ3VDLEtBRWxDLEVBQVMsR0FBVSxFQUN6QixNQUFNLEVBQU8sTUFFYixJQUFLLEdBQU0sQ0FBQyxFQUFNLEtBQVcsT0FBTyxRQUFRLENBQU0sRUFBRyxDQUNuRCxHQUNFLElBQVMsY0FDVCxJQUFTLDhCQUNULElBQVMsZ0NBRVQsU0FJRixJQUFNLEVBQVMsRUFBTyxZQUFZLEVBQUssRUFBTyxnQkFBZ0IsUUFBUSxFQUNoRSxFQUFTLEVBQU8sWUFBWSxDQUFNLEVBR2xDLEVBQVcsRUFBTyxnQkFBZ0IsRUFBUSxDQUFNLEVBR2hELEVBQVksRUFBTyxVQUFVLEVBQVUsRUFBTyxnQkFBZ0IsUUFBUSxFQUc1RSxNQUFNLEVBQVEsUUFBUSwwREFBMkQsQ0FDL0UsUUFDQSxPQUNBLFlBQWEsRUFDYixnQkFBaUIsRUFDakIsT0FBUSxDQUNWLENBQUMsQ0FDSCxDQUNGLE9BQVMsRUFBTyxDQUNkLFFBQVEsS0FBSyw0QkFBOEIsR0FBNkIsT0FBUyxDQUFLLENBQ3hGLENBQ0YsQ0FBQyxDQUNILENBRUEsU0FBUyxJQUFpQyxDQUd4QyxPQUFPLEdBQVEsb0JBQW9CLENBQ3JDLENDakZBLGVBQXNCLEdBQW9CLEVBQXNDLENBQzlFLE9BQU8sRUFBTywwQkFBMEIsc0JBQXVCLFNBQVksQ0FDekUsR0FBTSxDQUFDLEVBQU8sR0FBUSxFQUFXLGNBQWMsRUFBTyxZQUFjLEVBQUUsRUFHdEUsR0FGSSxDQUFDLEdBQVMsQ0FBQyxHQUNYLElBQVUsZUFBaUIsSUFBVSxrQkFDckMsQ0FBQyxHQUFlLENBQUssRUFBRyxPQUU1QixJQUFNLEVBQVUsRUFBVyxDQUFLLEVBRWhDLEdBQUksQ0FFRixNQUFNLE9BRUYsRUFBUSxRQUFRLDhCQUErQixDQUM3QyxRQUNBLE9BQ0EsaUJBQWtCLEdBQ2xCLG1CQUFvQixHQUNwQixtQkFBb0IsR0FDcEIsbUJBQW9CLEdBQ3BCLG9CQUFxQixHQUNyQix1QkFBd0IsR0FDeEIsMEJBQTJCLFdBQzNCLDRCQUE2QixRQUM3QixRQUFTLENBQ1AsdUJBQXdCLFlBQzFCLEVBQ0EsR0FBSSxFQUFPLFlBQVksV0FBVyxxQkFBcUIsRUFBSSxDQUFFLGlCQUFrQixFQUFLLEVBQUksQ0FBQyxDQUMzRixDQUFDLEVBQ0gsQ0FDRSxZQUFjLEdBQVUsQ0FBQyxHQUFvQyxDQUFLLENBQ3BFLENBQ0YsQ0FDRixPQUFTLEVBQU8sQ0FDZCxHQUFJLENBQUMsR0FBb0MsQ0FBSyxFQUFHLE1BQU0sRUFHdkQsUUFBUSxLQUFLLG1DQUFxQyxHQUE2QixPQUFTLENBQUssQ0FDL0YsQ0FDRixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQW9DLEVBQXlCLENBRXBFLE1BREksQ0FBQyxHQUFTLE9BQU8sR0FBVSxVQUFZLEVBQUUsV0FBWSxHQUFlLEdBQ2pFLEVBQU0sU0FBVyxLQUFPLEVBQU0sU0FBVyxLQUFPLEVBQU0sU0FBVyxHQUMxRSxDQ3pDQSxNQUFNLEdBQStCLGFBRS9CLEdBQVksQ0FDaEIsMkJBQTRCOzs7Ozs7OztnQ0FRRSxHQUE2QjtnQ0FDN0IsR0FBNkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlDM0QsS0FBSyxDQUNQLEVBRUEsZUFBc0IsR0FBd0IsRUFBc0MsQ0FDbEYsT0FBTyxFQUFPLDBCQUEwQiwwQkFBMkIsU0FBWSxDQUN4RSxLQUFPLGtCQUlaLElBQUssR0FBTSxDQUFDLEVBQVUsS0FBZSxPQUFPLFFBQVEsRUFBUyxFQUFHLENBQzlELElBQU0sRUFBVSxHQUE0QixFQUFZLENBQU0sRUFDeEQsRUFBVyxFQUFLLFFBQVEsRUFBTyxRQUFTLFVBQVcsQ0FBUSxFQUM3RCxFQUFHLFdBQVcsQ0FBUSxHQUVwQixFQUFTLE1BRFksRUFBRyxTQUFTLFNBQVMsRUFBVSxNQUFNLEVBQ3JDLENBQU8sRUFBSSxFQUFRLE9BQVMsSUFLdkQsTUFBTSxFQUFHLFNBQVMsTUFBTSxFQUFLLFFBQVEsRUFBTyxRQUFTLFNBQVMsRUFBRyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ3BGLE1BQU0sRUFBWSxRQUFVLEVBQU8sYUFBYSxFQUFVLENBQU8sQ0FBQyxFQUNwRSxDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FBNEIsRUFBa0IsRUFBK0IsQ0FDcEYsSUFBTSxFQUF3QixFQUFPLE1BQVEsVUFBWSxPQUN6RCxPQUFPLEVBQVMsV0FBVyxHQUE4QixDQUFxQixDQUNoRixDQ0tBLE1BQU0sR0FBaUIsRUFBRSxPQUFPLENBQzlCLE1BQU8sRUFDSixPQUFPLENBQ04sSUFBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDL0MsSUFBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDL0MsR0FBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFDOUMsS0FBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDbEQsQ0FBQyxDQUFDLENBQ0QsU0FBUyxDQUNkLENBQUMsRUFFRCxlQUFzQixHQUNwQixFQUNBLEVBQ29DLENBQ3BDLElBQU0sRUFBa0IsRUFBSyxRQUFRLEVBQVMsY0FBYyxFQUM1RCxHQUFJLENBQ0YsSUFBTSxFQUF5QixFQUFHLFdBQVcsQ0FBZSxFQUN4RCxFQUE0QyxDQUFDLEVBQzdDLEVBQWtELENBQUMsRUFDbkQsRUFBMkIsQ0FBQyxFQUM1QixFQUFhLEdBQ2pCLEdBQUksRUFBd0IsQ0FDMUIsSUFBTSxFQUFrQixFQUFHLGFBQWEsRUFBaUIsTUFBTSxFQUMvRCxFQUFjLEtBQUssTUFBTSxDQUFlLEVBQ3hDLEVBQWUsRUFBWSxjQUFnQixDQUFDLEVBQzVDLEVBQWtCLEVBQVksaUJBQW1CLENBQUMsRUFDbEQsRUFBYSxFQUFZLE9BQVMsUUFDcEMsQ0FFQSxJQUFJLEVBQTRCLENBQUMsRUFDN0IsRUFBMkIsQ0FBQyxFQUNoQyxHQUFJLENBQ0YsSUFBTSxFQUFvQixFQUFLLFFBQVEsRUFBUyxpQkFBaUIsRUFDM0QsRUFBTyxLQUFLLE1BQU0sTUFBTUMsRUFBSSxTQUFTLEVBQW1CLE1BQU0sQ0FBQyxFQU1yRSxFQUFrQixHQUFNLFVBQVksQ0FBQyxFQUNyQyxFQUFpQixHQUFNLFNBQVMsS0FBSyxHQUFLLENBQUMsQ0FDN0MsTUFBUSxDQUVSLENBRUEsSUFBTSxFQUNKLEVBQUssU0FBUyxFQUFLLFFBQVEsRUFBUyxJQUFJLENBQUMsSUFBTSxZQUMvQyxDQUFDLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxLQUFNLEtBQU0sY0FBYyxDQUFDLEVBRTlELEVBQ0EsSUFDRixFQUFXLE1BQU0sR0FBYyxFQUFTLENBQVcsR0FHckQsSUFBSSxFQUFxQixHQUF1QixDQUFPLEVBQ3ZELElBQUssSUFBTSxJQUFVLENBQUMsT0FBUSxPQUFRLFFBQVEsRUFDNUMsR0FBSSxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsSUFBSSxFQUFPLFNBQVMsQ0FBQyxFQUFHLENBQzlELEVBQXFCLEdBQ3JCLEtBQ0YsQ0FHRixJQUFJLEdBQWEsR0FDakIsR0FBSSxDQUNGLEdBQWEsTUFBTUEsRUFBSSxTQUFTLEVBQUssUUFBUSxFQUFTLFlBQVksRUFBRyxNQUFNLENBQzdFLE1BQVEsQ0FFUixDQUdBLElBQU0sR0FBZSxFQUFLLFFBQVEsRUFBUyxXQUFXLEVBQ2xELEdBQ0osR0FBSSxDQUNGLElBQU0sRUFBZSxNQUFNQSxFQUFJLFNBQVMsR0FBYyxNQUFNLEVBQzVELEdBQVcsR0FBZSxNQUFNLEtBQUssTUFBTSxDQUFZLENBQUMsQ0FDMUQsTUFBUSxDQUVSLENBRUEsSUFBTSxFQUFlLE9BQU8sR0FBVSxXQUFjLFNBQVcsRUFBUyxVQUFZLElBQUEsR0FDaEYsR0FDQSxFQUNKLEdBQUksRUFBYyxDQUNoQixJQUFNLEVBQVksRUFBYSxNQUFNLEdBQUcsRUFDcEMsRUFBVSxRQUFVLElBQ3RCLEdBQWEsRUFBVSxHQUN2QixFQUFXLEVBQVUsR0FFekIsQ0FDQSxJQUFNLEdBQWEsRUFBZSxVQUFVLElBQWlCLElBQUEsR0FFdkQsR0FBeUIsQ0FBQyxrQkFBbUIsbUJBQW9CLFlBQVksQ0FBQyxDQUFDLEtBQU0sR0FDekYsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLFlBQWEsQ0FBUSxDQUFDLENBQzVELEVBQ00sRUFBd0IsQ0FDNUIsVUFDQSxjQUNBLFNBQ0EsYUFBYyxHQUFVLFVBQVksR0FDcEMsc0JBQXVCLENBQUMsQ0FBQyxFQUFZLE1BQ3JDLGNBQ0EsY0FDQSxXQUNBLGtCQUFtQixHQUNqQixJQUFZLFdBQVcscUJBQXFCLEdBQUssSUFBWSxXQUFXLHdCQUF3QixHQUVsRyxhQUFjLEdBQWlCLEVBQVMsQ0FBVyxFQUNuRCxVQUFXLEdBQWMsRUFBUyxDQUFXLEVBQzdDLE1BQ0UsR0FBWSxPQUNaLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBUyxXQUFXLENBQUMsR0FDN0MsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFTLFVBQVUsQ0FBQyxHQUc1QyxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVMsYUFBYSxDQUFDLEVBQ2pELGFBQWMsRUFDZCxxQkFBc0IsRUFBZ0IsU0FBUyxzQkFBc0IsRUFDckUsa0JBQW1CLEdBQXNCLENBQU8sRUFDaEQsMkJBQTRCLEVBQVksMkJBQTRCLENBQU8sRUFDM0Usc0JBQXVCLENBQUMsQ0FBQyxJQUFjLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxvQkFBb0IsQ0FBQyxFQUNoRyxtQkFBb0IsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLFNBQVMsQ0FBQyxFQUNsRSxpQkFBa0IsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLFFBQVEsQ0FBQyxFQUMvRCx1QkFBd0IsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLGNBQWMsQ0FBQyxFQUMzRSxzQkFBdUIsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLGFBQWEsQ0FBQyxFQUN6RSxrQkFBbUIsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLFNBQVMsQ0FBQyxFQUNqRSxrQkFBbUIsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLFNBQVMsQ0FBQyxFQUNqRSx1QkFBd0IsRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLGNBQWMsQ0FBQyxFQUMzRSwwQkFDQSxpQ0FBa0MsRUFDaEMsc0VBQ0EsQ0FDRixFQUNBLHdCQUF5QixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsZUFBZSxDQUFDLEVBQzdFLDhCQUErQixFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVMsVUFBVyxlQUFlLENBQUMsRUFDOUYsc0JBQXVCLEVBQVksK0NBQWdELENBQU8sRUFDMUYsc0JBQXVCLEVBQVksK0NBQWdELENBQU8sRUFDMUYsb0JBQXFCLEVBQVksOEJBQStCLENBQU8sRUFDdkUsZ0JBQWlCLEVBQVksWUFBYSxDQUFPLEVBQ2pELGdDQUFpQyxFQUFZLDJEQUE0RCxDQUFPLEVBQ2hILGdDQUFpQyxFQUFZLDJEQUE0RCxDQUFPLEVBQ2hILDhCQUErQixFQUFZLDBDQUEyQyxDQUFPLEVBQzdGLDBCQUEyQixFQUFZLHFCQUFzQixDQUFPLEVBQ3BFLFVBQVcsQ0FDVCxNQUFPLENBQUMsQ0FBQyxFQUFhLE1BQ3RCLE9BQVEsQ0FBQyxDQUFDLEVBQWdCLGtCQUMxQixRQUFTLENBQUMsQ0FBQyxFQUFhLGdCQUFrQixDQUFDLENBQUMsRUFBZ0IsZUFDNUQsU0FBVSxDQUFDLENBQUMsRUFBZ0Isa0JBQzVCLFVBQVcsQ0FBQyxDQUFDLEVBQWEsZ0JBQWtCLENBQUMsQ0FBQyxFQUFnQixlQUM5RCxXQUFZLEdBQVcsU0FBUyx1QkFBdUIsRUFDdkQsTUFBTyxDQUFDLENBQUMsRUFBYSxNQUN0QixLQUFNLENBQUMsQ0FBQyxFQUFhLEtBQ3JCLGVBQ0UsQ0FBQyxDQUFDLEVBQWEscUJBQXVCLENBQUMsQ0FBQyxFQUFnQixxQkFBdUIsQ0FBQyxDQUFDLEVBQWdCLFdBQ25HLGtCQUFtQixHQUE4QixDQUFPLEVBQ3hELE9BQVEsQ0FBQyxDQUFDLEVBQWEsbUJBQXFCLENBQUMsQ0FBQyxFQUFnQixPQUM5RCxRQUFTLENBQUMsQ0FBQyxFQUFnQixRQUMzQixZQUFhLENBQUMsQ0FBQyxFQUFhLGdCQUM1QixnQkFBaUIsQ0FBQyxFQUNoQixFQUFnQixxQkFDaEIsRUFBZ0IsT0FBUyxHQUN6QixFQUFlLE9BQVMsR0FFMUIsVUFBVyxDQUFDLENBQUMsRUFBZ0Isb0JBQzdCLE1BQ0UsQ0FBQyxDQUFDLEVBQWEsb0JBQ2YsQ0FBQyxDQUFDLEVBQWdCLG9CQUNsQixDQUFDLENBQUMsRUFBYSxvQkFDZixDQUFDLENBQUMsRUFBZ0Isb0JBQ2xCLEdBQ0YsT0FBUSxDQUFDLENBQUMsRUFBYSxRQUFVLENBQUMsQ0FBQyxFQUFnQixPQUNuRCxLQUFNLENBQUMsQ0FBQyxFQUFhLE1BQVEsQ0FBQyxDQUFDLEVBQWdCLEtBQy9DLEdBQUksQ0FBQyxDQUFDLEVBQWEsb0JBQXNCLENBQUMsQ0FBQyxFQUFnQixrQkFDN0QsRUFDQSxRQUFTLENBQ1AsU0FBVSxFQUNWLE9BQVEsRUFBZSxTQUFTLDBCQUEwQixFQUMxRCxJQUFLLEVBQWUsU0FBUyx1QkFBdUIsQ0FDdEQsRUFDQSxxQkFDQSxVQUFXLE1BQU0sR0FBYyxDQUFPLEVBQ3RDLGNBQ0EsV0FDRixFQUNBLEdBQ0UsRUFBTyxvQkFDUCxFQUFPLGtCQUNQLEVBQU8sd0JBQ1AsRUFBTyx1QkFDUCxFQUFPLG1CQUNQLEVBQU8sbUJBQ1AsRUFBTyx3QkFDUCxFQUFPLHdCQUNQLEVBQU8sd0JBRVAsT0FBTyxDQUVYLE1BQVEsQ0FFUixDQUNGLENBRUEsU0FBUyxHQUF1QixFQUEwQixDQUN4RCxJQUFNLEVBQVUsRUFBSyxRQUFRLENBQU8sRUFDcEMsT0FDRSxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVMsV0FBVyxDQUFDLEdBQzdDLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBUyxZQUFZLENBQUMsR0FDOUMsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFTLGdCQUFnQixDQUFDLENBRXRELENBRUEsU0FBUyxHQUFpQixFQUFpQixFQUFtQyxDQUM1RSxJQUFNLEVBQVUsRUFBWSxRQWE1QixPQVpJLEdBQVcsT0FBTyxPQUFPLENBQU8sQ0FBQyxDQUFDLEtBQU0sR0FBVyxPQUFPLEdBQVcsVUFBWSxFQUFPLFNBQVMsVUFBVSxDQUFDLEdBSzlHLENBQUMsaUJBQWtCLGdCQUFpQixlQUFlLENBQUMsQ0FBQyxLQUFNLEdBQ3pELEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUyxDQUFRLENBQUMsQ0FDL0MsRUFFTyxHQUdGLEdBQW1CLEVBQVMsdUJBQXVCLENBQzVELENBRUEsU0FBUyxHQUFjLEVBQWlCLEVBQW1DLENBQ3pFLElBQU0sRUFBVSxFQUFZLFFBUzVCLE9BUkksR0FBVyxPQUFPLE9BQU8sQ0FBTyxDQUFDLENBQUMsS0FBTSxHQUFXLE9BQU8sR0FBVyxVQUFZLEVBQU8sU0FBUyxTQUFTLENBQUMsR0FJM0csRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLGdCQUFnQixDQUFDLEdBQUssRUFBRyxXQUFXLEVBQUssUUFBUSxFQUFTLGNBQWMsQ0FBQyxFQUN4RyxHQUdGLEdBQW1CLEVBQVMsV0FBVyxDQUNoRCxDQUVBLFNBQVMsR0FBbUIsRUFBaUIsRUFBd0IsQ0FDbkUsSUFBTSxFQUFnQixFQUFLLFFBQVEsRUFBUyxVQUFXLFdBQVcsRUFDbEUsR0FBSSxDQUNGLE9BQU8sRUFDSixZQUFZLENBQWEsQ0FBQyxDQUMxQixLQUFNLEdBQWEsYUFBYSxLQUFLLENBQVEsR0FBSyxHQUFvQixFQUFlLEVBQVUsQ0FBSyxDQUFDLENBQzFHLE1BQVEsQ0FDTixNQUFPLEVBQ1QsQ0FDRixDQUVBLFNBQVMsR0FBb0IsRUFBdUIsRUFBa0IsRUFBd0IsQ0FDNUYsR0FBSSxDQUNGLE9BQU8sRUFBTSxLQUFLLEVBQUcsYUFBYSxFQUFLLEtBQUssRUFBZSxDQUFRLEVBQUcsTUFBTSxDQUFDLENBQy9FLE1BQVEsQ0FDTixNQUFPLEVBQ1QsQ0FDRixDQUVBLGVBQWUsR0FBYyxFQUFrRCxDQUM3RSxJQUFNLEVBQWdDLENBQUMsRUFDdkMsSUFBSyxJQUFNLElBQVksQ0FBQyxZQUFhLFlBQVksRUFBRyxDQUNsRCxJQUFNLEVBQVcsRUFBSyxRQUFRLEVBQVMsQ0FBUSxFQUMvQyxHQUFJLENBQ0YsSUFBTSxFQUFXQyxFQUFVLE1BQU1ELEVBQUksU0FBUyxFQUFVLE1BQU0sQ0FBQyxFQUMvRCxJQUFLLEdBQU0sQ0FBQyxFQUFNLEtBQVUsT0FBTyxRQUFRLEVBQVMsT0FBUyxDQUFDLENBQUMsRUFDN0QsRUFBTSxHQUFRLEdBQW9CLENBQUssQ0FFM0MsTUFBUSxDQUVSLENBQ0YsQ0FDQSxPQUFPLENBQ1QsQ0FFQSxTQUFTLEdBQW9CLEVBQXdCLENBS25ELE9BSkksT0FBTyxHQUFVLFNBQWlCLEVBRWxDLE1BQU0sUUFBUSxDQUFLLEVBQVUsRUFBTSxPQUFRLEdBQStCLE9BQU8sR0FBWSxRQUFRLENBQUMsQ0FBQyxLQUFLO0NBQUksRUFDaEgsR0FBUyxPQUFPLEdBQVUsU0FBaUIsR0FBcUIsRUFBNEIsR0FBRyxFQUM1RixFQUNULENBRUEsU0FBUyxFQUFZLEVBQWlCLEVBQTBCLENBQzlELE9BQU8sRUFBRyxTQUFTLEVBQVMsQ0FBRSxJQUFLLEdBQU0sSUFBSyxFQUFTLE9BQVEsQ0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFTLENBQ3hGLENBRUEsU0FBUyxHQUFzQixFQUEyQixDQUN4RCxPQUFPLEVBQ0osU0FBUyxnQkFBaUIsQ0FBRSxJQUFLLEdBQU0sSUFBSyxFQUFTLE9BQVEsQ0FBVyxDQUFDLENBQUMsQ0FDMUUsSUFBSyxHQUFhLEVBQUssUUFBUSxDQUFRLENBQUMsQ0FBQyxDQUN6QyxVQUFVLEVBQUcsSUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBUyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQ3ZGLENBRUEsU0FBUyxHQUE4QixFQUEwQixDQU0vRCxPQUxjLEVBQUcsU0FBUyxpREFBa0QsQ0FDMUUsSUFBSyxHQUNMLElBQUssRUFDTCxPQUFRLENBQUMsR0FBRyxFQUFZLGtCQUFtQixjQUFlLGNBQWUsd0JBQXdCLENBQ25HLENBQ1csQ0FBQyxDQUFDLEtBQU0sR0FBUyxDQUMxQixJQUFNLEVBQVUsRUFBRyxhQUFhLEVBQUssUUFBUSxFQUFTLENBQUksRUFBRyxNQUFNLEVBQ25FLE1BQU8sZ0hBQWdILEtBQ3JILENBQ0YsQ0FDRixDQUFDLENBQ0gsQ0FFQSxlQUFlLEdBQWMsRUFBaUIsRUFBd0UsQ0FHcEgsSUFBTSxHQUFTLE1BRkgsR0FBVSxDQUNFLENBQUMsQ0FBQyxXQUFXLEVBQUksRUFBQSxDQUNsQixLQUFNLEdBQU0sRUFBRSxPQUFTLFFBQVEsRUFDaEQsRUFBWSxHQUFRLEtBQUssT0FBUyxHQUFRLEtBQUssS0FDckQsR0FBSSxPQUFPLEdBQWMsU0FBVSxDQUNqQyxJQUFNLEVBQU8sTUFBTSxHQUFnQixDQUFTLEVBQzVDLEdBQUksRUFBTSxPQUFPLENBQ25CLENBRUEsSUFBTSxFQUFNLE9BQU8sRUFBWSxZQUFlLFNBQVcsRUFBWSxXQUFhLEVBQVksWUFBWSxJQUMxRyxHQUFJLEVBQUssQ0FDUCxJQUFNLEVBQU8sTUFBTSxHQUFnQixDQUFHLEVBQ3RDLEdBQUksR0FBUSxFQUFLLFVBQVksWUFBYSxPQUFPLENBQ25ELENBQ0YsQ0FFQSxlQUFlLEdBQWdCLEVBQXFFLENBQ2xHLEdBQU0sQ0FBQyxFQUFLLEdBQVEsRUFBVyxjQUFjLENBQWEsRUFDdEQsTUFBQyxHQUFPLENBQUMsR0FFYixHQUFJLENBTUYsT0FBTyxNQUpnQixFQUFXLENBQUMsQ0FBQyxRQUFRLDRCQUE2QixDQUN2RSxNQUFPLEVBQ1AsS0FBTSxDQUNSLENBQUMsRUFBQSxDQUNlLElBQ2xCLE9BQVMsRUFBTyxDQUNkLElBQU0sRUFBcUIsR0FBMEIsQ0FBSyxFQUMxRCxHQUFJLEVBQ0YsTUFBTyxDQUFFLFVBQVcsQ0FBbUIsQ0FFM0MsQ0FDRixDQUVBLFNBQVMsR0FBMEIsRUFBb0MsQ0FDckUsR0FBSSxDQUFDLEdBQVMsT0FBTyxHQUFVLFNBQVUsT0FFekMsSUFBTSxFQUNKLGFBQWMsRUFDVCxFQUEyRixTQUM1RixJQUFBLEdBQ0EsRUFBUyxHQUFVLFFBQVcsRUFBOEIsT0FDbEUsR0FBSSxJQUFXLEtBQU8sSUFBVyxJQUFLLE9BRXRDLElBQU0sRUFBVyxHQUFVLFNBQVMsU0FDcEMsR0FBSSxPQUFPLEdBQWEsU0FBVSxPQUVsQyxHQUFNLENBQUMsRUFBSyxHQUFRLEVBQVcsY0FBYyxDQUFRLEVBQ2pELE1BQUMsR0FBTyxDQUFDLEdBRWIsTUFBTyxHQUFHLEVBQUksR0FBRyxHQUNuQixDQzliQSxNQUFNLEdBQXdCLENBQUMsZUFBZ0Isa0JBQW1CLHVCQUF3QixrQkFBa0IsRUFDdEcsR0FBbUMsT0FBTyxHQUFHLGlDQUM3QyxHQUErQixDQUMvQixPQUFPLElBQUksR0FBaUMsc0JBQXVCLEdBQUcsRUFDdEUsT0FBTyxXQUFXLEdBQWlDLHNCQUF1QixHQUFHLEVBQzdFLE9BQ0Ysb0NBQW9DLEdBQWlDLGlDQUNyRSxHQUNGLEVBQ0ksT0FDRix5Q0FBeUMsR0FBaUMsaUNBQzFFLEdBQ0YsRUFDSSxPQUFPLGdDQUFnQyxHQUFpQyxpQ0FBa0MsR0FBRyxDQUNuSCxFQVNBLFNBQWdCLEdBQTRCLEVBQWdDLENBQzFFLElBQU0sRUFBb0IsRUFBUSxRQUFRLEVBQThCLEVBQ3hFLEdBQUksRUFBa0IsU0FBVyxFQUFHLE9BRXBDLElBQU0sRUFBVSxFQUNiLEtBQ0UsQ0FBRSxpQkFBZ0IsVUFBUyxjQUFhLGVBQ3ZDLEtBQUssRUFBSyxLQUFLLEVBQVMsY0FBYyxFQUFFLElBQUksRUFBWSxHQUFHLEVBQWUsUUFBUSxHQUN0RixDQUFDLENBQ0EsS0FBSztDQUFJLEVBRVosTUFBVSxNQUNSLG1IQUFtSCxHQUNySCxDQUNGLENBRUEsU0FBUyxHQUErQixFQUFxRCxDQUMzRixJQUFNLEVBQWMsRUFBTyxZQUMzQixHQUFJLENBQUMsRUFBYSxNQUFPLENBQUMsRUFFMUIsSUFBTSxFQUFrRCxDQUFDLEVBQ3pELElBQUssSUFBTSxLQUFlLEdBQXVCLENBQy9DLElBQU0sRUFBVSxFQUFZLEdBQ3ZCLEtBRUwsSUFBSyxHQUFNLENBQUMsRUFBZ0IsS0FBYyxPQUFPLFFBQVEsQ0FBTyxFQUN6RCxHQUNBLEdBQXlCLENBQVMsSUFDbkMsR0FBZ0MsQ0FBUyxHQUU3QyxFQUFrQixLQUFLLENBQ3JCLGlCQUNBLFFBQVMsRUFBTyxRQUNoQixjQUNBLFdBQ0YsQ0FBQyxFQUVMLENBQ0EsT0FBTyxDQUNULENBRUEsU0FBUyxHQUF5QixFQUE0QixDQUM1RCxPQUNFLEdBQTJCLENBQVMsR0FDcEMsc0NBQXNDLEtBQUssQ0FBUyxHQUNwRCw0REFBNEQsS0FBSyxDQUFTLEdBQzFFLDBDQUEwQyxLQUFLLENBQVMsR0FDeEQsa0NBQWtDLEtBQUssQ0FBUyxHQUNoRCxFQUFVLFdBQVcsTUFBTSxHQUMzQixFQUFVLFdBQVcsTUFBTSxHQUMzQixFQUFVLFdBQVcsWUFBWSxDQUVyQyxDQUVBLFNBQVMsR0FBMkIsRUFBNEIsQ0FDOUQsTUFBTywwQ0FBMEMsS0FBSyxDQUFTLENBQ2pFLENBRUEsU0FBUyxHQUFnQyxFQUE0QixDQUNuRSxPQUFPLEdBQTZCLEtBQU0sR0FBWSxFQUFRLEtBQUssQ0FBUyxDQUFDLENBQy9FLENDbkNBLGVBQWUsSUFBc0IsQ0FDbkMsSUFBTSxFQUFPLE1BQU0sRUFBTSxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQSxDQUMzQyxRQUFRLGVBQWdCLHVEQUF5RCxHQUFVLENBQzFGLEVBQU0sV0FBVyxRQUFTLENBQ3hCLFNBQVUsNkJBQ1YsTUFBTyxHQUNQLEtBQU0sU0FDTixRQUFTLENBQUMsR0FBRyxDQUNmLENBQUMsQ0FDSCxDQUFDLENBQUEsQ0FDQSxRQUFRLENBQ1AsSUFBSyxDQUNILFlBQWEsb0RBQ2IsS0FBTSxVQUNOLFFBQVMsR0FDVCxNQUFPLEdBQ1QsRUFDQSxTQUFVLENBQ1IsWUFBYSwrQkFDYixLQUFNLFVBQ04sUUFBUyxHQUNULE1BQU8sR0FDVCxFQUNBLFFBQVMsQ0FDUCxZQUFhLHdDQUNiLEtBQU0sVUFDTixRQUFTLEdBQ1QsTUFBTyxHQUNULENBQ0YsQ0FBQyxDQUFBLENBQ0EsUUFBUSxHQUFXLENBQUMsQ0FBQSxDQUNwQixPQUFPLENBQUMsQ0FBQyxLQUNaLEVBQVEsVUFBWSxFQUFLLFFBQ3pCLEVBQVEsa0JBQW9CLEVBQUssSUFFakMsSUFBSSxFQUEwQixHQUM5QixHQUFJLENBQ0YsRUFBMEIsTUFBTSxHQUFvQixFQUFLLE1BQW1CLEVBQUssUUFBUSxDQUMzRixRQUFVLENBR1IsR0FBcUIsQ0FDdkIsQ0FDSSxJQUNGLFFBQVEsU0FBVyxFQUV2QixDQUVBLGVBQWUsR0FBb0IsRUFBaUIsRUFBcUMsQ0FDdkYsSUFBSSxFQUEwQixHQUM5QixJQUFLLElBQU0sS0FBZSxFQUFPLENBQy9CLElBQU0sRUFBa0IsRUFBSyxLQUFLLEVBQWEsVUFBVSxFQUVuRCxHQURXLE1BQU0sT0FBdUIsRUFBRyxTQUFTLFFBQVEsRUFBaUIsQ0FBRSxjQUFlLEVBQUssQ0FBQyxDQUFDLEdBQU0sQ0FBQyxFQUFBLENBQ3RGLE9BQVEsR0FBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSyxHQUFNLEVBQUssS0FBSyxFQUFpQixFQUFFLElBQUksQ0FBQyxFQUV4RyxNQUFNLEdBQXNDLENBQUMsRUFBYSxHQUFHLENBQVcsQ0FBQyxFQUV6RSxJQUFNLEVBQWEsTUFBTSxHQUFpQixDQUFXLEVBSXJELEdBSEksRUFBUSxVQUdSLENBQUMsRUFBWSxDQUNmLFFBQVEsTUFBTSxxQ0FBcUMsR0FBYSxFQUNoRSxFQUEwQixHQUMxQixRQUNGLENBQ0EsSUFBTSxFQUFzQixHQUFTLENBQVUsRUFNekMsRUFBb0IsQ0FBQyxFQUFZLElBRGIsTUFIYyxRQUFRLElBQzlDLEVBQVksSUFBSyxHQUFlLEdBQWlCLEVBQVksQ0FBVSxDQUFDLENBQzFFLEVBQUEsQ0FDb0QsT0FBUSxHQUFXLENBQUMsQ0FBQyxDQUNmLENBQUMsRUFFM0QsR0FBSSxFQUFRLFVBQ1YsSUFBSyxJQUFNLEtBQVUsRUFDbkIsUUFBUSxLQUFLLENBQU0sRUFHdkIsR0FBNEIsQ0FBaUIsRUFHN0MsTUFBTSxHQUFrQixDQUFVLEVBQzlCLEVBQVcsT0FDYixNQUFNLEdBQW1CLENBQVUsRUFHckMsSUFBTSxFQUNKLENBQUMsR0FBd0IsRUFBVyxVQUFVLElBQzdDLEVBQVcsWUFBWSxXQUFXLHFCQUFxQixHQUN0RCxFQUFXLFlBQVksV0FBVyx3QkFBd0IsR0FDOUQsTUFBTSxRQUFRLElBQUksQ0FDaEIsR0FBa0IsQ0FBVSxFQUM1QixFQUFvQixTQUFXLEdBQWUsQ0FBVSxDQUFDLEVBQ3pELEdBQTBCLEVBQVksQ0FBaUIsRUFDdkQsR0FBcUIsQ0FBVSxFQUMvQixHQUFxQixDQUFVLEVBQy9CLEdBQXFCLEVBQVksQ0FBaUIsRUFDbEQsR0FBcUIsQ0FBVSxFQUMvQixHQUFzQixDQUFVLEVBQ2hDLEdBQXdCLENBQVUsRUFDbEMsR0FBcUIsQ0FBVSxFQUMvQixHQUFpQixDQUFVLEVBQzNCLEdBQXFCLENBQVUsRUFDL0IsR0FBa0IsQ0FBVSxFQUM1QixHQUFJLEVBQXFCLENBQUMsR0FBa0IsQ0FBVSxDQUFDLEVBQUksQ0FBQyxFQUM1RCxHQUFZLENBQVUsRUFDdEIsR0FBd0IsQ0FBVSxFQUNsQyxHQUFhLENBQVUsRUFDdkIsR0FBb0IsQ0FBVSxFQUM5QixHQUFvQyxDQUFVLEVBQzlDLEdBQXFCLENBQVUsQ0FDakMsQ0FBQyxFQUNELE1BQU0sRUFBWSxXQUFXLEVBRTdCLElBQU0sRUFBNEIsQ0FBQyxFQUNuQyxJQUFLLElBQU0sS0FBVSxHQUNmLEVBQU8sdUJBQXlCLEVBQU8sa0NBQ3pDLEVBQVMsS0FBSyxHQUFtQixFQUFRLEVBQU8sT0FBUyxFQUFvQixDQUFDLENBQU0sQ0FBQyxDQUFDLEVBRXBGLEVBQU8sVUFBVSxnQkFDbkIsRUFBUyxLQUFLLEdBQW9CLENBQU0sQ0FBQyxFQUV2QyxFQUFPLFVBQVUsTUFDbkIsRUFBUyxLQUFLLEdBQWtCLENBQU0sQ0FBQyxFQUV6QyxNQUFNLEdBQWtCLEVBQVEsQ0FBVSxFQUMxQyxNQUFNLEVBQVksV0FBVyxFQUN6QixHQUFDLEVBQU8sUUFBVSxDQUFDLEVBQU8sMEJBRzlCLE1BQU0sR0FBdUIsQ0FBTSxFQUNuQyxNQUFNLEdBQW9CLEVBQVEsRUFBWSxDQUFRLEVBRXRELEVBQVMsS0FBSyxHQUFxQixDQUFNLENBQUMsRUFDdEMsRUFBTywrQkFBaUMsRUFBTyx3QkFDakQsRUFBUyxLQUFLLEdBQXVCLENBQU0sQ0FBQyxHQUUxQyxFQUFPLHVCQUF5QixFQUFPLGtDQUN6QyxFQUFTLEtBQUssR0FBaUIsQ0FBTSxDQUFDLEVBRXBDLEVBQWtCLENBQU0sR0FDMUIsRUFBUyxLQUFLLEdBQW9CLENBQU0sQ0FBQyxFQUN6QyxFQUFTLEtBQUssR0FBcUIsRUFBUSxDQUFVLENBQUMsR0FDN0MsQ0FBQyxFQUFPLFFBQVUsRUFBTyx3QkFBMEIsRUFBa0IsQ0FBVSxHQUl4RixFQUFTLEtBQUssR0FBcUIsRUFBUSxDQUFVLENBQUMsRUFFcEQsRUFBTyxVQUFVLFNBQ25CLEVBQVMsS0FBSyxHQUEwQixDQUFNLENBQUMsR0FHbkQsTUFBTSxRQUFRLElBQUksQ0FBUSxFQUMxQixNQUFNLEVBQVksV0FBVyxFQUM3QixNQUFNLEdBQWUsRUFBWSxDQUFpQixFQUVsRCxJQUFNLEVBQWlCLEVBQVcsTUFBUSxNQUFRLE9BRTlDLEVBQVcsTUFDYixNQUFNLEVBQU8sMEJBQTBCLGlCQUFrQixTQUFZLENBQ25FLE1BQU0sUUFBUSxRQUFRLEVBQ3RCLEdBQWUsQ0FBVyxDQUM1QixDQUFDLEVBRUQsRUFBVSxFQUFnQixDQUFDLFVBQVcsZ0JBQWdCLEVBQUcsQ0FBVyxFQUV0RSxFQUFVLEVBQWdCLENBQUMsU0FBUyxFQUFHLENBQVcsRUFFbEQsTUFBTSxHQUFtQixDQUFVLENBQ3JDLENBQ0EsT0FBTyxDQUNULENBRUEsU0FBUyxHQUFlLEVBQTJCLENBSWpELElBQU0sRUFBUyxHQUF5QixNQUFPLENBQUMsU0FBUyxFQUFHLENBQVcsRUFDdkUsR0FBSSxJQUFXLEVBQ2IsTUFBVSxNQUFNLGtFQUFrRSxHQUFRLENBRTlGLENBRUEsU0FBUyxJQUFxQixDQUM1QixJQUFJLEVBQWlCLEVBQUssUUFBUSxJQUFJLElBQUksT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFDbkUsS0FBTyxDQUFDLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBZ0IsY0FBYyxDQUFDLEdBQzdELEVBQWlCLEVBQUssUUFBUSxDQUFjLEVBSzlDLE9BSG9CLEtBQUssTUFBTSxFQUFHLGFBQWEsRUFBSyxLQUFLLEVBQWdCLGNBQWMsRUFBRyxNQUFNLENBRy9FLENBQUMsQ0FBQyxPQUNyQixDQUVBLE1BQU0sR0FBSyJ9