@willbooster/wbfy 1.15.3 → 1.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +86 -80
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,32 +1,34 @@
1
- import e from"node:fs";import t from"node:path";import n from"yargs";import*as r from"typescript/unstable/ast";import{PromisePool as i}from"minimal-promise-pool";import{API as a}from"typescript/unstable/sync";import o from"node:fs/promises";import s from"fast-glob";import c from"semver/functions/compare.js";import l from"semver/ranges/min-version.js";import u from"deepmerge";import d from"js-yaml";import{parse as f}from"smol-toml";import p from"node:os";import m from"node:child_process";import h from"semver";import{Octokit as g}from"@octokit/core";import{createRequire as ee}from"node:module";import te from"dotenv";import{distance as _}from"fastest-levenshtein";import{simpleGit as ne}from"simple-git";import{z as v}from"zod";async function re(e){return new Promise(t=>setTimeout(t,e))}async function ie(e){try{return await e()}catch{}}async function y(e){try{return await e()}catch(e){if(typeof e==`object`&&e&&`code`in e&&e.code===`ENOENT`)return;throw e}}async function ae(e,{beforeRetry:t,handleError:n,retryCount:r=3,retryLogger:i,shouldRetry:a,sleepMilliseconds:o=0,updateSleepMilliseconds:s}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await n?.(e),c++,c>=r||a&&!a(e))throw e;o>0&&await re(o),s&&(o=s(o)),i?.(`Retry due to: ${e}
1
+ import e from"node:fs";import t from"node:path";import n from"yargs";import*as r from"typescript/unstable/ast";import{PromisePool as i}from"minimal-promise-pool";import{API as a}from"typescript/unstable/sync";import o from"node:fs/promises";import s from"fast-glob";import c from"semver/functions/compare.js";import l from"semver/ranges/min-version.js";import u from"deepmerge";import d from"js-yaml";import f from"node:child_process";import{parse as p}from"smol-toml";import m from"node:os";import h from"semver";import{simpleGit as g}from"simple-git";import{z as _}from"zod";import{Octokit as ee}from"@octokit/core";import{createRequire as te}from"node:module";import ne from"dotenv";import{distance as re}from"fastest-levenshtein";async function ie(e){return new Promise(t=>setTimeout(t,e))}async function ae(e){try{return await e()}catch{}}async function v(e){try{return await e()}catch(e){if(typeof e==`object`&&e&&`code`in e&&e.code===`ENOENT`)return;throw e}}async function oe(e,{beforeRetry:t,handleError:n,retryCount:r=3,retryLogger:i,shouldRetry:a,sleepMilliseconds:o=0,updateSleepMilliseconds:s}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await n?.(e),c++,c>=r||a&&!a(e))throw e;o>0&&await ie(o),s&&(o=s(o)),i?.(`Retry due to: ${e}
2
2
  ${e instanceof Error?`---
3
- `+(e.stack??``):``}`),await t?.(e)}}const b=new class{isVerbose=!1;doesUploadEnvVars=!1},x=new class{async functionIgnoringException(e,t){b.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}b.isVerbose&&console.info(`---------- ${e} end ----------`)}},S={async readFileIgnoringError(t){try{return await e.promises.readFile(t,`utf8`)}catch{}},async generateFile(n,r){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=r.trim();i&&(i+=`
4
- `),await e.promises.writeFile(n,i)}},C=new i;let oe;function se(){return oe??=new a({cwd:process.cwd()})}function ce(e){try{return se().updateSnapshot({openFiles:[e]}).getDefaultProjectForFile(e)?.program.getSourceFile(e)}catch{return}}function le(){oe?.close(),oe=void 0}const ue=[{name:`reactCompiler`,text:`reactCompiler: true`},{name:`reactStrictMode`,text:`reactStrictMode: true`},{name:`typescript`,text:`typescript: { ignoreBuildErrors: true }`}];async function de(n){return x.functionIgnoringException(`fixNextConfigJson`,async()=>{let r=[`ts`,`mts`,`cts`,`js`,`mjs`,`cjs`].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!r)return;let i=fe(r);if(!i)return;let{source:a,objectLiteral:o}=i,s=new Set(o.properties.map(e=>`name`in e&&e.name?ve(e.name,a):void 0)),c=ue.filter(e=>!s.has(e.name)).map(e=>e.text);if(c.length===0)return;let l=a.text,u=o.getEnd()-1,d=o.properties.at(-1),f=d?ye(l.slice(d.getEnd(),u)).includes(`,`):!1,p=o.properties.length>0&&!f?`, `:``,m=`${l.slice(0,u)}${p}${c.join(`, `)}${l.slice(u)}`;await C.run(()=>S.generateFile(r,m))})}function fe(e){let t=ce(e);if(!t)return;let n,i,a=new Map,o=[],s=e=>{if(r.isExportAssignment(e)){let a=pe(e.expression);a?n??=a:r.isIdentifier(e.expression)&&(i??=e.expression.getText(t))}else if(r.isBinaryExpression(e)&&e.operatorToken.kind===r.SyntaxKind.EqualsToken&&e.left.getText(t)===`module.exports`){let a=pe(e.right);a?n??=a:r.isIdentifier(e.right)&&(i??=e.right.getText(t))}else if(r.isVariableDeclaration(e)&&e.initializer){let n=pe(e.initializer);if(n&&r.isIdentifier(e.name)){a.set(e.name.getText(t),n);let r=e.type?.getText(t),i=me(e.initializer)?.getText(t);(r!==void 0&&_e(r)||i!==void 0&&_e(i))&&o.push(n)}}e.forEachChild(s)};t.forEachChild(s);let c=o[0]??n??(i?a.get(i):void 0)??a.get(`nextConfig`);return c?{source:t,objectLiteral:c}:void 0}function pe(e){let t=he(e);return r.isObjectLiteralExpression(t)?t:void 0}function me(e){let t=ge(e);return r.isAsExpression(t)||r.isSatisfiesExpression(t)?t.type:void 0}function he(e){let t=ge(e);for(;r.isAsExpression(t)||r.isSatisfiesExpression(t);)t=ge(t.expression);return t}function ge(e){let t=e;for(;r.isParenthesizedExpression(t);)t=t.expression;return t}function _e(e){return e===`NextConfig`||e.endsWith(`.NextConfig`)}function ve(e,t){return`text`in e&&typeof e.text==`string`?e.text:e.getText(t)}function ye(e){return e.replaceAll(/\/\/[^\n]*|\/\*[\s\S]*?\*\//g,``)}function w(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}function T(e){return e.doesContainJava||e.doesContainJavaInPackages}function be(e){return e.isBun?`bun`:`yarn`}const E=e=>({kind:`literal`,value:e}),xe=e=>({kind:`array`,value:e}),Se=(e,t=[])=>({kind:`object`,value:we(e,t)});function Ce(e,t){let n=we({trace:E(`process.env.CI ? 'on-first-retry' : 'retain-on-failure'`),screenshot:E(`process.env.CI ? 'only-on-failure' : 'on'`),video:E(`process.env.CI ? 'on-first-retry' : 'retain-on-failure'`)});return t&&(n.properties.baseURL=E(`process.env.NEXT_PUBLIC_BASE_URL`),n.memberOrder.unshift({kind:`property`,key:`baseURL`})),we({forbidOnly:E(`!!process.env.CI`),retries:E(`process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1`),use:{kind:`object`,value:n},...t?{webServer:Se({command:E(Fe(e)),url:E(`process.env.NEXT_PUBLIC_BASE_URL`),reuseExistingServer:E(`!!process.env.CI`),timeout:E(`300_000`),stdout:E(`'pipe'`),stderr:E(`'pipe'`),env:E(`{
3
+ `+(e.stack??``):``}`),await t?.(e)}}const y=new class{isVerbose=!1;doesUploadEnvVars=!1},b=new class{async functionIgnoringException(e,t){y.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}y.isVerbose&&console.info(`---------- ${e} end ----------`)}},x={async readFileIgnoringError(t){try{return await e.promises.readFile(t,`utf8`)}catch{}},async generateFile(n,r){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=r.trim();i&&(i+=`
4
+ `),await e.promises.writeFile(n,i)}},S=new i;let se;function ce(){return se??=new a({cwd:process.cwd()})}function le(e){try{return ce().updateSnapshot({openFiles:[e]}).getDefaultProjectForFile(e)?.program.getSourceFile(e)}catch{return}}function ue(){se?.close(),se=void 0}const de=[{name:`reactCompiler`,text:`reactCompiler: true`},{name:`reactStrictMode`,text:`reactStrictMode: true`},{name:`typescript`,text:`typescript: { ignoreBuildErrors: true }`}];async function fe(n){return b.functionIgnoringException(`fixNextConfigJson`,async()=>{let r=[`ts`,`mts`,`cts`,`js`,`mjs`,`cjs`].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!r)return;let i=pe(r);if(!i)return;let{source:a,objectLiteral:o}=i,s=new Set(o.properties.map(e=>`name`in e&&e.name?ye(e.name,a):void 0)),c=de.filter(e=>!s.has(e.name)).map(e=>e.text);if(c.length===0)return;let l=a.text,u=o.getEnd()-1,d=o.properties.at(-1),f=d?be(l.slice(d.getEnd(),u)).includes(`,`):!1,p=o.properties.length>0&&!f?`, `:``,m=`${l.slice(0,u)}${p}${c.join(`, `)}${l.slice(u)}`;await S.run(()=>x.generateFile(r,m))})}function pe(e){let t=le(e);if(!t)return;let n,i,a=new Map,o=[],s=e=>{if(r.isExportAssignment(e)){let a=me(e.expression);a?n??=a:r.isIdentifier(e.expression)&&(i??=e.expression.getText(t))}else if(r.isBinaryExpression(e)&&e.operatorToken.kind===r.SyntaxKind.EqualsToken&&e.left.getText(t)===`module.exports`){let a=me(e.right);a?n??=a:r.isIdentifier(e.right)&&(i??=e.right.getText(t))}else if(r.isVariableDeclaration(e)&&e.initializer){let n=me(e.initializer);if(n&&r.isIdentifier(e.name)){a.set(e.name.getText(t),n);let r=e.type?.getText(t),i=he(e.initializer)?.getText(t);(r!==void 0&&ve(r)||i!==void 0&&ve(i))&&o.push(n)}}e.forEachChild(s)};t.forEachChild(s);let c=o[0]??n??(i?a.get(i):void 0)??a.get(`nextConfig`);return c?{source:t,objectLiteral:c}:void 0}function me(e){let t=ge(e);return r.isObjectLiteralExpression(t)?t:void 0}function he(e){let t=_e(e);return r.isAsExpression(t)||r.isSatisfiesExpression(t)?t.type:void 0}function ge(e){let t=_e(e);for(;r.isAsExpression(t)||r.isSatisfiesExpression(t);)t=_e(t.expression);return t}function _e(e){let t=e;for(;r.isParenthesizedExpression(t);)t=t.expression;return t}function ve(e){return e===`NextConfig`||e.endsWith(`.NextConfig`)}function ye(e,t){return`text`in e&&typeof e.text==`string`?e.text:e.getText(t)}function be(e){return e.replaceAll(/\/\/[^\n]*|\/\*[\s\S]*?\*\//g,``)}function C(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}function w(e){return e.doesContainJava||e.doesContainJavaInPackages}function xe(e){return e.isBun?`bun`:`yarn`}const T=e=>({kind:`literal`,value:e}),Se=e=>({kind:`array`,value:e}),Ce=(e,t=[])=>({kind:`object`,value:Te(e,t)});function we(e,t){let n=Te({trace:T(`process.env.CI ? 'on-first-retry' : 'retain-on-failure'`),screenshot:T(`process.env.CI ? 'only-on-failure' : 'on'`),video:T(`process.env.CI ? 'on-first-retry' : 'retain-on-failure'`)});return t&&(n.properties.baseURL=T(`process.env.NEXT_PUBLIC_BASE_URL`),n.memberOrder.unshift({kind:`property`,key:`baseURL`})),Te({forbidOnly:T(`!!process.env.CI`),retries:T(`process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1`),use:{kind:`object`,value:n},...t?{webServer:Ce({command:T(Ie(e)),url:T(`process.env.NEXT_PUBLIC_BASE_URL`),reuseExistingServer:T(`!!process.env.CI`),timeout:T(`300_000`),stdout:T(`'pipe'`),stderr:T(`'pipe'`),env:T(`{
5
5
  ...process.env,
6
6
  PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',
7
- }`),gracefulShutdown:E(`{
7
+ }`),gracefulShutdown:T(`{
8
8
  signal: 'SIGTERM',
9
9
  timeout: 500,
10
- }`)})}:{}})}function we(e,t=[]){return{extraMembers:t,memberOrder:[...Object.keys(e).map(e=>({kind:`property`,key:e})),...t.map((e,t)=>({kind:`extra`,index:t}))],properties:e}}async function Te(n){let r=t.resolve(n.dirPath,`playwright.config.ts`);if(e.existsSync(r))return x.functionIgnoringException(`fixPlaywrightConfig`,async()=>{let e=Ie(r);if(!e)return;let t=Re(e.node,e.source);if(!t)return;let i=Ce(n,await Me(n.dirPath)&&ke(n,t)),a=Ee(i,t);Oe(a,i),Pe(a,n);let o=ze({kind:`object`,value:a},0),s=e.source.text,c=e.node.getStart(e.source),l=e.node.getEnd(),u=`${s.slice(0,c)}${o}${s.slice(l)}`;await C.run(()=>S.generateFile(r,u))})}function Ee(e,t){let n=new Set(Object.keys(t.properties)),r=[...e.extraMembers,...t.extraMembers],i=[...e.memberOrder.filter(e=>e.kind!==`property`||!n.has(e.key)),...t.memberOrder.map(t=>t.kind===`property`?t:{kind:`extra`,index:e.extraMembers.length+t.index})],a={...e.properties};for(let[e,n]of Object.entries(t.properties))a[e]=De(a[e],n);return{extraMembers:r,memberOrder:i,properties:a}}function De(e,t){return e?.kind===`object`&&t.kind===`object`?{kind:`object`,value:Ee(e.value,t.value)}:t}function Oe(e,t){let n=e.properties.use,r=t.properties.use;if(!(n?.kind!==`object`||r?.kind!==`object`))for(let e of[`trace`,`screenshot`,`video`]){let t=r.value.properties[e];t&&(n.value.properties[e]=t)}}function ke(e,t){return e.depending.next||t.properties.webServer!==void 0||Ae(t.properties.use)||je({kind:`object`,value:t},`NEXT_PUBLIC_BASE_URL`)}function Ae(e){return e?.kind===`object`&&e.value.properties.baseURL!==void 0}function je(e,t){return e.kind===`literal`?e.value.includes(t):e.kind===`array`?e.value.some(e=>je(e,t)):e.value.extraMembers.some(e=>e.includes(t))||Object.values(e.value.properties).some(e=>je(e,t))}async function Me(t){for(let n of Ne(t))try{let t=await e.promises.readFile(n,`utf8`);if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return!0}catch{}return!1}function Ne(n){let r=[`.env`,`.env.test`,`.env.example`,`mise.toml`,`mise.test.toml`],i=[];for(let a=t.resolve(n);i.push(...r.map(e=>t.resolve(a,e))),!(e.existsSync(t.resolve(a,`.git`))||t.dirname(a)===a);a=t.dirname(a));return i}function Pe(e,t){let n=e.properties.webServer;n?.kind===`object`&&(n.value.properties.command=E(Fe(t)))}function Fe(e){return`'${be(e)} wb start --mode test'`}function Ie(e){let t=ce(e);if(!t)return;let n,i=e=>{if(!n){if(r.isCallExpression(e)&&e.expression.getText(t)===`defineConfig`){let t=e.arguments[0];if(t&&r.isObjectLiteralExpression(t)){n=t;return}}e.forEachChild(i)}};return t.forEachChild(i),n?{source:t,node:n}:void 0}function Le(e,t){if(r.isObjectLiteralExpression(e)){let n=Re(e,t);return n?{kind:`object`,value:n}:E(e.getText(t))}if(r.isArrayLiteralExpression(e)){let n=e.elements.map(e=>Le(e,t));return n.some(e=>e===void 0)?E(e.getText(t)):xe(n)}return E(e.getText(t))}function Re(e,t){let n={extraMembers:[],memberOrder:[],properties:{}};for(let i of e.properties){if(r.isShorthandPropertyAssignment(i)){let e=i.name.getText(t);n.properties[e]=E(e),n.memberOrder.push({kind:`property`,key:e});continue}if(!r.isPropertyAssignment(i)||!r.isIdentifier(i.name)&&!r.isStringLiteral(i.name)){let e=n.extraMembers.push(i.getText(t))-1;n.memberOrder.push({kind:`extra`,index:e});continue}let e=Le(i.initializer,t);if(e===void 0)return;let a=i.name.getText(t);n.properties[a]=e,n.memberOrder.push({kind:`property`,key:a})}return n}function ze(e,t){let n=` `.repeat(t);if(e.kind===`array`){if(e.value.length===0)return`[]`;let r=` `.repeat(t+1);return`[\n${e.value.map(e=>{let n=ze(e,t+1).split(`
10
+ }`)})}:{}})}function Te(e,t=[]){return{extraMembers:t,memberOrder:[...Object.keys(e).map(e=>({kind:`property`,key:e})),...t.map((e,t)=>({kind:`extra`,index:t}))],properties:e}}async function Ee(n){let r=t.resolve(n.dirPath,`playwright.config.ts`);if(e.existsSync(r))return b.functionIgnoringException(`fixPlaywrightConfig`,async()=>{let e=Le(r);if(!e)return;let t=ze(e.node,e.source);if(!t)return;let i=we(n,await Ne(n.dirPath)&&Ae(n,t)),a=De(i,t);ke(a,i),Fe(a,n);let o=Be({kind:`object`,value:a},0),s=e.source.text,c=e.node.getStart(e.source),l=e.node.getEnd(),u=`${s.slice(0,c)}${o}${s.slice(l)}`;await S.run(()=>x.generateFile(r,u))})}function De(e,t){let n=new Set(Object.keys(t.properties)),r=[...e.extraMembers,...t.extraMembers],i=[...e.memberOrder.filter(e=>e.kind!==`property`||!n.has(e.key)),...t.memberOrder.map(t=>t.kind===`property`?t:{kind:`extra`,index:e.extraMembers.length+t.index})],a={...e.properties};for(let[e,n]of Object.entries(t.properties))a[e]=Oe(a[e],n);return{extraMembers:r,memberOrder:i,properties:a}}function Oe(e,t){return e?.kind===`object`&&t.kind===`object`?{kind:`object`,value:De(e.value,t.value)}:t}function ke(e,t){let n=e.properties.use,r=t.properties.use;if(!(n?.kind!==`object`||r?.kind!==`object`))for(let e of[`trace`,`screenshot`,`video`]){let t=r.value.properties[e];t&&(n.value.properties[e]=t)}}function Ae(e,t){return e.depending.next||t.properties.webServer!==void 0||je(t.properties.use)||Me({kind:`object`,value:t},`NEXT_PUBLIC_BASE_URL`)}function je(e){return e?.kind===`object`&&e.value.properties.baseURL!==void 0}function Me(e,t){return e.kind===`literal`?e.value.includes(t):e.kind===`array`?e.value.some(e=>Me(e,t)):e.value.extraMembers.some(e=>e.includes(t))||Object.values(e.value.properties).some(e=>Me(e,t))}async function Ne(t){for(let n of Pe(t))try{let t=await e.promises.readFile(n,`utf8`);if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return!0}catch{}return!1}function Pe(n){let r=[`.env`,`.env.test`,`.env.example`,`mise.toml`,`mise.test.toml`],i=[];for(let a=t.resolve(n);i.push(...r.map(e=>t.resolve(a,e))),!(e.existsSync(t.resolve(a,`.git`))||t.dirname(a)===a);a=t.dirname(a));return i}function Fe(e,t){let n=e.properties.webServer;n?.kind===`object`&&(n.value.properties.command=T(Ie(t)))}function Ie(e){return`'${xe(e)} wb start --mode test'`}function Le(e){let t=le(e);if(!t)return;let n,i=e=>{if(!n){if(r.isCallExpression(e)&&e.expression.getText(t)===`defineConfig`){let t=e.arguments[0];if(t&&r.isObjectLiteralExpression(t)){n=t;return}}e.forEachChild(i)}};return t.forEachChild(i),n?{source:t,node:n}:void 0}function Re(e,t){if(r.isObjectLiteralExpression(e)){let n=ze(e,t);return n?{kind:`object`,value:n}:T(e.getText(t))}if(r.isArrayLiteralExpression(e)){let n=e.elements.map(e=>Re(e,t));return n.some(e=>e===void 0)?T(e.getText(t)):Se(n)}return T(e.getText(t))}function ze(e,t){let n={extraMembers:[],memberOrder:[],properties:{}};for(let i of e.properties){if(r.isShorthandPropertyAssignment(i)){let e=i.name.getText(t);n.properties[e]=T(e),n.memberOrder.push({kind:`property`,key:e});continue}if(!r.isPropertyAssignment(i)||!r.isIdentifier(i.name)&&!r.isStringLiteral(i.name)){let e=n.extraMembers.push(i.getText(t))-1;n.memberOrder.push({kind:`extra`,index:e});continue}let e=Re(i.initializer,t);if(e===void 0)return;let a=i.name.getText(t);n.properties[a]=e,n.memberOrder.push({kind:`property`,key:a})}return n}function Be(e,t){let n=` `.repeat(t);if(e.kind===`array`){if(e.value.length===0)return`[]`;let r=` `.repeat(t+1);return`[\n${e.value.map(e=>{let n=Be(e,t+1).split(`
11
11
  `);if(n[n.length-1]=`${n.at(-1)},`,e.kind===`literal`)for(let e=1;e<n.length;e+=1)n[e]=`${r}${n[e]}`;return n[0]=`${r}${n[0]}`,n.join(`
12
12
  `)}).join(`
13
- `)}\n${n}]`}if(e.kind===`literal`)return e.value;let r=` `.repeat(t+1),i=new Set,a=Be(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if(n.kind===`extra`)return[He(e.value.extraMembers[n.index]??``,r)];if(a.get(n.key)!==o)return[];let s=e.value.properties[n.key];return!s||i.has(n.key)?[]:(i.add(n.key),[Ve(n.key,s,t,r)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!i.has(e)).map(([e,n])=>Ve(e,n,t,r))),o.length===0?`{\n${n}}`:`{\n${o.join(`
14
- `)}\n${n}}`}function Be(e){let t=new Map;for(let[n,r]of e.entries())r.kind===`property`&&t.set(r.key,n);return t}function Ve(e,t,n,r){let i=ze(t,n+1).split(`
13
+ `)}\n${n}]`}if(e.kind===`literal`)return e.value;let r=` `.repeat(t+1),i=new Set,a=Ve(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if(n.kind===`extra`)return[Ue(e.value.extraMembers[n.index]??``,r)];if(a.get(n.key)!==o)return[];let s=e.value.properties[n.key];return!s||i.has(n.key)?[]:(i.add(n.key),[He(n.key,s,t,r)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!i.has(e)).map(([e,n])=>He(e,n,t,r))),o.length===0?`{\n${n}}`:`{\n${o.join(`
14
+ `)}\n${n}}`}function Ve(e){let t=new Map;for(let[n,r]of e.entries())r.kind===`property`&&t.set(r.key,n);return t}function He(e,t,n,r){let i=Be(t,n+1).split(`
15
15
  `);if(i[i.length-1]=`${i.at(-1)},`,t.kind===`literal`)for(let e=1;e<i.length;e+=1)i[e]=`${r}${i[e]}`;return i[0]=`${r}${e}: ${i[0]}`,i.join(`
16
- `)}function He(e,t){let n=e.split(`
16
+ `)}function Ue(e,t){let n=e.split(`
17
17
  `);n[n.length-1]=`${n.at(-1)},`;for(let[e,r]of n.entries())n[e]=`${t}${r}`;return n.join(`
18
- `)}const D=[`**/node_modules/**`,`**/.antigravitycli/**`,`**/.venv/**`,`**/test-fixtures/**`,`**/test/fixtures/**`,`**/dist/**`,`**/build/**`,`**/target/**`,`**/temp/**`,`**/tmp/**`];async function Ue(e){return x.functionIgnoringException(`fixPrismaEnvFiles`,async()=>{let n=We(e),r=await s.glob([`*.env`,`*.env.*`],{dot:!0,cwd:e.dirPath,ignore:D});for(let i of r){let r=t.resolve(e.dirPath,i),a=await o.readFile(r,`utf8`),s=a.replaceAll(/DATABASE_URL\s*=\s*"?([^"#\n]+?\.sqlite3[^"#\n]*)"?/g,(e,t)=>`DATABASE_URL="${Ge(t,n)}"`);s!==a&&await o.writeFile(r,s)}})}function We(e){if(!e.depending.prisma)return!1;let t={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};return!t[`@prisma/adapter-better-sqlite3`]&&!t[`@prisma/adapter-libsql`]}function Ge(e,t){let n=e.indexOf(`?`),r=n===-1?e:e.slice(0,n),i=n===-1?``:e.slice(n+1),a=new URLSearchParams(i);a.delete(`connection_limit`),t&&a.set(`connection_limit`,`1`);let o=a.toString();return o?`${r}?${o}`:r}const Ke=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function O(e,t){let n,r,i;typeof t==`function`?r=t:n=t;let a={};for(i of[...n??[],...Object.keys(e).sort(r)])Ke(e,i)&&(a[i]=e[i]);return a}const qe=/^(?:( )+|\t+)/,k=`space`;function Je(e,t,n){return e&&t===k&&n===1}function Ye(e,t){let n=new Map,r=0,i,a;for(let o of e.split(/\n/g)){if(!o)continue;let e=o.match(qe);if(e===null)r=0,i=``;else{let o=e[0].length,s=e[1]?k:`tab`;if(Je(t,s,o))continue;s!==i&&(r=0),i=s;let c=1,l=0,u=o-r;if(r=o,u===0)c=0,l=1;else{let e=Math.abs(u);if(Je(t,s,e))continue;a=Xe(s,e)}let d=n.get(a);n.set(a,d===void 0?[1,0]:[d[0]+c,d[1]+l])}}return n}function Xe(e,t){return(e===k?`s`:`t`)+String(t)}function Ze(e){return{type:e[0]===`s`?k:`tab`,amount:Number(e.slice(1))}}function Qe(e){let t,n=0,r=0;for(let[i,[a,o]]of e)(a>n||a===n&&o>r)&&(n=a,r=o,t=i);return t}function $e(e,t){return(e===k?` `:` `).repeat(t)}function et(e){if(typeof e!=`string`)throw TypeError(`Expected a string`);let t=Ye(e,!0);t.size===0&&(t=Ye(e,!1));let n=Qe(t),r,i=0,a=``;return n!==void 0&&({type:r,amount:i}=Ze(n),a=$e(r,i)),{amount:i,type:r,indent:a}}function tt(e){if(typeof e!=`string`)throw TypeError(`Expected a string`);let t=e.match(/(?:\r?\n)/g)||[];if(t.length===0)return;let n=t.filter(e=>e===`\r
18
+ `)}const E=[`**/node_modules/**`,`**/.antigravitycli/**`,`**/.venv/**`,`**/test-fixtures/**`,`**/test/fixtures/**`,`**/dist/**`,`**/build/**`,`**/target/**`,`**/temp/**`,`**/tmp/**`];async function We(e){return b.functionIgnoringException(`fixPrismaEnvFiles`,async()=>{let n=Ge(e),r=await s.glob([`*.env`,`*.env.*`],{dot:!0,cwd:e.dirPath,ignore:E});for(let i of r){let r=t.resolve(e.dirPath,i),a=await o.readFile(r,`utf8`),s=a.replaceAll(/DATABASE_URL\s*=\s*"?([^"#\n]+?\.sqlite3[^"#\n]*)"?/g,(e,t)=>`DATABASE_URL="${Ke(t,n)}"`);s!==a&&await o.writeFile(r,s)}})}function Ge(e){if(!e.depending.prisma)return!1;let t={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};return!t[`@prisma/adapter-better-sqlite3`]&&!t[`@prisma/adapter-libsql`]}function Ke(e,t){let n=e.indexOf(`?`),r=n===-1?e:e.slice(0,n),i=n===-1?``:e.slice(n+1),a=new URLSearchParams(i);a.delete(`connection_limit`),t&&a.set(`connection_limit`,`1`);let o=a.toString();return o?`${r}?${o}`:r}const qe=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function D(e,t){let n,r,i;typeof t==`function`?r=t:n=t;let a={};for(i of[...n??[],...Object.keys(e).sort(r)])qe(e,i)&&(a[i]=e[i]);return a}const Je=/^(?:( )+|\t+)/,Ye=`space`;function Xe(e,t,n){return e&&t===Ye&&n===1}function Ze(e,t){let n=new Map,r=0,i,a;for(let o of e.split(/\n/g)){if(!o)continue;let e=o.match(Je);if(e===null)r=0,i=``;else{let o=e[0].length,s=e[1]?Ye:`tab`;if(Xe(t,s,o))continue;s!==i&&(r=0),i=s;let c=1,l=0,u=o-r;if(r=o,u===0)c=0,l=1;else{let e=Math.abs(u);if(Xe(t,s,e))continue;a=Qe(s,e)}let d=n.get(a);n.set(a,d===void 0?[1,0]:[d[0]+c,d[1]+l])}}return n}function Qe(e,t){return(e===Ye?`s`:`t`)+String(t)}function $e(e){return{type:e[0]===`s`?Ye:`tab`,amount:Number(e.slice(1))}}function et(e){let t,n=0,r=0;for(let[i,[a,o]]of e)(a>n||a===n&&o>r)&&(n=a,r=o,t=i);return t}function tt(e,t){return(e===Ye?` `:` `).repeat(t)}function nt(e){if(typeof e!=`string`)throw TypeError(`Expected a string`);let t=Ze(e,!0);t.size===0&&(t=Ze(e,!1));let n=et(t),r,i=0,a=``;return n!==void 0&&({type:r,amount:i}=$e(n),a=tt(r,i)),{amount:i,type:r,indent:a}}function rt(e){if(typeof e!=`string`)throw TypeError(`Expected a string`);let t=e.match(/(?:\r?\n)/g)||[];if(t.length===0)return;let n=t.filter(e=>e===`\r
19
19
  `).length;return n>t.length-n?`\r
20
20
  `:`
21
- `}function nt(e){return typeof e==`string`&&tt(e)||`
22
- `}var rt=`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 it(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 A=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),j=e=>t=>Array.isArray(t)?e(t):t,at=e=>t=>Array.isArray(t)&&t.every(e=>typeof e==`string`)?e(t):t,ot=at(e=>[...new Set(e)]),M=A([ot,at(e=>e.toSorted())]),N=e=>(t,...n)=>it(t)?e(t,...n):t,P=(e,t)=>{let n=N(r=>(t&&(r=Object.fromEntries(Object.entries(r).map(([e,t])=>[e,n(t)]))),O(r,e)));return n},F=P(),st=P([`type`,`url`]),ct=P([`name`,`email`,`url`]),lt=P([`lib`,`bin`,`man`,`doc`,`example`,`test`]),I=(e,t)=>N((n,...r)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...r)}:n),ut=P(rt),dt=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)}},ft=P((e,t)=>{let{name:n,range:r}=dt(e),{name:i,range:a}=dt(t);return n===i?r?a?c(l(r),l(a)):1:-1:n.localeCompare(i,`en`)}),pt=e=>{let t=e.indexOf(`@`,+!!e.startsWith(`@`));return t===-1?e:e.slice(0,t)},mt=(e,t)=>{let n=pt(e),r=pt(t);return n<r?-1:+(n>r)},ht=new Map,gt=()=>{let t=process.cwd();return ht.has(t)||ht.set(t,e.existsSync(`yarn.lock`)||e.existsSync(`.yarn/`)||e.existsSync(`.yarnrc.yml`)||e.existsSync(`pnpm-lock.yaml`)||e.existsSync(`pnpm-workspace.yaml`)),ht.get(t)};function _t(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:!gt()}const L=N((e,t)=>Object.keys(e).length<2?e:_t(t)?O(e,(e,t)=>e.localeCompare(t,`en`)):O(e)),vt=A([P([`packages`,`catalog`]),I(`packages`,M),I(`catalog`,L)]),yt=A([P([`files`,`excludedFiles`,`env`,`parser`,`parserOptions`,`settings`,`plugins`,`extends`,`rules`,`overrides`,`globals`,`processor`,`noInlineConfig`,`reportUnusedDisableDirectives`]),I(`env`,F),I(`globals`,F),I(`overrides`,j(e=>e.map(yt))),I(`parserOptions`,F),I(`rules`,P((e,t)=>e.split(`/`).length-t.split(`/`).length||e.localeCompare(t))),I(`settings`,F)]),bt=P([`description`,`url`,`href`]),xt=A([N(e=>O(e,[...Object.keys(e).filter(e=>e!==`overrides`).sort(),`overrides`])),I(`overrides`,j(e=>e.map(A([F,I(`options`,F)]))))]),St=P([`node`,`npm`,`yarn`]),Ct=A([P([`command`,`dependencies`,`files`,`output`]),I(`dependencies`,j(e=>e.map(P([`script`,`cascade`])))),I(`env`,N(e=>O(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,P([`external`,`default`])(t)]))))),I(`service`,A([P([`readyWhen`]),I(`readyWhen`,F)]))]),wt=N(e=>O(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Ct(t)])))),Tt=I(`packageManager`,P([`name`,`version`,`onFail`])),Et=A([P([`peerDependencyRules`,`neverBuiltDependencies`,`onlyBuiltDependencies`,`onlyBuiltDependenciesFile`,`allowedDeprecatedVersions`,`allowNonAppliedPatches`,`updateConfig`,`auditConfig`,`requiredScripts`,`supportedArchitectures`,`overrides`,`patchedDependencies`,`packageExtensions`],!0),I(`overrides`,ft)]),Dt=new Set([`install`,`pack`,`prepare`,`publish`,`restart`,`shrinkwrap`,`start`,`stop`,`test`,`uninstall`,`version`]),Ot=(e,t)=>Object.hasOwn(t,`devDependencies`)&&Object.hasOwn(t.devDependencies,e),kt=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,At=e=>e.includes(`*`)&&kt.test(e),jt=e=>!Ot(`npm-run-all`,e)&&!Ot(`npm-run-all2`,e)?!1:[`scripts`,`betterScripts`].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>At(e));function Mt(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,...Mt(r,e)]}return t.sort()})}const Nt=N((e,t)=>{let n=Object.keys(e),r=new Set;return n=n.map(e=>{let t=e.replace(/^(?:pre|post)/,``);return Dt.has(t)||n.includes(t)?(r.add(t),t):e}),jt(t)||(n=Mt(n)),n=n.flatMap(e=>r.has(e)?[`pre${e}`,e,`post${e}`]:[e]),O(e,n)}),Pt=e=>{let{defaultConditions:t=[],restConditions:n=[]}=Object.groupBy(e,e=>e==="default"?`defaultConditions`:`restConditions`);return[...n,...t]},Ft=N(e=>{let{paths:t=[],conditions:n=[]}=Object.groupBy(Object.keys(e),e=>e.startsWith(`.`)?`paths`:`conditions`);return Object.fromEntries([...t,...Pt(n)].map(t=>[t,Ft(e[t])]))}),It=[{key:`$schema`},{key:`name`},{key:`displayName`},{key:`version`},{key:`stableVersion`},{key:`private`},{key:`description`},{key:`categories`,over:ot},{key:`keywords`,over:ot},{key:`homepage`},{key:`bugs`,over:P([`url`,`email`])},{key:`repository`,over:st},{key:`funding`,over:st},{key:`license`,over:st},{key:`qna`},{key:`author`,over:ct},{key:`maintainers`,over:j(e=>e.map(ct))},{key:`contributors`,over:j(e=>e.map(ct))},{key:`publisher`},{key:`sideEffects`},{key:`type`},{key:`imports`},{key:`exports`,over:Ft},{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:F},{key:`man`},{key:`directories`,over:lt},{key:`files`,over:ot},{key:`workspaces`,over:vt},{key:`binary`,over:P([`module_name`,`module_path`,`remote_path`,`package_name`,`host`])},{key:`scripts`,over:Nt},{key:`betterScripts`,over:Nt},{key:`wireit`,over:wt},{key:`l10n`},{key:`contributes`,over:F},{key:`activationEvents`,over:ot},{key:`husky`,over:I(`hooks`,ut)},{key:`simple-git-hooks`,over:ut},{key:`pre-commit`},{key:`commitlint`,over:F},{key:`lint-staged`},{key:`nano-staged`},{key:`config`,over:F},{key:`nodemonConfig`,over:F},{key:`browserify`,over:F},{key:`babel`,over:F},{key:`browserslist`},{key:`xo`,over:F},{key:`prettier`,over:xt},{key:`eslintConfig`,over:yt},{key:`eslintIgnore`},{key:`npmpkgjsonlint`,over:F},{key:`npmPackageJsonLintConfig`,over:F},{key:`npmpackagejsonlint`,over:F},{key:`release`,over:F},{key:`remarkConfig`,over:F},{key:`stylelint`},{key:`ava`,over:F},{key:`jest`,over:F},{key:`jest-junit`,over:F},{key:`jest-stare`,over:F},{key:`mocha`,over:F},{key:`nyc`,over:F},{key:`c8`,over:F},{key:`tap`,over:F},{key:`oclif`,over:P(void 0,!0)},{key:`resolutions`,over:F},{key:`overrides`,over:L},{key:`dependencies`,over:L},{key:`devDependencies`,over:L},{key:`dependenciesMeta`,over:P(mt,!0)},{key:`peerDependencies`,over:L},{key:`peerDependenciesMeta`,over:P(void 0,!0)},{key:`optionalDependencies`,over:L},{key:`bundledDependencies`,over:M},{key:`bundleDependencies`,over:M},{key:`extensionPack`,over:M},{key:`extensionDependencies`,over:M},{key:`flat`},{key:`packageManager`},{key:`engines`,over:F},{key:`engineStrict`,over:F},{key:`devEngines`,over:Tt},{key:`volta`,over:St},{key:`languageName`},{key:`os`},{key:`cpu`},{key:`preferGlobal`,over:F},{key:`publishConfig`,over:F},{key:`icon`},{key:`badges`,over:j(e=>e.map(bt))},{key:`galleryBanner`,over:F},{key:`preview`},{key:`markdown`},{key:`pnpm`,over:Et}],Lt=It.map(({key:e})=>e),Rt=A(It.map(({key:e,over:t})=>t?I(e,t):void 0).filter(Boolean));function zt(e,t){if(typeof e==`string`){let{indent:n,type:r}=et(e),i=e.slice(-1)===`
21
+ `}function it(e){return typeof e==`string`&&rt(e)||`
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,ct=st(e=>[...new Set(e)]),lt=O([ct,st(e=>e.toSorted())]),A=e=>(t,...n)=>ot(t)?e(t,...n):t,j=(e,t)=>{let n=A(r=>(t&&(r=Object.fromEntries(Object.entries(r).map(([e,t])=>[e,n(t)]))),D(r,e)));return n},M=j(),ut=j([`type`,`url`]),dt=j([`name`,`email`,`url`]),ft=j([`lib`,`bin`,`man`,`doc`,`example`,`test`]),N=(e,t)=>A((n,...r)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...r)}:n),pt=j(at),mt=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)}},ht=j((e,t)=>{let{name:n,range:r}=mt(e),{name:i,range:a}=mt(t);return n===i?r?a?c(l(r),l(a)):1:-1:n.localeCompare(i,`en`)}),gt=e=>{let t=e.indexOf(`@`,+!!e.startsWith(`@`));return t===-1?e:e.slice(0,t)},_t=(e,t)=>{let n=gt(e),r=gt(t);return n<r?-1:+(n>r)},vt=new Map,yt=()=>{let t=process.cwd();return vt.has(t)||vt.set(t,e.existsSync(`yarn.lock`)||e.existsSync(`.yarn/`)||e.existsSync(`.yarnrc.yml`)||e.existsSync(`pnpm-lock.yaml`)||e.existsSync(`pnpm-workspace.yaml`)),vt.get(t)};function bt(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:!yt()}const P=A((e,t)=>Object.keys(e).length<2?e:bt(t)?D(e,(e,t)=>e.localeCompare(t,`en`)):D(e)),xt=O([j([`packages`,`catalog`]),N(`packages`,lt),N(`catalog`,P)]),St=O([j([`files`,`excludedFiles`,`env`,`parser`,`parserOptions`,`settings`,`plugins`,`extends`,`rules`,`overrides`,`globals`,`processor`,`noInlineConfig`,`reportUnusedDisableDirectives`]),N(`env`,M),N(`globals`,M),N(`overrides`,k(e=>e.map(St))),N(`parserOptions`,M),N(`rules`,j((e,t)=>e.split(`/`).length-t.split(`/`).length||e.localeCompare(t))),N(`settings`,M)]),Ct=j([`description`,`url`,`href`]),wt=O([A(e=>D(e,[...Object.keys(e).filter(e=>e!==`overrides`).sort(),`overrides`])),N(`overrides`,k(e=>e.map(O([M,N(`options`,M)]))))]),Tt=j([`node`,`npm`,`yarn`]),Et=O([j([`command`,`dependencies`,`files`,`output`]),N(`dependencies`,k(e=>e.map(j([`script`,`cascade`])))),N(`env`,A(e=>D(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,j([`external`,`default`])(t)]))))),N(`service`,O([j([`readyWhen`]),N(`readyWhen`,M)]))]),Dt=A(e=>D(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Et(t)])))),Ot=N(`packageManager`,j([`name`,`version`,`onFail`])),kt=O([j([`peerDependencyRules`,`neverBuiltDependencies`,`onlyBuiltDependencies`,`onlyBuiltDependenciesFile`,`allowedDeprecatedVersions`,`allowNonAppliedPatches`,`updateConfig`,`auditConfig`,`requiredScripts`,`supportedArchitectures`,`overrides`,`patchedDependencies`,`packageExtensions`],!0),N(`overrides`,ht)]),At=new Set([`install`,`pack`,`prepare`,`publish`,`restart`,`shrinkwrap`,`start`,`stop`,`test`,`uninstall`,`version`]),jt=(e,t)=>Object.hasOwn(t,`devDependencies`)&&Object.hasOwn(t.devDependencies,e),Mt=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Nt=e=>e.includes(`*`)&&Mt.test(e),Pt=e=>!jt(`npm-run-all`,e)&&!jt(`npm-run-all2`,e)?!1:[`scripts`,`betterScripts`].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>Nt(e));function Ft(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,...Ft(r,e)]}return t.sort()})}const It=A((e,t)=>{let n=Object.keys(e),r=new Set;return n=n.map(e=>{let t=e.replace(/^(?:pre|post)/,``);return At.has(t)||n.includes(t)?(r.add(t),t):e}),Pt(t)||(n=Ft(n)),n=n.flatMap(e=>r.has(e)?[`pre${e}`,e,`post${e}`]:[e]),D(e,n)}),Lt=e=>{let{defaultConditions:t=[],restConditions:n=[]}=Object.groupBy(e,e=>e==="default"?`defaultConditions`:`restConditions`);return[...n,...t]},Rt=A(e=>{let{paths:t=[],conditions:n=[]}=Object.groupBy(Object.keys(e),e=>e.startsWith(`.`)?`paths`:`conditions`);return Object.fromEntries([...t,...Lt(n)].map(t=>[t,Rt(e[t])]))}),zt=[{key:`$schema`},{key:`name`},{key:`displayName`},{key:`version`},{key:`stableVersion`},{key:`private`},{key:`description`},{key:`categories`,over:ct},{key:`keywords`,over:ct},{key:`homepage`},{key:`bugs`,over:j([`url`,`email`])},{key:`repository`,over:ut},{key:`funding`,over:ut},{key:`license`,over:ut},{key:`qna`},{key:`author`,over:dt},{key:`maintainers`,over:k(e=>e.map(dt))},{key:`contributors`,over:k(e=>e.map(dt))},{key:`publisher`},{key:`sideEffects`},{key:`type`},{key:`imports`},{key:`exports`,over:Rt},{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:M},{key:`man`},{key:`directories`,over:ft},{key:`files`,over:ct},{key:`workspaces`,over:xt},{key:`binary`,over:j([`module_name`,`module_path`,`remote_path`,`package_name`,`host`])},{key:`scripts`,over:It},{key:`betterScripts`,over:It},{key:`wireit`,over:Dt},{key:`l10n`},{key:`contributes`,over:M},{key:`activationEvents`,over:ct},{key:`husky`,over:N(`hooks`,pt)},{key:`simple-git-hooks`,over:pt},{key:`pre-commit`},{key:`commitlint`,over:M},{key:`lint-staged`},{key:`nano-staged`},{key:`config`,over:M},{key:`nodemonConfig`,over:M},{key:`browserify`,over:M},{key:`babel`,over:M},{key:`browserslist`},{key:`xo`,over:M},{key:`prettier`,over:wt},{key:`eslintConfig`,over:St},{key:`eslintIgnore`},{key:`npmpkgjsonlint`,over:M},{key:`npmPackageJsonLintConfig`,over:M},{key:`npmpackagejsonlint`,over:M},{key:`release`,over:M},{key:`remarkConfig`,over:M},{key:`stylelint`},{key:`ava`,over:M},{key:`jest`,over:M},{key:`jest-junit`,over:M},{key:`jest-stare`,over:M},{key:`mocha`,over:M},{key:`nyc`,over:M},{key:`c8`,over:M},{key:`tap`,over:M},{key:`oclif`,over:j(void 0,!0)},{key:`resolutions`,over:M},{key:`overrides`,over:P},{key:`dependencies`,over:P},{key:`devDependencies`,over:P},{key:`dependenciesMeta`,over:j(_t,!0)},{key:`peerDependencies`,over:P},{key:`peerDependenciesMeta`,over:j(void 0,!0)},{key:`optionalDependencies`,over:P},{key:`bundledDependencies`,over:lt},{key:`bundleDependencies`,over:lt},{key:`extensionPack`,over:lt},{key:`extensionDependencies`,over:lt},{key:`flat`},{key:`packageManager`},{key:`engines`,over:M},{key:`engineStrict`,over:M},{key:`devEngines`,over:Ot},{key:`volta`,over:Tt},{key:`languageName`},{key:`os`},{key:`cpu`},{key:`preferGlobal`,over:M},{key:`publishConfig`,over:M},{key:`icon`},{key:`badges`,over:k(e=>e.map(Ct))},{key:`galleryBanner`,over:M},{key:`preview`},{key:`markdown`},{key:`pnpm`,over:kt}],Bt=zt.map(({key:e})=>e),Vt=O(zt.map(({key:e,over:t})=>t?N(e,t):void 0).filter(Boolean));function Ht(e,t){if(typeof e==`string`){let{indent:n,type:r}=nt(e),i=e.slice(-1)===`
23
23
  `?`
24
- `:``,a=nt(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 Bt(e,t={}){return zt(e,N(e=>{let n=t.sortOrder||Lt;if(Array.isArray(n)){let t=Object.keys(e),{privateKeys:r=[],publicKeys:i=[]}=Object.groupBy(t,e=>e[0]===`_`?`privateKeys`:`publicKeys`);n=[...n,...Lt,...i.sort(),...r.sort()]}return Rt(O(e,n),e)}))}async function Vt(n){return x.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 Ht(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 S.generateFile(r,JSON.stringify(Bt(t),void 0,2))}catch{}}}))})}async function Ht(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 Ht(a,o);return}await e.promises.rename(a,o)})),await e.promises.rm(n,{recursive:!0})}async function Ut(e,n){return x.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 y(()=>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 C.run(()=>o.rename(t.join(r,e.name),t.join(r,a,`index.d.ts`)))):i&&(await o.mkdir(i,{recursive:!0}),await C.run(()=>o.rename(t.join(r,e.name),t.join(i,e.name)))):e.isDirectory()&&i&&!l&&(await o.mkdir(i,{recursive:!0}),await C.run(()=>y(()=>o.rename(t.join(r,e.name,`index.d.ts`),t.join(i,`${e.name}.d.ts`)))))}})}function R(e,t){return t}function Wt(e,t,n){let r=[...e];for(let[i,a]of t.entries())r[i]===void 0?r[i]=Gt(a,n):Kt(e[i],n)&&Kt(a,n)?r[i]=u(e[i],a,n):e.includes(a)||r.push(a);return r}function Gt(e,t){return Kt(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function Kt(e,t){return!!e&&typeof e==`object`&&t.isMergeableObject(e)}function qt(e,t){let n=e[t];return delete e[t],e[t]=n,e}function z(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)&&z(r);return e}const Jt={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`}}},Yt={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 Xt(n){return x.functionIgnoringException(`generateWorkflow`,async()=>{if(Zt(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 C.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()||!Qt(n.name)||await C.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`)&&!Qt(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 C.run(()=>e.promises.rm(t.join(r,`autofix.yml`),{force:!0})));for(let e of o){let i=t.basename(e,`.yml`);await C.run(()=>$t(n,r,i))}})}function Zt(e){return e?.endsWith(`/reusable-workflows`)??!1}function Qt(e){return/^gen-pr(?:-.+)?\.ya?ml$/u.test(e)}async function $t(n,r,i){let a=t.join(r,`${i}.yml`),o=e.existsSync(t.join(r,`deploy-production.yml`));if(i===`autofix`){await nn(tn(n),a);return}if(i===`test-rust`&&n.cargoTomlDirPaths.length===0)return;let s=structuredClone(i in Yt?Yt[i]:{});try{let t=await e.promises.readFile(a,`utf8`),n=d.load(t);s=u.all([s,n,s],{arrayMerge:Wt})}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];qt(s,`jobs`)}i.startsWith(`deploy`)&&(s={...s,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},qt(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/`)&&(en(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 nn(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 nn(s,t.join(r,`sync-force.yml`))}}}function en(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?z(t.with):delete t.with,Object.keys(t.secrets).length>0){let e=z(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function tn(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(Jt),i=r.jobs.autofix??{"runs-on":`ubuntu-latest`};return r.jobs.autofix={...i,steps:n},r}async function nn(t,n){let r=rn(d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":`empty`}}));await e.promises.writeFile(n,r)}function rn(e){return e.replaceAll(/[ \t]+$/gm,``)}async function an(e){return x.functionIgnoringException(`fixTypos`,async()=>{if(Zt(e.repository))return;let n=e.dirPath,r=await s.glob(`**/*.md`,{dot:!0,cwd:n,ignore:D});b.isVerbose&&console.info(`Found ${r.length} markdown files in ${n}`);for(let i of r){let r=t.join(n,i);C.run(async()=>{let t=await S.readFileIgnoringError(r);if(t===void 0)return;let n=on(t);n=cn(n,e,`doc`),t!==n&&await S.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:D});b.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${n}`);for(let r of i){let i=t.join(n,r);C.run(async()=>{let t=await S.readFileIgnoringError(i);if(t===void 0)return;let n=sn(t);n=cn(n,e,`ts`),t!==n&&await S.generateFile(i,n)})}let a=await s.glob(`**/*.{csv,htm,html,tsv,xml,yaml,yml}`,{dot:!0,cwd:n,ignore:D});b.isVerbose&&console.info(`Found ${a.length} text-based files in ${n}`);for(let r of a){let i=t.join(n,r);C.run(async()=>{let t=await S.readFileIgnoringError(i);if(t===void 0)return;let n=on(t);n=cn(n,e,`text`),t!==n&&await S.generateFile(i,n)})}await C.promiseAll()})}function on(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,`cf.`).replaceAll(/\beg\.(?=\s|$)/g,`e.g.`).replaceAll(/\bie\.(?=\s)/g,`i.e.`)}function sn(e){return e.replaceAll(/\/\*[\s\S]*?\*\//g,e=>on(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,`$1//$2cf.`).replaceAll(/(^|\s)\/\/(.*?)eg\./g,`$1//$2e.g.`).replaceAll(/(^|\s)\/\/(.*?)ie\./g,`$1//$2i.e.`)}function cn(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 ln=/\bwb\s+(?:db|prisma)\b/gu,un=[`**/*.{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 dn(e,t=[e]){if(e.repoAuthor===`WillBooster`&&e.repoName===`shared`)return;let n=new i,r=[];for(let e of t){let t=fn(e);if(!t)continue;let i=await s(un,{absolute:!0,cwd:e.dirPath,dot:!0,ignore:[`**/.git/**`,...e.isRoot?[`packages/**`]:[],...D],onlyFiles:!0});for(let e of i)r.push(n.run(()=>pn(e,t)))}await Promise.all(r),await n.promiseAll()}function fn(e){if(e.depending.prisma)return`wb prisma`;if(e.depending.drizzle)return`wb db`}async function pn(e,t){let n=await mn(e);if(!n)return;let r=n.replaceAll(ln,t);r!==n&&await S.generateFile(e,r)}async function mn(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 hn(e,n){return x.functionIgnoringException(`generateAgentInstructions`,async()=>{if(!e.isRoot)return;let r=t.resolve(e.dirPath,`AGENTS_EXTRA.md`),i=await S.readFileIgnoringError(r);for(let[r,a]of[[`AGENTS.md`,`Codex CLI`],[`CLAUDE.md`,`Claude Code`],[`GEMINI.md`,`Gemini CLI`]]){let o=_n(e,n,a,i),s=t.resolve(e.dirPath,r);await C.run(()=>S.generateFile(s,o))}let a=t.resolve(e.dirPath,`.cursor/rules/general.mdc`),o=gn(e,n,i);await C.run(()=>S.generateFile(a,o))})}function gn(e,t,n){return`---
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 Ut(e,t={}){return Ht(e,A(e=>{let n=t.sortOrder||Bt;if(Array.isArray(n)){let t=Object.keys(e),{privateKeys:r=[],publicKeys:i=[]}=Object.groupBy(t,e=>e[0]===`_`?`privateKeys`:`publicKeys`);n=[...n,...Bt,...i.sort(),...r.sort()]}return Vt(D(e,n),e)}))}async function Wt(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 Gt(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(Ut(t),void 0,2))}catch{}}}))})}async function Gt(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 Gt(a,o);return}await e.promises.rename(a,o)})),await e.promises.rm(n,{recursive:!0})}async function Kt(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 F(e,t){return t}function qt(e,t,n){let r=[...e];for(let[i,a]of t.entries())r[i]===void 0?r[i]=Jt(a,n):Yt(e[i],n)&&Yt(a,n)?r[i]=u(e[i],a,n):e.includes(a)||r.push(a);return r}function Jt(e,t){return Yt(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function Yt(e,t){return!!e&&typeof e==`object`&&t.isMergeableObject(e)}function Xt(e,t){let n=e[t];return delete e[t],e[t]=n,e}function I(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)&&I(r);return e}const Zt={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`}}},Qt={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 $t(n){return b.functionIgnoringException(`generateWorkflow`,async()=>{if(en(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()||!tn(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`)&&!tn(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(()=>nn(n,r,i))}})}function en(e){return e?.endsWith(`/reusable-workflows`)??!1}function tn(e){return/^gen-pr(?:-.+)?\.ya?ml$/u.test(e)}async function nn(n,r,i){let a=t.join(r,`${i}.yml`),o=e.existsSync(t.join(r,`deploy-production.yml`));if(i===`autofix`){await on(an(n),a);return}if(i===`test-rust`&&n.cargoTomlDirPaths.length===0)return;let s=structuredClone(i in Qt?Qt[i]:{});try{let t=await e.promises.readFile(a,`utf8`),n=d.load(t);s=u.all([s,n,s],{arrayMerge:qt})}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];Xt(s,`jobs`)}i.startsWith(`deploy`)&&(s={...s,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},Xt(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/`)&&(rn(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 on(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 on(s,t.join(r,`sync-force.yml`))}}}function rn(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?I(t.with):delete t.with,Object.keys(t.secrets).length>0){let e=I(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function an(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(Zt),i=r.jobs.autofix??{"runs-on":`ubuntu-latest`};return r.jobs.autofix={...i,steps:n},r}async function on(t,n){let r=sn(d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":`empty`}}));await e.promises.writeFile(n,r)}function sn(e){return e.replaceAll(/[ \t]+$/gm,``)}async function cn(e){return b.functionIgnoringException(`fixTypos`,async()=>{if(en(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=ln(t);n=dn(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=un(t);n=dn(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=ln(t);n=dn(n,e,`text`),t!==n&&await x.generateFile(i,n)})}await S.promiseAll()})}function ln(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,`cf.`).replaceAll(/\beg\.(?=\s|$)/g,`e.g.`).replaceAll(/\bie\.(?=\s)/g,`i.e.`)}function un(e){return e.replaceAll(/\/\*[\s\S]*?\*\//g,e=>ln(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,`$1//$2cf.`).replaceAll(/(^|\s)\/\/(.*?)eg\./g,`$1//$2e.g.`).replaceAll(/(^|\s)\/\/(.*?)ie\./g,`$1//$2i.e.`)}function dn(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 fn=/\bwb\s+(?:db|prisma)\b/gu,pn=[`**/*.{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 mn(e,t=[e]){if(e.repoAuthor===`WillBooster`&&e.repoName===`shared`)return;let n=new i,r=[];for(let e of t){let t=hn(e);if(!t)continue;let i=await s(pn,{absolute:!0,cwd:e.dirPath,dot:!0,ignore:[`**/.git/**`,...e.isRoot?[`packages/**`]:[],...E],onlyFiles:!0});for(let e of i)r.push(n.run(()=>gn(e,t)))}await Promise.all(r),await n.promiseAll()}function hn(e){if(e.depending.prisma)return`wb prisma`;if(e.depending.drizzle)return`wb db`}async function gn(e,t){let n=await _n(e);if(!n)return;let r=n.replaceAll(fn,t);r!==n&&await x.generateFile(e,r)}async function _n(e){if((await o.stat(e)).size>1048576)return;let t=await o.readFile(e);if(!t.includes(0))return t.toString(`utf8`)}function L(e,t,n,r=0){vn(e,t,n,r)}function vn(e,t,n,r=0){do{let[i,a,o]=yn(e,t,n),s=f.spawnSync(i,a,o).status??1;if(s===0)break;if(r<=0)return s}while(--r>=0);return 0}function R(e,t,n){let[r,i,a]=yn(e,t,n);a.stdio=`pipe`;let o=f.spawnSync(r,i,a),s=o.stderr??``,c=typeof s==`string`?s.trim():s.toString().trim();o.error?console.error(`${r} [${i.map(e=>`"${e}"`).join(`, `)}] failed with: ${o.error.message}`):c&&console.error(`${r} [${i.map(e=>`"${e}"`).join(`, `)}] outputs the following content to stderr:\n${c}`);let l=o.stdout??``;return typeof l==`string`?l.trim():l.toString().trim()}function yn(e,t,n){let r={...process.env};return r.PATH&&r.BERRY_BIN_FOLDER&&(r.PATH=r.PATH.split(`:`).filter(e=>e!==r.BERRY_BIN_FOLDER).join(`:`)),[e,t,{cwd:n,env:r,encoding:`utf8`,shell:!1,stdio:`inherit`}]}const bn=new Set([`yarn`,`bun`,`npm`,`pnpm`,`bunx`,`npx`]),xn=new Set([`yarn`,`bun`,`npm`,`pnpm`]),Sn=new Set([`--env-interface`]);function Cn(e){let t=Object.values(e).filter(e=>typeof e==`string`),n=t.some(t=>Dn(t).some(t=>{let n=V(t);return n?H(n)===`defaultOutputConflict`:Pn(t,e)})||wn(t,e)),r=[Tn(e.postinstall,e),Tn(e[`gen-code`],e),t.flatMap(t=>Tn(t,e))].find(e=>e.length>0),i=new Map;for(let e of r??[]){let t=B(e).join(` `);i.has(t)||i.set(t,e)}return{conflicting:n||i.size>1,command:i.size===1?[...i.values()][0]:void 0}}function wn(e,t){let n=Dn(e);return z(e,t,e=>H(e)===`reusableGenerator`)?n.some(e=>e!==``&&!Mn(e,t)&&!V(e)&&!z(e,t,()=>!0)):!1}function Tn(e,t,n=new Set){let r=[];return e&&z(e,t,(e,t)=>(e.length>0&&H(e)===`reusableGenerator`&&r.push(Rn(t)),!1),n),r}function En(e){return z(e.postinstall,e,e=>H(e)===`reusableGenerator`)}function z(e,t,n,r=new Set){if(!e)return!1;for(let i of Dn(e)){let e=V(i);if(e&&n(e,i))return!0;let a=B(i),o=U(a),s;if(xn.has(a[o]??``)){o++;let e=W(a,o);[`run`,`run-script`].includes(a[e.index]??``)&&(e=W(a,e.index+1,e.leavesPackage)),s=e.leavesPackage||a.length>e.index+1?void 0:a[e.index]}if(!s||r.has(s))continue;r.add(s);let c=t[s];if(typeof c==`string`&&z(c,t,n,r))return!0}return!1}function Dn(e){let t=[];for(let n of kn(e)){if(An(n)){if(jn(n))continue;break}t.push(n)}return t}function On(e){return kn(e).some(e=>An(e)&&!jn(e))}function kn(e){let t=[],n=``,r;for(let i=0;i<e.length;i++){let a=e[i]??``;if(r){if(a===`\\`&&r===`"`){n+=a+(e[++i]??``);continue}a===r&&(r=void 0),n+=a;continue}if(a===`'`||a===`"`){r=a,n+=a;continue}if(a===`&`&&e[i+1]===`&`){t.push(n.trim()),n=``,i++;continue}n+=a}return t.push(n.trim()),t}function An(e){let t=B(e);return t[U(t)]===`cd`}function jn(e){let t=B(e),n=U(t)+1;t[n]===`--`&&n++;let r=Ln(t[n]??``);for(;r.startsWith(`./`);)r=r.slice(2);return r.endsWith(`/`)&&(r=r.slice(0,-1)),r===`.`&&n+1===t.length}function Mn(e,t){let n=B(e),r=U(n),i=!1;if(bn.has(n[r]??``)){r++;let e=W(n,r);if([`run`,`run-script`,`exec`,`dlx`,`x`].includes(n[e.index]??``)&&(i=[`run`,`run-script`].includes(n[e.index]??``),e=W(n,e.index+1,e.leavesPackage)),e.leavesPackage)return!1;r=e.index}if(!i&&n[r]===`wb`&&n[r+1]===`gen-code`)return r+2===n.length;if(n[r]!==`gen-code`||r+1!==n.length)return!1;let a=t[`gen-code`];return typeof a==`string`&&Dn(a).every(e=>{if(e===``)return!0;let t=B(e),n=U(t);if(bn.has(t[n]??``)&&n++,t[n]===`wb`&&t[n+1]===`gen-code`)return!0;let r=V(e);return!!r&&H(r)===`reusableGenerator`})}function Nn(e){return/\bwrangler\s+types\b/u.test(Fn(e))}function Pn(e,t,n=new Set){if(V(e))return!1;if(Nn(e)||/["']wrangler["']\s+types\b|\bwrangler\s+["']types["']/u.test(e)||/\$\(|`/u.test(In(e))&&/\bwrangler\s+types\b/u.test(e))return!0;let r=new Set(B(e).map(e=>Ln(e)));if(r.has(`wrangler`)&&r.has(`types`))return!0;let i=B(e),a=U(i);if(!xn.has(i[a]??``))return!1;a++;let o=W(i,a);[`run`,`run-script`].includes(i[o.index]??``)&&(o=W(i,o.index+1,o.leavesPackage));let s=i[o.index],c=i.length>o.index+1;if(o.leavesPackage||!s||n.has(s))return!1;n.add(s);let l=t[s];return typeof l==`string`?kn(l).some(e=>Pn(e,t,n))||c&&z(l,t,()=>!0,new Set(n)):!1}function B(e){let t=[],n=``,r;for(let i=0;i<e.length;i++){let a=e[i]??``;if(r){if(a===`\\`&&r===`"`){n+=a+(e[++i]??``);continue}a===r&&(r=void 0),n+=a;continue}if(a===`'`||a===`"`){r=a,n+=a;continue}if(/\s/u.test(a)){n&&t.push(n),n=``;continue}n+=a}return n&&t.push(n),t}function Fn(e){let t=``,n;for(let r=0;r<e.length;r++){let i=e[r]??``;if(n){i===`\\`&&n===`"`?r++:i===n&&(n=void 0);continue}if(i===`'`||i===`"`){n=i;continue}t+=i}return t}function In(e){let t=``,n=!1;for(let r of e){if(n){r===`'`&&(n=!1);continue}if(r===`'`){n=!0;continue}t+=r}return t}function Ln(e){let t=``,n;for(let r=0;r<e.length;r++){let i=e[r]??``;if(n){if(i===`\\`&&n===`"`){t+=e[++r]??``;continue}i===n?n=void 0:t+=i;continue}if(i===`'`||i===`"`){n=i;continue}t+=i}return t}function Rn(e){let t;for(let n=0;n<e.length;n++){let r=e[n]??``;if(t){r===`\\`&&t===`"`?n++:r===t&&(t=void 0);continue}if(r===`'`||r===`"`){t=r;continue}if(r===`#`&&(n===0||/\s/u.test(e[n-1]??``)))return e.slice(0,n).trim()}return e}function V(e){if(Fn(e).includes(`
26
+ `))return;let t=B(e),n=U(t);if(bn.has(t[n]??``)){n++;let e=W(t,n);if([`run`,`run-script`].includes(t[e.index]??``)||([`exec`,`dlx`,`x`].includes(t[e.index]??``)&&(e=W(t,e.index+1,e.leavesPackage)),e.leavesPackage))return;n=e.index}if(t[n]!==`wrangler`||t[n+1]!==`types`)return;let r=[];for(let e=n+2;e<t.length;e++){let n=t[e]??``;if(n.startsWith(`#`))break;let i=/^(?:\d+|&)?(?:>>?|<)/u.exec(n)?.[0];if(i){i===n&&e++;continue}r.push(n)}return r}function H(e){let t=!1,n=!1;for(let r=0;r<e.length;r++){let i=e[r]??``;if(/[();|`&]|\$\(/u.test(Fn(i))||/\$\(|`/u.test(In(i)))return`defaultOutputConflict`;let a=Ln(i),o=Ln(e[r+1]??``);if(/^(?:--help|-h|--version|-v)(?:=true)?$/u.test(a)&&o!==`false`||/^--check(?:=true)?$/u.test(a)&&o!==`false`)return`harmless`;if(/^(?:--config|-c|--env|-e|--env-file)(?:=.*)?$/u.test(a)){n=!0,a.includes(`=`)||r++;continue}if(/^--cwd(?:=.*)?$/u.test(a)){let n=a.includes(`=`)?a.slice(6):Ln(e[++r]??``);n!==`.`&&n!==`./`&&(t=!0);continue}if(Sn.has(a)){r++;continue}if(a.startsWith(`-`)){(o===`true`||o===`false`)&&r++;continue}let s=a;for(;s.startsWith(`./`);)s=s.slice(2);s!==`worker-configuration.d.ts`&&(t=!0)}return t?`harmless`:n?`defaultOutputConflict`:`reusableGenerator`}function U(e){let t=0;for(;t<e.length&&/^[A-Za-z_][A-Za-z0-9_]*=/u.test(e[t]??``);)t++;return t}const zn=new Set([`--cwd`,`-C`,`--prefix`,`--dir`]),Bn=new Set([`-w`,`--workspace`,`-F`,`--filter`]),Vn=new Set([`--workspaces`,`-ws`,`--recursive`,`-r`]);function W(e,t,n=!1){for(;(e[t]??``).startsWith(`-`);){let r=e[t]??``;t++;let i;zn.has(r)?(i=e[t],t++):/^(?:--cwd|--prefix|--dir)=/u.test(r)?i=r.slice(r.indexOf(`=`)+1):Bn.has(r)?(t++,n=!0):(/^(?:-w|--workspace|-F|--filter)=/u.test(r)||Vn.has(r))&&(n=!0),i!==void 0&&i!==`.`&&i!==`./`&&(n=!0)}return{index:t,leavesPackage:n}}const Hn=`worker-configuration.d.ts`;async function Un(n){return b.functionIgnoringException(`untrackWorkerTypes`,async()=>{if(!R(`git`,[`ls-files`,`--`,Hn],n.dirPath)||!En(JSON.parse(e.readFileSync(t.resolve(n.dirPath,`package.json`),`utf8`)).scripts??{}))return;let r=t.resolve(n.dirPath,`.gitignore`);e.existsSync(r)&&e.readFileSync(r,`utf8`).split(`
27
+ `).some(e=>e.trim()===`/${Hn}`)&&vn(`git`,[`check-ignore`,`--quiet`,`--no-index`,`--`,Hn],n.dirPath)===0&&vn(`git`,[`rm`,`--cached`,`--quiet`,`--`,Hn],n.dirPath)})}async function Wn(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=Kn(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=Gn(e,n,i);await S.run(()=>x.generateFile(a,o))})}function Gn(e,t,n){return`---
26
28
  description: General Coding Rules
27
29
  globs:
28
30
  alwaysApply: true
29
- ---\n\n${_n(e,t,`Cursor`,n)}`}function _n(e,t,n,r){let i=be(e),a=e.packageJson?.description,o=e.isRailway?"\n- Railway project information is in the deploy workflows under `.github/workflows`.":``,s=yn(t)?`\n- Use \`${i} wb start --mode test\` to launch a web server for debugging or testing.`:``,c=e.isWillBoosterRepo?`\n - End your commit message with a blank line followed by \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\`.`:``,l=`
31
+ ---\n\n${Kn(e,t,`Cursor`,n)}`}function Kn(e,t,n,r){let i=xe(e),a=e.packageJson?.description,o=e.isRailway?"\n- Railway project information is in the deploy workflows under `.github/workflows`.":``,s=Jn(t)?`\n- Use \`${i} wb start --mode test\` to launch a web server for debugging or testing.`:``,c=e.isWillBoosterRepo?`\n - End your commit message with a blank line followed by \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\`.`:``,l=`
30
32
  ## Project Information
31
33
 
32
34
  - Name: \`${e.packageJson?.name||`unknown`}\`${a?`\n- Description: ${a}`:``}
@@ -50,14 +52,14 @@ alwaysApply: true
50
52
  - Use heredoc for multi-line command input (e.g., \`git commit -F -\`, \`gh pr create --body-file -\`).
51
53
  - Put temporary files in \`.tmp\`; use \`/tmp\` only for files that must live outside the repo.${o}${s}
52
54
 
53
- ${vn(t)}
55
+ ${qn(t)}
54
56
  `.replaceAll(/\.\n\n+-/g,`.
55
57
  -`).replaceAll(/\n{3,}/g,`
56
58
 
57
59
  `).trim(),u=r?.trim().startsWith(`#`);return l+(r?u?`
58
60
 
59
61
  `+r.trim():`
60
- `+r:``)}function vn(e){return`
62
+ `+r:``)}function qn(e){return`
61
63
  ## Coding Style
62
64
 
63
65
  - Use camelCase file names for JavaScript/TypeScript (PascalCase for React components).
@@ -76,31 +78,31 @@ ${e.some(e=>e.depending.next)?"\n- This project uses the React Compiler, so `use
76
78
  `.replaceAll(/\.\n\n+-/g,`.
77
79
  -`).replaceAll(/\n{3,}/g,`
78
80
 
79
- `).trim()}function yn(e){return e.some(e=>e.depending.playwrightTest)}const bn=432e3,xn=[`aix-ppc64`,`darwin-arm64`,`darwin-x64`,`freebsd-arm64`,`freebsd-x64`,`linux-arm`,`linux-arm64`,`linux-loong64`,`linux-mips64el`,`linux-ppc64`,`linux-riscv64`,`linux-s390x`,`linux-x64`,`netbsd-arm64`,`netbsd-x64`,`openbsd-arm64`,`openbsd-x64`,`sunos-x64`,`win32-arm64`,`win32-x64`],Sn=[`android-arm-eabi`,`android-arm64`,`darwin-arm64`,`darwin-x64`,`freebsd-x64`,`linux-arm-gnueabihf`,`linux-arm-musleabihf`,`linux-arm64-gnu`,`linux-arm64-musl`,`linux-ppc64-gnu`,`linux-riscv64-gnu`,`linux-riscv64-musl`,`linux-s390x-gnu`,`linux-x64-gnu`,`linux-x64-musl`,`openharmony-arm64`,`win32-arm64-msvc`,`win32-ia32-msvc`,`win32-x64-msvc`],Cn=[`darwin-arm64`,`darwin-x64`,`linux-arm64`,`linux-x64`,`win32-arm64`,`win32-x64`],wn=[`android-arm-eabi`,`android-arm64`,`darwin-arm64`,`darwin-x64`,`linux-arm-gnueabihf`,`linux-arm64-gnu`,`linux-arm64-musl`,`linux-x64-gnu`,`linux-x64-musl`,`win32-arm64-msvc`,`win32-ia32-msvc`,`win32-x64-msvc`],Tn=[`android-arm-eabi`,`android-arm64`,`darwin-arm64`,`darwin-x64`,`freebsd-x64`,`linux-arm-gnueabihf`,`linux-arm64-gnu`,`linux-arm64-musl`,`linux-x64-gnu`,`linux-x64-musl`,`wasm-nodejs`,`wasm-web`,`win32-arm64-msvc`,`win32-ia32-msvc`,`win32-x64-msvc`],En=[`@exercode/problem-utils`,`@willbooster-private/agentic-workflows`,`@willbooster/agent-skills`,`@willbooster/babel-configs`,`@willbooster/monaco-loader`,`@willbooster/monaco-react`,`@willbooster/oxfmt-config`,`@willbooster/oxlint-config`,`@willbooster/prettier-config`,`@willbooster/renovate-config`,`@willbooster/shared-lib`,`@willbooster/shared-lib-blitz-next`,`@willbooster/shared-lib-next`,`@willbooster/shared-lib-node`,`@willbooster/shared-lib-react`,`@willbooster/wb`,`agent-runtime-kit`,`at-decorators`,`build-ts`,`gen-i18n-ts`,`one-way-git-sync`,`typescript`,...xn.map(e=>`@typescript/typescript-${e}`),`@types/bun`,`bun-types`,`oxfmt`,...Sn.map(e=>`@oxfmt/binding-${e}`),`oxlint`,...Sn.map(e=>`@oxlint/binding-${e}`),`oxlint-tsgolint`,...Cn.map(e=>`@oxlint-tsgolint/${e}`),`@next/env`,`@next/font`,`@next/rspack-binding`,...wn.map(e=>`@next/rspack-binding-${e}`),...Tn.map(e=>`@next/swc-${e}`),`@next/third-parties`,`next`,`react`,`react-dom`];async function Dn(n){return x.functionIgnoringException(`generateBunfigToml`,async()=>{let r=t.resolve(n.dirPath,`bunfig.toml`),i=e.existsSync(r)?e.readFileSync(r,`utf8`):void 0,a=On(i);await C.run(()=>S.generateFile(r,a))})}const On=e=>{let t=An(e);return`env = false
81
+ `).trim()}function Jn(e){return e.some(e=>e.depending.playwrightTest)}const Yn=432e3,Xn=[`aix-ppc64`,`darwin-arm64`,`darwin-x64`,`freebsd-arm64`,`freebsd-x64`,`linux-arm`,`linux-arm64`,`linux-loong64`,`linux-mips64el`,`linux-ppc64`,`linux-riscv64`,`linux-s390x`,`linux-x64`,`netbsd-arm64`,`netbsd-x64`,`openbsd-arm64`,`openbsd-x64`,`sunos-x64`,`win32-arm64`,`win32-x64`],Zn=[`android-arm-eabi`,`android-arm64`,`darwin-arm64`,`darwin-x64`,`freebsd-x64`,`linux-arm-gnueabihf`,`linux-arm-musleabihf`,`linux-arm64-gnu`,`linux-arm64-musl`,`linux-ppc64-gnu`,`linux-riscv64-gnu`,`linux-riscv64-musl`,`linux-s390x-gnu`,`linux-x64-gnu`,`linux-x64-musl`,`openharmony-arm64`,`win32-arm64-msvc`,`win32-ia32-msvc`,`win32-x64-msvc`],Qn=[`darwin-arm64`,`darwin-x64`,`linux-arm64`,`linux-x64`,`win32-arm64`,`win32-x64`],$n=[`android-arm-eabi`,`android-arm64`,`darwin-arm64`,`darwin-x64`,`linux-arm-gnueabihf`,`linux-arm64-gnu`,`linux-arm64-musl`,`linux-x64-gnu`,`linux-x64-musl`,`win32-arm64-msvc`,`win32-ia32-msvc`,`win32-x64-msvc`],er=[`android-arm-eabi`,`android-arm64`,`darwin-arm64`,`darwin-x64`,`freebsd-x64`,`linux-arm-gnueabihf`,`linux-arm64-gnu`,`linux-arm64-musl`,`linux-x64-gnu`,`linux-x64-musl`,`wasm-nodejs`,`wasm-web`,`win32-arm64-msvc`,`win32-ia32-msvc`,`win32-x64-msvc`],tr=[`@exercode/problem-utils`,`@willbooster-private/agentic-workflows`,`@willbooster/agent-skills`,`@willbooster/babel-configs`,`@willbooster/monaco-loader`,`@willbooster/monaco-react`,`@willbooster/oxfmt-config`,`@willbooster/oxlint-config`,`@willbooster/prettier-config`,`@willbooster/renovate-config`,`@willbooster/shared-lib`,`@willbooster/shared-lib-blitz-next`,`@willbooster/shared-lib-next`,`@willbooster/shared-lib-node`,`@willbooster/shared-lib-react`,`@willbooster/wb`,`agent-runtime-kit`,`at-decorators`,`build-ts`,`gen-i18n-ts`,`one-way-git-sync`,`typescript`,...Xn.map(e=>`@typescript/typescript-${e}`),`@types/bun`,`bun-types`,`oxfmt`,...Zn.map(e=>`@oxfmt/binding-${e}`),`oxlint`,...Zn.map(e=>`@oxlint/binding-${e}`),`oxlint-tsgolint`,...Qn.map(e=>`@oxlint-tsgolint/${e}`),`@next/env`,`@next/font`,`@next/rspack-binding`,...$n.map(e=>`@next/rspack-binding-${e}`),...er.map(e=>`@next/swc-${e}`),`@next/third-parties`,`next`,`react`,`react-dom`];async function nr(n){return b.functionIgnoringException(`generateBunfigToml`,async()=>{let r=t.resolve(n.dirPath,`bunfig.toml`),i=e.existsSync(r)?e.readFileSync(r,`utf8`):void 0,a=rr(i);await S.run(()=>x.generateFile(r,a))})}const rr=e=>{let t=ar(e);return`env = false
80
82
  telemetry = false
81
83
 
82
- ${kn(e)}[install]
84
+ ${ir(e)}[install]
83
85
  exact = ${t?.install?.exact===!1?`false`:`true`}
84
86
  linker = "hoisted"
85
- minimumReleaseAge = ${bn} # 5 days
87
+ minimumReleaseAge = ${Yn} # 5 days
86
88
  minimumReleaseAgeExcludes = [
87
- ${En.map(e=>` "${e}",`).join(`
89
+ ${tr.map(e=>` "${e}",`).join(`
88
90
  `)}
89
91
  ]
90
- `};function kn(e){if(!e)return``;let t=[],n=!1;for(let r of e.split(`
92
+ `};function ir(e){if(!e)return``;let t=[],n=!1;for(let r of e.split(`
91
93
  `)){let e=/^\s*\[([^\]]+)\]/.exec(r);e&&(n=e[1]===`test`||e[1].startsWith(`test.`)),n&&r.trim()&&t.push(r)}return t.length>0?`${t.join(`
92
- `)}\n\n`:``}function An(e){if(e)try{return f(e)}catch{return}}const B=`# Project-specific settings`,jn=/# Project-specific settings[^\n]*\n/gm,Mn=`# Generated by wbfy`,Nn=`${B} (head)
94
+ `)}\n\n`:``}function ar(e){if(e)try{return p(e)}catch{return}}const or=`# Project-specific settings`,sr=/# Project-specific settings[^\n]*\n/gm,cr=`# Generated by wbfy`,lr=`${or} (head)
93
95
 
94
96
 
95
- ${Mn}
96
- `,Pn=`
97
- ${B} (tail)
98
- `,V={separator:Mn,separatorPrefix:`# Generated by `,defaultHeadUserContent:Nn,defaultTailUserContent:Pn,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,`utf8`),r=Fn(n);return r>0&&(n=n.slice(0,r-1)),n.replaceAll(jn,``).replaceAll(/# Generated by [^\n]*\n/gm,``).replaceAll(/\r?\n\r?\n(\r?\n)+/gm,`
97
+ ${cr}
98
+ `,ur=`
99
+ ${or} (tail)
100
+ `,G={separator:cr,separatorPrefix:`# Generated by `,defaultHeadUserContent:lr,defaultTailUserContent:ur,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,`utf8`),r=dr(n);return r>0&&(n=n.slice(0,r-1)),n.replaceAll(sr,``).replaceAll(/# Generated by [^\n]*\n/gm,``).replaceAll(/\r?\n\r?\n(\r?\n)+/gm,`
99
101
 
100
102
  `).trim()+`
101
- `}catch{}},getHeadUserContent(e){let t=e.indexOf(this.separatorPrefix);return t===-1?Nn:e.slice(0,e.indexOf(`
102
- `,t)+1).replaceAll(jn,`${B} (head)\n`)},getTailUserContent(e){let t=Fn(e);return t>0?e.slice(t-1):Pn},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,`utf8`)).includes(`
103
- !.yarn/cache`)}catch{return!1}}};function Fn(e){let t=e.indexOf(B),n=e.lastIndexOf(B);return n>t?n:-1}const In=`
103
+ `}catch{}},getHeadUserContent(e){let t=e.indexOf(this.separatorPrefix);return t===-1?lr:e.slice(0,e.indexOf(`
104
+ `,t)+1).replaceAll(sr,`${or} (head)\n`)},getTailUserContent(e){let t=dr(e);return t>0?e.slice(t-1):ur},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,`utf8`)).includes(`
105
+ !.yarn/cache`)}catch{return!1}}};function dr(e){let t=e.indexOf(or),n=e.lastIndexOf(or);return n>t?n:-1}const fr=`
104
106
  **/.DS_Store
105
107
  **/.cache
106
108
  **/.claude
@@ -145,7 +147,7 @@ ${[`@willbooster`].map(e=>`!**/node_modules/${e}
145
147
  **/storybook-static
146
148
  **/target
147
149
  **/test-results
148
- `;async function Ln(n){return x.functionIgnoringException(`generateDockerignore`,async()=>{let r=t.resolve(n.dirPath,`.dockerignore`);if(n.doesContainDockerfile){let e=await S.readFileIgnoringError(r)??``,t=V.getHeadUserContent(e),n=V.getTailUserContent(e),i=t+In+n;await C.run(()=>S.generateFile(r,i))}else await e.promises.rm(r,{force:!0})})}const H={codeWith2IndentSize:[`cjs`,`mjs`,`js`,`jsx`,`cts`,`mts`,`ts`,`tsx`,`json`,`json5`,`jsonc`,`cpp`,`dart`,`htm`,`html`,`pu`,`puml`,`rb`,`vue`,`xml`,`yaml`,`yml`,`sh`].toSorted(),codeWith4IndentSize:[`go`,`gradle`,`java`,`py`].toSorted(),markdownLike:[`md`].toSorted(),oxlint:[`astro`,`cjs`,`cts`,`js`,`jsx`,`mjs`,`mts`,`svelte`,`ts`,`tsx`,`vue`].toSorted(),oxfmt:`astro.cjs.css.cts.gql.graphql.hbs.htm.html.js.json.json5.jsonc.jsx.less.md.mdx.mjs.mts.scss.svelte.toml.ts.tsx.vue.yaml.yml`.split(`.`).toSorted(),prettierOnly:[`java`].toSorted()},Rn=`root = true
150
+ `;async function pr(n){return b.functionIgnoringException(`generateDockerignore`,async()=>{let r=t.resolve(n.dirPath,`.dockerignore`);if(n.doesContainDockerfile){let e=await x.readFileIgnoringError(r)??``,t=G.getHeadUserContent(e),n=G.getTailUserContent(e),i=t+fr+n;await S.run(()=>x.generateFile(r,i))}else await e.promises.rm(r,{force:!0})})}const K={codeWith2IndentSize:[`cjs`,`mjs`,`js`,`jsx`,`cts`,`mts`,`ts`,`tsx`,`json`,`json5`,`jsonc`,`cpp`,`dart`,`htm`,`html`,`pu`,`puml`,`rb`,`vue`,`xml`,`yaml`,`yml`,`sh`].toSorted(),codeWith4IndentSize:[`go`,`gradle`,`java`,`py`].toSorted(),markdownLike:[`md`].toSorted(),oxlint:[`astro`,`cjs`,`cts`,`js`,`jsx`,`mjs`,`mts`,`svelte`,`ts`,`tsx`,`vue`].toSorted(),oxfmt:`astro.cjs.css.cts.gql.graphql.hbs.htm.html.js.json.json5.jsonc.jsx.less.md.mdx.mjs.mts.scss.svelte.toml.ts.tsx.vue.yaml.yml`.split(`.`).toSorted(),prettierOnly:[`java`].toSorted()},mr=`root = true
149
151
 
150
152
  [*]
151
153
  charset = utf-8
@@ -153,30 +155,34 @@ end_of_line = lf
153
155
  insert_final_newline = true
154
156
  trim_trailing_whitespace = true
155
157
 
156
- ${Bn(H.codeWith2IndentSize)}
158
+ ${gr(K.codeWith2IndentSize)}
157
159
  indent_size = 2
158
160
  indent_style = space
159
161
 
160
- ${Bn(H.codeWith4IndentSize)}
162
+ ${gr(K.codeWith4IndentSize)}
161
163
  indent_size = 4
162
164
  indent_style = space
163
165
 
164
- ${Bn(H.markdownLike)}
166
+ ${gr(K.markdownLike)}
165
167
  max_line_length = off
166
168
  trim_trailing_whitespace = false
167
169
 
168
170
  [{Makefile,*.mk}]
169
171
  indent_style = tab
170
- `;async function zn(e){return x.functionIgnoringException(`generateEditorconfig`,async()=>{let n=t.resolve(e.dirPath,`.editorconfig`);await C.run(()=>S.generateFile(n,Rn))})}function Bn(e){return e.length>1?`[*.{${e.join(`,`)}}]`:`[*.${e[0]}]`}const Vn={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:`MEDIUM`,max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:[`**/__generated__`]};async function Hn(n,r){return x.functionIgnoringException(`generateGeminiConfig`,async()=>{if(!n.isRoot)return;let i=t.resolve(n.dirPath,`.gemini`),a=t.resolve(i,`config.yml`),o=t.resolve(i,`styleguide.md`),s=t.resolve(n.dirPath,`AGENTS_EXTRA.md`),c=structuredClone(Vn);try{let t=await e.promises.readFile(a,`utf8`),n=d.load(t);c=u.all([c,n,c],{arrayMerge:R})}catch{}let l=d.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":`empty`}}),f=await S.readFileIgnoringError(s),p=f?.trimStart().startsWith(`#`)?void 0:f,m=`${n.isPublicRepo?`Review in English based on the following coding standards.`:`以下のコーディング規約を踏まえて、日本語でレビューしてください。`}\n\n${vn(r)}${p?`\n${p.trimEnd()}`:``}`,h=[C.run(()=>S.generateFile(a,l)),C.run(()=>S.generateFile(o,m))];await Promise.all(h)})}async function Un(n){return x.functionIgnoringException(`generateGeminiSettings`,async()=>{if(!n.isRoot)return;let r=t.resolve(n.dirPath,`.gemini`),i=t.resolve(r,`settings.json`);await e.promises.rm(i,{force:!0})})}const Wn=`* text=auto
172
+ `;async function hr(e){return b.functionIgnoringException(`generateEditorconfig`,async()=>{let n=t.resolve(e.dirPath,`.editorconfig`);await S.run(()=>x.generateFile(n,mr))})}function gr(e){return e.length>1?`[*.{${e.join(`,`)}}]`:`[*.${e[0]}]`}const _r={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:`MEDIUM`,max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:[`**/__generated__`]};async function vr(n,r){return b.functionIgnoringException(`generateGeminiConfig`,async()=>{if(!n.isRoot)return;let i=t.resolve(n.dirPath,`.gemini`),a=t.resolve(i,`config.yml`),o=t.resolve(i,`styleguide.md`),s=t.resolve(n.dirPath,`AGENTS_EXTRA.md`),c=structuredClone(_r);try{let t=await e.promises.readFile(a,`utf8`),n=d.load(t);c=u.all([c,n,c],{arrayMerge:F})}catch{}let l=d.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":`empty`}}),f=await x.readFileIgnoringError(s),p=f?.trimStart().startsWith(`#`)?void 0:f,m=`${n.isPublicRepo?`Review in English based on the following coding standards.`:`以下のコーディング規約を踏まえて、日本語でレビューしてください。`}\n\n${qn(r)}${p?`\n${p.trimEnd()}`:``}`,h=[S.run(()=>x.generateFile(a,l)),S.run(()=>x.generateFile(o,m))];await Promise.all(h)})}async function yr(n){return b.functionIgnoringException(`generateGeminiSettings`,async()=>{if(!n.isRoot)return;let r=t.resolve(n.dirPath,`.gemini`),i=t.resolve(r,`settings.json`);await e.promises.rm(i,{force:!0})})}const br=`* text=auto
171
173
 
172
174
  *.lockb binary diff=lockb
173
175
  *.vcproj text eol=crlf
174
176
 
175
- ${[...H.codeWith2IndentSize,...H.codeWith4IndentSize,...H.markdownLike].map(e=>`*.${e} text eol=lf`).join(`
177
+ ${[...K.codeWith2IndentSize,...K.codeWith4IndentSize,...K.markdownLike].map(e=>`*.${e} text eol=lf`).join(`
176
178
  `)}
177
179
 
178
180
  dist/** linguist-generated=true
179
- `;async function Gn(e){return x.functionIgnoringException(`generateGitattributes`,async()=>{let n=t.resolve(e.dirPath,`.gitattributes`);await C.run(()=>S.generateFile(n,Wn))})}const Kn=[`windows`,`macos`,`linux`,`jetbrains`,`visualstudiocode`,`emacs`,`vim`,`yarn`];async function qn(e,n){return x.functionIgnoringException(`generateGitignore`,async()=>{let r=t.resolve(e.dirPath,`.gitignore`),i=await S.readFileIgnoringError(r)??``,a=V.getHeadUserContent(i)+`
181
+ `;async function xr(e){return b.functionIgnoringException(`generateGitattributes`,async()=>{let n=t.resolve(e.dirPath,`.gitattributes`);await S.run(()=>x.generateFile(n,br))})}const q=new class{getOrgAndName(e){let t=e.split(`:`).at(-1)?.split(`/`);return[t?.at(-2)??``,t?.at(-1)?.replace(/.git$/,``)??``]}},Sr=new Map;function Cr(e){let t=e??``,n=Sr.get(t);if(n)return n;let r=new ee({auth:Tr(e)||void 0});return Sr.set(t,r),r}function wr(e){return!!Tr(e)}function Tr(e){return e===`WillBooster`?process.env.GH_BOT_PAT_FOR_WILLBOOSTER||Dr():e===`WillBoosterLab`?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||Dr():process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN||Dr()}let Er;function Dr(){if(Er!==void 0)return Er||void 0;try{Er=f.execFileSync(`gh`,[`auth`,`token`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()||``}catch{Er=``}return Er||void 0}const Or=_.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 kr(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 Jr(n,l));let h=Ar(n);for(let r of[`java`,`node`,`python`])if(e.existsSync(t.resolve(n,`.${r}-version`))){h=!0;break}let g=``;try{g=await o.readFile(t.resolve(n,`Dockerfile`),`utf8`)}catch{}let _=t.resolve(n,`wbfy.json`),ee;try{let e=await o.readFile(_,`utf8`);ee=Or.parse(JSON.parse(e))}catch{}let te=typeof m?.full_name==`string`?m.full_name:void 0,ne,re;if(te){let e=te.split(`/`);e.length>=2&&(ne=e[0],re=e[1])}let ie=te?`github:${te}`: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:g,isRoot:p,isPublicRepo:m?.private===!1,isReferredByOtherRepo:!!l.files,repository:ie,repoAuthor:ne,repoName:re,isWillBoosterRepo:!!(ie?.startsWith(`github:WillBooster/`)||ie?.startsWith(`github:WillBoosterLab/`)),isCloudflare:Br(n,l),doesContainWranglerConfig:zr(n),isRailway:Vr(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:Kr(n),doesContainSubPackageJsons:J(`packages/**/package.json`,n),doesContainDockerfile:!!g||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:J(`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:J(`{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}`,n),doesContainTypeScript:J(`{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}`,n),doesContainJsxOrTsx:J(`{app,src,test}/**/*.{t,j}sx`,n),doesContainJava:J(`**/*.java`,n),doesContainJavaScriptInPackages:J(`packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}`,n),doesContainTypeScriptInPackages:J(`packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}`,n),doesContainJsxOrTsxInPackages:J(`packages/**/{app,src,test}/**/*.{t,j}sx`,n),doesContainJavaInPackages:J(`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:g.includes(`install-litestream.sh`),react:!!s.react,next:!!s.next,playwrightTest:!!s[`@playwright/test`]||!!c[`@playwright/test`]||!!c.playwright,playwrightRuntime:qr(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 Wr(n),packageJson:l,wbfyJson:ee};if(v.doesContainGemfile||v.doesContainGoMod||v.doesContainPackageJson||v.doesContainPoetryLock||v.doesContainUvLock||v.doesContainPomXml||v.doesContainPubspecYaml||v.doesContainTauriConfig||v.doesContainTemplateYaml)return v}catch{}}function Ar(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 jr(e){let t=e.packageJson;return e.doesContainWranglerConfig&&!!(t?.dependencies?.wrangler||t?.devDependencies?.wrangler)&&!Cn(t?.scripts??{}).conflicting&&Mr(e)}function Mr(n){let r=n.dirPath;return Pr(n)?!0:Nr(r,[`wrangler.jsonc`,`wrangler.json`,`wrangler.toml`].filter(n=>e.existsSync(t.resolve(r,n))))?Nr(r,e.readdirSync(r).filter(e=>/^\.(?:dev\.vars|env)(?:\..+)?$/u.test(e))):!1}function Nr(n,r){if(r.length===0)return!0;if(r.some(r=>e.lstatSync(t.resolve(n,r)).isSymbolicLink()))return!1;let i=R(`git`,[`ls-files`,`--`,...r],n);return(i===``?0:i.split(`
182
+ `).length)===r.length&&R(`git`,[`status`,`--porcelain`,`--`,...r],n)===``}function Pr(e){let t=e.packageJson?.dependencies?.wrangler??e.packageJson?.devDependencies?.wrangler;if(!t)return!1;try{let e=h.minVersion(t);if(!e||h.lt(e,`4.77.0`))return!1}catch{return!1}return Fr(e.dirPath)}function Fr(n){try{for(let r of[`wrangler.jsonc`,`wrangler.json`]){let i=t.resolve(n,r);if(e.existsSync(i))return Ir(JSON.parse(Lr(e.readFileSync(i,`utf8`))))}let r=t.resolve(n,`wrangler.toml`);if(e.existsSync(r))return Ir(p(e.readFileSync(r,`utf8`)))}catch{}return!1}function Ir(e){return(e.secrets?.required?.length??0)>0?!0:Object.values(e.env??{}).some(e=>(e?.secrets?.required?.length??0)>0)}function Lr(e){let t=``;for(let n=0;n<e.length;n++){let r=e[n];if(r===`"`){let r=Rr(e,n);t+=r,n+=r.length-1}else if(r===`/`&&e[n+1]===`/`){for(;n<e.length&&e[n]!==`
183
+ `;)n++;t+=`
184
+ `}else if(r===`/`&&e[n+1]===`*`){for(n+=2;n<e.length&&!(e[n]===`*`&&e[n+1]===`/`);)n++;n++}else t+=r}let n=``;for(let e=0;e<t.length;e++){let r=t[e];if(r===`"`){let r=Rr(t,e);n+=r,e+=r.length-1}else if(r===`,`){let i=e+1;for(;i<t.length&&/\s/u.test(t[i]);)i++;t[i]!==`}`&&t[i]!==`]`&&(n+=r)}else n+=r}return n}function Rr(e,t){let n=t;for(;++n<e.length;)if(e[n]===`\\`)n++;else if(e[n]===`"`)break;return e.slice(t,Math.min(n+1,e.length))}function zr(n){return[`wrangler.jsonc`,`wrangler.json`,`wrangler.toml`].some(r=>e.existsSync(t.resolve(n,r)))}function Br(e,t){let n=t.scripts;return n&&Object.values(n).some(e=>typeof e==`string`&&e.includes(`wrangler`))||zr(e)?!0:Hr(e,/cloudflare|wrangler/iu)}function Vr(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:Hr(n,/railway/iu)}function Hr(n,r){let i=t.resolve(n,`.github`,`workflows`);try{return e.readdirSync(i).some(e=>/\.ya?ml$/iu.test(e)&&Ur(i,e,r))}catch{return!1}}function Ur(n,r,i){try{return i.test(e.readFileSync(t.join(n,r),`utf8`))}catch{return!1}}async function Wr(e){let n={};for(let r of[`mise.toml`,`.mise.toml`]){let i=t.resolve(e,r);try{let e=p(await o.readFile(i,`utf8`));for(let[t,r]of Object.entries(e.tasks??{}))n[t]=Gr(r)}catch{}}return n}function Gr(e){return typeof e==`string`?e:Array.isArray(e)?e.filter(e=>typeof e==`string`).join(`
185
+ `):e&&typeof e==`object`?Gr(e.run):``}function J(e,t){return s.globSync(e,{dot:!0,cwd:t,ignore:E}).length>0}function Kr(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 qr(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 Jr(e,t){let n=(await g(e).getRemotes(!0)).find(e=>e.name===`origin`),r=n?.refs.fetch??n?.refs.push;if(typeof r==`string`){let e=await Yr(r);if(e)return e}let i=typeof t.repository==`string`?t.repository:t.repository?.url;if(i){let e=await Yr(i);if(e&&e.message!==`Not Found`)return e}}async function Yr(e){let[t,n]=q.getOrgAndName(e);if(!(!t||!n))try{return(await Cr().request(`GET /repos/{owner}/{repo}`,{owner:t,repo:n})).data}catch(e){let t=Xr(e);if(t)return{full_name:t}}}function Xr(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]=q.getOrgAndName(r);if(!(!i||!a))return`${i}/${a}`}const Zr=[`windows`,`macos`,`linux`,`jetbrains`,`visualstudiocode`,`emacs`,`vim`,`yarn`];async function Qr(e,n){return b.functionIgnoringException(`generateGitignore`,async()=>{let r=t.resolve(e.dirPath,`.gitignore`),i=await x.readFileIgnoringError(r)??``,a=G.getHeadUserContent(i)+`
180
186
  __generated__/
181
187
  !.keep
182
188
  .aider*
@@ -201,7 +207,7 @@ dist/
201
207
  drizzle/mount/
202
208
  temp/
203
209
  tmp/
204
- `,o=V.getTailUserContent(i),s=[...Kn];e.doesContainGemfile&&s.push(`ruby`),e.doesContainGoMod&&(s.push(`go`),a+=`${t.basename(e.dirPath)}
210
+ `,o=G.getTailUserContent(i),s=[...Zr];e.doesContainGemfile&&s.push(`ruby`),e.doesContainGoMod&&(s.push(`go`),a+=`${t.basename(e.dirPath)}
205
211
  `),e.doesContainPackageJson&&s.push(`node`),e.doesContainPomXml&&(s.push(`maven`),a+=`.idea/google-java-format.xml
206
212
  `),e.doesContainPubspecYaml&&(s.push(`flutter`,`AndroidStudio`,`ruby`),a+=`.flutter-plugins-dependencies
207
213
  android/key.properties
@@ -222,18 +228,19 @@ src-tauri/gen/schemas/
222
228
  `),e.depending.litestream&&(a+=`gcp-sa-key.json
223
229
  `),(e.isCloudflare||n.isCloudflare)&&(a+=`.dev.vars*
224
230
  .wrangler/
231
+ `),jr(e)&&(a+=`/worker-configuration.d.ts
225
232
  `),(n.depending.vinext||e.depending.vinext)&&(a+=`.vinext/
226
- `);let c=``;for(let e of s){let t=await Xn(e)??``;if(!t){let n=`https://www.toptal.com/developers/gitignore/api/${e}`,r=await fetch(n),i=await r.text();if(!r.ok||i.includes(`Attention Required!`)||i.includes(`<title>`)){console.error(`Failed to fetch ${n}`);return}t=i.trim(),await C.run(()=>Yn(e,t)),b.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+=`
233
+ `);let c=``;for(let e of s){let t=await ti(e)??``;if(!t){let n=`https://www.toptal.com/developers/gitignore/api/${e}`,r=await fetch(n),i=await r.text();if(!r.ok||i.includes(`Attention Required!`)||i.includes(`<title>`)){console.error(`Failed to fetch ${n}`);return}t=i.trim(),await S.run(()=>ei(e,t)),y.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+=`
227
234
  `),c+=t+`
228
- `}await V.isBerryZeroInstallEnabled(r)||(c=c.replace(`!.yarn/cache`,`# !.yarn/cache`).replace(`# .pnp.*`,`.pnp.*`)),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,`.idea/artifacts`).replaceAll(/^# .idea\/compiler.xml$/gm,`.idea/compiler.xml`).replaceAll(/^# .idea\/jarRepositories.xml$/gm,`.idea/jarRepositories.xml`).replaceAll(/^# .idea\/modules.xml$/gm,`.idea/modules.xml`).replaceAll(/^# .idea\/*.iml$/gm,`.idea/*.iml`).replaceAll(/^# .idea\/modules$/gm,`.idea/modules`).replaceAll(/^# *.iml$/gm,`*.iml`).replaceAll(/^# *.ipr$/gm,`*.ipr`),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,`# .idea/modules.xml`))),c=c.replaceAll(/^.idea\/?$/gm,`# .idea`),e.depending.tauri&&(c=c.replaceAll(/^debug\/$/gm,`# debug/`)),(e.doesContainTauriConfig||e.doesContainTauriConfigInPackages)&&(c=c.replaceAll(/^Cargo\.lock$/gm,`# Cargo.lock`)),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,`$1
235
+ `}await G.isBerryZeroInstallEnabled(r)||(c=c.replace(`!.yarn/cache`,`# !.yarn/cache`).replace(`# .pnp.*`,`.pnp.*`)),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,`.idea/artifacts`).replaceAll(/^# .idea\/compiler.xml$/gm,`.idea/compiler.xml`).replaceAll(/^# .idea\/jarRepositories.xml$/gm,`.idea/jarRepositories.xml`).replaceAll(/^# .idea\/modules.xml$/gm,`.idea/modules.xml`).replaceAll(/^# .idea\/*.iml$/gm,`.idea/*.iml`).replaceAll(/^# .idea\/modules$/gm,`.idea/modules`).replaceAll(/^# *.iml$/gm,`*.iml`).replaceAll(/^# *.ipr$/gm,`*.ipr`),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,`# .idea/modules.xml`))),c=c.replaceAll(/^.idea\/?$/gm,`# .idea`),e.depending.tauri&&(c=c.replaceAll(/^debug\/$/gm,`# debug/`)),(e.doesContainTauriConfig||e.doesContainTauriConfigInPackages)&&(c=c.replaceAll(/^Cargo\.lock$/gm,`# Cargo.lock`)),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,`$1
229
236
  android/$1`));let l=a+`
230
- `+c+o;await C.run(()=>S.generateFile(r,l))})}const Jn=t.join(p.homedir(),`.cache`,`wbfy`,`gitignore`);async function Yn(n,r){await e.promises.mkdir(Jn,{recursive:!0}),await e.promises.writeFile(t.join(Jn,n),r)}async function Xn(n){try{let r=await e.promises.stat(t.join(Jn,n));return Date.now()-r.mtimeMs>360*60*1e3?void 0:await e.promises.readFile(t.join(Jn,n),`utf8`)}catch{}}async function Zn(n){return x.functionIgnoringException(`generateIdeaSettings`,async()=>{let r=t.resolve(n.dirPath,`.idea`);if(e.existsSync(r)){let i=t.resolve(r,`watcherTasks.xml`);await(w(n)||T(n)?C.run(()=>S.generateFile(i,Qn(n))):C.run(()=>e.promises.rm(i,{force:!0})))}})}function Qn(e){return`<?xml version="1.0" encoding="UTF-8"?>
237
+ `+c+o;await S.run(()=>x.generateFile(r,l))})}const $r=t.join(m.homedir(),`.cache`,`wbfy`,`gitignore`);async function ei(n,r){await e.promises.mkdir($r,{recursive:!0}),await e.promises.writeFile(t.join($r,n),r)}async function ti(n){try{let r=await e.promises.stat(t.join($r,n));return Date.now()-r.mtimeMs>360*60*1e3?void 0:await e.promises.readFile(t.join($r,n),`utf8`)}catch{}}async function ni(n){return b.functionIgnoringException(`generateIdeaSettings`,async()=>{let r=t.resolve(n.dirPath,`.idea`);if(e.existsSync(r)){let i=t.resolve(r,`watcherTasks.xml`);await(C(n)||w(n)?S.run(()=>x.generateFile(i,ri(n))):S.run(()=>e.promises.rm(i,{force:!0})))}})}function ri(e){return`<?xml version="1.0" encoding="UTF-8"?>
231
238
  <project version="4">
232
239
  <component name="ProjectTasksOptions">
233
- ${[{args:`--write --no-error-on-unmatched-pattern !**/package.json`,condition:w(e),extensions:H.oxfmt,name:`Oxfmt`,program:`$ProjectFileDir$/node_modules/.bin/oxfmt`},{args:`--cache --write`,condition:T(e),extensions:H.prettierOnly,name:`Prettier`,program:`$ProjectFileDir$/node_modules/.bin/prettier`}].filter(e=>e.condition).flatMap(e=>e.extensions.map(t=>$n(e.program,e.args,e.name,t))).join(``)}
240
+ ${[{args:`--write --no-error-on-unmatched-pattern !**/package.json`,condition:C(e),extensions:K.oxfmt,name:`Oxfmt`,program:`$ProjectFileDir$/node_modules/.bin/oxfmt`},{args:`--cache --write`,condition:w(e),extensions:K.prettierOnly,name:`Prettier`,program:`$ProjectFileDir$/node_modules/.bin/prettier`}].filter(e=>e.condition).flatMap(e=>e.extensions.map(t=>ii(e.program,e.args,e.name,t))).join(``)}
234
241
  </component>
235
242
  </project>
236
- `}function $n(e,t,n,r){return` <TaskOptions isEnabled="true">
243
+ `}function ii(e,t,n,r){return` <TaskOptions isEnabled="true">
237
244
  <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />
238
245
  <option name="checkSyntaxErrors" value="false" />
239
246
  <option name="description" />
@@ -253,9 +260,9 @@ android/$1`));let l=a+`
253
260
  <option name="workingDir" value="$ProjectFileDir$" />
254
261
  <envs />
255
262
  </TaskOptions>
256
- `}function er(e,t){if(!(!e.depending.genI18nTs||!t?.[`gen-i18n-ts`]))return`${e.isBun?`bun`:`yarn`} run gen-i18n-ts > /dev/null`}function U(e,t,n,r=0){tr(e,t,n,r)}function tr(e,t,n,r=0){do{let[i,a,o]=rr(e,t,n),s=m.spawnSync(i,a,o).status??1;if(s===0)break;if(r<=0)return s}while(--r>=0);return 0}function nr(e,t,n){let[r,i,a]=rr(e,t,n);a.stdio=`pipe`;let o=m.spawnSync(r,i,a),s=o.stderr??``,c=typeof s==`string`?s.trim():s.toString().trim();o.error?console.error(`${r} [${i.map(e=>`"${e}"`).join(`, `)}] failed with: ${o.error.message}`):c&&console.error(`${r} [${i.map(e=>`"${e}"`).join(`, `)}] outputs the following content to stderr:\n${c}`);let l=o.stdout??``;return typeof l==`string`?l.trim():l.toString().trim()}function rr(e,t,n){let r={...process.env};return r.PATH&&r.BERRY_BIN_FOLDER&&(r.PATH=r.PATH.split(`:`).filter(e=>e!==r.BERRY_BIN_FOLDER).join(`:`)),[e,t,{cwd:n,env:r,encoding:`utf8`,shell:!1,stdio:`inherit`}]}function ir(e,t){try{let n=nr(`git`,[`ls-remote`,`git@github.com:${e}/${t}.git`,`HEAD`],process.cwd()).split(/\s+/)[0];if(!n)throw Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const W=new class{getOrgAndName(e){let t=e.split(`:`).at(-1)?.split(`/`);return[t?.at(-2)??``,t?.at(-1)?.replace(/.git$/,``)??``]}},ar=new Map;function G(e){let t=e??``,n=ar.get(t);if(n)return n;let r=new g({auth:sr(e)||void 0});return ar.set(t,r),r}function or(e){return!!sr(e)}function sr(e){return e===`WillBooster`?process.env.GH_BOT_PAT_FOR_WILLBOOSTER||cr():e===`WillBoosterLab`?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||cr():process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN||cr()}let K;function cr(){if(K!==void 0)return K||void 0;try{K=m.execFileSync(`gh`,[`auth`,`token`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()||``}catch{K=``}return K||void 0}const lr=[`@tsconfig/bun`,`@tsconfig/node-lts`,`@tsconfig/node-ts`,`@tsconfig/react-native`];function ur(e){return e.isBun?`@tsconfig/bun/tsconfig.json`:e.depending.reactNative?`@tsconfig/react-native/tsconfig.json`:[`@tsconfig/node-lts/tsconfig.json`,`@tsconfig/node-ts/tsconfig.json`]}function dr(e){return e.depending.blitz||e.depending.next?[]:e.isBun?[`@tsconfig/bun`]:e.depending.reactNative?[`@tsconfig/react-native`]:[`@tsconfig/node-lts`,`@tsconfig/node-ts`]}function fr(e){return e.isWillBoosterConfigs&&!e.isRoot&&e.packageJson?.private!==!0&&Array.isArray(e.packageJson?.files)&&e.packageJson.files.length>0}const pr=[`@exercode/*`,`@willbooster/*`,`agent-runtime-kit`,`at-decorators`,`build-ts`,`gen-i18n-ts`,`one-way-git-sync`,`next`,`@next/*`,`@types/*`,`typescript`,`@typescript/*`,`@oxfmt/*`,`@oxlint/*`,`@oxlint-tsgolint/*`,`oxfmt`,`oxlint`,`oxlint-tsgolint`,`react`,`react-dom`];async function mr(n){return x.functionIgnoringException(`generateYarnrcYml`,async()=>{let r=t.resolve(n.dirPath,`.yarnrc.yml`);if(n.isBun){await C.run(()=>e.promises.rm(r,{force:!0})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,`.yarn`),{force:!0,recursive:!0})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,`yarn.lock`),{force:!0,recursive:!0}));return}let i=nr(`yarn`,[`--version`],n.dirPath),a=gr(`@yarnpkg/cli`,n.dirPath);_r(a,i)&&U(`yarn`,[`set`,`version`,a],n.dirPath,1);let o=t.join(n.dirPath,`.yarn`,`releases`);await e.promises.mkdir(o,{recursive:!0});for(let n of await e.promises.readdir(o))n.startsWith(`yarn-`)&&!n.startsWith(`yarn-${a}.`)&&await C.run(()=>e.promises.rm(t.join(o,n)));let s=t.resolve(n.dirPath,`.yarnrc`);await C.run(()=>e.promises.rm(s,{force:!0}));let c={};try{c=d.load(await e.promises.readFile(r,`utf8`))??c}catch{}c.defaultSemverRangePrefix=``,c.enableScripts=!1,c.nodeLinker=`node-modules`,c.nmMode=`hardlinks-global`,c.npmMinimalAgeGate=`5d`,c.approvedGitRepositories=[`https://github.com/WillBooster/*.git`,`ssh://git@github.com/WillBooster/*.git`,`https://github.com/WillBoosterLab/*.git`,`ssh://git@github.com/WillBoosterLab/*.git`],c.npmPreapprovedPackages=pr,delete c.compressionLevel,c.injectEnvironmentFiles?.length===0&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;let l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>e.path!==`.yarn/plugins/undefined.cjs`)??[],c.plugins.length!==l){let r=t.resolve(n.dirPath,`.yarn`,`plugins`,`undefined.cjs`);await C.run(()=>e.promises.rm(r,{force:!0}))}c.plugins.length===0&&delete c.plugins,await e.promises.writeFile(r,d.dump(c,{lineWidth:-1})),U(`yarn`,[`dlx`,`yarn-plugin-auto-install`],n.dirPath),U(`yarn`,hr(n.dirPath,r),n.dirPath)})}function hr(e,n){return[`dlx`,`prettier`,`--no-config`,`--write`,t.relative(e,n)]}function gr(e,t){return nr(`npm`,[`show`,e,`version`],t)||`0.0.0`}function _r(e,t){let n=h.valid(e);return n?h.gt(n,h.valid(t)??`0.0.0`):!1}const vr=[`@willbooster/oxfmt-config`,`@willbooster/oxlint-config`,`oxfmt`,`oxlint`,`oxlint-tsgolint`],yr=`typescript`,br=`@typescript/native-preview`,q=`@willbooster/wb`,J=`build-ts`,xr=`lefthook`,Sr=new Set([q,J,xr,yr,br,`sort-package-json`,...vr]),Cr=[`@willbooster/prettier-config`,...vr.filter(e=>e.startsWith(`@willbooster/`))],wr=`@biomejs/biome.@eslint-react/eslint-plugin.@eslint/js.@next/eslint-plugin-next.@types/eslint.@types/micromatch.@typescript-eslint/eslint-plugin.@typescript-eslint/parser.@willbooster/biome-config.@willbooster/eslint-config.@willbooster/eslint-config-blitz-next.@willbooster/eslint-config-js.@willbooster/eslint-config-js-react.@willbooster/eslint-config-next.@willbooster/eslint-config-react.@willbooster/eslint-config-ts.@willbooster/eslint-config-ts-react.biome.eslint.eslint-config-flat-gitignore.eslint-config-next.eslint-config-prettier.eslint-import-resolver-node.eslint-import-resolver-typescript.eslint-plugin-import.eslint-plugin-import-x.eslint-plugin-perfectionist.eslint-plugin-prettier.eslint-plugin-react.eslint-plugin-react-compiler.eslint-plugin-react-hooks.eslint-plugin-sort-class-members.eslint-plugin-sort-destructure-keys.eslint-plugin-storybook.eslint-plugin-unicorn.eslint-plugin-unused-imports.globals.micromatch.typescript-eslint`.split(`.`),Tr=new Set([`micromatch`,`@types/micromatch`]),Er=/\bfrom\s+['"]micromatch['"]|\brequire\(\s*['"]micromatch['"]\s*\)|\bimport\(\s*['"]micromatch['"]\s*\)/u,Dr=new Map,Or=new Map,kr=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`];async function Ar(e,t,n){return x.functionIgnoringException(`generatePackageJson`,async()=>{await jr(e,t,n)})}async function jr(e,n,r){let i=t.resolve(e.dirPath,`package.json`),a=await Nr(i),o=e.isBun?`bun`:`yarn`;await oi(e,a),await Pr(e,a),Vr(a);let s=await zr(e,n,a);await Gr(e,n,a,s),Zr(e,a,s,r),await Qi(a),$r(a),e.isBun&&delete a.packageManager,await S.generateFile(i,Mr(a)),r||(ei(e,a,s,o),ai(e,o,i))}function Mr(e){return JSON.stringify(Bt(e),void 0,2)}async function Nr(t){let n=await e.promises.readFile(t,`utf8`),r=JSON.parse(n);return r.scripts=r.scripts??{},r.dependencies=r.dependencies??{},r.devDependencies=r.devDependencies??{},r.peerDependencies=r.peerDependencies??{},r}async function Pr(e,t){Fr(t.scripts),t.scripts={...t.scripts,...Li(e,t.scripts)},delete t.scripts[`start-test-server`];let n=t.scripts;e.isBun||!T(e)?delete n.prettify:n.prettify=(n.prettify??``)+await Xi(e.dirPath),Lr(n),Rr(e,n)}function Fr(e){for(let[t,n]of Object.entries(e))typeof n==`string`&&(n.includes(`git clone`)||(e[t]=n.replaceAll(/yarn\s*(?:install\s*)?&&\s*/gu,``)))}function Ir(e){e[`gen-code`]?e.postinstall=`wb gen-code`:e.postinstall?.includes(`gen-i18n-ts`)&&delete e.postinstall}function Lr(e){for(let[t,n]of Object.entries(e))n?.includes(`yarn workspaces foreach`)&&(e[t]=n.replaceAll(/yarn workspaces foreach(?!\s+(?:-A|-R|--(?:all|recursive|since|worktree|from|include|exclude|public|private)))/gu,`yarn workspaces foreach --all`))}function Rr(e,t){e.isBun||!t.railway?.includes(`@railway/cli`)||(t.railway=`YARN_ENABLE_SCRIPTS=true yarn dlx @railway/cli`)}async function zr(n,r,i){let a=[],o=[`sort-package-json`],c=[],l=T(n);l&&!e.existsSync(t.join(r.dirPath,`.prettierrc.json`))&&!e.existsSync(t.join(n.dirPath,`.prettierrc.json`))&&(i.prettier=`@willbooster/prettier-config`,o.push(`prettier-plugin-java`,`@willbooster/prettier-config`)),l?o.push(`prettier`):Zi(i),delete i.devDependencies[`lint-staged`],delete i[`lint-staged`],n.isRoot&&(delete i.devDependencies.husky,delete i.scripts.postpublish,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack,i.scripts.prepare=`lefthook install || true`,o.push(xr),n.depending.semanticRelease&&(Br(i.scripts.release)?delete i.devDependencies[`semantic-release`]:!i.devDependencies[`semantic-release`]&&!i.devDependencies[`multi-semantic-release`]&&!i.devDependencies[`@qiwi/multi-semantic-release`]&&o.push(`semantic-release`),i.version=`0.0.0-semantically-released`),n.depending.playwrightTest&&(!(i.dependencies.artillery||i.devDependencies.artillery)&&!i.dependencies[`@playwright/test`]&&o.push(`@playwright/test`),n.depending.playwrightRuntime?(i.dependencies.playwright??=i.devDependencies.playwright??i.dependencies[`@playwright/test`]??i.devDependencies[`@playwright/test`],a.push(`playwright`),delete i.devDependencies.playwright):(delete i.dependencies.playwright,delete i.devDependencies.playwright)),n.doesContainSubPackageJsons?i.workspaces=Array.isArray(i.workspaces)?u.all([i.workspaces,[`packages/*`]],{arrayMerge:Wt}):[`packages/*`]:Array.isArray(i.workspaces)&&(i.workspaces=i.workspaces.filter(e=>s.globSync(e,{dot:!0,cwd:n.dirPath,ignore:D}).length>0),i.workspaces.length===0&&delete i.workspaces)),n.depending.next&&o.push(`babel-plugin-react-compiler`),Ui(i)||(Hr(i)?a.push(q):o.push(q)),(i.dependencies[J]||i.devDependencies[J]||Object.values(i.scripts).some(e=>e?.includes(J)))&&(Ur(i)?a.push(J):o.push(J)),w(n)&&o.push(...vr);let d=w(n)?dr(n):[];return await ui(n,i,d),o.push(...d),(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(o.push(yr),(n.depending.next||n.depending.blitz||n.depending.vinext)&&o.push(br),n.isBun?o.push(`@types/bun`):n.depending.reactNative||o.push(`@types/node`),(i.dependencies.jest||i.devDependencies.jest||i.dependencies[`@jest/globals`]||i.devDependencies[`@jest/globals`]||i.dependencies[`ts-jest`]||i.devDependencies[`ts-jest`])&&o.push(`@types/jest`)),n.isWillBoosterConfigs?{dependencies:a.filter(e=>!e.includes(`@willbooster/`)),devDependencies:o.filter(e=>!e.includes(`@willbooster/`)),pythonDevDependencies:c}:{dependencies:a,devDependencies:o,pythonDevDependencies:c}}function Br(e){return typeof e==`string`?/\b(?:bunx|npx|pnpm\s+dlx|yarn\s+dlx)\s+semantic-release(?:@\S+)?\b/u.test(e):!1}function Vr(e){for(let[t,n]of[[q,Hr(e)],[J,Ur(e)]])if(n){let n=e.devDependencies[t];if(!n)continue;let r=e.dependencies[t];(!r||Mi(n,r))&&(e.dependencies[t]=n),delete e.devDependencies[t]}else e.dependencies[t]&&(e.devDependencies[t]??=e.dependencies[t],delete e.dependencies[t])}function Hr(e){let t=e.scripts?.postinstall;return typeof t==`string`&&/\bwb\b/u.test(t)}function Ur(e){let t=e.prisma;return Wr(t?.seed)||Wr(e.scripts?.seed)}function Wr(e){return typeof e==`string`&&/(?<![\w-])build-ts(?![\w-])/u.test(e)}async function Gr(n,r,i,a){i.name||=t.basename(n.dirPath),n.doesContainSubPackageJsons&&(i.private=!0),i.license||=`UNLICENSED`,!i.private&&i.license!==`UNLICENSED`&&r.isPublicRepo&&(i.publishConfig??={},i.publishConfig.access??=`public`);let[o]=W.getOrgAndName(n.repository??``);if((o===`WillBooster`||o===`WillBoosterLab`)&&(i.author=`WillBooster Inc.`),await Yr(n,i),!n.isRoot&&i.private&&!i.main&&(i.main=`./src`),delete i.resolutions?.[`npm/chalk`],!n.doesContainSubPackageJsons){if(!n.isBun)if(!n.doesContainJavaScript&&!n.doesContainTypeScript){delete i.scripts.lint,delete i.scripts[`lint-fix`];for(let e of[`cleanup`]){let t=i.scripts[e];t&&(i.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,``))}}else i.scripts[`lint-fix`]=i.scripts[`lint-fix`]??`yarn lint --fix`;if(n.doesContainPubspecYaml){i.scripts.lint=`flutter analyze`,i.scripts[`lint-fix`]=`yarn lint`;let r=[`lib`,`test`,`test_driver`].filter(r=>e.existsSync(t.resolve(n.dirPath,r)));r.length>0&&(i.scripts[`format-code`]=`dart format $(find ${r.join(` `)} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,i.scripts.format=qr(i.scripts.format,n))}let r=ti(n);if(r){i.scripts.postinstall===`poetry install`&&delete i.scripts.postinstall;let e=n.isBun?`bun run`:`yarn`;i.scripts[`common/ci-setup`]=`${e} setup-${r}`,delete i.scripts[`setup-${r===`poetry`?`uv`:`poetry`}`],delete i.scripts[`setup-poetry-asdf`],i.scripts[`setup-${r}`]=ni(r);let t=await s.glob(`**/*.py`,{cwd:n.dirPath,dot:!0,ignore:D}),o=new Set;for(let e of t){let[t,n]=e.split(`/`);t&&n&&o.add(t)}if(o.size>0){let t=[...o].join(` `),s=`${r} run`;i.scripts[`format-code`]=`${s} isort --profile black ${t} && ${s} black ${t}`,i.scripts.lint?i.scripts.lint=`${s} flake8 ${t} && ${i.scripts.lint}`:(i.scripts.lint=`${s} flake8 ${t}`,i.scripts[`lint-fix`]=`${e} lint`),i.scripts.format=qr(i.scripts.format,n),a.pythonDevDependencies.push(`black`,`isort`,`flake8`)}}}(n.repository||i.repository)&&(i.repository=Pi(n.repository??i.repository,i.repository));let c=i.scripts[`gen-code`];c?.includes(`No code generation needed`)?delete i.scripts[`gen-code`]:Kr(n,c)&&(i.scripts[`gen-code`]=`${n.isBun?`bun `:``}wb gen-code`),Jr(n,i),Ir(i.scripts),i.dependencies.prettier||delete i.devDependencies[`@types/prettier`]}function Kr(e,t){return e.depending.blitz||e.depending.chakra||e.depending.genI18nTs||e.depending.prisma||e.depending.drizzle&&!!t?.includes(`drizzle-kit check`)}function qr(e,t){let n=t.isBun?`bun run`:`yarn`;return e?`${e} && ${n} format-code`:`${n} format-code`}function Jr(e,t){Ri(e)&&t.scripts[`gen-i18n-ts`]===`gen-i18n-ts -i i18n -o src/__generated__/i18n.ts -d ja-JP`&&delete t.scripts[`gen-i18n-ts`]}async function Yr(n,r){if(!fr(n))return;let i=t.resolve(n.dirPath,`config.mjs`);if(!e.existsSync(i))return;r.type=`module`;let a=t.resolve(n.dirPath,`config.d.ts`);e.existsSync(a)&&(r.files=[...new Set([...r.files??[],`config.d.mts`])],await C.run(()=>S.generateFile(t.resolve(n.dirPath,`config.d.mts`),Xr)))}const Xr=`export { default } from './config.js';
257
- `;function Zr(e,t,n,r){let i=t.dependencies,a=t.devDependencies;n.dependencies=ii(e,t,i,[...n.dependencies,...Qr(i)],r),n.devDependencies=n.devDependencies.filter(e=>!i[e]),n.devDependencies=ii(e,t,a,[...n.devDependencies,...Qr(a)],r)}function Qr(e){return Object.keys(e).filter(e=>Sr.has(e))}function $r(e){for(let t of kr){let n=e[t];n&&Object.keys(n).length===0&&Reflect.deleteProperty(e,t)}}function ei(e,t,n,r){ri(e,r,n.dependencies.filter(e=>!t.devDependencies?.[e]),!1),ri(e,r,n.devDependencies.filter(e=>!t.dependencies?.[e]),!0);let i=ti(e);if(i&&n.pythonDevDependencies.length>0){let t=[...new Set(n.pythonDevDependencies)];i===`poetry`?U(`poetry`,[`add`,`--group`,`dev`,...t],e.dirPath):U(`uv`,[`add`,`--dev`,...t],e.dirPath)}}function ti(e){if(e.doesContainUvLock)return`uv`;if(e.doesContainPoetryLock)return`poetry`}function ni(e){return e===`uv`?`uv sync --frozen`:`poetry config virtualenvs.in-project true && poetry env use $(mise current python) && poetry run pip install --upgrade pip && poetry install`}function ri(e,t,n,r){if(n.length===0)return;let i=[...new Set(n.map(t=>Ti(e,t)))];U(t,[`add`,...r?[`-D`]:[],...e.isBun?[`--exact`]:[],...i],e.dirPath)}function ii(e,t,n,r,i){let a=[];for(let t of new Set(r)){let r=Ai(e,t,n[t]);if(r&&(a.push(t),!i)||n[t]&&!r&&n[t]!==`*`)continue;let o=gi(e,t);o===`*`&&n[t]||(n[t]=o)}return a}function ai(e,n,r){let i=t.relative(e.dirPath,r);i&&U(n===`bun`?`bunx`:n,[`sort-package-json`,i],e.dirPath)}async function oi(n,r){r.author===`WillBooster LLC`&&(r.author=`WillBooster Inc.`),si(n,r),ci(n,r),delete r.scripts[`sort-package-json`],delete r.scripts[`sort-all-package-json`],delete r.scripts[`check-all-for-ai`],delete r.scripts[`check-for-ai`],delete r.scripts[`typecheck/warn`],delete r.scripts[`typecheck:gen-code`],delete r.scripts[`typecheck:codegen`],delete r.dependencies.tslib,delete r.devDependencies[`@willbooster/renovate-config`],delete r.devDependencies[`@willbooster/tsconfig`],delete r.dependencies[br],delete r.devDependencies[br],!n.doesContainTypeScript&&!n.doesContainTypeScriptInPackages&&(delete r.dependencies[yr],delete r.devDependencies[yr]),delete r.devDependencies.lerna,delete r.devDependencies.pinst,delete r.scripts[`flutter-format`],delete r.scripts[`format-flutter`],delete r.scripts[`python-format`],delete r.scripts[`format-python`],delete r.scripts.prettier,delete r.scripts[`check-all`],delete r.scripts[`verify-code`],delete r.scripts[`verify-code-with-tests`],await C.run(()=>e.promises.rm(t.resolve(n.dirPath,`lerna.json`),{force:!0})),li(n,r),Ei(r,n)}function si(e,n){let r=n.name||t.basename(e.dirPath);for(let e of hi(n))Reflect.deleteProperty(e,r)}function ci(e,t){if(e.isWillBoosterConfigs)for(let n of hi(t))for(let[t,r]of Object.entries(n))r&&Ni(r)&&(n[t]=gi(e,t))}function li(e,t){if(!e.isWillBoosterConfigs)return;let n=hi(t);for(let e of Cr)for(let t of n)Reflect.deleteProperty(t,e)}async function ui(e,t,n){let r=new Set(n),i=await di(e);for(let e of lr)if(!(r.has(e)||i.has(e)))for(let n of hi(t))Reflect.deleteProperty(n,e)}async function di(e){let n=new Set,r=await s.glob(`**/tsconfig*.json`,{cwd:e.dirPath,dot:!0,ignore:D});for(let i of r){let r=t.resolve(e.dirPath,i),a=ce(r);if(!a)return console.warn(`Preserve managed @tsconfig dependencies because ${r} could not be parsed.`),new Set(lr);for(let e of fi(a))for(let t of lr)(e===t||e.startsWith(`${t}/`))&&n.add(t)}return n}function fi(e){let t=[];for(let n of pi(e))r.isPropertyAssignment(n)&&r.isStringLiteral(n.name)&&n.name.text===`extends`&&mi(n.initializer,t);return t}function pi(e){for(let t of e.statements)if(r.isExpressionStatement(t)&&r.isObjectLiteralExpression(t.expression))return t.expression.properties;return[]}function mi(e,t){if(r.isStringLiteral(e))t.push(e.text);else if(r.isArrayLiteralExpression(e))for(let n of e.elements)mi(n,t)}function hi(e){return kr.map(t=>e[t]).filter(e=>!!e)}function gi(e,t){let n=`${e.isBun?`bun`:`yarn`}:${t}`,r=Dr.get(n);if(r)return r;let i=_i(e,t);return Dr.set(n,i),i}function _i(e,t){return xi(e,t)?vi(t,Si(e)):wi(t)}function vi(e,t){let n=bi(e),r=wi(e);if(r!==`*`&&yi(n[r],t))return r;let i=Date.now();return Object.entries(n).filter(([e])=>h.valid(e)).filter(([e])=>(h.prerelease(e)?.length??0)===0).filter(([,e])=>Number.isFinite(Date.parse(e))).filter(([,e])=>i-Date.parse(e)>=t).toSorted(([e],[t])=>h.rcompare(e,t))[0]?.[0]??`*`}function yi(e,t){if(!e)return!1;let n=Date.parse(e);return Number.isFinite(n)&&Date.now()-n>=t}function bi(e){let t=e.replace(/@[^@/]+$/u,``),n=Or.get(t);if(n)return n;let r=nr(`npm`,[`show`,t,`time`,`--json`,`--workspaces=false`],process.cwd());if(!r)return{};try{let e=JSON.parse(r);return Or.set(t,e),e}catch{return{}}}function xi(e,t){return!(e.isBun?En:pr).some(e=>Ci(e,t))}function Si(e){if(e.isBun)return bn*1e3;let t=/^(?<days>\d+)d$/u.exec(`5d`);return Number(t?.groups?.days??0)*24*60*60*1e3}function Ci(e,t){if(e===t)return!0;if(!e.includes(`*`))return!1;let n=e.replaceAll(/[.+?^${}()|[\]\\]/gu,String.raw`\$&`).replaceAll(`*`,`.*`);return RegExp(`^${n}$`,`u`).test(t)}function wi(e){return nr(`npm`,[`show`,e,`version`,`--workspaces=false`],process.cwd())||`*`}function Ti(e,t){return t===q?`${t}@${gi(e,t)}`:t}function Ei(e,t){let n=Oi(t);for(let r of wr)n&&Tr.has(r)||Di(e,t,r)||(delete e.dependencies[r],delete e.devDependencies[r],delete e.peerDependencies[r])}function Di(e,t,n){return fr(t)?e.peerDependencies[n]?!0:n===`@types/eslint`&&!!e.peerDependencies.eslint:!1}function Oi(e){return e.isWillBoosterConfigs&&!e.isRoot||ki(e.dirPath)}function ki(n){return s.globSync(`src/**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}`,{cwd:n,dot:!0,ignore:D}).some(r=>{try{return Er.test(e.readFileSync(t.resolve(n,r),`utf8`))}catch{return!1}})}function Ai(e,t,n){return!n||n===`*`||Ni(n)?!0:Sr.has(t)&&ji(e,t,n)}function ji(e,t,n){return Mi(gi(e,t),n)}function Mi(e,t){let n=h.valid(e),r=h.valid(t);return!n||!r||h.gt(n,r)}function Ni(e){return e.startsWith(`workspace:`)}function Pi(e,t){let n=Fi(e);if(n)return Ii(n,e,t);let r=Fi(t);return r?Ii(r,t):e}function Fi(e){if(typeof e==`string`){if(!e.startsWith(`github:`))return;let[t,n]=W.getOrgAndName(e);return!t||!n?void 0:`git+https://github.com/${t}/${n}.git`}let t=e?.url;if(typeof t!=`string`)return;let n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;let[,r,i]=n;return`git+https://github.com/${r}/${i}.git`}function Ii(e,t,n){return{...typeof t==`object`?t:typeof n==`object`?n:void 0,type:`git`,url:e}}function Li(e,t){if(e.isBun){let n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,r={cleanup:`bun wb lint --fix --format`,format:`bun wb lint --format`,lint:`bun wb lint`,"lint-fix":`bun wb lint --fix`,test:`bun wb test`,typecheck:`bun wb typecheck`,verify:`bun wb verify`,"verify-full":`bun wb verify --full`};return zi(e,r,t,`bun ${Hi(e)}`),Wi(e,r,t,[`build`,`dev`,`start`,`test`,`typecheck`]),n?e.depending.pyright&&(r.typecheck+=` && pyright`):delete r.typecheck,r}else{let n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,r=w(e),i=T(e),a=t.test,o={cleanup:`yarn format && yarn lint-fix`,format:Yi(r,i),lint:`oxlint${n?` --type-aware --type-check`:``} --no-error-on-unmatched-pattern .`,"lint-fix":`yarn lint --fix`,"format-code":`oxfmt --write --no-error-on-unmatched-pattern . '!**/package.json'`,typecheck:`tsc --noEmit`};return i&&(o.prettify=`prettier --cache --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${H.prettierOnly.join(`,`)}}" "!**/test{-,/}fixtures/**"`),e.doesContainSubPackageJsons?(o=u({...o},{format:`${o.format} && yarn workspaces foreach --all --parallel --verbose run format`,lint:`yarn workspaces foreach --all --parallel --verbose run lint`,"lint-fix":`yarn workspaces foreach --all --parallel --verbose run lint-fix`,test:`CI=1 yarn workspaces foreach --all --verbose run test`,typecheck:`yarn workspaces foreach --all --parallel --verbose run typecheck`}),i&&(o.prettify=`prettier --cache --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${H.prettierOnly.join(`,`)}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`)):e.depending.pyright&&(o.typecheck=o.typecheck?`${o.typecheck} && `:``,o.typecheck+=`pyright`),a?.includes(`wb test`)&&(o.test=a),r||(delete o[`format-code`],delete o.lint,delete o[`lint-fix`]),n?e.depending.wb&&(o.typecheck=`wb typecheck`):delete o.typecheck,Ui(e.packageJson)?(o.verify=t.verify??`yarn workspace @willbooster/wb start --working-dir "$INIT_CWD" verify`,o[`verify-full`]=t[`verify-full`]??`yarn verify --full`):(o.verify=`wb verify`,o[`verify-full`]=`wb verify --full`),zi(e,o,t,Hi(e)),Wi(e,o,t,[`build`,`dev`,`start`,`test`,`typecheck`]),o}}function Ri(n){return n.depending.genI18nTs&&e.existsSync(t.join(n.dirPath,`i18n`))}function zi(e,t,n,r){!e.depending.prisma&&!e.depending.drizzle||(Bi(t,n,`db-create-migration`,`${r} migrate-dev`),Bi(t,n,`db-migrate`,`${r} migrate --check-idempotency`),Bi(t,n,`db-view`,`${r} studio`))}function Bi(e,t,n,r){let i=t[n];e[n]=i&&!Vi(i)?i:r}function Vi(e){return/\bwb\s+(?:db|prisma)\b/u.test(e)}function Hi(e){return e.depending.prisma?`wb prisma`:`wb db`}function Ui(e){return e?.name===q}function Wi(e,t,n,r){for(let i of r){if(!Ki(e,i)||qi(e,i))continue;let r=Gi(n[i],i);r===void 0&&n[i]&&!(i in t)||(t[i]=`${r??``}mise run ${i}`)}}function Gi(e,t){if(typeof e==`string`)return new RegExp(String.raw`^((?:\w+=(?:"[^"]*"|'[^']*'|\S+)\s+)*)mise run ${Ji(t)}$`,`u`).exec(e.trim())?.[1]}function Ki(e,t){return Object.hasOwn(e.miseTasks,t)}function qi(e,t){let n=e.miseTasks[t];return n?[`bun`,`yarn`,`npm`,`pnpm`].some(e=>new RegExp(String.raw`\b${e}\s+(?:run\s+)?${Ji(t)}(?![a-zA-Z0-9_\-:.])`,`u`).test(n)):!1}function Ji(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}function Yi(e,t){let n=[`sort-package-json`];return e&&n.push(`yarn format-code`),t&&n.push(`yarn prettify`),n.join(` && `)}async function Xi(n){let r=t.resolve(n,`.prettierignore`),i=await e.promises.readFile(r,`utf8`).catch(()=>``),a=i.indexOf(V.separatorPrefix);return a===-1?``:`${i.slice(0,a).split(`
258
- `).map(e=>{let t=e.trim();return t.endsWith(`/`)?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith(`#`)&&!e.includes(`/`)).map(e=>` "!**/${e}/**"`).join(``)} || true`}function Zi(e){delete e.prettier;let t=[e.dependencies,e.devDependencies,e.peerDependencies];for(let e of t)e&&(delete e.prettier,delete e[`prettier-plugin-java`],delete e[`prettier-plugin-prisma`],delete e[`@willbooster/prettier-config`],delete e[`@types/prettier`])}async function Qi(e){let t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);await Promise.all([{packageName:`@willbooster/auth`,repo:`auth`,target:`dependencies`},{packageName:`@discord-bot/shared`,repo:`discord-bot`,target:`dependencies`},{packageName:`@willbooster/code-analyzer`,repo:`code-analyzer`,target:`devDependencies`},{packageName:`@willbooster/judge`,repo:`judge`,target:`dependencies`},{packageName:`@willbooster/llm-proxy`,repo:`llm-proxy`,target:`dependencies`}].map(async({packageName:n,repo:r,target:i})=>{!t.has(n)||ea(e,n)||(Reflect.deleteProperty(e[i===`dependencies`?`devDependencies`:`dependencies`],n),e[i][n]=await $i(r))}))}async function $i(e){return`git@github.com:WillBoosterLab/${e}.git#${await ir(`WillBoosterLab`,e)}`}function ea(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||``).includes(`workspace`)}const ta={glob_matcher:`doublestar`,"post-merge":{jobs:[{name:`prepare`,script:`prepare.sh`,runner:`bash`}]},"pre-push":{jobs:[{name:`check`,script:`check.sh`,runner:`bash`}]}},na={jobs:[{name:`cleanup`,glob:``,run:``,stage_fixed:!0},{name:`check-migrations`,glob:`**/migration.sql`,run:`failed=0
263
+ `}function ai(e,t){if(!(!e.depending.genI18nTs||!t?.[`gen-i18n-ts`]))return`${e.isBun?`bun`:`yarn`} run gen-i18n-ts > /dev/null`}function oi(e,t){try{let n=R(`git`,[`ls-remote`,`git@github.com:${e}/${t}.git`,`HEAD`],process.cwd()).split(/\s+/)[0];if(!n)throw Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const si=[`@tsconfig/bun`,`@tsconfig/node-lts`,`@tsconfig/node-ts`,`@tsconfig/react-native`];function ci(e){return e.isBun?`@tsconfig/bun/tsconfig.json`:e.depending.reactNative?`@tsconfig/react-native/tsconfig.json`:[`@tsconfig/node-lts/tsconfig.json`,`@tsconfig/node-ts/tsconfig.json`]}function li(e){return e.depending.blitz||e.depending.next?[]:e.isBun?[`@tsconfig/bun`]:e.depending.reactNative?[`@tsconfig/react-native`]:[`@tsconfig/node-lts`,`@tsconfig/node-ts`]}function ui(e){return e.isWillBoosterConfigs&&!e.isRoot&&e.packageJson?.private!==!0&&Array.isArray(e.packageJson?.files)&&e.packageJson.files.length>0}const di=[`@exercode/*`,`@willbooster/*`,`agent-runtime-kit`,`at-decorators`,`build-ts`,`gen-i18n-ts`,`one-way-git-sync`,`next`,`@next/*`,`@types/*`,`typescript`,`@typescript/*`,`@oxfmt/*`,`@oxlint/*`,`@oxlint-tsgolint/*`,`oxfmt`,`oxlint`,`oxlint-tsgolint`,`react`,`react-dom`];async function fi(n){return b.functionIgnoringException(`generateYarnrcYml`,async()=>{let r=t.resolve(n.dirPath,`.yarnrc.yml`);if(n.isBun){await S.run(()=>e.promises.rm(r,{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.yarn`),{force:!0,recursive:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,`yarn.lock`),{force:!0,recursive:!0}));return}let i=R(`yarn`,[`--version`],n.dirPath),a=mi(`@yarnpkg/cli`,n.dirPath);hi(a,i)&&L(`yarn`,[`set`,`version`,a],n.dirPath,1);let o=t.join(n.dirPath,`.yarn`,`releases`);await e.promises.mkdir(o,{recursive:!0});for(let n of await e.promises.readdir(o))n.startsWith(`yarn-`)&&!n.startsWith(`yarn-${a}.`)&&await S.run(()=>e.promises.rm(t.join(o,n)));let s=t.resolve(n.dirPath,`.yarnrc`);await S.run(()=>e.promises.rm(s,{force:!0}));let c={};try{c=d.load(await e.promises.readFile(r,`utf8`))??c}catch{}c.defaultSemverRangePrefix=``,c.enableScripts=!1,c.nodeLinker=`node-modules`,c.nmMode=`hardlinks-global`,c.npmMinimalAgeGate=`5d`,c.approvedGitRepositories=[`https://github.com/WillBooster/*.git`,`ssh://git@github.com/WillBooster/*.git`,`https://github.com/WillBoosterLab/*.git`,`ssh://git@github.com/WillBoosterLab/*.git`],c.npmPreapprovedPackages=di,delete c.compressionLevel,c.injectEnvironmentFiles?.length===0&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;let l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>e.path!==`.yarn/plugins/undefined.cjs`)??[],c.plugins.length!==l){let r=t.resolve(n.dirPath,`.yarn`,`plugins`,`undefined.cjs`);await S.run(()=>e.promises.rm(r,{force:!0}))}c.plugins.length===0&&delete c.plugins,await e.promises.writeFile(r,d.dump(c,{lineWidth:-1})),L(`yarn`,[`dlx`,`yarn-plugin-auto-install`],n.dirPath),L(`yarn`,pi(n.dirPath,r),n.dirPath)})}function pi(e,n){return[`dlx`,`prettier`,`--no-config`,`--write`,t.relative(e,n)]}function mi(e,t){return R(`npm`,[`show`,e,`version`],t)||`0.0.0`}function hi(e,t){let n=h.valid(e);return n?h.gt(n,h.valid(t)??`0.0.0`):!1}const gi=[`@willbooster/oxfmt-config`,`@willbooster/oxlint-config`,`oxfmt`,`oxlint`,`oxlint-tsgolint`],_i=`typescript`,vi=`@typescript/native-preview`,Y=`@willbooster/wb`,X=`build-ts`,yi=`lefthook`,bi=new Set([Y,X,yi,_i,vi,`sort-package-json`,...gi]),xi=[`@willbooster/prettier-config`,...gi.filter(e=>e.startsWith(`@willbooster/`))],Si=`@biomejs/biome.@eslint-react/eslint-plugin.@eslint/js.@next/eslint-plugin-next.@types/eslint.@types/micromatch.@typescript-eslint/eslint-plugin.@typescript-eslint/parser.@willbooster/biome-config.@willbooster/eslint-config.@willbooster/eslint-config-blitz-next.@willbooster/eslint-config-js.@willbooster/eslint-config-js-react.@willbooster/eslint-config-next.@willbooster/eslint-config-react.@willbooster/eslint-config-ts.@willbooster/eslint-config-ts-react.biome.eslint.eslint-config-flat-gitignore.eslint-config-next.eslint-config-prettier.eslint-import-resolver-node.eslint-import-resolver-typescript.eslint-plugin-import.eslint-plugin-import-x.eslint-plugin-perfectionist.eslint-plugin-prettier.eslint-plugin-react.eslint-plugin-react-compiler.eslint-plugin-react-hooks.eslint-plugin-sort-class-members.eslint-plugin-sort-destructure-keys.eslint-plugin-storybook.eslint-plugin-unicorn.eslint-plugin-unused-imports.globals.micromatch.typescript-eslint`.split(`.`),Ci=new Set([`micromatch`,`@types/micromatch`]),wi=/\bfrom\s+['"]micromatch['"]|\brequire\(\s*['"]micromatch['"]\s*\)|\bimport\(\s*['"]micromatch['"]\s*\)/u,Ti=new Map,Ei=new Map,Di=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`];async function Oi(e,t,n){return b.functionIgnoringException(`generatePackageJson`,async()=>{await ki(e,t,n)})}async function ki(e,n,r){let i=t.resolve(e.dirPath,`package.json`),a=await ji(i),o=e.isBun?`bun`:`yarn`;await oa(e,a),await Mi(e,a),Vi(a);let s=await zi(e,n,a);await Gi(e,n,a,s),Zi(e,a,s,r),await Qa(a),$i(a),e.isBun&&delete a.packageManager,await x.generateFile(i,Ai(a)),r||(ea(e,a,s,o),aa(e,o,i))}function Ai(e){return JSON.stringify(Ut(e),void 0,2)}async function ji(t){let n=await e.promises.readFile(t,`utf8`),r=JSON.parse(n);return r.scripts=r.scripts??{},r.dependencies=r.dependencies??{},r.devDependencies=r.devDependencies??{},r.peerDependencies=r.peerDependencies??{},r}async function Mi(e,t){Ni(t.scripts),t.scripts={...t.scripts,...La(e,t.scripts)},delete t.scripts[`start-test-server`];let n=t.scripts;e.isBun||!w(e)?delete n.prettify:n.prettify=(n.prettify??``)+await Xa(e.dirPath),Li(n),Ri(e,n)}function Ni(e){for(let[t,n]of Object.entries(e))typeof n==`string`&&(n.includes(`git clone`)||(e[t]=n.replaceAll(/yarn\s*(?:install\s*)?&&\s*/gu,``)))}function Pi(e,t){if(e[`gen-code`]){let t=e.postinstall?kn(e.postinstall):[];e.postinstall=[`wb gen-code`,...z(e.postinstall,e,()=>!0)||t.some(t=>Pn(t,e))||On(e.postinstall??``)&&t.some(e=>!!V(e))?t.filter(t=>t!==``&&!Mn(t,e)):[]].join(` && `)}else e.postinstall?.includes(`gen-i18n-ts`)&&delete e.postinstall;if(!t||En(e))return;let n=e.postinstall;e.postinstall=n&&(z(n,e,()=>!0)||On(n))?`${t} && ${n}`:Ii(n??``,t).replace(/^ && /u,``)}function Fi(e,t){if(!jr(e))return;let{command:n}=Cn(t);return n??`${e.isBun?`bunx `:``}wrangler types`}function Ii(e,t){return t?`${e} && ${t}`:e}function Li(e){for(let[t,n]of Object.entries(e))n?.includes(`yarn workspaces foreach`)&&(e[t]=n.replaceAll(/yarn workspaces foreach(?!\s+(?:-A|-R|--(?:all|recursive|since|worktree|from|include|exclude|public|private)))/gu,`yarn workspaces foreach --all`))}function Ri(e,t){e.isBun||!t.railway?.includes(`@railway/cli`)||(t.railway=`YARN_ENABLE_SCRIPTS=true yarn dlx @railway/cli`)}async function zi(n,r,i){let a=[],o=[`sort-package-json`],c=[],l=w(n);l&&!e.existsSync(t.join(r.dirPath,`.prettierrc.json`))&&!e.existsSync(t.join(n.dirPath,`.prettierrc.json`))&&(i.prettier=`@willbooster/prettier-config`,o.push(`prettier-plugin-java`,`@willbooster/prettier-config`)),l?o.push(`prettier`):Za(i),delete i.devDependencies[`lint-staged`],delete i[`lint-staged`],n.isRoot&&(delete i.devDependencies.husky,delete i.scripts.postpublish,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack,i.scripts.prepare=`lefthook install || true`,o.push(yi),n.depending.semanticRelease&&(Bi(i.scripts.release)?delete i.devDependencies[`semantic-release`]:!i.devDependencies[`semantic-release`]&&!i.devDependencies[`multi-semantic-release`]&&!i.devDependencies[`@qiwi/multi-semantic-release`]&&o.push(`semantic-release`),i.version=`0.0.0-semantically-released`),n.depending.playwrightTest&&(!(i.dependencies.artillery||i.devDependencies.artillery)&&!i.dependencies[`@playwright/test`]&&o.push(`@playwright/test`),n.depending.playwrightRuntime?(i.dependencies.playwright??=i.devDependencies.playwright??i.dependencies[`@playwright/test`]??i.devDependencies[`@playwright/test`],a.push(`playwright`),delete i.devDependencies.playwright):(delete i.dependencies.playwright,delete i.devDependencies.playwright)),n.doesContainSubPackageJsons?i.workspaces=Array.isArray(i.workspaces)?u.all([i.workspaces,[`packages/*`]],{arrayMerge:qt}):[`packages/*`]:Array.isArray(i.workspaces)&&(i.workspaces=i.workspaces.filter(e=>s.globSync(e,{dot:!0,cwd:n.dirPath,ignore:E}).length>0),i.workspaces.length===0&&delete i.workspaces)),n.depending.next&&o.push(`babel-plugin-react-compiler`),Ua(i)||(Hi(i)?a.push(Y):o.push(Y)),(i.dependencies[X]||i.devDependencies[X]||Object.values(i.scripts).some(e=>e?.includes(X)))&&(Ui(i)?a.push(X):o.push(X)),C(n)&&o.push(...gi);let d=C(n)?li(n):[];return await ua(n,i,d),o.push(...d),(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(o.push(_i),(n.depending.next||n.depending.blitz||n.depending.vinext)&&o.push(vi),n.isBun?o.push(`@types/bun`):n.depending.reactNative||o.push(`@types/node`),(i.dependencies.jest||i.devDependencies.jest||i.dependencies[`@jest/globals`]||i.devDependencies[`@jest/globals`]||i.dependencies[`ts-jest`]||i.devDependencies[`ts-jest`])&&o.push(`@types/jest`)),n.isWillBoosterConfigs?{dependencies:a.filter(e=>!e.includes(`@willbooster/`)),devDependencies:o.filter(e=>!e.includes(`@willbooster/`)),pythonDevDependencies:c}:{dependencies:a,devDependencies:o,pythonDevDependencies:c}}function Bi(e){return typeof e==`string`?/\b(?:bunx|npx|pnpm\s+dlx|yarn\s+dlx)\s+semantic-release(?:@\S+)?\b/u.test(e):!1}function Vi(e){for(let[t,n]of[[Y,Hi(e)],[X,Ui(e)]])if(n){let n=e.devDependencies[t];if(!n)continue;let r=e.dependencies[t];(!r||Ma(n,r))&&(e.dependencies[t]=n),delete e.devDependencies[t]}else e.dependencies[t]&&(e.devDependencies[t]??=e.dependencies[t],delete e.dependencies[t])}function Hi(e){let t=e.scripts?.postinstall;return typeof t==`string`&&/\bwb\b/u.test(t)}function Ui(e){let t=e.prisma;return Wi(t?.seed)||Wi(e.scripts?.seed)}function Wi(e){return typeof e==`string`&&/(?<![\w-])build-ts(?![\w-])/u.test(e)}async function Gi(n,r,i,a){i.name||=t.basename(n.dirPath),n.doesContainSubPackageJsons&&(i.private=!0),i.license||=`UNLICENSED`,!i.private&&i.license!==`UNLICENSED`&&r.isPublicRepo&&(i.publishConfig??={},i.publishConfig.access??=`public`);let[o]=q.getOrgAndName(n.repository??``);if((o===`WillBooster`||o===`WillBoosterLab`)&&(i.author=`WillBooster Inc.`),await Yi(n,i),!n.isRoot&&i.private&&!i.main&&(i.main=`./src`),delete i.resolutions?.[`npm/chalk`],!n.doesContainSubPackageJsons){if(!n.isBun)if(!n.doesContainJavaScript&&!n.doesContainTypeScript){delete i.scripts.lint,delete i.scripts[`lint-fix`];for(let e of[`cleanup`]){let t=i.scripts[e];t&&(i.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,``))}}else i.scripts[`lint-fix`]=i.scripts[`lint-fix`]??`yarn lint --fix`;if(n.doesContainPubspecYaml){i.scripts.lint=`flutter analyze`,i.scripts[`lint-fix`]=`yarn lint`;let r=[`lib`,`test`,`test_driver`].filter(r=>e.existsSync(t.resolve(n.dirPath,r)));r.length>0&&(i.scripts[`format-code`]=`dart format $(find ${r.join(` `)} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,i.scripts.format=qi(i.scripts.format,n))}let r=ta(n);if(r){i.scripts.postinstall===`poetry install`&&delete i.scripts.postinstall;let e=n.isBun?`bun run`:`yarn`;i.scripts[`common/ci-setup`]=`${e} setup-${r}`,delete i.scripts[`setup-${r===`poetry`?`uv`:`poetry`}`],delete i.scripts[`setup-poetry-asdf`],i.scripts[`setup-${r}`]=na(r);let t=await s.glob(`**/*.py`,{cwd:n.dirPath,dot:!0,ignore:E}),o=new Set;for(let e of t){let[t,n]=e.split(`/`);t&&n&&o.add(t)}if(o.size>0){let t=[...o].join(` `),s=`${r} run`;i.scripts[`format-code`]=`${s} isort --profile black ${t} && ${s} black ${t}`,i.scripts.lint?i.scripts.lint=`${s} flake8 ${t} && ${i.scripts.lint}`:(i.scripts.lint=`${s} flake8 ${t}`,i.scripts[`lint-fix`]=`${e} lint`),i.scripts.format=qi(i.scripts.format,n),a.pythonDevDependencies.push(`black`,`isort`,`flake8`)}}}(n.repository||i.repository)&&(i.repository=Pa(n.repository??i.repository,i.repository));let c=Fi(n,i.scripts),l=i.scripts[`gen-code`];l?.includes(`No code generation needed`)?delete i.scripts[`gen-code`]:Ki(n,l)?i.scripts[`gen-code`]=Ii(`${n.isBun?`bun `:``}wb gen-code`,c):l&&c&&!z(l,i.scripts,e=>H(e)===`reusableGenerator`)&&(i.scripts[`gen-code`]=z(l,i.scripts,()=>!0)||On(l)?`${c} && ${l}`:Ii(l,c)),Ji(n,i),Pi(i.scripts,c),i.dependencies.prettier||delete i.devDependencies[`@types/prettier`]}function Ki(e,t){return e.depending.blitz||e.depending.chakra||e.depending.genI18nTs||e.depending.prisma||e.depending.drizzle&&!!t?.includes(`drizzle-kit check`)}function qi(e,t){let n=t.isBun?`bun run`:`yarn`;return e?`${e} && ${n} format-code`:`${n} format-code`}function Ji(e,t){Ra(e)&&t.scripts[`gen-i18n-ts`]===`gen-i18n-ts -i i18n -o src/__generated__/i18n.ts -d ja-JP`&&delete t.scripts[`gen-i18n-ts`]}async function Yi(n,r){if(!ui(n))return;let i=t.resolve(n.dirPath,`config.mjs`);if(!e.existsSync(i))return;r.type=`module`;let a=t.resolve(n.dirPath,`config.d.ts`);e.existsSync(a)&&(r.files=[...new Set([...r.files??[],`config.d.mts`])],await S.run(()=>x.generateFile(t.resolve(n.dirPath,`config.d.mts`),Xi)))}const Xi=`export { default } from './config.js';
264
+ `;function Zi(e,t,n,r){let i=t.dependencies,a=t.devDependencies;n.dependencies=ia(e,t,i,[...n.dependencies,...Qi(i)],r),n.devDependencies=n.devDependencies.filter(e=>!i[e]),n.devDependencies=ia(e,t,a,[...n.devDependencies,...Qi(a)],r)}function Qi(e){return Object.keys(e).filter(e=>bi.has(e))}function $i(e){for(let t of Di){let n=e[t];n&&Object.keys(n).length===0&&Reflect.deleteProperty(e,t)}}function ea(e,t,n,r){ra(e,r,n.dependencies.filter(e=>!t.devDependencies?.[e]),!1),ra(e,r,n.devDependencies.filter(e=>!t.dependencies?.[e]),!0);let i=ta(e);if(i&&n.pythonDevDependencies.length>0){let t=[...new Set(n.pythonDevDependencies)];i===`poetry`?L(`poetry`,[`add`,`--group`,`dev`,...t],e.dirPath):L(`uv`,[`add`,`--dev`,...t],e.dirPath)}}function ta(e){if(e.doesContainUvLock)return`uv`;if(e.doesContainPoetryLock)return`poetry`}function na(e){return e===`uv`?`uv sync --frozen`:`poetry config virtualenvs.in-project true && poetry env use $(mise current python) && poetry run pip install --upgrade pip && poetry install`}function ra(e,t,n,r){if(n.length===0)return;let i=[...new Set(n.map(t=>Ta(e,t)))];L(t,[`add`,...r?[`-D`]:[],...e.isBun?[`--exact`]:[],...i],e.dirPath)}function ia(e,t,n,r,i){let a=[];for(let t of new Set(r)){let r=Aa(e,t,n[t]);if(r&&(a.push(t),!i)||n[t]&&!r&&n[t]!==`*`)continue;let o=ga(e,t);o===`*`&&n[t]||(n[t]=o)}return a}function aa(e,n,r){let i=t.relative(e.dirPath,r);i&&L(n===`bun`?`bunx`:n,[`sort-package-json`,i],e.dirPath)}async function oa(n,r){r.author===`WillBooster LLC`&&(r.author=`WillBooster Inc.`),sa(n,r),ca(n,r),delete r.scripts[`sort-package-json`],delete r.scripts[`sort-all-package-json`],delete r.scripts[`check-all-for-ai`],delete r.scripts[`check-for-ai`],delete r.scripts[`typecheck/warn`],delete r.scripts[`typecheck:gen-code`],delete r.scripts[`typecheck:codegen`],delete r.dependencies.tslib,delete r.devDependencies[`@willbooster/renovate-config`],delete r.devDependencies[`@willbooster/tsconfig`],delete r.dependencies[vi],delete r.devDependencies[vi],!n.doesContainTypeScript&&!n.doesContainTypeScriptInPackages&&(delete r.dependencies[_i],delete r.devDependencies[_i]),delete r.devDependencies.lerna,delete r.devDependencies.pinst,delete r.scripts[`flutter-format`],delete r.scripts[`format-flutter`],delete r.scripts[`python-format`],delete r.scripts[`format-python`],delete r.scripts.prettier,delete r.scripts[`check-all`],delete r.scripts[`verify-code`],delete r.scripts[`verify-code-with-tests`],await S.run(()=>e.promises.rm(t.resolve(n.dirPath,`lerna.json`),{force:!0})),la(n,r),Ea(r,n)}function sa(e,n){let r=n.name||t.basename(e.dirPath);for(let e of ha(n))Reflect.deleteProperty(e,r)}function ca(e,t){if(e.isWillBoosterConfigs)for(let n of ha(t))for(let[t,r]of Object.entries(n))r&&Na(r)&&(n[t]=ga(e,t))}function la(e,t){if(!e.isWillBoosterConfigs)return;let n=ha(t);for(let e of xi)for(let t of n)Reflect.deleteProperty(t,e)}async function ua(e,t,n){let r=new Set(n),i=await da(e);for(let e of si)if(!(r.has(e)||i.has(e)))for(let n of ha(t))Reflect.deleteProperty(n,e)}async function da(e){let n=new Set,r=await s.glob(`**/tsconfig*.json`,{cwd:e.dirPath,dot:!0,ignore:E});for(let i of r){let r=t.resolve(e.dirPath,i),a=le(r);if(!a)return console.warn(`Preserve managed @tsconfig dependencies because ${r} could not be parsed.`),new Set(si);for(let e of fa(a))for(let t of si)(e===t||e.startsWith(`${t}/`))&&n.add(t)}return n}function fa(e){let t=[];for(let n of pa(e))r.isPropertyAssignment(n)&&r.isStringLiteral(n.name)&&n.name.text===`extends`&&ma(n.initializer,t);return t}function pa(e){for(let t of e.statements)if(r.isExpressionStatement(t)&&r.isObjectLiteralExpression(t.expression))return t.expression.properties;return[]}function ma(e,t){if(r.isStringLiteral(e))t.push(e.text);else if(r.isArrayLiteralExpression(e))for(let n of e.elements)ma(n,t)}function ha(e){return Di.map(t=>e[t]).filter(e=>!!e)}function ga(e,t){let n=`${e.isBun?`bun`:`yarn`}:${t}`,r=Ti.get(n);if(r)return r;let i=_a(e,t);return Ti.set(n,i),i}function _a(e,t){return xa(e,t)?va(t,Sa(e)):wa(t)}function va(e,t){let n=ba(e),r=wa(e);if(r!==`*`&&ya(n[r],t))return r;let i=Date.now();return Object.entries(n).filter(([e])=>h.valid(e)).filter(([e])=>(h.prerelease(e)?.length??0)===0).filter(([,e])=>Number.isFinite(Date.parse(e))).filter(([,e])=>i-Date.parse(e)>=t).toSorted(([e],[t])=>h.rcompare(e,t))[0]?.[0]??`*`}function ya(e,t){if(!e)return!1;let n=Date.parse(e);return Number.isFinite(n)&&Date.now()-n>=t}function ba(e){let t=e.replace(/@[^@/]+$/u,``),n=Ei.get(t);if(n)return n;let r=R(`npm`,[`show`,t,`time`,`--json`,`--workspaces=false`],process.cwd());if(!r)return{};try{let e=JSON.parse(r);return Ei.set(t,e),e}catch{return{}}}function xa(e,t){return!(e.isBun?tr:di).some(e=>Ca(e,t))}function Sa(e){if(e.isBun)return Yn*1e3;let t=/^(?<days>\d+)d$/u.exec(`5d`);return Number(t?.groups?.days??0)*24*60*60*1e3}function Ca(e,t){if(e===t)return!0;if(!e.includes(`*`))return!1;let n=e.replaceAll(/[.+?^${}()|[\]\\]/gu,String.raw`\$&`).replaceAll(`*`,`.*`);return RegExp(`^${n}$`,`u`).test(t)}function wa(e){return R(`npm`,[`show`,e,`version`,`--workspaces=false`],process.cwd())||`*`}function Ta(e,t){return t===Y?`${t}@${ga(e,t)}`:t}function Ea(e,t){let n=Oa(t);for(let r of Si)n&&Ci.has(r)||Da(e,t,r)||(delete e.dependencies[r],delete e.devDependencies[r],delete e.peerDependencies[r])}function Da(e,t,n){return ui(t)?e.peerDependencies[n]?!0:n===`@types/eslint`&&!!e.peerDependencies.eslint:!1}function Oa(e){return e.isWillBoosterConfigs&&!e.isRoot||ka(e.dirPath)}function ka(n){return s.globSync(`src/**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}`,{cwd:n,dot:!0,ignore:E}).some(r=>{try{return wi.test(e.readFileSync(t.resolve(n,r),`utf8`))}catch{return!1}})}function Aa(e,t,n){return!n||n===`*`||Na(n)?!0:bi.has(t)&&ja(e,t,n)}function ja(e,t,n){return Ma(ga(e,t),n)}function Ma(e,t){let n=h.valid(e),r=h.valid(t);return!n||!r||h.gt(n,r)}function Na(e){return e.startsWith(`workspace:`)}function Pa(e,t){let n=Fa(e);if(n)return Ia(n,e,t);let r=Fa(t);return r?Ia(r,t):e}function Fa(e){if(typeof e==`string`){if(!e.startsWith(`github:`))return;let[t,n]=q.getOrgAndName(e);return!t||!n?void 0:`git+https://github.com/${t}/${n}.git`}let t=e?.url;if(typeof t!=`string`)return;let n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;let[,r,i]=n;return`git+https://github.com/${r}/${i}.git`}function Ia(e,t,n){return{...typeof t==`object`?t:typeof n==`object`?n:void 0,type:`git`,url:e}}function La(e,t){if(e.isBun){let n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,r={cleanup:`bun wb lint --fix --format`,format:`bun wb lint --format`,lint:`bun wb lint`,"lint-fix":`bun wb lint --fix`,test:`bun wb test`,typecheck:`bun wb typecheck`,verify:`bun wb verify`,"verify-full":`bun wb verify --full`};return za(e,r,t,`bun ${Ha(e)}`),Wa(e,r,t,[`build`,`dev`,`start`,`test`,`typecheck`]),n?e.depending.pyright&&(r.typecheck+=` && pyright`):delete r.typecheck,r}else{let n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,r=C(e),i=w(e),a=t.test,o={cleanup:`yarn format && yarn lint-fix`,format:Ya(r,i),lint:`oxlint${n?` --type-aware --type-check`:``} --no-error-on-unmatched-pattern .`,"lint-fix":`yarn lint --fix`,"format-code":`oxfmt --write --no-error-on-unmatched-pattern . '!**/package.json'`,typecheck:`tsc --noEmit`};return i&&(o.prettify=`prettier --cache --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${K.prettierOnly.join(`,`)}}" "!**/test{-,/}fixtures/**"`),e.doesContainSubPackageJsons?(o=u({...o},{format:`${o.format} && yarn workspaces foreach --all --parallel --verbose run format`,lint:`yarn workspaces foreach --all --parallel --verbose run lint`,"lint-fix":`yarn workspaces foreach --all --parallel --verbose run lint-fix`,test:`CI=1 yarn workspaces foreach --all --verbose run test`,typecheck:`yarn workspaces foreach --all --parallel --verbose run typecheck`}),i&&(o.prettify=`prettier --cache --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${K.prettierOnly.join(`,`)}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`)):e.depending.pyright&&(o.typecheck=o.typecheck?`${o.typecheck} && `:``,o.typecheck+=`pyright`),a?.includes(`wb test`)&&(o.test=a),r||(delete o[`format-code`],delete o.lint,delete o[`lint-fix`]),n?e.depending.wb&&(o.typecheck=`wb typecheck`):delete o.typecheck,Ua(e.packageJson)?(o.verify=t.verify??`yarn workspace @willbooster/wb start --working-dir "$INIT_CWD" verify`,o[`verify-full`]=t[`verify-full`]??`yarn verify --full`):(o.verify=`wb verify`,o[`verify-full`]=`wb verify --full`),za(e,o,t,Ha(e)),Wa(e,o,t,[`build`,`dev`,`start`,`test`,`typecheck`]),o}}function Ra(n){return n.depending.genI18nTs&&e.existsSync(t.join(n.dirPath,`i18n`))}function za(e,t,n,r){!e.depending.prisma&&!e.depending.drizzle||(Ba(t,n,`db-create-migration`,`${r} migrate-dev`),Ba(t,n,`db-migrate`,`${r} migrate --check-idempotency`),Ba(t,n,`db-view`,`${r} studio`))}function Ba(e,t,n,r){let i=t[n];e[n]=i&&!Va(i)?i:r}function Va(e){return/\bwb\s+(?:db|prisma)\b/u.test(e)}function Ha(e){return e.depending.prisma?`wb prisma`:`wb db`}function Ua(e){return e?.name===Y}function Wa(e,t,n,r){for(let i of r){if(!Ka(e,i)||qa(e,i))continue;let r=Ga(n[i],i);r===void 0&&n[i]&&!(i in t)||(t[i]=`${r??``}mise run ${i}`)}}function Ga(e,t){if(typeof e==`string`)return new RegExp(String.raw`^((?:\w+=(?:"[^"]*"|'[^']*'|\S+)\s+)*)mise run ${Ja(t)}$`,`u`).exec(e.trim())?.[1]}function Ka(e,t){return Object.hasOwn(e.miseTasks,t)}function qa(e,t){let n=e.miseTasks[t];return n?[`bun`,`yarn`,`npm`,`pnpm`].some(e=>new RegExp(String.raw`\b${e}\s+(?:run\s+)?${Ja(t)}(?![a-zA-Z0-9_\-:.])`,`u`).test(n)):!1}function Ja(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}function Ya(e,t){let n=[`sort-package-json`];return e&&n.push(`yarn format-code`),t&&n.push(`yarn prettify`),n.join(` && `)}async function Xa(n){let r=t.resolve(n,`.prettierignore`),i=await e.promises.readFile(r,`utf8`).catch(()=>``),a=i.indexOf(G.separatorPrefix);return a===-1?``:`${i.slice(0,a).split(`
265
+ `).map(e=>{let t=e.trim();return t.endsWith(`/`)?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith(`#`)&&!e.includes(`/`)).map(e=>` "!**/${e}/**"`).join(``)} || true`}function Za(e){delete e.prettier;let t=[e.dependencies,e.devDependencies,e.peerDependencies];for(let e of t)e&&(delete e.prettier,delete e[`prettier-plugin-java`],delete e[`prettier-plugin-prisma`],delete e[`@willbooster/prettier-config`],delete e[`@types/prettier`])}async function Qa(e){let t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);await Promise.all([{packageName:`@willbooster/auth`,repo:`auth`,target:`dependencies`},{packageName:`@discord-bot/shared`,repo:`discord-bot`,target:`dependencies`},{packageName:`@willbooster/code-analyzer`,repo:`code-analyzer`,target:`devDependencies`},{packageName:`@willbooster/judge`,repo:`judge`,target:`dependencies`},{packageName:`@willbooster/llm-proxy`,repo:`llm-proxy`,target:`dependencies`}].map(async({packageName:n,repo:r,target:i})=>{!t.has(n)||eo(e,n)||(Reflect.deleteProperty(e[i===`dependencies`?`devDependencies`:`dependencies`],n),e[i][n]=await $a(r))}))}async function $a(e){return`git@github.com:WillBoosterLab/${e}.git#${await oi(`WillBoosterLab`,e)}`}function eo(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||``).includes(`workspace`)}const to={glob_matcher:`doublestar`,"post-merge":{jobs:[{name:`prepare`,script:`prepare.sh`,runner:`bash`}]},"pre-push":{jobs:[{name:`check`,script:`check.sh`,runner:`bash`}]}},no={jobs:[{name:`cleanup`,glob:``,run:``,stage_fixed:!0},{name:`check-migrations`,glob:`**/migration.sql`,run:`failed=0
259
266
  # Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.
260
267
  for file in {staged_files}; do
261
268
  if grep -q 'Warnings:' "$file"; then
@@ -263,7 +270,7 @@ for file in {staged_files}; do
263
270
  failed=1
264
271
  fi
265
272
  done
266
- exit "$failed"`}]},ra={postMerge:`#!/bin/bash
273
+ exit "$failed"`}]},ro={postMerge:`#!/bin/bash
267
274
 
268
275
  changed_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"
269
276
 
@@ -271,9 +278,9 @@ run_if_changed() {
271
278
  if echo "$changed_files" | grep --quiet -E "$1"; then
272
279
  eval "$2"
273
280
  fi
274
- }`};async function ia(e){return x.functionIgnoringException(`generateLefthookUpdatingPackageJson`,async()=>{await aa(e)})}async function aa(n){let r=t.resolve(n.dirPath,`.lefthook`),i=t.resolve(n.dirPath,`.husky`),a=e.existsSync(i),{lint:o}=Li(n,{}),s={...ta,"pre-commit":{jobs:sa(n)}};if(o||delete s[`pre-push`],await Promise.all([e.promises.writeFile(t.join(n.dirPath,`lefthook.yml`),d.dump(s,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":`empty`}})),e.promises.rm(r,{force:!0,recursive:!0})]),a&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,`.huskyrc.json`),{force:!0})]),U(`git`,[`config`,`--unset`,`core.hooksPath`],n.dirPath)),o){let i=oa(n);e.mkdirSync(t.join(r,`pre-push`),{recursive:!0}),await e.promises.writeFile(t.join(r,`pre-push`,`check.sh`),i+`
275
- `,{mode:493})}let c=`${ra.postMerge}\n\n${da(n).join(`
276
- `)}\n`;e.mkdirSync(t.join(r,`post-merge`),{recursive:!0}),await e.promises.writeFile(t.resolve(r,`post-merge`,`prepare.sh`),c,{mode:493})}function oa(e){let t;t=e.isBun?`bun wb lint`:e.depending.wb?`yarn wb lint`:`yarn run lint`;let n=`${t} --quiet`;return e.repository?.startsWith(`github:WillBoosterLab/`)?`
281
+ }`};async function io(e){return b.functionIgnoringException(`generateLefthookUpdatingPackageJson`,async()=>{await ao(e)})}async function ao(n){let r=t.resolve(n.dirPath,`.lefthook`),i=t.resolve(n.dirPath,`.husky`),a=e.existsSync(i),{lint:o}=La(n,{}),s={...to,"pre-commit":{jobs:so(n)}};if(o||delete s[`pre-push`],await Promise.all([e.promises.writeFile(t.join(n.dirPath,`lefthook.yml`),d.dump(s,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":`empty`}})),e.promises.rm(r,{force:!0,recursive:!0})]),a&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,`.huskyrc.json`),{force:!0})]),L(`git`,[`config`,`--unset`,`core.hooksPath`],n.dirPath)),o){let i=oo(n);e.mkdirSync(t.join(r,`pre-push`),{recursive:!0}),await e.promises.writeFile(t.join(r,`pre-push`,`check.sh`),i+`
282
+ `,{mode:493})}let c=`${ro.postMerge}\n\n${fo(n).join(`
283
+ `)}\n`;e.mkdirSync(t.join(r,`post-merge`),{recursive:!0}),await e.promises.writeFile(t.resolve(r,`post-merge`,`prepare.sh`),c,{mode:493})}function oo(e){let t;t=e.isBun?`bun wb lint`:e.depending.wb?`yarn wb lint`:`yarn run lint`;let n=`${t} --quiet`;return e.repository?.startsWith(`github:WillBoosterLab/`)?`
277
284
  #!/bin/bash
278
285
 
279
286
  if [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then
@@ -284,19 +291,19 @@ if [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "e
284
291
  fi
285
292
 
286
293
  ${n}
287
- `.trim():n}function sa(e){return na.jobs.map(t=>t.name===`cleanup`?{...t,glob:ca(e),run:la(e)}:t)}function ca(e){let t=e.isBun||e.depending.wb||T(e)?[...H.prettierOnly]:[];return w(e)&&t.push(...H.oxfmt,...H.oxlint),(e.doesContainPoetryLock||e.doesContainUvLock)&&t.push(`py`),e.doesContainPubspecYaml&&t.push(`dart`),`**/*.{${[...new Set(t)].toSorted().join(`,`)}}`}function la(e){if(ua(e))return String.raw`
294
+ `.trim():n}function so(e){return no.jobs.map(t=>t.name===`cleanup`?{...t,glob:co(e),run:lo(e)}:t)}function co(e){let t=e.isBun||e.depending.wb||w(e)?[...K.prettierOnly]:[];return C(e)&&t.push(...K.oxfmt,...K.oxlint),(e.doesContainPoetryLock||e.doesContainUvLock)&&t.push(`py`),e.doesContainPubspecYaml&&t.push(`dart`),`**/*.{${[...new Set(t)].toSorted().join(`,`)}}`}function lo(e){if(uo(e))return String.raw`
288
295
  # Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.
289
296
  yarn workspace @willbooster/wb start --working-dir "$(git rev-parse --show-toplevel)" lint --fix --format -- {staged_files}
290
- `.trim();let t=w(e)||T(e);if((e.isBun||e.depending.wb)&&t)return`
297
+ `.trim();let t=C(e)||w(e);if((e.isBun||e.depending.wb)&&t)return`
291
298
  # Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.
292
299
  ${e.isBun?`bun wb`:`yarn wb`} lint --fix --format -- {staged_files}
293
- `.trim();let n=H.oxlint.map(e=>String.raw`\.${e}$`).join(`|`),r=H.oxfmt.map(e=>String.raw`\.${e}$`).join(`|`),i=H.prettierOnly.map(e=>String.raw`\.${e}$`).join(`|`),a=w(e),o=T(e);return String.raw`
300
+ `.trim();let n=K.oxlint.map(e=>String.raw`\.${e}$`).join(`|`),r=K.oxfmt.map(e=>String.raw`\.${e}$`).join(`|`),i=K.prettierOnly.map(e=>String.raw`\.${e}$`).join(`|`),a=C(e),o=w(e);return String.raw`
294
301
  # Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.
295
302
  ${a?String.raw`oxlint_files="$(printf '%s\n' {staged_files} | grep -E '(${n})' || true)"`:``}
296
303
  ${a?String.raw`oxfmt_files="$(printf '%s\n' {staged_files} | grep -E '(${r})' | grep -v -E '(^|/)package\.json$' || true)"`:``}
297
304
  ${o?String.raw`prettier_files="$(printf '%s\n' {staged_files} | grep -E '(${i})' || true)"`:``}
298
305
  package_json_files="$(printf '%s\n' {staged_files} | grep -E '(^|/)package\.json$' || true)"
299
- ${fa(e)?String.raw`python_files="$(printf '%s\n' {staged_files} | grep -E '\.py$' || true)"`:``}
306
+ ${po(e)?String.raw`python_files="$(printf '%s\n' {staged_files} | grep -E '\.py$' || true)"`:``}
300
307
  ${e.doesContainPubspecYaml?String.raw`dart_files="$(printf '%s\n' {staged_files} | grep -E '\.dart$' | grep -v 'generated' | grep -v '\.freezed\.dart$' | grep -v '\.g\.dart$' || true)"`:``}
301
308
 
302
309
  ${a?String.raw`
@@ -315,24 +322,24 @@ fi
315
322
  if [ -n "$package_json_files" ]; then
316
323
  node node_modules/.bin/sort-package-json -- $package_json_files
317
324
  fi
318
- ${fa(e)?`if [ -n "$python_files" ]; then
319
- ${pa(e)} isort --profile black --filter-files $python_files
320
- ${pa(e)} black $python_files
321
- ${pa(e)} flake8 $python_files
325
+ ${po(e)?`if [ -n "$python_files" ]; then
326
+ ${mo(e)} isort --profile black --filter-files $python_files
327
+ ${mo(e)} black $python_files
328
+ ${mo(e)} flake8 $python_files
322
329
  fi`:``}
323
330
  ${e.doesContainPubspecYaml?`if [ -n "$dart_files" ]; then
324
331
  dart format $dart_files
325
332
  fi`:``}
326
- `.trim()}function ua(n){if(!n.isRoot)return!1;let r=t.resolve(n.dirPath,`packages`,`wb`,`package.json`);if(!e.existsSync(r))return!1;try{return JSON.parse(e.readFileSync(r,`utf8`)).name===`@willbooster/wb`}catch{return!1}}function da(e){let t=[];if(e.hasVersionSettings){let e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}let n=e.isBun?`bun install`:`yarn`,r=e.depending.blitz||e.depending.next?` && rm -Rf .next`:``;t.push(String.raw`run_if_changed "package\.json" "${n}${r}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.doesContainUvLock&&t.push(String.raw`run_if_changed "uv\.lock" "uv sync --frozen"`),e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/wb prisma deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/wb prisma generate"`);let i=er(e,e.packageJson?.scripts);return i&&t.push(String.raw`run_if_changed "(^|/)i18n/.*\.json$" "${i}"`),t}function fa(e){return e.doesContainPoetryLock||e.doesContainUvLock}function pa(e){return e.doesContainUvLock?`uv run`:`poetry run`}async function ma(t){return x.functionIgnoringException(`generateLintstagedrc`,async()=>{await Promise.all([C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}function ha(e){return e?.trim()}var ga=class{blockNames;markerPrefix;toolName;constructor(e){this.blockNames=e.blockNames,this.markerPrefix=e.markerPrefix,this.toolName=e.toolName}getConfigContent(e){return e.existingContent&&this.hasManagedBlocks(e.existingContent)?this.replaceManagedBlocks(e.existingContent,e.desiredContent,e.filePath):e.desiredContent}getBlock(e,t){return`${this.getStartMarker(e)}
333
+ `.trim()}function uo(n){if(!n.isRoot)return!1;let r=t.resolve(n.dirPath,`packages`,`wb`,`package.json`);if(!e.existsSync(r))return!1;try{return JSON.parse(e.readFileSync(r,`utf8`)).name===`@willbooster/wb`}catch{return!1}}function fo(e){let t=[];if(e.hasVersionSettings){let e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}let n=e.isBun?`bun install`:`yarn`,r=e.depending.blitz||e.depending.next?` && rm -Rf .next`:``;t.push(String.raw`run_if_changed "package\.json" "${n}${r}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.doesContainUvLock&&t.push(String.raw`run_if_changed "uv\.lock" "uv sync --frozen"`),e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/wb prisma deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/wb prisma generate"`);let i=ai(e,e.packageJson?.scripts);return i&&t.push(String.raw`run_if_changed "(^|/)i18n/.*\.json$" "${i}"`),t}function po(e){return e.doesContainPoetryLock||e.doesContainUvLock}function mo(e){return e.doesContainUvLock?`uv run`:`poetry run`}async function ho(t){return b.functionIgnoringException(`generateLintstagedrc`,async()=>{await Promise.all([S.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),S.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),S.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}function go(e){return e?.trim()}var _o=class{blockNames;markerPrefix;toolName;constructor(e){this.blockNames=e.blockNames,this.markerPrefix=e.markerPrefix,this.toolName=e.toolName}getConfigContent(e){return e.existingContent&&this.hasManagedBlocks(e.existingContent)?this.replaceManagedBlocks(e.existingContent,e.desiredContent,e.filePath):e.desiredContent}getBlock(e,t){return`${this.getStartMarker(e)}
327
334
  ${t}
328
- ${this.getEndMarker(e)}`}hasManagedBlocks(e){return this.blockNames.some(t=>e.includes(this.getStartMarker(t)))}replaceManagedBlocks(e,t,n){let r=e;for(let i of this.blockNames){let a=this.extractManagedBlock(t,i);if(!a)continue;let o=this.replaceManagedBlock(r,i,a);if(!o)return console.warn(`Skipped updating incomplete ${i} block in ${this.toolName} config: ${n}`),e;r=o}return r}extractManagedBlock(e,t){return this.getManagedBlockRegExp(t).exec(e)?.[0]}replaceManagedBlock(e,t,n){let r=this.getManagedBlockRegExp(t);if(r.test(e))return e.replace(r,n)}getManagedBlockRegExp(e){return RegExp(`${_a(this.getStartMarker(e))}[\\s\\S]*?${_a(this.getEndMarker(e))}`)}getStartMarker(e){return`// wbfy:start ${this.markerPrefix}-${e}`}getEndMarker(e){return`// wbfy:end ${this.markerPrefix}-${e}`}};function _a(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const Y=new ga({blockNames:[`base`,`export`],markerPrefix:`oxfmt`,toolName:`oxfmt`});async function va(n){return x.functionIgnoringException(`generateOxfmtConfig`,async()=>{let r=t.resolve(n.dirPath,`.oxfmtrc.json`),i=t.resolve(n.dirPath,`oxfmt.config.ts`),a=await S.readFileIgnoringError(i),o=Y.getConfigContent({desiredContent:ya(n),existingContent:a,filePath:i}),s=[C.run(()=>e.promises.rm(r,{force:!0}))];ha(a)!==ha(o)&&s.push(C.run(()=>S.generateFile(i,o))),await Promise.all(s)})}function ya(e){return e.isEsmPackage?`${Y.getBlock(`base`,`import type { OxfmtConfig } from 'oxfmt';
335
+ ${this.getEndMarker(e)}`}hasManagedBlocks(e){return this.blockNames.some(t=>e.includes(this.getStartMarker(t)))}replaceManagedBlocks(e,t,n){let r=e;for(let i of this.blockNames){let a=this.extractManagedBlock(t,i);if(!a)continue;let o=this.replaceManagedBlock(r,i,a);if(!o)return console.warn(`Skipped updating incomplete ${i} block in ${this.toolName} config: ${n}`),e;r=o}return r}extractManagedBlock(e,t){return this.getManagedBlockRegExp(t).exec(e)?.[0]}replaceManagedBlock(e,t,n){let r=this.getManagedBlockRegExp(t);if(r.test(e))return e.replace(r,n)}getManagedBlockRegExp(e){return RegExp(`${vo(this.getStartMarker(e))}[\\s\\S]*?${vo(this.getEndMarker(e))}`)}getStartMarker(e){return`// wbfy:start ${this.markerPrefix}-${e}`}getEndMarker(e){return`// wbfy:end ${this.markerPrefix}-${e}`}};function vo(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const yo=new _o({blockNames:[`base`,`export`],markerPrefix:`oxfmt`,toolName:`oxfmt`});async function bo(n){return b.functionIgnoringException(`generateOxfmtConfig`,async()=>{let r=t.resolve(n.dirPath,`.oxfmtrc.json`),i=t.resolve(n.dirPath,`oxfmt.config.ts`),a=await x.readFileIgnoringError(i),o=yo.getConfigContent({desiredContent:xo(n),existingContent:a,filePath:i}),s=[S.run(()=>e.promises.rm(r,{force:!0}))];go(a)!==go(o)&&s.push(S.run(()=>x.generateFile(i,o))),await Promise.all(s)})}function xo(e){return e.isEsmPackage?`${yo.getBlock(`base`,`import type { OxfmtConfig } from 'oxfmt';
329
336
 
330
337
  import config from '@willbooster/oxfmt-config';
331
338
 
332
339
  const oxfmtResolvedConfig: OxfmtConfig = config;`)}
333
340
 
334
- ${Y.getBlock(`export`,`export default oxfmtResolvedConfig;`)}
335
- `:`${Y.getBlock(`base`,`/// <reference types="node" />
341
+ ${yo.getBlock(`export`,`export default oxfmtResolvedConfig;`)}
342
+ `:`${yo.getBlock(`base`,`/// <reference types="node" />
336
343
  import type { OxfmtConfig } from 'oxfmt';
337
344
 
338
345
  // oxlint-disable unicorn/prefer-module -- Oxfmt config files are only auto-discovered as .ts, and CommonJS avoids ESM package loading issues.
@@ -340,24 +347,24 @@ const oxfmtConfig = require('@willbooster/oxfmt-config');
340
347
 
341
348
  const oxfmtResolvedConfig: OxfmtConfig = oxfmtConfig.default ?? oxfmtConfig;`)}
342
349
 
343
- ${Y.getBlock(`export`,`module.exports = oxfmtResolvedConfig;`)}
344
- `}const X=new ga({blockNames:[`base`,`export`],markerPrefix:`oxlint`,toolName:`oxlint`});async function ba(n,r){return x.functionIgnoringException(`generateOxlintConfig`,async()=>{let r=fr(n),i=t.resolve(n.dirPath,`oxlint.config.ts`),a=await S.readFileIgnoringError(i),o=r&&a&&!X.hasManagedBlocks(a)?a:xa(X.getConfigContent({desiredContent:Sa(n),existingContent:a,filePath:i})),s=[];r||s.push(C.run(()=>e.promises.rm(t.resolve(n.dirPath,`.oxlintrc.json`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`biome.json`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`biome.jsonc`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc.cjs`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc.js`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc.json`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc.yaml`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc.yml`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`eslint.config.cjs`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`eslint.config.js`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`eslint.config.mjs`),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,`eslint.config.ts`),{force:!0}))),ha(a)!==ha(o)&&s.push(C.run(()=>S.generateFile(i,o))),await Promise.all(s)})}function xa(e){return e.replaceAll(/(?<![./])\bconfig\./gu,`oxlintResolvedConfig.`)}function Sa(e){let t=e.isRoot,n=Ca(e);return e.isEsmPackage?`${X.getBlock(`base`,`import type { OxlintConfig } from 'oxlint';
350
+ ${yo.getBlock(`export`,`module.exports = oxfmtResolvedConfig;`)}
351
+ `}const Z=new _o({blockNames:[`base`,`export`],markerPrefix:`oxlint`,toolName:`oxlint`});async function So(n,r){return b.functionIgnoringException(`generateOxlintConfig`,async()=>{let r=ui(n),i=t.resolve(n.dirPath,`oxlint.config.ts`),a=await x.readFileIgnoringError(i),o=r&&a&&!Z.hasManagedBlocks(a)?a:Co(Z.getConfigContent({desiredContent:wo(n),existingContent:a,filePath:i})),s=[];r||s.push(S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.oxlintrc.json`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`biome.json`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`biome.jsonc`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc.cjs`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc.js`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc.json`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc.yaml`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`.eslintrc.yml`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`eslint.config.cjs`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`eslint.config.js`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`eslint.config.mjs`),{force:!0})),S.run(()=>e.promises.rm(t.resolve(n.dirPath,`eslint.config.ts`),{force:!0}))),go(a)!==go(o)&&s.push(S.run(()=>x.generateFile(i,o))),await Promise.all(s)})}function Co(e){return e.replaceAll(/(?<![./])\bconfig\./gu,`oxlintResolvedConfig.`)}function wo(e){let t=e.isRoot,n=To(e);return e.isEsmPackage?`${Z.getBlock(`base`,`import type { OxlintConfig } from 'oxlint';
345
352
 
346
353
  import oxlintBaseConfig from '${n}';
347
354
 
348
- ${wa(`oxlintBaseConfig`,t)}`)}
355
+ ${Eo(`oxlintBaseConfig`,t)}`)}
349
356
 
350
- ${X.getBlock(`export`,`export default oxlintResolvedConfig;`)}
351
- `:`${X.getBlock(`base`,`/// <reference types="node" />
357
+ ${Z.getBlock(`export`,`export default oxlintResolvedConfig;`)}
358
+ `:`${Z.getBlock(`base`,`/// <reference types="node" />
352
359
  import type { OxlintConfig } from 'oxlint';
353
360
 
354
361
  // oxlint-disable unicorn/prefer-module -- Oxlint only auto-discovers .ts config files, and CommonJS avoids ESM package loading issues.
355
362
  const oxlintBaseConfig = require('@willbooster/oxlint-config');
356
363
 
357
- ${wa(`oxlintBaseConfig.default ?? oxlintBaseConfig`,t)}`)}
364
+ ${Eo(`oxlintBaseConfig.default ?? oxlintBaseConfig`,t)}`)}
358
365
 
359
- ${X.getBlock(`export`,`module.exports = oxlintResolvedConfig;`)}
360
- `}function Ca(e){return e.packageJson?.name===`@willbooster/oxlint-config`?`./config.mjs`:`@willbooster/oxlint-config`}function wa(e,t){return t?`// Keep a package-local copy so repositories can add settings outside
366
+ ${Z.getBlock(`export`,`module.exports = oxlintResolvedConfig;`)}
367
+ `}function To(e){return e.packageJson?.name===`@willbooster/oxlint-config`?`./config.mjs`:`@willbooster/oxlint-config`}function Eo(e,t){return t?`// Keep a package-local copy so repositories can add settings outside
361
368
  // managed blocks without mutating the shared imported config object.
362
369
  const oxlintResolvedConfig: OxlintConfig = structuredClone(${e});
363
370
  // The type-aware options make lint perform type checking. Always force them on here,
@@ -366,7 +373,7 @@ oxlintResolvedConfig.options = { ...oxlintResolvedConfig.options, typeAware: tru
366
373
  // here. This does NOT disable type checking: the lint commands pass the --type-aware and
367
374
  // --type-check flags explicitly.
368
375
  const oxlintResolvedConfig: OxlintConfig = structuredClone(${e});
369
- delete oxlintResolvedConfig.options;`}async function Ta(n){return x.functionIgnoringException(`generatePrettierignore`,async()=>{let r=t.resolve(n.dirPath,`.prettierignore`);if(!T(n)){await C.run(()=>e.promises.rm(r,{force:!0}));return}let i=await S.readFileIgnoringError(r)??``,a=V.getHeadUserContent(i),o=V.getTailUserContent(i),s=t.resolve(n.dirPath,`.gitignore`),c=await V.readGitignoreWithoutSeparators(s)||``,l=``;n.doesContainPubspecYaml&&(l=`
376
+ delete oxlintResolvedConfig.options;`}async function Do(n){return b.functionIgnoringException(`generatePrettierignore`,async()=>{let r=t.resolve(n.dirPath,`.prettierignore`);if(!w(n)){await S.run(()=>e.promises.rm(r,{force:!0}));return}let i=await x.readFileIgnoringError(r)??``,a=G.getHeadUserContent(i),o=G.getTailUserContent(i),s=t.resolve(n.dirPath,`.gitignore`),c=await G.readGitignoreWithoutSeparators(s)||``,l=``;n.doesContainPubspecYaml&&(l=`
370
377
  android/app/
371
378
  ios/Runner/Assets.xcassets/
372
379
  pubspec.yaml
@@ -381,15 +388,15 @@ test/fixtures/
381
388
  *.min.js
382
389
  .yarn/
383
390
  .pnp.js
384
- `+l+c+o;await C.run(()=>S.generateFile(r,u))})}const Ea={venvPath:`.`,venv:`.venv`};async function Da(n){return x.functionIgnoringException(`generatePyrightConfigJson`,async()=>{let r=structuredClone(Ea),i=t.resolve(n.dirPath,`pyrightconfig.json`);try{let t=await e.promises.readFile(i,`utf8`),n=JSON.parse(t);r=u.all([r,n,r],{arrayMerge:R})}catch{}let a=JSON.stringify(r,void 0,2);await C.run(()=>S.generateFile(i,a))})}async function Oa(e){return x.functionIgnoringException(`fixRailwayignore`,async()=>{let n=t.resolve(e.dirPath,`.railwayignore`),r=await S.readFileIgnoringError(n);if(!r)return;let i=r.replace(/^scripts\/$/m,`scripts/**
391
+ `+l+c+o;await S.run(()=>x.generateFile(r,u))})}const Oo={venvPath:`.`,venv:`.venv`};async function ko(n){return b.functionIgnoringException(`generatePyrightConfigJson`,async()=>{let r=structuredClone(Oo),i=t.resolve(n.dirPath,`pyrightconfig.json`);try{let t=await e.promises.readFile(i,`utf8`),n=JSON.parse(t);r=u.all([r,n,r],{arrayMerge:F})}catch{}let a=JSON.stringify(r,void 0,2);await S.run(()=>x.generateFile(i,a))})}async function Ao(e){return b.functionIgnoringException(`fixRailwayignore`,async()=>{let n=t.resolve(e.dirPath,`.railwayignore`),r=await x.readFileIgnoringError(n);if(!r)return;let i=r.replace(/^scripts\/$/m,`scripts/**
385
392
  !scripts/
386
- !scripts/*.sh`);i!==r&&await C.run(()=>S.generateFile(n,i))})}async function ka(n){return x.functionIgnoringException(`generateReadme`,async()=>{let r=t.resolve(n.dirPath,`README.md`),i=await e.promises.readFile(r,`utf8`);e.existsSync(t.resolve(n.dirPath,`.releaserc.json`))&&(i=Aa(i,`[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)`));let a=n.repository?.slice(n.repository.indexOf(`:`)+1),o=t.resolve(n.dirPath,`.github`,`workflows`),s=e.existsSync(o)?e.readdirSync(o):[];for(let r of s){if(!r.startsWith(`test`)&&!r.startsWith(`deploy`))continue;let o=r;if(o=(o[0]||``).toUpperCase()+o.slice(1,o.indexOf(`.`)),o=o.replace(`-`,` `),!a)continue;let s=`[![${o}](https://github.com/${a}/actions/workflows/${r}/badge.svg)](https://github.com/${a}/actions/workflows/${r})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${r}`))&&(i=ja(i,o,r),i=Aa(i,s))}await C.run(()=>S.generateFile(r,i))})}function Aa(e,t){e=e.replace(t,``).replaceAll(/\n\n\n+/g,`
393
+ !scripts/*.sh`);i!==r&&await S.run(()=>x.generateFile(n,i))})}async function jo(n){return b.functionIgnoringException(`generateReadme`,async()=>{let r=t.resolve(n.dirPath,`README.md`),i=await e.promises.readFile(r,`utf8`);e.existsSync(t.resolve(n.dirPath,`.releaserc.json`))&&(i=Mo(i,`[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)`));let a=n.repository?.slice(n.repository.indexOf(`:`)+1),o=t.resolve(n.dirPath,`.github`,`workflows`),s=e.existsSync(o)?e.readdirSync(o):[];for(let r of s){if(!r.startsWith(`test`)&&!r.startsWith(`deploy`))continue;let o=r;if(o=(o[0]||``).toUpperCase()+o.slice(1,o.indexOf(`.`)),o=o.replace(`-`,` `),!a)continue;let s=`[![${o}](https://github.com/${a}/actions/workflows/${r}/badge.svg)](https://github.com/${a}/actions/workflows/${r})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${r}`))&&(i=No(i,o,r),i=Mo(i,s))}await S.run(()=>x.generateFile(r,i))})}function Mo(e,t){e=e.replace(t,``).replaceAll(/\n\n\n+/g,`
387
394
 
388
395
  `);for(let n=0;n<e.length;n++)if(e[n-1]===`
389
396
  `&&e[n]===`
390
- `){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,`
397
+ `){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 No(e,t,n){let r=Po(t),i=Po(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,`
391
398
 
392
- `)}function Ma(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function Na(n){return x.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:R})]:r===`@semantic-release/github`&&(a[e]=[`@semantic-release/github`,u.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:[`r: semantic-release`],releasedLabels:[`released :bookmark:`]}],{arrayMerge:R})])}let o=JSON.stringify(i,void 0,2);await C.run(()=>S.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 x.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:R}),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 C.run(()=>e.promises.rm(t.resolve(n.dirPath,`.dependabot`),{force:!0})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,`.renovaterc.json`),{force:!0}));let a=JSON.stringify(r,void 0,2);await C.run(()=>S.generateFile(i,a))})}function Ia(e,t){return[...new Set([...e,...t])].filter(e=>e!==`@willbooster`)}async function La(e){return x.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 x.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:Wt}),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{}z(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 C.run(()=>S.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 C.run(()=>S.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 x.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`],z(a);let o=JSON.stringify(a,void 0,2);await C.run(()=>S.generateFile(r,o))}catch{}})}function co(e){return{"files.watcherExclude":{[e]:!0}}}async function lo(e){return x.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 x.functionIgnoringException(`setupRepositoryRulesets`,async()=>{let[t,n]=W.getOrgAndName(e.repository??``);if(!t||!n||t!==`WillBooster`||Zt(e.repository)||!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 ae(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 ae(()=>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=ee(import.meta.url);async function xo(e){return x.functionIgnoringException(`setupSecrets`,async()=>{let[n,r]=W.getOrgAndName(e.repository??``);if(!n||!r||n!==`WillBoosterLab`||!or(n)||!b.doesUploadEnvVars)return;let i=te.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 x.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 ae(()=>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":`
399
+ `)}function Po(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function Fo(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:F})]:r===`@semantic-release/github`&&(a[e]=[`@semantic-release/github`,u.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:[`r: semantic-release`],releasedLabels:[`released :bookmark:`]}],{arrayMerge:F})])}let o=JSON.stringify(i,void 0,2);await S.run(()=>x.generateFile(r,o))})}const Io={$schema:`https://docs.renovatebot.com/renovate-schema.json`,extends:[`github>WillBooster/willbooster-configs:renovate.json5`]};async function Lo(n){return b.functionIgnoringException(`generateRenovateJson`,async()=>{let r=structuredClone(Io),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:F}),r.extends=Ro(Io.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 Ro(e,t){return[...new Set([...e,...t])].filter(e=>e!==`@willbooster`)}async function zo(e){return b.functionIgnoringException(`installAgentSkills`,async()=>{})}const Bo={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/**/*`]},Vo={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 Ho(n){return b.functionIgnoringException(`generateTsconfig`,async()=>{if(n.depending.blitz||n.depending.next){await Uo(n);return}let r=structuredClone(n.isRoot?Bo:Vo),i=ss(n);r.extends=ci(n),r.compilerOptions??={},r.compilerOptions.rootDir=Jo(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&&Xo(r,`prisma/**/*`);let a=t.resolve(n.dirPath,`tsconfig.json`);try{let t=await e.promises.readFile(a,`utf8`),n=JSON.parse(t),o=Qo(n.compilerOptions?.types),s=os(n.compilerOptions);r.extends=Yo(r.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,r=u.all([r,n,r],{arrayMerge:qt}),r.include=r.include?.filter(e=>!e.includes(`@types`)&&!e.includes(`__tests__/`)&&!e.includes(`tests/`)),r.compilerOptions??={},r.compilerOptions={...r.compilerOptions,...s},ns(r.compilerOptions);let c=[...new Set([...es(o,i),...i])];c.length>0?r.compilerOptions.types=c:delete r.compilerOptions.types,$o(i)&&delete r.compilerOptions.typeRoots}catch{}I(r),r.include?.sort(),delete r.compilerOptions?.experimentalDecorators,delete r.compilerOptions?.baseUrl,rs(r.compilerOptions,n),as(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 Uo(n){let r=t.resolve(n.dirPath,`tsconfig.json`);try{let t=JSON.parse(await e.promises.readFile(r,`utf8`));Go(t),Ko(t.compilerOptions),Wo(t),await S.run(()=>x.generateFile(r,JSON.stringify(t,void 0,2)))}catch{}}function Wo(e){e.include&&(e.include.includes(`scripts/**/*`)||(e.include.push(`scripts/**/*`),e.include.sort()))}function Go(e){let t=e.compilerOptions;if(!t)return;let n=is(t.moduleResolution);(n===`node`||n===`node10`||n===void 0)&&(e.extends?delete t.moduleResolution:t.moduleResolution=`bundler`)}function Ko(e){if(e&&(delete e.baseUrl,e.paths))for(let[t,n]of Object.entries(e.paths))e.paths[t]=qo(n)}function qo(e){return e.map(e=>e.startsWith(`./`)||e.startsWith(`../`)||t.isAbsolute(e)?e:`./${e}`)}function Jo(n){return n.isRoot?`.`:e.existsSync(t.resolve(n.dirPath,`..`,`..`,`package.json`))?`../..`:`.`}function Yo(e,t){let n=[...Zo(e),...Zo(t)],r=[...new Set(n)];if(r.length!==0)return r.length===1?r[0]:r}function Xo(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}function Zo(e){return e?Array.isArray(e)?e:[e]:[]}function Qo(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function $o(e){return e.some(e=>e===`cypress`||e.includes(`/`))}function es(e,t){let n=new Set(t);return e.filter(e=>!(ts(e)&&!n.has(e)))}function ts(e){return e===`cypress`||e===`jest`||e===`mocha`||e===`vitest/globals`}function ns(e){e&&(e.noEmit!==!1||e.emitDeclarationOnly===!0||(e.rewriteRelativeImportExtensions=!0))}function rs(e,t){if(!e)return;let n=is(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=is(e.module);(t===void 0||t!==`preserve`&&!t.startsWith(`es`))&&(e.module=`ESNext`);return}n===`bundler`&&delete e.moduleResolution;let r=is(e.module);(r===`preserve`||r?.startsWith(`es`))&&delete e.module}function is(e){return typeof e==`string`?e.toLowerCase():void 0}function as(e,t){!e||t.isBun||t.depending.reactNative||t.isEsmPackage||(e.module?.toLowerCase()===`commonjs`&&(e.module=`Node16`),e.verbatimModuleSyntax=!1)}function os(e){let t={};for(let n of[`declaration`,`declarationMap`,`sourceMap`]){let r=e?.[n];r!==void 0&&(t[n]=r)}return t}function ss(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 cs=[`**/.git/objects/**`,`**/.git/subtree-cache/**`,`**/node_modules/**`,`**/tmp/**`,`**/temp/**`,`**/dist/**`];async function ls(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 cs)a=u.all([a,us(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(a=u.all([a,us(`**/.venv/**`)])),n.depending.next&&(a=u.all([a,us(`**/.next/**`)])),`editor.codeActionsOnSave`in a&&delete a[`editor.codeActionsOnSave`],`editor.formatOnSave`in a&&delete a[`editor.formatOnSave`],I(a);let o=JSON.stringify(a,void 0,2);await S.run(()=>x.generateFile(r,o))}catch{}})}function us(e){return{"files.watcherExclude":{[e]:!0}}}async function ds(e){return b.functionIgnoringException(`setupLabels`,async()=>{let[t,n]=q.getOrgAndName(e.repository??``);if(!t||!n||t!==`WillBooster`&&t!==`WillBoosterLab`||!wr(t))return;let r=Cr(t);try{await Q(r,t,n,`d1: x-easy :hedgehog:`,`EDE9FE`),await Q(r,t,n,`d2: easy :rabbit2:`,`DDD6FE`),await Q(r,t,n,`d3: medium :ox:`,`C4B5FD`),await Q(r,t,n,`d4: hard :squid:`,`A78BFA`),await Q(r,t,n,`d5: x-hard :whale2:`,`8B5CF6`),await Q(r,t,n,`p1: critical :fire::fire::fire:`,`EF4444`),await Q(r,t,n,`p2: urgent :fire::fire:`,`F87171`),await Q(r,t,n,`p3: important :fire:`,`FCA5A5`),await Q(r,t,n,`p4: nice to have :droplet:`,`FECACA`),await Q(r,t,n,`r: blitz`,`5300bc`),await Q(r,t,n,`r: firebase`,`ffca28`),await Q(r,t,n,`r: prisma`,`0c344b`),await Q(r,t,n,`r: react`,`61dafb`),await Q(r,t,n,`r: svelte`,`ff3e00`),await Q(r,t,n,`r: semantic-release`,`494949`),await Q(r,t,n,`ready :rocket:`,`22C55E`),await Q(r,t,n,`review requested :mag:`,`FBCA04`),await Q(r,t,n,`released :bookmark:`,`6366F1`),await Q(r,t,n,`s: 0.5h :clock1230:`,`F3F4F6`),await Q(r,t,n,`s: 1h :clock1:`,`E5E7EB`),await Q(r,t,n,`s: 2h :clock2:`,`D1D5DB`),await Q(r,t,n,`s: 3h :clock3:`,`9CA3AF`),await Q(r,t,n,`s: 5h :clock5:`,`6B7280`),await Q(r,t,n,`s: 8h :clock8:`,`4B5563`),await Q(r,t,n,`s: 13h :clock1:`,`374151`),await Q(r,t,n,`t: build :hammer:`,`BFDBFE`),await Q(r,t,n,`t: chore :broom:`,`BFDBFE`),await Q(r,t,n,`t: ci :construction_worker:`,`BFDBFE`),await Q(r,t,n,`t: docs :memo:`,`BFDBFE`),await Q(r,t,n,`t: feat :sparkles:`,`BFDBFE`),await Q(r,t,n,`t: fix :bug:`,`BFDBFE`),await Q(r,t,n,`t: perf :zap:`,`BFDBFE`),await Q(r,t,n,`t: refactor :recycle:`,`BFDBFE`),await Q(r,t,n,`t: style :lipstick:`,`BFDBFE`),await Q(r,t,n,`t: test :test_tube:`,`BFDBFE`),await Q(r,t,n,`project`,`24292F`),await Q(r,t,n,`focused :dart:`,`22C55E`),await $(r,t,n,`bug`),await $(r,t,n,`documentation`),await $(r,t,n,`duplicate`),await $(r,t,n,`enhancement`),await $(r,t,n,`good first issue`),await $(r,t,n,`help wanted`),await $(r,t,n,`invalid`),await $(r,t,n,`question`),await $(r,t,n,`wontfix`),await $(r,t,n,`ready`),await $(r,t,n,`review requested`),await $(r,t,n,`released`),await $(r,t,n,`semantic-release`),await $(r,t,n,`llm-pr :robot:`),await $(r,t,n,`ai-pr :robot:`),await $(r,t,n,`gen-pr-all :robot:`),await $(r,t,n,`gen-pr-claude :robot:`),await $(r,t,n,`gen-pr-codex :robot:`),await $(r,t,n,`gen-pr-gemini :robot:`)}catch(e){console.warn(`Skip setupLabels due to:`,e?.stack??e)}})}async function Q(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 $(e,t,n,r){try{await e.request(`DELETE /repos/{owner}/{repo}/labels/{name}`,{owner:t,repo:n,name:r})}catch{}}const fs={"X-GitHub-Api-Version":`2022-11-28`},ps=15368,ms={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:ps},{context:`semantic-pr / semantic-pr`,integration_id:ps}]}},{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 hs(e){return b.functionIgnoringException(`setupRepositoryRulesets`,async()=>{let[t,n]=q.getOrgAndName(e.repository??``);if(!t||!n||t!==`WillBooster`||en(e.repository)||!wr(t))return;let r=Cr(t);try{await _s(r,t,n,gs(e))}catch(e){if(!ys(e))throw e;console.warn(`Skip setupRepositoryRulesets due to:`,e?.stack??e)}})}function gs(e){let t=structuredClone(ms);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:ps});return t}async function _s(e,t,n,r){let i=(await vs(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:fs});return}await e.request(`POST /repos/{owner}/{repo}/rulesets`,{owner:t,repo:n,...r,headers:fs})},{shouldRetry:e=>!ys(e)})}async function vs(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:fs}),{shouldRetry:e=>!ys(e)})).data;if(Array.isArray(i))return i.find(e=>e.name===r&&e.source_type===`Repository`)}function ys(e){if(!e||typeof e!=`object`)return!1;let t=e.status;return t===401||t===403||t===404}const bs=[`READY_DISCORD_WEBHOOK_URL`,`GH_BOT_PAT`,`PUBLIC_GH_BOT_PAT`],xs=te(import.meta.url);async function Ss(e){return b.functionIgnoringException(`setupSecrets`,async()=>{let[n,r]=q.getOrgAndName(e.repository??``);if(!n||!r||n!==`WillBoosterLab`||!wr(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=Cr(n);try{for(let e of bs)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=Cs();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 Cs(){return xs("libsodium-wrappers")}async function ws(e){return b.functionIgnoringException(`setupGitHubSettings`,async()=>{let[t,n]=q.getOrgAndName(e.repository??``);if(!t||!n||t!==`WillBooster`&&t!==`WillBoosterLab`||!wr(t))return;let r=Cr(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=>!Ts(e)})}catch(e){if(!Ts(e))throw e;console.warn(`Skip setupGitHubSettings due to:`,e?.stack??e)}})}function Ts(e){return!e||typeof e!=`object`||!(`status`in e)?!1:e.status===401||e.status===403||e.status===404}const Es=`__PM_RUN__`,Ds={"pull_request_template.md":`
393
400
  Close #<IssueNumber>
394
401
 
395
402
  ## Self Check
@@ -397,8 +404,8 @@ Close #<IssueNumber>
397
404
  - [ ] I've confirmed \`All checks have passed\` on this page.
398
405
  - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).
399
406
  - PR title doesn't have \`WIP:\`.
400
- - The test command (e.g., \`${To} test\`) passed.
401
- - The lint command (e.g., \`${To} lint\`) passed.
407
+ - The test command (e.g., \`${Es} test\`) passed.
408
+ - The lint command (e.g., \`${Es} lint\`) passed.
402
409
  - You may leave this box unchecked due to long workflows.
403
410
  - [ ] I've reviewed my changes on the GitHub diff view.
404
411
  - [ ] I've written the steps to test my changes.
@@ -431,7 +438,6 @@ Close #<IssueNumber>
431
438
  4. Push \`Submit\` button.
432
439
  5. ...
433
440
  -->
434
- `.trim()};async function Do(n){return x.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)&&_(await e.promises.readFile(o,`utf8`),a)>a.length/2||(await e.promises.mkdir(t.resolve(n.dirPath,`.github`),{recursive:!0}),await C.run(()=>S.generateFile(o,a)))}})}function Oo(e,t){let n=t.isBun?`bun run`:`yarn`;return e.replaceAll(To,n)}const ko=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.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 g=``;try{g=await o.readFile(t.resolve(n,`Dockerfile`),`utf8`)}catch{}let ee=t.resolve(n,`wbfy.json`),te;try{let e=await o.readFile(ee,`utf8`);te=ko.parse(JSON.parse(e))}catch{}let _=typeof m?.full_name==`string`?m.full_name:void 0,ne,v;if(_){let e=_.split(`/`);e.length>=2&&(ne=e[0],v=e[1])}let re=_?`github:${_}`:void 0,ie=[`tauri.conf.json`,`tauri.conf.json5`,`Tauri.toml`].some(r=>e.existsSync(t.resolve(n,`src-tauri`,r))),y={dirPath:n,dockerfile:g,isRoot:p,isPublicRepo:m?.private===!1,isReferredByOtherRepo:!!l.files,repository:re,repoAuthor:ne,repoName:v,isWillBoosterRepo:!!(re?.startsWith(`github:WillBooster/`)||re?.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:!!g||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:ie,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:g.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`]||ie,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:te};if(y.doesContainGemfile||y.doesContainGoMod||y.doesContainPackageJson||y.doesContainPoetryLock||y.doesContainUvLock||y.doesContainPomXml||y.doesContainPubspecYaml||y.doesContainTauriConfig||y.doesContainTemplateYaml)return y}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(`
435
- `):e&&typeof e==`object`?Lo(e.run):``}function $(e,t){return s.globSync(e,{dot:!0,cwd:t,ignore:D}).length>0}function Ro(e){return s.globSync(`**/Cargo.toml`,{dot:!0,cwd:e,ignore:D}).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:[...D,`**/__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 ne(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(`
436
- `);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;b.isVerbose=e.verbose,b.doesUploadEnvVars=e.env;let t=!1;try{t=await Qo(e.paths,e.skipDeps)}finally{le()}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 ie(()=>e.promises.readdir(n,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(n,e.name));await Vt([a,...o]);let s=await Ao(a);if(b.isVerbose,!s){console.error(`there is no valid package.json in ${a}`),i=!0;continue}let c=an(s),l=[s,...(await Promise.all(o.map(e=>Ao(e,s)))).filter(e=>!!e)];if(b.isVerbose)for(let e of l)console.info(e);Ko(l),await mr(s),s.isBun&&await Dn(s);let u=!Zt(s.repository)&&(s.repository?.startsWith(`github:WillBooster/`)||s.repository?.startsWith(`github:WillBoosterLab/`));await Promise.all([Ue(s),c.then(()=>ka(s)),hn(s,l),Ln(s),zn(s),Hn(s,l),Un(s),Gn(s),Do(s),Zn(s),Oa(s),Fa(s),Na(s),...u?[Xt(s)]:[],lo(s),mo(s),xo(s),Co(s),ia(s),ma(s)]),await C.promiseAll();let d=[];for(let e of l)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Ut(e,e.isRoot?l:[e])),e.depending.playwrightTest&&d.push(Te(e)),e.depending.next&&d.push(de(e)),await qn(e,s),await C.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)),w(e)?(d.push(va(e)),d.push(ba(e,s))):!e.isRoot&&e.doesContainPackageJson&&w(s)&&d.push(ba(e,s)),e.depending.pyright&&d.push(Da(e)));await Promise.all(d),await C.promiseAll(),await dn(s,l);let f=s.isBun?`bun`:`yarn`;s.isBun?await x.functionIgnoringException(`refreshBunLock`,async()=>{await Promise.resolve(),$o(a)}):U(f,[`install`,`--no-immutable`],a),U(f,[`cleanup`],a),await La(s)}return i}function $o(e){let t=tr(`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();
437
- //# 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/IGBcXG4tIERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWAgOiAnJ31cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIElmIG9uIFxcYG1haW5cXGAsIGNyZWF0ZSBhIG5ldyBicmFuY2g7IG90aGVyd2lzZSB3b3JrIG9uIHRoZSBjdXJyZW50IGJyYW5jaC5cbi0gUnVuIFxcYGdpdFxcYCBjb21tYW5kcyBvbmUgYXQgYSB0aW1lIHRvIGF2b2lkIFxcYGluZGV4LmxvY2tcXGAgY29uZmxpY3RzLlxuLSBXcml0ZSBhIHRlc3Qgb25seSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBvciB3aGVuIGEgYmVoYXZpb3IgaXMgYm90aCBsaWtlbHkgdG8gcmVncmVzcyBBTkQgaGFzIG5vIG90aGVyIGF1dG9tYXRpYyBzYWZlZ3VhcmQgKHR5cGUgY2hlY2tpbmcsIGxpbnRpbmcsIG9yIGFuIGV4aXN0aW5nIHRlc3QvQ0kgY2hlY2sgd291bGQgbm90IGNhdGNoIHRoZSBicmVha2FnZSkuIFNraXAgdGhlIHRlc3Qgd2hlbiBhbiBleGlzdGluZyBzaWduYWwgYWxyZWFkeSBjYXRjaGVzIHRoZSByZWdyZXNzaW9uLCBvciB3aGVuIHlvdSBhcmUgb25seSBjb25maXJtaW5nIGFuIGV4dGVybmFsIGZhY3QgKGEgbGlicmFyeSdzIGJlaGF2aW9yLCB3aGV0aGVyIGEgdmVyc2lvbiBmaXhlcyBhbiBpc3N1ZSnigJR2ZXJpZnkgdGhvc2Ugb25jZSBtYW51YWxseSBpbnN0ZWFkIG9mIGFkZGluZyBhIHBlcm1hbmVudCB0ZXN0LlxuLSBXaGVuIHdyaXRpbmcgdGVzdHMsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBDb250aW51ZSBtb2RpZnlpbmcgdGVzdHMgYW5kL29yIGNvZGUgdW50aWwgYWxsIHRlc3RzIHBhc3MuXG4gIC0gRW5zdXJlIHRlc3RzIGFyZSBpZGVtcG90ZW50IGFuZCBpbmRlcGVuZGVudCAoZS5nLiwgcmVzZXQgcGVyc2lzdGVudCBkYXRhKSBzbyB0aGV5IGNhbiBydW4gcmVwZWF0ZWRseSBvciBpbiBwYXJhbGxlbC5cbiAgLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAtIEF2b2lkIGZpeGVkIHdhaXRzIGluIEUyRSB0ZXN0czsgd2FpdCBmb3IgY29uZGl0aW9ucyBpbnN0ZWFkLlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMgKGluY2x1ZGluZyB0ZXN0IGZhaWx1cmVzKSwgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIHZpYSBkZWJ1ZyBsb2dzIG9yIHNjcmVlbnNob3RzKSBhbmQgZml4IGl0IGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gdmVyaWZ5XFxgICh0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nOyB0YWtlcyB1cCB0byAxMCBtaW51dGVzKSwgb3IgXFxgJHtwYWNrYWdlTWFuYWdlcn0gdmVyaWZ5LWZ1bGxcXGAgKGFsbCB0ZXN0czsgdGFrZXMgdXAgdG8gMSBob3VyKSBpZiB5b3UgY2hhbmdlZCBydW50aW1lIGJlaGF2aW9yIG9yIHRlc3RzLiBGaXggZXJyb3JzIGFuZCByZS1ydW4gdW50aWwgaXQgcGFzc2VzLlxuLSBPbmNlIHZlcmlmaWVkLCBjb21taXQgYW5kIHB1c2ggdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2gsIGFuZCBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAgaWYgbm9uZSBleGlzdHMgZm9yIHRoZSBicmFuY2guXG4gIC0gRm9sbG93IHRoZSBDb252ZW50aW9uYWwgQ29tbWl0cyBmb3JtYXQgKGUuZy4sIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgKS4ke2NvQXV0aG9ySW5zdHJ1Y3Rpb259XG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0czsgYXZvaWQgXFxgLS1hbWVuZFxcYC5cbi0gVXNlIGhlcmVkb2MgZm9yIG11bHRpLWxpbmUgY29tbWFuZCBpbnB1dCAoZS5nLiwgXFxgZ2l0IGNvbW1pdCAtRiAtXFxgLCBcXGBnaCBwciBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCkuXG4tIFB1dCB0ZW1wb3JhcnkgZmlsZXMgaW4gXFxgLnRtcFxcYDsgdXNlIFxcYC90bXBcXGAgb25seSBmb3IgZmlsZXMgdGhhdCBtdXN0IGxpdmUgb3V0c2lkZSB0aGUgcmVwby4ke3JhaWx3YXlJbnN0cnVjdGlvbn0ke3BsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb259XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZpbGUgbmFtZXMgZm9yIEphdmFTY3JpcHQvVHlwZVNjcmlwdCAoUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIG1vZHVsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGggaGlnaCBjb2hlc2lvbiBhbmQgbG93IGNvdXBsaW5nOyBzcGxpdCBsYXJnZSBtb2R1bGVzIHdoZW4gbmVlZGVkLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCAodG9wLWRvd24gb3JkZXIpOyBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgYWJvdmUgdGhlaXIgdXNhZ2UuXG4tIFdyaXRlIGNvbW1lbnRzIGFuZCBKU0RvYyBvbmx5IGZvciBoYXJkLXRvLXVuZGVyc3RhbmQgY29kZTogZXhwbGFpbiBcIndoeVwiIGluIGNvbW1lbnRzIGFuZCBcIndoYXRcIiBpbiBKU0RvYy5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gQnVpbGQgcHJvbXB0cyBhcyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIG9uIGEgcHJlLWNvbXB1dGFibGUgYXJyYXkgb2Ygc3RyaW5ncy5cbi0gQXNzdW1lIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWQ7IGlmIHZhbGlkYXRpb24gaXMgbmVlZGVkLCBcXGBhc3NlcnRcXGAgYXQgc3RhcnR1cCB0byBmYWlsIGZhc3QuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFdoZW4gYWRkaW5nIHN0cmluZyBsaXRlcmFscyBpbiBSZWFjdCBjb21wb25lbnRzLCByZWdpc3RlciB0aGVtIGluIHRoZSBcXGBpMThuXFxgIHJlc291cmNlIGZpbGVzIChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApIGFuZCByZWZlcmVuY2UgdGhlbSB2aWEgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eSAoZS5nLiwgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYCkuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIG92ZXIgXFxgdXNlU3RhdGVcXGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbi0gVXNlIFxcYGF1dG9Gb2N1c1xcYCB3aGVyZSBpdCByZWR1Y2VzIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgXG4tIFRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgc28gXFxgdXNlQ2FsbGJhY2tcXGAgYW5kIFxcYHVzZU1lbW9cXGAgYXJlIHVubmVjZXNzYXJ5IGZvciBwZXJmb3JtYW5jZS5cbi0gQXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS5cbmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyA9IDQzMl8wMDA7XG5cbi8vIFBsYXRmb3JtIHNldHMgbXVzdCBtYXRjaCBlYWNoIHBhY2thZ2UncyBvcHRpb25hbERlcGVuZGVuY2llcyBvbiBucG0gYmVjYXVzZVxuLy8gQnVuIGNoZWNrcyBhbGwgcGxhdGZvcm0gYmluYXJpZXMgaW4gdGhlIGxvY2tmaWxlLCBub3QganVzdCB0aGUgY3VycmVudCBvbmUuXG4vLyBLZWVwIHdpbjMyIGVudHJpZXMgZXZlbiB0aG91Z2ggd2UgZHJvcCBXaW5kb3dzIHN1cHBvcnQ6IG9taXR0aW5nIGFueVxuLy8gcGxhdGZvcm0gbWFrZXMgYGJ1biBhZGRgIGZhaWwgdW50aWwgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93IGVsYXBzZXMuXG5jb25zdCB0eXBlc2NyaXB0UGxhdGZvcm1zID0gW1xuICAnYWl4LXBwYzY0JyxcbiAgJ2Rhcndpbi1hcm02NCcsXG4gICdkYXJ3aW4teDY0JyxcbiAgJ2ZyZWVic2QtYXJtNjQnLFxuICAnZnJlZWJzZC14NjQnLFxuICAnbGludXgtYXJtJyxcbiAgJ2xpbnV4LWFybTY0JyxcbiAgJ2xpbnV4LWxvb25nNjQnLFxuICAnbGludXgtbWlwczY0ZWwnLFxuICAnbGludXgtcHBjNjQnLFxuICAnbGludXgtcmlzY3Y2NCcsXG4gICdsaW51eC1zMzkweCcsXG4gICdsaW51eC14NjQnLFxuICAnbmV0YnNkLWFybTY0JyxcbiAgJ25ldGJzZC14NjQnLFxuICAnb3BlbmJzZC1hcm02NCcsXG4gICdvcGVuYnNkLXg2NCcsXG4gICdzdW5vcy14NjQnLFxuICAnd2luMzItYXJtNjQnLFxuICAnd2luMzIteDY0Jyxcbl07XG5jb25zdCBveGNCaW5kaW5nUGxhdGZvcm1zID0gW1xuICAnYW5kcm9pZC1hcm0tZWFiaScsXG4gICdhbmRyb2lkLWFybTY0JyxcbiAgJ2Rhcndpbi1hcm02NCcsXG4gICdkYXJ3aW4teDY0JyxcbiAgJ2ZyZWVic2QteDY0JyxcbiAgJ2xpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnbGludXgtYXJtNjQtZ251JyxcbiAgJ2xpbnV4LWFybTY0LW11c2wnLFxuICAnbGludXgtcHBjNjQtZ251JyxcbiAgJ2xpbnV4LXJpc2N2NjQtZ251JyxcbiAgJ2xpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdsaW51eC1zMzkweC1nbnUnLFxuICAnbGludXgteDY0LWdudScsXG4gICdsaW51eC14NjQtbXVzbCcsXG4gICdvcGVuaGFybW9ueS1hcm02NCcsXG4gICd3aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ3dpbjMyLWlhMzItbXN2YycsXG4gICd3aW4zMi14NjQtbXN2YycsXG5dO1xuY29uc3QgdHNnb2xpbnRQbGF0Zm9ybXMgPSBbJ2Rhcndpbi1hcm02NCcsICdkYXJ3aW4teDY0JywgJ2xpbnV4LWFybTY0JywgJ2xpbnV4LXg2NCcsICd3aW4zMi1hcm02NCcsICd3aW4zMi14NjQnXTtcbmNvbnN0IG5leHRSc3BhY2tQbGF0Zm9ybXMgPSBbXG4gICdhbmRyb2lkLWFybS1lYWJpJyxcbiAgJ2FuZHJvaWQtYXJtNjQnLFxuICAnZGFyd2luLWFybTY0JyxcbiAgJ2Rhcndpbi14NjQnLFxuICAnbGludXgtYXJtLWdudWVhYmloZicsXG4gICdsaW51eC1hcm02NC1nbnUnLFxuICAnbGludXgtYXJtNjQtbXVzbCcsXG4gICdsaW51eC14NjQtZ251JyxcbiAgJ2xpbnV4LXg2NC1tdXNsJyxcbiAgJ3dpbjMyLWFybTY0LW1zdmMnLFxuICAnd2luMzItaWEzMi1tc3ZjJyxcbiAgJ3dpbjMyLXg2NC1tc3ZjJyxcbl07XG5jb25zdCBuZXh0U3djUGxhdGZvcm1zID0gW1xuICAnYW5kcm9pZC1hcm0tZWFiaScsXG4gICdhbmRyb2lkLWFybTY0JyxcbiAgJ2Rhcndpbi1hcm02NCcsXG4gICdkYXJ3aW4teDY0JyxcbiAgJ2ZyZWVic2QteDY0JyxcbiAgJ2xpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnbGludXgtYXJtNjQtZ251JyxcbiAgJ2xpbnV4LWFybTY0LW11c2wnLFxuICAnbGludXgteDY0LWdudScsXG4gICdsaW51eC14NjQtbXVzbCcsXG4gICd3YXNtLW5vZGVqcycsXG4gICd3YXNtLXdlYicsXG4gICd3aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ3dpbjMyLWlhMzItbXN2YycsXG4gICd3aW4zMi14NjQtbXN2YycsXG5dO1xuXG5leHBvcnQgY29uc3QgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAnQHdpbGxib29zdGVyLXByaXZhdGUvYWdlbnRpYy13b3JrZmxvd3MnLFxuICAnQHdpbGxib29zdGVyL2FnZW50LXNraWxscycsXG4gICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLWxvYWRlcicsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICdhdC1kZWNvcmF0b3JzJyxcbiAgJ2J1aWxkLXRzJyxcbiAgJ2dlbi1pMThuLXRzJyxcbiAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gIC8vIHdiZnkgcGlucyB0aGVzZSB0b29saW5nIHBhY2thZ2VzIGFuZCBtYXkgYXBwbHkgdGhlbSBpbW1lZGlhdGVseSBhZnRlciBhXG4gIC8vIHJlbGVhc2UsIGJlZm9yZSB0aGUgZ2xvYmFsIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93IGhhcyBlbGFwc2VkLlxuICAndHlwZXNjcmlwdCcsXG4gIC4uLnR5cGVzY3JpcHRQbGF0Zm9ybXMubWFwKChwbGF0Zm9ybSkgPT4gYEB0eXBlc2NyaXB0L3R5cGVzY3JpcHQtJHtwbGF0Zm9ybX1gKSxcbiAgLy8gQnVuIGl0c2VsZiByZWxlYXNlcyBpdHMgZmlyc3QtcGFydHkgdHlwZSBwYWNrYWdlcyBpbiBsb2Nrc3RlcCB3aXRoIHRoZVxuICAvLyBydW50aW1lLCBzbyBnZW5lcmF0ZWQgQnVuIHJlcG9zIG11c3QgYmUgYWJsZSB0byBpbnN0YWxsIHRoZW0gaW1tZWRpYXRlbHkuXG4gICdAdHlwZXMvYnVuJyxcbiAgJ2J1bi10eXBlcycsXG4gICdveGZtdCcsXG4gIC4uLm94Y0JpbmRpbmdQbGF0Zm9ybXMubWFwKChwbGF0Zm9ybSkgPT4gYEBveGZtdC9iaW5kaW5nLSR7cGxhdGZvcm19YCksXG4gICdveGxpbnQnLFxuICAuLi5veGNCaW5kaW5nUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAb3hsaW50L2JpbmRpbmctJHtwbGF0Zm9ybX1gKSxcbiAgJ294bGludC10c2dvbGludCcsXG4gIC4uLnRzZ29saW50UGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAb3hsaW50LXRzZ29saW50LyR7cGxhdGZvcm19YCksXG4gICdAbmV4dC9lbnYnLFxuICAnQG5leHQvZm9udCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZycsXG4gIC4uLm5leHRSc3BhY2tQbGF0Zm9ybXMubWFwKChwbGF0Zm9ybSkgPT4gYEBuZXh0L3JzcGFjay1iaW5kaW5nLSR7cGxhdGZvcm19YCksXG4gIC4uLm5leHRTd2NQbGF0Zm9ybXMubWFwKChwbGF0Zm9ybSkgPT4gYEBuZXh0L3N3Yy0ke3BsYXRmb3JtfWApLFxuICAnQG5leHQvdGhpcmQtcGFydGllcycsXG4gICduZXh0JyxcbiAgJ3JlYWN0JyxcbiAgJ3JlYWN0LWRvbScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IG5ld0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgLy8gTm8gYFtydW5dIGJ1biA9IHRydWVgOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrc1xuICAvLyB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KTsgYW55IGV4aXN0aW5nIHNldHRpbmcgaXMgZHJvcHBlZC5cbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGV4aXN0aW5nQ29udGVudCl9W2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9ICR7YnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzfSAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiR7YnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5tYXAoKHBhY2thZ2VOYW1lKSA9PiBgICAgIFwiJHtwYWNrYWdlTmFtZX1cIixgKS5qb2luKCdcXG4nKX1cbl1cbmA7XG59O1xuXG4vKipcbiAqIFByZXNlcnZlIHRoZSBwcm9qZWN0J3MgYFt0ZXN0XWAgc2VjdGlvbnMgKGUuZy4gcHJlbG9hZCBzY3JpcHRzIHN3YXBwaW5nIGEgQ2xvdWRmbGFyZSBEMSBjbGllbnRcbiAqIGZvciBhIGxvY2FsIFNRTGl0ZSBvbmUpIHZlcmJhdGltLCBjb21tZW50cyBpbmNsdWRlZDsgd2JmeSBtYW5hZ2VzIG9ubHkgdGhlIG90aGVyIHNlY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFJhd1Rlc3RTZWN0aW9ucyhjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIWNvbnRlbnQpIHJldHVybiAnJztcblxuICBjb25zdCBwcmVzZXJ2ZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGluVGVzdFNlY3Rpb24gPSBmYWxzZTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3Qgc2VjdGlvbk1hdGNoID0gL15cXHMqXFxbKFteXFxdXSspXFxdLy5leGVjKGxpbmUpO1xuICAgIGlmIChzZWN0aW9uTWF0Y2gpIHtcbiAgICAgIGluVGVzdFNlY3Rpb24gPSBzZWN0aW9uTWF0Y2hbMV0gPT09ICd0ZXN0JyB8fCAoc2VjdGlvbk1hdGNoWzFdIGFzIHN0cmluZykuc3RhcnRzV2l0aCgndGVzdC4nKTtcbiAgICB9XG4gICAgaWYgKGluVGVzdFNlY3Rpb24gJiYgbGluZS50cmltKCkpIHtcbiAgICAgIHByZXNlcnZlZExpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcmVzZXJ2ZWRMaW5lcy5sZW5ndGggPiAwID8gYCR7cHJlc2VydmVkTGluZXMuam9pbignXFxuJyl9XFxuXFxuYCA6ICcnO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1RvbWwoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29udGVudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2UoY29udGVudCkgYXMgQnVuZmlnVG9tbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+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/ICcwLjAuMCcpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMsIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcbmltcG9ydCB7IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMsIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyB9IGZyb20gJy4vYnVuZmlnLmpzJztcbmltcG9ydCB7IHlhcm5OcG1NaW5pbWFsQWdlR2F0ZSwgeWFybk5wbVByZWFwcHJvdmVkUGFja2FnZXMgfSBmcm9tICcuL3lhcm5yYy5qcyc7XG5cbmNvbnN0IG94bGludERlcHMgPSBbJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLCAnb3hmbXQnLCAnb3hsaW50JywgJ294bGludC10c2dvbGludCddO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG4vLyBUeXBlU2NyaXB0IDcncyBgdHlwZXNjcmlwdGAgcGFja2FnZSBpcyB0aGUgdHNnbyBuYXRpdmUgY29tcGlsZXIgYW5kIGV4cG9zZXMgbm9cbi8vIHByb2dyYW1tYXRpYyBBUEkuIE5leHQuanMncyBidWlsZC10aW1lIGB2ZXJpZnlUeXBlU2NyaXB0U2V0dXBgIG5lZWRzIHRoYXQgQVBJLCBzb1xuLy8gYG5leHQgYnVpbGRgIGZhaWxzIChcInRyeWluZyB0byB1c2UgVHlwZVNjcmlwdCBidXQgZG8gbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBhY2thZ2UocylcIilcbi8vIHdpdGggb25seSBgdHlwZXNjcmlwdGAgdjcgaW5zdGFsbGVkLiBOZXh0LmpzIHJlc29sdmVzIHRoZSB0c2dvIGJpbmFyeSB0aHJvdWdoIHRoZVxuLy8gc2VwYXJhdGUgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCBwYWNrYWdlLCBzbyBOZXh0LmpzLWZhbWlseSByZXBvcyBtdXN0IGluc3RhbGxcbi8vIGJvdGg7IG90aGVyIHJlcG9zIG9ubHkgbmVlZCBgdHlwZXNjcmlwdGAgZm9yIGB0c2NgIHR5cGVjaGVja3MuXG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3QgbGVmdGhvb2tEZXBlbmRlbmN5ID0gJ2xlZnRob29rJztcbmNvbnN0IGRlZmF1bHRHZW5JMThuVHNTY3JpcHQgPSAnZ2VuLWkxOG4tdHMgLWkgaTE4biAtbyBzcmMvX19nZW5lcmF0ZWRfXy9pMThuLnRzIC1kIGphLUpQJztcbmNvbnN0IG1hbmFnZWREZXBlbmRlbmN5TmFtZXMgPSBuZXcgU2V0KFtcbiAgd2JEZXBlbmRlbmN5LFxuICBidWlsZFRzRGVwZW5kZW5jeSxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0RGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSxcbiAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgLi4ub3hsaW50RGVwcyxcbl0pO1xuY29uc3Qgd2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyA9IFtcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAuLi5veGxpbnREZXBzLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpLFxuXTtcbmNvbnN0IG9ic29sZXRlTGludERlcGVuZGVuY2llcyA9IFtcbiAgJ0BiaW9tZWpzL2Jpb21lJyxcbiAgJ0Blc2xpbnQtcmVhY3QvZXNsaW50LXBsdWdpbicsXG4gICdAZXNsaW50L2pzJyxcbiAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICdAdHlwZXMvZXNsaW50JyxcbiAgJ0B0eXBlcy9taWNyb21hdGNoJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLFxuICAnYmlvbWUnLFxuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgJ2VzbGludC1wbHVnaW4tcGVyZmVjdGlvbmlzdCcsXG4gICdlc2xpbnQtcGx1Z2luLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QnLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1jb21waWxlcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tc3Rvcnlib29rJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuICAnbWljcm9tYXRjaCcsXG4gICd0eXBlc2NyaXB0LWVzbGludCcsXG5dO1xuY29uc3QgbWljcm9tYXRjaFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWydtaWNyb21hdGNoJywgJ0B0eXBlcy9taWNyb21hdGNoJ10pO1xuY29uc3QgbWljcm9tYXRjaEltcG9ydFBhdHRlcm4gPVxuICAvXFxiZnJvbVxccytbJ1wiXW1pY3JvbWF0Y2hbJ1wiXXxcXGJyZXF1aXJlXFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKXxcXGJpbXBvcnRcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpL3U7XG5cbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgbnBtUGFja2FnZVRpbWVzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgdXBkYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKGNvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMsIHNraXBBZGRpbmdEZXBzKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGdlbmVyYXRlZFxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcywgcGFja2FnZU1hbmFnZXIpO1xuICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZmlsZVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoanNvbk9iai5zY3JpcHRzKTtcblxuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzdGFydC10ZXN0LXNlcnZlciddO1xuXG4gIGNvbnN0IHNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHM7XG4gIGlmIChjb25maWcuaXNCdW4gfHwgIWRvZXNDb250YWluSmF2YShjb25maWcpKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0cy5wcmV0dGlmeSA9IChzY3JpcHRzLnByZXR0aWZ5ID8/ICcnKSArIChhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKSk7XG4gIH1cbiAgbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHMpO1xuICBub3JtYWxpemVSYWlsd2F5Q2xpU2NyaXB0KGNvbmZpZywgc2NyaXB0cyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEZyZXNoIHJlcG9zIHN0aWxsIHJlcXVpcmUgc3RhbmRhbG9uZSBgeWFybiBpbnN0YWxsYDsgb25seSByZW1vdmUgbGVnYWN5IGluc3RhbGwgcHJlZml4ZXMgYmVmb3JlIGFub3RoZXIgY29tbWFuZC5cbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgveWFyblxccyooPzppbnN0YWxsXFxzKik/JiZcXHMqL2d1LCAnJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgaWYgKHNjcmlwdHNbJ2dlbi1jb2RlJ10pIHtcbiAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID0gJ3diIGdlbi1jb2RlJztcbiAgfSBlbHNlIGlmIChzY3JpcHRzLnBvc3RpbnN0YWxsPy5pbmNsdWRlcygnZ2VuLWkxOG4tdHMnKSkge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnBvc3RpbnN0YWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbChcbiAgICAgIC95YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCg/IVxccysoPzotQXwtUnwtLSg/OmFsbHxyZWN1cnNpdmV8c2luY2V8d29ya3RyZWV8ZnJvbXxpbmNsdWRlfGV4Y2x1ZGV8cHVibGljfHByaXZhdGUpKSkvZ3UsXG4gICAgICAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSYWlsd2F5Q2xpU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBpZiAoY29uZmlnLmlzQnVuIHx8ICFzY3JpcHRzLnJhaWx3YXk/LmluY2x1ZGVzKCdAcmFpbHdheS9jbGknKSkgcmV0dXJuO1xuXG4gIHNjcmlwdHMucmFpbHdheSA9ICdZQVJOX0VOQUJMRV9TQ1JJUFRTPXRydWUgeWFybiBkbHggQHJhaWx3YXkvY2xpJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9IGVsc2Uge1xuICAgIHJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzKGpzb25PYmopO1xuICB9XG5cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICBkZWxldGUgKGpzb25PYmogYXMgUGFja2FnZUpzb24gJiB7ICdsaW50LXN0YWdlZCc/OiB1bmtub3duIH0pWydsaW50LXN0YWdlZCddO1xuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmh1c2t5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHB1Ymxpc2g7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwdWJsaXNoT25seTtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXBhY2s7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjaztcbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGxlZnRob29rRGVwZW5kZW5jeSk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2UoanNvbk9iai5zY3JpcHRzLnJlbGVhc2UpKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFJ1bnRpbWUpIHtcbiAgICAgICAgLy8gUnVudGltZSBpbXBvcnRzIG5lZWQgdGhlIHN0YW5kYWxvbmUgcGFja2FnZSBhZnRlciBEb2NrZXIgcHJ1bmluZyByZW1vdmVzIGRldkRlcGVuZGVuY2llcy5cbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodCA/Pz1cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/XG4gICAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSA/P1xuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdwbGF5d3JpZ2h0Jyk7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpeGVycy9uZXh0Q29uZmlnLnRzIGVuYWJsZXMgYHJlYWN0Q29tcGlsZXI6IHRydWVgIGZvciBldmVyeSBOZXh0LmpzIHByb2plY3QsIGFuZCBOZXh0LmpzXG4gIC8vIHJlc29sdmVzIGBiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXJgIGF0IGJ1aWxkIHRpbWUgd2hlbiBSZWFjdCBDb21waWxlciBpcyBvbi4gQWRkIGl0IGhlcmUgc29cbiAgLy8gdGhlIG1hbmFnZWQgbmV4dC5jb25maWcgbmV2ZXIgYnJlYWtzIGBuZXh0IGJ1aWxkYCB3aXRoIGFuIHVucmVzb2x2ZWQtcGFja2FnZSBlcnJvci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXInKTtcbiAgfVxuXG4gIGlmICghaXNXYlBhY2thZ2UoanNvbk9iaikpIHtcbiAgICBpZiAoc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgaWYgKHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBjb25zdCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykgOiBbXTtcbiAgYXdhaXQgcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaiwgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4udHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSwgc28gaXQgaXNcbiAgICAvLyBub3cgdGhlIG1hbmFnZWQgY29tcGlsZXIgZm9yIGV2ZXJ5IFR5cGVTY3JpcHQgcmVwbyAodHlwZWNoZWNraW5nIHJ1bnMgYHRzY2ApLlxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHREZXBlbmRlbmN5KTtcbiAgICAvLyBOZXh0LmpzJ3MgYG5leHQgYnVpbGRgIGluc3BlY3RzIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHRvIHJ1biBpdHMgdHlwZVxuICAgIC8vIGNoZWNrOyB0aGUgYHR5cGVzY3JpcHRgIHY3IHBhY2thZ2UgYWxvbmUgbGFja3MgdGhlIEFQSSBuZXh0IG5lZWRzLCBzbyBrZWVwIGJvdGhcbiAgICAvLyBpbnN0YWxsZWQgZm9yIE5leHQuanMtZmFtaWx5IHJlcG9zLiBTZWUgdGhlIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgY29tbWVudCBhYm92ZS5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvbm9kZScpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1sndHMtamVzdCddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICAgKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2plc3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcGVuZGVuY2llczogZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBweXRob25EZXZEZXBlbmRlbmNpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBweXRob25EZXZEZXBlbmRlbmNpZXMgfTtcbn1cblxuZnVuY3Rpb24gZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9cXGIoPzpidW54fG5weHxwbnBtXFxzK2RseHx5YXJuXFxzK2RseClcXHMrc2VtYW50aWMtcmVsZWFzZSg/OkBcXFMrKT9cXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbZGVwZW5kZW5jeSwga2VlcEFzUnVudGltZV0gb2YgW1xuICAgIFt3YkRlcGVuZGVuY3ksIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICAgIFtidWlsZFRzRGVwZW5kZW5jeSwgc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgXSBhcyBjb25zdCkge1xuICAgIGlmIChrZWVwQXNSdW50aW1lKSB7XG4gICAgICBjb25zdCBkZXZWZXJzaW9uID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWRldlZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb24gPSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghcnVudGltZVZlcnNpb24gfHwgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGRldlZlcnNpb24sIHJ1bnRpbWVWZXJzaW9uKSkge1xuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGRldlZlcnNpb247XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfSBlbHNlIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkge1xuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPz89IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBvc3RpbnN0YWxsU2NyaXB0ID0ganNvbk9iai5zY3JpcHRzPy5wb3N0aW5zdGFsbDtcbiAgcmV0dXJuIHR5cGVvZiBwb3N0aW5zdGFsbFNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiXFxiL3UudGVzdChwb3N0aW5zdGFsbFNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmlzbWEgPSBqc29uT2JqLnByaXNtYSBhcyB7IHNlZWQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHByaXNtYT8uc2VlZCkgfHwgZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhqc29uT2JqLnNjcmlwdHM/LnNlZWQpO1xufVxuXG5mdW5jdGlvbiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHNlZWRDb21tYW5kOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gRG9ja2VyIGltYWdlcyBydW4gc2VlZCBzY3JpcHRzIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLFxuICAvLyBzbyBUeXBlU2NyaXB0IHNlZWQgcnVubmVycyBtdXN0IHJlbWFpbiBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAgcmV0dXJuIHR5cGVvZiBzZWVkQ29tbWFuZCA9PT0gJ3N0cmluZycgJiYgLyg/PCFbXFx3LV0pYnVpbGQtdHMoPyFbXFx3LV0pL3UudGVzdChzZWVkQ29tbWFuZCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIFlhcm4gdHJlYXRzIHRoZSBsZWdhY3kgbnBtL2NoYWxrIHJlc29sdXRpb24gYWxpYXMgYXMgYW4gaW52YWxpZCBwYWNrYWdlIHRva2VuLlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0ganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID8/ICd5YXJuIGxpbnQgLS1maXgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NyaXB0UnVubmVyID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGAke3NjcmlwdFJ1bm5lcn0gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzZXR1cC1wb2V0cnktYXNkZiddO1xuICAgICAganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWBdID0gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHB5dGhvblBhY2thZ2VNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcHl0aG9uUnVubmVyID0gYCR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9IHJ1bmA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYCR7cHl0aG9uUnVubmVyfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgJHtweXRob25SdW5uZXJ9IGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gYCR7c2NyaXB0UnVubmVyfSBsaW50YDtcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgaWYgKGdlbkNvZGVTY3JpcHQ/LmluY2x1ZGVzKCdObyBjb2RlIGdlbmVyYXRpb24gbmVlZGVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddO1xuICB9IGVsc2UgaWYgKHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZywgZ2VuQ29kZVNjcmlwdCkpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBgJHtjb25maWcuaXNCdW4gPyAnYnVuICcgOiAnJ313YiBnZW4tY29kZWA7XG4gIH1cbiAgbm9ybWFsaXplR2VuSTE4blRzU2NyaXB0KGNvbmZpZywganNvbk9iaik7XG4gIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KGpzb25PYmouc2NyaXB0cyk7XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZEdlbkNvZGVTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHxcbiAgICBjb25maWcuZGVwZW5kaW5nLmNoYWtyYSB8fFxuICAgIGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8XG4gICAgY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHxcbiAgICAoY29uZmlnLmRlcGVuZGluZy5kcml6emxlICYmICEhb2xkR2VuQ29kZVNjcmlwdD8uaW5jbHVkZXMoJ2RyaXp6bGUta2l0IGNoZWNrJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGZvcm1hdFNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcHJvamVjdHMgbWF5IG5vdCBoYXZlIGEgWWFybiBsb2NrZmlsZSwgc28gZ2VuZXJhdGVkIHBhY2thZ2Ugc2NyaXB0c1xuICAvLyBtdXN0IGludm9rZSBsb2NhbCBwYWNrYWdlIHNjcmlwdHMgdGhyb3VnaCB0aGUgcmVwb3NpdG9yeSdzIHBhY2thZ2UgbWFuYWdlci5cbiAgY29uc3Qgc2NyaXB0UnVubmVyID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gZm9ybWF0U2NyaXB0ID8gYCR7Zm9ybWF0U2NyaXB0fSAmJiAke3NjcmlwdFJ1bm5lcn0gZm9ybWF0LWNvZGVgIDogYCR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWA7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUdlbkkxOG5Uc1NjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRNYW5hZ2VHZW5JMThuVHMoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGlmIChqc29uT2JqLnNjcmlwdHNbJ2dlbi1pMThuLXRzJ10gPT09IGRlZmF1bHRHZW5JMThuVHNTY3JpcHQpIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydnZW4taTE4bi10cyddO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbmZpZ01qc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcubWpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdNanNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmoudHlwZSA9ICdtb2R1bGUnO1xuXG4gIGNvbnN0IGNvbmZpZ0R0c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC50cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRHRzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLmZpbGVzID0gWy4uLm5ldyBTZXQoWy4uLihqc29uT2JqLmZpbGVzID8/IFtdKSwgJ2NvbmZpZy5kLm10cyddKV07XG4gIC8vIE5vZGVOZXh0IHJlc29sdmVzIGEgcmVsYXRpdmUgYC4vY29uZmlnLm1qc2AgaW1wb3J0IHRvIGBjb25maWcuZC5tdHNgLCBub3RcbiAgLy8gdGhlIHBhY2thZ2UtbGV2ZWwgYHR5cGVzYCBmaWVsZC4gS2VlcCB0aGUgcHVibGlzaGVkIGNvbmZpZyBpbXBvcnRhYmxlIGZyb21cbiAgLy8gcGFja2FnZS1sb2NhbCBUeXBlU2NyaXB0IGxpbnRlciBzZXR0aW5ncy5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQubXRzJyksIGNvbmZpZ0RtdHNDb250ZW50KSk7XG59XG5cbmNvbnN0IGNvbmZpZ0RtdHNDb250ZW50ID0gYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5gO1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICBjb25zdCBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nXG4pOiB2b2lkIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBkZXBlbmRlbmNpZXMsIGZhbHNlKTtcblxuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgcmV0dXJuICdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZSAmJiBwb2V0cnkgZW52IHVzZSAkKG1pc2UgY3VycmVudCBweXRob24pICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nLFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnLCBkZXBlbmRlbmN5KSkpLFxuICBdO1xuICBzcGF3blN5bmMoXG4gICAgcGFja2FnZU1hbmFnZXIsXG4gICAgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAuLi4oY29uZmlnLmlzQnVuID8gWyctLWV4YWN0J10gOiBbXSksIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSxcbiAgICBjb25maWcuZGlyUGF0aFxuICApO1xufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGNvbmZpZyxcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoIXNraXBBZGRpbmdEZXBzKSBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICBpZiAobGF0ZXN0VmVyc2lvbiA9PT0gJyonICYmIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSBjb250aW51ZTtcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGxhdGVzdFZlcnNpb247XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY2llc1RvSW5zdGFsbDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICBpZiAoIXJlbGF0aXZlRmlsZVBhdGgpIHJldHVybjtcblxuICAvLyBSZXVzZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBvd24gZm9ybWF0dGVyIGFmdGVyIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uIHNvXG4gIC8vIHBhY2thZ2UuanNvbiBtYXRjaGVzIHdoYXRldmVyIGl0cyBjdXJyZW50IHNvcnQtcGFja2FnZS1qc29uIHZlcnNpb24gZXhwZWN0cy5cbiAgLy8gVGhpcyBhdm9pZHMgZm9sbG93LXVwIGF1dG9maXggY29tbWl0cyBjYXVzZWQgb25seSBieSBmb3JtYXR0ZXIgdmVyc2lvbiBkcmlmdFxuICAvLyBiZXR3ZWVuIHdiZnkgYW5kIHRoZSBwcm9qZWN0IGJlaW5nIHVwZGF0ZWQuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ2J1bicpIHtcbiAgICBzcGF3blN5bmMoJ2J1bngnLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICByZW1vdmVTZWxmRGVwZW5kZW5jeShjb25maWcsIGpzb25PYmopO1xuICByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWcsIGpzb25PYmopO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsLWZvci1haSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy50c2xpYjtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIC8vIERyb3AgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgaGVyZSBzbyBub24tTmV4dC5qcyByZXBvcyBuZXZlciBjYXJyeSBpdDtcbiAgLy8gdGhpcyBydW5zIGJlZm9yZSBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIHJlLWFkZHMgaXQgZm9yIE5leHQuanMtZmFtaWx5XG4gIC8vIHJlcG9zIHRoYXQgbmVlZCBpdCBhbG9uZ3NpZGUgdGhlIGB0eXBlc2NyaXB0YCB2NyBwYWNrYWdlIGZvciBgbmV4dCBidWlsZGAuXG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICAvLyBOb24tVHlwZVNjcmlwdCByZXBvcyBzaG91bGQgbm90IGtlZXAgYSBzdHJheSBgdHlwZXNjcmlwdGAgcGFja2FnZS5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUtd2l0aC10ZXN0cyddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbGVybmEuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICByZW1vdmVXaWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIHJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyhqc29uT2JqLCBjb25maWcpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTZWxmRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGpzb25PYmoubmFtZSB8fCBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcblxuICAvLyBBIHBhY2thZ2UgY2FuIGltcG9ydCBpdHNlbGYgdGhyb3VnaCBOb2RlJ3MgcGFja2FnZSBzZWxmLXJlZmVyZW5jZSB3aXRob3V0XG4gIC8vIGRlY2xhcmluZyBpdHNlbGY7IGtlZXBpbmcgdGhhdCBlZGdlIGJyZWFrcyBtb25vcmVwbyByZWxlYXNlIHRvcG9sb2dpY2FsIHNvcnRpbmcuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbikpIGNvbnRpbnVlO1xuICAgICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgdGhlc2UgcGFja2FnZXMgaW5kZXBlbmRlbnRseSwgc28gZ2VuZXJhdGVkXG4gICAgICAvLyBwYWNrYWdlIG1ldGFkYXRhIG11c3QgZGVzY3JpYmUgbnBtIHJlbGVhc2UgZWRnZXMgaW5zdGVhZCBvZiBsb2NhbFxuICAgICAgLy8gd29ya3NwYWNlIGVkZ2VzIHRoYXQgcmVsZWFzZSB0b29saW5nIHRyZWF0cyBhcyBtb25vcmVwbyBncmFwaCBsaW5rcy5cbiAgICAgIC8vIFRoZSBmaW5hbCBgeWFybiBpbnN0YWxsIC0tbm8taW1tdXRhYmxlYCBzeW5jcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgdGhpc1xuICAgICAgLy8gbWlncmF0aW9uLCBldmVuIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgbm90IHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgbGlzdC5cbiAgICAgIHNlY3Rpb25bZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVXaWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm47XG5cbiAgY29uc3Qgc2VjdGlvbnMgPSBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB3aWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKSB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBvd25zIHRoZXNlIGNvbmZpZyBwYWNrYWdlcy4gUGFja2FnZS1sb2NhbCBmb3JtYXR0ZXJcbiAgICAvLyBhbmQgbGludGVyIGNvbmZpZyBmaWxlcyBhcmUgcmVwbyB0b29saW5nLCBub3QgcHVibGlzaGVkIHBhY2thZ2UgZGF0YSwgc29cbiAgICAvLyB0aGUgcGFja2FnZSBtZXRhZGF0YSBvbmx5IG5lZWRzIHRoZSBmb3JtYXR0ZXIvbGludGVyIGV4ZWN1dGFibGVzLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHVzZWREZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlZERlcGVuZGVuY3lTZXQgPSBuZXcgU2V0KHVzZWREZXBlbmRlbmNpZXMpO1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGF3YWl0IGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHVzZWREZXBlbmRlbmN5U2V0LmhhcyhkZXBlbmRlbmN5KSB8fCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBiYXNlLWNvbmZpZyBwYWNrYWdlcy4gUmVtb3ZlIHN0YWxlIHZhcmlhbnRzIHdoZW4gcmVwb1xuICAgIC8vIGNhcGFiaWxpdGllcyBjaGFuZ2UsIHN1Y2ggYXMgTmV4dC5qcyB0YWtpbmcgb3duZXJzaGlwIG9mIHRzY29uZmlnLmpzb24uXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90c2NvbmZpZyouanNvbicsIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgY29uc3QgYWJzb2x1dGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIC8vIFR5cGVTY3JpcHQgNydzIG5hdGl2ZSBjb21waWxlciBkcm9wcGVkIHRoZSBpbi1wcm9jZXNzIGBwYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uYFxuICAgIC8vIGhlbHBlciwgc28gcGFyc2UgdGhlIHRzY29uZmlnIGludG8gYW4gQVNUIGFuZCByZWFkIGl0cyB0b3AtbGV2ZWwgYGV4dGVuZHNgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHNvdXJjZSA9IHBhcnNlU291cmNlRmlsZShhYnNvbHV0ZUZpbGVQYXRoKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgY29uc29sZS53YXJuKGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQuYCk7XG4gICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZSkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gZGVwZW5kZW5jeSB8fCB2YWx1ZS5zdGFydHNXaXRoKGAke2RlcGVuZGVuY3l9L2ApKSB7XG4gICAgICAgICAgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzO1xufVxuXG4vKiogUmVhZHMgdGhlIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZW50cmllcyAoYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncykgZnJvbSBhIHBhcnNlZCB0c2NvbmZpZy4gKi9cbmZ1bmN0aW9uIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlKSkge1xuICAgIGlmIChhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpICYmIGFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkgJiYgcHJvcGVydHkubmFtZS50ZXh0ID09PSAnZXh0ZW5kcycpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKHByb3BlcnR5LmluaXRpYWxpemVyLCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiByZWFkb25seSBhc3QuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlW10ge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzb3VyY2Uuc3RhdGVtZW50cykge1xuICAgIGlmIChhc3QuaXNFeHByZXNzaW9uU3RhdGVtZW50KHN0YXRlbWVudCkgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24pKSB7XG4gICAgICByZXR1cm4gc3RhdGVtZW50LmV4cHJlc3Npb24ucHJvcGVydGllcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhub2RlOiBhc3QuRXhwcmVzc2lvbiwgdmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBpZiAoYXN0LmlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgIHZhbHVlcy5wdXNoKG5vZGUudGV4dCk7XG4gIH0gZWxzZSBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihub2RlKSkge1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBub2RlLmVsZW1lbnRzKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhlbGVtZW50LCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+W10ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBqc29uT2JqW2tleV0pXG4gICAgLmZpbHRlcigoc2VjdGlvbik6IHNlY3Rpb24gaXMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiAhIXNlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybid9OiR7ZGVwZW5kZW5jeX1gO1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoY2FjaGVLZXkpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShjb25maWcsIGRlcGVuZGVuY3kpO1xuICBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLnNldChjYWNoZUtleSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyB3YmZ5LW1hbmFnZWQgdG9vbGluZyAocHJlYXBwcm92ZWQgcGFja2FnZXMpIGFkb3B0cyB0aGUgbGF0ZXN0IHJlbGVhc2UgaW1tZWRpYXRlbHksXG4gIC8vIGJ5cGFzc2luZyB0aGUgbWluaW11bS1yZWxlYXNlLWFnZSBnYXRlIGFwcGxpZWQgdG8gdW5yZXZpZXdlZCBkZXBlbmRlbmNpZXMuXG4gIGlmICghc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShjb25maWcsIGRlcGVuZGVuY3kpKSB7XG4gICAgcmV0dXJuIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3ksIGdldFBhY2thZ2VBZ2VHYXRlTXMoY29uZmlnKSk7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nLCBwYWNrYWdlQWdlR2F0ZU1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCB0aW1lcyA9IGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5KTtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgaWYgKGxhdGVzdFZlcnNpb24gIT09ICcqJyAmJiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUodGltZXNbbGF0ZXN0VmVyc2lvbl0sIHBhY2thZ2VBZ2VHYXRlTXMpKSB7XG4gICAgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCB2ZXJzaW9ucyA9IE9iamVjdC5lbnRyaWVzKHRpbWVzKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gc2VtdmVyLnZhbGlkKHZlcnNpb24pKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gKHNlbXZlci5wcmVyZWxlYXNlKHZlcnNpb24pPy5sZW5ndGggPz8gMCkgPT09IDApXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkpKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gbm93IC0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkgPj0gcGFja2FnZUFnZUdhdGVNcylcbiAgICAudG9Tb3J0ZWQoKFt2ZXJzaW9uQV0sIFt2ZXJzaW9uQl0pID0+IHNlbXZlci5yY29tcGFyZSh2ZXJzaW9uQSwgdmVyc2lvbkIpKTtcblxuICByZXR1cm4gdmVyc2lvbnNbMF0/LlswXSA/PyAnKic7XG59XG5cbmZ1bmN0aW9uIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZShwdWJsaXNoZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkLCBwYWNrYWdlQWdlR2F0ZU1zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaXNoZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwdWJsaXNoZWRUaW1lID0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHVibGlzaGVkVGltZSkgJiYgRGF0ZS5ub3coKSAtIHB1Ymxpc2hlZFRpbWUgPj0gcGFja2FnZUFnZUdhdGVNcztcbn1cblxuZnVuY3Rpb24gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3k6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGRlcGVuZGVuY3kucmVwbGFjZSgvQFteQC9dKyQvdSwgJycpO1xuICBjb25zdCBjYWNoZWRUaW1lcyA9IG5wbVBhY2thZ2VUaW1lc0NhY2hlLmdldChwYWNrYWdlTmFtZSk7XG4gIGlmIChjYWNoZWRUaW1lcykgcmV0dXJuIGNhY2hlZFRpbWVzO1xuXG4gIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnbnBtJyxcbiAgICBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3RpbWUnLCAnLS1qc29uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLFxuICAgIHByb2Nlc3MuY3dkKClcbiAgKTtcbiAgaWYgKCFzdGRvdXQpIHJldHVybiB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIG5wbVBhY2thZ2VUaW1lc0NhY2hlLnNldChwYWNrYWdlTmFtZSwgcGFyc2VkKTtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShjb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwcmVhcHByb3ZlZFBhY2thZ2VzID0gY29uZmlnLmlzQnVuID8gYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA6IHlhcm5OcG1QcmVhcHByb3ZlZFBhY2thZ2VzO1xuICByZXR1cm4gIXByZWFwcHJvdmVkUGFja2FnZXMuc29tZSgocGF0dGVybikgPT4gZG9lc1BhY2thZ2VQYXR0ZXJuTWF0Y2gocGF0dGVybiwgZGVwZW5kZW5jeSkpO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlQWdlR2F0ZU1zKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IG51bWJlciB7XG4gIGlmIChjb25maWcuaXNCdW4pIHJldHVybiBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgKiAxMDAwO1xuXG4gIGNvbnN0IG1hdGNoZWQgPSAvXig/PGRheXM+XFxkKylkJC91LmV4ZWMoeWFybk5wbU1pbmltYWxBZ2VHYXRlKTtcbiAgcmV0dXJuIE51bWJlcihtYXRjaGVkPy5ncm91cHM/LmRheXMgPz8gMCkgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xufVxuXG5mdW5jdGlvbiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocGF0dGVybiA9PT0gZGVwZW5kZW5jeSkgcmV0dXJuIHRydWU7XG4gIGlmICghcGF0dGVybi5pbmNsdWRlcygnKicpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2VBbGwoL1suKz9eJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKS5yZXBsYWNlQWxsKCcqJywgJy4qJyk7XG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtlc2NhcGVkUGF0dGVybn0kYCwgJ3UnKS50ZXN0KGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgZGVwZW5kZW5jeSwgJ3ZlcnNpb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sIHByb2Nlc3MuY3dkKCkpIHx8ICcqJztcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoZGVwZW5kZW5jeSA9PT0gd2JEZXBlbmRlbmN5KSByZXR1cm4gYCR7ZGVwZW5kZW5jeX1AJHtnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3kpfWA7XG4gIHJldHVybiBkZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPixcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgY29uc3QgcHJlc2VydmVNaWNyb21hdGNoID0gc2hvdWxkUHJlc2VydmVNaWNyb21hdGNoKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAocHJlc2VydmVNaWNyb21hdGNoICYmIG1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICBpZiAoc2hvdWxkUHJlc2VydmVDb25maWdQYWNrYWdlTGludERlcGVuZGVuY3koanNvbk9iaiwgY29uZmlnLCBkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jeTogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBQdWJsaXNoZWQgY29uZmlnIHBhY2thZ2VzIG5lZWQgbG9jYWwgdHlwZS1vbmx5IGRlcHMgdG8gdmFsaWRhdGUgdGhlXG4gIC8vIHBhY2thZ2UtcHJvdmlkZWQgY29uZmlnIGRlY2xhcmF0aW9ucyB1bmRlciBZYXJuIFBuUC5cbiAgcmV0dXJuIGRlcGVuZGVuY3kgPT09ICdAdHlwZXMvZXNsaW50JyAmJiAhIWpzb25PYmoucGVlckRlcGVuZGVuY2llcy5lc2xpbnQ7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBzdWJwYWNrYWdlcyBwdWJsaXNoIGNvbmZpZyBmaWxlcyBhcyB0aGVpciBwcm9kdWN0LCBzb1xuICAvLyBtaWNyb21hdGNoIGlzIHBhY2thZ2UgZGF0YSB0aGVyZS4gT3RoZXIgcmVwb3Mga2VlcCBtaWNyb21hdGNoIG9ubHkgd2hlblxuICAvLyBwcm9kdWN0IGNvZGUgaW1wb3J0cyBpdDsgb3RoZXJ3aXNlIGl0IGlzIHRyZWF0ZWQgYXMgb2Jzb2xldGUgRVNMaW50LWVyYVxuICAvLyB0b29saW5nLlxuICByZXR1cm4gKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJiAhY29uZmlnLmlzUm9vdCkgfHwgZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaChjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGZnLmdsb2JTeW5jKCdzcmMvKiovKi57anMsanN4LG1qcyxjanMsdHMsdHN4LG10cyxjdHN9Jywge1xuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcbiAgcmV0dXJuIGZpbGVQYXRocy5zb21lKChmaWxlUGF0aCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbWljcm9tYXRjaEltcG9ydFBhdHRlcm4udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVQYXRoKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGN1cnJlbnRWZXJzaW9uID09PSAnKicpIHJldHVybiB0cnVlO1xuICBpZiAoaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkgcmV0dXJuIHRydWU7XG4gIC8vIHdiZnkgb3ducyB0aGVzZSB0b29sIGRlcGVuZGVuY2llcywgYnV0IGFwcGx5aW5nIHdiZnkgc2hvdWxkIG5vdCBkb3duZ3JhZGUgYVxuICAvLyByZXBvc2l0b3J5IHRoYXQgYWxyZWFkeSBwaW5zIGEgbmV3ZXIgcmV2aWV3ZWQgcmVsZWFzZS5cbiAgcmV0dXJuIG1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpICYmIGlzTmV3ZXJNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCBkZXBlbmRlbmN5LCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgZGVwZW5kZW5jeSk7XG4gIHJldHVybiBpc05ld2VyUGFja2FnZVZlcnNpb24obGF0ZXN0VmVyc2lvbiwgY3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyUGFja2FnZVZlcnNpb24oY2FuZGlkYXRlVmVyc2lvbjogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChjYW5kaWRhdGVWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIHJldHVybiAhdmFsaWRMYXRlc3RWZXJzaW9uIHx8ICF2YWxpZEN1cnJlbnRWZXJzaW9uIHx8IHNlbXZlci5ndCh2YWxpZExhdGVzdFZlcnNpb24sIHZhbGlkQ3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAvLyBObyBgLS1idW5gOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrcyB0b29sc1xuICAgICAgLy8gcmVxdWlyaW5nIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCkuXG4gICAgICBjbGVhbnVwOiAnYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgICB2ZXJpZnk6ICdidW4gd2IgdmVyaWZ5JyxcbiAgICAgICd2ZXJpZnktZnVsbCc6ICdidW4gd2IgdmVyaWZ5IC0tZnVsbCcsXG4gICAgfTtcbiAgICBhcHBseURhdGFiYXNlU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIGBidW4gJHtnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWcpfWApO1xuICAgIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJyAmJiBweXJpZ2h0JztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBoYXNKc09yVHMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpO1xuICAgIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgICBjb25zdCBvbGRUZXN0ID0gb2xkU2NyaXB0cy50ZXN0O1xuICAgIGxldCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHMsIGhhc0phdmEpLFxuICAgICAgLy8gUGFja2FnZS1sb2NhbCBjb25maWdzIG11c3QgZGVsZXRlIHRoZSByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zLCBzbyBwYXNzIHRoZSBmbGFnc1xuICAgICAgLy8gZXhwbGljaXRseS4gT3RoZXJ3aXNlIHRoaXMgc2NyaXB0IHdvdWxkIHNpbGVudGx5IHNraXAgdHlwZSBjaGVja2luZyBpbiB3b3Jrc3BhY2UgcGFja2FnZXMuXG4gICAgICBsaW50OiBgb3hsaW50JHtoYXNUeXBlY2hlY2sgPyAnIC0tdHlwZS1hd2FyZSAtLXR5cGUtY2hlY2snIDogJyd9IC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgICdmb3JtYXQtY29kZSc6IGBveGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLiAnISoqL3BhY2thZ2UuanNvbidgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0JyxcbiAgICB9O1xuICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICBzY3JpcHRzLnByZXR0aWZ5ID0gYHByZXR0aWVyIC0tY2FjaGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgJHtzY3JpcHRzLmZvcm1hdH0gJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLiBDb2xvciBwb2xpY3kgYmVsb25ncyB0byB3Yiwgbm90IGdlbmVyYXRlZCBwYWNrYWdlIHNjcmlwdHMuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXJPbmx5LmpvaW4oXG4gICAgICAgICAgJywnXG4gICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cbiAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICB9XG4gICAgaWYgKCFoYXNKc09yVHMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydmb3JtYXQtY29kZSddO1xuICAgICAgZGVsZXRlIHNjcmlwdHMubGludDtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydsaW50LWZpeCddO1xuICAgIH1cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgaWYgKGlzV2JQYWNrYWdlKGNvbmZpZy5wYWNrYWdlSnNvbikpIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gb2xkU2NyaXB0cy52ZXJpZnkgPz8gJ3lhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJElOSVRfQ1dEXCIgdmVyaWZ5JztcbiAgICAgIHNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPSBvbGRTY3JpcHRzWyd2ZXJpZnktZnVsbCddID8/ICd5YXJuIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzLnZlcmlmeSA9ICd3YiB2ZXJpZnknO1xuICAgICAgc2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA9ICd3YiB2ZXJpZnkgLS1mdWxsJztcbiAgICB9XG4gICAgYXBwbHlEYXRhYmFzZVNjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWcpKTtcbiAgICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1hbmFnZUdlbkkxOG5Ucyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnaTE4bicpKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgd2JEYkNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuO1xuXG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLWNyZWF0ZS1taWdyYXRpb24nLCBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZS1kZXZgKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItbWlncmF0ZScsIGAke3diRGJDb21tYW5kfSBtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3lgKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItdmlldycsIGAke3diRGJDb21tYW5kfSBzdHVkaW9gKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZTogc3RyaW5nLFxuICBnZW5lcmF0ZWRTY3JpcHQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbbmFtZV07XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgbWlncmF0aW9uIGNvbW1hbmRzIHRvIHByZXBhcmUgU1FMaXRlIGRpcmVjdG9yaWVzLFxuICAvLyBmYW4gb3V0IG92ZXIgdGVuYW50cywgb3IgcGVyZm9ybSBjbGVhbnVwIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5LlxuICBzY3JpcHRzW25hbWVdID0gb2xkU2NyaXB0ICYmICFpc0dlbmVyYXRlZERhdGFiYXNlU2NyaXB0KG9sZFNjcmlwdCkgPyBvbGRTY3JpcHQgOiBnZW5lcmF0ZWRTY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkRGF0YWJhc2VTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGJ3YlxccysoPzpkYnxwcmlzbWEpXFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgcmV0dXJuICd3YiBkYic7XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgLy8gUHJlc2VydmUgYSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYgcHJlZml4IChlLmcuIGBNSVNFX0VOVj10ZXN0YCkgb24gYW4gZXhpc3RpbmcgbWlzZSBicmlkZ2UuXG4gICAgLy8gU3VjaCBhIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgbWlzZSBjb25maWcgZW52aXJvbm1lbnRzIChtaXNlLjxNSVNFX0VOVj4udG9tbCksIHdoaWNoIGFyZVxuICAgIC8vIHNlbGVjdGVkIGZyb20gTUlTRV9FTlYgKmJlZm9yZSogbWlzZSBzdGFydHMgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCBmcm9tIGluc2lkZSBhIHRhc2s7IGRyb3BwaW5nXG4gICAgLy8gaXQgd291bGQgc2lsZW50bHkgcnVuIHRoZSB0YXNrIGluIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LlxuICAgIGNvbnN0IGVudlByZWZpeCA9IGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpO1xuICAgIGlmIChlbnZQcmVmaXggPT09IHVuZGVmaW5lZCAmJiBvbGRTY3JpcHRzW25hbWVdICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGAke2VudlByZWZpeCA/PyAnJ31taXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudi12YXIgcHJlZml4IG9mIGFuIGV4aXN0aW5nIGBtaXNlIHJ1biA8bmFtZT5gIGJyaWRnZSBzY3JpcHRcbiAqIChwb3NzaWJseSBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYnJpZGdlIGhhcyBubyBwcmVmaXgpLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzY3JpcHQgaXMgbm90IGFcbiAqIG1pc2UgYnJpZGdlIGZvciB0aGUgZ2l2ZW4gdGFzay5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEVhY2ggYXNzaWdubWVudCB2YWx1ZSBtYXkgYmUgZG91YmxlLXF1b3RlZCwgc2luZ2xlLXF1b3RlZCwgb3IgYW4gdW5xdW90ZWQgcnVuIG9mIG5vbi13aGl0ZXNwYWNlLFxuICAvLyBzbyBwcmVmaXhlcyBsaWtlIGBNSVNFX0VOVj1cImEgYlwiYCAod2hvc2UgdmFsdWUgY29udGFpbnMgc3BhY2VzKSBhcmUgbWF0Y2hlZCBpbnN0ZWFkIG9mIGRyb3BwZWQuXG4gIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF4oKD86XFx3Kz0oPzpcIlteXCJdKlwifCdbXiddKid8XFxTKylcXHMrKSopbWlzZSBydW4gJHtlc2NhcGVSZWdFeHAobmFtZSl9JGAsICd1JykuZXhlYyhcbiAgICBzY3JpcHQudHJpbSgpXG4gICk7XG4gIHJldHVybiBtYXRjaD8uWzFdO1xufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRm9ybWF0U2NyaXB0KGhhc0pzT3JUczogYm9vbGVhbiwgaGFzSmF2YTogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGNvbW1hbmRzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBpZiAoaGFzSnNPclRzKSB7XG4gICAgY29tbWFuZHMucHVzaCgneWFybiBmb3JtYXQtY29kZScpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgY29tbWFuZHMucHVzaCgneWFybiBwcmV0dGlmeScpO1xuICB9XG4gIHJldHVybiBjb21tYW5kcy5qb2luKCcgJiYgJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKS5jYXRjaCgoKSA9PiAnJyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gYCR7bGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpfSB8fCB0cnVlYDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUganNvbk9iai5wcmV0dGllcjtcbiAgY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25zOiBBcnJheTxQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkPiA9IFtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llcyxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyxcbiAgICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMsXG4gIF07XG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBkZXBlbmRlbmN5U2VjdGlvbnMpIHtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBzZWN0aW9uLnByZXR0aWVyO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydwcmV0dGllci1wbHVnaW4tamF2YSddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydwcmV0dGllci1wbHVnaW4tcHJpc21hJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzOiB7XG4gICAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgICByZXBvOiBzdHJpbmc7XG4gICAgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnO1xuICB9W10gPSBbXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9hdXRoJywgcmVwbzogJ2F1dGgnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0BkaXNjb3JkLWJvdC9zaGFyZWQnLCByZXBvOiAnZGlzY29yZC1ib3QnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJywgcmVwbzogJ2NvZGUtYW5hbHl6ZXInLCB0YXJnZXQ6ICdkZXZEZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9qdWRnZScsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIHJlcG86ICdsbG0tcHJveHknLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gIF07XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcHJpdmF0ZVBhY2thZ2VzLm1hcChhc3luYyAoeyBwYWNrYWdlTmFtZSwgcmVwbywgdGFyZ2V0IH0pID0+IHtcbiAgICAgIGlmICghcGFja2FnZU5hbWVzLmhhcyhwYWNrYWdlTmFtZSkgfHwgaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosIHBhY2thZ2VOYW1lKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvdGhlclRhcmdldCA9IHRhcmdldCA9PT0gJ2RlcGVuZGVuY2llcycgPyAnZGV2RGVwZW5kZW5jaWVzJyA6ICdkZXBlbmRlbmNpZXMnO1xuICAgICAgLy8gVGhlIGxpbnQgcnVsZSBkaXNhbGxvd3MgYGRlbGV0ZWAgd2l0aCBjb21wdXRlZCBwYWNrYWdlIG5hbWVzOyBSZWZsZWN0IGhhcyB0aGUgc2FtZSBkZWxldGlvbiBzZW1hbnRpY3MgaGVyZS5cbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9ialtvdGhlclRhcmdldF0sIHBhY2thZ2VOYW1lKTtcbiAgICAgIGpzb25PYmpbdGFyZ2V0XVtwYWNrYWdlTmFtZV0gPSBhd2FpdCBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgam9iczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdjbGVhbnVwJyxcbiAgICAgIGdsb2I6ICcnLFxuICAgICAgcnVuOiAnJyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2NoZWNrLW1pZ3JhdGlvbnMnLFxuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5mYWlsZWQ9MFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCBodXNreURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgY29uc3QgaGFzSHVza3lEaXIgPSBmcy5leGlzdHNTeW5jKGh1c2t5RGlyUGF0aCk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChzZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG4gIGlmIChoYXNIdXNreURpcikge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnByb21pc2VzLnJtKGh1c2t5RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pLFxuICAgIF0pO1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAobGludCkge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZVB1c2hTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgbGV0IGxpbnRDb21tYW5kOiBzdHJpbmc7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gICAgLy8gZmluYWwgaG9vayBjb21tYW5kIG9uIHRoZSBmaXJzdCBydW4gaW5zdGVhZCBvZiBjaGFuZ2luZyBpdCBvbiB0aGUgc2Vjb25kLlxuICAgIGxpbnRDb21tYW5kID0gJ2J1biB3YiBsaW50JztcbiAgfSBlbHNlIHtcbiAgICBsaW50Q29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAneWFybiB3YiBsaW50JyA6ICd5YXJuIHJ1biBsaW50JztcbiAgfVxuICBjb25zdCBxdWlldExpbnRDb21tYW5kID0gYCR7bGludENvbW1hbmR9IC0tcXVpZXRgO1xuICAvLyBObyBzZXBhcmF0ZSB0eXBlY2hlY2sgc3RlcCBuZWVkZWQg4oCUIHRoZSBsaW50IGNvbW1hbmQgYWxyZWFkeSBpbmNsdWRlcyB0eXBlY2hlY2tpbmcuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgcmV0dXJuIGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG4ke3F1aWV0TGludENvbW1hbmR9XG5gLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcXVpZXRMaW50Q29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlQ29tbWl0Sm9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBMZWZ0aG9va0pvYltdIHtcbiAgcmV0dXJuIHByZUNvbW1pdFNldHRpbmdzLmpvYnMubWFwKChqb2IpID0+XG4gICAgam9iLm5hbWUgPT09ICdjbGVhbnVwJ1xuICAgICAgPyB7XG4gICAgICAgICAgLi4uam9iLFxuICAgICAgICAgIGdsb2I6IGdldENsZWFudXBHbG9icyhjb25maWcpLFxuICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgfVxuICAgICAgOiBqb2JcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIExldCBgd2IgbGludCAtLWZvcm1hdGAgZGVjaWRlIHdoZXRoZXIgUHJldHRpZXIgaXMgYXZhaWxhYmxlOyB0aGUgaG9va1xuICAvLyBzdGlsbCBuZWVkcyB0byB0cmlnZ2VyIHdoZW4gYWRkaW5nIHRoZSBmaXJzdCBwcmV0dGllci1vbmx5IGZpbGUuXG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPVxuICAgIGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLndiIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpID8gWy4uLmV4dGVuc2lvbnMucHJldHRpZXJPbmx5XSA6IFtdO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdweScpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnZGFydCcpO1xuICB9XG4gIGNvbnN0IGZpbHRlcmVkRXh0ZW5zaW9ucyA9IFsuLi5uZXcgU2V0KHN1cHBvcnRlZEV4dGVuc2lvbnMpXS50b1NvcnRlZCgpO1xuICByZXR1cm4gYCoqLyoueyR7ZmlsdGVyZWRFeHRlbnNpb25zLmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnKSkge1xuICAgIHJldHVybiBTdHJpbmcucmF3YFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG55YXJuIHdvcmtzcGFjZSBAd2lsbGJvb3N0ZXIvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cbiAgLy8gUHl0aG9uLW9ubHkgQnVuIHJlcG9zIGluc3RhbGwgd2IgZm9yIHNoYXJlZCBzY3JpcHRzIGJ1dCBub3QgT3hsaW50LCBzb1xuICAvLyBzdGFnZWQtZmlsZSBob29rcyBtdXN0IHVzZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgZm9ybWF0dGVyIHBhdGggYmVsb3cuXG4gIGNvbnN0IGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICBpZiAoKGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLndiKSAmJiBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzKSB7XG4gICAgcmV0dXJuIGBcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuJHtjb25maWcuaXNCdW4gPyAnYnVuIHdiJyA6ICd5YXJuIHdiJ30gbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cblxuICBjb25zdCBveGxpbnRQYXR0ZXJuID0gZXh0ZW5zaW9ucy5veGxpbnQubWFwKChleHRlbnNpb24pID0+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+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0YXJnZXQ6ICdicmFuY2gnO1xuICBlbmZvcmNlbWVudDogJ2FjdGl2ZSc7XG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgaW5jbHVkZTogc3RyaW5nW107XG4gICAgICBleGNsdWRlOiBzdHJpbmdbXTtcbiAgICB9O1xuICB9O1xuICBydWxlczogKFxuICAgIHwge1xuICAgICAgICB0eXBlOiAnZGVsZXRpb24nIHwgJ25vbl9mYXN0X2ZvcndhcmQnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcyc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGJvb2xlYW47XG4gICAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IHtcbiAgICAgICAgICAgIGNvbnRleHQ6IHN0cmluZztcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBudW1iZXI7XG4gICAgICAgICAgfVtdO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IG51bWJlcjtcbiAgICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdO1xuICAgICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBib29sZWFuO1xuICAgICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgKVtdO1xuICBieXBhc3NfYWN0b3JzOiB7XG4gICAgYWN0b3JfaWQ6IG51bWJlcjtcbiAgICBhY3Rvcl90eXBlOiAnVGVhbSc7XG4gICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnO1xuICB9W107XG59XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgc291cmNlX3R5cGU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIgPSB7XG4gICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4Jyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lEID0gMTVfMzY4O1xuXG5jb25zdCBQUk9URUNUX01BSU5fUlVMRVNFVDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkID0ge1xuICBuYW1lOiAnUHJvdGVjdCBtYWluJyxcbiAgdGFyZ2V0OiAnYnJhbmNoJyxcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnLFxuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGV4Y2x1ZGU6IFtdLFxuICAgICAgaW5jbHVkZTogWyd+REVGQVVMVF9CUkFOQ0gnXSxcbiAgICB9LFxuICB9LFxuICBydWxlczogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdkZWxldGlvbicsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogZmFsc2UsXG4gICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogdHJ1ZSxcbiAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICd0ZXN0IC8gdGVzdCcsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAnc2VtYW50aWMtcHIgLyBzZW1hbnRpYy1wcicsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbm9uX2Zhc3RfZm9yd2FyZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogMCxcbiAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdLFxuICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGZhbHNlLFxuICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIGJ5cGFzc19hY3RvcnM6IFtcbiAgICB7XG4gICAgICBhY3Rvcl9pZDogMTdfNzc3XzQ5NSxcbiAgICAgIGFjdG9yX3R5cGU6ICdUZWFtJyxcbiAgICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICB9LFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwUmVwb3NpdG9yeVJ1bGVzZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicpIHJldHVybjtcbiAgICAvLyBUaGUgcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gaG9zdHMgd29ya2Zsb3dfY2FsbCBkZWZpbml0aW9ucywgc28gdGhlXG4gICAgLy8gUHJvdGVjdCBtYWluIHJ1bGVzZXQgd291bGQgcmVxdWlyZSB0ZXN0L3NlbWFudGljLXByIGNoZWNrcyB0aGF0IG5ldmVyIHJ1biB0aGVyZS5cbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8oY29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIFJlcG9zaXRvcnkgcnVsZXNldHMgcmVxdWlyZSBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB3aGljaCBsb2NhbCBydW5zXG4gICAgICAvLyBtYXkgbm90IGhhdmUgZXZlbiB3aGVuIGZpbGUtZ2VuZXJhdGlvbiBhbmQgcHVzaGVzIGFyZSBhbGxvd2VkLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/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+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcERlcHMpO1xuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmIGRvZXNDb250YWluSnNPclRzKHJvb3RDb25maWcpKSB7XG4gICAgICAgIC8vIE1vbm9yZXBvIHZlcmlmaWNhdGlvbiBjYW4gaW52b2tlIG94bGludCBmcm9tIGV2ZXJ5IHdvcmtzcGFjZS4gR2l2ZVxuICAgICAgICAvLyBub24tY29kZSBwYWNrYWdlcyBhIGxvY2FsIGNvbmZpZyBzbyBveGxpbnQgZG9lcyBub3QgY2xpbWIgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgY29uZmlnIGFuZCByZWplY3Qgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBmcm9tIGEgcGFja2FnZSBjd2QuXG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICBhd2FpdCBmaXhXYkRiQ29tbWFuZChyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3JlZnJlc2hCdW5Mb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG4gIHJldHVybiBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZztcbn1cblxuZnVuY3Rpb24gcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAvLyB3YmZ5IHNob3VsZCB1cGRhdGUgb25seSB0aGUgcGFja2FnZXMgaXQgZXhwbGljaXRseSBtYW5hZ2VzIHRocm91Z2ggYnVuIGFkZC5cbiAgLy8gUnVubmluZyBidW4gdXBkYXRlIGhlcmUgcmVmcmVzaGVzIHVucmVsYXRlZCBhcHBsaWNhdGlvbiBkZXBlbmRlbmNpZXMgYW5kXG4gIC8vIGNhbiBjaGFuZ2UgcHJvZHVjdCBiZWhhdmlvciwgc28ga2VlcCB0aGUgZXhpc3RpbmcgbG9jayBhbmQgcmVjb25jaWxlIGl0LlxuICBjb25zdCBzdGF0dXMgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gIGlmIChzdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMTIsMTMsMTQsMTUsMTYsMTddLCJtYXBwaW5ncyI6IjZ0QkFBQSxlQUFzQixHQUFNLEVBQXFDLENBQy9ELE9BQU8sSUFBSSxRQUFTLEdBQVksV0FBVyxFQUFTLENBQVksQ0FBQyxDQUNuRSxDQ2lDQSxlQUFzQixHQUFvQixFQUE4QyxDQUN0RixHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUcsQ0FDbEIsTUFBUSxDQUVSLENBQ0YsQ0FFQSxlQUFzQixFQUFxQixFQUE4QyxDQUN2RixHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUcsQ0FDbEIsT0FBUyxFQUFPLENBQ2QsR0FBSSxPQUFPLEdBQVUsVUFBWSxHQUFTLFNBQVUsR0FBUyxFQUFNLE9BQVMsU0FDMUUsT0FFRixNQUFNLENBQ1IsQ0FDRixDQTBCQSxlQUFzQixHQUNwQixFQUNBLENBQ0UsY0FDQSxjQUNBLGFBQWEsRUFDYixjQUNBLGNBQ0Esb0JBQW9CLEVBQ3BCLDJCQUNnQixDQUFDLEVBQ1AsQ0FDWixJQUFJLEVBQWMsRUFDbEIsT0FDRSxHQUFJLENBQ0YsT0FBTyxNQUFNLEVBQUss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
441
+ `.trim()};async function Os(n){return b.functionIgnoringException(`generateGitHubTemplates`,async()=>{if(n.isWillBoosterRepo)for(let[r,i]of Object.entries(Ds)){let a=ks(i,n),o=t.resolve(n.dirPath,`.github`,r);e.existsSync(o)&&re(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 ks(e,t){let n=t.isBun?`bun run`:`yarn`;return e.replaceAll(Es,n)}const As=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],js=String.raw`(?:WillBooster|WillBoosterLab)`,Ms=[RegExp(`^${js}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^github:${js}/[^#\\s]+(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?https://github\\.com/${js}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?ssh://git@github\\.com[:/]${js}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`),RegExp(`^(?:git\\+)?git@github\\.com:${js}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,`u`)];function Ns(e){let n=e.flatMap(Ps);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(`
442
+ `);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function Ps(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of As){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&Fs(a)&&(Ls(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function Fs(e){return Is(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 Is(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function Ls(e){return Ms.some(t=>t.test(e))}async function Rs(){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(Vs()).strict().argv;y.isVerbose=e.verbose,y.doesUploadEnvVars=e.env;let t=!1;try{t=await zs(e.paths,e.skipDeps)}finally{ue()}t&&(process.exitCode=1)}async function zs(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 Wt([a,...o]);let s=await kr(a);if(y.isVerbose,!s){console.error(`there is no valid package.json in ${a}`),i=!0;continue}let c=cn(s),l=[s,...(await Promise.all(o.map(e=>kr(e,s)))).filter(e=>!!e)];if(y.isVerbose)for(let e of l)console.info(e);Ns(l),await fi(s),s.isBun&&await nr(s);let u=!en(s.repository)&&(s.repository?.startsWith(`github:WillBooster/`)||s.repository?.startsWith(`github:WillBoosterLab/`));await Promise.all([We(s),c.then(()=>jo(s)),Wn(s,l),pr(s),hr(s),vr(s,l),yr(s),xr(s),Os(s),ni(s),Ao(s),Lo(s),Fo(s),...u?[$t(s)]:[],ds(s),hs(s),Ss(s),ws(s),io(s),ho(s)]),await S.promiseAll();let d=[];for(let e of l)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Kt(e,e.isRoot?l:[e])),e.depending.playwrightTest&&d.push(Ee(e)),e.depending.next&&d.push(fe(e)),await Qr(e,s),await S.promiseAll(),!(!e.isRoot&&!e.doesContainPackageJson)&&(await Do(e),await Oi(e,s,r),jr(e)&&await Un(e),d.push(ho(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&d.push(ls(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Ho(e)),C(e)?(d.push(bo(e)),d.push(So(e,s))):!e.isRoot&&e.doesContainPackageJson&&C(s)&&d.push(So(e,s)),e.depending.pyright&&d.push(ko(e)));await Promise.all(d),await S.promiseAll(),await mn(s,l);let f=s.isBun?`bun`:`yarn`;s.isBun?await b.functionIgnoringException(`refreshBunLock`,async()=>{await Promise.resolve(),Bs(a)}):L(f,[`install`,`--no-immutable`],a),L(f,[`cleanup`],a),await zo(s)}return i}function Bs(e){let t=vn(`bun`,[`install`],e);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}function Vs(){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 Rs();
443
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZnMiLCJmcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkUHJvY2VzcyIsImZzcCIsInBhcnNlVG9tbCIsImNvbW1vbkNvbnRlbnQiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJjb3JlIiwiZXNjYXBlUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwibWFuYWdlZENvbmZpZ0Jsb2NrcyIsImdldENvbmZpZ0NvbnRlbnQiLCJqc29uT2JqIiwiaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliL3NyYy9zbGVlcC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi9zcmMvZml4ZXJzL3Rlc3REaXJlY3RvcnkudHMiLCIuLi9zcmMvZml4ZXJzL3R5cGVEZWZpbml0aW9uLnRzIiwiLi4vc3JjL3V0aWxzL21lcmdlVXRpbC50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL2ZpeGVycy93YkRiQ29tbWFuZC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXJUeXBlc0NvbW1hbmQudHMiLCIuLi9zcmMvZml4ZXJzL3dvcmtlclR5cGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYWdlbnRzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYnVuZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2lnbm9yZUZpbGVVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuc2lvbnMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9jb25maWdDb250ZW50LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWFuYWdlZENvbmZpZ0Jsb2NrLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hmbXRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGxpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG4gIGRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBBUEkgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL3N5bmMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VGaWxlIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG4vLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSAoR28pIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSBhbmQgbm9cbi8vIGxvbmdlciBleHBvc2VzIGFuIGluLXByb2Nlc3MgcGFyc2VyIHN1Y2ggYXMgYHRzLmNyZWF0ZVNvdXJjZUZpbGVgLiBQYXJzaW5nIG5vd1xuLy8gaGFwcGVucyBpbiBhIHNwYXduZWQgY29tcGlsZXIgc2VydmVyIHJlYWNoZWQgdGhyb3VnaCB0aGUgc3luY2hyb25vdXMgQVBJLCBzbyB3ZVxuLy8ga2VlcCBhIHNpbmdsZSBsYXppbHktY3JlYXRlZCBpbnN0YW5jZSBhbmQgcmV1c2UgaXQgYWNyb3NzIGV2ZXJ5IGZpeGVyIHRvIGF2b2lkXG4vLyBwYXlpbmcgdGhlIHByb2Nlc3Mtc3Bhd24gY29zdCBwZXIgZmlsZS5cbmxldCBhcGk6IEFQSSB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0QXBpKCk6IEFQSSB7XG4gIHJldHVybiAoYXBpID8/PSBuZXcgQVBJKHsgY3dkOiBwcm9jZXNzLmN3ZCgpIH0pKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBzb3VyY2UgZmlsZSBpbnRvIGEgVHlwZVNjcmlwdCBBU1QgdXNpbmcgdGhlIGJ1bmRsZWQgbmF0aXZlIGNvbXBpbGVyLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBjb21waWxlciBjYW5ub3QgbG9hZCB0aGUgZmlsZSAoZS5nLiBpdCBpcyBtaXNzaW5nXG4gKiBvciB1bnBhcnNhYmxlKSBzbyBjYWxsZXJzIGNhbiBmYWxsIGJhY2sgdG8gY29uc2VydmF0aXZlIGJlaGF2aW9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBTb3VyY2VGaWxlIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGdldEFwaSgpLnVwZGF0ZVNuYXBzaG90KHsgb3BlbkZpbGVzOiBbZmlsZVBhdGhdIH0pO1xuICAgIHJldHVybiBzbmFwc2hvdC5nZXREZWZhdWx0UHJvamVjdEZvckZpbGUoZmlsZVBhdGgpPy5wcm9ncmFtLmdldFNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2h1dHMgZG93biB0aGUgc3Bhd25lZCBjb21waWxlciBzZXJ2ZXIuIFRoZSBzZXJ2ZXIga2VlcHMgYW4gb3BlbiBJUEMgY2hhbm5lbFxuICogdGhhdCB3b3VsZCBvdGhlcndpc2Uga2VlcCB0aGUgTm9kZS5qcyBldmVudCBsb29wIGFsaXZlLCBzbyB3YmZ5IG11c3QgY2FsbCB0aGlzXG4gKiBvbmNlIGl0cyBydW4gZmluaXNoZXMgZm9yIHRoZSBwcm9jZXNzIHRvIGV4aXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpOiB2b2lkIHtcbiAgYXBpPy5jbG9zZSgpO1xuICBhcGkgPSB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxuLy8gU2V0dGluZ3MgZXZlcnkgV2lsbEJvb3N0ZXIgTmV4dC5qcyBwcm9qZWN0IHNob3VsZCBjYXJyeS4gYG5hbWVgIGlzIHRoZSB0b3AtbGV2ZWxcbi8vIHByb3BlcnR5IGtleSB1c2VkIHRvIGRldGVjdCB3aGV0aGVyIHRoZSBzZXR0aW5nIGFscmVhZHkgZXhpc3RzOyBgdGV4dGAgaXMgaW5zZXJ0ZWRcbi8vIHZlcmJhdGltIChhIHdob2xlIGBrZXk6IHZhbHVlYCBwYWlyKSB3aGVuIHRoZSBrZXkgaXMgbWlzc2luZy5cbmNvbnN0IG1hbmFnZWRQcm9wZXJ0aWVzOiByZWFkb25seSB7IG5hbWU6IHN0cmluZzsgdGV4dDogc3RyaW5nIH1bXSA9IFtcbiAgeyBuYW1lOiAncmVhY3RDb21waWxlcicsIHRleHQ6ICdyZWFjdENvbXBpbGVyOiB0cnVlJyB9LFxuICB7IG5hbWU6ICdyZWFjdFN0cmljdE1vZGUnLCB0ZXh0OiAncmVhY3RTdHJpY3RNb2RlOiB0cnVlJyB9LFxuICB7IG5hbWU6ICd0eXBlc2NyaXB0JywgdGV4dDogJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfScgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsndHMnLCAnbXRzJywgJ2N0cycsICdqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFjdGVkID0gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGgpO1xuICAgIGlmICghZXh0cmFjdGVkKSByZXR1cm47XG4gICAgY29uc3QgeyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA9IGV4dHJhY3RlZDtcblxuICAgIC8vIGBwcm9wZXJ0aWVzYCBpbmNsdWRlcyBzcHJlYWQgYXNzaWdubWVudHMgKGAuLi5yZXN0YCkgdGhhdCBjYXJyeSBubyBuYW1lLCBzbyBndWFyZCBiZWZvcmUgcmVhZGluZyBpdC5cbiAgICBjb25zdCBleGlzdGluZ1Byb3BlcnRpZXMgPSBuZXcgU2V0KFxuICAgICAgb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+XG4gICAgICAgICduYW1lJyBpbiBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5uYW1lID8gZ2V0UHJvcGVydHlLZXkocHJvcGVydHkubmFtZSwgc291cmNlKSA6IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgcHJvcGVydHlUZXh0cyA9IG1hbmFnZWRQcm9wZXJ0aWVzXG4gICAgICAuZmlsdGVyKChwcm9wZXJ0eSkgPT4gIWV4aXN0aW5nUHJvcGVydGllcy5oYXMocHJvcGVydHkubmFtZSkpXG4gICAgICAubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkudGV4dCk7XG4gICAgaWYgKHByb3BlcnR5VGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gc291cmNlLnRleHQ7XG4gICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBvYmplY3RMaXRlcmFsLmdldEVuZCgpIC0gMTtcbiAgICAvLyBUaGUgbmF0aXZlIFRTIEFTVCBkb2VzIG5vdCByZWxpYWJseSBleHBvc2UgYHByb3BlcnRpZXMuaGFzVHJhaWxpbmdDb21tYWAsIHNvIHNjYW4gdGhlIHNvdXJjZVxuICAgIC8vIGJldHdlZW4gdGhlIGxhc3QgcHJvcGVydHkgYW5kIHRoZSBjbG9zaW5nIGJyYWNlLiBTdHJpcCBjb21tZW50cyBmaXJzdCBzbyBhIGNvbW1hIGluc2lkZSBhXG4gICAgLy8gdHJhaWxpbmcgY29tbWVudCAoZS5nLiBgZm9vOiAxIC8vIGEsIGJgKSBpcyBub3QgbWlzdGFrZW4gZm9yIGEgcmVhbCB0cmFpbGluZyBjb21tYS5cbiAgICBjb25zdCBsYXN0UHJvcGVydHkgPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMuYXQoLTEpO1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ29tbWEgPSBsYXN0UHJvcGVydHlcbiAgICAgID8gc3RyaXBDb21tZW50cyhvbGRDb250ZW50LnNsaWNlKGxhc3RQcm9wZXJ0eS5nZXRFbmQoKSwgaW5zZXJ0aW9uUG9pbnQpKS5pbmNsdWRlcygnLCcpXG4gICAgICA6IGZhbHNlO1xuICAgIGNvbnN0IHByZWZpeCA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5sZW5ndGggPiAwICYmICFoYXNUcmFpbGluZ0NvbW1hID8gJywgJyA6ICcnO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIGluc2VydGlvblBvaW50KX0ke3ByZWZpeH0ke3Byb3BlcnR5VGV4dHMuam9pbignLCAnKX0ke29sZENvbnRlbnQuc2xpY2UoXG4gICAgICBpbnNlcnRpb25Qb2ludFxuICAgICl9YDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IHsgc291cmNlOiBhc3QuU291cmNlRmlsZTsgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2UgPSBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUaGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQgZGVjbGFyZXMgdGhlIGNvbmZpZyBhcyBgY29uc3QgbmV4dENvbmZpZzogTmV4dENvbmZpZyA9IHsgLi4uIH1gIGFuZFxuICAvLyBleHBvcnRzIGl0IChwb3NzaWJseSB3cmFwcGVkLCBlLmcuIGB3aXRoU2VudHJ5Q29uZmlnKC4uLilgKSwgc28gdGhlIG9iamVjdCBsaXRlcmFsIGlzIHJhcmVseVxuICAvLyB0aGUgZGlyZWN0IG9wZXJhbmQgb2YgYGV4cG9ydCBkZWZhdWx0YC9gbW9kdWxlLmV4cG9ydHNgLiBDb2xsZWN0IGV2ZXJ5IGNhbmRpZGF0ZSBhbmQgcGljayB0aGVcbiAgLy8gbW9zdCBhdXRob3JpdGF0aXZlIG9uZSBiZWxvdy5cbiAgbGV0IGRpcmVjdE9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgbGV0IGV4cG9ydGVkSWRlbnRpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2YXJpYWJsZU9iamVjdExpdGVyYWxzID0gbmV3IE1hcDxzdHJpbmcsIGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbj4oKTtcbiAgY29uc3QgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsczogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uW10gPSBbXTtcblxuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChhc3QuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmV4cHJlc3Npb24pO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYXN0LmlzQmluYXJ5RXhwcmVzc2lvbihub2RlKSAmJlxuICAgICAgbm9kZS5vcGVyYXRvclRva2VuLmtpbmQgPT09IGFzdC5TeW50YXhLaW5kLkVxdWFsc1Rva2VuICYmXG4gICAgICBub2RlLmxlZnQuZ2V0VGV4dChzb3VyY2UpID09PSAnbW9kdWxlLmV4cG9ydHMnXG4gICAgKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLnJpZ2h0KTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5yaWdodCkpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLnJpZ2h0LmdldFRleHQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFzdC5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkgJiYgbm9kZS5pbml0aWFsaXplcikge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5pbml0aWFsaXplcik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCAmJiBhc3QuaXNJZGVudGlmaWVyKG5vZGUubmFtZSkpIHtcbiAgICAgICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5zZXQobm9kZS5uYW1lLmdldFRleHQoc291cmNlKSwgb2JqZWN0TGl0ZXJhbCk7XG4gICAgICAgIC8vIEEgYDogTmV4dENvbmZpZ2AgYW5ub3RhdGlvbiBvciBhIGBzYXRpc2ZpZXNgL2BhcyBOZXh0Q29uZmlnYCBhc3NlcnRpb24gbWFya3MgdGhlIGNhbm9uaWNhbFxuICAgICAgICAvLyBjb25maWcgb2JqZWN0IChhY2NlcHRpbmcgcXVhbGlmaWVkIG5hbWVzIHN1Y2ggYXMgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgKS5cbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblR5cGUgPSBub2RlLnR5cGU/LmdldFRleHQoc291cmNlKTtcbiAgICAgICAgY29uc3QgYXNzZXJ0ZWRUeXBlID0gZ2V0QXNzZXJ0ZWRUeXBlKG5vZGUuaW5pdGlhbGl6ZXIpPy5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IGlzVHlwZWRBc05leHRDb25maWcgPVxuICAgICAgICAgIChhbm5vdGF0aW9uVHlwZSAhPT0gdW5kZWZpbmVkICYmIGlzTmV4dENvbmZpZ1R5cGUoYW5ub3RhdGlvblR5cGUpKSB8fFxuICAgICAgICAgIChhc3NlcnRlZFR5cGUgIT09IHVuZGVmaW5lZCAmJiBpc05leHRDb25maWdUeXBlKGFzc2VydGVkVHlwZSkpO1xuICAgICAgICBpZiAoaXNUeXBlZEFzTmV4dENvbmZpZykgdHlwZWRDb25maWdPYmplY3RMaXRlcmFscy5wdXNoKG9iamVjdExpdGVyYWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIGNvbnN0IG9iamVjdExpdGVyYWwgPVxuICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHNbMF0gPz9cbiAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/XG4gICAgKGV4cG9ydGVkSWRlbnRpZmllciA/IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KGV4cG9ydGVkSWRlbnRpZmllcikgOiB1bmRlZmluZWQpID8/XG4gICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoJ25leHRDb25maWcnKTtcbiAgcmV0dXJuIG9iamVjdExpdGVyYWwgPyB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9IDogdW5kZWZpbmVkO1xufVxuXG4vLyBVbndyYXAgYCh7IC4uLiB9KWAgLyBgeyAuLi4gfSBhcyBOZXh0Q29uZmlnYCAvIGB7IC4uLiB9IHNhdGlzZmllcyBOZXh0Q29uZmlnYCB0byB0aGUgb2JqZWN0IGxpdGVyYWwuXG5mdW5jdGlvbiB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3VycmVudCA9IHVud3JhcEV4cHJlc3Npb24obm9kZSk7XG4gIHJldHVybiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihjdXJyZW50KSA/IGN1cnJlbnQgOiB1bmRlZmluZWQ7XG59XG5cbi8vIFJldHVybiB0aGUgYXNzZXJ0ZWQgdHlwZSBvZiBhIGBzYXRpc2ZpZXNgL2Bhc2AgZXhwcmVzc2lvbiwgaWYgYW55IChpZ25vcmluZyB3cmFwcGluZyBwYXJlbnRoZXNlcykuXG5mdW5jdGlvbiBnZXRBc3NlcnRlZFR5cGUobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuVHlwZU5vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjdXJyZW50ID0gdW53cmFwUGFyZW50aGVzZXMobm9kZSk7XG4gIHJldHVybiBhc3QuaXNBc0V4cHJlc3Npb24oY3VycmVudCkgfHwgYXN0LmlzU2F0aXNmaWVzRXhwcmVzc2lvbihjdXJyZW50KSA/IGN1cnJlbnQudHlwZSA6IHVuZGVmaW5lZDtcbn1cblxuLy8gUGVlbCBwYXJlbnRoZXNlcyBhbmQgYGFzYC9gc2F0aXNmaWVzYCBhc3NlcnRpb25zIG9mZiBhbiBleHByZXNzaW9uLlxuZnVuY3Rpb24gdW53cmFwRXhwcmVzc2lvbihub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5Ob2RlIHtcbiAgbGV0IGN1cnJlbnQ6IGFzdC5Ob2RlID0gdW53cmFwUGFyZW50aGVzZXMobm9kZSk7XG4gIHdoaWxlIChhc3QuaXNBc0V4cHJlc3Npb24oY3VycmVudCkgfHwgYXN0LmlzU2F0aXNmaWVzRXhwcmVzc2lvbihjdXJyZW50KSkge1xuICAgIGN1cnJlbnQgPSB1bndyYXBQYXJlbnRoZXNlcyhjdXJyZW50LmV4cHJlc3Npb24pO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyBQZWVsIHdyYXBwaW5nIHBhcmVudGhlc2VzIG9mZiBhbiBleHByZXNzaW9uLlxuZnVuY3Rpb24gdW53cmFwUGFyZW50aGVzZXMobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuRXhwcmVzc2lvbiB7XG4gIGxldCBjdXJyZW50ID0gbm9kZTtcbiAgd2hpbGUgKGFzdC5pc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGN1cnJlbnQpKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnQuZXhwcmVzc2lvbjtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLy8gTWF0Y2ggYm90aCB0aGUgYmFyZSBgTmV4dENvbmZpZ2AgYW5kIHF1YWxpZmllZCBmb3JtcyBsaWtlIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYC5cbmZ1bmN0aW9uIGlzTmV4dENvbmZpZ1R5cGUodHlwZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZVRleHQgPT09ICdOZXh0Q29uZmlnJyB8fCB0eXBlVGV4dC5lbmRzV2l0aCgnLk5leHRDb25maWcnKTtcbn1cblxuLy8gUmV0dXJuIGEgcHJvcGVydHkga2V5IHdpdGhvdXQgc3Vycm91bmRpbmcgcXVvdGVzLCBzbyBgJ3JlYWN0Q29tcGlsZXInYCBtYXRjaGVzIGByZWFjdENvbXBpbGVyYC5cbi8vIElkZW50aWZpZXIsIHN0cmluZy1saXRlcmFsIGFuZCBudW1lcmljLWxpdGVyYWwgbmFtZXMgYWxsIGV4cG9zZSB0aGUgdW5xdW90ZWQgdmFsdWUgdmlhIGAudGV4dGAuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eUtleShuYW1lOiBhc3QuUHJvcGVydHlOYW1lLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nIHtcbiAgcmV0dXJuICd0ZXh0JyBpbiBuYW1lICYmIHR5cGVvZiBuYW1lLnRleHQgPT09ICdzdHJpbmcnID8gbmFtZS50ZXh0IDogbmFtZS5nZXRUZXh0KHNvdXJjZSk7XG59XG5cbi8vIFJlbW92ZSBsaW5lIGFuZCBibG9jayBjb21tZW50cyBmcm9tIGEgc291cmNlIHNuaXBwZXQuXG5mdW5jdGlvbiBzdHJpcENvbW1lbnRzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1xcL1xcL1teXFxuXSp8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSnNPclRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YSB8fCBjb25maWcuZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZChjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2lzQnVuJz4pOiAnYnVuJyB8ICd5YXJuJyB7XG4gIHJldHVybiBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIE9iamVjdE1lbWJlciA9IHsga2luZDogJ2V4dHJhJzsgaW5kZXg6IG51bWJlciB9IHwgeyBraW5kOiAncHJvcGVydHknOyBrZXk6IHN0cmluZyB9O1xuaW50ZXJmYWNlIFBhcnNlZE9iamVjdCB7XG4gIGV4dHJhTWVtYmVyczogc3RyaW5nW107XG4gIG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXTtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xufVxuaW50ZXJmYWNlIEV4dHJhY3RlZE9iamVjdExpdGVyYWwge1xuICBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlO1xuICBub2RlOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG59XG5cbmNvbnN0IGxpdGVyYWwgPSAodmFsdWU6IHN0cmluZyk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdsaXRlcmFsJywgdmFsdWUgfSk7XG5jb25zdCBhc0FycmF5ID0gKHZhbHVlOiBQYXJzZWRWYWx1ZVtdKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2FycmF5JywgdmFsdWUgfSk7XG5jb25zdCBhc09iamVjdCA9IChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZFZhbHVlID0+ICh7XG4gIGtpbmQ6ICdvYmplY3QnLFxuICB2YWx1ZTogdG9QYXJzZWRPYmplY3QocHJvcGVydGllcywgZXh0cmFNZW1iZXJzKSxcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHM6IGJvb2xlYW4pOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCB1c2UgPSB0b1BhcnNlZE9iamVjdCh7XG4gICAgdHJhY2U6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgIHNjcmVlbnNob3Q6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbmx5LW9uLWZhaWx1cmUnIDogJ29uJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pO1xuXG4gIGlmIChzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cykge1xuICAgIHVzZS5wcm9wZXJ0aWVzLmJhc2VVUkwgPSBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpO1xuICAgIHVzZS5tZW1iZXJPcmRlci51bnNoaWZ0KHsga2luZDogJ3Byb3BlcnR5Jywga2V5OiAnYmFzZVVSTCcgfSk7XG4gIH1cblxuICByZXR1cm4gdG9QYXJzZWRPYmplY3Qoe1xuICAgIGZvcmJpZE9ubHk6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgICB1c2U6IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiB1c2UgfSxcbiAgICAuLi4oc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHNcbiAgICAgID8ge1xuICAgICAgICAgIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgICAgICAgICAgY29tbWFuZDogbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoY29uZmlnKSksXG4gICAgICAgICAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgICAgICAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgICAgICAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgICAgICAgICBzdGRvdXQ6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICAgICAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICAgICAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICAgICAgICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZE9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgZXh0cmFNZW1iZXJzLFxuICAgIG1lbWJlck9yZGVyOiBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoKGtleSk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSkpLFxuICAgICAgLi4uZXh0cmFNZW1iZXJzLm1hcCgoXywgaW5kZXgpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSkpLFxuICAgIF0sXG4gICAgcHJvcGVydGllcyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsID0gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGgpO1xuICAgIGlmICghZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUsIGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMgPVxuICAgICAgKGF3YWl0IGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCkpICYmIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZywgcGFyc2VkKTtcbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnID0gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKTtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVBhcnNlZE9iamVjdHMoZGVmYXVsdENvbmZpZywgcGFyc2VkKTtcbiAgICBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhtZXJnZWQsIGRlZmF1bHRDb25maWcpO1xuICAgIHNldFdlYlNlcnZlckNvbW1hbmQobWVyZ2VkLCBjb25maWcpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeVZhbHVlKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZWQgfSwgMCk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlLnRleHQ7XG4gICAgY29uc3Qgc3RhcnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0U3RhcnQoZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGNvbnN0IGVuZCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRFbmQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBzdGFydCl9JHtuZXdPYmplY3RMaXRlcmFsfSR7b2xkQ29udGVudC5zbGljZShlbmQpfWA7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2U6IFBhcnNlZE9iamVjdCwgb3ZlcnJpZGU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcGVydHlLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhvdmVycmlkZS5wcm9wZXJ0aWVzKSk7XG4gIGNvbnN0IGV4dHJhTWVtYmVycyA9IFsuLi5iYXNlLmV4dHJhTWVtYmVycywgLi4ub3ZlcnJpZGUuZXh0cmFNZW1iZXJzXTtcbiAgLy8gS2VlcCBkZWZhdWx0LW9ubHkgbWVtYmVycyBiZWZvcmUgcGFyc2VkIG1lbWJlcnMgc28gc3ByZWFkcyBhbmQgZXhwbGljaXQgbG9jYWwgcHJvcGVydGllcyByZXRhaW4gcHJlY2VkZW5jZS5cbiAgY29uc3QgbWVtYmVyT3JkZXIgPSBbXG4gICAgLi4uYmFzZS5tZW1iZXJPcmRlci5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgIT09ICdwcm9wZXJ0eScgfHwgIW92ZXJyaWRlUHJvcGVydHlLZXlzLmhhcyhtZW1iZXIua2V5KSksXG4gICAgLi4ub3ZlcnJpZGUubWVtYmVyT3JkZXIubWFwKChtZW1iZXIpOiBPYmplY3RNZW1iZXIgPT4ge1xuICAgICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSByZXR1cm4gbWVtYmVyO1xuICAgICAgcmV0dXJuIHsga2luZDogJ2V4dHJhJywgaW5kZXg6IGJhc2UuZXh0cmFNZW1iZXJzLmxlbmd0aCArIG1lbWJlci5pbmRleCB9O1xuICAgIH0pLFxuICBdO1xuICBjb25zdCBwcm9wZXJ0aWVzID0geyAuLi5iYXNlLnByb3BlcnRpZXMgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGUucHJvcGVydGllcykpIHtcbiAgICBwcm9wZXJ0aWVzW2tleV0gPSBtZXJnZVBhcnNlZFZhbHVlKHByb3BlcnRpZXNba2V5XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB7IGV4dHJhTWVtYmVycywgbWVtYmVyT3JkZXIsIHByb3BlcnRpZXMgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRWYWx1ZShiYXNlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCwgb3ZlcnJpZGU6IFBhcnNlZFZhbHVlKTogUGFyc2VkVmFsdWUge1xuICBpZiAoYmFzZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgb3ZlcnJpZGUua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlLnZhbHVlLCBvdmVycmlkZS52YWx1ZSkgfTtcbiAgfVxuICByZXR1cm4gb3ZlcnJpZGU7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKGNvbmZpZzogUGFyc2VkT2JqZWN0LCBkZWZhdWx0Q29uZmlnOiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3QgdXNlID0gY29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBjb25zdCBkZWZhdWx0VXNlID0gZGVmYXVsdENvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgaWYgKHVzZT8ua2luZCAhPT0gJ29iamVjdCcgfHwgZGVmYXVsdFVzZT8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ3RyYWNlJywgJ3NjcmVlbnNob3QnLCAndmlkZW8nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRVc2UudmFsdWUucHJvcGVydGllc1trZXldO1xuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcGFyc2VkOiBQYXJzZWRPYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZGVwZW5kaW5nLm5leHQgfHxcbiAgICBwYXJzZWQucHJvcGVydGllcy53ZWJTZXJ2ZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgIGRvZXNPYmplY3RIYXZlQmFzZVVybChwYXJzZWQucHJvcGVydGllcy51c2UpIHx8XG4gICAgZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZCB9LCAnTkVYVF9QVUJMSUNfQkFTRV9VUkwnKVxuICApO1xufVxuXG5mdW5jdGlvbiBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwodmFsdWU6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgdmFsdWUudmFsdWUucHJvcGVydGllcy5iYXNlVVJMICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGl0ZXJhbFRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWUuaW5jbHVkZXMobGl0ZXJhbFRleHQpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5JykgcmV0dXJuIHZhbHVlLnZhbHVlLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKTtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnMuc29tZSgobWVtYmVyKSA9PiBtZW1iZXIuaW5jbHVkZXMobGl0ZXJhbFRleHQpKSB8fFxuICAgIE9iamVjdC52YWx1ZXModmFsdWUudmFsdWUucHJvcGVydGllcykuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3NpbmcgZW52IGZpbGVzIGFyZSBleHBlY3RlZCBpbiBzb21lIHJlcG9zLlxuICAgIH1cbiAgfVxuXG4gIC8vIFNvbWUgUGxheXdyaWdodCBjb25maWdzIG9ubHkgZGVmaW5lIGJyb3dzZXIgcHJvamVjdHMgb3IgZml4dHVyZXMgYW5kIGRvIG5vdFxuICAvLyBzdGFydCBhIHdlYiBhcHAuIEF2b2lkIGZvcmNpbmcgYW4gYXBwLXNlcnZlciBVUkwgaW50byB0aG9zZSBwYWNrYWdlcy5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJy5lbnYnLCAnLmVudi50ZXN0JywgJy5lbnYuZXhhbXBsZScsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChvYmplY3Q6IFBhcnNlZE9iamVjdCwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICAvLyB3YiBvd25zIHRoZSBjYW5vbmljYWwgdGVzdC1zZXJ2ZXIgc3RhcnR1cCBwYXRoOyBrZWVwIGN1c3RvbSBQbGF5d3JpZ2h0XG4gIC8vIHNlcnZlciBzZXR0aW5ncyB3aGlsZSBub3JtYWxpemluZyB0aGUgY29tbWFuZCBpdHNlbGYuIEludm9rZSB3YiB0aHJvdWdoIHRoZVxuICAvLyBwYWNrYWdlIG1hbmFnZXIgYmVjYXVzZSB0YXJnZXQgcmVwb3MgaW5zdGFsbCB3YiBhcyBhIHBhY2thZ2UgZGVwZW5kZW5jeS5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKGNvbmZpZykpO1xufVxuXG5mdW5jdGlvbiBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnJHtnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQoY29uZmlnKX0gd2Igc3RhcnQgLS1tb2RlIHRlc3QnYDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGg6IHN0cmluZyk6IEV4dHJhY3RlZE9iamVjdExpdGVyYWwgfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2UgPSBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICBpZiAoYXN0LmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJndW1lbnQpKSB7XG4gICAgICAgIGZvdW5kID0gZmlyc3RBcmd1bWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIHJldHVybiBmb3VuZCA/IHsgc291cmNlLCBub2RlOiBmb3VuZCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogYXN0LkV4cHJlc3Npb24sIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZE9iamVjdCB9IDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHsgZXh0cmFNZW1iZXJzOiBbXSwgbWVtYmVyT3JkZXI6IFtdLCBwcm9wZXJ0aWVzOiB7fSB9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmIChhc3QuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSBsaXRlcmFsKGtleSk7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fFxuICAgICAgKCFhc3QuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICFhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKVxuICAgICkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZWQuZXh0cmFNZW1iZXJzLnB1c2gocHJvcGVydHkuZ2V0VGV4dChzb3VyY2UpKSAtIDE7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgaWYgKHZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gICAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICAgIH0pO1xuICAgIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcblxuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBlbWl0dGVkUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSh2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlcik7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWVtYmVyT3JkZXIuZmxhdE1hcCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ2V4dHJhJykge1xuICAgICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RNZW1iZXIodmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzW21lbWJlci5pbmRleF0gPz8gJycsIGluZGVudCldO1xuICAgIH1cblxuICAgIGlmIChsYXN0UHJvcGVydHlJbmRleEJ5S2V5LmdldChtZW1iZXIua2V5KSAhPT0gaW5kZXgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtID0gdmFsdWUudmFsdWUucHJvcGVydGllc1ttZW1iZXIua2V5XTtcbiAgICBpZiAoIWl0ZW0gfHwgZW1pdHRlZFByb3BlcnRpZXMuaGFzKG1lbWJlci5rZXkpKSByZXR1cm4gW107XG4gICAgZW1pdHRlZFByb3BlcnRpZXMuYWRkKG1lbWJlci5rZXkpO1xuICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkobWVtYmVyLmtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCldO1xuICB9KTtcbiAgbGluZXMucHVzaChcbiAgICAuLi5PYmplY3QuZW50cmllcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFlbWl0dGVkUHJvcGVydGllcy5oYXMoa2V5KSlcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpKVxuICApO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIG1lbWJlcl0gb2YgbWVtYmVyT3JkZXIuZW50cmllcygpKSB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSB7XG4gICAgICBsYXN0UHJvcGVydHlJbmRleEJ5S2V5LnNldChtZW1iZXIua2V5LCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsYXN0UHJvcGVydHlJbmRleEJ5S2V5O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXk6IHN0cmluZywgaXRlbTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgIH1cbiAgfVxuICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RNZW1iZXIobWVtYmVyOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBtZW1iZXIuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIHN0cmluZ2lmaWVkLmVudHJpZXMoKSkge1xuICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke2xpbmV9YDtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8uYW50aWdyYXZpdHljbGkvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCA9IHNob3VsZEFkZFNxbGl0ZUNvbm5lY3Rpb25MaW1pdChjb25maWcpO1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoXG4gICAgICAgIC9EQVRBQkFTRV9VUkxcXHMqPVxccypcIj8oW15cIiNcXG5dKz9cXC5zcWxpdGUzW15cIiNcXG5dKilcIj8vZyxcbiAgICAgICAgKG1hdGNoLCB1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiBgREFUQUJBU0VfVVJMPVwiJHtub3JtYWxpemVTcWxpdGVEYXRhYmFzZVVybCh1cmwsIHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCl9XCJgO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG91bGRBZGRTcWxpdGVDb25uZWN0aW9uTGltaXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgLy8gYGNvbm5lY3Rpb25fbGltaXQ9MWAgb25seSBhcHBsaWVzIHRvIFByaXNtYSdzIFNRTGl0ZSBkYXRhc291cmNlIGhhbmRsaW5nLlxuICAvLyBSZXBvcyB0aGF0IG9wdCBpbnRvIG5vbi1wdXJlIFNRTGl0ZSBhZGFwdGVycyBzaG91bGQga2VlcCB0aGVpciBVUkwgYXMtaXMuXG4gIHJldHVybiAhZGVwZW5kZW5jaWVzWydAcHJpc21hL2FkYXB0ZXItYmV0dGVyLXNxbGl0ZTMnXSAmJiAhZGVwZW5kZW5jaWVzWydAcHJpc21hL2FkYXB0ZXItbGlic3FsJ107XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNxbGl0ZURhdGFiYXNlVXJsKHVybDogc3RyaW5nLCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBxdWVyeVN0YXJ0ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgY29uc3QgcGF0aFBhcnQgPSBxdWVyeVN0YXJ0ICE9PSAtMSA/IHVybC5zbGljZSgwLCBxdWVyeVN0YXJ0KSA6IHVybDtcbiAgY29uc3QgcXVlcnlQYXJ0ID0gcXVlcnlTdGFydCAhPT0gLTEgPyB1cmwuc2xpY2UocXVlcnlTdGFydCArIDEpIDogJyc7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnlQYXJ0KTtcblxuICBwYXJhbXMuZGVsZXRlKCdjb25uZWN0aW9uX2xpbWl0Jyk7XG4gIGlmIChzaG91bGRBZGRDb25uZWN0aW9uTGltaXQpIHtcbiAgICBwYXJhbXMuc2V0KCdjb25uZWN0aW9uX2xpbWl0JywgJzEnKTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IHBhcmFtcy50b1N0cmluZygpO1xuICByZXR1cm4gbm9ybWFsaXplZFF1ZXJ5ID8gYCR7cGF0aFBhcnR9PyR7bm9ybWFsaXplZFF1ZXJ5fWAgOiBwYXRoUGFydDtcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/IFtdKSwgLi4uT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KHNvcnRGbildXG5cbiAgZm9yIChrZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgIGlmIChoYXMob2JqZWN0LCBrZXkpKSB7XG4gICAgICB0b3RhbFtrZXldID0gb2JqZWN0W2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxcbn1cbiIsIi8vIERldGVjdCBlaXRoZXIgc3BhY2VzIG9yIHRhYnMgYnV0IG5vdCBib3RoIHRvIHByb3Blcmx5IGhhbmRsZSB0YWJzIGZvciBpbmRlbnRhdGlvbiBhbmQgc3BhY2VzIGZvciBhbGlnbm1lbnRcbmNvbnN0IElOREVOVF9SRUdFWCA9IC9eKD86KCApK3xcXHQrKS87XG5cbmNvbnN0IElOREVOVF9UWVBFX1NQQUNFID0gJ3NwYWNlJztcbmNvbnN0IElOREVOVF9UWVBFX1RBQiA9ICd0YWInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSBzaW5nbGUgc3BhY2UgcGF0dGVybnNcbmZ1bmN0aW9uIHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgdmFsdWUpIHtcblx0cmV0dXJuIGlnbm9yZVNpbmdsZVNwYWNlcyAmJiBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSAmJiB2YWx1ZSA9PT0gMTtcbn1cblxuLyoqXG5NYWtlIGEgTWFwIHRoYXQgY291bnRzIGhvdyBtYW55IGluZGVudHMvdW5pbmRlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gc2l6ZSBhbmQgaG93IG1hbnkgbGluZXMgZm9sbG93IGEgZ2l2ZW4gaW5kZW50YXRpb24uXG5cblRoZSBrZXkgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbmRlbnRhdGlvbiB0eXBlIChzID0gc3BhY2UgYW5kIHQgPSB0YWIpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMuXG5cbmBgYFxuaW5kZW50cyA9IHtcblx0dDM6IFsxLCAwXSxcblx0dDQ6IFsxLCA1XSxcblx0czU6IFsxLCAwXSxcblx0czEyOiBbMSwgMF0sXG59XG5gYGBcbiovXG5mdW5jdGlvbiBtYWtlSW5kZW50c01hcChzdHJpbmcsIGlnbm9yZVNpbmdsZVNwYWNlcykge1xuXHRjb25zdCBpbmRlbnRzID0gbmV3IE1hcCgpO1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBzaXplIG9mIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvblxuXHRsZXQgcHJldmlvdXNTaXplID0gMDtcblx0bGV0IHByZXZpb3VzSW5kZW50VHlwZTtcblxuXHQvLyBJbmRlbnRzIGtleSAoaWRlbnQgdHlwZSArIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzKVxuXHRsZXQga2V5O1xuXG5cdGZvciAoY29uc3QgbGluZSBvZiBzdHJpbmcuc3BsaXQoL1xcbi9nKSkge1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0Ly8gSWdub3JlIGVtcHR5IGxpbmVzXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBtYXRjaGVzID0gbGluZS5tYXRjaChJTkRFTlRfUkVHRVgpO1xuXG5cdFx0aWYgKG1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaW5kZW50ID0gbWF0Y2hlc1swXS5sZW5ndGg7XG5cdFx0XHRjb25zdCBpbmRlbnRUeXBlID0gbWF0Y2hlc1sxXSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIHVubGVzcyBpdCdzIHRoZSBvbmx5IGluZGVudCBkZXRlY3RlZCB0byBwcmV2ZW50IGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXNcblx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGluZGVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRlbnRUeXBlICE9PSBwcmV2aW91c0luZGVudFR5cGUpIHtcblx0XHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdH1cblxuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gaW5kZW50VHlwZTtcblxuXHRcdFx0bGV0IHVzZSA9IDE7XG5cdFx0XHRsZXQgd2VpZ2h0ID0gMDtcblxuXHRcdFx0Y29uc3QgaW5kZW50RGlmZmVyZW5jZSA9IGluZGVudCAtIHByZXZpb3VzU2l6ZTtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IGluZGVudDtcblxuXHRcdFx0Ly8gUHJldmlvdXMgbGluZSBoYXZlIHNhbWUgaW5kZW50P1xuXHRcdFx0aWYgKGluZGVudERpZmZlcmVuY2UgPT09IDApIHtcblx0XHRcdFx0Ly8gTm90IGEgbmV3IFwidXNlXCIgb2YgdGhlIGN1cnJlbnQgaW5kZW50OlxuXHRcdFx0XHR1c2UgPSAwO1xuXHRcdFx0XHQvLyBCdXQgZG8gYWRkIGEgYml0IHRvIGl0IGZvciBicmVha2luZyB0aWVzOlxuXHRcdFx0XHR3ZWlnaHQgPSAxO1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGtleSBmcm9tIHByZXZpb3VzIGxvb3Bcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSA9IE1hdGguYWJzKGluZGVudERpZmZlcmVuY2UpO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgY2hhbmdlcyB3aGVuIGlnbm9yZVNpbmdsZVNwYWNlcyBpcyB0cnVlXG5cdFx0XHRcdC8vIFRoaXMgcHJldmVudHMgY29tbW9uIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoaW5ncyBsaWtlIGFsaWduZWQgY29tbWVudHNcblx0XHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHN0YXRzXG5cdFx0XHRjb25zdCBlbnRyeSA9IGluZGVudHMuZ2V0KGtleSk7XG5cdFx0XHRpbmRlbnRzLnNldChrZXksIGVudHJ5ID09PSB1bmRlZmluZWQgPyBbMSwgMF0gOiBbZW50cnlbMF0gKyB1c2UsIGVudHJ5WzFdICsgd2VpZ2h0XSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGluZGVudHM7XG59XG5cbi8vIEVuY29kZSB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBhcyBhIHN0cmluZyAoZS5nLiAnczQnKSBmb3IgdXNlIGFzIGEgY29tcG91bmQga2V5IGluIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgaW5kZW50QW1vdW50KSB7XG5cdGNvbnN0IHR5cGVDaGFyYWN0ZXIgPSBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICdzJyA6ICd0Jztcblx0cmV0dXJuIHR5cGVDaGFyYWN0ZXIgKyBTdHJpbmcoaW5kZW50QW1vdW50KTtcbn1cblxuLy8gRXh0cmFjdCB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBmcm9tIGEga2V5IG9mIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGRlY29kZUluZGVudHNLZXkoaW5kZW50c0tleSkge1xuXHRjb25zdCBrZXlIYXNUeXBlU3BhY2UgPSBpbmRlbnRzS2V5WzBdID09PSAncyc7XG5cdGNvbnN0IHR5cGUgPSBrZXlIYXNUeXBlU3BhY2UgPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRjb25zdCBhbW91bnQgPSBOdW1iZXIoaW5kZW50c0tleS5zbGljZSgxKSk7XG5cblx0cmV0dXJuIHt0eXBlLCBhbW91bnR9O1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSAoZS5nLiAnczQnKSBmcm9tIHRoZSBpbmRlbnRzIE1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vc3QgY29tbW9uIGluZGVudCxcbi8vIG9yIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGluZGVudHMuXG5mdW5jdGlvbiBnZXRNb3N0VXNlZEtleShpbmRlbnRzKSB7XG5cdGxldCByZXN1bHQ7XG5cdGxldCBtYXhVc2VkID0gMDtcblx0bGV0IG1heFdlaWdodCA9IDA7XG5cblx0Zm9yIChjb25zdCBba2V5LCBbdXNlZENvdW50LCB3ZWlnaHRdXSBvZiBpbmRlbnRzKSB7XG5cdFx0aWYgKHVzZWRDb3VudCA+IG1heFVzZWQgfHwgKHVzZWRDb3VudCA9PT0gbWF4VXNlZCAmJiB3ZWlnaHQgPiBtYXhXZWlnaHQpKSB7XG5cdFx0XHRtYXhVc2VkID0gdXNlZENvdW50O1xuXHRcdFx0bWF4V2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KSB7XG5cdGNvbnN0IGluZGVudENoYXJhY3RlciA9IHR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJyAnIDogJ1xcdCc7XG5cdHJldHVybiBpbmRlbnRDaGFyYWN0ZXIucmVwZWF0KGFtb3VudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIElkZW50aWZ5IGluZGVudHMgd2hpbGUgc2tpcHBpbmcgc2luZ2xlIHNwYWNlIGluZGVudHMgdG8gYXZvaWQgY29tbW9uIGVkZ2UgY2FzZXMgKGUuZy4gY29kZSBjb21tZW50cylcblx0Ly8gSWYgbm8gaW5kZW50cyBhcmUgaWRlbnRpZmllZCwgcnVuIGFnYWluIGFuZCBpbmNsdWRlIGFsbCBpbmRlbnRzIGZvciBjb21wcmVoZW5zaXZlIGRldGVjdGlvblxuXHRsZXQgaW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgdHJ1ZSk7XG5cdGlmIChpbmRlbnRzLnNpemUgPT09IDApIHtcblx0XHRpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBmYWxzZSk7XG5cdH1cblxuXHRjb25zdCBrZXlPZk1vc3RVc2VkSW5kZW50ID0gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cyk7XG5cblx0bGV0IHR5cGU7XG5cdGxldCBhbW91bnQgPSAwO1xuXHRsZXQgaW5kZW50ID0gJyc7XG5cblx0aWYgKGtleU9mTW9zdFVzZWRJbmRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdCh7dHlwZSwgYW1vdW50fSA9IGRlY29kZUluZGVudHNLZXkoa2V5T2ZNb3N0VXNlZEluZGVudCkpO1xuXHRcdGluZGVudCA9IG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YW1vdW50LFxuXHRcdHR5cGUsXG5cdFx0aW5kZW50LFxuXHR9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRjb25zdCBuZXdsaW5lcyA9IHN0cmluZy5tYXRjaCgvKD86XFxyP1xcbikvZykgfHwgW107XG5cblx0aWYgKG5ld2xpbmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNybGYgPSBuZXdsaW5lcy5maWx0ZXIobmV3bGluZSA9PiBuZXdsaW5lID09PSAnXFxyXFxuJykubGVuZ3RoO1xuXHRjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG5cblx0cmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lR3JhY2VmdWwoc3RyaW5nKSB7XG5cdHJldHVybiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0TmV3bGluZShzdHJpbmcpKSB8fCAnXFxuJztcbn1cbiIsIiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS93aXJlaXRcbmNvbnN0IHdpcmVpdFNjcmlwdFByb3BlcnRpZXMgPSBbJ2NvbW1hbmQnLCAnZGVwZW5kZW5jaWVzJywgJ2ZpbGVzJywgJ291dHB1dCddXG5jb25zdCBzb3J0V2lyZWl0U2NyaXB0ID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeSh3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdkZXBlbmRlbmNpZXMnLFxuICAgIG9uQXJyYXkoKGRlcHMpID0+IGRlcHMubWFwKHNvcnRPYmplY3RCeShbJ3NjcmlwdCcsICdjYXNjYWRlJ10pKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZW52JyxcbiAgICBvbk9iamVjdCgoZW52KSA9PlxuICAgICAgc29ydE9iamVjdEtleXMoXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhlbnYpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBzb3J0T2JqZWN0QnkoWydleHRlcm5hbCcsICdkZWZhdWx0J10pKHZhbHVlKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdzZXJ2aWNlJyxcbiAgICBwaXBlKFtzb3J0T2JqZWN0QnkoWydyZWFkeVdoZW4nXSksIG92ZXJQcm9wZXJ0eSgncmVhZHlXaGVuJywgc29ydE9iamVjdCldKSxcbiAgKSxcbl0pXG5jb25zdCBzb3J0V2lyZWl0ID0gb25PYmplY3QoKHdpcmVpdCkgPT5cbiAgc29ydE9iamVjdEtleXMoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMod2lyZWl0KS5tYXAoKFtuYW1lLCBjb25maWddKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNvcnRXaXJlaXRTY3JpcHQoY29uZmlnKSxcbiAgICAgIF0pLFxuICAgICksXG4gICksXG4pXG5jb25zdCBzb3J0RGV2RW5naW5lcyA9IG92ZXJQcm9wZXJ0eShcbiAgJ3BhY2thZ2VNYW5hZ2VyJyxcbiAgc29ydE9iamVjdEJ5KFsnbmFtZScsICd2ZXJzaW9uJywgJ29uRmFpbCddKSxcbilcblxuY29uc3QgcG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAncGVlckRlcGVuZGVuY3lSdWxlcycsXG4gICduZXZlckJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXNGaWxlJyxcbiAgJ2FsbG93ZWREZXByZWNhdGVkVmVyc2lvbnMnLFxuICAnYWxsb3dOb25BcHBsaWVkUGF0Y2hlcycsXG4gICd1cGRhdGVDb25maWcnLFxuICAnYXVkaXRDb25maWcnLFxuICAncmVxdWlyZWRTY3JpcHRzJyxcbiAgJ3N1cHBvcnRlZEFyY2hpdGVjdHVyZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ3BhdGNoZWREZXBlbmRlbmNpZXMnLFxuICAncGFja2FnZUV4dGVuc2lvbnMnLFxuXVxuXG5jb25zdCBzb3J0UG5wbUNvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkocG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzLCB0cnVlKSxcbiAgb3ZlclByb3BlcnR5KCdvdmVycmlkZXMnLCBzb3J0T2JqZWN0QnlTZW12ZXIpLFxuXSlcblxuLy8gU2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vbWlzYy9zY3JpcHRzXG5jb25zdCBkZWZhdWx0TnBtU2NyaXB0cyA9IG5ldyBTZXQoW1xuICAnaW5zdGFsbCcsXG4gICdwYWNrJyxcbiAgJ3ByZXBhcmUnLFxuICAncHVibGlzaCcsXG4gICdyZXN0YXJ0JyxcbiAgJ3Nocmlua3dyYXAnLFxuICAnc3RhcnQnLFxuICAnc3RvcCcsXG4gICd0ZXN0JyxcbiAgJ3VuaW5zdGFsbCcsXG4gICd2ZXJzaW9uJyxcbl0pXG5cbmNvbnN0IGhhc0RldkRlcGVuZGVuY3kgPSAoZGVwZW5kZW5jeSwgcGFja2FnZUpzb24pID0+IHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLCAnZGV2RGVwZW5kZW5jaWVzJykgJiZcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcywgZGVwZW5kZW5jeSlcbiAgKVxufVxuXG5jb25zdCBydW5TUmVnRXhwID1cbiAgLyg/PD1efFtcXHMmOzw+fChdKSg/OnJ1bi1zfG5wbS1ydW4tYWxsMj8gLiooPzotLXNlcXVlbnRpYWx8LS1zZXJpYWx8LXMpKSg/PSR8W1xccyY7PD58KV0pL1xuXG5jb25zdCBpc1NlcXVlbnRpYWxTY3JpcHQgPSAoY29tbWFuZCkgPT5cbiAgY29tbWFuZC5pbmNsdWRlcygnKicpICYmIHJ1blNSZWdFeHAudGVzdChjb21tYW5kKVxuXG5jb25zdCBoYXNTZXF1ZW50aWFsU2NyaXB0ID0gKHBhY2thZ2VKc29uKSA9PiB7XG4gIGlmIChcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwnLCBwYWNrYWdlSnNvbikgJiZcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwyJywgcGFja2FnZUpzb24pXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IHNjcmlwdHMgPSBbJ3NjcmlwdHMnLCAnYmV0dGVyU2NyaXB0cyddLmZsYXRNYXAoKGZpZWxkKSA9PlxuICAgIHBhY2thZ2VKc29uW2ZpZWxkXSA/IE9iamVjdC52YWx1ZXMocGFja2FnZUpzb25bZmllbGRdKSA6IFtdLFxuICApXG4gIHJldHVybiBzY3JpcHRzLnNvbWUoKHNjcmlwdCkgPT4gaXNTZXF1ZW50aWFsU2NyaXB0KHNjcmlwdCkpXG59XG5cbmZ1bmN0aW9uIHNvcnRTY3JpcHROYW1lcyhrZXlzLCBwcmVmaXggPSAnJykge1xuICBjb25zdCBncm91cE1hcCA9IG5ldyBNYXAoKVxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgcmVzdCA9IHByZWZpeCA/IGtleS5zbGljZShwcmVmaXgubGVuZ3RoICsgMSkgOiBrZXlcbiAgICBjb25zdCBpZHggPSByZXN0LmluZGV4T2YoJzonKVxuICAgIGlmIChpZHggPiAwKSB7XG4gICAgICBjb25zdCBiYXNlID0ga2V5LnNsaWNlKDAsIChwcmVmaXggPyBwcmVmaXgubGVuZ3RoICsgMSA6IDApICsgaWR4KVxuICAgICAgaWYgKCFncm91cE1hcC5oYXMoYmFzZSkpIGdyb3VwTWFwLnNldChiYXNlLCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChiYXNlKS5wdXNoKGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cE1hcC5oYXMoa2V5KSkgZ3JvdXBNYXAuc2V0KGtleSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoa2V5KS5wdXNoKGtleSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBNYXAua2V5cygpKVxuICAgIC5zb3J0KClcbiAgICAuZmxhdE1hcCgoZ3JvdXBLZXkpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ3JvdXBNYXAuZ2V0KGdyb3VwS2V5KVxuICAgICAgaWYgKFxuICAgICAgICBjaGlsZHJlbi5sZW5ndGggPiAxICYmXG4gICAgICAgIGNoaWxkcmVuLnNvbWUoKGspID0+IGsgIT09IGdyb3VwS2V5ICYmIGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGlyZWN0ID0gY2hpbGRyZW5cbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiBrID09PSBncm91cEtleSB8fCAhay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IGNoaWxkcmVuLmZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgcmV0dXJuIFsuLi5kaXJlY3QsIC4uLnNvcnRTY3JpcHROYW1lcyhuZXN0ZWQsIGdyb3VwS2V5KV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZHJlbi5zb3J0KClcbiAgICB9KVxufVxuXG5jb25zdCBzb3J0U2NyaXB0cyA9IG9uT2JqZWN0KChzY3JpcHRzLCBwYWNrYWdlSnNvbikgPT4ge1xuICBsZXQgbmFtZXMgPSBPYmplY3Qua2V5cyhzY3JpcHRzKVxuICBjb25zdCBwcmVmaXhhYmxlID0gbmV3IFNldCgpXG5cbiAgbmFtZXMgPSBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICBjb25zdCBvbWl0dGVkID0gbmFtZS5yZXBsYWNlKC9eKD86cHJlfHBvc3QpLywgJycpXG4gICAgaWYgKGRlZmF1bHROcG1TY3JpcHRzLmhhcyhvbWl0dGVkKSB8fCBuYW1lcy5pbmNsdWRlcyhvbWl0dGVkKSkge1xuICAgICAgcHJlZml4YWJsZS5hZGQob21pdHRlZClcbiAgICAgIHJldHVybiBvbWl0dGVkXG4gICAgfVxuICAgIHJldHVybiBuYW1lXG4gIH0pXG5cbiAgaWYgKCFoYXNTZXF1ZW50aWFsU2NyaXB0KHBhY2thZ2VKc29uKSkge1xuICAgIG5hbWVzID0gc29ydFNjcmlwdE5hbWVzKG5hbWVzKVxuICB9XG4gIG5hbWVzID0gbmFtZXMuZmxhdE1hcCgoa2V5KSA9PlxuICAgIHByZWZpeGFibGUuaGFzKGtleSkgPyBbYHByZSR7a2V5fWAsIGtleSwgYHBvc3Qke2tleX1gXSA6IFtrZXldLFxuICApXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhzY3JpcHRzLCBuYW1lcylcbn0pXG5cbi8qXG4tIE1vdmUgYGRlZmF1bHRgIGNvbmRpdGlvbiB0byBib3R0b21cbiovXG5jb25zdCBzb3J0Q29uZGl0aW9ucyA9IChjb25kaXRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVmYXVsdENvbmRpdGlvbnMgPSBbXSwgcmVzdENvbmRpdGlvbnMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgY29uZGl0aW9ucyxcbiAgICAoY29uZGl0aW9uKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0Q29uZGl0aW9ucydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdyZXN0Q29uZGl0aW9ucydcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIFsuLi5yZXN0Q29uZGl0aW9ucywgLi4uZGVmYXVsdENvbmRpdGlvbnNdXG59XG5cbmNvbnN0IHNvcnRFeHBvcnRzID0gb25PYmplY3QoKGV4cG9ydHMpID0+IHtcbiAgY29uc3QgeyBwYXRocyA9IFtdLCBjb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnd2lyZWl0Jywgb3Zlcjogc29ydFdpcmVpdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdsMTBuJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjb250cmlidXRlcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnYWN0aXZhdGlvbkV2ZW50cycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdodXNreScsIG92ZXI6IG92ZXJQcm9wZXJ0eSgnaG9va3MnLCBzb3J0R2l0SG9va3MpIH0sXG4gIHsga2V5OiAnc2ltcGxlLWdpdC1ob29rcycsIG92ZXI6IHNvcnRHaXRIb29rcyB9LFxuICB7IGtleTogJ3ByZS1jb21taXQnIH0sXG4gIHsga2V5OiAnY29tbWl0bGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdsaW50LXN0YWdlZCcgfSxcbiAgeyBrZXk6ICduYW5vLXN0YWdlZCcgfSxcbiAgeyBrZXk6ICdjb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbm9kZW1vbkNvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2VyaWZ5Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2JhYmVsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJzbGlzdCcgfSxcbiAgeyBrZXk6ICd4bycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwcmV0dGllcicsIG92ZXI6IHNvcnRQcmV0dGllckNvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludENvbmZpZycsIG92ZXI6IHNvcnRFc2xpbnRDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRJZ25vcmUnIH0sXG4gIHsga2V5OiAnbnBtcGtnanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtUGFja2FnZUpzb25MaW50Q29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbXBhY2thZ2Vqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZWxlYXNlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbWFya0NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdzdHlsZWxpbnQnIH0sXG4gIHsga2V5OiAnYXZhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1qdW5pdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LXN0YXJlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21vY2hhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ255YycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdjOCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICd0YXAnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb2NsaWYnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ3Jlc29sdXRpb25zJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ292ZXJyaWRlcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGV2RGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0Qnkoc29ydE9iamVjdEJ5SWRlbnQsIHRydWUpIH0sXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgLy8gVE9ETzogb25seSBzb3J0IGRlcHRoID0gMlxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdvcHRpb25hbERlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdidW5kbGVkRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2J1bmRsZURlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uUGFjaycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2ZsYXQnIH0sXG4gIHsga2V5OiAncGFja2FnZU1hbmFnZXInIH0sXG4gIHsga2V5OiAnZW5naW5lcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdlbmdpbmVTdHJpY3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZGV2RW5naW5lcycsIG92ZXI6IHNvcnREZXZFbmdpbmVzIH0sXG4gIHsga2V5OiAndm9sdGEnLCBvdmVyOiBzb3J0Vm9sdGEgfSxcbiAgeyBrZXk6ICdsYW5ndWFnZU5hbWUnIH0sXG4gIHsga2V5OiAnb3MnIH0sXG4gIHsga2V5OiAnY3B1JyB9LFxuICB7IGtleTogJ3ByZWZlckdsb2JhbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwdWJsaXNoQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdpY29uJyB9LFxuICAvKiB2c2NvZGUgKi8ge1xuICAgIGtleTogJ2JhZGdlcycsXG4gICAgb3Zlcjogb25BcnJheSgoYmFkZ2UpID0+IGJhZGdlLm1hcChzb3J0VlNDb2RlQmFkZ2VPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZ2FsbGVyeUJhbm5lcicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHJldmlldycgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbWFya2Rvd24nIH0sXG4gIHsga2V5OiAncG5wbScsIG92ZXI6IHNvcnRQbnBtQ29uZmlnIH0sXG5dXG5cbmNvbnN0IGRlZmF1bHRTb3J0T3JkZXIgPSBmaWVsZHMubWFwKCh7IGtleSB9KSA9PiBrZXkpXG5jb25zdCBvdmVyRmllbGRzID0gcGlwZShcbiAgZmllbGRzXG4gICAgLm1hcCgoeyBrZXksIG92ZXIgfSkgPT4gKG92ZXIgPyBvdmVyUHJvcGVydHkoa2V5LCBvdmVyKSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbilcblxuZnVuY3Rpb24gZWRpdFN0cmluZ0pTT04oanNvbiwgb3Zlcikge1xuICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeyBpbmRlbnQsIHR5cGUgfSA9IGRldGVjdEluZGVudChqc29uKVxuICAgIGNvbnN0IGVuZENoYXJhY3RlcnMgPSBqc29uLnNsaWNlKC0xKSA9PT0gJ1xcbicgPyAnXFxuJyA6ICcnXG4gICAgY29uc3QgbmV3bGluZSA9IGRldGVjdE5ld2xpbmUoanNvbilcbiAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKVxuXG4gICAgbGV0IHJlc3VsdCA9XG4gICAgICBKU09OLnN0cmluZ2lmeShvdmVyKGpzb24pLCBudWxsLCB0eXBlID09PSAndGFiJyA/ICdcXHQnIDogaW5kZW50KSArXG4gICAgICBlbmRDaGFyYWN0ZXJzXG4gICAgaWYgKG5ld2xpbmUgPT09ICdcXHJcXG4nKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFxuL2csIG5ld2xpbmUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHJldHVybiBvdmVyKGpzb24pXG59XG5cbmZ1bmN0aW9uIHNvcnRQYWNrYWdlSnNvbihqc29uSXNoLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGVkaXRTdHJpbmdKU09OKFxuICAgIGpzb25Jc2gsXG4gICAgb25PYmplY3QoKGpzb24pID0+IHtcbiAgICAgIGxldCBzb3J0T3JkZXIgPSBvcHRpb25zLnNvcnRPcmRlciB8fCBkZWZhdWx0U29ydE9yZGVyXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvcnRPcmRlcikpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGpzb24pXG4gICAgICAgIGNvbnN0IHsgcHJpdmF0ZUtleXMgPSBbXSwgcHVibGljS2V5cyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIChrZXkpID0+IChrZXlbMF0gPT09ICdfJyA/ICdwcml2YXRlS2V5cycgOiAncHVibGljS2V5cycpLFxuICAgICAgICApXG4gICAgICAgIHNvcnRPcmRlciA9IFtcbiAgICAgICAgICAuLi5zb3J0T3JkZXIsXG4gICAgICAgICAgLi4uZGVmYXVsdFNvcnRPcmRlcixcbiAgICAgICAgICAuLi5wdWJsaWNLZXlzLnNvcnQoKSxcbiAgICAgICAgICAuLi5wcml2YXRlS2V5cy5zb3J0KCksXG4gICAgICAgIF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG92ZXJGaWVsZHMoc29ydE9iamVjdEtleXMoanNvbiwgc29ydE9yZGVyKSwganNvbilcbiAgICB9KSxcbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0UGFja2FnZUpzb25cbmV4cG9ydCB7IHNvcnRQYWNrYWdlSnNvbiwgZGVmYXVsdFNvcnRPcmRlciBhcyBzb3J0T3JkZXIgfVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc29ydFBhY2thZ2VKc29uIH0gZnJvbSAnc29ydC1wYWNrYWdlLWpzb24nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBvbGRUZXN0RGlyTmFtZSBvZiBbJ19fdGVzdHNfXycsICd0ZXN0cyddKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIG9sZFRlc3REaXJOYW1lKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgbW92ZVRlc3REaXJlY3Rvcnkob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgICAgICAgICAgc2NyaXB0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGRpZFVwZGF0ZVNjcmlwdCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtzY3JpcHROYW1lLCBzY3JpcHRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IHNjcmlwdC5yZXBsYWNlQWxsKG9sZFRlc3REaXJOYW1lLCAndGVzdCcpO1xuICAgICAgICAgICAgICBpZiAoc2NyaXB0ICE9PSBuZXdTY3JpcHQpIHtcbiAgICAgICAgICAgICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gbmV3U2NyaXB0O1xuICAgICAgICAgICAgICAgIGRpZFVwZGF0ZVNjcmlwdCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhY2thZ2VKc29uLnNjcmlwdHMgPSBzY3JpcHRzO1xuICAgICAgICAgICAgaWYgKCFkaWRVcGRhdGVTY3JpcHQpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihwYWNrYWdlSnNvbiksIHVuZGVmaW5lZCwgMikpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbW92ZVRlc3REaXJlY3Rvcnkob2xkVGVzdERpclBhdGg6IHN0cmluZywgbmV3VGVzdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobmV3VGVzdERpclBhdGgpKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIob2xkVGVzdERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZGlyZW50cy5tYXAoYXN5bmMgKGRpcmVudCkgPT4ge1xuICAgICAgY29uc3Qgb2xkUGF0aCA9IHBhdGguam9pbihvbGRUZXN0RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgY29uc3QgbmV3UGF0aCA9IHBhdGguam9pbihuZXdUZXN0RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgY29uc3QgbmV3UGF0aFN0YXQgPSBmcy5leGlzdHNTeW5jKG5ld1BhdGgpID8gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChuZXdQYXRoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBuZXdQYXRoU3RhdD8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBhd2FpdCBtb3ZlVGVzdERpcmVjdG9yeShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgIH0pXG4gICk7XG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKG9sZFRlc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IHVua25vd25bXSwgc291cmNlOiB1bmtub3duW10sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93bltdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChpc01lcmdlYWJsZU9iamVjdCh0YXJnZXRbaW5kZXhdLCBvcHRpb25zKSAmJiBpc01lcmdlYWJsZU9iamVjdChpdGVtLCBvcHRpb25zKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG5cbmZ1bmN0aW9uIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd24ge1xuICByZXR1cm4gaXNNZXJnZWFibGVPYmplY3QodmFsdWUsIG9wdGlvbnMpID8gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgLy8gcGFja2FnZS5qc29uLXN0eWxlIGtleXMgYXJlIG5vbi1hcnJheS1pbmRleCBrZXlzLCBzbyBKU09OLnN0cmluZ2lmeSBwcmVzZXJ2ZXMgdGhpcyBpbnNlcnRpb24gb3JkZXIuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICAvLyBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvcnQgdGhlIGtleXMgb2YgdGhlIG9iamVjdFxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZT86IHN0cmluZztcbiAgb24/OiBPbjtcbiAgY29uY3VycmVuY3k/OiBDb25jdXJyZW5jeTtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8c3RyaW5nLCBKb2I+O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgLy8gR2l0SHViIEFjdGlvbnMgdHJlYXRzIGBldmVudDogbnVsbGAgYXMgYSB2YWx1ZWxlc3MgZXZlbnQgbWFwcGluZywgZS5nLlxuICAvLyBgcHVsbF9yZXF1ZXN0OmAuIGB1bmRlZmluZWRgIHdvdWxkIG9taXQgdGhlIGV2ZW50IGVudGlyZWx5IHdoZW4gZHVtcGluZyBZQU1MLlxuICBpc3N1ZXM/OiBUeXBlcyB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0IHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzIHwgbnVsbDtcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICAncnVucy1vbic/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc3RlcHM/OiBTdGVwW107XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXAge1xuICB1c2VzPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJ1bj86IHN0cmluZztcbn1cblxuY29uc3QgcHVibGljUmVwb0F1dG9maXhXb3JrZmxvdzogV29ya2Zsb3cgPSB7XG4gIG5hbWU6ICdhdXRvZml4LmNpJyxcbiAgb246IHtcbiAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgcHVzaDoge1xuICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgIH0sXG4gIH0sXG4gIHBlcm1pc3Npb25zOiB7XG4gICAgY29udGVudHM6ICdyZWFkJyxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJ2F1dG9maXgtJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH0sXG4gIH0sXG59O1xuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBsaW50ZXIgZml4XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBwa2ctcHJlZmxpZ2h0IFBSIGZpbGUgbGlzdGluZ1xuICAgICAgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICd0ZXN0LXJ1c3QnOiB7XG4gICAgbmFtZTogJ1Rlc3QgUnVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd0ZXN0LXJ1c3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC1ydXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveScgfCAnYXV0b2ZpeCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICFpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGVudHJ5Lm5hbWUpKSBjb250aW51ZTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZW50cnkubmFtZSksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAuLi5lbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykgJiYgIWlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUoZGlyZW50Lm5hbWUpXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3Rlc3QtcnVzdC55bWwnKTtcbiAgICB9XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgLy8gVGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3cgYWxyZWFkeSBmaXhlcyBhbmQgcHVzaGVzIGNvZGUgb24gcHJpdmF0ZSByZXBvcyxcbiAgICAgIC8vIHNvIGEgc2VwYXJhdGUgYXV0b2ZpeCB3b3JrZmxvdyBvbmx5IGR1cGxpY2F0ZXMgdGhlIHNhbWUgcHJvY2Vzcy5cbiAgICAgIGZpbGVOYW1lU2V0LmRlbGV0ZSgnYXV0b2ZpeC55bWwnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2F1dG9maXgueW1sJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocmVwb3NpdG9yeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVwb3NpdG9yeT8uZW5kc1dpdGgoJy9yZXVzYWJsZS13b3JrZmxvd3MnKSA/PyBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXmdlbi1wcig/Oi0uKyk/XFwueWE/bWwkL3UudGVzdChmaWxlTmFtZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQSB0ZXN0LXJ1c3QueW1sIGluIGEgcmVwbyB3aXRob3V0IFJ1c3QgY29kZSBpcyBhIGN1c3RvbSB3b3JrZmxvdyB0aGF0IG1lcmVseSBzaGFyZXMgdGhlIG5hbWU7IGxlYXZlIGl0IGFsb25lLlxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcgJiYgY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShraW5kIGluIHdvcmtmbG93cyA/IHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdIDoge30pIGFzIFdvcmtmbG93O1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0Jykge1xuICAgIC8vIE1pZ3JhdGUgaGFuZC13cml0dGVuIFJ1c3Qgd29ya2Zsb3dzIChlLmcuIGFuIGlubGluZSBjYXJnby1jaGVjayBqb2IpIHRvIHRoZSByZXVzYWJsZSB3b3JrZmxvdy5cbiAgICBmb3IgKGNvbnN0IFtqb2JOYW1lLCBqb2JdIG9mIE9iamVjdC5lbnRyaWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9ic1tqb2JOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICB9XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIE1vdmUgam9icyB0byB0aGUgYm90dG9tXG4gICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnICYmIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZSAmJiBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMpIHtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMuYWN0aW9ucyA9ICd3cml0ZSc7XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGggPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoLnRyaWdnZXJfZGVwbG95X3dvcmtmbG93ID0gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCc7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IHVzZSByZWxlYXNlLnltbCBpZiByZWxlYXNlIGJyYW5jaCBpcyBub3Qgc3BlY2lmaWVkXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAncmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9uc1snaWQtdG9rZW4nXSA9ICd3cml0ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM/LlsnaWQtdG9rZW4nXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0JzpcbiAgICBjYXNlICd0ZXN0LXJ1c3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIC8vIFRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IG5vIGxvbmdlciBuZWVkcyBBY3Rpb25zIHdyaXRlIGFjY2Vzcy5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uYWN0aW9ucztcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcblxuICBpZiAoa2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICdyZWxlYXNlJykge1xuICAgIGpvYi5zZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICBpZiAoam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU4pIHtcbiAgICBqb2Iuc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFID0gJyR7eyBzZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgfX0nO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTjtcbiAgfVxuICBpZiAoXG4gICAgKGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSkgfHxcbiAgICAoam9iLndpdGguc2VydmVyX3VybCAmJiBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKVxuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMID0gJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFTEVBU0UgfX0nO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcpIHtcbiAgICBjb25zdCBbcnVzdERpclBhdGhdID0gY29uZmlnLmNhcmdvVG9tbERpclBhdGhzO1xuICAgIGlmIChydXN0RGlyUGF0aCAmJiBydXN0RGlyUGF0aCAhPT0gJy4nKSB7XG4gICAgICBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeSA9IHJ1c3REaXJQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLndpdGgud29ya2luZ19kaXJlY3Rvcnk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzLkZMWV9BUElfVE9LRU4gJiYgdHlwZW9mIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID0gam9iLndpdGguZGVwbG95X2NvbW1hbmQucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFdvcmtmbG93IHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY2JyB9LFxuICAgIHsgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NicsIHdpdGg6IHsgJ2NoZWNrLWxhdGVzdCc6IHRydWUsICdub2RlLXZlcnNpb24nOiAnbHRzLyonIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYyJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AYzViMmQ2N2FhMjI3NGU3YjVhMTgyMjRlODE3MTU1MDg3MWZjN2U0YScgfSk7XG5cbiAgY29uc3QgYXV0b2ZpeFdvcmtmbG93ID0gc3RydWN0dXJlZENsb25lKHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3cpO1xuICBjb25zdCBhdXRvZml4Sm9iID0gYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA/PyB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH07XG4gIGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPSB7IC4uLmF1dG9maXhKb2IsIHN0ZXBzIH07XG4gIHJldHVybiBhdXRvZml4V29ya2Zsb3c7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSByZW1vdmVUcmFpbGluZ1NwYWNlcyhcbiAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSwgbm9Db21wYXRNb2RlOiB0cnVlLCBzdHlsZXM6IHsgJyEhbnVsbCc6ICdlbXB0eScgfSB9KVxuICApO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVHJhaWxpbmdTcGFjZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8ganMteWFtbCBlbWl0cyB2YWx1ZWxlc3MgR2l0SHViIEFjdGlvbnMgZXZlbnRzIGFzIGBldmVudDogYCB3aGVuIHVzaW5nIHRoZSBlbXB0eSBudWxsIHN0eWxlLlxuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bIFxcdF0rJC9nbSwgJycpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0cycpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJ2NmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKD89XFxzfCQpL2csICdlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oPz1cXHMpL2csICdpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyljXFwuZlxcLi9nLCAnJDEvLyQyY2YuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pZWdcXC4vZywgJyQxLy8kMmUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylpZVxcLi9nLCAnJDEvLyQyaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuY29uc3Qgd2JEYXRhYmFzZUNvbW1hbmRSZWdleCA9IC9cXGJ3YlxccysoPzpkYnxwcmlzbWEpXFxiL2d1O1xuY29uc3QgbWF4VGV4dEZpbGVCeXRlcyA9IDEwMjQgKiAxMDI0O1xuY29uc3QgbWlncmF0aW9uVGFyZ2V0cyA9IFtcbiAgJyoqLyoue2NqcyxjdHMsanMsanNvbixqc3gsbWQsbWRjLG1qcyxtdHMsc2gsdHN4LHRzLHRvbWwsdHh0LHlhbWwseW1sfScsXG4gICcqKi8uZW52JyxcbiAgJyoqLy5lbnYuKicsXG4gICcqKi8uZ2l0aHViL3dvcmtmbG93cy8qJyxcbiAgJyoqLy5naXRpZ25vcmUnLFxuICAnKiovLmRvY2tlcmlnbm9yZScsXG4gICcqKi9Eb2NrZXJmaWxlJyxcbiAgJyoqL0RvY2tlcmZpbGUuKicsXG4gICcqKi9NYWtlZmlsZScsXG4gICcqKi9taXNlLnRvbWwnLFxuICAnKiovLm1pc2UudG9tbCcsXG4gICcqKi9sZWZ0aG9vay55bWwnLFxuICAnKiovcGFja2FnZS5qc29uJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhXYkRiQ29tbWFuZChyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocm9vdENvbmZpZy5yZXBvQXV0aG9yID09PSAnV2lsbEJvb3N0ZXInICYmIHJvb3RDb25maWcucmVwb05hbWUgPT09ICdzaGFyZWQnKSByZXR1cm47XG5cbiAgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2w8dm9pZD4oKTtcbiAgLy8gYHJ1bigpYCByZXNvbHZlcyBhZnRlciBhIHRhc2sgZW50ZXJzIHRoZSBwb29sLCB3aGlsZSBgcHJvbWlzZUFsbCgpYCB3YWl0c1xuICAvLyBmb3IgYWRtaXR0ZWQgdGFza3MgdG8gZmluaXNoLiBCb3RoIHdhaXRzIGFyZSBuZWVkZWQgdG8gY292ZXIgcXVldWVkIHdvcmsuXG4gIGNvbnN0IHJlcGxhY2VtZW50UHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBwYWNrYWdlQ29uZmlncykge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBzZWxlY3RXYkRhdGFiYXNlQ29tbWFuZChjb25maWcpO1xuICAgIGlmICghY29tbWFuZCkgY29udGludWU7XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZyhtaWdyYXRpb25UYXJnZXRzLCB7XG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBpZ25vcmU6IFsnKiovLmdpdC8qKicsIC4uLihjb25maWcuaXNSb290ID8gWydwYWNrYWdlcy8qKiddIDogW10pLCAuLi5nbG9iSWdub3JlXSxcbiAgICAgIG9ubHlGaWxlczogdHJ1ZSxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgcmVwbGFjZW1lbnRQcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiByZXBsYWNlV2JEYXRhYmFzZUNvbW1hbmQoZmlsZVBhdGgsIGNvbW1hbmQpKSk7XG4gICAgfVxuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKHJlcGxhY2VtZW50UHJvbWlzZXMpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICd3YiBkYicgfCAnd2IgcHJpc21hJyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuICd3YiBwcmlzbWEnO1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSByZXR1cm4gJ3diIGRiJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZVdiRGF0YWJhc2VDb21tYW5kKGZpbGVQYXRoOiBzdHJpbmcsIGNvbW1hbmQ6ICd3YiBkYicgfCAnd2IgcHJpc21hJyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZFRleHRGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgLy8gVGVtcG9yYXJ5IG1pZ3JhdGlvbjogbm9ybWFsaXplIGNvbW1hbmQgc3BlbGxpbmcgYnkgT1JNIHNvIFByaXNtYSBrZWVwcyB0aGVcbiAgLy8gbmF0aXZlIGNvbW1hbmQgbmFtZSB3aGlsZSBEcml6emxlIHVzZXMgdGhlIGdlbmVyaWMgZGF0YWJhc2UgY29tbWFuZC5cbiAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCh3YkRhdGFiYXNlQ29tbWFuZFJlZ2V4LCBjb21tYW5kKTtcbiAgaWYgKG5ld0NvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRleHRGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICBpZiAoc3RhdHMuc2l6ZSA+IG1heFRleHRGaWxlQnl0ZXMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYnVmZmVyID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICBpZiAoYnVmZmVyLmluY2x1ZGVzKDApKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcoJ3V0ZjgnKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICByZXR1cm4gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQudHJpbSgpIDogc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBIb3cgYSBgd3JhbmdsZXIgdHlwZXNgIGludm9jYXRpb24gcmVsYXRlcyB0byB0aGUgZGVmYXVsdCAuL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMgdGhhdCB3YmZ5IG1hbmFnZXM6XG4gKiAtIGByZXVzYWJsZUdlbmVyYXRvcmA6IHJlZ2VuZXJhdGVzIHRoZSBtYW5hZ2VkIGZpbGUgZnJvbSB0aGUgaW5wdXRzIHRoZSBtYW5hZ2VtZW50IGdhdGUgdmFsaWRhdGVkLCBzbyBpdCBjYW4gc2VydmVcbiAqICAgYXMgdGhlIHNoYXJlZCBnZW5lcmF0b3IgY29tbWFuZC5cbiAqIC0gYGRlZmF1bHRPdXRwdXRDb25mbGljdGA6IHdyaXRlcyB0aGUgbWFuYWdlZCBmaWxlIGZyb20gaW5wdXRzIHRoZSBnYXRlIGNhbm5vdCB2YWxpZGF0ZSAoYC0tY29uZmlnYCwgYC0tZW52YCxcbiAqICAgYC0tZW52LWZpbGVgKSwgc28gYSBtYW5hZ2VkIGZhbGxiYWNrIGdlbmVyYXRvciB3b3VsZCBmaWdodCBpdCBvdmVyIHRoZSBzYW1lIGZpbGUg4oCUIHdiZnkgbXVzdCBub3QgbWFuYWdlIHRoZVxuICogICBwYWNrYWdlIGF0IGFsbC5cbiAqIC0gYGhhcm1sZXNzYDogZ2VuZXJhdGVzIG5vdGhpbmcgKGAtLWNoZWNrYCwgYC0taGVscGAsIGAtLXZlcnNpb25gKSBvciB3cml0ZXMgYW5vdGhlciBmaWxlIChgLS1jd2RgLCBhIGN1c3RvbVxuICogICBwb3NpdGlvbmFsIG91dHB1dCBwYXRoKSwgc28gaXQgY2FuIGNvZXhpc3Qgd2l0aCB0aGUgbWFuYWdlZCBnZW5lcmF0b3IuXG4gKi9cbmV4cG9ydCB0eXBlIFdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uS2luZCA9ICdyZXVzYWJsZUdlbmVyYXRvcicgfCAnZGVmYXVsdE91dHB1dENvbmZsaWN0JyB8ICdoYXJtbGVzcyc7XG5cbmNvbnN0IHNjcmlwdFJ1bm5lckNvbW1hbmRzID0gbmV3IFNldChbJ3lhcm4nLCAnYnVuJywgJ25wbScsICdwbnBtJywgJ2J1bngnLCAnbnB4J10pO1xuY29uc3Qgc2NyaXB0V3JhcHBlclJ1bm5lckNvbW1hbmRzID0gbmV3IFNldChbJ3lhcm4nLCAnYnVuJywgJ25wbScsICdwbnBtJ10pO1xuLy8gRmxhZ3Mgb2YgYHdyYW5nbGVyIHR5cGVzYCB0aGF0IGNvbnN1bWUgdGhlIGZvbGxvd2luZyB0b2tlbiBhcyB0aGVpciB2YWx1ZTsgdW5rbm93biBzZXBhcmF0ZS12YWx1ZSBmbGFncyBtYWtlXG4vLyB0aGVpciB2YWx1ZSBsb29rIHBvc2l0aW9uYWwsIHdoaWNoIHNhZmVseSBkaXNxdWFsaWZpZXMgdGhlIGludm9jYXRpb24gaW5zdGVhZCBvZiBtaXNyZWFkaW5nIGl0cyBvdXRwdXQgcGF0aC5cbmNvbnN0IHdyYW5nbGVyVHlwZXNWYWx1ZUZsYWdzID0gbmV3IFNldChbJy0tZW52LWludGVyZmFjZSddKTtcblxuLyoqXG4gKiBXaGV0aGVyIHdiZnkgY2FuIG1hbmFnZSB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGZvciB0aGVzZSBzY3JpcHRzLCBhbmQgd2l0aCB3aGljaCBwcm9qZWN0LXNwZWNpZmljIGdlbmVyYXRvclxuICogY29tbWFuZC4gYGNvbmZsaWN0aW5nYCBpcyB0cnVlIHdoZW4gYSBzY3JpcHQgd3JpdGVzIHRoZSBtYW5hZ2VkIGRlZmF1bHQgZmlsZSBmcm9tIGlucHV0cyB0aGUgbWFuYWdlbWVudCBnYXRlXG4gKiBjYW5ub3QgdmFsaWRhdGUgKGUuZy4gYHdyYW5nbGVyIHR5cGVzIC1jIHdyYW5nbGVyLmpzb25jIC1jIC4uL2JvdW5kLXdvcmtlci93cmFuZ2xlci5qc29uY2AgZm9yIFJQQyB0eXBlcyDigJQgYVxuICogbWFuYWdlZCBmYWxsYmFjayBnZW5lcmF0b3Igd291bGQgb3ZlcndyaXRlIHRoYXQgcmljaGVyIG91dHB1dCksIG9yIHdoZW4gc2V2ZXJhbCBkaXN0aW5jdCBmbGFnZ2VkIGdlbmVyYXRvcnNcbiAqIGV4aXN0IGluIHRoZSBwcmVmZXJyZWQgc2NyaXB0IHdpdGggbm8gd2F5IHRvIGNob29zZSBvbmUgZGV0ZXJtaW5pc3RpY2FsbHkuIGBjb21tYW5kYCBpcyB0aGUgc2luZ2xlIGZsYWdnZWRcbiAqIGdlbmVyYXRvciB0byByZXVzZSwgcHJlZmVycmluZyB3aGF0IHBvc3RpbnN0YWxsIGFscmVhZHkgcnVucyAodGhhdCBpcyB3aGF0IHNoYXBlcyB0aGUgZmlsZSBhZnRlciBldmVyeVxuICogaW5zdGFsbCksIHRoZW4gZ2VuLWNvZGUsIHRoZW4gYW55IG90aGVyIHNjcmlwdDsgdW5kZWZpbmVkIG1lYW5zIHRoZSBtYW5hZ2VkIGRlZmF1bHQgY29tbWFuZCBhcHBsaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0UHJvamVjdFdyYW5nbGVyVHlwZXNHZW5lcmF0b3Ioc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHtcbiAgY29uZmxpY3Rpbmc6IGJvb2xlYW47XG4gIGNvbW1hbmQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0ge1xuICBjb25zdCBzY3JpcHRWYWx1ZXMgPSBPYmplY3QudmFsdWVzKHNjcmlwdHMpLmZpbHRlcigoc2NyaXB0KTogc2NyaXB0IGlzIHN0cmluZyA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyk7XG4gIC8vIFNjYW5uZWQgb3ZlciB0aGUgY29udGV4dC1mcmVlIHNlZ21lbnRzOiBhbiBpbnZvY2F0aW9uIGFmdGVyIGEgcmVhbCBgY2RgIHdyaXRlcyBhbm90aGVyIGRpcmVjdG9yeSdzIGZpbGVcbiAgLy8gYW5kIG11c3Qgbm90IGRpc2FibGUgbWFuYWdlbWVudCBvZiB0aGlzIHBhY2thZ2UuXG4gIGNvbnN0IGNvbmZsaWN0aW5nID0gc2NyaXB0VmFsdWVzLnNvbWUoXG4gICAgKHNjcmlwdCkgPT5cbiAgICAgIGNvbnRleHRGcmVlQ29tbWFuZFNlZ21lbnRzKHNjcmlwdCkuc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBpbnZvY2F0aW9uQXJncyA9IHBhcnNlV3JhbmdsZXJUeXBlc0ludm9jYXRpb24oc2VnbWVudCk7XG4gICAgICAgIGlmIChpbnZvY2F0aW9uQXJncykgcmV0dXJuIGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAnZGVmYXVsdE91dHB1dENvbmZsaWN0JztcbiAgICAgICAgcmV0dXJuIGlzVW5tb2RlbGVkV3JhbmdsZXJUeXBlc1NlZ21lbnQoc2VnbWVudCwgc2NyaXB0cyk7XG4gICAgICB9KSB8fCBoYXNOb25UcmFuc3BsYW50YWJsZUdlbmVyYXRvclBpcGVsaW5lKHNjcmlwdCwgc2NyaXB0cylcbiAgKTtcbiAgY29uc3QgcHJlZmVycmVkQ2FuZGlkYXRlcyA9IFtcbiAgICBjb2xsZWN0UmV1c2FibGVHZW5lcmF0b3JTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsLCBzY3JpcHRzKSxcbiAgICBjb2xsZWN0UmV1c2FibGVHZW5lcmF0b3JTZWdtZW50cyhzY3JpcHRzWydnZW4tY29kZSddLCBzY3JpcHRzKSxcbiAgICBzY3JpcHRWYWx1ZXMuZmxhdE1hcCgoc2NyaXB0KSA9PiBjb2xsZWN0UmV1c2FibGVHZW5lcmF0b3JTZWdtZW50cyhzY3JpcHQsIHNjcmlwdHMpKSxcbiAgXS5maW5kKChjYW5kaWRhdGVzKSA9PiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApO1xuICAvLyBOb3JtYWxpemVkIG9ubHkgYXMgdGhlIGRlZHVwbGljYXRpb24ga2V5OiByZXdyaXRpbmcgd2hpdGVzcGFjZSBpbiB0aGUgY29tbWFuZCBpdHNlbGYgd291bGQgY2hhbmdlIHF1b3RlZFxuICAvLyB2YWx1ZXMgKGUuZy4gYSByZWRpcmVjdGlvbiB0YXJnZXQgd2l0aCBkb3VibGVkIHNwYWNlcykuXG4gIGNvbnN0IGRpc3RpbmN0Q29tbWFuZHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgcHJlZmVycmVkQ2FuZGlkYXRlcyA/PyBbXSkge1xuICAgIGNvbnN0IGtleSA9IHRva2VuaXplQ29tbWFuZFNlZ21lbnQoc2VnbWVudCkuam9pbignICcpO1xuICAgIGlmICghZGlzdGluY3RDb21tYW5kcy5oYXMoa2V5KSkgZGlzdGluY3RDb21tYW5kcy5zZXQoa2V5LCBzZWdtZW50KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbmZsaWN0aW5nOiBjb25mbGljdGluZyB8fCBkaXN0aW5jdENvbW1hbmRzLnNpemUgPiAxLFxuICAgIGNvbW1hbmQ6IGRpc3RpbmN0Q29tbWFuZHMuc2l6ZSA9PT0gMSA/IFsuLi5kaXN0aW5jdENvbW1hbmRzLnZhbHVlcygpXVswXSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBzY3JpcHQgcGFpcnMgYSByZXVzYWJsZSBnZW5lcmF0b3Igd2l0aCBwcmVyZXF1aXNpdGUgc2VnbWVudHMgdGhlIG1hbmFnZWQgc2NyaXB0cyBjb3VsZCBub3RcbiAqIHRyYW5zcGxhbnQgKGUuZy4gYG5vZGUgc2NyaXB0cy9wcmVwYXJlLmpzICYmIHdyYW5nbGVyIHR5cGVzIC0tc3RyaWN0LXZhcnM9ZmFsc2VgKTogcmV1c2luZyBvbmx5IHRoZSBnZW5lcmF0b3JcbiAqIHNlZ21lbnQgd291bGQgYnlwYXNzIHRoZSBwcmVyZXF1aXNpdGVzIGluIGdlbi1jb2RlIGFuZCBvbiBmcmVzaCBpbnN0YWxscywgc28gc3VjaCBwYWNrYWdlcyBzdGF5IHVubWFuYWdlZC5cbiAqL1xuZnVuY3Rpb24gaGFzTm9uVHJhbnNwbGFudGFibGVHZW5lcmF0b3JQaXBlbGluZShzY3JpcHQ6IHN0cmluZywgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdtZW50cyA9IGNvbnRleHRGcmVlQ29tbWFuZFNlZ21lbnRzKHNjcmlwdCk7XG4gIC8vIEJhcmUgZ2VuZXJhdG9ycyBhbmQgd3JhcHBlci1yZWFjaGVkIGdlbmVyYXRvcnMgZm9ybSBwaXBlbGluZXMgdG9vOiBhIHByZXBhcmF0aW9uIHN0ZXAgdGhhdCBjcmVhdGVzXG4gIC8vIC5kZXYudmFycyBiZWZvcmUgYHdyYW5nbGVyIHR5cGVzYCBtdXN0IG5vdCBiZSBieXBhc3NlZCBlaXRoZXIuXG4gIGNvbnN0IGhhc1JldXNhYmxlR2VuZXJhdG9yID0gcmVhY2hlc1dyYW5nbGVyVHlwZXMoXG4gICAgc2NyaXB0LFxuICAgIHNjcmlwdHMsXG4gICAgKGludm9jYXRpb25BcmdzKSA9PiBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGludm9jYXRpb25BcmdzKSA9PT0gJ3JldXNhYmxlR2VuZXJhdG9yJ1xuICApO1xuICBpZiAoIWhhc1JldXNhYmxlR2VuZXJhdG9yKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50KSA9PlxuICAgICAgc2VnbWVudCAhPT0gJycgJiZcbiAgICAgICFpc01hbmFnZWRHZW5Db2RlU2VnbWVudChzZWdtZW50LCBzY3JpcHRzKSAmJlxuICAgICAgIXBhcnNlV3JhbmdsZXJUeXBlc0ludm9jYXRpb24oc2VnbWVudCkgJiZcbiAgICAgICFyZWFjaGVzV3JhbmdsZXJUeXBlcyhzZWdtZW50LCBzY3JpcHRzLCAoKSA9PiB0cnVlKVxuICApO1xufVxuXG4vKiogVGhlIGZsYWdnZWQgcmV1c2FibGUtZ2VuZXJhdG9yIHNlZ21lbnRzIHRoZSBzY3JpcHQgcmVhY2hlcywgZGlyZWN0bHkgb3IgdGhyb3VnaCB3cmFwcGVyIHNjcmlwdHMuICovXG5mdW5jdGlvbiBjb2xsZWN0UmV1c2FibGVHZW5lcmF0b3JTZWdtZW50cyhcbiAgc2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHZpc2l0ZWRTY3JpcHROYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoIXNjcmlwdCkgcmV0dXJuIHNlZ21lbnRzO1xuICByZWFjaGVzV3JhbmdsZXJUeXBlcyhcbiAgICBzY3JpcHQsXG4gICAgc2NyaXB0cyxcbiAgICAoaW52b2NhdGlvbkFyZ3MsIHNlZ21lbnQpID0+IHtcbiAgICAgIGlmIChpbnZvY2F0aW9uQXJncy5sZW5ndGggPiAwICYmIGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InKSB7XG4gICAgICAgIC8vIFdpdGhvdXQgdGhlIHRyYWlsaW5nIGNvbW1lbnQ6IGEgcmV1c2VkIGAuLi4gIyBub3RlYCB3b3VsZCBzd2FsbG93IGFueXRoaW5nIGNvbXBvc2VkIGFmdGVyIGl0LlxuICAgICAgICBzZWdtZW50cy5wdXNoKHN0cmlwVHJhaWxpbmdDb21tZW50KHNlZ21lbnQpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTsgLy8ga2VlcCBjb2xsZWN0aW5nIGluc3RlYWQgb2Ygc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG1hdGNoXG4gICAgfSxcbiAgICB2aXNpdGVkU2NyaXB0TmFtZXNcbiAgKTtcbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHBhY2thZ2UncyBpbnN0YWxsIHBpcGVsaW5lIHJlZ2VuZXJhdGVzIHRoZSBtYW5hZ2VkIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMsIGRpcmVjdGx5IG9yIHRocm91Z2hcbiAqIHdyYXBwZXIgc2NyaXB0cy4gVW50cmFja2luZyB0aGUgZmlsZSBpcyBzYWZlIG9ubHkgd2hlbiB0aGlzIGhvbGRzIGZvciB0aGUgZmluYWwgZ2VuZXJhdGVkIHNjcmlwdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3N0aW5zdGFsbEdlbmVyYXRlc1dvcmtlclR5cGVzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlYWNoZXNXcmFuZ2xlclR5cGVzKFxuICAgIHNjcmlwdHMucG9zdGluc3RhbGwsXG4gICAgc2NyaXB0cyxcbiAgICAoaW52b2NhdGlvbkFyZ3MpID0+IGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InXG4gICk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgc2NyaXB0IHJlYWNoZXMgYSBgd3JhbmdsZXIgdHlwZXNgIGludm9jYXRpb24gc2F0aXNmeWluZyB0aGUgcHJlZGljYXRlLCBkaXJlY3RseSBvciB0aHJvdWdoIHRoZVxuICogcGFja2FnZSBzY3JpcHRzIGl0IGludm9rZXMgKGUuZy4gYFwicG9zdGluc3RhbGxcIjogXCJ5YXJuIGdlbjp0eXBlc1wiYCwgd2l0aCBydW5uZXIgZmxhZ3MgYW5kIGVudmlyb25tZW50XG4gKiBhc3NpZ25tZW50cyBhbGxvd2VkIGFyb3VuZCB0aGUgc2NyaXB0IG5hbWUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhY2hlc1dyYW5nbGVyVHlwZXMoXG4gIHNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBwcmVkaWNhdGU6IChpbnZvY2F0aW9uQXJnczogc3RyaW5nW10sIHNlZ21lbnQ6IHN0cmluZykgPT4gYm9vbGVhbixcbiAgdmlzaXRlZFNjcmlwdE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KClcbik6IGJvb2xlYW4ge1xuICBpZiAoIXNjcmlwdCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgY29udGV4dEZyZWVDb21tYW5kU2VnbWVudHMoc2NyaXB0KSkge1xuICAgIGNvbnN0IGludm9jYXRpb25BcmdzID0gcGFyc2VXcmFuZ2xlclR5cGVzSW52b2NhdGlvbihzZWdtZW50KTtcbiAgICBpZiAoaW52b2NhdGlvbkFyZ3MgJiYgcHJlZGljYXRlKGludm9jYXRpb25BcmdzLCBzZWdtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVDb21tYW5kU2VnbWVudChzZWdtZW50KTtcbiAgICBsZXQgaW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnMpO1xuICAgIGxldCBpbnZva2VkU2NyaXB0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChzY3JpcHRXcmFwcGVyUnVubmVyQ29tbWFuZHMuaGFzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgbGV0IHJ1bm5lckZsYWdzID0gY29uc3VtZVJ1bm5lckZsYWdzKHRva2VucywgaW5kZXgpO1xuICAgICAgaWYgKFsncnVuJywgJ3J1bi1zY3JpcHQnXS5pbmNsdWRlcyh0b2tlbnNbcnVubmVyRmxhZ3MuaW5kZXhdID8/ICcnKSkge1xuICAgICAgICBydW5uZXJGbGFncyA9IGNvbnN1bWVSdW5uZXJGbGFncyh0b2tlbnMsIHJ1bm5lckZsYWdzLmluZGV4ICsgMSwgcnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSk7XG4gICAgICB9XG4gICAgICAvLyBBIHJ1bm5lciBkaXJlY3RlZCBhdCBhbm90aGVyIGRpcmVjdG9yeSAoZS5nLiBgeWFybiAtLWN3ZCAuLi9vdGhlciBnZW4tdHlwZXNgKSBydW5zIHRoYXQgcGFja2FnZSdzXG4gICAgICAvLyBzY3JpcHQsIG5vdCBvbmUgb2YgdGhlc2U7IGZvcndhcmRlZCBhcmd1bWVudHMgKGBucG0gcnVuIGdlbi10eXBlcyAtLSAtLWNoZWNrYCkgY2hhbmdlIHRoZSBlZmZlY3RpdmVcbiAgICAgIC8vIGludm9jYXRpb24sIHNvIHRoZSB3cmFwcGVyIGNhbm5vdCBzdGFuZCBmb3IgdGhlIHBsYWluIHNjcmlwdCBlaXRoZXIuXG4gICAgICBpbnZva2VkU2NyaXB0TmFtZSA9XG4gICAgICAgIHJ1bm5lckZsYWdzLmxlYXZlc1BhY2thZ2UgfHwgdG9rZW5zLmxlbmd0aCA+IHJ1bm5lckZsYWdzLmluZGV4ICsgMSA/IHVuZGVmaW5lZCA6IHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF07XG4gICAgfVxuICAgIGlmICghaW52b2tlZFNjcmlwdE5hbWUgfHwgdmlzaXRlZFNjcmlwdE5hbWVzLmhhcyhpbnZva2VkU2NyaXB0TmFtZSkpIGNvbnRpbnVlO1xuICAgIHZpc2l0ZWRTY3JpcHROYW1lcy5hZGQoaW52b2tlZFNjcmlwdE5hbWUpO1xuICAgIGNvbnN0IGludm9rZWRTY3JpcHQgPSBzY3JpcHRzW2ludm9rZWRTY3JpcHROYW1lXTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaW52b2tlZFNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHJlYWNoZXNXcmFuZ2xlclR5cGVzKGludm9rZWRTY3JpcHQsIHNjcmlwdHMsIHByZWRpY2F0ZSwgdmlzaXRlZFNjcmlwdE5hbWVzKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUaGUgY29tbWFuZCBzZWdtZW50cyBvZiBhIHNjcmlwdCB0aGF0IHJ1biBpbiB0aGUgcGFja2FnZSBkaXJlY3Rvcnk6IHNlZ21lbnRzIGFmdGVyIGEgYGNkYCAoZXhjZXB0IGxpdGVyYWxcbiAqIG5vLW9wcyBsaWtlIGBjZCAuYCkgZXhlY3V0ZSBzb21ld2hlcmUgZWxzZSwgc28gYSBgd3JhbmdsZXIgdHlwZXNgIHRoZXJlIGdlbmVyYXRlcyBhbm90aGVyIHBhY2thZ2UncyBmaWxlLCBub3RcbiAqIHRoaXMgb25lJ3MsIGFuZCBtdXN0IGJlIGludmlzaWJsZSB0byBldmVyeSBkZWNpc2lvbiBhYm91dCB0aGUgbWFuYWdlZCBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGV4dEZyZWVDb21tYW5kU2VnbWVudHMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc3BsaXRDb21tYW5kU2VnbWVudHMoc2NyaXB0KSkge1xuICAgIGlmIChpc0RpcmVjdG9yeUNoYW5nZShzZWdtZW50KSkge1xuICAgICAgaWYgKGlzTm9PcERpcmVjdG9yeUNoYW5nZShzZWdtZW50KSkgY29udGludWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgfVxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzY3JpcHQgbGVhdmVzIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSBhdCBzb21lIHBvaW50IChhbiBhcHBlbmRlZCBjb21tYW5kIHdvdWxkIHRoZW4gcnVuIGVsc2V3aGVyZSkuICovXG5leHBvcnQgZnVuY3Rpb24gc2NyaXB0Q2hhbmdlc1dvcmtpbmdEaXJlY3Rvcnkoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNwbGl0Q29tbWFuZFNlZ21lbnRzKHNjcmlwdCkuc29tZSgoc2VnbWVudCkgPT4gaXNEaXJlY3RvcnlDaGFuZ2Uoc2VnbWVudCkgJiYgIWlzTm9PcERpcmVjdG9yeUNoYW5nZShzZWdtZW50KSk7XG59XG5cbi8qKlxuICogU3BsaXQgYSBzaGVsbCBjb21tYW5kIGxpbmUgb24gYCYmYCBvdXRzaWRlIHF1b3RlczogYSBxdW90ZWQgYCYmYCAoZS5nLiBgZWNobyBcInNldHVwICYmIHdyYW5nbGVyIHR5cGVzIC4uLlwiYClcbiAqIGlzIGFyZ3VtZW50IHRleHQsIGFuZCBzcGxpdHRpbmcgaW5zaWRlIGl0IHdvdWxkIGZhYnJpY2F0ZSBhIGNvbW1hbmQgdGhhdCB3YXMgbmV2ZXIgcnVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRDb21tYW5kU2VnbWVudHMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9ICcnO1xuICBsZXQgcXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNjcmlwdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBzY3JpcHRbaW5kZXhdID8/ICcnO1xuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIHF1b3RlID09PSAnXCInKSB7XG4gICAgICAgIGN1cnJlbnQgKz0gY2hhcmFjdGVyICsgKHNjcmlwdFsrK2luZGV4XSA/PyAnJyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gcXVvdGUpIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gXCInXCIgfHwgY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoYXJhY3RlcjtcbiAgICAgIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcmJyAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gJyYnKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gIH1cbiAgc2VnbWVudHMucHVzaChjdXJyZW50LnRyaW0oKSk7XG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuZnVuY3Rpb24gaXNEaXJlY3RvcnlDaGFuZ2Uoc2VnbWVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplQ29tbWFuZFNlZ21lbnQoc2VnbWVudCk7XG4gIHJldHVybiB0b2tlbnNbc2tpcEVudmlyb25tZW50QXNzaWdubWVudHModG9rZW5zKV0gPT09ICdjZCc7XG59XG5cbmZ1bmN0aW9uIGlzTm9PcERpcmVjdG9yeUNoYW5nZShzZWdtZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVDb21tYW5kU2VnbWVudChzZWdtZW50KTtcbiAgbGV0IHRhcmdldEluZGV4ID0gc2tpcEVudmlyb25tZW50QXNzaWdubWVudHModG9rZW5zKSArIDE7XG4gIGlmICh0b2tlbnNbdGFyZ2V0SW5kZXhdID09PSAnLS0nKSB0YXJnZXRJbmRleCsrO1xuICAvLyBOb3JtYWxpemUgc3RhdGljIHNwZWxsaW5ncyBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKGAuYCwgYC4vYCwgYC4vLmAsIGAuLy4vYCwgLi4uKTsgYW55dGhpbmcgZWxzZVxuICAvLyAoaW5jbHVkaW5nIGEgYmFyZSBgY2RgLCB3aGljaCBnb2VzIHRvICRIT01FKSBjb3VudHMgYXMgYSByZWFsIGRpcmVjdG9yeSBjaGFuZ2UuXG4gIGxldCB0YXJnZXQgPSB1bnF1b3RlU2hlbGxUb2tlbih0b2tlbnNbdGFyZ2V0SW5kZXhdID8/ICcnKTtcbiAgd2hpbGUgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpKSB0YXJnZXQgPSB0YXJnZXQuc2xpY2UoMik7XG4gIGlmICh0YXJnZXQuZW5kc1dpdGgoJy8nKSkgdGFyZ2V0ID0gdGFyZ2V0LnNsaWNlKDAsIC0xKTtcbiAgcmV0dXJuIHRhcmdldCA9PT0gJy4nICYmIHRhcmdldEluZGV4ICsgMSA9PT0gdG9rZW5zLmxlbmd0aDtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHNlZ21lbnQganVzdCBydW5zIHRoZSBtYW5hZ2VkIGNvZGUgZ2VuZXJhdGlvbiAoYHdiIGdlbi1jb2RlYCwgb3IgYSBydW5uZXIgd3JhcHBlciBvZiBnZW4tY29kZSkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYW5hZ2VkR2VuQ29kZVNlZ21lbnQoc2VnbWVudDogc3RyaW5nLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplQ29tbWFuZFNlZ21lbnQoc2VnbWVudCk7XG4gIGxldCBpbmRleCA9IHNraXBFbnZpcm9ubWVudEFzc2lnbm1lbnRzKHRva2Vucyk7XG4gIGxldCBpc1J1blN1YmNvbW1hbmQgPSBmYWxzZTtcbiAgaWYgKHNjcmlwdFJ1bm5lckNvbW1hbmRzLmhhcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgIGluZGV4Kys7XG4gICAgbGV0IHJ1bm5lckZsYWdzID0gY29uc3VtZVJ1bm5lckZsYWdzKHRva2VucywgaW5kZXgpO1xuICAgIGlmIChbJ3J1bicsICdydW4tc2NyaXB0JywgJ2V4ZWMnLCAnZGx4JywgJ3gnXS5pbmNsdWRlcyh0b2tlbnNbcnVubmVyRmxhZ3MuaW5kZXhdID8/ICcnKSkge1xuICAgICAgaXNSdW5TdWJjb21tYW5kID0gWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpO1xuICAgICAgcnVubmVyRmxhZ3MgPSBjb25zdW1lUnVubmVyRmxhZ3ModG9rZW5zLCBydW5uZXJGbGFncy5pbmRleCArIDEsIHJ1bm5lckZsYWdzLmxlYXZlc1BhY2thZ2UpO1xuICAgIH1cbiAgICBpZiAocnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSkgcmV0dXJuIGZhbHNlO1xuICAgIGluZGV4ID0gcnVubmVyRmxhZ3MuaW5kZXg7XG4gIH1cbiAgLy8gRXhhY3QgbWF0Y2ggb25seTogYHdiIGdlbi1jb2RlIDsgd3JhbmdsZXIgdHlwZXMgLS1jb25maWcgLi4uYCBvciBgd2IgZ2VuLWNvZGUgLS1mbGFnYCBpcyBub3QgdGhlIHBsYWluXG4gIC8vIG1hbmFnZWQgaW52b2NhdGlvbiBhbmQgbXVzdCBub3QgYmUgZGlzY2FyZGVkIGFzIG9uZS4gQWZ0ZXIgYHJ1bmAvYHJ1bi1zY3JpcHRgIG9ubHkgYSBwYWNrYWdlLXNjcmlwdCBuYW1lXG4gIC8vIGZvbGxvd3MsIHNvIGBucG0gcnVuIHdiIGdlbi1jb2RlYCBpbnZva2VzIHRoZSBzY3JpcHQgY2FsbGVkIGB3YmAsIG5vdCB0aGUgd2IgYmluYXJ5LlxuICBpZiAoIWlzUnVuU3ViY29tbWFuZCAmJiB0b2tlbnNbaW5kZXhdID09PSAnd2InICYmIHRva2Vuc1tpbmRleCArIDFdID09PSAnZ2VuLWNvZGUnKSB7XG4gICAgcmV0dXJuIGluZGV4ICsgMiA9PT0gdG9rZW5zLmxlbmd0aDtcbiAgfVxuICBpZiAodG9rZW5zW2luZGV4XSAhPT0gJ2dlbi1jb2RlJyB8fCBpbmRleCArIDEgIT09IHRva2Vucy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgLy8gQSBnZW4tY29kZSB3cmFwcGVyIGlzIGludGVyY2hhbmdlYWJsZSB3aXRoIGB3YiBnZW4tY29kZWAgb25seSB3aGVuIHRoZSBnZW4tY29kZSBzY3JpcHQgaXRzZWxmIGlzIHRoZVxuICAvLyBtYW5hZ2VkIHBpcGVsaW5lIChgd2IgZ2VuLWNvZGVgIHBsdXMgcmV1c2FibGUgbWFuYWdlZCBnZW5lcmF0aW9uKTsgYSBjdXN0b20gcGlwZWxpbmUgYmVoaW5kIGl0IChlLmcuXG4gIC8vIGBub2RlIHNjcmlwdHMvcHJlcGFyZVR5cGVzLmpzICYmIHdyYW5nbGVyIHR5cGVzIC4uLmAgb3IgYSBjdXN0b20tY29uZmlnIGludm9jYXRpb24pIG11c3QgYmUgcHJlc2VydmVkXG4gIC8vIGluc3RlYWQgb2YgYmVpbmcgcmVwbGFjZWQgYnkgdGhlIGJhcmUgd2IgY29tbWFuZC5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IHNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGdlbkNvZGVTY3JpcHQgPT09ICdzdHJpbmcnICYmXG4gICAgY29udGV4dEZyZWVDb21tYW5kU2VnbWVudHMoZ2VuQ29kZVNjcmlwdCkuZXZlcnkoKGdlbkNvZGVTZWdtZW50KSA9PiB7XG4gICAgICBpZiAoZ2VuQ29kZVNlZ21lbnQgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IGdlbkNvZGVUb2tlbnMgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KGdlbkNvZGVTZWdtZW50KTtcbiAgICAgIGxldCBnZW5Db2RlSW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyhnZW5Db2RlVG9rZW5zKTtcbiAgICAgIGlmIChzY3JpcHRSdW5uZXJDb21tYW5kcy5oYXMoZ2VuQ29kZVRva2Vuc1tnZW5Db2RlSW5kZXhdID8/ICcnKSkgZ2VuQ29kZUluZGV4Kys7XG4gICAgICBpZiAoZ2VuQ29kZVRva2Vuc1tnZW5Db2RlSW5kZXhdID09PSAnd2InICYmIGdlbkNvZGVUb2tlbnNbZ2VuQ29kZUluZGV4ICsgMV0gPT09ICdnZW4tY29kZScpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgaW52b2NhdGlvbkFyZ3MgPSBwYXJzZVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGdlbkNvZGVTZWdtZW50KTtcbiAgICAgIHJldHVybiAhIWludm9jYXRpb25BcmdzICYmIGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24oaW52b2NhdGlvbkFyZ3MpID09PSAncmV1c2FibGVHZW5lcmF0b3InO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzY3JpcHQgdGV4dHVhbGx5IG1lbnRpb25zIGB3cmFuZ2xlciB0eXBlc2Agb3V0c2lkZSBxdW90ZXMsIHdoYXRldmVyIGl0cyBzaGVsbCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbnRpb25zV3JhbmdsZXJUeXBlcyhzY3JpcHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndyYW5nbGVyXFxzK3R5cGVzXFxiL3UudGVzdChzdHJpcFF1b3RlZFNwYW5zKHNjcmlwdCkpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHNlZ21lbnQgaW52b2x2ZXMgYHdyYW5nbGVyIHR5cGVzYCBpbiBhIHNoZWxsIGZvcm0gdGhlIHBhcnNlciBjYW5ub3QgZmFpdGhmdWxseSBtb2RlbDogYW4gdW5xdW90ZWRcbiAqIG1lbnRpb24gdGhhdCBkb2VzIG5vdCBwYXJzZSBhcyBhbiBpbnZvY2F0aW9uIChhIHN1YnNoZWxsLCBhIG5vbi1sb2NhbCBydW5uZXIsIGFyYml0cmFyeSBzaGVsbCBzeW50YXgpLCBhXG4gKiBzeW50YWN0aWNhbGx5IHF1b3RlZCBjb21tYW5kIHdvcmQgKGBcIndyYW5nbGVyXCIgdHlwZXNgIGV4ZWN1dGVzIHdyYW5nbGVyIGJ1dCBldmFkZXMgdG9rZW5pemF0aW9uKSwgb3IgYSB3cmFwcGVyXG4gKiBmb3J3YXJkaW5nIGV4dHJhIGFyZ3VtZW50cyAoYG5wbSBydW4gZ2VuLXR5cGVzIC0tIC0tY2hlY2tgKSB3aG9zZSB0YXJnZXQgaW52b2x2ZXMgYHdyYW5nbGVyIHR5cGVzYCDigJQgdGhlXG4gKiBmb3J3YXJkZWQgYXJndW1lbnRzIGNoYW5nZSB0aGUgZWZmZWN0aXZlIGludm9jYXRpb24uIFN1Y2ggc2VnbWVudHMgbWFrZSB0aGUgcGFja2FnZSB1bm1hbmFnZWFibGUgYW5kIG11c3QgYmVcbiAqIHByZXNlcnZlZCB2ZXJiYXRpbSB3aGVyZXZlciB3YmZ5IHJld3JpdGVzIHNjcmlwdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VubW9kZWxlZFdyYW5nbGVyVHlwZXNTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHZpc2l0ZWRTY3JpcHROYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4pOiBib29sZWFuIHtcbiAgaWYgKHBhcnNlV3JhbmdsZXJUeXBlc0ludm9jYXRpb24oc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgaWYgKG1lbnRpb25zV3JhbmdsZXJUeXBlcyhzZWdtZW50KSkgcmV0dXJuIHRydWU7XG4gIGlmICgvW1wiJ113cmFuZ2xlcltcIiddXFxzK3R5cGVzXFxifFxcYndyYW5nbGVyXFxzK1tcIidddHlwZXNbXCInXS91LnRlc3Qoc2VnbWVudCkpIHJldHVybiB0cnVlO1xuICAvLyBEb3VibGUgcXVvdGVzIGRvIG5vdCBzdXBwcmVzcyBjb21tYW5kIHN1YnN0aXR1dGlvbjogYGVjaG8gXCIkKHdyYW5nbGVyIHR5cGVzIC4uLilcImAgZXhlY3V0ZXMgd3JhbmdsZXIuXG4gIGlmICgvXFwkXFwofGAvdS50ZXN0KHN0cmlwU2luZ2xlUXVvdGVkU3BhbnMoc2VnbWVudCkpICYmIC9cXGJ3cmFuZ2xlclxccyt0eXBlc1xcYi91LnRlc3Qoc2VnbWVudCkpIHJldHVybiB0cnVlO1xuICAvLyBHbG9iYWwgb3B0aW9ucyBtYXkgcHJlY2VkZSB0aGUgc3ViY29tbWFuZCAoYHdyYW5nbGVyIC0tY29uZmlnIGFsdGVybmF0ZS5qc29uYyB0eXBlc2ApOyBhbnkgdW5wYXJzZWRcbiAgLy8gc2VnbWVudCBjYXJyeWluZyBib3RoIHdvcmRzIGNhbm5vdCBiZSBjbGFzc2lmaWVkLlxuICBjb25zdCB1bnF1b3RlZFRva2VucyA9IG5ldyBTZXQodG9rZW5pemVDb21tYW5kU2VnbWVudChzZWdtZW50KS5tYXAoKHRva2VuKSA9PiB1bnF1b3RlU2hlbGxUb2tlbih0b2tlbikpKTtcbiAgaWYgKHVucXVvdGVkVG9rZW5zLmhhcygnd3JhbmdsZXInKSAmJiB1bnF1b3RlZFRva2Vucy5oYXMoJ3R5cGVzJykpIHJldHVybiB0cnVlO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KHNlZ21lbnQpO1xuICBsZXQgaW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnMpO1xuICBpZiAoIXNjcmlwdFdyYXBwZXJSdW5uZXJDb21tYW5kcy5oYXModG9rZW5zW2luZGV4XSA/PyAnJykpIHJldHVybiBmYWxzZTtcbiAgaW5kZXgrKztcbiAgbGV0IHJ1bm5lckZsYWdzID0gY29uc3VtZVJ1bm5lckZsYWdzKHRva2VucywgaW5kZXgpO1xuICBpZiAoWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpKSB7XG4gICAgcnVubmVyRmxhZ3MgPSBjb25zdW1lUnVubmVyRmxhZ3ModG9rZW5zLCBydW5uZXJGbGFncy5pbmRleCArIDEsIHJ1bm5lckZsYWdzLmxlYXZlc1BhY2thZ2UpO1xuICB9XG4gIGNvbnN0IGludm9rZWRTY3JpcHROYW1lID0gdG9rZW5zW3J1bm5lckZsYWdzLmluZGV4XTtcbiAgY29uc3QgZm9yd2FyZHNBcmd1bWVudHMgPSB0b2tlbnMubGVuZ3RoID4gcnVubmVyRmxhZ3MuaW5kZXggKyAxO1xuICBpZiAocnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSB8fCAhaW52b2tlZFNjcmlwdE5hbWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZpc2l0ZWRTY3JpcHROYW1lcy5oYXMoaW52b2tlZFNjcmlwdE5hbWUpKSByZXR1cm4gZmFsc2U7XG4gIHZpc2l0ZWRTY3JpcHROYW1lcy5hZGQoaW52b2tlZFNjcmlwdE5hbWUpO1xuICBjb25zdCBpbnZva2VkU2NyaXB0ID0gc2NyaXB0c1tpbnZva2VkU2NyaXB0TmFtZV07XG4gIGlmICh0eXBlb2YgaW52b2tlZFNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgLy8gQSBwbGFpbiB3cmFwcGVyIG9mIGFuIHVubW9kZWxlZCB0YXJnZXQgaXMgaXRzZWxmIHVubW9kZWxlZDsgYSB3cmFwcGVyIGZvcndhcmRpbmcgYXJndW1lbnRzIGFkZGl0aW9uYWxseVxuICAvLyBjaGFuZ2VzIGFueSBtb2RlbGVkIHRhcmdldCdzIGVmZmVjdGl2ZSBpbnZvY2F0aW9uLCBzbyByZWFjaGluZyBvbmUgdGFpbnRzIGl0IHRvby5cbiAgcmV0dXJuIChcbiAgICBzcGxpdENvbW1hbmRTZWdtZW50cyhpbnZva2VkU2NyaXB0KS5zb21lKChpbnZva2VkU2VnbWVudCkgPT5cbiAgICAgIGlzVW5tb2RlbGVkV3JhbmdsZXJUeXBlc1NlZ21lbnQoaW52b2tlZFNlZ21lbnQsIHNjcmlwdHMsIHZpc2l0ZWRTY3JpcHROYW1lcylcbiAgICApIHx8XG4gICAgKGZvcndhcmRzQXJndW1lbnRzICYmIHJlYWNoZXNXcmFuZ2xlclR5cGVzKGludm9rZWRTY3JpcHQsIHNjcmlwdHMsICgpID0+IHRydWUsIG5ldyBTZXQodmlzaXRlZFNjcmlwdE5hbWVzKSkpXG4gICk7XG59XG5cbi8qKiBUb2tlbml6ZSBhIGNvbW1hbmQgc2VnbWVudCBvbiB3aGl0ZXNwYWNlIG91dHNpZGUgcXVvdGVzLCBzbyBxdW90ZWQgdmFsdWVzIChlLmcuIGBYPVwiYSBiXCJgKSBzdGF5IG9uZSB0b2tlbi4gKi9cbmZ1bmN0aW9uIHRva2VuaXplQ29tbWFuZFNlZ21lbnQoc2VnbWVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50ID0gJyc7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2VnbWVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBzZWdtZW50W2luZGV4XSA/PyAnJztcbiAgICBpZiAocXVvdGUpIHtcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJyAmJiBxdW90ZSA9PT0gJ1wiJykge1xuICAgICAgICBjdXJyZW50ICs9IGNoYXJhY3RlciArIChzZWdtZW50WysraW5kZXhdID8/ICcnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKC9cXHMvdS50ZXN0KGNoYXJhY3RlcikpIHtcbiAgICAgIGlmIChjdXJyZW50KSB0b2tlbnMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgfVxuICBpZiAoY3VycmVudCkgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBSZW1vdmUgcXVvdGVkIHNwYW5zIHNvIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIGluc2lkZSBhcmd1bWVudCB0ZXh0IGFyZSBub3QgbWlzdGFrZW4gZm9yIHN5bnRheC4gKi9cbmZ1bmN0aW9uIHN0cmlwUXVvdGVkU3BhbnMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NyaXB0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IHNjcmlwdFtpbmRleF0gPz8gJyc7XG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgcXVvdGUgPT09ICdcIicpIGluZGV4Kys7XG4gICAgICBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc3VsdCArPSBjaGFyYWN0ZXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIFJlbW92ZSBvbmx5IHNpbmdsZS1xdW90ZWQgc3BhbnM6IGRvdWJsZSBxdW90ZXMgZG8gbm90IHN1cHByZXNzIGNvbW1hbmQgc3Vic3RpdHV0aW9uIChgJCgpYCwgYmFja3RpY2tzKS4gKi9cbmZ1bmN0aW9uIHN0cmlwU2luZ2xlUXVvdGVkU3BhbnMoc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgY2hhcmFjdGVyIG9mIHNjcmlwdCkge1xuICAgIGlmIChpblNpbmdsZVF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIikgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICBpblNpbmdsZVF1b3RlID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBSZW1vdmUgc2hlbGwgcXVvdGUgZGVsaW1pdGVycywga2VlcGluZyB0aGVpciBjb250ZW50OiBgJy0tY29uZmlnJ2AgaGFzIHRoZSBhcmd1bWVudCB2YWx1ZSAtLWNvbmZpZy4gKi9cbmZ1bmN0aW9uIHVucXVvdGVTaGVsbFRva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW4ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gdG9rZW5baW5kZXhdID8/ICcnO1xuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIHF1b3RlID09PSAnXCInKSB7XG4gICAgICAgIHJlc3VsdCArPSB0b2tlblsrK2luZGV4XSA/PyAnJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBlbHNlIHJlc3VsdCArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gXCInXCIgfHwgY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoYXJhY3RlcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBDdXQgYSB0cmFpbGluZyB1bnF1b3RlZCBzaGVsbCBjb21tZW50IHNvIGNvbXBvc2luZyBmdXJ0aGVyIGNvbW1hbmRzIGFmdGVyIHRoZSBzZWdtZW50IHN0YXlzIGV4ZWN1dGFibGUuICovXG5mdW5jdGlvbiBzdHJpcFRyYWlsaW5nQ29tbWVudChzZWdtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNlZ21lbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gc2VnbWVudFtpbmRleF0gPz8gJyc7XG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgcXVvdGUgPT09ICdcIicpIGluZGV4Kys7XG4gICAgICBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcjJyAmJiAoaW5kZXggPT09IDAgfHwgL1xccy91LnRlc3Qoc2VnbWVudFtpbmRleCAtIDFdID8/ICcnKSkpIHtcbiAgICAgIHJldHVybiBzZWdtZW50LnNsaWNlKDAsIGluZGV4KS50cmltKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzZWdtZW50O1xufVxuXG4vKipcbiAqIFBhcnNlIGEgY29tbWFuZCBzZWdtZW50IGFzIGEgYHdyYW5nbGVyIHR5cGVzYCBpbnZvY2F0aW9uIGFuZCByZXR1cm4gaXRzIGFyZ3VtZW50cyAod2l0aCBzaGVsbCByZWRpcmVjdGlvbnNcbiAqIHN0cmlwcGVkKSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHNlZ21lbnQgcnVucyBzb21ldGhpbmcgZWxzZS4gUmVxdWlyaW5nIGNvbW1hbmQgcG9zaXRpb24gKGFmdGVyIGVudmlyb25tZW50XG4gKiBhc3NpZ25tZW50cyBhbmQgYSBydW5uZXIgcHJlZml4IHdpdGggaXRzIGZsYWdzLCBlLmcuIGBucHggLS15ZXNgKSBrZWVwcyBzaGVsbCB0ZXh0IHRoYXQgbWVyZWx5IG1lbnRpb25zIHRoZVxuICogd29yZHMgKGUuZy4gYGVjaG8gd3JhbmdsZXIgdHlwZXNgKSBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBnZW5lcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKHNlZ21lbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgLy8gQW4gdW5xdW90ZWQgbmV3bGluZSBzZXBhcmF0ZXMgY29tbWFuZHMgdGhlIHNlZ21lbnQgc3BsaXR0ZXIgZG9lcyBub3QgbW9kZWwuXG4gIGlmIChzdHJpcFF1b3RlZFNwYW5zKHNlZ21lbnQpLmluY2x1ZGVzKCdcXG4nKSkgcmV0dXJuO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUNvbW1hbmRTZWdtZW50KHNlZ21lbnQpO1xuICBsZXQgaW5kZXggPSBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnMpO1xuICBpZiAoc2NyaXB0UnVubmVyQ29tbWFuZHMuaGFzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgaW5kZXgrKztcbiAgICBsZXQgcnVubmVyRmxhZ3MgPSBjb25zdW1lUnVubmVyRmxhZ3ModG9rZW5zLCBpbmRleCk7XG4gICAgLy8gYHJ1bmAvYHJ1bi1zY3JpcHRgIG5hbWUgYSBwYWNrYWdlIHNjcmlwdCwgbmV2ZXIgYSBiaW5hcnk6IGBucG0gcnVuIHdyYW5nbGVyIHR5cGVzYCBpbnZva2VzIHRoZSBzY3JpcHRcbiAgICAvLyBjYWxsZWQgYHdyYW5nbGVyYCB3aXRoIGB0eXBlc2AgYXMgYW4gYXJndW1lbnQsIHNvIGl0IG11c3QgZ28gdGhyb3VnaCB3cmFwcGVyIHJlc29sdXRpb24gaW5zdGVhZC5cbiAgICBpZiAoWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpKSByZXR1cm47XG4gICAgaWYgKFsnZXhlYycsICdkbHgnLCAneCddLmluY2x1ZGVzKHRva2Vuc1tydW5uZXJGbGFncy5pbmRleF0gPz8gJycpKSB7XG4gICAgICBydW5uZXJGbGFncyA9IGNvbnN1bWVSdW5uZXJGbGFncyh0b2tlbnMsIHJ1bm5lckZsYWdzLmluZGV4ICsgMSwgcnVubmVyRmxhZ3MubGVhdmVzUGFja2FnZSk7XG4gICAgfVxuICAgIC8vIEEgcnVubmVyIGRpcmVjdGVkIGF0IGFub3RoZXIgZGlyZWN0b3J5IHJ1bnMgdGhhdCBwYWNrYWdlJ3Mgd3JhbmdsZXIsIG5vdCB0aGlzIG9uZSdzLlxuICAgIGlmIChydW5uZXJGbGFncy5sZWF2ZXNQYWNrYWdlKSByZXR1cm47XG4gICAgaW5kZXggPSBydW5uZXJGbGFncy5pbmRleDtcbiAgfVxuICBpZiAodG9rZW5zW2luZGV4XSAhPT0gJ3dyYW5nbGVyJyB8fCB0b2tlbnNbaW5kZXggKyAxXSAhPT0gJ3R5cGVzJykgcmV0dXJuO1xuXG4gIGNvbnN0IGludm9jYXRpb25BcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBhcmdJbmRleCA9IGluZGV4ICsgMjsgYXJnSW5kZXggPCB0b2tlbnMubGVuZ3RoOyBhcmdJbmRleCsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbYXJnSW5kZXhdID8/ICcnO1xuICAgIC8vIEEgdG9rZW4taW5pdGlhbCB1bnF1b3RlZCBgI2Agc3RhcnRzIGEgc2hlbGwgY29tbWVudDogZXZlcnl0aGluZyBhZnRlciBpdCBpcyBub3QgYW4gYXJndW1lbnQuXG4gICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJyMnKSkgYnJlYWs7XG4gICAgLy8gU2hlbGwgcmVkaXJlY3Rpb25zIChgPiAvZGV2L251bGxgLCBgMj4mMWAsIGA+PmxvZ2ApIGFyZSBub3Qgd3JhbmdsZXIgYXJndW1lbnRzOyBhIGJhcmUgb3BlcmF0b3IgYWxzb1xuICAgIC8vIGNvbnN1bWVzIHRoZSBmb2xsb3dpbmcgdG9rZW4gYXMgaXRzIHRhcmdldC5cbiAgICBjb25zdCByZWRpcmVjdGlvbk9wZXJhdG9yID0gL14oPzpcXGQrfCYpPyg/Oj4+P3w8KS91LmV4ZWModG9rZW4pPy5bMF07XG4gICAgaWYgKHJlZGlyZWN0aW9uT3BlcmF0b3IpIHtcbiAgICAgIGlmIChyZWRpcmVjdGlvbk9wZXJhdG9yID09PSB0b2tlbikgYXJnSW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpbnZvY2F0aW9uQXJncy5wdXNoKHRva2VuKTtcbiAgfVxuICByZXR1cm4gaW52b2NhdGlvbkFyZ3M7XG59XG5cbi8qKiBDbGFzc2lmeSB3aGF0IHRoZSBpbnZvY2F0aW9uIHdyaXRlczsgc2VlIFdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uS2luZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKGludm9jYXRpb25BcmdzOiBzdHJpbmdbXSk6IFdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uS2luZCB7XG4gIGxldCB3cml0ZXNFbHNld2hlcmUgPSBmYWxzZTtcbiAgbGV0IGNoYW5nZXNJbnB1dHMgPSBmYWxzZTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGludm9jYXRpb25BcmdzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHJhd0FyZyA9IGludm9jYXRpb25BcmdzW2luZGV4XSA/PyAnJztcbiAgICAvLyBVbnF1b3RlZCBzaGVsbCBtZXRhY2hhcmFjdGVycyAocGlwZXMsIHN1YnNoZWxscywgYDtgLCBhIGJhY2tncm91bmRpbmcgYCZgKSBhcmUgbm90IG1vZGVsZWQgYnkgdGhlXG4gICAgLy8gcGFyc2VyLCBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24gZXhlY3V0ZXMgZXZlbiBpbnNpZGUgZG91YmxlIHF1b3RlczsgY29uc2VydmF0aXZlbHkgdHJlYXQgc3VjaFxuICAgIC8vIGludm9jYXRpb25zIGFzIGNvbmZsaWN0aW5nLlxuICAgIGlmICgvWygpO3xgJl18XFwkXFwoL3UudGVzdChzdHJpcFF1b3RlZFNwYW5zKHJhd0FyZykpIHx8IC9cXCRcXCh8YC91LnRlc3Qoc3RyaXBTaW5nbGVRdW90ZWRTcGFucyhyYXdBcmcpKSkge1xuICAgICAgcmV0dXJuICdkZWZhdWx0T3V0cHV0Q29uZmxpY3QnO1xuICAgIH1cbiAgICAvLyBTaGVsbCBxdW90aW5nIGRvZXMgbm90IGNoYW5nZSBhbiBhcmd1bWVudCdzIHZhbHVlOiBgJy0tY29uZmlnJ2AgaXMgc3RpbGwgLS1jb25maWcuXG4gICAgY29uc3QgYXJnID0gdW5xdW90ZVNoZWxsVG9rZW4ocmF3QXJnKTtcbiAgICBjb25zdCBuZXh0QXJnID0gdW5xdW90ZVNoZWxsVG9rZW4oaW52b2NhdGlvbkFyZ3NbaW5kZXggKyAxXSA/PyAnJyk7XG4gICAgLy8gTm9uLWdlbmVyYXRpbmcgbW9kZXMgd3JpdGUgbm8gZmlsZSBhdCBhbGwsIHdoYXRldmVyIG90aGVyIGZsYWdzIHNheS4gVGhleSBhcmUgYm9vbGVhbiBvcHRpb25zOiBvbmx5XG4gICAgLy8gdGhlaXIgZW5hYmxlZCBmb3JtcyBzdXBwcmVzcyBnZW5lcmF0aW9uLCB3aGlsZSBgLS1jaGVjaz1mYWxzZWAgKG9yIGAtLWNoZWNrICdmYWxzZSdgKSBzdGlsbCB3cml0ZXMuXG4gICAgaWYgKC9eKD86LS1oZWxwfC1ofC0tdmVyc2lvbnwtdikoPzo9dHJ1ZSk/JC91LnRlc3QoYXJnKSAmJiBuZXh0QXJnICE9PSAnZmFsc2UnKSByZXR1cm4gJ2hhcm1sZXNzJztcbiAgICBpZiAoL14tLWNoZWNrKD86PXRydWUpPyQvdS50ZXN0KGFyZykgJiYgbmV4dEFyZyAhPT0gJ2ZhbHNlJykgcmV0dXJuICdoYXJtbGVzcyc7XG4gICAgaWYgKC9eKD86LS1jb25maWd8LWN8LS1lbnZ8LWV8LS1lbnYtZmlsZSkoPzo9LiopPyQvdS50ZXN0KGFyZykpIHtcbiAgICAgIGNoYW5nZXNJbnB1dHMgPSB0cnVlO1xuICAgICAgaWYgKCFhcmcuaW5jbHVkZXMoJz0nKSkgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoL14tLWN3ZCg/Oj0uKik/JC91LnRlc3QoYXJnKSkge1xuICAgICAgLy8gYC0tY3dkIC5gIHN0aWxsIHJ1bnMgaW4gdGhpcyBwYWNrYWdlJ3MgZGlyZWN0b3J5LCBzbyBpdCBzdGF5cyBhbiBvcmRpbmFyeSBsb2NhbCBpbnZvY2F0aW9uLlxuICAgICAgY29uc3QgY3dkVmFsdWUgPSBhcmcuaW5jbHVkZXMoJz0nKVxuICAgICAgICA/IGFyZy5zbGljZSgnLS1jd2Q9Jy5sZW5ndGgpXG4gICAgICAgIDogdW5xdW90ZVNoZWxsVG9rZW4oaW52b2NhdGlvbkFyZ3NbKytpbmRleF0gPz8gJycpO1xuICAgICAgaWYgKGN3ZFZhbHVlICE9PSAnLicgJiYgY3dkVmFsdWUgIT09ICcuLycpIHdyaXRlc0Vsc2V3aGVyZSA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHdyYW5nbGVyVHlwZXNWYWx1ZUZsYWdzLmhhcyhhcmcpKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAvLyBCb29sZWFuIG9wdGlvbnMgYWNjZXB0IGEgc3BhY2Utc2VwYXJhdGVkIGxpdGVyYWwgKGUuZy4gYC0tc3RyaWN0LXZhcnMgZmFsc2VgKSwgd2hpY2ggbXVzdCBub3QgYmVcbiAgICAgIC8vIG1pc3JlYWQgYXMgYSBwb3NpdGlvbmFsIG91dHB1dCBwYXRoLlxuICAgICAgaWYgKG5leHRBcmcgPT09ICd0cnVlJyB8fCBuZXh0QXJnID09PSAnZmFsc2UnKSBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGxldCBvdXRwdXRQYXRoID0gYXJnO1xuICAgIHdoaWxlIChvdXRwdXRQYXRoLnN0YXJ0c1dpdGgoJy4vJykpIG91dHB1dFBhdGggPSBvdXRwdXRQYXRoLnNsaWNlKDIpO1xuICAgIGlmIChvdXRwdXRQYXRoICE9PSAnd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cycpIHdyaXRlc0Vsc2V3aGVyZSA9IHRydWU7XG4gIH1cbiAgaWYgKHdyaXRlc0Vsc2V3aGVyZSkgcmV0dXJuICdoYXJtbGVzcyc7XG4gIGlmIChjaGFuZ2VzSW5wdXRzKSByZXR1cm4gJ2RlZmF1bHRPdXRwdXRDb25mbGljdCc7XG4gIHJldHVybiAncmV1c2FibGVHZW5lcmF0b3InO1xufVxuXG5mdW5jdGlvbiBza2lwRW52aXJvbm1lbnRBc3NpZ25tZW50cyh0b2tlbnM6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgaW5kZXgrKztcbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vLyBSdW5uZXIgb3B0aW9ucyB0aGF0IGNvbnN1bWUgdGhlIGZvbGxvd2luZyB0b2tlbiBhcyB0aGVpciB2YWx1ZTsgdGhlIGRpcmVjdG9yeS1jaGFuZ2luZyBvbmVzIG1ha2UgdGhlIHJ1bm5lclxuLy8gb3BlcmF0ZSBvbiBhbm90aGVyIHBhY2thZ2Ugd2hlbiB0aGUgdmFsdWUgaXMgbm90IHRoZSBwYWNrYWdlIGl0c2VsZiwgYW5kIHdvcmtzcGFjZS9maWx0ZXIgc2VsZWN0b3JzIGFsd2F5c1xuLy8gbWF5IChucG0gcnVucyBgLS13b3Jrc3BhY2U9b3RoZXJgIGNvbW1hbmRzIGluc2lkZSB0aGF0IHdvcmtzcGFjZSkuXG5jb25zdCBydW5uZXJEaXJlY3RvcnlWYWx1ZUZsYWdzID0gbmV3IFNldChbJy0tY3dkJywgJy1DJywgJy0tcHJlZml4JywgJy0tZGlyJ10pO1xuY29uc3QgcnVubmVyV29ya3NwYWNlVmFsdWVGbGFncyA9IG5ldyBTZXQoWyctdycsICctLXdvcmtzcGFjZScsICctRicsICctLWZpbHRlciddKTtcbi8vIEJhcmUgc2VsZWN0b3JzIHRoYXQgcnVuIHRoZSBjb21tYW5kIGluIGV2ZXJ5IHdvcmtzcGFjZSBpbnN0ZWFkIG9mIChvbmx5KSB0aGlzIHBhY2thZ2UuXG5jb25zdCBydW5uZXJBbGxXb3Jrc3BhY2VzRmxhZ3MgPSBuZXcgU2V0KFsnLS13b3Jrc3BhY2VzJywgJy13cycsICctLXJlY3Vyc2l2ZScsICctciddKTtcblxuZnVuY3Rpb24gY29uc3VtZVJ1bm5lckZsYWdzKFxuICB0b2tlbnM6IHN0cmluZ1tdLFxuICBpbmRleDogbnVtYmVyLFxuICBsZWF2ZXNQYWNrYWdlID0gZmFsc2Vcbik6IHsgaW5kZXg6IG51bWJlcjsgbGVhdmVzUGFja2FnZTogYm9vbGVhbiB9IHtcbiAgd2hpbGUgKCh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBjb25zdCBmbGFnID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICBpbmRleCsrO1xuICAgIGxldCBkaXJlY3RvcnlWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChydW5uZXJEaXJlY3RvcnlWYWx1ZUZsYWdzLmhhcyhmbGFnKSkge1xuICAgICAgZGlyZWN0b3J5VmFsdWUgPSB0b2tlbnNbaW5kZXhdO1xuICAgICAgaW5kZXgrKztcbiAgICB9IGVsc2UgaWYgKC9eKD86LS1jd2R8LS1wcmVmaXh8LS1kaXIpPS91LnRlc3QoZmxhZykpIHtcbiAgICAgIGRpcmVjdG9yeVZhbHVlID0gZmxhZy5zbGljZShmbGFnLmluZGV4T2YoJz0nKSArIDEpO1xuICAgIH0gZWxzZSBpZiAocnVubmVyV29ya3NwYWNlVmFsdWVGbGFncy5oYXMoZmxhZykpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBsZWF2ZXNQYWNrYWdlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKC9eKD86LXd8LS13b3Jrc3BhY2V8LUZ8LS1maWx0ZXIpPS91LnRlc3QoZmxhZykgfHwgcnVubmVyQWxsV29ya3NwYWNlc0ZsYWdzLmhhcyhmbGFnKSkge1xuICAgICAgbGVhdmVzUGFja2FnZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChkaXJlY3RvcnlWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGRpcmVjdG9yeVZhbHVlICE9PSAnLicgJiYgZGlyZWN0b3J5VmFsdWUgIT09ICcuLycpIGxlYXZlc1BhY2thZ2UgPSB0cnVlO1xuICB9XG4gIHJldHVybiB7IGluZGV4LCBsZWF2ZXNQYWNrYWdlIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgcG9zdGluc3RhbGxHZW5lcmF0ZXNXb3JrZXJUeXBlcyB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyVHlwZXNDb21tYW5kLmpzJztcblxuY29uc3Qgd29ya2VyVHlwZXNGaWxlTmFtZSA9ICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJztcblxuLyoqXG4gKiBTdG9wcyB0cmFja2luZyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGluIENsb3VkZmxhcmUgcHJvamVjdHMgdGhhdCBjb21taXR0ZWQgaXQgYmVmb3JlIC5naXRpZ25vcmUgY292ZXJlZCBpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVudHJhY2tXb3JrZXJUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCd1bnRyYWNrV29ya2VyVHlwZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gLmdpdGlnbm9yZSBpcyBpZ25vcmVkIGZvciBhbHJlYWR5LXRyYWNrZWQgZmlsZXMsIHNvIGEgY29tbWl0dGVkIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgd291bGQga2VlcFxuICAgIC8vIHByb2R1Y2luZyBhIGh1Z2UgZGlmZiBvbiBldmVyeSB3cmFuZ2xlciBidW1wIGRlc3BpdGUgYmVpbmcgcmVnZW5lcmF0ZWQgYnkgYHdyYW5nbGVyIHR5cGVzYCBvbiBpbnN0YWxsLlxuICAgIGNvbnN0IHRyYWNrZWQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLS0nLCB3b3JrZXJUeXBlc0ZpbGVOYW1lXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmICghdHJhY2tlZCkgcmV0dXJuO1xuXG4gICAgLy8gVW50cmFjayBvbmx5IHdoZW4gdGhlIChyZSlnZW5lcmF0ZWQgcGFja2FnZS5qc29uJ3MgaW5zdGFsbCBwaXBlbGluZSByZWFsbHkgcmVnZW5lcmF0ZXMgdGhlIGZpbGU6XG4gICAgLy8gZ2VuZXJhdGVQYWNrYWdlSnNvbiBzd2FsbG93cyBpdHMgb3duIGV4Y2VwdGlvbnMsIHNvIGEgcGFydGlhbCBydW4gbXVzdCBub3QgbGVhdmUgdGhlIGRlY2xhcmF0aW9uIGRlbGV0ZWRcbiAgICAvLyB3aXRoIG5vdGhpbmcgcmVjcmVhdGluZyBpdCBvbiBmcmVzaCBjaGVja291dHMuXG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgKSBhcyBQYWNrYWdlSnNvbjtcbiAgICBpZiAoIXBvc3RpbnN0YWxsR2VuZXJhdGVzV29ya2VyVHlwZXMocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkpIHJldHVybjtcblxuICAgIC8vIFVudHJhY2tpbmcgYSBmaWxlIHRoZSBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBkb2VzIG5vdCBhY3R1YWxseSBjb3ZlciAoZS5nLiB0aGUgZ2l0aWdub3JlLmlvIGZldGNoIGZhaWxlZCwgc28gdGhlXG4gICAgLy8gZmlsZSB3YXMgbmV2ZXIgd3JpdHRlbikgd291bGQgbGVhdmUgaXQgdW50cmFja2VkIGFuZCBkaXJ0eSBpbiB0aGUgcmVwb3NpdG9yeSwgc28gY29uZmlybSB0aGUgcnVsZSBhcHBsaWVzIGZpcnN0LlxuICAgIC8vIGBnaXQgY2hlY2staWdub3JlYCBhbHNvIGhvbm9ycyAuZ2l0L2luZm8vZXhjbHVkZSBhbmQgZ2xvYmFsIGV4Y2x1ZGVzLCB3aGljaCBhIGZyZXNoIGNsb25lIGxhY2tzLCBzbyB0aGVcbiAgICAvLyBjb21taXR0ZWQgcGFja2FnZSAuZ2l0aWdub3JlIG11c3QgY2FycnkgdGhlIG1hbmFnZWQgcnVsZSBpdHNlbGYuXG4gICAgY29uc3QgZ2l0aWdub3JlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBoYXNNYW5hZ2VkUnVsZSA9XG4gICAgICBmcy5leGlzdHNTeW5jKGdpdGlnbm9yZVBhdGgpICYmXG4gICAgICBmc1xuICAgICAgICAucmVhZEZpbGVTeW5jKGdpdGlnbm9yZVBhdGgsICd1dGY4JylcbiAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAuc29tZSgobGluZSkgPT4gbGluZS50cmltKCkgPT09IGAvJHt3b3JrZXJUeXBlc0ZpbGVOYW1lfWApO1xuICAgIGlmICghaGFzTWFuYWdlZFJ1bGUpIHJldHVybjtcbiAgICAvLyAtLW5vLWluZGV4IG1ha2VzIGdpdCByZXBvcnQgdGhlIHJ1bGUgdGhhdCB3b3VsZCBhcHBseSwgaW5zdGVhZCBvZiByZXBvcnRpbmcgbm90aGluZyBiZWNhdXNlIHRoZSBmaWxlIGlzIHRyYWNrZWQuXG4gICAgY29uc3QgaXNJZ25vcmVkID1cbiAgICAgIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhcbiAgICAgICAgJ2dpdCcsXG4gICAgICAgIFsnY2hlY2staWdub3JlJywgJy0tcXVpZXQnLCAnLS1uby1pbmRleCcsICctLScsIHdvcmtlclR5cGVzRmlsZU5hbWVdLFxuICAgICAgICBjb25maWcuZGlyUGF0aFxuICAgICAgKSA9PT0gMDtcbiAgICBpZiAoIWlzSWdub3JlZCkgcmV0dXJuO1xuXG4gICAgLy8gLS1jYWNoZWQga2VlcHMgdGhlIGZpbGUgb24gZGlzayBiZWNhdXNlIHR5cGUgY2hlY2tpbmcgbmVlZHMgaXQgYmVmb3JlIHRoZSBuZXh0IGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQuXG4gICAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdnaXQnLCBbJ3JtJywgJy0tY2FjaGVkJywgJy0tcXVpZXQnLCAnLS0nLCB3b3JrZXJUeXBlc0ZpbGVOYW1lXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQocm9vdENvbmZpZyk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb247XG4gIC8vIFdpbGxCb29zdGVyIFJhaWx3YXkgcHJvamVjdCBpZGVudGlmaWVycyBhcmUgbWFuYWdlZCBpbiBkZXBsb3kgd29ya2Zsb3cgc2V0dGluZ3MuXG4gIGNvbnN0IHJhaWx3YXlJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNSYWlsd2F5XG4gICAgPyAnXFxuLSBSYWlsd2F5IHByb2plY3QgaW5mb3JtYXRpb24gaXMgaW4gdGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYC4nXG4gICAgOiAnJztcbiAgY29uc3QgcGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbiA9IGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGFsbENvbmZpZ3MpXG4gICAgPyBgXFxuLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJyc7XG4gIGNvbnN0IGNvQXV0aG9ySW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuICAtIEVuZCB5b3VyIGNvbW1pdCBtZXNzYWdlIHdpdGggYSBibGFuayBsaW5lIGZvbGxvd2VkIGJ5IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgLmBcbiAgICA6ICcnO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYCR7ZGVzY3JpcHRpb24gPyBgXFxuLSBEZXNjcmlwdGlvbjogJHtkZXNjcmlwdGlvbn1gIDogJyd9XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBJZiBvbiBcXGBtYWluXFxgLCBjcmVhdGUgYSBuZXcgYnJhbmNoOyBvdGhlcndpc2Ugd29yayBvbiB0aGUgY3VycmVudCBicmFuY2guXG4tIFJ1biBcXGBnaXRcXGAgY29tbWFuZHMgb25lIGF0IGEgdGltZSB0byBhdm9pZCBcXGBpbmRleC5sb2NrXFxgIGNvbmZsaWN0cy5cbi0gV3JpdGUgYSB0ZXN0IG9ubHkgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCwgb3Igd2hlbiBhIGJlaGF2aW9yIGlzIGJvdGggbGlrZWx5IHRvIHJlZ3Jlc3MgQU5EIGhhcyBubyBvdGhlciBhdXRvbWF0aWMgc2FmZWd1YXJkICh0eXBlIGNoZWNraW5nLCBsaW50aW5nLCBvciBhbiBleGlzdGluZyB0ZXN0L0NJIGNoZWNrIHdvdWxkIG5vdCBjYXRjaCB0aGUgYnJlYWthZ2UpLiBTa2lwIHRoZSB0ZXN0IHdoZW4gYW4gZXhpc3Rpbmcgc2lnbmFsIGFscmVhZHkgY2F0Y2hlcyB0aGUgcmVncmVzc2lvbiwgb3Igd2hlbiB5b3UgYXJlIG9ubHkgY29uZmlybWluZyBhbiBleHRlcm5hbCBmYWN0IChhIGxpYnJhcnkncyBiZWhhdmlvciwgd2hldGhlciBhIHZlcnNpb24gZml4ZXMgYW4gaXNzdWUp4oCUdmVyaWZ5IHRob3NlIG9uY2UgbWFudWFsbHkgaW5zdGVhZCBvZiBhZGRpbmcgYSBwZXJtYW5lbnQgdGVzdC5cbi0gV2hlbiB3cml0aW5nIHRlc3RzLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRlc3RzIGFuZC9vciBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuICAtIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4gIC0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2NrcywgdW5sZXNzIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIG1vY2tzIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBBdm9pZCBmaXhlZCB3YWl0cyBpbiBFMkUgdGVzdHM7IHdhaXQgZm9yIGNvbmRpdGlvbnMgaW5zdGVhZC5cbi0gV2hlbiBmaXhpbmcgaXNzdWVzIChpbmNsdWRpbmcgdGVzdCBmYWlsdXJlcyksIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCB2aWEgZGVidWcgbG9ncyBvciBzY3JlZW5zaG90cykgYW5kIGZpeCBpdCBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHZlcmlmeVxcYCAodHlwZSBjaGVja2luZyBhbmQgbGludGluZzsgdGFrZXMgdXAgdG8gMTAgbWludXRlcyksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHZlcmlmeS1mdWxsXFxgIChhbGwgdGVzdHM7IHRha2VzIHVwIHRvIDEgaG91cikgaWYgeW91IGNoYW5nZWQgcnVudGltZSBiZWhhdmlvciBvciB0ZXN0cy4gRml4IGVycm9ycyBhbmQgcmUtcnVuIHVudGlsIGl0IHBhc3Nlcy5cbi0gT25jZSB2ZXJpZmllZCwgY29tbWl0IGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCBhbmQgY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgYnJhbmNoLlxuICAtIEZvbGxvdyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgZm9ybWF0IChlLmcuLCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCkuJHtjb0F1dGhvckluc3RydWN0aW9ufVxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHM7IGF2b2lkIFxcYC0tYW1lbmRcXGAuXG4tIFVzZSBoZXJlZG9jIGZvciBtdWx0aS1saW5lIGNvbW1hbmQgaW5wdXQgKGUuZy4sIFxcYGdpdCBjb21taXQgLUYgLVxcYCwgXFxgZ2ggcHIgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uJHtyYWlsd2F5SW5zdHJ1Y3Rpb259JHtwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9ufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmcge1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmaWxlIG5hbWVzIGZvciBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgKFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBtb2R1bGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoIGhpZ2ggY29oZXNpb24gYW5kIGxvdyBjb3VwbGluZzsgc3BsaXQgbGFyZ2UgbW9kdWxlcyB3aGVuIG5lZWRlZC5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgKHRvcC1kb3duIG9yZGVyKTsgcGxhY2UgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGFib3ZlIHRoZWlyIHVzYWdlLlxuLSBXcml0ZSBjb21tZW50cyBhbmQgSlNEb2Mgb25seSBmb3IgaGFyZC10by11bmRlcnN0YW5kIGNvZGU6IGV4cGxhaW4gXCJ3aHlcIiBpbiBjb21tZW50cyBhbmQgXCJ3aGF0XCIgaW4gSlNEb2MuXG4tIElmIGxpbnQgZXJyb3JzIG9yIHdhcm5pbmdzIGNhbm5vdCBiZSBmaXhlZCwgdXNlIGlnbm9yZSBjb21tZW50cyB3aXRoIHJlYXNvbnMgKGUuZy4sIFxcYC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSA8cnVsZT4gLS0gPHJlYXNvbj5cXGApLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgcmVxdWlyZWQgYnkgQVBJcyBvciBsaWJyYXJpZXMuXG4tIEJ1aWxkIHByb21wdHMgYXMgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCBvbiBhIHByZS1jb21wdXRhYmxlIGFycmF5IG9mIHN0cmluZ3MuXG4tIEFzc3VtZSBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBkZWZpbmVkOyBpZiB2YWxpZGF0aW9uIGlzIG5lZWRlZCwgXFxgYXNzZXJ0XFxgIGF0IHN0YXJ0dXAgdG8gZmFpbCBmYXN0LlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGFkZGluZyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgcmVnaXN0ZXIgdGhlbSBpbiB0aGUgXFxgaTE4blxcYCByZXNvdXJjZSBmaWxlcyAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKSBhbmQgcmVmZXJlbmNlIHRoZW0gdmlhIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkgKGUuZy4sIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGApLmBcbiAgICA6ICcnXG59XG5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGAtIFByZWZlciBsYW1iZGEgb3ZlciBcXGBmdW5jdGlvblxcYCBmb3IgUmVhY3QgY29tcG9uZW50cywgZS5nLiwgXFxgY29uc3QgQnV0dG9uOiBSZWFjdC5GQyA9ICgpID0+IHtcXGAuXG4tIFByZWZlciBcXGB1c2VJbW1lclxcYCBvdmVyIFxcYHVzZVN0YXRlXFxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4tIFVzZSBcXGBhdXRvRm9jdXNcXGAgd2hlcmUgaXQgcmVkdWNlcyB1c2VyIGVmZm9ydC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBUaGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHNvIFxcYHVzZUNhbGxiYWNrXFxgIGFuZCBcXGB1c2VNZW1vXFxgIGFyZSB1bm5lY2Vzc2FyeSBmb3IgcGVyZm9ybWFuY2UuXG4tIEFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdzbW9sLXRvbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBCdW5maWdUb21sIHtcbiAgaW5zdGFsbD86IHtcbiAgICBleGFjdD86IGJvb2xlYW47XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSA0MzJfMDAwO1xuXG4vLyBQbGF0Zm9ybSBzZXRzIG11c3QgbWF0Y2ggZWFjaCBwYWNrYWdlJ3Mgb3B0aW9uYWxEZXBlbmRlbmNpZXMgb24gbnBtIGJlY2F1c2Vcbi8vIEJ1biBjaGVja3MgYWxsIHBsYXRmb3JtIGJpbmFyaWVzIGluIHRoZSBsb2NrZmlsZSwgbm90IGp1c3QgdGhlIGN1cnJlbnQgb25lLlxuLy8gS2VlcCB3aW4zMiBlbnRyaWVzIGV2ZW4gdGhvdWdoIHdlIGRyb3AgV2luZG93cyBzdXBwb3J0OiBvbWl0dGluZyBhbnlcbi8vIHBsYXRmb3JtIG1ha2VzIGBidW4gYWRkYCBmYWlsIHVudGlsIHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdyBlbGFwc2VzLlxuY29uc3QgdHlwZXNjcmlwdFBsYXRmb3JtcyA9IFtcbiAgJ2FpeC1wcGM2NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLWFybTY0JyxcbiAgJ2ZyZWVic2QteDY0JyxcbiAgJ2xpbnV4LWFybScsXG4gICdsaW51eC1hcm02NCcsXG4gICdsaW51eC1sb29uZzY0JyxcbiAgJ2xpbnV4LW1pcHM2NGVsJyxcbiAgJ2xpbnV4LXBwYzY0JyxcbiAgJ2xpbnV4LXJpc2N2NjQnLFxuICAnbGludXgtczM5MHgnLFxuICAnbGludXgteDY0JyxcbiAgJ25ldGJzZC1hcm02NCcsXG4gICduZXRic2QteDY0JyxcbiAgJ29wZW5ic2QtYXJtNjQnLFxuICAnb3BlbmJzZC14NjQnLFxuICAnc3Vub3MteDY0JyxcbiAgJ3dpbjMyLWFybTY0JyxcbiAgJ3dpbjMyLXg2NCcsXG5dO1xuY29uc3Qgb3hjQmluZGluZ1BsYXRmb3JtcyA9IFtcbiAgJ2FuZHJvaWQtYXJtLWVhYmknLFxuICAnYW5kcm9pZC1hcm02NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLXg2NCcsXG4gICdsaW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ2xpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ2xpbnV4LWFybTY0LWdudScsXG4gICdsaW51eC1hcm02NC1tdXNsJyxcbiAgJ2xpbnV4LXBwYzY0LWdudScsXG4gICdsaW51eC1yaXNjdjY0LWdudScsXG4gICdsaW51eC1yaXNjdjY0LW11c2wnLFxuICAnbGludXgtczM5MHgtZ251JyxcbiAgJ2xpbnV4LXg2NC1nbnUnLFxuICAnbGludXgteDY0LW11c2wnLFxuICAnb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnd2luMzItYXJtNjQtbXN2YycsXG4gICd3aW4zMi1pYTMyLW1zdmMnLFxuICAnd2luMzIteDY0LW1zdmMnLFxuXTtcbmNvbnN0IHRzZ29saW50UGxhdGZvcm1zID0gWydkYXJ3aW4tYXJtNjQnLCAnZGFyd2luLXg2NCcsICdsaW51eC1hcm02NCcsICdsaW51eC14NjQnLCAnd2luMzItYXJtNjQnLCAnd2luMzIteDY0J107XG5jb25zdCBuZXh0UnNwYWNrUGxhdGZvcm1zID0gW1xuICAnYW5kcm9pZC1hcm0tZWFiaScsXG4gICdhbmRyb2lkLWFybTY0JyxcbiAgJ2Rhcndpbi1hcm02NCcsXG4gICdkYXJ3aW4teDY0JyxcbiAgJ2xpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnbGludXgtYXJtNjQtZ251JyxcbiAgJ2xpbnV4LWFybTY0LW11c2wnLFxuICAnbGludXgteDY0LWdudScsXG4gICdsaW51eC14NjQtbXVzbCcsXG4gICd3aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ3dpbjMyLWlhMzItbXN2YycsXG4gICd3aW4zMi14NjQtbXN2YycsXG5dO1xuY29uc3QgbmV4dFN3Y1BsYXRmb3JtcyA9IFtcbiAgJ2FuZHJvaWQtYXJtLWVhYmknLFxuICAnYW5kcm9pZC1hcm02NCcsXG4gICdkYXJ3aW4tYXJtNjQnLFxuICAnZGFyd2luLXg2NCcsXG4gICdmcmVlYnNkLXg2NCcsXG4gICdsaW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ2xpbnV4LWFybTY0LWdudScsXG4gICdsaW51eC1hcm02NC1tdXNsJyxcbiAgJ2xpbnV4LXg2NC1nbnUnLFxuICAnbGludXgteDY0LW11c2wnLFxuICAnd2FzbS1ub2RlanMnLFxuICAnd2FzbS13ZWInLFxuICAnd2luMzItYXJtNjQtbXN2YycsXG4gICd3aW4zMi1pYTMyLW1zdmMnLFxuICAnd2luMzIteDY0LW1zdmMnLFxuXTtcblxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgJ0BleGVyY29kZS9wcm9ibGVtLXV0aWxzJyxcbiAgJ0B3aWxsYm9vc3Rlci1wcml2YXRlL2FnZW50aWMtd29ya2Zsb3dzJyxcbiAgJ0B3aWxsYm9vc3Rlci9hZ2VudC1za2lsbHMnLFxuICAnQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3MnLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1sb2FkZXInLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYicsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZScsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvd2InLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnYXQtZGVjb3JhdG9ycycsXG4gICdidWlsZC10cycsXG4gICdnZW4taTE4bi10cycsXG4gICdvbmUtd2F5LWdpdC1zeW5jJyxcbiAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAvLyB3YmZ5IHBpbnMgdGhlc2UgdG9vbGluZyBwYWNrYWdlcyBhbmQgbWF5IGFwcGx5IHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgYVxuICAvLyByZWxlYXNlLCBiZWZvcmUgdGhlIGdsb2JhbCBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdyBoYXMgZWxhcHNlZC5cbiAgJ3R5cGVzY3JpcHQnLFxuICAuLi50eXBlc2NyaXB0UGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAdHlwZXNjcmlwdC90eXBlc2NyaXB0LSR7cGxhdGZvcm19YCksXG4gIC8vIEJ1biBpdHNlbGYgcmVsZWFzZXMgaXRzIGZpcnN0LXBhcnR5IHR5cGUgcGFja2FnZXMgaW4gbG9ja3N0ZXAgd2l0aCB0aGVcbiAgLy8gcnVudGltZSwgc28gZ2VuZXJhdGVkIEJ1biByZXBvcyBtdXN0IGJlIGFibGUgdG8gaW5zdGFsbCB0aGVtIGltbWVkaWF0ZWx5LlxuICAnQHR5cGVzL2J1bicsXG4gICdidW4tdHlwZXMnLFxuICAnb3hmbXQnLFxuICAuLi5veGNCaW5kaW5nUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAb3hmbXQvYmluZGluZy0ke3BsYXRmb3JtfWApLFxuICAnb3hsaW50JyxcbiAgLi4ub3hjQmluZGluZ1BsYXRmb3Jtcy5tYXAoKHBsYXRmb3JtKSA9PiBgQG94bGludC9iaW5kaW5nLSR7cGxhdGZvcm19YCksXG4gICdveGxpbnQtdHNnb2xpbnQnLFxuICAuLi50c2dvbGludFBsYXRmb3Jtcy5tYXAoKHBsYXRmb3JtKSA9PiBgQG94bGludC10c2dvbGludC8ke3BsYXRmb3JtfWApLFxuICAnQG5leHQvZW52JyxcbiAgJ0BuZXh0L2ZvbnQnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmcnLFxuICAuLi5uZXh0UnNwYWNrUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAbmV4dC9yc3BhY2stYmluZGluZy0ke3BsYXRmb3JtfWApLFxuICAuLi5uZXh0U3djUGxhdGZvcm1zLm1hcCgocGxhdGZvcm0pID0+IGBAbmV4dC9zd2MtJHtwbGF0Zm9ybX1gKSxcbiAgJ0BuZXh0L3RoaXJkLXBhcnRpZXMnLFxuICAnbmV4dCcsXG4gICdyZWFjdCcsXG4gICdyZWFjdC1kb20nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIC8vIE5vIGBbcnVuXSBidW4gPSB0cnVlYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3NcbiAgLy8gdG9vbHMgcmVxdWlyaW5nIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCk7IGFueSBleGlzdGluZyBzZXR0aW5nIGlzIGRyb3BwZWQuXG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7ZXh0cmFjdFJhd1Rlc3RTZWN0aW9ucyhleGlzdGluZ0NvbnRlbnQpfVtpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSAke2J1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kc30gIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke2J1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuLyoqXG4gKiBQcmVzZXJ2ZSB0aGUgcHJvamVjdCdzIGBbdGVzdF1gIHNlY3Rpb25zIChlLmcuIHByZWxvYWQgc2NyaXB0cyBzd2FwcGluZyBhIENsb3VkZmxhcmUgRDEgY2xpZW50XG4gKiBmb3IgYSBsb2NhbCBTUUxpdGUgb25lKSB2ZXJiYXRpbSwgY29tbWVudHMgaW5jbHVkZWQ7IHdiZnkgbWFuYWdlcyBvbmx5IHRoZSBvdGhlciBzZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSYXdUZXN0U2VjdGlvbnMoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50KSByZXR1cm4gJyc7XG5cbiAgY29uc3QgcHJlc2VydmVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpblRlc3RTZWN0aW9uID0gZmFsc2U7XG4gIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IHNlY3Rpb25NYXRjaCA9IC9eXFxzKlxcWyhbXlxcXV0rKVxcXS8uZXhlYyhsaW5lKTtcbiAgICBpZiAoc2VjdGlvbk1hdGNoKSB7XG4gICAgICBpblRlc3RTZWN0aW9uID0gc2VjdGlvbk1hdGNoWzFdID09PSAndGVzdCcgfHwgKHNlY3Rpb25NYXRjaFsxXSBhcyBzdHJpbmcpLnN0YXJ0c1dpdGgoJ3Rlc3QuJyk7XG4gICAgfVxuICAgIGlmIChpblRlc3RTZWN0aW9uICYmIGxpbmUudHJpbSgpKSB7XG4gICAgICBwcmVzZXJ2ZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlc2VydmVkTGluZXMubGVuZ3RoID4gMCA/IGAke3ByZXNlcnZlZExpbmVzLmpvaW4oJ1xcbicpfVxcblxcbmAgOiAnJztcbn1cblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZSBkZXBsb3lzIEdpdC1iYXNlZCBwcml2YXRlIHBhY2thZ2VzIGZyb20gbm9kZV9tb2R1bGVzLCBidXQgdGhlIERvY2tlciBjb250ZXh0IHNob3VsZCBzdGF5IG5hcnJvdy5cbmNvbnN0IGluY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJucyA9IFsnQHdpbGxib29zdGVyJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uRFNfU3RvcmVcbioqLy5jYWNoZVxuKiovLmNsYXVkZVxuKiovLmN1cnNvclxuKiovLmVkaXRvcmNvbmZpZ1xuKiovLmVzbGludGNhY2hlXG4qKi8uZ2VtaW5pXG4qKi8uZ2l0XG4qKi8uZ2l0YXR0cmlidXRlc1xuKiovLmdpdGh1YlxuKiovLmdpdGlnbm9yZVxuKiovLmlkZWFcbioqLy5sZWZ0aG9va1xuKiovLm15cHlfY2FjaGVcbioqLy5uZXh0L2NhY2hlXG4qKi8ubnBtXG4qKi8ucGFyY2VsLWNhY2hlXG4qKi8ucG5wbS1zdG9yZVxuKiovLnB5dGVzdF9jYWNoZVxuKiovLnJhaWx3YXlpZ25vcmVcbioqLy5yZWxlYXNlcmMuanNvblxuKiovLnJ1ZmZfY2FjaGVcbioqLy50bXBcbioqLy50dXJib1xuKiovLnRveFxuKiovLnZzY29kZVxuKiovLnlhcm4vY2FjaGVcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG4qKi9fX3B5Y2FjaGVfX1xuKiovKi5sb2dcbioqLyoucHljXG4qKi8qLnRzYnVpbGRpbmZvXG4qKi9jb3ZlcmFnZVxuKiovbm9kZV9tb2R1bGVzLyoqXG4ke2luY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJuc1xuICAubWFwKFxuICAgIChwYXR0ZXJuKSA9PiBgISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59XG4hKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn0vKipgXG4gIClcbiAgLmpvaW4oJ1xcbicpfVxuKiovbm9kZV9tb2R1bGVzLy5jYWNoZVxuKiovcGxheXdyaWdodC1yZXBvcnRcbioqL3N0b3J5Ym9vay1zdGF0aWNcbioqL3RhcmdldFxuKiovdGVzdC1yZXN1bHRzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgb3hsaW50OiBbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXS50b1NvcnRlZCgpLFxuICBveGZtdDogW1xuICAgICdhc3RybycsXG4gICAgJ2NqcycsXG4gICAgJ2NzcycsXG4gICAgJ2N0cycsXG4gICAgJ2dxbCcsXG4gICAgJ2dyYXBocWwnLFxuICAgICdoYnMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnanMnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2pzeCcsXG4gICAgJ2xlc3MnLFxuICAgICdtZCcsXG4gICAgJ21keCcsXG4gICAgJ21qcycsXG4gICAgJ210cycsXG4gICAgJ3Njc3MnLFxuICAgICdzdmVsdGUnLFxuICAgICd0b21sJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICBwcmV0dGllck9ubHk6IFsnamF2YSddLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHJldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb24gPSBjb25maWcuaXNQdWJsaWNSZXBvXG4gICAgICA/ICdSZXZpZXcgaW4gRW5nbGlzaCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuJ1xuICAgICAgOiAn5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGAke3Jldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb259XFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VUb21sIH0gZnJvbSAnc21vbC10b21sJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgc2VsZWN0UHJvamVjdFdyYW5nbGVyVHlwZXNHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL3dyYW5nbGVyVHlwZXNDb21tYW5kLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNDbG91ZGZsYXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuO1xuICBpc1JhaWx3YXk6IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIC8qKiBEaXJlY3RvcmllcyBjb250YWluaW5nIENhcmdvLnRvbWwgKHJlbGF0aXZlIHRvIGRpclBhdGgsIHJvb3QtbW9zdCBmaXJzdCkuIEVtcHR5IGlmIHRoZSByZXBvIGhhcyBubyBSdXN0IGNvZGUuICovXG4gIGNhcmdvVG9tbERpclBhdGhzOiBzdHJpbmdbXTtcbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZzogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0UnVudGltZTogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHRhdXJpOiBib29sZWFuO1xuICAgIHZpbmV4dDogYm9vbGVhbjtcbiAgICB2aXRlOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICAgIGNoYWtyYTogYm9vbGVhbjtcbiAgICBkcml6emxlOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgbWlzZVRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGF1cmkgb2ZmaWNpYWxseSBzdXBwb3J0cyBKU09OLCBKU09ONSwgYW5kIFRPTUwgY29uZmlndXJhdGlvbiBmb3JtYXRzLlxuICAgIGNvbnN0IGRvZXNDb250YWluVGF1cmlDb25maWcgPSBbJ3RhdXJpLmNvbmYuanNvbicsICd0YXVyaS5jb25mLmpzb241JywgJ1RhdXJpLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdzcmMtdGF1cmknLCBmaWxlTmFtZSkpXG4gICAgKTtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIHJlcG9BdXRob3IsXG4gICAgICByZXBvTmFtZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNDbG91ZGZsYXJlOiBkZXRlY3RDbG91ZGZsYXJlKGRpclBhdGgsIHBhY2thZ2VKc29uKSxcbiAgICAgIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpLFxuICAgICAgaXNSYWlsd2F5OiBkZXRlY3RSYWlsd2F5KGRpclBhdGgsIHBhY2thZ2VKc29uKSxcbiAgICAgIGlzQnVuOlxuICAgICAgICByb290Q29uZmlnPy5pc0J1biB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2tiJykpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW4ubG9jaycpKSB8fFxuICAgICAgICAvLyBTb21lIHJlcG9zIGdpdGlnbm9yZSBidW4ubG9jaywgc28gaXQgbWF5IGJlIG1pc3Npbmcgb24gZnJlc2ggY2xvbmVzLlxuICAgICAgICAvLyBidW5maWcudG9tbCBpcyBjb21taXR0ZWQgYW5kIGdlbmVyYXRlZCBvbmx5IGZvciBCdW4gcHJvamVjdHMsIG1ha2luZyBpdCBhIHJlbGlhYmxlIHNpZ25hbC5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGNhcmdvVG9tbERpclBhdGhzOiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5VdkxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd1di5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogY29udGFpbnNBbnkoXG4gICAgICAgICdwYWNrYWdlcy8qKi9zcmMtdGF1cmkve3RhdXJpLmNvbmYuanNvbix0YXVyaS5jb25mLmpzb241LFRhdXJpLnRvbWx9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgY2hha3JhOiAhIWRldkRlcGVuZGVuY2llc1snQGNoYWtyYS11aS9jbGknXSxcbiAgICAgICAgZHJpenpsZTogISFkZXBlbmRlbmNpZXNbJ2RyaXp6bGUtb3JtJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2RyaXp6bGUta2l0J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHBsYXl3cmlnaHRSdW50aW1lOiBkb2VzSW1wb3J0UGxheXdyaWdodEF0UnVudGltZShkaXJQYXRoKSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB0YXVyaTpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgICB2aW5leHQ6ICEhZGVwZW5kZW5jaWVzLnZpbmV4dCB8fCAhIWRldkRlcGVuZGVuY2llcy52aW5leHQsXG4gICAgICAgIHZpdGU6ICEhZGVwZW5kZW5jaWVzLnZpdGUgfHwgISFkZXZEZXBlbmRlbmNpZXMudml0ZSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgaGFzVmVyc2lvblNldHRpbmdzLFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJ21pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcubWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJykpXG4gICk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB3YmZ5IG1hbmFnZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlIHBhY2thZ2UuIFRoZSBmaWxlIGlzIGdpdGlnbm9yZWQgYW5kIHVudHJhY2tlZCBvbiB0aGVcbiAqIGFzc3VtcHRpb24gdGhhdCBgd3JhbmdsZXIgdHlwZXNgIHJlZ2VuZXJhdGVzIGl0IG9uIGluc3RhbGwsIHNvIGFsbCB0aHJlZSBzdGVwcyBtdXN0IGFncmVlOiB0aGUgcGFja2FnZSBoYXMgdG8gb3duIGFcbiAqIHdyYW5nbGVyIGNvbmZpZyAoYHdyYW5nbGVyIHR5cGVzYCBleGl0cyBub24temVybyB3aXRob3V0IG9uZSksIHRvIGRlcGVuZCBvbiB3cmFuZ2xlciAoYSBwYWNrYWdlIGRlcGxveWluZyB2aWEgYVxuICogQ0kgYWN0aW9uIGNhbm5vdCByZXNvbHZlIHRoZSBjb21tYW5kKSwgYW5kIHRvIHJlZ2VuZXJhdGUgdGhlIHNhbWUgZmlsZSBvbiBldmVyeSBjaGVja291dC4gT3RoZXJ3aXNlIHdiZnkgd291bGRcbiAqIGlnbm9yZSBhbmQgZGVsZXRlIGEgZmlsZSB0aGF0IG5vdGhpbmcgcmVjcmVhdGVzIGlkZW50aWNhbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmXG4gICAgQm9vbGVhbihwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bJ3dyYW5nbGVyJ10gfHwgcGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uWyd3cmFuZ2xlciddKSAmJlxuICAgIC8vIEEgcHJvamVjdCBpbnZvY2F0aW9uIHRoYXQgd3JpdGVzIHRoZSBtYW5hZ2VkIGRlZmF1bHQgZmlsZSBmcm9tIGlucHV0cyB3YmZ5IGNhbm5vdCB2YWxpZGF0ZSAoZS5nLlxuICAgIC8vIGB3cmFuZ2xlciB0eXBlcyAtYyB3cmFuZ2xlci5qc29uYyAtYyAuLi9ib3VuZC13b3JrZXIvd3JhbmdsZXIuanNvbmNgIGZvciBSUEMgdHlwZXMpIHdvdWxkIGZpZ2h0IGEgbWFuYWdlZFxuICAgIC8vIGZhbGxiYWNrIGdlbmVyYXRvciBvdmVyIHRoZSBzYW1lIGZpbGUsIGFuZCBzZXZlcmFsIGRpc3RpbmN0IGZsYWdnZWQgZ2VuZXJhdG9ycyBsZWF2ZSBubyBkZXRlcm1pbmlzdGljXG4gICAgLy8gY2hvaWNlLCBzbyBzdWNoIHBhY2thZ2VzIHN0YXkgdW5tYW5hZ2VkLlxuICAgICFzZWxlY3RQcm9qZWN0V3JhbmdsZXJUeXBlc0dlbmVyYXRvcihwYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fSkuY29uZmxpY3RpbmcgJiZcbiAgICBoYXNSZXByb2R1Y2libGVXb3JrZXJUeXBlc0luZmVyZW5jZShjb25maWcpXG4gICk7XG59XG5cbi8qKlxuICogYHdyYW5nbGVyIHR5cGVzYCBpbmZlcnMgYEVudmAgbWVtYmVycyBmcm9tIHRoZSAuZGV2LnZhcnMvLmVudiBmaWxlcyBiZXNpZGUgdGhlIHdyYW5nbGVyIGNvbmZpZyDigJQgaW5jbHVkaW5nIHRoZVxuICogbGF5ZXJlZCB2YXJpYW50cyB3cmFuZ2xlciByZXNvbHZlcywgc3VjaCBhcyAuZW52LmxvY2FsIGFuZCBlbnZpcm9ubWVudC1zcGVjaWZpYyBmaWxlcyDigJQgdW5sZXNzIHRoZSBjb25maWdcbiAqIGRlY2xhcmVzIGBzZWNyZXRzLnJlcXVpcmVkYC4gVW50cmFja2luZyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGlzIHNhZmUgb25seSB3aGVuIGV2ZXJ5IHN1Y2ggaW5wdXQgaXNcbiAqIGlkZW50aWNhbCBvbiBldmVyeSBjaGVja291dDogd2l0aCBhIGdpdGlnbm9yZWQgb3IgbG9jYWxseSBtb2RpZmllZCBmaWxlLCBDSSB3b3VsZCByZWdlbmVyYXRlIGFuIGBFbnZgIHdpdGhvdXRcbiAqIHRoZSBzZWNyZXQgbWVtYmVycyB0aGF0IHR5cGUtY2hlY2sgbG9jYWxseS5cbiAqL1xuZnVuY3Rpb24gaGFzUmVwcm9kdWNpYmxlV29ya2VyVHlwZXNJbmZlcmVuY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpclBhdGggPSBjb25maWcuZGlyUGF0aDtcbiAgaWYgKGRlY2xhcmVzU3VwcG9ydGVkUmVxdWlyZWRTZWNyZXRzKGNvbmZpZykpIHJldHVybiB0cnVlO1xuICAvLyBUaGUgd3JhbmdsZXIgY29uZmlnIGl0c2VsZiBkcml2ZXMgdGhlIGdlbmVyYXRpb24sIHNvIGFuIHVudHJhY2tlZCwgbW9kaWZpZWQsIG9yIHN5bWxpbmtlZCBjb25maWcgbWFrZXMgdGhlXG4gIC8vIGdlbmVyYXRlZCBmaWxlIGlycmVwcm9kdWNpYmxlIHdoYXRldmVyIHRoZSBkb3RlbnYgaW5wdXRzIHNheS5cbiAgY29uc3QgY29uZmlnRmlsZU5hbWVzID0gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXS5maWx0ZXIoKGZpbGVOYW1lKSA9PlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKSlcbiAgKTtcbiAgaWYgKCFhcmVUcmFja2VkQ2xlYW5SZWd1bGFyRmlsZXMoZGlyUGF0aCwgY29uZmlnRmlsZU5hbWVzKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBpbmZlcmVuY2VTb3VyY2VOYW1lcyA9IGZzXG4gICAgLnJlYWRkaXJTeW5jKGRpclBhdGgpXG4gICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IC9eXFwuKD86ZGV2XFwudmFyc3xlbnYpKD86XFwuLispPyQvdS50ZXN0KGZpbGVOYW1lKSk7XG4gIHJldHVybiBhcmVUcmFja2VkQ2xlYW5SZWd1bGFyRmlsZXMoZGlyUGF0aCwgaW5mZXJlbmNlU291cmNlTmFtZXMpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZXZlcnkgbGlzdGVkIGZpbGUgaXMgYSByZWd1bGFyIGZpbGUgKGEgdHJhY2tlZCBzeW1saW5rJ3MgZ2l0IHN0YXRlIHNheXMgbm90aGluZyBhYm91dCBpdHMgdGFyZ2V0J3NcbiAqIGNvbnRlbnQpLCB0cmFja2VkLCBBTkQgdW5tb2RpZmllZDogYGdpdCBscy1maWxlc2AgcHJpbnRzIG5vdGhpbmcgZm9yIGFuIHVudHJhY2tlZCBmaWxlIChhbmQgZmFpbHMgcHJpbnRpbmdcbiAqIG5vdGhpbmcgb3V0c2lkZSBhIHJlcG9zaXRvcnkpLCB3aGlsZSBgZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbmAgcHJpbnRzIG5vdGhpbmcgZm9yIGEgY2xlYW4gZmlsZSDigJQgd3JhbmdsZXIgcmVhZHNcbiAqIHRoZSB3b3JraW5nIHRyZWUsIGJ1dCBDSSByZWFkcyB0aGUgY29tbWl0dGVkIGNvbnRlbnRzLCBzbyBsb2NhbCBlZGl0cyBicmVhayByZXByb2R1Y2liaWxpdHkgdG9vLiAoQW4gaWdub3JlZFxuICogZmlsZSBhbHNvIHByb2R1Y2VzIGVtcHR5IHN0YXR1cyBvdXRwdXQsIHdoaWNoIHRoZSB0cmFja2VkIGNoZWNrIGNhdGNoZXMuKVxuICovXG5mdW5jdGlvbiBhcmVUcmFja2VkQ2xlYW5SZWd1bGFyRmlsZXMoZGlyUGF0aDogc3RyaW5nLCBmaWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChmaWxlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGZpbGVOYW1lcy5zb21lKChmaWxlTmFtZSkgPT4gZnMubHN0YXRTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpLmlzU3ltYm9saWNMaW5rKCkpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRyYWNrZWRPdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLS0nLCAuLi5maWxlTmFtZXNdLCBkaXJQYXRoKTtcbiAgY29uc3QgdHJhY2tlZENvdW50ID0gdHJhY2tlZE91dHB1dCA9PT0gJycgPyAwIDogdHJhY2tlZE91dHB1dC5zcGxpdCgnXFxuJykubGVuZ3RoO1xuICByZXR1cm4gKFxuICAgIHRyYWNrZWRDb3VudCA9PT0gZmlsZU5hbWVzLmxlbmd0aCAmJlxuICAgIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nLCAnLS0nLCAuLi5maWxlTmFtZXNdLCBkaXJQYXRoKSA9PT0gJydcbiAgKTtcbn1cblxuLy8gYHdyYW5nbGVyIHR5cGVzYCBnZW5lcmF0ZXMgZnJvbSBgc2VjcmV0cy5yZXF1aXJlZGAgb25seSBzaW5jZSB3cmFuZ2xlciA0Ljc3LjAgKGFubm91bmNlZCAyMDI2LTAzLTI0LCB0aGUgNC43Ny4wXG4vLyByZWxlYXNlIGRhdGUpOyBvbGRlciB3cmFuZ2xlcnMgd2FybiBhYm91dCB0aGUgdW5leHBlY3RlZCBmaWVsZCBhbmQga2VlcCBpbmZlcnJpbmcgZnJvbSAuZGV2LnZhcnMuXG5jb25zdCBtaW5pbXVtV3JhbmdsZXJWZXJzaW9uRm9yUmVxdWlyZWRTZWNyZXRzID0gJzQuNzcuMCc7XG5cbmZ1bmN0aW9uIGRlY2xhcmVzU3VwcG9ydGVkUmVxdWlyZWRTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBjb25zdCB3cmFuZ2xlclZlcnNpb25SYW5nZSA9XG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/Llsnd3JhbmdsZXInXSA/PyBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uWyd3cmFuZ2xlciddO1xuICBpZiAoIXdyYW5nbGVyVmVyc2lvblJhbmdlKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgbWluaW11bVZlcnNpb24gPSBzZW12ZXIubWluVmVyc2lvbih3cmFuZ2xlclZlcnNpb25SYW5nZSk7XG4gICAgaWYgKCFtaW5pbXVtVmVyc2lvbiB8fCBzZW12ZXIubHQobWluaW11bVZlcnNpb24sIG1pbmltdW1XcmFuZ2xlclZlcnNpb25Gb3JSZXF1aXJlZFNlY3JldHMpKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gd3JhbmdsZXJDb25maWdEZWNsYXJlc1JlcXVpcmVkU2VjcmV0cyhjb25maWcuZGlyUGF0aCk7XG59XG5cbmludGVyZmFjZSBXcmFuZ2xlckNvbmZpZ1NlY3JldHNTdWJ0cmVlIHtcbiAgc2VjcmV0cz86IHsgcmVxdWlyZWQ/OiBzdHJpbmdbXSB9O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiB7IHJlcXVpcmVkPzogc3RyaW5nW10gfSB9IHwgdW5kZWZpbmVkPjtcbn1cblxuZnVuY3Rpb24gd3JhbmdsZXJDb25maWdEZWNsYXJlc1JlcXVpcmVkU2VjcmV0cyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbiddKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2Uoc3RyaXBKc29uY1N5bnRheChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpKSBhcyBXcmFuZ2xlckNvbmZpZ1NlY3JldHNTdWJ0cmVlO1xuICAgICAgcmV0dXJuIGRlY2xhcmVzUmVxdWlyZWRTZWNyZXRzQW55d2hlcmUoY29uZmlnKTtcbiAgICB9XG4gICAgY29uc3QgdG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dyYW5nbGVyLnRvbWwnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0b21sUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHBhcnNlVG9tbChmcy5yZWFkRmlsZVN5bmModG9tbFBhdGgsICd1dGY4JykpIGFzIFdyYW5nbGVyQ29uZmlnU2VjcmV0c1N1YnRyZWU7XG4gICAgICByZXR1cm4gZGVjbGFyZXNSZXF1aXJlZFNlY3JldHNBbnl3aGVyZShjb25maWcpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBjb25maWcgdGhhdCBkb2VzIG5vdCBwYXJzZSBjYW5ub3QgcHJvdmUgYSBkZWNsYXJhdGlvbi5cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIEEgZGVjbGFyYXRpb24gYXQgYW55IGNvbmZpZyBsZXZlbCByZXBsYWNlcyB0aGUgLmRldi52YXJzLy5lbnYgaW5mZXJlbmNlOiBgd3JhbmdsZXIgdHlwZXNgIGFnZ3JlZ2F0ZXNcbi8vIHBlci1lbnZpcm9ubWVudCBzZWNyZXRzIGludG8gdGhlIGdlbmVyYXRlZCB0eXBlIChDbG91ZGZsYXJlIGNoYW5nZWxvZyAyMDI2LTAzLTI0KS5cbmZ1bmN0aW9uIGRlY2xhcmVzUmVxdWlyZWRTZWNyZXRzQW55d2hlcmUoY29uZmlnOiBXcmFuZ2xlckNvbmZpZ1NlY3JldHNTdWJ0cmVlKTogYm9vbGVhbiB7XG4gIGlmICgoY29uZmlnLnNlY3JldHM/LnJlcXVpcmVkPy5sZW5ndGggPz8gMCkgPiAwKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY29uZmlnLmVudiA/PyB7fSkuc29tZSgoZW52Q29uZmlnKSA9PiAoZW52Q29uZmlnPy5zZWNyZXRzPy5yZXF1aXJlZD8ubGVuZ3RoID8/IDApID4gMCk7XG59XG5cbi8qKiBSZW1vdmUgdGhlIGNvbW1lbnRzIGFuZCB0cmFpbGluZyBjb21tYXMgb2YgSlNPTkMgKHN0cmluZy1hd2FyZSksIGVub3VnaCBmb3Igd3JhbmdsZXIgY29uZmlnIGZpbGVzLiAqL1xuZnVuY3Rpb24gc3RyaXBKc29uY1N5bnRheCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgd2l0aG91dENvbW1lbnRzID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IHRleHRbaV07XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ1wiJykge1xuICAgICAgY29uc3Qgc3RyaW5nTGl0ZXJhbCA9IGNvcHlKc29uU3RyaW5nKHRleHQsIGkpO1xuICAgICAgd2l0aG91dENvbW1lbnRzICs9IHN0cmluZ0xpdGVyYWw7XG4gICAgICBpICs9IHN0cmluZ0xpdGVyYWwubGVuZ3RoIC0gMTtcbiAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gJy8nICYmIHRleHRbaSArIDFdID09PSAnLycpIHtcbiAgICAgIHdoaWxlIChpIDwgdGV4dC5sZW5ndGggJiYgdGV4dFtpXSAhPT0gJ1xcbicpIGkrKztcbiAgICAgIHdpdGhvdXRDb21tZW50cyArPSAnXFxuJztcbiAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gJy8nICYmIHRleHRbaSArIDFdID09PSAnKicpIHtcbiAgICAgIGkgKz0gMjtcbiAgICAgIHdoaWxlIChpIDwgdGV4dC5sZW5ndGggJiYgISh0ZXh0W2ldID09PSAnKicgJiYgdGV4dFtpICsgMV0gPT09ICcvJykpIGkrKztcbiAgICAgIGkrKztcbiAgICB9IGVsc2Uge1xuICAgICAgd2l0aG91dENvbW1lbnRzICs9IGNoYXJhY3RlcjtcbiAgICB9XG4gIH1cbiAgLy8gQSBzZWNvbmQgcGFzcyBzbyBhIGNvbW1hIHN0YXlzIGRldGVjdGVkIGFzIHRyYWlsaW5nIGFjcm9zcyBhIG5vdy1yZW1vdmVkIGNvbW1lbnQgKGUuZy4gYCwgLy8gbm90ZVxcbn1gKS5cbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHdpdGhvdXRDb21tZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IHdpdGhvdXRDb21tZW50c1tpXTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBjb25zdCBzdHJpbmdMaXRlcmFsID0gY29weUpzb25TdHJpbmcod2l0aG91dENvbW1lbnRzLCBpKTtcbiAgICAgIHJlc3VsdCArPSBzdHJpbmdMaXRlcmFsO1xuICAgICAgaSArPSBzdHJpbmdMaXRlcmFsLmxlbmd0aCAtIDE7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcsJykge1xuICAgICAgbGV0IG5leHQgPSBpICsgMTtcbiAgICAgIHdoaWxlIChuZXh0IDwgd2l0aG91dENvbW1lbnRzLmxlbmd0aCAmJiAvXFxzL3UudGVzdCh3aXRob3V0Q29tbWVudHNbbmV4dF0gYXMgc3RyaW5nKSkgbmV4dCsrO1xuICAgICAgaWYgKHdpdGhvdXRDb21tZW50c1tuZXh0XSAhPT0gJ30nICYmIHdpdGhvdXRDb21tZW50c1tuZXh0XSAhPT0gJ10nKSByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQ29weSB0aGUgSlNPTiBzdHJpbmcgbGl0ZXJhbCBzdGFydGluZyBhdCB0aGUgb3BlbmluZyBkb3VibGUgcXVvdGUsIGhvbm9yaW5nIGJhY2tzbGFzaCBlc2NhcGVzLiAqL1xuZnVuY3Rpb24gY29weUpzb25TdHJpbmcodGV4dDogc3RyaW5nLCBzdGFydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IGVuZCA9IHN0YXJ0O1xuICB3aGlsZSAoKytlbmQgPCB0ZXh0Lmxlbmd0aCkge1xuICAgIGlmICh0ZXh0W2VuZF0gPT09ICdcXFxcJykgZW5kKys7XG4gICAgZWxzZSBpZiAodGV4dFtlbmRdID09PSAnXCInKSBicmVhaztcbiAgfVxuICByZXR1cm4gdGV4dC5zbGljZShzdGFydCwgTWF0aC5taW4oZW5kICsgMSwgdGV4dC5sZW5ndGgpKTtcbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIHRoZSBkaXJlY3Rvcnkgb3ducyBhIFdvcmtlciwgdW5saWtlIHRoZSBpc0Nsb3VkZmxhcmUgaGV1cmlzdGljLCB3aGljaCBhbHNvIG1hdGNoZXMgYSBwYWNrYWdlIHRoYXRcbiAqIG1lcmVseSBtZW50aW9ucyB3cmFuZ2xlciBpbiBhIHNjcmlwdCBvciB3b3JrZmxvdyAoZS5nLiB0aGUgcm9vdCBvZiBhIG1vbm9yZXBvIHdob3NlIFdvcmtlciBsaXZlcyBpbiBhIHN1Yi1wYWNrYWdlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdENsb3VkZmxhcmUoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIGlmIChzY3JpcHRzICYmIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiBzY3JpcHQuaW5jbHVkZXMoJ3dyYW5nbGVyJykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZGV0ZWN0V3JhbmdsZXJDb25maWcoZGlyUGF0aCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0ZpbGVzTWF0Y2goZGlyUGF0aCwgL2Nsb3VkZmxhcmV8d3JhbmdsZXIvaXUpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RSYWlsd2F5KGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCdyYWlsd2F5JykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5Lmpzb24nKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0ZpbGVzTWF0Y2goZGlyUGF0aCwgL3JhaWx3YXkvaXUpO1xufVxuXG5mdW5jdGlvbiB3b3JrZmxvd0ZpbGVzTWF0Y2goZGlyUGF0aDogc3RyaW5nLCByZWdleDogUmVnRXhwKTogYm9vbGVhbiB7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzXG4gICAgICAucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aClcbiAgICAgIC5zb21lKChmaWxlTmFtZSkgPT4gL1xcLnlhP21sJC9pdS50ZXN0KGZpbGVOYW1lKSAmJiB3b3JrZmxvd0ZpbGVNYXRjaGVzKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lLCByZWdleCkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gd29ya2Zsb3dGaWxlTWF0Y2hlcyh3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsIHJlZ2V4OiBSZWdFeHApOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVnZXgudGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBwYXJzZVRvbWwoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZnXG4gICAgLmdsb2JTeW5jKCcqKi9DYXJnby50b21sJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pXG4gICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnNwbGl0KCcvJykubGVuZ3RoIC0gYi5zcGxpdCgnLycpLmxlbmd0aCB8fCBhLmxvY2FsZUNvbXBhcmUoYikpO1xufVxuXG5mdW5jdGlvbiBkb2VzSW1wb3J0UGxheXdyaWdodEF0UnVudGltZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZXMgPSBmZy5nbG9iU3luYygne2FwcCxzcmN9LyoqLyoue2NqcyxjdHMsanMsanN4LG1qcyxtdHMsdHMsdHN4fScsIHtcbiAgICBkb3Q6IHRydWUsXG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsICcqKi9fX3Rlc3RzX18vKionLCAnKiovKi5zcGVjLionLCAnKiovKi50ZXN0LionLCAnKiovcGxheXdyaWdodC5jb25maWcuKiddLFxuICB9KTtcbiAgcmV0dXJuIGZpbGVzLnNvbWUoKGZpbGUpID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlKSwgJ3V0ZjgnKTtcbiAgICByZXR1cm4gL1xcYmZyb21cXHMrWydcIl1wbGF5d3JpZ2h0WydcIl18XFxiaW1wb3J0XFxzKlxcKFxccypbJ1wiXXBsYXl3cmlnaHRbJ1wiXVxccypcXCl8XFxicmVxdWlyZVxccypcXChcXHMqWydcIl1wbGF5d3JpZ2h0WydcIl1cXHMqXFwpL3UudGVzdChcbiAgICAgIGNvbnRlbnRcbiAgICApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIHJldHVybiB7IGZ1bGxfbmFtZTogcmVkaXJlY3RlZEZ1bGxOYW1lIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIERvIG5vdCByZW1vdmUgYHdpbmRvd3NgOiBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBmaWxlcyBtdXN0IGtlZXAgaWdub3JpbmcgV2luZG93cy1jcmVhdGVkIGxvY2FsIGFydGlmYWN0cy5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuX19nZW5lcmF0ZWRfXy9cbiEua2VlcFxuLmFpZGVyKlxuLmFudGlncmF2aXR5Y2xpL1xuLmNsYXVkZS8qLmxvY2FsLipcbi5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2tcbi5kZXZjb250YWluZXIvXG4uZW52LnByb2R1Y3Rpb25cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4ucGxheXdyaWdodC1tY3AvXG4uc2VyZW5hL1xuLnRtcC9cbi50b2tlbnNhdmUvXG4ud2IvXG5Ad2lsbGJvb3N0ZXIvXG4qL21vdW50LyouaGFzaFxuQ0xBVURFLmxvY2FsLm1kXG5kaXN0L1xuZHJpenpsZS9tb3VudC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3B5dGhvbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmVudi9cbmA7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmJsaXR6L1xuLmJsaXR6KipcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25leHRqcycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UgfHwgY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgICAgbmFtZXMucHVzaCgnZmlyZWJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hIHx8IGNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgbmFtZXMucHVzaCgncnVzdCcpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWcpIHtcbiAgICAgIC8vICFDYXJnby5sb2NrIG92ZXJyaWRlcyBhbnkgcHJlLWV4aXN0aW5nIHVuYW5jaG9yZWQgQ2FyZ28ubG9jayBydWxlIGZyb20gYVxuICAgICAgLy8gcGFyZW50IC5naXRpZ25vcmUsIHNvIHRoZSBhcHBsaWNhdGlvbiBsb2NrZmlsZSBzdGF5cyBjb21taXR0YWJsZS5cbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgIUNhcmdvLmxvY2tcbnNyYy10YXVyaS9nZW4vc2NoZW1hcy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmxpdGVzdHJlYW0pIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ2NwLXNhLWtleS5qc29uXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzQ2xvdWRmbGFyZSB8fCByb290Q29uZmlnLmlzQ2xvdWRmbGFyZSkge1xuICAgICAgLy8gLmRldi52YXJzKiBob2xkIGxvY2FsIHNlY3JldHMgZm9yIHdyYW5nbGVyIGRldiBhbmQgbXVzdCBuZXZlciBiZSBjb21taXR0ZWQsXG4gICAgICAvLyB1bmxpa2UgdGhlIGNvbW1pdHRlZCAuZW52Ly5lbnYuc3RhZ2luZyBmaWxlcyBvZiB0aGUgV2lsbEJvb3N0ZXIgY29udmVudGlvbi5cbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmRldi52YXJzKlxuLndyYW5nbGVyL1xuYDtcbiAgICB9XG4gICAgLy8gSWdub3JlZCBvbmx5IHdoZXJlIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0LCBzbyB3YmZ5IG5ldmVyIGlnbm9yZXMgYSBmaWxlIHRoYXQgbm90aGluZyByZWNyZWF0ZXMuIFRoaXMga2VlcHNcbiAgICAvLyBpdHMgdGhvdXNhbmRzIG9mIGxpbmVzIG91dCBvZiBldmVyeSB3cmFuZ2xlciBidW1wJ3MgZGlmZi4gQW5jaG9yZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYmVjYXVzZSBgd3JhbmdsZXIgdHlwZXNgXG4gICAgLy8gYW5kIHRoZSB1bnRyYWNraW5nIGJlbG93IG9ubHkgZXZlciB0b3VjaCB0aGlzIHBhY2thZ2UncyBvd24gZmlsZSwgbm90IGEgbmVzdGVkIG9uZSBhdCBhbnkgZGVwdGguXG4gICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNcbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICAvLyBUaGUgcnVzdCB0ZW1wbGF0ZSdzIHVuYW5jaG9yZWQgZGVidWcvIHdvdWxkIGFsc28gaGlkZSBmcm9udGVuZCBzb3VyY2VcbiAgICAgIC8vIGRpcmVjdG9yaWVzIHN1Y2ggYXMgc3JjL2RlYnVnLzsgY2FyZ28gb3V0cHV0IGlzIGFscmVhZHkgY292ZXJlZCBieSB0YXJnZXQvLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15kZWJ1Z1xcLyQvZ20sICcjIGRlYnVnLycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWcgfHwgY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKSB7XG4gICAgICAvLyBUaGUgcnVzdCB0ZW1wbGF0ZSBpZ25vcmVzIENhcmdvLmxvY2ssIGJ1dCBhIHNyYy10YXVyaSBjb25maWd1cmF0aW9uIG1hcmtzIGFuXG4gICAgICAvLyBhcHBsaWNhdGlvbiwgd2hvc2UgQ2FyZ28ubG9jayBtdXN0IGJlIGNvbW1pdHRlZCBmb3IgcmVwcm9kdWNpYmxlIGJ1aWxkcy4gVGhlXG4gICAgICAvLyBydWxlIGlzIGFsc28gZGlzYWJsZWQgd2hlbiBhIHN1YiBwYWNrYWdlIGNvbnRhaW5zIGEgVGF1cmkgYXBwbGljYXRpb24sIGJlY2F1c2VcbiAgICAgIC8vIGFuIHVuYW5jaG9yZWQgQ2FyZ28ubG9jayBydWxlIGluIGEgcGFyZW50IC5naXRpZ25vcmUgd291bGQgaGlkZSB0aGUgbmVzdGVkXG4gICAgICAvLyBhcHBsaWNhdGlvbidzIGxvY2tmaWxlLiBUYXVyaSBwbHVnaW4gbGlicmFyaWVzIChkZXRlY3RlZCBvbmx5IHZpYVxuICAgICAgLy8gQHRhdXJpLWFwcHMvKiBkZXBlbmRlbmNpZXMpIGtlZXAgdGhlIHRlbXBsYXRlJ3MgcG9saWN5IG9mIGlnbm9yaW5nIENhcmdvLmxvY2suXG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXkNhcmdvXFwubG9jayQvZ20sICcjIENhcmdvLmxvY2snKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBLZWVwIHBhY2thZ2UtbWFuYWdlciBzaGltcyBpbiB0aGUgRmlsZSBXYXRjaGVyIHByb2dyYW0gZmllbGQgc28gbm9kZSBkb2VzIG5vdFxuLy8gcGFyc2Ugd3JhcHBlciBzY3JpcHRzIHBhc3NlZCB0aHJvdWdoIGFyZ3VtZW50cy5cbmNvbnN0IG94Zm10UHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL294Zm10JztcbmNvbnN0IHByZXR0aWVyUHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZylcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWcpKSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhc2tPcHRpb25zID0gW1xuICAgIHtcbiAgICAgIGFyZ3M6ICctLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLm94Zm10LFxuICAgICAgbmFtZTogJ094Zm10JyxcbiAgICAgIHByb2dyYW06IG94Zm10UHJvZ3JhbSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFyZ3M6ICctLWNhY2hlIC0td3JpdGUnLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkphdmEoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5LFxuICAgICAgbmFtZTogJ1ByZXR0aWVyJyxcbiAgICAgIHByb2dyYW06IHByZXR0aWVyUHJvZ3JhbSxcbiAgICB9LFxuICBdXG4gICAgLmZpbHRlcigodGFzaykgPT4gdGFzay5jb25kaXRpb24pXG4gICAgLmZsYXRNYXAoKHRhc2spID0+IHRhc2suZXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnModGFzay5wcm9ncmFtLCB0YXNrLmFyZ3MsIHRhc2submFtZSwgZXh0KSkpO1xuXG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4gICAgJHt0YXNrT3B0aW9ucy5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJyB8ICdpc0J1bic+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBgJHtjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJ30gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsYDtcbn1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gW1xuICAnQHRzY29uZmlnL2J1bicsXG4gICdAdHNjb25maWcvbm9kZS1sdHMnLFxuICAnQHRzY29uZmlnL25vZGUtdHMnLFxuICAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZScsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZS90c2NvbmZpZy5qc29uJztcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvbm9kZS1sdHMvdHNjb25maWcuanNvbicsICdAdHNjb25maWcvbm9kZS10cy90c2NvbmZpZy5qc29uJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9idW4nXTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnXTtcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvbm9kZS1sdHMnLCAnQHRzY29uZmlnL25vZGUtdHMnXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJlxuICAgICFjb25maWcuaXNSb290ICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5wcml2YXRlICE9PSB0cnVlICYmXG4gICAgQXJyYXkuaXNBcnJheShjb25maWcucGFja2FnZUpzb24/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxudHlwZSBTZXR0aW5ncyA9IHtcbiAgYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXM/OiBzdHJpbmdbXTtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIGVuYWJsZVNjcmlwdHM/OiBib29sZWFuO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBucG1NaW5pbWFsQWdlR2F0ZT86IHN0cmluZztcbiAgbnBtUHJlYXBwcm92ZWRQYWNrYWdlcz86IHN0cmluZ1tdO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59ICYgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+O1xuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCB5YXJuTnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuZXhwb3J0IGNvbnN0IHlhcm5OcG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAvLyAtLS0tLS0tLS0tIFNUQVJUOiBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG4gICdAZXhlcmNvZGUvKicsXG4gICdAd2lsbGJvb3N0ZXIvKicsXG4gICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICdhdC1kZWNvcmF0b3JzJyxcbiAgJ2J1aWxkLXRzJyxcbiAgJ2dlbi1pMThuLXRzJyxcbiAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gIC8vIFRvIGRlYWwgd2l0aCBDVkUgbGlrZSBodHRwczovL25leHRqcy5vcmcvYmxvZy9DVkUtMjAyNS02NjQ3OFxuICAnbmV4dCcsXG4gICdAbmV4dC8qJyxcbiAgJ0B0eXBlcy8qJyxcbiAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgYHR5cGVzY3JpcHRgOyBgQHR5cGVzY3JpcHQvKmAgY292ZXJzIGl0cyBwbGF0Zm9ybSBiaW5hcmllcy5cbiAgJ3R5cGVzY3JpcHQnLFxuICAnQHR5cGVzY3JpcHQvKicsXG4gICdAb3hmbXQvKicsXG4gICdAb3hsaW50LyonLFxuICAnQG94bGludC10c2dvbGludC8qJyxcbiAgJ294Zm10JyxcbiAgJ294bGludCcsXG4gICdveGxpbnQtdHNnb2xpbnQnLFxuICAncmVhY3QnLFxuICAncmVhY3QtZG9tJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoaXNOZXdlclZlcnNpb24obGF0ZXN0VmVyc2lvbiwgY3VycmVudFZlcnNpb24pKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgbGV0IHNldHRpbmdzID0ge30gYXMgU2V0dGluZ3M7XG4gICAgdHJ5IHtcbiAgICAgIHNldHRpbmdzID0gKHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncyB8IHVuZGVmaW5lZCkgPz8gc2V0dGluZ3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIC8vIEluc3RhbGwtdGltZSBzY3JpcHRzIGFyZSBhIGNvbW1vbiBzdXBwbHktY2hhaW4gZXhlY3V0aW9uIHBhdGguIEtlZXAgdGhpc1xuICAgIC8vIGV4cGxpY2l0IHNvIHN0YWxlIHByb2plY3Qgc2V0dGluZ3MgY2Fubm90IHJlLWVuYWJsZSB0aGVtIGdsb2JhbGx5LlxuICAgIHNldHRpbmdzLmVuYWJsZVNjcmlwdHMgPSBmYWxzZTtcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIHNldHRpbmdzLm5wbU1pbmltYWxBZ2VHYXRlID0geWFybk5wbU1pbmltYWxBZ2VHYXRlO1xuICAgIHNldHRpbmdzLmFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzID0gW1xuICAgICAgLy8gWWFybiA0LjE0IGJsb2NrcyBnaXQgZGVwZW5kZW5jaWVzIHVubGVzcyB0aGUgcmVwb3NpdG9yeSBVUkwgaXMgZXhwbGljaXRseSBhbGxvd2VkLlxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvKi5naXQnLFxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgIF07XG4gICAgc2V0dGluZ3MubnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IHlhcm5OcG1QcmVhcHByb3ZlZFBhY2thZ2VzO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3BsdWdpbnMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAvLyBUaGUgdGFyZ2V0IHJlcG8gbWF5IG5vdCBoYXZlIHByZXR0aWVyIGluc3RhbGxlZCB5ZXQsIGFuZCB5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwgZWRpdHMgdGhpcyBmaWxlIGFmdGVyIGpzLXlhbWwuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgZ2V0WWFybnJjUHJldHRpZXJBcmdzKGNvbmZpZy5kaXJQYXRoLCB5YXJucmNZbWxQYXRoKSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFlhcm5yY1ByZXR0aWVyQXJncyhkaXJQYXRoOiBzdHJpbmcsIHlhcm5yY1ltbFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsnZGx4JywgJ3ByZXR0aWVyJywgJy0tbm8tY29uZmlnJywgJy0td3JpdGUnLCBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIHlhcm5yY1ltbFBhdGgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9uJ10sIGRpclBhdGgpIHx8ICcwLjAuMCc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJWZXJzaW9uKG5ld1ZlcnNpb246IHN0cmluZywgb2xkVmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTmV3VmVyc2lvbiA9IHNlbXZlci52YWxpZChuZXdWZXJzaW9uKTtcbiAgaWYgKCF2YWxpZE5ld1ZlcnNpb24pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gc2VtdmVyLmd0KHZhbGlkTmV3VmVyc2lvbiwgc2VtdmVyLnZhbGlkKG9sZFZlcnNpb24pID8/ICcwLjAuMCcpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQge1xuICBjbGFzc2lmeVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uLFxuICBpc01hbmFnZWRHZW5Db2RlU2VnbWVudCxcbiAgaXNVbm1vZGVsZWRXcmFuZ2xlclR5cGVzU2VnbWVudCxcbiAgcGFyc2VXcmFuZ2xlclR5cGVzSW52b2NhdGlvbixcbiAgcG9zdGluc3RhbGxHZW5lcmF0ZXNXb3JrZXJUeXBlcyxcbiAgcmVhY2hlc1dyYW5nbGVyVHlwZXMsXG4gIHNjcmlwdENoYW5nZXNXb3JraW5nRGlyZWN0b3J5LFxuICBzZWxlY3RQcm9qZWN0V3JhbmdsZXJUeXBlc0dlbmVyYXRvcixcbiAgc3BsaXRDb21tYW5kU2VnbWVudHMsXG59IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyVHlwZXNDb21tYW5kLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMsIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcbmltcG9ydCB7IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMsIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyB9IGZyb20gJy4vYnVuZmlnLmpzJztcbmltcG9ydCB7IHlhcm5OcG1NaW5pbWFsQWdlR2F0ZSwgeWFybk5wbVByZWFwcHJvdmVkUGFja2FnZXMgfSBmcm9tICcuL3lhcm5yYy5qcyc7XG5cbmNvbnN0IG94bGludERlcHMgPSBbJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLCAnb3hmbXQnLCAnb3hsaW50JywgJ294bGludC10c2dvbGludCddO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG4vLyBUeXBlU2NyaXB0IDcncyBgdHlwZXNjcmlwdGAgcGFja2FnZSBpcyB0aGUgdHNnbyBuYXRpdmUgY29tcGlsZXIgYW5kIGV4cG9zZXMgbm9cbi8vIHByb2dyYW1tYXRpYyBBUEkuIE5leHQuanMncyBidWlsZC10aW1lIGB2ZXJpZnlUeXBlU2NyaXB0U2V0dXBgIG5lZWRzIHRoYXQgQVBJLCBzb1xuLy8gYG5leHQgYnVpbGRgIGZhaWxzIChcInRyeWluZyB0byB1c2UgVHlwZVNjcmlwdCBidXQgZG8gbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBhY2thZ2UocylcIilcbi8vIHdpdGggb25seSBgdHlwZXNjcmlwdGAgdjcgaW5zdGFsbGVkLiBOZXh0LmpzIHJlc29sdmVzIHRoZSB0c2dvIGJpbmFyeSB0aHJvdWdoIHRoZVxuLy8gc2VwYXJhdGUgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCBwYWNrYWdlLCBzbyBOZXh0LmpzLWZhbWlseSByZXBvcyBtdXN0IGluc3RhbGxcbi8vIGJvdGg7IG90aGVyIHJlcG9zIG9ubHkgbmVlZCBgdHlwZXNjcmlwdGAgZm9yIGB0c2NgIHR5cGVjaGVja3MuXG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3QgbGVmdGhvb2tEZXBlbmRlbmN5ID0gJ2xlZnRob29rJztcbmNvbnN0IGRlZmF1bHRHZW5JMThuVHNTY3JpcHQgPSAnZ2VuLWkxOG4tdHMgLWkgaTE4biAtbyBzcmMvX19nZW5lcmF0ZWRfXy9pMThuLnRzIC1kIGphLUpQJztcbmNvbnN0IG1hbmFnZWREZXBlbmRlbmN5TmFtZXMgPSBuZXcgU2V0KFtcbiAgd2JEZXBlbmRlbmN5LFxuICBidWlsZFRzRGVwZW5kZW5jeSxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0RGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSxcbiAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgLi4ub3hsaW50RGVwcyxcbl0pO1xuY29uc3Qgd2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyA9IFtcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAuLi5veGxpbnREZXBzLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpLFxuXTtcbmNvbnN0IG9ic29sZXRlTGludERlcGVuZGVuY2llcyA9IFtcbiAgJ0BiaW9tZWpzL2Jpb21lJyxcbiAgJ0Blc2xpbnQtcmVhY3QvZXNsaW50LXBsdWdpbicsXG4gICdAZXNsaW50L2pzJyxcbiAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICdAdHlwZXMvZXNsaW50JyxcbiAgJ0B0eXBlcy9taWNyb21hdGNoJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLFxuICAnYmlvbWUnLFxuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgJ2VzbGludC1wbHVnaW4tcGVyZmVjdGlvbmlzdCcsXG4gICdlc2xpbnQtcGx1Z2luLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QnLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1jb21waWxlcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tc3Rvcnlib29rJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuICAnbWljcm9tYXRjaCcsXG4gICd0eXBlc2NyaXB0LWVzbGludCcsXG5dO1xuY29uc3QgbWljcm9tYXRjaFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWydtaWNyb21hdGNoJywgJ0B0eXBlcy9taWNyb21hdGNoJ10pO1xuY29uc3QgbWljcm9tYXRjaEltcG9ydFBhdHRlcm4gPVxuICAvXFxiZnJvbVxccytbJ1wiXW1pY3JvbWF0Y2hbJ1wiXXxcXGJyZXF1aXJlXFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKXxcXGJpbXBvcnRcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpL3U7XG5cbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgbnBtUGFja2FnZVRpbWVzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgdXBkYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKGNvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMsIHNraXBBZGRpbmdEZXBzKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGdlbmVyYXRlZFxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcywgcGFja2FnZU1hbmFnZXIpO1xuICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZmlsZVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoanNvbk9iai5zY3JpcHRzKTtcblxuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzdGFydC10ZXN0LXNlcnZlciddO1xuXG4gIGNvbnN0IHNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHM7XG4gIGlmIChjb25maWcuaXNCdW4gfHwgIWRvZXNDb250YWluSmF2YShjb25maWcpKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0cy5wcmV0dGlmeSA9IChzY3JpcHRzLnByZXR0aWZ5ID8/ICcnKSArIChhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKSk7XG4gIH1cbiAgbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHMpO1xuICBub3JtYWxpemVSYWlsd2F5Q2xpU2NyaXB0KGNvbmZpZywgc2NyaXB0cyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEZyZXNoIHJlcG9zIHN0aWxsIHJlcXVpcmUgc3RhbmRhbG9uZSBgeWFybiBpbnN0YWxsYDsgb25seSByZW1vdmUgbGVnYWN5IGluc3RhbGwgcHJlZml4ZXMgYmVmb3JlIGFub3RoZXIgY29tbWFuZC5cbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgveWFyblxccyooPzppbnN0YWxsXFxzKik/JiZcXHMqL2d1LCAnJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIHdyYW5nbGVyVHlwZXM6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSkge1xuICAgIC8vIEtlZXAgdGhlIHByb2plY3QncyBvd24gd29ya2VyLXR5cGVzIHBpcGVsaW5lIChwcmVyZXF1aXNpdGVzIGluY2x1ZGVkIOKAlCBlLmcuIGBub2RlIHNjcmlwdHMvcHJlcGFyZVR5cGVzLmpzXG4gICAgLy8gJiYgd3JhbmdsZXIgdHlwZXMgLi4uYCkgd2hlbiByZXdyaXRpbmcgcG9zdGluc3RhbGw6IGRyb3BwaW5nIGEgcHJlcmVxdWlzaXRlIHdvdWxkIGxlYXZlIGZyZXNoIGNoZWNrb3V0c1xuICAgIC8vIHVuYWJsZSB0byByZWdlbmVyYXRlIHRoZSBmaWxlLCBhbmQgZHJvcHBpbmcgdGhlIGludm9jYXRpb24gaXRzZWxmIChlLmcuIGB3cmFuZ2xlciB0eXBlcyAtLWNvbmZpZ1xuICAgIC8vIGNvbmZpZy93b3JrZXIuanNvbmNgLCB3aGljaCB3YmZ5IGRvZXMgbm90IG1hbmFnZSwgcG9zc2libHkgYmVoaW5kIGEgd3JhcHBlciBzY3JpcHQpIHdvdWxkIGRyb3AgdGhlXG4gICAgLy8gZ2VuZXJhdGlvbiBlbnRpcmVseS5cbiAgICBjb25zdCBwb3N0aW5zdGFsbFNlZ21lbnRzID0gc2NyaXB0cy5wb3N0aW5zdGFsbCA/IHNwbGl0Q29tbWFuZFNlZ21lbnRzKHNjcmlwdHMucG9zdGluc3RhbGwpIDogW107XG4gICAgY29uc3QgaW52b2x2ZXNXcmFuZ2xlclR5cGVzID1cbiAgICAgIHJlYWNoZXNXcmFuZ2xlclR5cGVzKHNjcmlwdHMucG9zdGluc3RhbGwsIHNjcmlwdHMsICgpID0+IHRydWUpIHx8XG4gICAgICAvLyBTaGVsbCBmb3JtcyB0aGUgcGFyc2VyIGNhbm5vdCBtb2RlbCAoZS5nLiBgbm9kZSBzY3JpcHRzL3ByZXBhcmUuanM7IHdyYW5nbGVyIHR5cGVzIC0tY29uZmlnIC4uLmAsXG4gICAgICAvLyBhIHdyYXBwZXIgZm9yd2FyZGluZyBhcmd1bWVudHMpIHN0aWxsIGdlbmVyYXRlIG9uIGluc3RhbGwgYW5kIG11c3Qgc3Vydml2ZSB0aGUgcmV3cml0ZSB2ZXJiYXRpbSDigJRcbiAgICAgIC8vIGhlbmNlIHNwbGl0Q29tbWFuZFNlZ21lbnRzLCB3aGljaCBuZXZlciB0cnVuY2F0ZXMgYXQgYSBgY2RgLiBBIGdlbmVyYXRvciBiZWhpbmQgYSByZWFsIGBjZGAgcGFyc2VzXG4gICAgICAvLyBpbiBpc29sYXRpb24gYnV0IHJ1bnMgZWxzZXdoZXJlLCBzbyBpdCBjb3VudHMgYXMgaW52b2x2ZWQgdG9vLlxuICAgICAgcG9zdGluc3RhbGxTZWdtZW50cy5zb21lKChzZWdtZW50KSA9PiBpc1VubW9kZWxlZFdyYW5nbGVyVHlwZXNTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMpKSB8fFxuICAgICAgKHNjcmlwdENoYW5nZXNXb3JraW5nRGlyZWN0b3J5KHNjcmlwdHMucG9zdGluc3RhbGwgPz8gJycpICYmXG4gICAgICAgIHBvc3RpbnN0YWxsU2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gISFwYXJzZVdyYW5nbGVyVHlwZXNJbnZvY2F0aW9uKHNlZ21lbnQpKSk7XG4gICAgY29uc3QgcHJlc2VydmVkU2VnbWVudHMgPSBpbnZvbHZlc1dyYW5nbGVyVHlwZXNcbiAgICAgID8gcG9zdGluc3RhbGxTZWdtZW50cy5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgIT09ICcnICYmICFpc01hbmFnZWRHZW5Db2RlU2VnbWVudChzZWdtZW50LCBzY3JpcHRzKSlcbiAgICAgIDogW107XG4gICAgc2NyaXB0cy5wb3N0aW5zdGFsbCA9IFsnd2IgZ2VuLWNvZGUnLCAuLi5wcmVzZXJ2ZWRTZWdtZW50c10uam9pbignICYmICcpO1xuICB9IGVsc2UgaWYgKHNjcmlwdHMucG9zdGluc3RhbGw/LmluY2x1ZGVzKCdnZW4taTE4bi10cycpKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMucG9zdGluc3RhbGw7XG4gIH1cbiAgaWYgKCF3cmFuZ2xlclR5cGVzKSByZXR1cm47XG4gIC8vIEEgV29ya2VyIHBhY2thZ2Ugd2l0aG91dCBhIGdlbi1jb2RlIHNjcmlwdCBzdGlsbCBuZWVkcyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGJlZm9yZSB0eXBlIGNoZWNraW5nLlxuICAvLyBXcmFwcGVyIGludm9jYXRpb25zIChlLmcuIGBcInBvc3RpbnN0YWxsXCI6IFwieWFybiBnZW46dHlwZXNcImApIGFscmVhZHkgZ2VuZXJhdGUgaXQsIHNvIGFkZGluZyB0aGUgcmVzb2x2ZWRcbiAgLy8gY29tbWFuZCB3b3VsZCBnZW5lcmF0ZSB0aGUgfjE1ay1saW5lIGZpbGUgdHdpY2UgcGVyIGluc3RhbGwuIE9ubHkgYSBnZW5lcmF0aW5nIGRlZmF1bHQtb3V0cHV0IGludm9jYXRpb25cbiAgLy8gY291bnRzOiBgd3JhbmdsZXIgdHlwZXMgLS1jaGVja2Agb3IgYSBjdXN0b20gb3V0cHV0IHBhdGggbGVhdmVzIHRoZSBtYW5hZ2VkIGZpbGUgYWJzZW50IG9uIGEgZnJlc2ggY2xvbmUuXG4gIGlmIChwb3N0aW5zdGFsbEdlbmVyYXRlc1dvcmtlclR5cGVzKHNjcmlwdHMpKSByZXR1cm47XG5cbiAgLy8gQSByZWFjaGFibGUgbm9uLWdlbmVyYXRpbmcgaW52b2NhdGlvbiAoZS5nLiBgd3JhbmdsZXIgdHlwZXMgLS1jaGVja2AsIHdoaWNoIGZhaWxzIHdoaWxlIHRoZSBnaXRpZ25vcmVkIGZpbGVcbiAgLy8gaXMgc3RpbGwgYWJzZW50KSBtdXN0IHNlZSB0aGUgZ2VuZXJhdGVkIGZpbGUsIGFuZCBhIGRpcmVjdG9yeS1jaGFuZ2luZyBwb3N0aW5zdGFsbCAoYGNkIC4uL3Rvb2xzICYmIC4uLmApXG4gIC8vIHdvdWxkIHJ1biBhbiBhcHBlbmRlZCBnZW5lcmF0b3Igc29tZXdoZXJlIGVsc2Ug4oCUIGJvdGggbmVlZCB0aGUgZ2VuZXJhdG9yIGZpcnN0OyBvdGhlcndpc2UgYXBwZW5kIHRvIGtlZXBcbiAgLy8gdGhlIHByb2plY3QncyBvd24gb3JkZXIuXG4gIGNvbnN0IG9sZFBvc3RpbnN0YWxsID0gc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgc2NyaXB0cy5wb3N0aW5zdGFsbCA9XG4gICAgb2xkUG9zdGluc3RhbGwgJiZcbiAgICAocmVhY2hlc1dyYW5nbGVyVHlwZXMob2xkUG9zdGluc3RhbGwsIHNjcmlwdHMsICgpID0+IHRydWUpIHx8IHNjcmlwdENoYW5nZXNXb3JraW5nRGlyZWN0b3J5KG9sZFBvc3RpbnN0YWxsKSlcbiAgICAgID8gYCR7d3JhbmdsZXJUeXBlc30gJiYgJHtvbGRQb3N0aW5zdGFsbH1gXG4gICAgICA6IGFwcGVuZFdyYW5nbGVyVHlwZXMob2xkUG9zdGluc3RhbGwgPz8gJycsIHdyYW5nbGVyVHlwZXMpLnJlcGxhY2UoL14gJiYgL3UsICcnKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc2luZ2xlIGB3cmFuZ2xlciB0eXBlc2AgY29tbWFuZCB0aGF0IGV2ZXJ5IG1hbmFnZWQgc2NyaXB0IG11c3QgcnVuLCBvciB1bmRlZmluZWQgd2hlbiB3YmZ5IGRvZXMgbm90XG4gKiBtYW5hZ2Ugd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlIHBhY2thZ2UuXG4gKlxuICogU2Nhbm5pbmcgZXZlcnkgc2NyaXB0IChub3QganVzdCBwb3N0aW5zdGFsbCkgbWF0dGVycyBiZWNhdXNlIHByb2plY3RzIGtlZXAgdGhlIGZsYWdnZWQgaW52b2NhdGlvbiBpbiBhIHNjcmlwdCBvZlxuICogdGhlaXIgb3duLCBlLmcuIGBcImdlbi10eXBlc1wiOiBcIndyYW5nbGVyIHR5cGVzIC0tc3RyaWN0LXZhcnM9ZmFsc2VcImAuIFJldXNpbmcgaXQga2VlcHMgdGhlIGRlY2xhcmF0aW9ucyB3YmZ5XG4gKiByZWdlbmVyYXRlcyBpZGVudGljYWwgdG8gdGhlIG9uZXMgdGhlIHByb2plY3QgaW50ZW5kZWQ6IC0tc3RyaWN0LXZhcnM9ZmFsc2Ugd2lkZW5zIGB2YXJzYCB0byBzdHJpbmcsIHdoZXJlYXMgdGhlXG4gKiBkZWZhdWx0IGVtaXRzIGxpdGVyYWwgdW5pb24gdHlwZXMuIEJvdGggbWFuYWdlZCBzY3JpcHRzIGdldCB0aGUgc2FtZSBjb21tYW5kIHNvIHRoZSBmaWxlIGNhbm5vdCBkZXBlbmQgb24gd2hpY2ggb2ZcbiAqIHRoZW0gcmFuIGxhc3QuIE9ubHkgYSBnZW5lcmF0aW5nIGRlZmF1bHQtb3V0cHV0IGludm9jYXRpb24gcXVhbGlmaWVzIChzZWVcbiAqIGNsYXNzaWZ5V3JhbmdsZXJUeXBlc0ludm9jYXRpb24pOyBhbnl0aGluZyBlbHNlIGZhbGxzIGJhY2sgdG8gdGhlIG1hbmFnZWQgZGVmYXVsdCBjb21tYW5kLlxuICovXG5mdW5jdGlvbiByZXNvbHZlV3JhbmdsZXJUeXBlc0NvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKSByZXR1cm47XG5cbiAgLy8gT25seSBhbiBpbnZvY2F0aW9uIHBhc3NpbmcgZmxhZ3MgaXMgd29ydGggcHJlc2VydmluZzsgYSBiYXJlIG9uZSBpcyBub3JtYWxpemVkIHRvIHRoZSBtYW5hZ2VkIGNvbW1hbmQuXG4gIGNvbnN0IHsgY29tbWFuZCB9ID0gc2VsZWN0UHJvamVjdFdyYW5nbGVyVHlwZXNHZW5lcmF0b3Ioc2NyaXB0cyk7XG4gIHJldHVybiBjb21tYW5kID8/IGAke2NvbmZpZy5pc0J1biA/ICdidW54ICcgOiAnJ313cmFuZ2xlciB0eXBlc2A7XG59XG5cbi8qKlxuICogQ2xvdWRmbGFyZSBXb3JrZXJzIHByb2plY3RzIHJlbHkgb24gYHdyYW5nbGVyIHR5cGVzYCB0byAocmUpZ2VuZXJhdGUgdGhlIGdpdGlnbm9yZWQgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cy5cbiAqIEJlY2F1c2UgYHdiIGdlbi1jb2RlYCBkb2VzIG5vdCBwcm9kdWNlIGl0LCBhcHBlbmQgdGhlIGNvbW1hbmQgdG8gY29kZS1nZW5lcmF0aW9uIHNjcmlwdHM7IG90aGVyd2lzZSBhIGZyZXNoXG4gKiBjaGVja291dCAoZS5nLiBDSSkgd291bGQgZmFpbCB0eXBlIGNoZWNraW5nLlxuICovXG5mdW5jdGlvbiBhcHBlbmRXcmFuZ2xlclR5cGVzKHNjcmlwdDogc3RyaW5nLCB3cmFuZ2xlclR5cGVzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIXdyYW5nbGVyVHlwZXMpIHJldHVybiBzY3JpcHQ7XG4gIHJldHVybiBgJHtzY3JpcHR9ICYmICR7d3JhbmdsZXJUeXBlc31gO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICAvLyBEZWFsIHdpdGggYnJlYWtpbmcgY2hhbmdlcyBpbiB5YXJuIGJlcnJ5IDQuMC4wLXJjLjQ5XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIHNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoXG4gICAgICAveWFybiB3b3Jrc3BhY2VzIGZvcmVhY2goPyFcXHMrKD86LUF8LVJ8LS0oPzphbGx8cmVjdXJzaXZlfHNpbmNlfHdvcmt0cmVlfGZyb218aW5jbHVkZXxleGNsdWRlfHB1YmxpY3xwcml2YXRlKSkpL2d1LFxuICAgICAgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJ1xuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmFpbHdheUNsaVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgaWYgKGNvbmZpZy5pc0J1biB8fCAhc2NyaXB0cy5yYWlsd2F5Py5pbmNsdWRlcygnQHJhaWx3YXkvY2xpJykpIHJldHVybjtcblxuICBzY3JpcHRzLnJhaWx3YXkgPSAnWUFSTl9FTkFCTEVfU0NSSVBUUz10cnVlIHlhcm4gZGx4IEByYWlsd2F5L2NsaSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPERlcGVuZGVuY3lVcGRhdGVzPiB7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICBpZiAoXG4gICAgaGFzSmF2YSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXInKTtcbiAgfSBlbHNlIHtcbiAgICByZW1vdmVQcmV0dGllckFydGlmYWN0cyhqc29uT2JqKTtcbiAgfVxuXG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbGludC1zdGFnZWQnXTtcbiAgZGVsZXRlIChqc29uT2JqIGFzIFBhY2thZ2VKc29uICYgeyAnbGludC1zdGFnZWQnPzogdW5rbm93biB9KVsnbGludC1zdGFnZWQnXTtcblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5odXNreTtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwdWJsaXNoO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcHVibGlzaE9ubHk7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2s7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChsZWZ0aG9va0RlcGVuZGVuY3kpO1xuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKGpzb25PYmouc2NyaXB0cy5yZWxlYXNlKSkge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRSdW50aW1lKSB7XG4gICAgICAgIC8vIFJ1bnRpbWUgaW1wb3J0cyBuZWVkIHRoZSBzdGFuZGFsb25lIHBhY2thZ2UgYWZ0ZXIgRG9ja2VyIHBydW5pbmcgcmVtb3ZlcyBkZXZEZXBlbmRlbmNpZXMuXG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz89XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCA/P1xuICAgICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gPz9cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCgncGxheXdyaWdodCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaXhlcnMvbmV4dENvbmZpZy50cyBlbmFibGVzIGByZWFjdENvbXBpbGVyOiB0cnVlYCBmb3IgZXZlcnkgTmV4dC5qcyBwcm9qZWN0LCBhbmQgTmV4dC5qc1xuICAvLyByZXNvbHZlcyBgYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyYCBhdCBidWlsZCB0aW1lIHdoZW4gUmVhY3QgQ29tcGlsZXIgaXMgb24uIEFkZCBpdCBoZXJlIHNvXG4gIC8vIHRoZSBtYW5hZ2VkIG5leHQuY29uZmlnIG5ldmVyIGJyZWFrcyBgbmV4dCBidWlsZGAgd2l0aCBhbiB1bnJlc29sdmVkLXBhY2thZ2UgZXJyb3IuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyk7XG4gIH1cblxuICBpZiAoIWlzV2JQYWNrYWdlKGpzb25PYmopKSB7XG4gICAgaWYgKHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaikpIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG4gIC8vIGJ1aWxkLXRzIG93bnMgVHlwZVNjcmlwdCBleGVjdXRpb24gYW5kIGRlY2xhcmF0aW9uIGVtaXQuIHdiZnkgbXVzdCBhbHdheXNcbiAgLy8ga2VlcCBleGlzdGluZyBidWlsZC10cyB1c2VycyBjdXJyZW50IGJlY2F1c2Ugb2xkZXIgcmVsZWFzZXMgY2FuIGVtaXQgLmQudHNcbiAgLy8gZmlsZXMgYXQgcGF0aHMgdGhhdCBubyBsb25nZXIgbWF0Y2ggcGFja2FnZSBleHBvcnRzLlxuICBpZiAoXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhqc29uT2JqLnNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gc2NyaXB0Py5pbmNsdWRlcyhidWlsZFRzRGVwZW5kZW5jeSkpXG4gICkge1xuICAgIGlmIChzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaikpIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLm94bGludERlcHMpO1xuICB9XG5cbiAgY29uc3QgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSA/IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpIDogW107XG4gIGF3YWl0IHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmosIHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLnRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UsIHNvIGl0IGlzXG4gICAgLy8gbm93IHRoZSBtYW5hZ2VkIGNvbXBpbGVyIGZvciBldmVyeSBUeXBlU2NyaXB0IHJlcG8gKHR5cGVjaGVja2luZyBydW5zIGB0c2NgKS5cbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0RGVwZW5kZW5jeSk7XG4gICAgLy8gTmV4dC5qcydzIGBuZXh0IGJ1aWxkYCBpbnNwZWN0cyBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSB0byBydW4gaXRzIHR5cGVcbiAgICAvLyBjaGVjazsgdGhlIGB0eXBlc2NyaXB0YCB2NyBwYWNrYWdlIGFsb25lIGxhY2tzIHRoZSBBUEkgbmV4dCBuZWVkcywgc28ga2VlcCBib3RoXG4gICAgLy8gaW5zdGFsbGVkIGZvciBOZXh0LmpzLWZhbWlseSByZXBvcy4gU2VlIHRoZSB0eXBlc2NyaXB0R29EZXBlbmRlbmN5IGNvbW1lbnQgYWJvdmUuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0R29EZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL25vZGUnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvXFxiKD86YnVueHxucHh8cG5wbVxccytkbHh8eWFyblxccytkbHgpXFxzK3NlbWFudGljLXJlbGVhc2UoPzpAXFxTKyk/XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIGtlZXBBc1J1bnRpbWVdIG9mIFtcbiAgICBbd2JEZXBlbmRlbmN5LCBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgICBbYnVpbGRUc0RlcGVuZGVuY3ksIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAoa2VlcEFzUnVudGltZSkge1xuICAgICAgY29uc3QgZGV2VmVyc2lvbiA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFkZXZWZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIXJ1bnRpbWVWZXJzaW9uIHx8IGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihkZXZWZXJzaW9uLCBydW50aW1lVmVyc2lvbikpIHtcbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBkZXZWZXJzaW9uO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH0gZWxzZSBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHtcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwb3N0aW5zdGFsbFNjcmlwdCA9IGpzb25PYmouc2NyaXB0cz8ucG9zdGluc3RhbGw7XG4gIHJldHVybiB0eXBlb2YgcG9zdGluc3RhbGxTY3JpcHQgPT09ICdzdHJpbmcnICYmIC9cXGJ3YlxcYi91LnRlc3QocG9zdGluc3RhbGxTY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgY29uc3QgcHJpc21hID0ganNvbk9iai5wcmlzbWEgYXMgeyBzZWVkPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhwcmlzbWE/LnNlZWQpIHx8IGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoanNvbk9iai5zY3JpcHRzPy5zZWVkKTtcbn1cblxuZnVuY3Rpb24gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhzZWVkQ29tbWFuZDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIERvY2tlciBpbWFnZXMgcnVuIHNlZWQgc2NyaXB0cyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCxcbiAgLy8gc28gVHlwZVNjcmlwdCBzZWVkIHJ1bm5lcnMgbXVzdCByZW1haW4gYXZhaWxhYmxlIGF0IHJ1bnRpbWUuXG4gIHJldHVybiB0eXBlb2Ygc2VlZENvbW1hbmQgPT09ICdzdHJpbmcnICYmIC8oPzwhW1xcdy1dKWJ1aWxkLXRzKD8hW1xcdy1dKS91LnRlc3Qoc2VlZENvbW1hbmQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgYXdhaXQgbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKGNvbmZpZywganNvbk9iaik7XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICAvLyBZYXJuIHRyZWF0cyB0aGUgbGVnYWN5IG5wbS9jaGFsayByZXNvbHV0aW9uIGFsaWFzIGFzIGFuIGludmFsaWQgcGFja2FnZSB0b2tlbi5cbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIFsnY2xlYW51cCddKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0ganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgICAgICAgIGlmICghc2NyaXB0KSBjb250aW51ZTtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV0gPSBzY3JpcHQucmVwbGFjZSgvID8mJiA/eWFybiBsaW50LWZpeCg/OiAtLXF1aWV0KT8vLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAneWFybiBsaW50IC0tZml4JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0LCBjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcmlwdFJ1bm5lciA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY29tbW9uL2NpLXNldHVwJ10gPSBgJHtzY3JpcHRSdW5uZXJ9IHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknID8gJ3V2JyA6ICdwb2V0cnknfWBdO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc2V0dXAtcG9ldHJ5LWFzZGYnXTtcbiAgICAgIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gXSA9IGdldFB5dGhvblNldHVwQ29tbWFuZChweXRob25QYWNrYWdlTWFuYWdlcik7XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgnLycpO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGNvbnN0IHB5dGhvblJ1bm5lciA9IGAke3B5dGhvblBhY2thZ2VNYW5hZ2VyfSBydW5gO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGAke3B5dGhvblJ1bm5lcn0gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmICR7cHl0aG9uUnVubmVyfSBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IGAke3NjcmlwdFJ1bm5lcn0gbGludGA7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQsIGNvbmZpZyk7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIC8vIFJlc29sdmVkIGJlZm9yZSB0aGUgbWFuYWdlZCBzY3JpcHRzIGFyZSBvdmVyd3JpdHRlbiwgc28gYSBwcm9qZWN0LXNwZWNpZmljIGludm9jYXRpb24gaXMgc3RpbGwgdmlzaWJsZS5cbiAgY29uc3Qgd3JhbmdsZXJUeXBlcyA9IHJlc29sdmVXcmFuZ2xlclR5cGVzQ29tbWFuZChjb25maWcsIGpzb25PYmouc2NyaXB0cyk7XG4gIGNvbnN0IGdlbkNvZGVTY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIGlmIChnZW5Db2RlU2NyaXB0Py5pbmNsdWRlcygnTm8gY29kZSBnZW5lcmF0aW9uIG5lZWRlZCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgfSBlbHNlIGlmIChzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWcsIGdlbkNvZGVTY3JpcHQpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gYXBwZW5kV3JhbmdsZXJUeXBlcyhgJHtjb25maWcuaXNCdW4gPyAnYnVuICcgOiAnJ313YiBnZW4tY29kZWAsIHdyYW5nbGVyVHlwZXMpO1xuICB9IGVsc2UgaWYgKFxuICAgIGdlbkNvZGVTY3JpcHQgJiZcbiAgICB3cmFuZ2xlclR5cGVzICYmXG4gICAgIXJlYWNoZXNXcmFuZ2xlclR5cGVzKFxuICAgICAgZ2VuQ29kZVNjcmlwdCxcbiAgICAgIGpzb25PYmouc2NyaXB0cyxcbiAgICAgIChpbnZvY2F0aW9uQXJncykgPT4gY2xhc3NpZnlXcmFuZ2xlclR5cGVzSW52b2NhdGlvbihpbnZvY2F0aW9uQXJncykgPT09ICdyZXVzYWJsZUdlbmVyYXRvcidcbiAgICApXG4gICkge1xuICAgIC8vIEEgcHJvamVjdC1zcGVjaWZpYyBnZW4tY29kZSBtdXN0IHByb2R1Y2UgdGhlIHNhbWUgZGVjbGFyYXRpb25zIGFzIHBvc3RpbnN0YWxsLCBvciBydW5uaW5nIHRoZSBkb2N1bWVudGVkXG4gICAgLy8gY29kZS1nZW5lcmF0aW9uIGVudHJ5IHBvaW50IHdvdWxkIGxlYXZlIHRoZSBnZW5lcmF0ZWQgd29ya2VyIHR5cGVzIHN0YWxlLiBMaWtlIHRoZSBwb3N0aW5zdGFsbCByZXdyaXRlLFxuICAgIC8vIGEgcmVhY2hhYmxlIG5vbi1nZW5lcmF0aW5nIGludm9jYXRpb24gKGUuZy4gYHdyYW5nbGVyIHR5cGVzIC0tY2hlY2tgKSBvciBhIGRpcmVjdG9yeSBjaGFuZ2UgbmVlZHMgdGhlXG4gICAgLy8gZ2VuZXJhdG9yIGZpcnN0LlxuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9XG4gICAgICByZWFjaGVzV3JhbmdsZXJUeXBlcyhnZW5Db2RlU2NyaXB0LCBqc29uT2JqLnNjcmlwdHMsICgpID0+IHRydWUpIHx8IHNjcmlwdENoYW5nZXNXb3JraW5nRGlyZWN0b3J5KGdlbkNvZGVTY3JpcHQpXG4gICAgICAgID8gYCR7d3JhbmdsZXJUeXBlc30gJiYgJHtnZW5Db2RlU2NyaXB0fWBcbiAgICAgICAgOiBhcHBlbmRXcmFuZ2xlclR5cGVzKGdlbkNvZGVTY3JpcHQsIHdyYW5nbGVyVHlwZXMpO1xuICB9XG4gIG5vcm1hbGl6ZUdlbkkxOG5Uc1NjcmlwdChjb25maWcsIGpzb25PYmopO1xuICB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChqc29uT2JqLnNjcmlwdHMsIHdyYW5nbGVyVHlwZXMpO1xuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRHZW5Db2RlU2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8XG4gICAgY29uZmlnLmRlcGVuZGluZy5jaGFrcmEgfHxcbiAgICBjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fFxuICAgIGNvbmZpZy5kZXBlbmRpbmcucHJpc21hIHx8XG4gICAgKGNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSAmJiAhIW9sZEdlbkNvZGVTY3JpcHQ/LmluY2x1ZGVzKCdkcml6emxlLWtpdCBjaGVjaycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChmb3JtYXRTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gQnVuIHByb2plY3RzIG1heSBub3QgaGF2ZSBhIFlhcm4gbG9ja2ZpbGUsIHNvIGdlbmVyYXRlZCBwYWNrYWdlIHNjcmlwdHNcbiAgLy8gbXVzdCBpbnZva2UgbG9jYWwgcGFja2FnZSBzY3JpcHRzIHRocm91Z2ggdGhlIHJlcG9zaXRvcnkncyBwYWNrYWdlIG1hbmFnZXIuXG4gIGNvbnN0IHNjcmlwdFJ1bm5lciA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIGZvcm1hdFNjcmlwdCA/IGAke2Zvcm1hdFNjcmlwdH0gJiYgJHtzY3JpcHRSdW5uZXJ9IGZvcm1hdC1jb2RlYCA6IGAke3NjcmlwdFJ1bm5lcn0gZm9ybWF0LWNvZGVgO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVHZW5JMThuVHNTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghc2hvdWxkTWFuYWdlR2VuSTE4blRzKGNvbmZpZykpIHJldHVybjtcblxuICBpZiAoanNvbk9iai5zY3JpcHRzWydnZW4taTE4bi10cyddID09PSBkZWZhdWx0R2VuSTE4blRzU2NyaXB0KSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZ2VuLWkxOG4tdHMnXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwXSk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyldLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKS5maWx0ZXIoKGRlcGVuZGVuY3kpID0+IG1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGpzb25PYmpba2V5XTtcbiAgICBpZiAoc2VjdGlvbiAmJiBPYmplY3Qua2V5cyhzZWN0aW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9iaiwga2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogdm9pZCB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuXG4gIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyICYmIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzKV07XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5Jykge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKCd1dicsIFsnYWRkJywgJy0tZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5JyB8ICd1dicgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSByZXR1cm4gJ3V2JztcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHJldHVybiAncG9ldHJ5Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiAncG9ldHJ5JyB8ICd1dicpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd1dicpIHJldHVybiAndXYgc3luYyAtLWZyb3plbic7XG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgcG9ldHJ5IGVudiB1c2UgJChtaXNlIGN1cnJlbnQgcHl0aG9uKSAmJiBwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAgJiYgcG9ldHJ5IGluc3RhbGwnO1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFtcbiAgICAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZywgZGVwZW5kZW5jeSkpKSxcbiAgXTtcbiAgc3Bhd25TeW5jKFxuICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgIFsnYWRkJywgLi4uKGRldiA/IFsnLUQnXSA6IFtdKSwgLi4uKGNvbmZpZy5pc0J1biA/IFsnLS1leGFjdCddIDogW10pLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sXG4gICAgY29uZmlnLmRpclBhdGhcbiAgKTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSA9IHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gICAgICBjb25maWcsXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGRlcGVuZGVuY2llc1RvSW5zdGFsbC5wdXNoKGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKCFza2lwQWRkaW5nRGVwcykgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgaWYgKGxhdGVzdFZlcnNpb24gPT09ICcqJyAmJiBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBsYXRlc3RWZXJzaW9uO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nLFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZWxhdGl2ZUZpbGVQYXRoKSByZXR1cm47XG5cbiAgLy8gUmV1c2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3Mgb3duIGZvcm1hdHRlciBhZnRlciBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbiBzb1xuICAvLyBwYWNrYWdlLmpzb24gbWF0Y2hlcyB3aGF0ZXZlciBpdHMgY3VycmVudCBzb3J0LXBhY2thZ2UtanNvbiB2ZXJzaW9uIGV4cGVjdHMuXG4gIC8vIFRoaXMgYXZvaWRzIGZvbGxvdy11cCBhdXRvZml4IGNvbW1pdHMgY2F1c2VkIG9ubHkgYnkgZm9ybWF0dGVyIHZlcnNpb24gZHJpZnRcbiAgLy8gYmV0d2VlbiB3YmZ5IGFuZCB0aGUgcHJvamVjdCBiZWluZyB1cGRhdGVkLlxuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICdidW4nKSB7XG4gICAgc3Bhd25TeW5jKCdidW54JywgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoanNvbk9iai5hdXRob3IgPT09ICdXaWxsQm9vc3RlciBMTEMnKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgcmVtb3ZlU2VsZkRlcGVuZGVuY3koY29uZmlnLCBqc29uT2JqKTtcbiAgcmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1hbGwtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbC1mb3ItYWknXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjay93YXJuJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpnZW4tY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Y29kZWdlbiddO1xuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMudHNsaWI7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICAvLyBEcm9wIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIGhlcmUgc28gbm9uLU5leHQuanMgcmVwb3MgbmV2ZXIgY2FycnkgaXQ7XG4gIC8vIHRoaXMgcnVucyBiZWZvcmUgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zLCB3aGljaCByZS1hZGRzIGl0IGZvciBOZXh0LmpzLWZhbWlseVxuICAvLyByZXBvcyB0aGF0IG5lZWQgaXQgYWxvbmdzaWRlIHRoZSBgdHlwZXNjcmlwdGAgdjcgcGFja2FnZSBmb3IgYG5leHQgYnVpbGRgLlxuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgLy8gTm9uLVR5cGVTY3JpcHQgcmVwb3Mgc2hvdWxkIG5vdCBrZWVwIGEgc3RyYXkgYHR5cGVzY3JpcHRgIHBhY2thZ2UuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmxlcm5hO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGllcjtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3ZlcmlmeS1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3ZlcmlmeS1jb2RlLXdpdGgtdGVzdHMnXTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2xlcm5hLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgcmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoanNvbk9iaiwgY29uZmlnKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VsZkRlcGVuZGVuY3koXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBqc29uT2JqLm5hbWUgfHwgcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG5cbiAgLy8gQSBwYWNrYWdlIGNhbiBpbXBvcnQgaXRzZWxmIHRocm91Z2ggTm9kZSdzIHBhY2thZ2Ugc2VsZi1yZWZlcmVuY2Ugd2l0aG91dFxuICAvLyBkZWNsYXJpbmcgaXRzZWxmOyBrZWVwaW5nIHRoYXQgZWRnZSBicmVha3MgbW9ub3JlcG8gcmVsZWFzZSB0b3BvbG9naWNhbCBzb3J0aW5nLlxuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBwYWNrYWdlTmFtZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCF2ZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKHZlcnNpb24pKSBjb250aW51ZTtcbiAgICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIHRoZXNlIHBhY2thZ2VzIGluZGVwZW5kZW50bHksIHNvIGdlbmVyYXRlZFxuICAgICAgLy8gcGFja2FnZSBtZXRhZGF0YSBtdXN0IGRlc2NyaWJlIG5wbSByZWxlYXNlIGVkZ2VzIGluc3RlYWQgb2YgbG9jYWxcbiAgICAgIC8vIHdvcmtzcGFjZSBlZGdlcyB0aGF0IHJlbGVhc2UgdG9vbGluZyB0cmVhdHMgYXMgbW9ub3JlcG8gZ3JhcGggbGlua3MuXG4gICAgICAvLyBUaGUgZmluYWwgYHlhcm4gaW5zdGFsbCAtLW5vLWltbXV0YWJsZWAgc3luY3MgdGhlIGxvY2tmaWxlIGFmdGVyIHRoaXNcbiAgICAgIC8vIG1pZ3JhdGlvbiwgZXZlbiB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIG5vdCBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIGxpc3QuXG4gICAgICBzZWN0aW9uW2RlcGVuZGVuY3ldID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuO1xuXG4gIGNvbnN0IHNlY3Rpb25zID0gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygd2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcykge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgb3ducyB0aGVzZSBjb25maWcgcGFja2FnZXMuIFBhY2thZ2UtbG9jYWwgZm9ybWF0dGVyXG4gICAgLy8gYW5kIGxpbnRlciBjb25maWcgZmlsZXMgYXJlIHJlcG8gdG9vbGluZywgbm90IHB1Ymxpc2hlZCBwYWNrYWdlIGRhdGEsIHNvXG4gICAgLy8gdGhlIHBhY2thZ2UgbWV0YWRhdGEgb25seSBuZWVkcyB0aGUgZm9ybWF0dGVyL2xpbnRlciBleGVjdXRhYmxlcy5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICAvLyBUeXBlU2NyaXB0IDcncyBuYXRpdmUgY29tcGlsZXIgZHJvcHBlZCB0aGUgaW4tcHJvY2VzcyBgcGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbmBcbiAgICAvLyBoZWxwZXIsIHNvIHBhcnNlIHRoZSB0c2NvbmZpZyBpbnRvIGFuIEFTVCBhbmQgcmVhZCBpdHMgdG9wLWxldmVsIGBleHRlbmRzYCBkaXJlY3RseS5cbiAgICBjb25zdCBzb3VyY2UgPSBwYXJzZVNvdXJjZUZpbGUoYWJzb2x1dGVGaWxlUGF0aCk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcGFyc2VkLmApO1xuICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2UpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodmFsdWUgPT09IGRlcGVuZGVuY3kgfHwgdmFsdWUuc3RhcnRzV2l0aChgJHtkZXBlbmRlbmN5fS9gKSkge1xuICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuLyoqIFJlYWRzIHRoZSB0b3AtbGV2ZWwgYGV4dGVuZHNgIGVudHJpZXMgKGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MpIGZyb20gYSBwYXJzZWQgdHNjb25maWcuICovXG5mdW5jdGlvbiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZSkpIHtcbiAgICBpZiAoYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSAmJiBhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpICYmIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ2V4dGVuZHMnKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhwcm9wZXJ0eS5pbml0aWFsaXplciwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogcmVhZG9ubHkgYXN0Lk9iamVjdExpdGVyYWxFbGVtZW50TGlrZVtdIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoYXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChzdGF0ZW1lbnQpICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uLnByb3BlcnRpZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMobm9kZTogYXN0LkV4cHJlc3Npb24sIHZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGFzdC5pc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICB2YWx1ZXMucHVzaChub2RlLnRleHQpO1xuICB9IGVsc2UgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygbm9kZS5lbGVtZW50cykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMoZWxlbWVudCwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PltdIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5c1xuICAgIC5tYXAoKGtleSkgPT4ganNvbk9ialtrZXldKVxuICAgIC5maWx0ZXIoKHNlY3Rpb24pOiBzZWN0aW9uIGlzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gISFzZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZUtleSA9IGAke2NvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nfToke2RlcGVuZGVuY3l9YDtcbiAgY29uc3QgY2FjaGVkVmVyc2lvbiA9IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPSBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oY29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoY2FjaGVLZXksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gd2JmeS1tYW5hZ2VkIHRvb2xpbmcgKHByZWFwcHJvdmVkIHBhY2thZ2VzKSBhZG9wdHMgdGhlIGxhdGVzdCByZWxlYXNlIGltbWVkaWF0ZWx5LFxuICAvLyBieXBhc3NpbmcgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2UgZ2F0ZSBhcHBsaWVkIHRvIHVucmV2aWV3ZWQgZGVwZW5kZW5jaWVzLlxuICBpZiAoIXNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoY29uZmlnLCBkZXBlbmRlbmN5KSkge1xuICAgIHJldHVybiBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIH1cblxuICByZXR1cm4gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5LCBnZXRQYWNrYWdlQWdlR2F0ZU1zKGNvbmZpZykpO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZywgcGFja2FnZUFnZUdhdGVNczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgdGltZXMgPSBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeSk7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGlmIChsYXRlc3RWZXJzaW9uICE9PSAnKicgJiYgaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHRpbWVzW2xhdGVzdFZlcnNpb25dLCBwYWNrYWdlQWdlR2F0ZU1zKSkge1xuICAgIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgdmVyc2lvbnMgPSBPYmplY3QuZW50cmllcyh0aW1lcylcbiAgICAuZmlsdGVyKChbdmVyc2lvbl0pID0+IHNlbXZlci52YWxpZCh2ZXJzaW9uKSlcbiAgICAuZmlsdGVyKChbdmVyc2lvbl0pID0+IChzZW12ZXIucHJlcmVsZWFzZSh2ZXJzaW9uKT8ubGVuZ3RoID8/IDApID09PSAwKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gTnVtYmVyLmlzRmluaXRlKERhdGUucGFyc2UocHVibGlzaGVkQXQpKSlcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IG5vdyAtIERhdGUucGFyc2UocHVibGlzaGVkQXQpID49IHBhY2thZ2VBZ2VHYXRlTXMpXG4gICAgLnRvU29ydGVkKChbdmVyc2lvbkFdLCBbdmVyc2lvbkJdKSA9PiBzZW12ZXIucmNvbXBhcmUodmVyc2lvbkEsIHZlcnNpb25CKSk7XG5cbiAgcmV0dXJuIHZlcnNpb25zWzBdPy5bMF0gPz8gJyonO1xufVxuXG5mdW5jdGlvbiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUocHVibGlzaGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcGFja2FnZUFnZUdhdGVNczogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmICghcHVibGlzaGVkQXQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHVibGlzaGVkVGltZSA9IERhdGUucGFyc2UocHVibGlzaGVkQXQpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHB1Ymxpc2hlZFRpbWUpICYmIERhdGUubm93KCkgLSBwdWJsaXNoZWRUaW1lID49IHBhY2thZ2VBZ2VHYXRlTXM7XG59XG5cbmZ1bmN0aW9uIGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBkZXBlbmRlbmN5LnJlcGxhY2UoL0BbXkAvXSskL3UsICcnKTtcbiAgY29uc3QgY2FjaGVkVGltZXMgPSBucG1QYWNrYWdlVGltZXNDYWNoZS5nZXQocGFja2FnZU5hbWUpO1xuICBpZiAoY2FjaGVkVGltZXMpIHJldHVybiBjYWNoZWRUaW1lcztcblxuICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ25wbScsXG4gICAgWydzaG93JywgcGFja2FnZU5hbWUsICd0aW1lJywgJy0tanNvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSxcbiAgICBwcm9jZXNzLmN3ZCgpXG4gICk7XG4gIGlmICghc3Rkb3V0KSByZXR1cm4ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0ZG91dCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBucG1QYWNrYWdlVGltZXNDYWNoZS5zZXQocGFja2FnZU5hbWUsIHBhcnNlZCk7XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcHJlYXBwcm92ZWRQYWNrYWdlcyA9IGNvbmZpZy5pc0J1biA/IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgOiB5YXJuTnBtUHJlYXBwcm92ZWRQYWNrYWdlcztcbiAgcmV0dXJuICFwcmVhcHByb3ZlZFBhY2thZ2VzLnNvbWUoKHBhdHRlcm4pID0+IGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm4sIGRlcGVuZGVuY3kpKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2FnZUFnZUdhdGVNcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBudW1iZXIge1xuICBpZiAoY29uZmlnLmlzQnVuKSByZXR1cm4gYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzICogMTAwMDtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzxkYXlzPlxcZCspZCQvdS5leGVjKHlhcm5OcG1NaW5pbWFsQWdlR2F0ZSk7XG4gIHJldHVybiBOdW1iZXIobWF0Y2hlZD8uZ3JvdXBzPy5kYXlzID8/IDApICogMjQgKiA2MCAqIDYwICogMTAwMDtcbn1cblxuZnVuY3Rpb24gZG9lc1BhY2thZ2VQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHBhdHRlcm4gPT09IGRlcGVuZGVuY3kpIHJldHVybiB0cnVlO1xuICBpZiAoIXBhdHRlcm4uaW5jbHVkZXMoJyonKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlQWxsKC9bLis/XiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCkucmVwbGFjZUFsbCgnKicsICcuKicpO1xuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZFBhdHRlcm59JGAsICd1JykudGVzdChkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIGRlcGVuZGVuY3ksICd2ZXJzaW9uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLCBwcm9jZXNzLmN3ZCgpKSB8fCAnKic7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHdiRGVwZW5kZW5jeSkgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Z2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCBkZXBlbmRlbmN5KX1gO1xuICByZXR1cm4gZGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHByZXNlcnZlTWljcm9tYXRjaCA9IHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHByZXNlcnZlTWljcm9tYXRjaCAmJiBtaWNyb21hdGNoUGFja2FnZU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgaWYgKHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KGpzb25PYmosIGNvbmZpZywgZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gUHVibGlzaGVkIGNvbmZpZyBwYWNrYWdlcyBuZWVkIGxvY2FsIHR5cGUtb25seSBkZXBzIHRvIHZhbGlkYXRlIHRoZVxuICAvLyBwYWNrYWdlLXByb3ZpZGVkIGNvbmZpZyBkZWNsYXJhdGlvbnMgdW5kZXIgWWFybiBQblAuXG4gIHJldHVybiBkZXBlbmRlbmN5ID09PSAnQHR5cGVzL2VzbGludCcgJiYgISFqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMuZXNsaW50O1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgc3VicGFja2FnZXMgcHVibGlzaCBjb25maWcgZmlsZXMgYXMgdGhlaXIgcHJvZHVjdCwgc29cbiAgLy8gbWljcm9tYXRjaCBpcyBwYWNrYWdlIGRhdGEgdGhlcmUuIE90aGVyIHJlcG9zIGtlZXAgbWljcm9tYXRjaCBvbmx5IHdoZW5cbiAgLy8gcHJvZHVjdCBjb2RlIGltcG9ydHMgaXQ7IG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIG9ic29sZXRlIEVTTGludC1lcmFcbiAgLy8gdG9vbGluZy5cbiAgcmV0dXJuIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgIWNvbmZpZy5pc1Jvb3QpIHx8IGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSBmZy5nbG9iU3luYygnc3JjLyoqLyoue2pzLGpzeCxtanMsY2pzLHRzLHRzeCxtdHMsY3RzfScsIHtcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlUGF0aHMuc29tZSgoZmlsZVBhdGgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlUGF0aCksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jeTogc3RyaW5nLFxuICBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikgcmV0dXJuIHRydWU7XG4gIGlmIChjdXJyZW50VmVyc2lvbiA9PT0gJyonKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZShjdXJyZW50VmVyc2lvbikpIHJldHVybiB0cnVlO1xuICAvLyB3YmZ5IG93bnMgdGhlc2UgdG9vbCBkZXBlbmRlbmNpZXMsIGJ1dCBhcHBseWluZyB3YmZ5IHNob3VsZCBub3QgZG93bmdyYWRlIGFcbiAgLy8gcmVwb3NpdG9yeSB0aGF0IGFscmVhZHkgcGlucyBhIG5ld2VyIHJldmlld2VkIHJlbGVhc2UuXG4gIHJldHVybiBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSAmJiBpc05ld2VyTWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgZGVwZW5kZW5jeSwgY3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyTWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIGRlcGVuZGVuY3kpO1xuICByZXR1cm4gaXNOZXdlclBhY2thZ2VWZXJzaW9uKGxhdGVzdFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNOZXdlclBhY2thZ2VWZXJzaW9uKGNhbmRpZGF0ZVZlcnNpb246IHN0cmluZywgY3VycmVudFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY2FuZGlkYXRlVmVyc2lvbik7XG4gIGNvbnN0IHZhbGlkQ3VycmVudFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICByZXR1cm4gIXZhbGlkTGF0ZXN0VmVyc2lvbiB8fCAhdmFsaWRDdXJyZW50VmVyc2lvbiB8fCBzZW12ZXIuZ3QodmFsaWRMYXRlc3RWZXJzaW9uLCB2YWxpZEN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmVyc2lvbi5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6Jyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZFJlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRSZXBvc2l0b3J5LCByZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihleGlzdGluZ1JlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIHJldHVybiByZXBvc2l0b3J5O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXJlcG9zaXRvcnkuc3RhcnRzV2l0aCgnZ2l0aHViOicpKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHJlcG9zaXRvcnkpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xuICB9XG5cbiAgY29uc3QgcmVwb3NpdG9yeVVybCA9IHJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5VXJsICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IG1hdGNoZWQgPSAvXig/OmdpdFxcKyk/aHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvKFteL10rKVxcLyhbXi9dKz8pKD86XFwuZ2l0KT8kL3UuZXhlYyhyZXBvc2l0b3J5VXJsKTtcbiAgaWYgKCFtYXRjaGVkKSByZXR1cm47XG5cbiAgY29uc3QgWywgb3duZXIsIHJlcG9dID0gbWF0Y2hlZDtcbiAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbn1cblxuZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICBub3JtYWxpemVkVXJsOiBzdHJpbmcsXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCByZXBvc2l0b3J5T2JqID1cbiAgICB0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgID8gcmVwb3NpdG9yeVxuICAgICAgOiB0eXBlb2YgZXhpc3RpbmdSZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgICA/IGV4aXN0aW5nUmVwb3NpdG9yeVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIC4uLnJlcG9zaXRvcnlPYmosXG4gICAgdHlwZTogJ2dpdCcsXG4gICAgdXJsOiBub3JtYWxpemVkVXJsLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHNcbiAgICAgIC8vIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICAgICAgY2xlYW51cDogJ2J1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICAgIGZvcm1hdDogYGJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICAgIGxpbnQ6IGBidW4gd2IgbGludGAsXG4gICAgICAnbGludC1maXgnOiAnYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICAgIHR5cGVjaGVjazogJ2J1biB3YiB0eXBlY2hlY2snLFxuICAgICAgdmVyaWZ5OiAnYnVuIHdiIHZlcmlmeScsXG4gICAgICAndmVyaWZ5LWZ1bGwnOiAnYnVuIHdiIHZlcmlmeSAtLWZ1bGwnLFxuICAgIH07XG4gICAgYXBwbHlEYXRhYmFzZVNjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBgYnVuICR7Z2V0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnKX1gKTtcbiAgICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3QgaGFzSnNPclRzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKTtcbiAgICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gICAgY29uc3Qgb2xkVGVzdCA9IG9sZFNjcmlwdHMudGVzdDtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogZ2VuZXJhdGVGb3JtYXRTY3JpcHQoaGFzSnNPclRzLCBoYXNKYXZhKSxcbiAgICAgIC8vIFBhY2thZ2UtbG9jYWwgY29uZmlncyBtdXN0IGRlbGV0ZSB0aGUgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucywgc28gcGFzcyB0aGUgZmxhZ3NcbiAgICAgIC8vIGV4cGxpY2l0bHkuIE90aGVyd2lzZSB0aGlzIHNjcmlwdCB3b3VsZCBzaWxlbnRseSBza2lwIHR5cGUgY2hlY2tpbmcgaW4gd29ya3NwYWNlIHBhY2thZ2VzLlxuICAgICAgbGludDogYG94bGludCR7aGFzVHlwZWNoZWNrID8gJyAtLXR5cGUtYXdhcmUgLS10eXBlLWNoZWNrJyA6ICcnfSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICAnZm9ybWF0LWNvZGUnOiBgb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC4gJyEqKi9wYWNrYWdlLmpzb24nYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzYyAtLW5vRW1pdCcsXG4gICAgfTtcbiAgICBpZiAoaGFzSmF2YSkge1xuICAgICAgc2NyaXB0cy5wcmV0dGlmeSA9IGBwcmV0dGllciAtLWNhY2hlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYCR7c2NyaXB0cy5mb3JtYXR9ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC4gQ29sb3IgcG9saWN5IGJlbG9uZ3MgdG8gd2IsIG5vdCBnZW5lcmF0ZWQgcGFja2FnZSBzY3JpcHRzLlxuICAgICAgICAgIHRlc3Q6ICdDST0xIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzSmF2YSkge1xuICAgICAgICBzY3JpcHRzLnByZXR0aWZ5ID0gYHByZXR0aWVyIC0tY2FjaGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKFxuICAgICAgICAgICcsJ1xuICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG4gICAgaWYgKG9sZFRlc3Q/LmluY2x1ZGVzKCd3YiB0ZXN0JykpIHtcbiAgICAgIHNjcmlwdHMudGVzdCA9IG9sZFRlc3Q7XG4gICAgfVxuICAgIGlmICghaGFzSnNPclRzKSB7XG4gICAgICBkZWxldGUgc2NyaXB0c1snZm9ybWF0LWNvZGUnXTtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLmxpbnQ7XG4gICAgICBkZWxldGUgc2NyaXB0c1snbGludC1maXgnXTtcbiAgICB9XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIGlmIChpc1diUGFja2FnZShjb25maWcucGFja2FnZUpzb24pKSB7XG4gICAgICBzY3JpcHRzLnZlcmlmeSA9IG9sZFNjcmlwdHMudmVyaWZ5ID8/ICd5YXJuIHdvcmtzcGFjZSBAd2lsbGJvb3N0ZXIvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiRJTklUX0NXRFwiIHZlcmlmeSc7XG4gICAgICBzY3JpcHRzWyd2ZXJpZnktZnVsbCddID0gb2xkU2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA/PyAneWFybiB2ZXJpZnkgLS1mdWxsJztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cy52ZXJpZnkgPSAnd2IgdmVyaWZ5JztcbiAgICAgIHNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPSAnd2IgdmVyaWZ5IC0tZnVsbCc7XG4gICAgfVxuICAgIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgZ2V0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnKSk7XG4gICAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRNYW5hZ2VHZW5JMThuVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2kxOG4nKSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGF0YWJhc2VTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHdiRGJDb21tYW5kOiBzdHJpbmdcbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHJldHVybjtcblxuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi1jcmVhdGUtbWlncmF0aW9uJywgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUtZGV2YCk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLW1pZ3JhdGUnLCBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZSAtLWNoZWNrLWlkZW1wb3RlbmN5YCk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLXZpZXcnLCBgJHt3YkRiQ29tbWFuZH0gc3R1ZGlvYCk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGF0YWJhc2VTY3JpcHQoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWU6IHN0cmluZyxcbiAgZ2VuZXJhdGVkU2NyaXB0OiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzW25hbWVdO1xuICAvLyBTb21lIHJlcG9zaXRvcmllcyB3cmFwIG1pZ3JhdGlvbiBjb21tYW5kcyB0byBwcmVwYXJlIFNRTGl0ZSBkaXJlY3RvcmllcyxcbiAgLy8gZmFuIG91dCBvdmVyIHRlbmFudHMsIG9yIHBlcmZvcm0gY2xlYW51cCB0aGF0IHdiIGNhbm5vdCBpbmZlciBnZW5lcmljYWxseS5cbiAgc2NyaXB0c1tuYW1lXSA9IG9sZFNjcmlwdCAmJiAhaXNHZW5lcmF0ZWREYXRhYmFzZVNjcmlwdChvbGRTY3JpcHQpID8gb2xkU2NyaXB0IDogZ2VuZXJhdGVkU2NyaXB0O1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZERhdGFiYXNlU2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFxid2JcXHMrKD86ZGJ8cHJpc21hKVxcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3diIGRiJyB8ICd3YiBwcmlzbWEnIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSByZXR1cm4gJ3diIHByaXNtYSc7XG4gIHJldHVybiAnd2IgZGInO1xufVxuXG5mdW5jdGlvbiBpc1diUGFja2FnZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhY2thZ2VKc29uPy5uYW1lID09PSB3YkRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWlzZVRhc2tTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGlmICghaGFzTWlzZVRhc2soY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgaWYgKGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIC8vIFByZXNlcnZlIGEgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52IHByZWZpeCAoZS5nLiBgTUlTRV9FTlY9dGVzdGApIG9uIGFuIGV4aXN0aW5nIG1pc2UgYnJpZGdlLlxuICAgIC8vIFN1Y2ggYSBwcmVmaXggaXMgcmVxdWlyZWQgZm9yIG1pc2UgY29uZmlnIGVudmlyb25tZW50cyAobWlzZS48TUlTRV9FTlY+LnRvbWwpLCB3aGljaCBhcmVcbiAgICAvLyBzZWxlY3RlZCBmcm9tIE1JU0VfRU5WICpiZWZvcmUqIG1pc2Ugc3RhcnRzIGFuZCBjYW5ub3QgYmUgc3dpdGNoZWQgZnJvbSBpbnNpZGUgYSB0YXNrOyBkcm9wcGluZ1xuICAgIC8vIGl0IHdvdWxkIHNpbGVudGx5IHJ1biB0aGUgdGFzayBpbiB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudC5cbiAgICBjb25zdCBlbnZQcmVmaXggPSBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChvbGRTY3JpcHRzW25hbWVdLCBuYW1lKTtcbiAgICBpZiAoZW52UHJlZml4ID09PSB1bmRlZmluZWQgJiYgb2xkU2NyaXB0c1tuYW1lXSAmJiAhKG5hbWUgaW4gc2NyaXB0cykpIGNvbnRpbnVlO1xuICAgIHNjcmlwdHNbbmFtZV0gPSBgJHtlbnZQcmVmaXggPz8gJyd9bWlzZSBydW4gJHtuYW1lfWA7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYtdmFyIHByZWZpeCBvZiBhbiBleGlzdGluZyBgbWlzZSBydW4gPG5hbWU+YCBicmlkZ2Ugc2NyaXB0XG4gKiAocG9zc2libHkgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGJyaWRnZSBoYXMgbm8gcHJlZml4KSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgc2NyaXB0IGlzIG5vdCBhXG4gKiBtaXNlIGJyaWRnZSBmb3IgdGhlIGdpdmVuIHRhc2suXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KHNjcmlwdDogdW5rbm93biwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBFYWNoIGFzc2lnbm1lbnQgdmFsdWUgbWF5IGJlIGRvdWJsZS1xdW90ZWQsIHNpbmdsZS1xdW90ZWQsIG9yIGFuIHVucXVvdGVkIHJ1biBvZiBub24td2hpdGVzcGFjZSxcbiAgLy8gc28gcHJlZml4ZXMgbGlrZSBgTUlTRV9FTlY9XCJhIGJcImAgKHdob3NlIHZhbHVlIGNvbnRhaW5zIHNwYWNlcykgYXJlIG1hdGNoZWQgaW5zdGVhZCBvZiBkcm9wcGVkLlxuICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeKCg/Olxcdys9KD86XCJbXlwiXSpcInwnW14nXSonfFxcUyspXFxzKykqKW1pc2UgcnVuICR7ZXNjYXBlUmVnRXhwKG5hbWUpfSRgLCAndScpLmV4ZWMoXG4gICAgc2NyaXB0LnRyaW0oKVxuICApO1xuICByZXR1cm4gbWF0Y2g/LlsxXTtcbn1cblxuZnVuY3Rpb24gaGFzTWlzZVRhc2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oY29uZmlnLm1pc2VUYXNrcywgbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhc2sgPSBjb25maWcubWlzZVRhc2tzW25hbWVdO1xuICBpZiAoIXRhc2spIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJzID0gWydidW4nLCAneWFybicsICducG0nLCAncG5wbSddO1xuICByZXR1cm4gcGFja2FnZU1hbmFnZXJzLnNvbWUoKHBhY2thZ2VNYW5hZ2VyKSA9PlxuICAgIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BcXGIke3BhY2thZ2VNYW5hZ2VyfVxccysoPzpydW5cXHMrKT8ke2VzY2FwZVJlZ0V4cChuYW1lKX0oPyFbYS16QS1aMC05X1xcLTouXSlgLCAndScpLnRlc3QodGFzaylcbiAgKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHM6IGJvb2xlYW4sIGhhc0phdmE6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBjb21tYW5kcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgaWYgKGhhc0pzT3JUcykge1xuICAgIGNvbW1hbmRzLnB1c2goJ3lhcm4gZm9ybWF0LWNvZGUnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGNvbW1hbmRzLnB1c2goJ3lhcm4gcHJldHRpZnknKTtcbiAgfVxuICByZXR1cm4gY29tbWFuZHMuam9pbignICYmICcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykuY2F0Y2goKCkgPT4gJycpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGAke2xpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKX0gfHwgdHJ1ZWA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIGpzb25PYmoucHJldHRpZXI7XG4gIGNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uczogQXJyYXk8UGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB8IHVuZGVmaW5lZD4gPSBbXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXMsXG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMsXG4gICAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzLFxuICBdO1xuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZGVwZW5kZW5jeVNlY3Rpb25zKSB7XG4gICAgaWYgKCFzZWN0aW9uKSBjb250aW51ZTtcbiAgICBkZWxldGUgc2VjdGlvbi5wcmV0dGllcjtcbiAgICBkZWxldGUgc2VjdGlvblsncHJldHRpZXItcGx1Z2luLWphdmEnXTtcbiAgICBkZWxldGUgc2VjdGlvblsncHJldHRpZXItcGx1Z2luLXByaXNtYSddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlczoge1xuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gICAgcmVwbzogc3RyaW5nO1xuICAgIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJztcbiAgfVtdID0gW1xuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvYXV0aCcsIHJlcG86ICdhdXRoJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAZGlzY29yZC1ib3Qvc2hhcmVkJywgcmVwbzogJ2Rpc2NvcmQtYm90JywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicsIHJlcG86ICdjb2RlLWFuYWx5emVyJywgdGFyZ2V0OiAnZGV2RGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvanVkZ2UnLCByZXBvOiAnanVkZ2UnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknLCByZXBvOiAnbGxtLXByb3h5JywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICBdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHByaXZhdGVQYWNrYWdlcy5tYXAoYXN5bmMgKHsgcGFja2FnZU5hbWUsIHJlcG8sIHRhcmdldCB9KSA9PiB7XG4gICAgICBpZiAoIXBhY2thZ2VOYW1lcy5oYXMocGFja2FnZU5hbWUpIHx8IGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCBwYWNrYWdlTmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3Qgb3RoZXJUYXJnZXQgPSB0YXJnZXQgPT09ICdkZXBlbmRlbmNpZXMnID8gJ2RldkRlcGVuZGVuY2llcycgOiAnZGVwZW5kZW5jaWVzJztcbiAgICAgIC8vIFRoZSBsaW50IHJ1bGUgZGlzYWxsb3dzIGBkZWxldGVgIHdpdGggY29tcHV0ZWQgcGFja2FnZSBuYW1lczsgUmVmbGVjdCBoYXMgdGhlIHNhbWUgZGVsZXRpb24gc2VtYW50aWNzIGhlcmUuXG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmpbb3RoZXJUYXJnZXRdLCBwYWNrYWdlTmFtZSk7XG4gICAgICBqc29uT2JqW3RhcmdldF1bcGFja2FnZU5hbWVdID0gYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIocmVwbyk7XG4gICAgfSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIocmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgcmVwbyk7XG4gIHJldHVybiBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvJHtyZXBvfS5naXQjJHtjb21taXRIYXNofWA7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGR1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5pbnRlcmZhY2UgTGVmdGhvb2tTZXR0aW5ncyB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInO1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLWNvbW1pdCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIExlZnRob29rSm9iIHtcbiAgbmFtZTogc3RyaW5nO1xuICBnbG9iPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gIHNjcmlwdD86IHN0cmluZztcbiAgcnVubmVyPzogJ2Jhc2gnO1xuICBzdGFnZV9maXhlZD86IHRydWU7XG59XG5cbmNvbnN0IGJhc2VTZXR0aW5nczogT21pdDxMZWZ0aG9va1NldHRpbmdzLCAncHJlLWNvbW1pdCc+ID0ge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJyxcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncHJlcGFyZScsXG4gICAgICAgIHNjcmlwdDogJ3ByZXBhcmUuc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NoZWNrJyxcbiAgICAgICAgc2NyaXB0OiAnY2hlY2suc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGpvYnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY2xlYW51cCcsXG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVjay1taWdyYXRpb25zJyxcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuZmFpbGVkPTBcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuZm9yIGZpbGUgaW4ge3N0YWdlZF9maWxlc307IGRvXG4gIGlmIGdyZXAgLXEgJ1dhcm5pbmdzOicgXCIkZmlsZVwiOyB0aGVuXG4gICAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZSAoJGZpbGUpIGNvbnRhaW5zIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgICBmYWlsZWQ9MVxuICBmaVxuZG9uZVxuZXhpdCBcIiRmYWlsZWRcIlxuYC50cmltKCksXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgaHVza3lEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGNvbnN0IGhhc0h1c2t5RGlyID0gZnMuZXhpc3RzU3luYyhodXNreURpclBhdGgpO1xuICBjb25zdCB7IGxpbnQgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8TGVmdGhvb2tTZXR0aW5ncz4gPSB7XG4gICAgLi4uYmFzZVNldHRpbmdzLFxuICAgICdwcmUtY29tbWl0Jzoge1xuICAgICAgam9iczogZ2V0UHJlQ29tbWl0Sm9icyhjb25maWcpLFxuICAgIH0sXG4gIH07XG4gIGlmICghbGludCkge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoaGFzSHVza3lEaXIpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5wcm9taXNlcy5ybShodXNreURpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSxcbiAgICBdKTtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGxpbnQpIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGxldCBsaW50Q29tbWFuZDogc3RyaW5nO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgLy8gQnVuIHJlcG9zIHJlY2VpdmUgd2IgYXMgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCB0b29sY2hhaW4sIHNvIGdlbmVyYXRlIHRoZVxuICAgIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgICBsaW50Q29tbWFuZCA9ICdidW4gd2IgbGludCc7XG4gIH0gZWxzZSB7XG4gICAgbGludENvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiID8gJ3lhcm4gd2IgbGludCcgOiAneWFybiBydW4gbGludCc7XG4gIH1cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9IGAke2xpbnRDb21tYW5kfSAtLXF1aWV0YDtcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzLm1hcCgoam9iKSA9PlxuICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmpvYixcbiAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgIH1cbiAgICAgIDogam9iXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID1cbiAgICBjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53YiB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKSA/IFsuLi5leHRlbnNpb25zLnByZXR0aWVyT25seV0gOiBbXTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxueWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG4gIC8vIFB5dGhvbi1vbmx5IEJ1biByZXBvcyBpbnN0YWxsIHdiIGZvciBzaGFyZWQgc2NyaXB0cyBidXQgbm90IE94bGludCwgc29cbiAgLy8gc3RhZ2VkLWZpbGUgaG9va3MgbXVzdCB1c2UgdGhlIGxhbmd1YWdlLXNwZWNpZmljIGZvcm1hdHRlciBwYXRoIGJlbG93LlxuICBjb25zdCBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgaWYgKChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53YikgJiYgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcykge1xuICAgIHJldHVybiBgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbiR7Y29uZmlnLmlzQnVuID8gJ2J1biB3YicgOiAneWFybiB3Yid9IGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG5cbiAgY29uc3Qgb3hsaW50UGF0dGVybiA9IGV4dGVuc2lvbnMub3hsaW50Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IG94Zm10UGF0dGVybiA9IGV4dGVuc2lvbnMub3hmbXQubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgcHJldHRpZXJQYXR0ZXJuID0gZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgaGFzSnNPclRzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIHJldHVybiBTdHJpbmcucmF3YFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hsaW50X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke294bGludFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSnNPclRzID8gU3RyaW5nLnJhd2BveGZtdF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGZtdFBhdHRlcm59KScgfCBncmVwIC12IC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSmF2YSA/IFN0cmluZy5yYXdgcHJldHRpZXJfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7cHJldHRpZXJQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7aGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKSA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hmbXRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICchKiovcGFja2FnZS5qc29uJyAkb3hmbXRfZmlsZXNcbmZpXG5gXG4gICAgOiAnJ1xufVxuJHtcbiAgaGFzSmF2YVxuICAgID8gU3RyaW5nLnJhd2BpZiBbIC1uIFwiJHByZXR0aWVyX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSAtLWlnbm9yZS11bmtub3duIC0tICRwcmV0dGllcl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgaGFzSnNPclRzXG4gICAgPyBTdHJpbmcucmF3YFxuaWYgWyAtbiBcIiRveGxpbnRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hsaW50IC0tZml4ICRveGxpbnRfZmlsZXNcbmZpXG5gXG4gICAgOiAnJ1xufVxuaWYgWyAtbiBcIiRwYWNrYWdlX2pzb25fZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vc29ydC1wYWNrYWdlLWpzb24gLS0gJHBhY2thZ2VfanNvbl9maWxlc1xuZmlcbiR7XG4gIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZylcbiAgICA/IGBpZiBbIC1uIFwiJHB5dGhvbl9maWxlc1wiIF07IHRoZW5cbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gYmxhY2sgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBmbGFrZTggJHB5dGhvbl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWxcbiAgICA/IGBpZiBbIC1uIFwiJGRhcnRfZmlsZXNcIiBdOyB0aGVuXG4gIGRhcnQgZm9ybWF0ICRkYXJ0X2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG5gLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9jYWxXYlBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJywgJ3diJywgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBuYW1lPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvd2InO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmhhc1ZlcnNpb25TZXR0aW5ncykge1xuICAgIGNvbnN0IHRvb2xzQ2hhbmdlZFBhdHRlcm4gPSBTdHJpbmcucmF3YChtaXNlXFwudG9tbHxcXC5taXNlXFwudG9tbHxcXC50b29sLXZlcnNpb25zfFxcLi4rLXZlcnNpb24pYDtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICB9XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBpbnN0YWxsJyA6ICd5YXJuJztcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3J5ID0gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgPyAnICYmIHJtIC1SZiAubmV4dCcgOiAnJztcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcLmpzb25cIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcnl9XCJgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInV2XFwubG9ja1wiIFwidXYgc3luYyAtLWZyb3plblwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgZ2VuZXJhdGVcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiYFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL3diIHByaXNtYSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vd2IgcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNDb21tYW5kID0gZ2V0R2VuSTE4blRzQ29tbWFuZChjb25maWcsIGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyk7XG4gIGlmIChnZW5JMThuVHNDb21tYW5kKSB7XG4gICAgLy8gZ2VuLWkxOG4tdHMgb3V0cHV0cyBhcmUgY29tbW9ubHkgaWdub3JlZCwgc28gcG9zdC1tZXJnZSByZWdlbmVyYXRlcyB0aGVtIGFmdGVyIHB1bGxlZCByZXNvdXJjZSBjaGFuZ2VzLlxuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihefC8paTE4bi8uKlxcLmpzb24kXCIgXCIke2dlbkkxOG5Uc0NvbW1hbmR9XCJgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuY2pzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNgLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5qc29uYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRlbnQ/LnRyaW0oKTtcbn1cbiIsImV4cG9ydCB0eXBlIENvbmZpZ0Jsb2NrTmFtZSA9ICdiYXNlJyB8ICdleHBvcnQnO1xuXG5pbnRlcmZhY2UgTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMge1xuICBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcbiAgbWFya2VyUHJlZml4OiBzdHJpbmc7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRDb25maWdDb250ZW50T3B0aW9ucyB7XG4gIGRlc2lyZWRDb250ZW50OiBzdHJpbmc7XG4gIGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZENvbmZpZ0Jsb2NrcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXJrZXJQcmVmaXg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMpIHtcbiAgICB0aGlzLmJsb2NrTmFtZXMgPSBvcHRpb25zLmJsb2NrTmFtZXM7XG4gICAgdGhpcy5tYXJrZXJQcmVmaXggPSBvcHRpb25zLm1hcmtlclByZWZpeDtcbiAgICB0aGlzLnRvb2xOYW1lID0gb3B0aW9ucy50b29sTmFtZTtcbiAgfVxuXG4gIGdldENvbmZpZ0NvbnRlbnQob3B0aW9uczogR2V0Q29uZmlnQ29udGVudE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmICghb3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICAgIGlmICh0aGlzLmhhc01hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCwgb3B0aW9ucy5kZXNpcmVkQ29udGVudCwgb3B0aW9ucy5maWxlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICB9XG5cbiAgZ2V0QmxvY2soYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKX1cbiR7Y29udGVudH1cbiR7dGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKX1gO1xuICB9XG5cbiAgaGFzTWFuYWdlZEJsb2Nrcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja05hbWVzLnNvbWUoKGJsb2NrTmFtZSkgPT4gY29udGVudC5pbmNsdWRlcyh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcsIGRlc2lyZWRDb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gZXhpc3RpbmdDb250ZW50O1xuICAgIGZvciAoY29uc3QgYmxvY2tOYW1lIG9mIHRoaXMuYmxvY2tOYW1lcykge1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0aGlzLmV4dHJhY3RNYW5hZ2VkQmxvY2soZGVzaXJlZENvbnRlbnQsIGJsb2NrTmFtZSk7XG4gICAgICBpZiAoIXJlcGxhY2VtZW50KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudCwgYmxvY2tOYW1lLCByZXBsYWNlbWVudCk7XG4gICAgICBpZiAoIW5leHRDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyBpbmNvbXBsZXRlICR7YmxvY2tOYW1lfSBibG9jayBpbiAke3RoaXMudG9vbE5hbWV9IGNvbmZpZzogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgPSBuZXh0Q29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSkuZXhlYyhjb250ZW50KT8uWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBSZWdFeHAge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgYCR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSl9W1xcXFxzXFxcXFNdKj8ke2VzY2FwZVJlZ0V4cCh0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTpzdGFydCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTplbmQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGVnYWN5SnNvbkNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hmbXRyYy5qc29uJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgZmlsZVBhdGgsXG4gICAgfSk7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGxlZ2FjeUpzb25Db25maWdQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKV07XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwibm9kZVwiIC8+XG5pbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hmbXQgY29uZmlnIGZpbGVzIGFyZSBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGZtdENvbmZpZyA9IHJlcXVpcmUoJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnKTtcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBveGZtdENvbmZpZy5kZWZhdWx0ID8/IG94Zm10Q29uZmlnO2BcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG5pbXBvcnQgY29uZmlnIGZyb20gJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IGNvbmZpZztgXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGxpbnQnLFxuICB0b29sTmFtZTogJ294bGludCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBtaWdyYXRpb25cbiAgICAvLyBtdXN0IG5vdCByZW1vdmUgcGFja2FnZS1wcm92aWRlZCBsaW50ZXIgc2V0dGluZ3MuIEdlbmVyYXRlZCBmaWxlcyB3aXRoXG4gICAgLy8gbWFuYWdlZCBibG9ja3MgYXJlIHN0aWxsIHNhZmUgdG8gdXBkYXRlLlxuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnID0gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGxpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnQgPVxuICAgICAgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgJiYgZXhpc3RpbmdDb250ZW50ICYmICFtYW5hZ2VkQ29uZmlnQmxvY2tzLmhhc01hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50KTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50XG4gICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgOiByZXBsYWNlTGVnYWN5Q29uZmlnUmVmZXJlbmNlcyhcbiAgICAgICAgICBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgICAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgaWYgKCFzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZykge1xuICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5veGxpbnRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmNqcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnlhbWwnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMueW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5tanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLnRzJyksIHsgZm9yY2U6IHRydWUgfSkpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VMZWdhY3lDb25maWdSZWZlcmVuY2VzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2VBbGwoLyg/PCFbLi9dKVxcYmNvbmZpZ1xcLi9ndSwgJ294bGludFJlc29sdmVkQ29uZmlnLicpO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzUm9vdENvbmZpZyA9IGNvbmZpZy5pc1Jvb3Q7XG4gIGNvbnN0IG94bGludEJhc2VDb25maWdNb2R1bGUgPSBnZXRPeGxpbnRCYXNlQ29uZmlnTW9kdWxlKGNvbmZpZyk7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIm5vZGVcIiAvPlxuaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hsaW50IG9ubHkgYXV0by1kaXNjb3ZlcnMgLnRzIGNvbmZpZyBmaWxlcywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94bGludEJhc2VDb25maWcgPSByZXF1aXJlKCdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycpO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZy5kZWZhdWx0ID8/IG94bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG5pbXBvcnQgb3hsaW50QmFzZUNvbmZpZyBmcm9tICcke294bGludEJhc2VDb25maWdNb2R1bGV9JztcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRPeGxpbnRCYXNlQ29uZmlnTW9kdWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb25maWcucGFja2FnZUpzb24/Lm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycgPyAnLi9jb25maWcubWpzJyA6ICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyc7XG59XG5cbmZ1bmN0aW9uIGdldFJlc29sdmVkQ29uZmlnQ29udGVudChiYXNlQ29uZmlnTmFtZTogc3RyaW5nLCBpc1Jvb3RDb25maWc6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoaXNSb290Q29uZmlnKSB7XG4gICAgcmV0dXJuIGAvLyBLZWVwIGEgcGFja2FnZS1sb2NhbCBjb3B5IHNvIHJlcG9zaXRvcmllcyBjYW4gYWRkIHNldHRpbmdzIG91dHNpZGVcbi8vIG1hbmFnZWQgYmxvY2tzIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBpbXBvcnRlZCBjb25maWcgb2JqZWN0LlxuY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG4vLyBUaGUgdHlwZS1hd2FyZSBvcHRpb25zIG1ha2UgbGludCBwZXJmb3JtIHR5cGUgY2hlY2tpbmcuIEFsd2F5cyBmb3JjZSB0aGVtIG9uIGhlcmUsXG4vLyBpbnNpZGUgdGhlIG1hbmFnZWQgYmxvY2ssIHNvIG5vIGN1c3RvbWl6YXRpb24gY2FuIHNpbGVudGx5IGRpc2FibGUgdHlwZSBjaGVja2luZy5cbm94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnMgPSB7IC4uLm94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnMsIHR5cGVBd2FyZTogdHJ1ZSwgdHlwZUNoZWNrOiB0cnVlIH07YDtcbiAgfVxuXG4gIHJldHVybiBgLy8gT3hsaW50IHJlamVjdHMgdGhlIHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMgb3V0c2lkZSB0aGUgcm9vdCBjb25maWcsIHNvIGRlbGV0ZSB0aGVtXG4vLyBoZXJlLiBUaGlzIGRvZXMgTk9UIGRpc2FibGUgdHlwZSBjaGVja2luZzogdGhlIGxpbnQgY29tbWFuZHMgcGFzcyB0aGUgLS10eXBlLWF3YXJlIGFuZFxuLy8gLS10eXBlLWNoZWNrIGZsYWdzIGV4cGxpY2l0bHkuXG5jb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbmRlbGV0ZSBveGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zO2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgaWYgKCFkb2VzQ29udGFpbkphdmEoY29uZmlnKSkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbWFuYWdlZFNjcmlwdHNCbG9jayA9IGBzY3JpcHRzLyoqXG4hc2NyaXB0cy9cbiFzY3JpcHRzLyouc2hgO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UmFpbHdheWlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhSYWlsd2F5aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJhaWx3YXlpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9ec2NyaXB0c1xcLyQvbSwgbWFuYWdlZFNjcmlwdHNCbG9jayk7XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMuZXhpc3RzU3luYyh3b3JrZmxvd3NQYXRoKSA/IGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpIDogW107XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBpZiAoIXJlcG9zaXRvcnkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlbW92ZUdpdEh1YkFjdGlvbnNCYWRnZShuZXdDb250ZW50LCBiYWRnZU5hbWUsIGZpbGVOYW1lKTtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXNjYXBlZEJhZGdlTmFtZSA9IGVzY2FwZVJlZ0V4cChiYWRnZU5hbWUpO1xuICBjb25zdCBlc2NhcGVkRmlsZU5hbWUgPSBlc2NhcGVSZWdFeHAoZmlsZU5hbWUpO1xuICByZXR1cm4gcmVhZG1lXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICBuZXcgUmVnRXhwKFxuICAgICAgICBTdHJpbmcucmF3YFxcWyFcXFske2VzY2FwZWRCYWRnZU5hbWV9XFxdXFwoaHR0cHM6Ly9naXRodWJcXC5jb20vW14vXFxzKV0rL1teL1xccyldKy9hY3Rpb25zL3dvcmtmbG93cy8ke2VzY2FwZWRGaWxlTmFtZX0vYmFkZ2VcXC5zdmdcXClcXF1cXChodHRwczovL2dpdGh1YlxcLmNvbS9bXi9cXHMpXSsvW14vXFxzKV0rL2FjdGlvbnMvd29ya2Zsb3dzLyR7ZXNjYXBlZEZpbGVOYW1lfVxcKVxcbj9gLFxuICAgICAgICAnZ3UnXG4gICAgICApLFxuICAgICAgJydcbiAgICApXG4gICAgLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBwbHVnaW5zW2ldO1xuICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpO1xuICAgICAgY29uc3QgcGx1Z2luID0gaXNBcnJheSA/IHBsdWdpbkVudHJ5WzBdIDogcGx1Z2luRW50cnk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoaXNBcnJheSAmJiBwbHVnaW5FbnRyeVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IE9taXQ8dHlwZW9mIGpzb25PYmosICdleHRlbmRzJz4gJiB7XG4gIGV4dGVuZHM/OiBzdHJpbmdbXTtcbiAgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXTtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlUmVub3ZhdGVFeHRlbmRzKGpzb25PYmouZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyA/PyBbXSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzPzogc3RyaW5nW10gfSkgPT5cbiAgICAgICAgICBydWxlLm1hdGNoUGFja2FnZU5hbWVzPy5pbmNsdWRlcygnbmV4dCcpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IG1hdGNoUGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VSZW5vdmF0ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kczogc3RyaW5nW10sIGV4aXN0aW5nRXh0ZW5kczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZ2VuZXJhdGVkRXh0ZW5kcywgLi4uZXhpc3RpbmdFeHRlbmRzXSldLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xufVxuIiwiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFnZW50U2tpbGxzKF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignaW5zdGFsbEFnZW50U2tpbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRPRE86IFdlIGFyZSB0ZW1wb3JhcmlseSBub3QgaW5zdGFsbGluZyBtYW5hZ2VkIGFnZW50IHNraWxscyBpbnRvIHJlcG9zLlxuICAgIC8vIGF3YWl0IHJ1bkluc3RhbGxBZ2VudFNraWxscyhfcm9vdENvbmZpZyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsncGFja2FnZXMvKi90ZXN0L2ZpeHR1cmVzJywgJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogW1xuICAgICcqLmNvbmZpZy50cycsXG4gICAgJ3BhY2thZ2VzLyovKi5jb25maWcudHMnLFxuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3QvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdC8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICAvLyB3YmZ5IGdlbmVyYXRlcyByb290LWxldmVsIHRvb2wgY29uZmlncyBzdWNoIGFzIHBsYXl3cmlnaHQuY29uZmlnLnRzLCBhbmRcbiAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIG5lZWRzIHRob3NlIGZpbGVzIGluIHRoZSBwcm9qZWN0IHRvIHNlZSBOb2RlL0J1biBnbG9iYWxzLlxuICBpbmNsdWRlOiBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBhd2FpdCBjbGVhbnVwTGVnYWN5VHNjb25maWdNb2R1bGVTZXR0aW5ncyhjb25maWcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgY29uc3QgZ2VuZXJhdGVkVHlwZXMgPSBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2V0Um9vdERpcihjb25maWcpO1xuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc0J1biAmJiAhY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGpzeDogJ3JlYWN0LWpzeCcgfTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4Y2x1ZGUgPSBuZXdTZXR0aW5ncy5leGNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgLy8gUHJpc21hIHNlZWRzIGFuZCBtaWdyYXRpb24gaGVscGVyIHNjcmlwdHMgb2Z0ZW4gbGl2ZSBvdXRzaWRlIHNyYywgYnV0XG4gICAgICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgc3RpbGwgbmVlZHMgdGhlbSBjb3ZlcmVkIGJ5IHRoZSBwcm9qZWN0IGNvbmZpZy5cbiAgICAgIGFkZEluY2x1ZGVQYXRoKG5ld1NldHRpbmdzLCAncHJpc21hLyoqLyonKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBjb25zdCBleGlzdGluZ1R5cGVzID0gbm9ybWFsaXplU3RyaW5nQXJyYXkob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcyk7XG4gICAgICBjb25zdCBleGlzdGluZ0VtaXRNZXRhZGF0YSA9IHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgLy8gd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcuanNvbiBpcyBhIGxpbnQvdHlwZWNoZWNrIHByb2plY3QsIG5vdCB0aGUgZW1pdFxuICAgICAgLy8gY29udHJhY3QuIEl0IG11c3Qga2VlcCByb290RGlyIGJyb2FkIGVub3VnaCBmb3Igcm9vdCBjb25maWcgZmlsZXMsXG4gICAgICAvLyBzY3JpcHRzLCBzcmMsIGFuZCB0ZXN0cy4gYnVpbGQtdHMgb3ducyBlbWl0IGFuZCBjcmVhdGVzIGEgdGVtcG9yYXJ5XG4gICAgICAvLyBzcmMtb25seSB0c2NvbmZpZyB3aXRoIG5vRW1pdD1mYWxzZSwgZW1pdERlY2xhcmF0aW9uT25seT10cnVlLFxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiLCBhbmQgaW5jbHVkZT1bXCJzcmMvKiovKlwiXSwgc28gcHJlc2VydmluZyBub0VtaXQ9ZmFsc2Ugb3JcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiBoZXJlIHdvdWxkIG9ubHkgYnJlYWsgbm9uLXNyYyB0eXBlLWF3YXJlIGxpbnQgY292ZXJhZ2UuXG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgLi4uZXhpc3RpbmdFbWl0TWV0YWRhdGEgfTtcbiAgICAgIGVuc3VyZVRzRXh0ZW5zaW9uRW1pdENvbXBhdGliaWxpdHkobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzLCBnZW5lcmF0ZWRUeXBlcyksIC4uLmdlbmVyYXRlZFR5cGVzXSldO1xuICAgICAgaWYgKG1lcmdlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzID0gbWVyZ2VkVHlwZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZERlbGV0ZVR5cGVSb290cyhnZW5lcmF0ZWRUeXBlcykpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlUm9vdHM7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIC8vIFBhY2thZ2UgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB0aHJvdWdoIHBhY2thZ2UgZXhwb3J0cyBpbnN0ZWFkIG9mIGJhc2VVcmwuXG4gICAgLy8gcGF0aHMgaXMgaW50ZW50aW9uYWxseSBwcmVzZXJ2ZWQgc28gcmVwby1sb2NhbCB0b29saW5nIGNhbiBrZWVwIGV4cGxpY2l0XG4gICAgLy8gYWxpYXNlcyB3aXRob3V0IHJlbHlpbmcgb24gYmFzZVVybCdzIGJyb2FkIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcbiAgICBkZWxldGVMZWdhY3lNb2R1bGVTZXR0aW5ncyhuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGNvbmZpZyk7XG4gICAgbm9ybWFsaXplQ29tbW9uSnNUc2NvbmZpZ1NldHRpbmdzKG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgY29uZmlnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgVHNDb25maWdKc29uO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgICBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gICAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICAvLyBPbWl0dGluZyBpbmNsdWRlIGxldHMgZnJhbWV3b3JrIHRzY29uZmlncyBrZWVwIFR5cGVTY3JpcHQncyBkZWZhdWx0XG4gIC8vIFwiYWxsIFRTL1RTWCBmaWxlc1wiIGJlaGF2aW9yLCB3aGljaCBhbHJlYWR5IGNvdmVycyBzY3JpcHRzLlxuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUpIHJldHVybjtcbiAgaWYgKHNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoJ3NjcmlwdHMvKiovKicpKSByZXR1cm47XG5cbiAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKCdzY3JpcHRzLyoqLyonKTtcbiAgc2V0dGluZ3MuaW5jbHVkZS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zO1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBjb25zdCBtb2R1bGVSZXNvbHV0aW9uID0gbG93ZXJDYXNlU2V0dGluZyhjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbik7XG4gIGlmIChtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHwgbW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCcgfHwgbW9kdWxlUmVzb2x1dGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNldHRpbmdzLmV4dGVuZHMpIHtcbiAgICAgIC8vIEFuIGV4dGVuZGVkIGNvbmZpZyBtYXkgYWxyZWFkeSBzdXBwbHkgYSB2YWxpZCBtb2R1bGUvcmVzb2x2ZXIgcGFpciwgc28gb25seVxuICAgICAgLy8gcmVtb3ZlIHRoZSByZW1vdmVkLWluLVRTNiBub2RlMTAgc3BlbGxpbmdzIGluc3RlYWQgb2YgZm9yY2luZyBidW5kbGVyIG9uIGl0LlxuICAgICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZXh0LmpzIHdyaXRlcyBcIm5vZGVcIiBkdXJpbmcgYnVpbGQgd2hlbiB0aGlzIG9wdGlvbiBpcyBtaXNzaW5nLCBidXRcbiAgICAgIC8vIHRzZ29saW50IHRyZWF0cyB0aGF0IHNwZWxsaW5nIGFzIHRoZSByZW1vdmVkIG5vZGUxMCByZXNvbHZlci5cbiAgICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gJ2J1bmRsZXInO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcblxuICAvLyB0c2dvbGludCBmb2xsb3dzIFR5cGVTY3JpcHQgNiB2YWxpZGF0aW9uLCB3aGVyZSBiYXNlVXJsIGlzIHJlbW92ZWQgYW5kXG4gIC8vIHBhdGggdGFyZ2V0cyBtdXN0IGJlIGV4cGxpY2l0bHkgcmVsYXRpdmUuIE5leHQuanMgc3RpbGwgYWNjZXB0cyB0aGUgYWxpYXNcbiAgLy8gc2hhcGUgYWZ0ZXIgZWFjaCB0YXJnZXQgaXMgd3JpdHRlbiB3aXRoIGEgbGVhZGluZyAuLy5cbiAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5iYXNlVXJsO1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucy5wYXRocykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlck9wdGlvbnMucGF0aHMpKSB7XG4gICAgY29tcGlsZXJPcHRpb25zLnBhdGhzW2FsaWFzXSA9IG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHRhcmdldHMubWFwKCh0YXJnZXQpID0+IHtcbiAgICBpZiAodGFyZ2V0LnN0YXJ0c1dpdGgoJy4vJykgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoJy4uLycpIHx8IHBhdGguaXNBYnNvbHV0ZSh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0O1xuICAgIHJldHVybiBgLi8ke3RhcmdldH1gO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzUm9vdCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpID8gJy4uLy4uJyA6ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBpZiAoY29tcGlsZXJPcHRpb25zLm5vRW1pdCAhPT0gZmFsc2UgfHwgY29tcGlsZXJPcHRpb25zLmVtaXREZWNsYXJhdGlvbk9ubHkgPT09IHRydWUpIHJldHVybjtcblxuICAvLyBAdHNjb25maWcvYnVuIGVuYWJsZXMgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMsIHdoaWNoIFR5cGVTY3JpcHQgcGVybWl0c1xuICAvLyBkdXJpbmcgZW1pdCBvbmx5IHdoZW4gcmVsYXRpdmUgVFMgZXh0ZW5zaW9ucyBhcmUgcmV3cml0dGVuLlxuICBjb21waWxlck9wdGlvbnMucmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9ucyA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gVHlwZVNjcmlwdCB0cmVhdHMgb3B0aW9uIHZhbHVlcyBjYXNlLWluc2Vuc2l0aXZlbHksIHNvIG5vcm1hbGl6ZSBiZWZvcmUgY29tcGFyaXNvbi5cbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICAvLyBUeXBlU2NyaXB0IDYgcmVtb3ZlZCB0aGUgb2xkIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZywgc28gaW5oZXJpdGVkIGJhc2UgY29uZmlnc1xuICAvLyBzaG91bGQgY2hvb3NlIHRoZSByZXNvbHZlciB1bmxlc3MgYSBwcm9qZWN0IGFscmVhZHkgb3B0ZWQgaW50byBhIG1vZGVybiBvbmUuXG4gIGlmIChtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHwgbW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCcpIHtcbiAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gIH1cbiAgaWYgKGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSByZXR1cm47XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudml0ZSB8fCBjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgLy8gVml0ZSBvd25zIG1vZHVsZSBzZW1hbnRpY3MgZm9yIHRoZXNlIHBhY2thZ2VzIGFuZCB0aGVpciBzb3VyY2VzIHJlbHkgb25cbiAgICAvLyBidW5kbGVyLW1vZGUgcmVzb2x1dGlvbiAoZS5nLiBleHRlbnNpb25sZXNzIGltcG9ydHMpLCBzbyBwaW4gdGhlIGJ1bmRsZXIgcGFpclxuICAgIC8vIGV2ZW4gd2hlbiBhIGxlZ2FjeSBjb25maWcgdXNlZCB0aGUgbm9kZSByZXNvbHZlciwgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG9cbiAgICAvLyB0aGUgbm9kZSBiYXNlIGNvbmZpZ3MnIE5vZGVOZXh0LlxuICAgIGlmIChtb2R1bGVSZXNvbHV0aW9uICE9PSAnYnVuZGxlcicpIHtcbiAgICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gJ2J1bmRsZXInO1xuICAgIH1cbiAgICBjb25zdCBtb2R1bGVLaW5kID0gbG93ZXJDYXNlU2V0dGluZyhjb21waWxlck9wdGlvbnMubW9kdWxlKTtcbiAgICAvLyBUeXBlU2NyaXB0IHBhaXJzIHRoZSBidW5kbGVyIHJlc29sdmVyIHdpdGggUHJlc2VydmUgb3IgRVMtbW9kdWxlIGtpbmRzLiBLZWVwIGFuXG4gICAgLy8gZXhpc3RpbmcgdmFsaWQga2luZCAoZS5nLiBQcmVzZXJ2ZSwgd2hpY2ggaGFuZGxlcyBpbXBvcnQgYW5kIHJlcXVpcmUgc3ludGF4XG4gICAgLy8gc2VwYXJhdGVseSkgYW5kIGZpbGwgaW4gRVNOZXh0IG9ubHkgd2hlbiB0aGUgcGFpciB3b3VsZCBvdGhlcndpc2UgYmUgaW52YWxpZC5cbiAgICBpZiAobW9kdWxlS2luZCA9PT0gdW5kZWZpbmVkIHx8IChtb2R1bGVLaW5kICE9PSAncHJlc2VydmUnICYmICFtb2R1bGVLaW5kLnN0YXJ0c1dpdGgoJ2VzJykpKSB7XG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlID0gJ0VTTmV4dCc7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChtb2R1bGVSZXNvbHV0aW9uID09PSAnYnVuZGxlcicpIHtcbiAgICAvLyBUaGUgbm9kZSBiYXNlIGNvbmZpZ3MgcHJvdmlkZSBhIGNvbnNpc3RlbnQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIGFuZCBldmVyeVxuICAgIC8vIG1vZHVsZSBraW5kIHRoZXkgbWF5IGNob29zZSBpcyBpbnZhbGlkIHdpdGggYSBsZWZ0b3ZlciBidW5kbGVyIHJlc29sdmVyLlxuICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZUtpbmQgPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGUpO1xuICBpZiAobW9kdWxlS2luZCA9PT0gJ3ByZXNlcnZlJyB8fCBtb2R1bGVLaW5kPy5zdGFydHNXaXRoKCdlcycpKSB7XG4gICAgLy8gTm9kZSBiYXNlIGNvbmZpZ3MgcGFpciB0aGVpciByZXNvbHZlciB3aXRoIGEgbWF0Y2hpbmcgbW9kdWxlIGtpbmQ7IGxlZnRvdmVyXG4gICAgLy8gRVMvUHJlc2VydmUgb3ZlcnJpZGVzIGFyZSBpbnZhbGlkIHdpdGggZXZlcnkgcGFpciB0aGV5IG1heSBjaG9vc2UuXG4gICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gbG93ZXJDYXNlU2V0dGluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tbW9uSnNUc2NvbmZpZ1NldHRpbmdzKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zIHx8IGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5pc0VzbVBhY2thZ2UpIHJldHVybjtcblxuICBpZiAoY29tcGlsZXJPcHRpb25zLm1vZHVsZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2NvbW1vbmpzJykge1xuICAgIC8vIEB0c2NvbmZpZy9ub2RlLWx0cyBub3cgcHJvdmlkZXMgbW9kdWxlUmVzb2x1dGlvbj1ub2RlMTYuIFR5cGVTY3JpcHQgcmVxdWlyZXNcbiAgICAvLyB0aGUgbW9kdWxlIGtpbmQgdG8gbW92ZSB3aXRoIHRoYXQgcmVzb2x2ZXIsIHdoaWxlIHZlcmJhdGltTW9kdWxlU3ludGF4PWZhbHNlXG4gICAgLy8gcHJlc2VydmVzIHRoZSBsb25nLXN0YW5kaW5nIENvbW1vbkpTIGVtaXQgc2hhcGUgZm9yIGV4aXN0aW5nIHBhY2thZ2VzLlxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGUgPSAnTm9kZTE2JztcbiAgfVxuICBjb21waWxlck9wdGlvbnMudmVyYmF0aW1Nb2R1bGVTeW50YXggPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8Tm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCc+IHtcbiAgY29uc3QgZW1pdE9wdGlvbnMgPSB7fSBhcyBQaWNrPFxuICAgIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAgICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCdcbiAgPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZWNsYXJhdGlvbicsICdkZWNsYXJhdGlvbk1hcCcsICdzb3VyY2VNYXAnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcGlsZXJPcHRpb25zPy5ba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW1pdE9wdGlvbnNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1pdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdub2RlJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgICAgfVxuICAgICAgLy8gTExN44Gr44KI44KLdmliZSBjb2Rpbmfjgafjga/jgIHoh6rli5Xjg5Xjgqnjg7zjg57jg4Pjg4jjgoTjgrPjg7zjg4njgqLjgq/jgrfjg6fjg7PjgpLnhKHlirnljJbjgZnjgovjgZPjgajjgadcbiAgICAgIC8vIOeUn+aIkOOBleOCjOOBn+OCs+ODvOODieOBruWFg+OBruW9ouW8j+OCkue2reaMgeOBp+OBjeOCi1xuICAgICAgaWYgKCdlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJ107XG4gICAgICB9XG4gICAgICBpZiAoJ2VkaXRvci5mb3JtYXRPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmZvcm1hdE9uU2F2ZSddO1xuICAgICAgfVxuICAgICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnbGxtLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYWktcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItYWxsIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNsYXVkZSA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jb2RleCA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1nZW1pbmkgOnJvYm90OicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5pbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0OiAnYnJhbmNoJztcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnO1xuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGluY2x1ZGU6IHN0cmluZ1tdO1xuICAgICAgZXhjbHVkZTogc3RyaW5nW107XG4gICAgfTtcbiAgfTtcbiAgcnVsZXM6IChcbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2RlbGV0aW9uJyB8ICdub25fZmFzdF9mb3J3YXJkJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBib29sZWFuO1xuICAgICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiB7XG4gICAgICAgICAgICBjb250ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogbnVtYmVyO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiBudW1iZXI7XG4gICAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXTtcbiAgICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogYm9vbGVhbjtcbiAgICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ107XG4gICAgICAgIH07XG4gICAgICB9XG4gIClbXTtcbiAgYnlwYXNzX2FjdG9yczoge1xuICAgIGFjdG9yX2lkOiBudW1iZXI7XG4gICAgYWN0b3JfdHlwZTogJ1RlYW0nO1xuICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JztcbiAgfVtdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNvdXJjZV90eXBlPzogc3RyaW5nO1xufVxuXG5jb25zdCBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSID0ge1xuICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCA9IDE1XzM2ODtcblxuY29uc3QgUFJPVEVDVF9NQUlOX1JVTEVTRVQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCA9IHtcbiAgbmFtZTogJ1Byb3RlY3QgbWFpbicsXG4gIHRhcmdldDogJ2JyYW5jaCcsXG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJyxcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBleGNsdWRlOiBbXSxcbiAgICAgIGluY2x1ZGU6IFsnfkRFRkFVTFRfQlJBTkNIJ10sXG4gICAgfSxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZGVsZXRpb24nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGZhbHNlLFxuICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAndGVzdCAvIHRlc3QnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3NlbWFudGljLXByIC8gc2VtYW50aWMtcHInLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ25vbl9mYXN0X2ZvcndhcmQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IDAsXG4gICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXSxcbiAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBmYWxzZSxcbiAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBieXBhc3NfYWN0b3JzOiBbXG4gICAge1xuICAgICAgYWN0b3JfaWQ6IDE3Xzc3N180OTUsXG4gICAgICBhY3Rvcl90eXBlOiAnVGVhbScsXG4gICAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInKSByZXR1cm47XG4gICAgLy8gVGhlIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGhvc3RzIHdvcmtmbG93X2NhbGwgZGVmaW5pdGlvbnMsIHNvIHRoZVxuICAgIC8vIFByb3RlY3QgbWFpbiBydWxlc2V0IHdvdWxkIHJlcXVpcmUgdGVzdC9zZW1hbnRpYy1wciBjaGVja3MgdGhhdCBuZXZlciBydW4gdGhlcmUuXG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKGNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdXBzZXJ0UHJvdGVjdE1haW5SdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWcpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBSZXBvc2l0b3J5IHJ1bGVzZXRzIHJlcXVpcmUgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgd2hpY2ggbG9jYWwgcnVuc1xuICAgICAgLy8gbWF5IG5vdCBoYXZlIGV2ZW4gd2hlbiBmaWxlLWdlbmVyYXRpb24gYW5kIHB1c2hlcyBhcmUgYWxsb3dlZC5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIGNvbnN0IHJ1bGVzZXQgPSBzdHJ1Y3R1cmVkQ2xvbmUoUFJPVEVDVF9NQUlOX1JVTEVTRVQpO1xuICBpZiAoY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXNldC5ydWxlcykge1xuICAgICAgaWYgKHJ1bGUudHlwZSAhPT0gJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnKSBjb250aW51ZTtcbiAgICAgIC8vIFRoZSBjb250ZXh0IGlzIGA8Y2FsbGVyIGpvYiBpZD4gLyA8cmV1c2FibGUgam9iIGlkPmAgb2YgdGhlIHdiZnktZ2VuZXJhdGVkIHRlc3QtcnVzdC55bWwuXG4gICAgICBydWxlLnBhcmFtZXRlcnMucmVxdWlyZWRfc3RhdHVzX2NoZWNrcy5wdXNoKHtcbiAgICAgICAgY29udGV4dDogJ3Rlc3QtcnVzdCAvIHRlc3QtcnVzdCcsXG4gICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnVsZXNldDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBzZXJ0UHJvdGVjdE1haW5SdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldCA9IGF3YWl0IGZpbmRSZXBvc2l0b3J5UnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgcnVsZXNldC5uYW1lKTtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0SWQgPSBleGlzdGluZ1J1bGVzZXQ/LmlkO1xuXG4gIGF3YWl0IHdpdGhSZXRyeShcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoZXhpc3RpbmdSdWxlc2V0SWQpIHtcbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzL3tydWxlc2V0X2lkfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHJ1bGVzZXRfaWQ6IGV4aXN0aW5nUnVsZXNldElkLFxuICAgICAgICAgIC4uLnJ1bGVzZXQsXG4gICAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIC4uLnJ1bGVzZXQsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldE5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3aXRoUmV0cnkoXG4gICAgKCkgPT5cbiAgICAgIG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIGluY2x1ZGVzX3BhcmVudHM6IGZhbHNlLFxuICAgICAgICB0YXJnZXRzOiAnYnJhbmNoJyxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pLFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xuICBjb25zdCBydWxlc2V0cyA9IHJlc3BvbnNlLmRhdGE7XG4gIGlmICghQXJyYXkuaXNBcnJheShydWxlc2V0cykpIHJldHVybjtcbiAgcmV0dXJuIHJ1bGVzZXRzLmZpbmQoKHJ1bGVzZXQpID0+IHJ1bGVzZXQubmFtZSA9PT0gcnVsZXNldE5hbWUgJiYgcnVsZXNldC5zb3VyY2VfdHlwZSA9PT0gJ1JlcG9zaXRvcnknKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIHJldHVybiBzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMyB8fCBzdGF0dXMgPT09IDQwNDtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSBzb2RpdW1Nb2R1bGUgZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnLCAnR0hfQk9UX1BBVCcsICdQVUJMSUNfR0hfQk9UX1BBVCddO1xuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVudicpLCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIERFUFJFQ0FURURfU0VDUkVUX05BTUVTKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGNvbnN0IHNvZGl1bSA9IGdldFNvZGl1bSgpO1xuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUicgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUInXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U29kaXVtKCk6IHR5cGVvZiBzb2RpdW1Nb2R1bGUge1xuICAvLyBsaWJzb2RpdW0td3JhcHBlcnMnIEVTTSBlbnRyeSBjYW4gYmluZCB0byBsaWJzb2RpdW1AMC44LjMsIHdob3NlIGRlZmF1bHRcbiAgLy8gZXhwb3J0IG5vIGxvbmdlciBleHBvc2VzIHJlYWR5LiBUaGUgQ29tbW9uSlMgZW50cnkga2VlcHMgdGhlIEFQSSBzaGFwZS5cbiAgcmV0dXJuIHJlcXVpcmUoJ2xpYnNvZGl1bS13cmFwcGVycycpIGFzIHR5cGVvZiBzb2RpdW1Nb2R1bGU7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cEdpdEh1YlNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgc2V0dGluZ3MgbmVlZCBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB1bmxpa2UgZmlsZSBnZW5lcmF0aW9uLlxuICAgICAgYXdhaXQgd2l0aFJldHJ5KFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gTG9jYWwgd2JmeSBydW5zIG9mdGVuIGhhdmUgcHVzaCBwZXJtaXNzaW9uIHdpdGhvdXQgYWRtaW4gcGVybWlzc2lvbi5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cEdpdEh1YlNldHRpbmdzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8ICEoJ3N0YXR1cycgaW4gZXJyb3IpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlcnJvci5zdGF0dXMgPT09IDQwMSB8fCBlcnJvci5zdGF0dXMgPT09IDQwMyB8fCBlcnJvci5zdGF0dXMgPT09IDQwNDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgcGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciA9ICdfX1BNX1JVTl9fJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKG5ld0NvbnRlbnQsIGNvbmZpZyk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgY29udGVudCkgPiBjb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZml4V2JEYkNvbW1hbmQgfSBmcm9tICcuL2ZpeGVycy93YkRiQ29tbWFuZC5qcyc7XG5pbXBvcnQgeyB1bnRyYWNrV29ya2VyVHlwZXMgfSBmcm9tICcuL2ZpeGVycy93b3JrZXJUeXBlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFJhaWx3YXlpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsQWdlbnRTa2lsbHMgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2tpbGxzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVZYXJucmNZbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMveWFybnJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgfSBmcm9tICcuL2dpdGh1Yi9ydWxlc2V0LmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzLCBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlVHlwZVNjcmlwdEFwaSB9IGZyb20gJy4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGF3YWl0IHdpbGxib29zdGVyaWZ5UGF0aHMoYXJndi5wYXRocyBhcyBzdHJpbmdbXSwgYXJndi5za2lwRGVwcyk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgY29tcGlsZXIgc2VydmVyIHNwYXduZWQgZm9yIEFTVCBwYXJzaW5nIGtlZXBzIGFuIG9wZW4gSVBDXG4gICAgLy8gY2hhbm5lbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBwcmV2ZW50IHRoZSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAgIGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk7XG4gIH1cbiAgaWYgKGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnKSB7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2lsbGJvb3N0ZXJpZnlQYXRocyhwYXRoczogc3RyaW5nW10sIHNraXBEZXBzOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIHBhdGhzKSB7XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gZGlyZW50cy5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSkubWFwKChkKSA9PiBwYXRoLmpvaW4ocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcblxuICAgIGF3YWl0IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24oW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10pO1xuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHJvb3RDb25maWcpKVxuICAgICk7XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGZpeFJhaWx3YXlpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBza2lwRGVwcyk7XG4gICAgICAvLyBPbmx5IGFmdGVyIGJvdGggdGhlIGJhcnJpZXIgYWJvdmUg4oCUIHdoZXJlIHRoZSBwb29sZWQgLmdpdGlnbm9yZSB3cml0ZSBhY3R1YWxseSBjb21wbGV0ZXMg4oCUIGFuZCB0aGVcbiAgICAgIC8vIHBhY2thZ2UuanNvbiBnZW5lcmF0aW9uOiB1bnRyYWNraW5nIGEgZmlsZSB0aGF0IGRpZCBub3QgZ2V0IGlnbm9yZWQgKGUuZy4gdGhlIGdpdGlnbm9yZS5pbyBmZXRjaCBmYWlsZWQpIG9yXG4gICAgICAvLyB3aG9zZSBwb3N0aW5zdGFsbCBkb2VzIG5vdCBhY3R1YWxseSByZWdlbmVyYXRlIGl0IChnZW5lcmF0ZVBhY2thZ2VKc29uIHN3YWxsb3dzIGl0cyBvd24gZXhjZXB0aW9ucywgc28gYVxuICAgICAgLy8gcGFydGlhbCBydW4gaXMgcG9zc2libGUpIHdvdWxkIGRlbGV0ZSB0aGUgZGVjbGFyYXRpb24gd2l0aCBub3RoaW5nIHJlY3JlYXRpbmcgaXQgb24gZnJlc2ggY2hlY2tvdXRzLlxuICAgICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgICAgYXdhaXQgdW50cmFja1dvcmtlclR5cGVzKGNvbmZpZyk7XG4gICAgICB9XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiYgZG9lc0NvbnRhaW5Kc09yVHMocm9vdENvbmZpZykpIHtcbiAgICAgICAgLy8gTW9ub3JlcG8gdmVyaWZpY2F0aW9uIGNhbiBpbnZva2Ugb3hsaW50IGZyb20gZXZlcnkgd29ya3NwYWNlLiBHaXZlXG4gICAgICAgIC8vIG5vbi1jb2RlIHBhY2thZ2VzIGEgbG9jYWwgY29uZmlnIHNvIG94bGludCBkb2VzIG5vdCBjbGltYiB0byB0aGVcbiAgICAgICAgLy8gcm9vdCBjb25maWcgYW5kIHJlamVjdCByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIGZyb20gYSBwYWNrYWdlIGN3ZC5cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIGF3YWl0IGZpeFdiRGJDb21tYW5kKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbigncmVmcmVzaEJ1bkxvY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG5cbiAgICBhd2FpdCBpbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZyk7XG4gIH1cbiAgcmV0dXJuIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoKTtcbiAgaWYgKHN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlsxMiwxMywxNCwxNSwxNiwxN10sIm1hcHBpbmdzIjoiOHRCQUFBLGVBQXNCLEdBQU0sRUFBcUMsQ0FDL0QsT0FBTyxJQUFJLFFBQVMsR0FBWSxXQUFXLEVBQVMsQ0FBWSxDQUFDLENBQ25FLENDaUNBLGVBQXNCLEdBQW9CLEVBQThDLENBQ3RGLEdBQUksQ0FDRixPQUFPLE1BQU0sRUFBRyxDQUNsQixNQUFRLENBRVIsQ0FDRixDQUVBLGVBQXNCLEVBQXFCLEVBQThDLENBQ3ZGLEdBQUksQ0FDRixPQUFPLE1BQU0sRUFBRyxDQUNsQixPQUFTLEVBQU8sQ0FDZCxHQUFJLE9BQU8sR0FBVSxVQUFZLEdBQVMsU0FBVSxHQUFTLEVBQU0sT0FBUyxTQUMxRSxPQUVGLE1BQU0sQ0FDUixDQUNGLENBMEJBLGVBQXNCLEdBQ3BCLEVBQ0EsQ0FDRSxjQUNB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