@willbooster/wb 13.28.3 → 13.28.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +17 -17
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -20,11 +20,11 @@ const L=[...`0123456789abcdef`],ge=[6,1536,393216,100663296],R=[0,8,16,24],_e=[1
|
|
|
20
20
|
&& litestream restore ${r} -o "${t}" "${t}" && ls -ahl "${t}" && ${i}`}listBackups(e,t){let n=Xt(e,`list-backups`);return`litestream ltx ${Qt(e,t)} "${n}"`}restore(e,t,n){let r=Xt(e,`restore`);return`${qt(t)}; litestream restore ${Qt(e,n)} -o "${t}" "${r}"`}generate(e,t=``){return Ut(e,`generate ${t}`.trim())}migrateDev(e,t=``){return this.generate(e,t)}seed(n,r){if(r)return`BUN build-ts run ${r}`;if(n.packageJson.scripts?.seed)return`YARN run seed`;let i=t.join(`db`,`seed.ts`);return e.existsSync(t.join(n.dirPath,i))?n.usesBunPackageManager?`BUN ${i}`:`BUN build-ts run ${i}`:`true`}studio(e,t,n=``){return t?`echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1`:Ut(e,`studio ${n}`.trim())}};function Ut(e,t,n=``){let r=`${n&&`${n} `}YARN drizzle-kit ${t}`;return t.includes(`--config`)?r:Wt(e,r)}function Wt(e,t){let n=Gt(e);return n&&n.dirPath!==e.dirPath?`(${G([`cd`,n.dirPath])} && ${t})`:t}function Gt(n){let r=[`drizzle.config.ts`,`drizzle.config.mts`,`drizzle.config.js`,`drizzle.config.mjs`];for(let i of[n.dirPath,n.rootDirPath]){let n=r.find(n=>e.existsSync(t.join(i,n)));if(n)return{dirPath:i,fileName:n}}}function Kt(e){let n=Zt(e);if(n)return qt(t.isAbsolute(n)?n:t.resolve(e.dirPath,n))}function qt(e){return`rm -f "${e}" "${e}-wal" "${e}-shm"`}function Jt(e){return`rm -Rf "${e}"*`}function Yt(e,t){let n=Zt(e);if(!n)throw Error(`wb db ${t} supports Drizzle only when file: DATABASE_URL is set.`);return n}function Xt(e,n){let r=Yt(e,n);return t.isAbsolute(r)?r:t.resolve(e.dirPath,r)}function Zt(e){return Ue(e)}function Qt(n,r){if(r)return`-config "${r}"`;let i=t.join(n.dirPath,Bt);return e.existsSync(i)?`-config ./${Bt}`:e.existsSync(Vt)?`-config ${Vt}`:`-config ./${Bt}`}const $t=new Ht;function en(n,r){if(r.migrations_pattern)return!0;let i=t.resolve(n.dirPath,r.migrations_dir??`migrations`);return e.existsSync(i)?e.readdirSync(i).some(e=>e.endsWith(`.sql`)):!1}const tn=new Set([`bindings`,`send_email`,`ratelimits`]),nn=new Set([`wasm_modules`,`text_blobs`,`data_blobs`]);function rn(e,t=new Set,n=``){if(Array.isArray(e)){for(let r of e)rn(r,t,n);return t}if(!e||typeof e!=`object`)return t;for(let[r,i]of Object.entries(e))if(r===`binding`&&typeof i==`string`)t.add(i);else if(r===`name`&&typeof i==`string`&&tn.has(n))t.add(i);else if(nn.has(r)&&i&&typeof i==`object`&&!Array.isArray(i))for(let e of Object.keys(i))t.add(e);else r!==`env`&&r!==`vars`&&r!==`metadata`&&r!==`options`&&rn(i,t,r);return t}function an(e,t){return t?.site??e.site?[`__STATIC_CONTENT`]:[]}function on(n,r){let i=q(n);if(!i)return;if(t.extname(i)===`.toml`)throw Error(`wb deploy supports wrangler.jsonc/wrangler.json configs only; migrate wrangler.toml first.`);let a=[],o=_(e.readFileSync(i,`utf8`),a,{allowTrailingComma:!0});if(a.length>0)throw Error(`Failed to parse ${i}: ${a.length} JSONC syntax error(s).`);if(!o)return;let s=o.env?.[r];if(!s&&r!==`production`)throw Error(`The wrangler config has no "env": { "${r}": ... } section.`);return s?{workerName:s.name??(o.name?`${o.name}-${r}`:void 0),accountId:s.account_id??o.account_id,varKeys:Object.keys(s.vars??{}),vars:s.vars??{},bindingNames:[...rn({assets:s.assets??o.assets,logfwdr:s.logfwdr??o.logfwdr,wasm_modules:s.wasm_modules??o.wasm_modules,text_blobs:s.text_blobs??o.text_blobs,data_blobs:s.data_blobs??o.data_blobs},rn(s)),...an(o,s)],d1Databases:s.d1_databases??[],requiredSecretNames:s.secrets?.required??[],usesEnvSection:!0}:{workerName:o.name,accountId:o.account_id,varKeys:Object.keys(o.vars??{}),vars:o.vars??{},bindingNames:[...rn(o),...an(o)],d1Databases:o.d1_databases??[],requiredSecretNames:o.secrets?.required??[],usesEnvSection:!1}}const sn={command:`gen-dev-vars [path]`,describe:"Generate a .dev.vars file for `wrangler dev` from the environment variables loaded from .env files (plus WB_ENV and NEXT_PUBLIC_WB_ENV).",builder:e=>e.positional(`path`,{description:`Output path of the generated .dev.vars file.`,type:`string`,default:`.dev.vars`}),async handler(n){let r=B(n);r||(console.error(f.red(`No project found.`)),process.exit(1));let[i]=D(n,r.dirPath,{ignoreProcessEnv:!0}),a=new Set;for(let e of Object.keys(i)){let t=r.env[e];t!==void 0&&(t===``&&i[e]!==``&&a.add(e),i[e]=t)}for(let e of[...cn(r),`WB_ENV`,`NEXT_PUBLIC_WB_ENV`]){let t=r.env[e];i[e]||t===void 0||(i[e]===void 0&&t===``&&a.add(e),i[e]=t)}let o=Object.entries(i).filter(([e,t])=>t!==``||a.has(e)).toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}=${ln(e,t)}`),s=t.resolve(r.dirPath,n.path??`.dev.vars`);if(n.dryRun){console.info(f.cyan(`Would generate ${s} with ${o.length} environment variables.`));return}e.mkdirSync(t.dirname(s),{recursive:!0}),e.writeFileSync(s,o.join(`
|
|
21
21
|
`)+`
|
|
22
22
|
`),console.info(f.green(`Generated ${s} with ${o.length} environment variables.`))}};function cn(t){let n;try{n=t.findFile(`.env.example`)}catch{return[]}return Object.keys(s(e.readFileSync(n,`utf8`)))}function ln(e,t){let n=t.replaceAll(`
|
|
23
|
-
`,String.raw`\n`).replaceAll(`\r`,String.raw`\r`),r=[`'${t}'`,`\`${t}\``,`"${n}"`];for(let n of r)if(s(`${e}=${n}`)[e]===t)return n;throw Error(`The value of ${e} cannot be losslessly serialized into .dev.vars; simplify its quoting.`)}const un=new Set(`CI.CF_ACCOUNT_ID.CF_API_BASE_URL.CF_API_EMAIL.CF_API_KEY.CF_API_TOKEN.CF_EMAIL.CLOUDFLARE_ACCESS_CLIENT_ID.CLOUDFLARE_ACCESS_CLIENT_SECRET.CLOUDFLARE_ACCOUNT_ID.CLOUDFLARE_API_BASE_URL.CLOUDFLARE_API_KEY.CLOUDFLARE_API_TOKEN.CLOUDFLARE_AUTH_USE_KEYRING.CLOUDFLARE_D1_DATABASE_ID.CLOUDFLARE_EMAIL.CLOUDFLARE_ENV.CLOUDFLARE_INCLUDE_PROCESS_ENV.CLOUDFLARE_LOAD_DEV_VARS_FROM_DOT_ENV.DOCKER_HOST.HTTP_PROXY.HTTPS_PROXY.http_proxy.https_proxy.FORCE_COLOR.MINIFLARE_CACHE_DIR.MISE_ENV.NO_COLOR.NEXT_PUBLIC_WB_ENV.NEXT_PUBLIC_WB_VERSION.NODE_ENV.PORT.WB_ENV.WB_VERSION`.split(`.`)),dn=[`WRANGLER_`,`CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_`,`CLOUDFLARE_CF_FETCH_`];function fn(e){return un.has(e)||dn.some(t=>e.startsWith(t))}const pn={command:`deploy`,describe:`Deploy a Cloudflare Workers app (vinext or plain Worker) to the WB_ENV environment: validate secrets, build, apply remote D1 migrations, then deploy code and secrets atomically.`,builder:e=>e,async handler(n){delete process.env.CLOUDFLARE_ENV;let r=B(n);r||(console.error(f.red(`No project found.`)),process.exit(1));let a=q(r);a||(console.error(f.red(`wb deploy currently supports only Cloudflare Workers apps (no wrangler config found).`)),process.exit(1)),delete r.env.CLOUDFLARE_ENV;let s=r.env.WB_ENV;(!s||s===`development`||s===`test`)&&(console.error(f.red(`WB_ENV must name a deploy environment (e.g. staging or production), but is ${s}.`)),process.exit(1));let c=t.join(r.dirPath,`.env.cloudflare`);if(e.existsSync(c)){let e=o({path:c,processEnv:{},quiet:!0}).parsed??{};for(let[t,n]of Object.entries(e))t!==`CLOUDFLARE_ENV`&&(r.env[t]??=n)}let l;try{l=on(r,s)}catch(e){console.error(f.red(String(e instanceof Error?e.message:e))),process.exit(1)}l||(console.error(f.red(`Failed to parse ${a}.`)),process.exit(1));let u=l.accountId??r.env.CLOUDFLARE_ACCOUNT_ID,d=l.d1Databases.filter(e=>en(r,e));r.hasDrizzle&&d.length>0&&d.length<l.d1Databases.length&&(console.error(f.red(`wb deploy does not support mixing wrangler-native and non-native D1 migration layouts.`)),process.exit(1));let p=d.length===0&&r.hasDrizzle?l.d1Databases[0]:void 0;if(d.length===0&&r.hasDrizzle&&l.d1Databases.length>1&&(console.error(f.red(`wb deploy supports drizzle-kit migrations only for a single D1 binding; found multiple.`)),process.exit(1)),!n.dryRun){p&&!r.env.CLOUDFLARE_API_TOKEN&&(console.error(f.red(`CLOUDFLARE_API_TOKEN is required for remote drizzle-kit migrations.`)),process.exit(1));let e=!!r.env.CLOUDFLARE_API_TOKEN||!!r.env.CF_API_TOKEN||!!(r.env.CLOUDFLARE_API_KEY&&r.env.CLOUDFLARE_EMAIL)||!!(r.env.CF_API_KEY&&r.env.CF_EMAIL);Ne(r.env.CI)&&!e&&(console.error(f.red(`Wrangler authentication (e.g. CLOUDFLARE_API_TOKEN) is required to deploy on CI.`)),process.exit(1))}!Ne(r.env.CI)&&r.packageJson.scripts?.[`deploy/ci-setup`]&&await H(`YARN run deploy/ci-setup`,r,n);let[h,g]=D(n,r.dirPath,{ignoreProcessEnv:!0}),_=new Set(g.filter(([e])=>!e.startsWith(`mise env`)).flatMap(([,e])=>e));for(let e of Object.keys(h))_.has(e)||delete h[e];let v=cn(r);for(let e of v)h[e]??=r.env[e]??``;for(let e of l.requiredSecretNames){let t=r.env[e];h[e]===void 0&&t!==void 0&&(h[e]=t)}for(let e of Object.keys(h)){let t=r.env[e];t!==void 0&&(h[e]=t)}let{missingKeys:y,secrets:b}=mn(h,[...l.varKeys,...l.bindingNames],v);r.env.WB_VERSION&&l.bindingNames.includes(`WB_VERSION`)&&(console.error(f.red(`WB_VERSION collides with a Worker binding name; rename the binding.`)),process.exit(1));let x=Object.keys(h).filter(e=>l.bindingNames.includes(e));x.length>0&&console.warn(f.yellow(`Skipping env keys that collide with Worker binding names: ${x.join(`, `)}`)),y.length>0&&(console.error(f.red(`Missing required environment variables (from .env.example or wrangler secrets.required): ${y.join(`, `)}`)),process.exit(1));let S=l.requiredSecretNames.filter(e=>!(e in b)&&!l.varKeys.includes(e)&&!l.bindingNames.includes(e));S.length>0&&(console.error(f.red(`Secrets required by the wrangler config are not provided: ${S.join(`, `)}`)),process.exit(1));let C=Object.keys(b).toSorted();C.length>100&&(console.error(f.red(`Cloudflare accepts at most 100 secrets per deploy, but ${C.length} were selected.`)),process.exit(1));let w=new Map(Object.entries(l.vars));r.env.WB_VERSION&&w.set(`WB_VERSION`,r.env.WB_VERSION);let T=[...w],E=new Set([...C,...T.map(([e])=>e)]).size;E>128&&(console.error(f.red(`Cloudflare allows at most 128 variables and secrets combined, but ${E} were selected.`)),process.exit(1)),E>64&&console.warn(f.yellow(`${E} variables and secrets exceed the Free plan's limit of 64.`));let O=[...C.filter(e=>Buffer.byteLength(b[e]??``,`utf8`)>5*1024),...T.filter(([,e])=>Buffer.byteLength(typeof e==`string`?e:JSON.stringify(e),`utf8`)>5*1024).map(([e])=>e)];O.length>0&&(console.error(f.red(`Variable or secret values exceed Cloudflare's 5 KB limit: ${O.join(`, `)}`)),process.exit(1)),console.info(f.cyan(`Deploying ${l.workerName??r.name} (${s}) with ${C.length} secrets: ${C.join(`, `)}`));let k=!!(r.packageJson.dependencies?.vinext??r.packageJson.devDependencies?.vinext),A=l.usesEnvSection?`${At(`CLOUDFLARE_ENV`,s)} `:``;k?(r.env.WB_VERSION&&(r.env.NEXT_PUBLIC_WB_VERSION||=r.env.WB_VERSION),r.packageJson.scripts?.[`gen-code`]&&await H(`YARN run gen-code`,r,n),await H(`${A}YARN vinext build`,r,n)):await H(`YARN wrangler deploy --dry-run --config ${K(a)}${l.usesEnvSection?` --env ${K(s)}`:``}`,r,n);let j=l.usesEnvSection?` --env ${K(s)}`:``;for(let e of d){let t=e.database_name??e.binding;t&&await H(`CI=true YARN wrangler d1 migrations apply ${K(t)} --remote --config ${K(a)}${j}`,r,n)}p&&(p.database_id||(console.error(f.red(`The ${s} D1 binding has no database_id in the wrangler config.`)),process.exit(1)),u||(console.error(f.red(`CLOUDFLARE_ACCOUNT_ID (or account_id in the wrangler config) is required for remote drizzle-kit migrations.`)),process.exit(1)),await H(Ut(r,`migrate`,`CLOUDFLARE_D1_DATABASE_ID=${p.database_id} CLOUDFLARE_ACCOUNT_ID=${u}`),r,n));let M=k?t.join(`dist`,`server`,`wrangler.json`):a;k&&!n.dryRun&&!e.existsSync(t.resolve(r.dirPath,M))&&(console.error(f.red(`${M} not found; the vinext build did not produce a deploy config.`)),process.exit(1));let N=[`deploy`,`--config`,M,...!k&&l.usesEnvSection?[`--env`,s]:[],...r.env.WB_VERSION?[`--var`,`WB_VERSION:${r.env.WB_VERSION}`]:[],`--secrets-file`];if(console.info(f.cyan(`Running: wrangler ${N.join(` `)} <temporary secrets file>`)),!n.dryRun){r.binExists||console.warn(f.yellow(`node_modules/.bin not found; relying on PATH to resolve wrangler.`));let n={...r.env};delete n.CLOUDFLARE_ENV;let a=e.mkdtempSync(t.join(m.tmpdir(),`wb-deploy-`)),o=[`SIGHUP`,`SIGINT`,`SIGTERM`,`SIGQUIT`],s=new Map,c,l;for(let t of o){let n=()=>{if(l??=t,c)c.kill(t===`SIGINT`||t===`SIGTERM`?t:`SIGTERM`);else{for(let[e,t]of s)process.off(e,t);e.rmSync(a,{force:!0,recursive:!0}),process.kill(process.pid,t)}};s.set(t,n),process.on(t,n)}let u;try{let o=t.join(a,`secrets.json`);e.writeFileSync(o,JSON.stringify(b),{mode:384}),u=await new Promise(e=>{c=i(`wrangler`,[...N,o],{cwd:r.dirPath,env:n,stdio:[`ignore`,`inherit`,`inherit`]}),c.on(`error`,t=>{console.error(t),e(1)}),c.on(`exit`,(t,n)=>{e(n?1:t??void 0)})})}finally{for(let[e,t]of s)process.off(e,t);e.rmSync(a,{force:!0,recursive:!0})}if(l){process.kill(process.pid,l);return}u!==0&&(console.error(f.red(`wrangler deploy failed with exit code ${u??`unknown`}.`)),process.exit(u??1))}if(r.packageJson.scripts?.[`deploy/post`]){let e=l.d1Databases.length===1?l.d1Databases[0]:void 0;delete r.env.CLOUDFLARE_D1_DATABASE_ID,l.d1Databases.length>1&&console.warn(f.yellow(`Multiple D1 bindings exist; CLOUDFLARE_D1_DATABASE_ID is not set for deploy/post.`)),e?.database_id&&(r.env.CLOUDFLARE_D1_DATABASE_ID=e.database_id),u&&(r.env.CLOUDFLARE_ACCOUNT_ID=u),await H(`YARN run deploy/post`,r,n)}}};function mn(e,t,n){let r=new Set(t),i={};for(let[t,n]of Object.entries(e))n===void 0||r.has(t)||fn(t)||t===`DATABASE_URL`&&n.startsWith(`file:`)||(i[t]=n);return{missingKeys:n.filter(t=>!r.has(t)&&!fn(t)&&!e[t]),secrets:i}}const hn=new Set([`SIGINT`,`SIGTERM`,`SIGQUIT`]),gn={command:`dotenv [args..]`,describe:`Load .env files and run a command.`,builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await _n(vn(e))}};async function _n({command:e}){e.length===0&&(console.error(`Usage: wb dotenv -- <command> [args...]`),process.exit(1));let n=t.resolve(process.cwd());yn(n);let r=process.env.BERRY_BIN_FOLDER;P(process.env),!Me(n,process.env)&&r&&(process.env.PATH=process.env.PATH?`${r}:${process.env.PATH}`:r);let a=i(e[0],e.slice(1),{cwd:n,env:process.env,stdio:`inherit`}),o=new Map,s;a.on(`error`,e=>{console.error(e),process.exit(1)});for(let e of hn){let t=()=>{s=e,a.kill(e)};o.set(e,t),process.once(e,t)}a.on(`exit`,(e,t)=>{for(let[e,t]of o)process.off(e,t);if(t&&t===s&&process.exit(0),t){process.kill(process.pid,t);return}process.exit(e??1)})}function vn(e){return{command:[...(e.args??[]).map(String),...(e[`--`]??[]).map(String)]}}function yn(e){let n={...o({path:t.join(e,`.env`),processEnv:{},quiet:!0}).parsed,...process.env.WB_ENV?o({path:t.join(e,`.env.${process.env.WB_ENV}`),processEnv:{},quiet:!0}).parsed??{}:{}},r=c({parsed:n,processEnv:{}}).parsed??n;for(let[e,t]of Object.entries(r))e in process.env||(process.env[e]=t)}const bn=`litestream.yml`,xn=`/etc/litestream.yml`,Sn=[{schemaPath:t.join(`prisma`,`schema.prisma`),dbPath:`prisma`},{schemaPath:t.join(`prisma`,`schema`),dbPath:t.join(`prisma`,`schema`)},{schemaPath:t.join(`db`,`schema.prisma`),dbPath:`db`}];var Cn=class{cleanUpLitestream(e){let t=wn(e);return`${On(`${t}/prod.sqlite3`)}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=``){return`PRISMA migrate deploy ${t}`}generate(e,t=``){return[`PRISMA generate`,t].filter(Boolean).join(` `)}deployForce(e){let t=wn(e),n=Dn(`${t}/prod.sqlite3`);return`${n}; PRISMA migrate reset --force --skip-seed && ${n}
|
|
24
|
-
&& litestream restore ${
|
|
25
|
-
`))}function
|
|
26
|
-
`))}function
|
|
27
|
-
`+f.cyan(f.bold(`Command:`),e)+f.gray(` at ${t}`))}function
|
|
23
|
+
`,String.raw`\n`).replaceAll(`\r`,String.raw`\r`),r=[`'${t}'`,`\`${t}\``,`"${n}"`];for(let n of r)if(s(`${e}=${n}`)[e]===t)return n;throw Error(`The value of ${e} cannot be losslessly serialized into .dev.vars; simplify its quoting.`)}const un=new Set(`CI.CF_ACCOUNT_ID.CF_API_BASE_URL.CF_API_EMAIL.CF_API_KEY.CF_API_TOKEN.CF_EMAIL.CLOUDFLARE_ACCESS_CLIENT_ID.CLOUDFLARE_ACCESS_CLIENT_SECRET.CLOUDFLARE_ACCOUNT_ID.CLOUDFLARE_API_BASE_URL.CLOUDFLARE_API_KEY.CLOUDFLARE_API_TOKEN.CLOUDFLARE_AUTH_USE_KEYRING.CLOUDFLARE_D1_DATABASE_ID.CLOUDFLARE_EMAIL.CLOUDFLARE_ENV.CLOUDFLARE_INCLUDE_PROCESS_ENV.CLOUDFLARE_LOAD_DEV_VARS_FROM_DOT_ENV.DOCKER_HOST.HTTP_PROXY.HTTPS_PROXY.http_proxy.https_proxy.FORCE_COLOR.MINIFLARE_CACHE_DIR.MISE_ENV.NO_COLOR.NEXT_PUBLIC_WB_ENV.NEXT_PUBLIC_WB_VERSION.NODE_ENV.PORT.WB_ENV.WB_VERSION`.split(`.`)),dn=[`WRANGLER_`,`CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_`,`CLOUDFLARE_CF_FETCH_`];function fn(e){return un.has(e)||dn.some(t=>e.startsWith(t))}const pn={command:`deploy`,describe:`Deploy a Cloudflare Workers app (vinext or plain Worker) to the WB_ENV environment: validate secrets, build, apply remote D1 migrations, then deploy code and secrets atomically.`,builder:e=>e,async handler(n){delete process.env.CLOUDFLARE_ENV;let r=B(n);r||(console.error(f.red(`No project found.`)),process.exit(1));let a=q(r);a||(console.error(f.red(`wb deploy currently supports only Cloudflare Workers apps (no wrangler config found).`)),process.exit(1));let s=r.env.WB_ENV;(!s||s===`development`||s===`test`)&&(console.error(f.red(`WB_ENV must name a deploy environment (e.g. staging or production), but is ${s}.`)),process.exit(1));let c=t.join(r.dirPath,`.env.cloudflare`);if(e.existsSync(c)){let e=o({path:c,processEnv:{},quiet:!0}).parsed??{};for(let[t,n]of Object.entries(e))t!==`CLOUDFLARE_ENV`&&(process.env[t]??=n)}let l;try{l=on(r,s)}catch(e){console.error(f.red(String(e instanceof Error?e.message:e))),process.exit(1)}l||(console.error(f.red(`Failed to parse ${a}.`)),process.exit(1));let u=l.accountId??r.env.CLOUDFLARE_ACCOUNT_ID,d=l.d1Databases.filter(e=>en(r,e));r.hasDrizzle&&d.length>0&&d.length<l.d1Databases.length&&(console.error(f.red(`wb deploy does not support mixing wrangler-native and non-native D1 migration layouts.`)),process.exit(1));let p=d.length===0&&r.hasDrizzle?l.d1Databases[0]:void 0;if(d.length===0&&r.hasDrizzle&&l.d1Databases.length>1&&(console.error(f.red(`wb deploy supports drizzle-kit migrations only for a single D1 binding; found multiple.`)),process.exit(1)),!n.dryRun){p&&!r.env.CLOUDFLARE_API_TOKEN&&(console.error(f.red(`CLOUDFLARE_API_TOKEN is required for remote drizzle-kit migrations.`)),process.exit(1));let e=!!r.env.CLOUDFLARE_API_TOKEN||!!r.env.CF_API_TOKEN||!!(r.env.CLOUDFLARE_API_KEY&&r.env.CLOUDFLARE_EMAIL)||!!(r.env.CF_API_KEY&&r.env.CF_EMAIL);Ne(r.env.CI)&&!e&&(console.error(f.red(`Wrangler authentication (e.g. CLOUDFLARE_API_TOKEN) is required to deploy on CI.`)),process.exit(1))}!Ne(r.env.CI)&&r.packageJson.scripts?.[`deploy/ci-setup`]&&await H(`YARN run deploy/ci-setup`,r,n);let[h,g]=D(n,r.dirPath,{ignoreProcessEnv:!0}),_=new Set(g.filter(([e])=>!e.startsWith(`mise env`)).flatMap(([,e])=>e));for(let e of Object.keys(h))_.has(e)||delete h[e];let v=cn(r);for(let e of v)h[e]??=r.env[e]??``;for(let e of l.requiredSecretNames){let t=r.env[e];h[e]===void 0&&t!==void 0&&(h[e]=t)}for(let e of Object.keys(h)){let t=r.env[e];t!==void 0&&(h[e]=t)}let{missingKeys:y,secrets:b}=mn(h,[...l.varKeys,...l.bindingNames],v);r.env.WB_VERSION&&l.bindingNames.includes(`WB_VERSION`)&&(console.error(f.red(`WB_VERSION collides with a Worker binding name; rename the binding.`)),process.exit(1));let x=Object.keys(h).filter(e=>l.bindingNames.includes(e));x.length>0&&console.warn(f.yellow(`Skipping env keys that collide with Worker binding names: ${x.join(`, `)}`)),y.length>0&&(console.error(f.red(`Missing required environment variables (from .env.example or wrangler secrets.required): ${y.join(`, `)}`)),process.exit(1));let S=l.requiredSecretNames.filter(e=>!Object.hasOwn(b,e)&&!l.varKeys.includes(e)&&!l.bindingNames.includes(e));S.length>0&&(console.error(f.red(`Secrets required by the wrangler config are not provided: ${S.join(`, `)}`)),process.exit(1));let C=Object.keys(b).toSorted();C.length>100&&(console.error(f.red(`Cloudflare accepts at most 100 secrets per deploy, but ${C.length} were selected.`)),process.exit(1));let w=new Map(Object.entries(l.vars));r.env.WB_VERSION&&w.set(`WB_VERSION`,r.env.WB_VERSION);let T=[...w],E=[...C.filter(e=>Buffer.byteLength(b[e]??``,`utf8`)>5*1024),...T.filter(([,e])=>Buffer.byteLength(typeof e==`string`?e:JSON.stringify(e),`utf8`)>5*1024).map(([e])=>e)];E.length>0&&(console.error(f.red(`Variable or secret values exceed Cloudflare's 5 KB limit: ${E.join(`, `)}`)),process.exit(1));let O=gn((n.dryRun?[]:await hn(r,n,a,l,s))??[],b,T.map(([e])=>e),l.bindingNames),k=new Set([...C,...T.map(([e])=>e)]).size+O.length,A=O.length>0?` (including ${O.length} remote secrets kept from the previous version: ${O.join(`, `)})`:``;k>128&&(console.error(f.red(`Cloudflare allows at most 128 variables and secrets combined, but ${k} were selected${A}.`)),process.exit(1)),k>64&&console.warn(f.yellow(`${k} variables and secrets${A} exceed the Free plan's limit of 64.`)),console.info(f.cyan(`Deploying ${l.workerName??r.name} (${s}) with ${C.length} secrets: ${C.join(`, `)}`));let j=!!(r.packageJson.dependencies?.vinext??r.packageJson.devDependencies?.vinext),M=j?t.join(`dist`,`server`,`wrangler.json`):a,N=l.usesEnvSection?`${At(`CLOUDFLARE_ENV`,s)} `:``;j?(r.env.WB_VERSION&&(r.env.NEXT_PUBLIC_WB_VERSION||=r.env.WB_VERSION),r.packageJson.scripts?.[`gen-code`]&&await H(`YARN run gen-code`,r,n),await H(`${N}YARN vinext build`,r,n),!n.dryRun&&!e.existsSync(t.resolve(r.dirPath,M))&&(console.error(f.red(`${M} not found; the vinext build did not produce a deploy config.`)),process.exit(1)),await H(`YARN wrangler deploy --dry-run --config ${K(M)}`,r,n)):await H(`YARN wrangler deploy --dry-run --config ${K(a)}${l.usesEnvSection?` --env ${K(s)}`:``}`,r,n);let P=l.usesEnvSection?` --env ${K(s)}`:``;for(let e of d){let t=e.database_name??e.binding;t&&await H(`CI=true YARN wrangler d1 migrations apply ${K(t)} --remote --config ${K(a)}${P}`,r,n)}p&&(p.database_id||(console.error(f.red(`The ${s} D1 binding has no database_id in the wrangler config.`)),process.exit(1)),u||(console.error(f.red(`CLOUDFLARE_ACCOUNT_ID (or account_id in the wrangler config) is required for remote drizzle-kit migrations.`)),process.exit(1)),await H(Ut(r,`migrate`,`CLOUDFLARE_D1_DATABASE_ID=${p.database_id} CLOUDFLARE_ACCOUNT_ID=${u}`),r,n));let ee=[`deploy`,`--config`,M,...!j&&l.usesEnvSection?[`--env`,s]:[],...r.env.WB_VERSION?[`--var`,`WB_VERSION:${r.env.WB_VERSION}`]:[],`--secrets-file`];if(console.info(f.cyan(`Running: wrangler ${ee.join(` `)} <temporary secrets file>`)),!n.dryRun){r.binExists||console.warn(f.yellow(`node_modules/.bin not found; relying on PATH to resolve wrangler.`));let n={...r.env};delete n.CLOUDFLARE_ENV;let a=e.mkdtempSync(t.join(m.tmpdir(),`wb-deploy-`)),o=[`SIGHUP`,`SIGINT`,`SIGTERM`,`SIGQUIT`],s=new Map,c,l;for(let t of o){let n=()=>{if(l??=t,c)c.kill(t===`SIGINT`||t===`SIGTERM`?t:`SIGTERM`);else{for(let[e,t]of s)process.off(e,t);e.rmSync(a,{force:!0,recursive:!0}),process.kill(process.pid,t)}};s.set(t,n),process.on(t,n)}let u;try{let o=t.join(a,`secrets.json`);e.writeFileSync(o,JSON.stringify(b),{mode:384}),u=await new Promise(e=>{c=i(`wrangler`,[...ee,o],{cwd:r.dirPath,env:n,stdio:[`ignore`,`inherit`,`inherit`]}),c.on(`error`,t=>{console.error(t),e(1)}),c.on(`exit`,(t,n)=>{e(n?1:t??void 0)})})}finally{for(let[e,t]of s)process.off(e,t);e.rmSync(a,{force:!0,recursive:!0})}if(l){process.kill(process.pid,l);return}u!==0&&(console.error(f.red(`wrangler deploy failed with exit code ${u??`unknown`}.`)),process.exit(u??1))}if(r.packageJson.scripts?.[`deploy/post`]){let e=l.d1Databases.length===1?l.d1Databases[0]:void 0;delete r.env.CLOUDFLARE_D1_DATABASE_ID,l.d1Databases.length>1&&console.warn(f.yellow(`Multiple D1 bindings exist; CLOUDFLARE_D1_DATABASE_ID is not set for deploy/post.`)),e?.database_id&&(r.env.CLOUDFLARE_D1_DATABASE_ID=e.database_id),u&&(r.env.CLOUDFLARE_ACCOUNT_ID=u),await H(`YARN run deploy/post`,r,n)}}};function mn(e,t,n){let r=new Set(t),i={};for(let[t,n]of Object.entries(e))n===void 0||r.has(t)||fn(t)||t===`DATABASE_URL`&&n.startsWith(`file:`)||(i[t]=n);return{missingKeys:n.filter(t=>!r.has(t)&&!fn(t)&&!e[t]),secrets:i}}async function hn(e,t,n,r,i){e.binExists||console.warn(f.yellow(`node_modules/.bin not found; relying on PATH to resolve wrangler.`));let a=[`secret`,`list`,`--format`,`json`,`--config`,n,...r.usesEnvSection?[`--env`,i]:[]];console.info(f.cyan(`Running: wrangler ${a.join(` `)}`));let o;try{o=await I(`wrangler`,a,{cwd:e.dirPath,env:e.env,stdio:`pipe`,killOnExit:!0,verbose:t.verbose})}catch(e){console.warn(f.yellow(`Failed to run wrangler to list remote secrets; checking only the local payload against Cloudflare's limits.\n${e instanceof Error?e.message:String(e)}`));return}if(o.status===0){let e=o.stdout.indexOf(`[`),t=o.stdout.lastIndexOf(`]`);if(e!==-1&&t!==-1&&e<t)try{return JSON.parse(o.stdout.slice(e,t+1)).map(({name:e})=>e).filter(e=>typeof e==`string`)}catch{}}else if(/\[code: 100(07|90)\]|If this is a new Worker/.test(o.stdout+o.stderr))return[];console.warn(f.yellow(`Failed to list the remote Worker secrets; checking only the local payload against Cloudflare's limits.\n${(o.stderr||o.stdout).trim()}`))}function gn(e,t,n,r){let i=new Set([...n,...r]);return e.filter(e=>!Object.hasOwn(t,e)&&!i.has(e))}const _n=new Set([`SIGINT`,`SIGTERM`,`SIGQUIT`]),vn={command:`dotenv [args..]`,describe:`Load .env files and run a command.`,builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await yn(bn(e))}};async function yn({command:e}){e.length===0&&(console.error(`Usage: wb dotenv -- <command> [args...]`),process.exit(1));let n=t.resolve(process.cwd());xn(n);let r=process.env.BERRY_BIN_FOLDER;P(process.env),!Me(n,process.env)&&r&&(process.env.PATH=process.env.PATH?`${r}:${process.env.PATH}`:r);let a=i(e[0],e.slice(1),{cwd:n,env:process.env,stdio:`inherit`}),o=new Map,s;a.on(`error`,e=>{console.error(e),process.exit(1)});for(let e of _n){let t=()=>{s=e,a.kill(e)};o.set(e,t),process.once(e,t)}a.on(`exit`,(e,t)=>{for(let[e,t]of o)process.off(e,t);if(t&&t===s&&process.exit(0),t){process.kill(process.pid,t);return}process.exit(e??1)})}function bn(e){return{command:[...(e.args??[]).map(String),...(e[`--`]??[]).map(String)]}}function xn(e){let n={...o({path:t.join(e,`.env`),processEnv:{},quiet:!0}).parsed,...process.env.WB_ENV?o({path:t.join(e,`.env.${process.env.WB_ENV}`),processEnv:{},quiet:!0}).parsed??{}:{}},r=c({parsed:n,processEnv:{}}).parsed??n;for(let[e,t]of Object.entries(r))e in process.env||(process.env[e]=t)}const Sn=`litestream.yml`,Cn=`/etc/litestream.yml`,wn=[{schemaPath:t.join(`prisma`,`schema.prisma`),dbPath:`prisma`},{schemaPath:t.join(`prisma`,`schema`),dbPath:t.join(`prisma`,`schema`)},{schemaPath:t.join(`db`,`schema.prisma`),dbPath:`db`}];var Tn=class{cleanUpLitestream(e){let t=En(e);return`${An(`${t}/prod.sqlite3`)}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=``){return`PRISMA migrate deploy ${t}`}generate(e,t=``){return[`PRISMA generate`,t].filter(Boolean).join(` `)}deployForce(e){let t=En(e),n=kn(`${t}/prod.sqlite3`);return`${n}; PRISMA migrate reset --force --skip-seed && ${n}
|
|
24
|
+
&& litestream restore ${On(e)} -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e,t){let n=En(e);return`litestream ltx ${On(e,t)} ${n}/prod.sqlite3`}migrate(e,t=``){return`PRISMA migrate deploy ${t} && ${this.generate(e)} && ${this.seed(e)}`}migrateDev(e,t=``){return`PRISMA migrate dev ${t}`}reset(e,t=``){let n=[],r=jn(e);r&&n.push(r);let i=[`PRISMA migrate reset --force`,t].filter(Boolean).join(` `);return n.push(i),e.packageJson.dependencies?.blitz&&n.push(this.seed(e)),n.filter(Boolean).join(` && `)}restore(e,t,n){let r=En(e);return`rm -Rf ${t}*; litestream restore ${On(e,n)} -o ${t} ${r}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?`YARN blitz db seed${t?` -f ${t}`:``}`:t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?`YARN prisma db seed`:`if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi`}studio(e,n,r=``){let i=``;if(n)try{new URL(n),i=`DATABASE_URL=${n} `}catch{i=`DATABASE_URL=${Be}${t.resolve(n)} `}else if(e.env.DATABASE_URL?.startsWith(`file:`)){let n=Dn(e);n&&(i=`DATABASE_URL=${Be}${t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5))} `)}return`${i}PRISMA studio ${r}`}};function En(e){return e.packageJson.dependencies?.blitz?`db/mount`:`prisma/mount`}function Dn(n){return wn.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}function On(n,r){if(r)return`-config "${r}"`;let i=t.join(n.dirPath,Sn);return e.existsSync(i)?`-config ./${Sn}`:e.existsSync(Cn)?`-config ${Cn}`:`-config ./${Sn}`}function kn(e){return`rm -Rf "${e}"*`}function An(e){return`if [ -f "${e}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${Be}${e}"; fi && rm -f "${e}".* "${e}"-*`}function jn(e){let n=He(e);if(!n)return;let r=Dn(e),i=t.isAbsolute(n)?n:t.resolve(e.dirPath,r??`.`,n);return`rm -f "${i}" "${i}-wal" "${i}-shm"`}const Mn=new Tn,Nn={command:`gen-code`,describe:`Generate code for the current project`,builder:{},async handler(e){let t=await V(e);t||(console.error(f.red(`No project found.`)),process.exit(1));let n=t.descendants.map(e=>({project:e,scripts:Pn(e)})).filter(({scripts:e})=>e.length>0);if(n.length===0){console.info(f.green(`No code generation needed.`));return}for(let{project:t,scripts:r}of n){console.info(`Running "gen-code" for ${t.name} ...`);for(let n of r)await H(n,t,e)}}};function Pn(e){let t=[],n=In(e);e.hasOwnDependency(`blitz`)&&e.hasSourceCode&&t.push(`YARN blitz codegen`),n&&t.push(n);let r=Ln(e);r&&t.push(r);let i=t.length===0?Rn(e):void 0;i&&t.push(i);let a=Fn(e);return a&&t.push(a),t}function Fn(n){if(n.packageJson.scripts?.[`gen-i18n-ts`])return n.hasSourceCode?`YARN run gen-i18n-ts`:void 0;if(n.hasOwnDependency(`gen-i18n-ts`)&&n.hasSourceCode&&e.existsSync(t.join(n.dirPath,`i18n`)))return`YARN gen-i18n-ts -i i18n -o src/__generated__/i18n.ts -d ja-JP`}function In(e){if(e.hasPrisma&&Vn(e))return Mn.generate(e)}function Ln(e){if(e.hasOwnDependency(`@chakra-ui/cli`)){if(zn(e,`@chakra-ui/cli`)===2)return`YARN chakra-cli tokens src/core/theme.ts`;if(Bn(e,`src/theme.ts`))return`YARN chakra typegen src/theme.ts --strict`}}function Rn(e){if(!e.hasDrizzle)return;let t=Gt(e);if(t)return`${Wt(e,`YARN drizzle-kit check --config ${t.fileName}`)} || true`}function zn(e,t){let n=e.packageJson,r=(n.dependencies?.[t]??n.devDependencies?.[t]??n.optionalDependencies?.[t]??n.peerDependencies?.[t])?.match(/\d+/u)?.[0];return r===void 0?void 0:Number(r)}function Bn(n,r){return e.existsSync(t.join(n.dirPath,r))}function Vn(e){return[`prisma/schema.prisma`,`prisma/schema`,`db/schema.prisma`].some(t=>Bn(e,t))}const Hn={command:`kill-port-if-non-ci`,describe:`Kill the port specified by PORT environment variable if non-CI.`,builder:{},async handler(e){await Un(e)}};async function Un(e){let t=B(e);if(t||(console.error(f.red(`No project found.`)),process.exit(1)),Ne(t.env.CI)){console.info(`Skip killing port due to CI: ${t.env.CI}`);return}let n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(f.red(`PORT environment variable is invalid: ${n}`)),process.exit(1)),console.info(`Killing the port: ${r}`);try{await v(r)}catch{}}function Wn(e,t){if(!Gn(e,t))return;let n=Kn(t);n&&(process.stdout.write(n),process.stdout.write(`
|
|
25
|
+
`))}function Gn(e,t){return e!==0||qn(t)}function Kn(e){return e.trim()}function qn(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,``))}const Jn={fix:{description:`Fix the linting errors`,type:`boolean`},format:{description:`Format the code`,type:`boolean`},quiet:{description:`Report errors only`,type:`boolean`},silent:{description:`Print only failed or warning command output`,type:`boolean`}},Yn=new Set([`astro`,`cjs`,`cts`,`js`,`jsx`,`mjs`,`mts`,`svelte`,`ts`,`tsx`,`vue`]),Xn=new Set([`py`]),Zn=new Set([`dart`]),Qn=new Set([`rs`]),$n=new Set([...Yn,`css`,`gql`,`graphql`,`hbs`,`htm`,`html`,`json`,`json5`,`jsonc`,`less`,`md`,`mdx`,`scss`,`toml`,`yaml`,`yml`]),er=new Set([`cjs`,`css`,`cts`,`htm`,`html`,`java`,`js`,`json`,`json5`,`jsonc`,`jsx`,`md`,`mjs`,`mts`,`scss`,`ts`,`tsx`,`vue`,`yaml`,`yml`]),tr=new Set([...er].filter(e=>!$n.has(e))),nr=`!**/test{-,/}fixtures/**`,rr={command:`lint [files...]`,describe:`Lint code`,builder:Jn,async handler(e){let t=await ir(e);t&&process.exit(t)}};async function ir(e){if(process.platform===`win32`)return console.error(f.red(`This command is not supported on Windows.`)),1;let n=await V(e,!1);if(!n)return console.error(f.red(`No project found.`)),1;let r=br(e),i=new Map,a=new Map,o=new Map,s=new Map,c=new Set,l=[],u=[],d=!1,p,m;if(r.length>0){let h=await Promise.all(r.map(async e=>{let n=t.resolve(e);return{fileKind:await xr(n),filePath:n}}));for(let{fileKind:r,filePath:p}of h){if(p.endsWith(`/test/fixtures`)||p.includes(`/test/fixtures/`)||p.endsWith(`/test-fixtures`)||p.includes(`/test-fixtures/`))continue;let m=t.extname(p).slice(1);if(p.endsWith(`/package.json`)){u.push(p);continue}u.push(...Tr(n.descendants,p,r));for(let{lintPath:t,project:u}of Er(n.descendants,p,r)){if(u.hasPoetryLock&&(r===`directory`||Xn.has(m))){let e=o.get(u)??[];if(e.push(t),o.set(u,e),r!==`directory`)continue}if(u.hasPubspecYaml&&(r===`directory`||Zn.has(m))){let e=s.get(u)??[];if(e.push(t),s.set(u,e),r!==`directory`)continue}if(!(u.hasCargoToml&&(r===`directory`||Qn.has(m))&&(c.add(u),r!==`directory`)))if(r===`directory`||Or(u,m)){let n=i.get(u)??[];if(n.push(t),i.set(u,n),e.format)if(r===`directory`&&u.hasOxfmt){let e=a.get(u)??[];e.push(t),a.set(u,e),l.push(wr(t),nr)}else for(let e of Cr(u,t,r,m))if(u.hasOxfmt){let t=a.get(u)??[];t.push(e),a.set(u,t)}else l.push(e)}else if(e.format&&(er.has(m)||$n.has(m)))if(u.hasOxfmt&&$n.has(m)){let e=a.get(u)??[];e.push(t),a.set(u,e)}else er.has(m)&&l.push(t);else Dr(m)&&!u.preferredLinter&&(console.error(f.red(`No linter found for ${u.name}. Install Oxlint.`)),d=!0)}}p=[...new Set(l)],m=[...new Set(u)]}else p=vr(n.self.dirPath,n.descendants),m=n.descendants.map(e=>e.packageJsonPath);let h=[],g=[],_={exitIfFailed:!1,preserveColor:!e.printAllOutput},v=!!e.format,y=!e.format||e.fix;if(r.length>0){if(y)for(let[t,n]of i){let r=dr(t,e,n);r&&g.push({command:r,project:t})}for(let[t,n]of o)y&&g.push({command:mr(e,n),project:t}),v&&h.push({command:pr(n),project:t});for(let[e,t]of s)y&&g.push({command:_r(t),project:e}),v&&h.push({command:gr(t),project:e});if(v){for(let e of c)h.push({command:hr(),project:e});for(let[e,t]of a)h.push({command:fr(t),project:e})}}else for(let t of n.descendants){if(y){if(!t.packageJson.workspaces||t.hasSourceCode){let n=dr(t,e);n&&g.push({command:n,project:t})}t.hasPoetryLock&&g.push({command:mr(e),project:t}),t.hasPubspecYaml&&g.push({command:_r(),project:t})}v&&(t.hasOxfmt&&h.push({command:fr(),project:t}),t.hasPoetryLock&&h.push({command:pr(),project:t}),t.hasPubspecYaml&&h.push({command:gr(),project:t}),t.hasCargoToml&&h.push({command:hr(),project:t}))}let b=[];if(v){let t=await ar(h,e,_);if(sr(t,e),b.push(...t.map(e=>e.exitCode)),b.some(e=>e!==0))return 1}if(d)return 1;if(v){if(p.length>0&&n.self.hasPrettier){let t=await or(G([`YARN`,`prettier`,`--cache`,`--no-error-on-unmatched-pattern`,`--write`,`--`,...p]),n.self,e,_);sr([t],e),b.push(t.exitCode)}if(m.length>0){let t=await or(G([`YARN`,`sort-package-json`,`--`,...m]),n.self,e,_);sr([t],e),b.push(t.exitCode)}if(b.some(e=>e!==0))return 1}if(y){let t=await ar(g,e,_);sr(t,e),b.push(...t.map(e=>e.exitCode))}return+!!b.some(e=>e!==0)}function ar(e,t,n){return Promise.all(e.map(({command:e,project:r})=>or(e,r,t,n)))}function or(e,t,n,r){if(n.silent){let i=lt(e,t);return ct(e,t,n,r).then(e=>({...e,command:i.printable,cwd:t.dirPath}))}return U(e,t,n,r).then(e=>({exitCode:e}))}function sr(e,t){let n=t.silent&&!t.printAllOutput?e.filter(e=>`output`in e&&Gn(e.exitCode,e.output)):e;if(n.length!==0)for(let e of n)`output`in e&&(t.printAllOutput?cr(e):(t.silent&&lr(e.command,e.cwd),Wn(e.exitCode,e.output)))}function cr(e){if(lr(e.command,e.cwd),e.exitCode===0&&ur(e.command)){console.info(f.green(`Succeeded.`));return}let t=e.output.trim();t&&(process.stdout.write(t),process.stdout.write(`
|
|
26
|
+
`))}function lr(e,t){console.info(`
|
|
27
|
+
`+f.cyan(f.bold(`Command:`),e)+f.gray(` at ${t}`))}function ur(e){return e.includes(` oxfmt `)||e.includes(` sort-package-json `)}function dr(e,t,n){if(e.preferredLinter===`oxlint`)return G([`YARN`,`oxlint`,`--no-error-on-unmatched-pattern`,...e.hasTypeAwareOxlint?[`--type-aware`,`--type-check`]:[],...t.quiet?[`--quiet`]:[],...t.fix?[`--fix`]:[],...n??[`.`]])}function fr(e){return G([`YARN`,`oxfmt`,`--write`,`--no-error-on-unmatched-pattern`,...e??[`.`],`!**/package.json`])}function pr(e){let t=e&&e.length>0?e:[`.`];return[G([`poetry`,`run`,`isort`,`--profile`,`black`,`--filter-files`,...t]),G([`poetry`,`run`,`black`,...t])].join(` && `)}function mr(e,t){let n=t&&t.length>0?t:[`.`];return G([`poetry`,`run`,`flake8`,...e.quiet?[`-q`]:[],...n])}function hr(){return G([`cargo`,`fmt`,`--all`])}function gr(e){return G([`dart`,`format`,...e&&e.length>0?e:[`.`]])}function _r(e){return G([`dart`,`analyze`,...e&&e.length>0?e:[`.`]])}function vr(e,n){let r=new Set([`**/{.*/,}*.{${[...tr].join(`,`)}}`,nr]);for(let i of n){if(!kr(i))continue;let n=t.join(i.dirPath,`**/{.*/,}*.{`+[...er].join(`,`)+`}`);r.add(t.relative(e,n)||n)}return[...r]}function yr(e,t){let n;for(let r of e)(t===r.dirPath||t.startsWith(`${r.dirPath}/`))&&(!n||r.dirPath.length>n.dirPath.length)&&(n=r);return n}function br(e){let t=new Set;for(let n of[...e.files??[],...e._.slice(1),...e[`--`]??[]])t.add(String(n));return[...t]}async function xr(e){try{if((await y.stat(e)).isDirectory())return`directory`}catch{}return`other`}function Sr(e,t){return e.hasOxfmt?$n.has(t):kr(e)?!0:tr.has(t)}function Cr(e,t,n,r){return n===`directory`&&e.hasOxfmt?[t]:n===`directory`&&kr(e)?[t,nr]:Sr(e,r)?[t]:[]}function wr(e){return t.join(e,`**/{.*/,}*.{${[...tr].join(`,`)}}`)}function Tr(e,n,r){return r===`directory`?e.filter(e=>e.packageJsonPath===t.join(n,`package.json`)||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath):[]}function Er(e,t,n){if(n===`directory`){let n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}let r=yr(e,t);return r?[{lintPath:t,project:r}]:[]}function Dr(e){return Yn.has(e)||Xn.has(e)||Zn.has(e)}function Or(e,t){return e.preferredLinter===`oxlint`?Yn.has(t):!1}function kr(e){return!e.hasOxfmt&&e.preferredLinter===`oxlint`}async function Ar(e,t){let n=Number(e);if(!n)throw Error(`The given port (${n}) is invalid.`);return await Pr(n,t),n}async function jr(e){for(let t of[`127.0.0.1`,`::`])if(!await Mr(t,e))return!1;return!0}async function Mr(e,t){return new Promise(n=>{let r=C();r.once(`error`,e=>{if(e.code===`EADDRINUSE`){n(!1);return}if(e.code===`EAFNOSUPPORT`){n(!0);return}n(!1)}),r.once(`listening`,()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const Nr=new Set;async function Pr(e,t){await jr(e)||await Fr(e,t);let n=async()=>{Nr.has(e)||(Nr.add(e),await Fr(e,t))};for(let e of[`beforeExit`,`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,n)}async function Fr(e,t){await zr(e,t),Ir(e)}function Ir(e){for(let t of Lr(e))try{process.kill(t,`SIGKILL`)}catch{}}function Lr(e){try{return r(`lsof`,[`-ti`,`tcp:${e}`,`-sTCP:LISTEN`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],timeout:2e3}).split(/\s+/).map(e=>Number(e.trim())).filter(e=>Number.isInteger(e)&&e>0&&e!==process.pid)}catch{return[]}}async function Rr(e){for(let t=0;t<10;t++){await S(100);try{process.kill(e,0)}catch(e){if(e.code===`ESRCH`)return}}try{process.kill(e,`SIGKILL`)}catch{}}async function zr(e,t){await Br([`--filter`,`publish=${e}`],t)}async function Br(e,t){try{let n=await Vr(e,t);if(n.length===0)return;await I(`docker`,[`rm`,`-f`,...n],{cwd:t.dirPath,env:t.env})}catch{}}async function Vr(e,t){let{stdout:n}=await I(`docker`,[`ps`,`-q`,...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}function Hr(e,t){let n=()=>{if(Nr.has(e))return;Nr.add(e),W(e,t);let{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:`inherit`});ut(e,n,{})};for(let e of[`beforeExit`,`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,n)}const Ur={"delay-ms":{default:5e3,describe:`Delay before starting the maintenance page server.`,type:`number`}},Wr=2147483647,Gr={command:`maintenance <action>`,describe:`Start or stop a lightweight maintenance page server. Example: wb maintenance start`,builder:e=>e.positional(`action`,{choices:[`start`,`stop`],describe:`Maintenance server action`,type:`string`}).options(Ur),async handler(e){let t=B(e);t||(console.error(f.red(`No project found.`)),process.exit(1));let n=e.action;if(t.env.WB_ENV===`test`){console.info(`Skip maintenance ${n} because WB_ENV is test.`);return}let r=Kr(t.env.PORT);if(n===`start`){await qr(t,r,e.delayMs);return}if(n===`stop`){await Zr(t,r);return}throw Error(`Unknown maintenance action: ${n}`)}};function Kr(e){let t=Number(e);return b.ok(Number.isInteger(t)&&t>0,`PORT environment variable is invalid: ${e}`),t}async function qr(e,t,n){b.ok(Number.isFinite(n)&&n>=0&&n<=Wr,`delay-ms must be between 0 and ${Wr}: ${n}`);let r=await ni(e,t),i=new AbortController,a=async()=>{await ii(r,process.pid)},o=()=>{i.abort()},s=()=>{process.off(`SIGINT`,o),process.off(`SIGTERM`,o),process.off(`SIGQUIT`,o)};process.once(`SIGINT`,o),process.once(`SIGTERM`,o),process.once(`SIGQUIT`,o);try{await S(n,void 0,{signal:i.signal}),s();let e=await Jr(t);if(!e)return;console.info(`Started maintenance server on port ${t}.`),await ei(e)}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;throw e}finally{s(),await a()}}async function Jr(e){for(let t=1;t<=5;t++){let n=Qr();try{return await $r(n,e,Xr),n}catch(r){await ti(n);let i=r;if(i.code===`EADDRINUSE`&&t<5){await S(100);continue}if(i.code===`EADDRINUSE`){console.info(`Skip maintenance server because port ${e} is already in use.`);return}Yr(e,i)}}throw Error(`Unreachable maintenance server startup state.`)}function Yr(e,t){t.code===`EADDRINUSE`?console.error(f.red(`Port ${e} is already in use.`)):console.error(f.red(`Maintenance server error: ${t.message}`)),process.exit(1)}function Xr(e){console.error(f.red(`Maintenance server error: ${e.message}`)),process.exit(1)}async function Zr(e,t){await ri(e,t),await Fr(t,e),console.info(`Stopped maintenance server on port ${t}.`)}function Qr(){return x.createServer((e,t)=>{t.writeHead(503,{"cache-control":`no-store`,"content-type":`text/html; charset=utf-8`}),t.end(`<!doctype html>
|
|
28
28
|
<html lang="ja">
|
|
29
29
|
<head>
|
|
30
30
|
<meta charset="utf-8">
|
|
@@ -66,7 +66,7 @@ const L=[...`0123456789abcdef`],ge=[6,1536,393216,100663296],R=[0,8,16,24],_e=[1
|
|
|
66
66
|
<p>皆様にはご不便をおかけしますが、メンテナンス終了までしばらくお待ちください。</p>
|
|
67
67
|
</main>
|
|
68
68
|
</body>
|
|
69
|
-
</html>`)})}async function Zr(e,t,n){await new Promise((r,i)=>{let a=t=>{e.off(`listening`,o),i(t)},o=()=>{e.off(`error`,a),e.on(`error`,n),r()};e.once(`error`,a),e.once(`listening`,o),e.listen(t,`0.0.0.0`)})}async function Qr(e){await new Promise(t=>{let n=()=>{process.off(`SIGINT`,n),process.off(`SIGTERM`,n),process.off(`SIGQUIT`,n),(async()=>{try{await $r(e)}catch(e){console.error(f.red(`Failed to close maintenance server: ${e.message}`))}finally{t()}})()};process.once(`SIGINT`,n),process.once(`SIGTERM`,n),process.once(`SIGQUIT`,n)})}async function $r(e){await new Promise((t,n)=>{e.close(e=>{if(e){if(e.code===`ERR_SERVER_NOT_RUNNING`){t();return}n(e);return}t()}),e.closeAllConnections()})}async function ei(e,n){let r=ii(e,n);return await y.mkdir(t.dirname(r),{recursive:!0}),await y.writeFile(r,`${process.pid}\n`,`utf8`),r}async function ti(e,t){let n=ii(e,t),r=await ri(n);if(r!==void 0&&r!==process.pid){try{F(r,`SIGTERM`)}catch{}await Ir(r)}await ni(n,r)}async function ni(e,t){t!==void 0&&await ri(e)!==t||await y.rm(e,{force:!0})}async function ri(e){try{let t=await y.readFile(e,`utf8`),n=Number(t.trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function ii(e,t){return ai(e.rootDirPath,t)}function ai(e,n){return t.join(e,`.wb`,`maintenance-${n}.pid`)}function*oi(e,t){for(let n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const si=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],ci=/\.(?:sqlite3?|db)(?:[-.](?:journal|shm|wal))?$/i,li=[`.cache`,`.mypy_cache`,`.next/cache`,`.parcel-cache`,`.pytest_cache`,`.ruff_cache`,`.tox`,`.turbo`,`.venv`,`.yarn/cache`,`.yarn/install-state.gz`,`__pycache__`,`coverage`,`node_modules/.cache`,`playwright-report`,`storybook-static`,`target`,`test-results`],ui=[`**/*.pyc`,`**/*.tsbuildinfo`,`**/__pycache__`],di=[`prisma`,`db`,`drizzle`],fi=[`/data`],pi={command:`optimizeForDockerBuild`,describe:`Optimize configuration when building a Docker image`,builder:{outside:{description:`Whether the optimization is executed outside a docker container or not`,type:`boolean`,alias:`o`}},async handler(r){let i=await V(r);i||(console.error(f.red(`No project found.`)),process.exit(1));let a=[];for(let n of oi(`optimizeForDockerBuild`,i.descendants)){let i=n.packageJson;mi(n,i);let o=bi(r,i);if(Si(i,{removeWbPostinstall:!r.outside&&o.includes(`@willbooster/wb`)}),Ci(i),r.dryRun)continue;let s=r.outside?t.join(n.dirPath,`dist`):n.dirPath;await e.promises.mkdir(s,{recursive:!0}),await e.promises.writeFile(t.join(s,`package.json`),JSON.stringify(i),`utf8`),r.outside&&await vi(t.join(s,`bash`)),a.push(n)}!r.dryRun&&!r.outside&&(n.spawnSync(Ye,[`install`],{stdio:`inherit`}),console.info(`Installed dependencies.`),await wi(a))}};function mi(e,t){return hi(e.rootDirPath,e.dirPath,t)}function hi(e,t,n){let r=[];for(let i of si){let a=n[i]??{};for(let[n,o]of Object.entries(a))o?.startsWith(`git@github.com:`)&&(a[n]=gi(e,t,n),r.push(`${i}.${n}`))}return console.info(`Rewrote private GitHub dependencies:`,r.join(`, `)||`none`),r}function gi(e,n,r){let i=t.join(e,`@willbooster`,_i(r)),a=t.relative(n,i);return a.startsWith(`.`)?a:`./${a}`}function _i(e){return e.replace(/^@willbooster\//,``)}async function vi(n){let r=yi();await e.promises.mkdir(n,{recursive:!0});for(let i of await e.promises.readdir(r,{withFileTypes:!0})){if(!i.isFile()||!i.name.endsWith(`.sh`))continue;let a=t.join(n,i.name);await e.promises.copyFile(t.join(r,i.name),a),await e.promises.chmod(a,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function yi(){let n=t.dirname(w(import.meta.url));for(;;){let r=t.join(n,`docker`,`bash`);if(e.existsSync(r))return r;let i=t.dirname(n);if(i===n)throw Error(`Docker shell scripts directory not found.`);n=i}}function bi(e,t){if(e.outside)return xi(t);let n=Object.keys(t.devDependencies??{});return delete t.devDependencies,console.info(`Removed all devDependencies.`),n}function xi(e){let t=e.devDependencies??{},n=[`artillery`,`biome`,`concurrently`,`conventional-changelog-conventionalcommits`,`eslint`,`husky`,`imagemin`,`jest`,`kill-port`,`lint-staged`,`open-cli`,`oxfmt`,`oxlint`,`playwright`,`prettier`,`pinst`,`railway`,`semantic-release`,`sort-package-json`,`wait-on`,`vitest`],r=[];for(let e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes(`willbooster`)&&e.includes(`config`))&&(delete t[e],r.push(e));return console.info(`Removed devDependencies:`,r.join(`, `)||`none`),r}function Si(e,t){let n=[`check`,`deploy`,`format`,`lint`,`start`,`test`],r=[`pinst `,`husky `],i=e.scripts??{},a=[];for(let[e,o]of Object.entries(i))(t.removeWbPostinstall&&e===`postinstall`&&o.trim()===`wb gen-code`||n.some(t=>e.startsWith(t))||r.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete i[e],a.push(e));console.info(`Removed scripts:`,a.join(`, `)||`none`)}function Ci(e){delete e.private,delete e.publishConfig,delete e.prettier}async function wi(e){for(let t of e)await Ti(t),await Oi(t),Wi(t)}async function Ti(e){let t=[...await Ei(e),...await Di(e)];console.info(`Removed Docker build caches:`,t.join(`, `)||`none`)}async function Ei(n){let r=[];for(let i of li){let a=t.join(n.dirPath,i);e.existsSync(a)&&(await e.promises.rm(a,{force:!0,recursive:!0}),r.push(i))}return r}async function Di(n){let r=await p(ui,{cwd:n.dirPath,dot:!0,followSymbolicLinks:!1,ignore:[`**/node_modules`,`**/node_modules/**`,`**/.yarn`,`**/.yarn/**`,`**/.git`,`**/.git/**`],onlyFiles:!1});return await Promise.all(r.map(r=>e.promises.rm(t.join(n.dirPath,r),{force:!0,recursive:!0}))),r}async function Oi(e){let t=(await Promise.all([ki(e),ji(e)])).flat();console.info(`Removed generated local data:`,t.join(`, `)||`none`)}async function ki(n){let r=Ai(n),i=[];for(let a of r){let r=t.join(n.dirPath,a);e.existsSync(r)&&(await e.promises.rm(r,{force:!0,recursive:!0}),i.push(a))}return i}function Ai(e){let n=di.map(e=>t.join(e,`mount`)),r=Ue(e);if(!r)return n;let i=t.dirname(r);if(t.basename(i)!==`mount`||!zi(e,i))return n;let a=t.relative(e.dirPath,i);return a?[...new Set([...n,a])]:n}async function ji(e){return(await Promise.all([Mi(e),Pi(e)])).flat()}async function Mi(e){let t=await Ni(e);return(await Promise.all(t.map(t=>Ui(e,t)))).flat()}async function Ni(e){let n=di.map(n=>t.join(e.dirPath,n)),r=await Promise.all(n.map(e=>Hi(e)));return n.filter((e,t)=>r[t])}async function Pi(n){let r=Fi(n),i=[];for(let a of r)for(let r of Ri(a))await Vi(r)&&(await e.promises.rm(r,{force:!0}),i.push(t.relative(n.dirPath,r)));return i}function Fi(e){let n=He(e),r=Ue(e);if(!n||!r)return[];let i=t.isAbsolute(n)?[n]:[r,...di.map(r=>t.resolve(e.dirPath,r,n))];return[...new Set(i)].filter(t=>Ii(e,t))}function Ii(e,t){return zi(e,t)||Li(e,t)}function Li(e,n){return Bi(e)?fi.some(e=>{let r=t.relative(e,n);return r!==``&&r!==`..`&&!r.startsWith(`../`)}):!1}function Ri(e){return[e,`${e}-journal`,`${e}-shm`,`${e}-wal`,`${e}.journal`,`${e}.shm`,`${e}.wal`]}function zi(e,n){let r=t.relative(e.dirPath,n);return r===``||r!==`..`&&!r.startsWith(`..${t.sep}`)}function Bi(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}async function Vi(t){try{return(await e.promises.stat(t)).isFile()}catch{return!1}}async function Hi(t){try{return(await e.promises.stat(t)).isDirectory()}catch{return!1}}async function Ui(n,r){let i=(await e.promises.readdir(r,{withFileTypes:!0})).filter(e=>e.isFile()&&ci.test(e.name)).map(e=>e.name);await Promise.all(i.map(n=>e.promises.rm(t.join(r,n),{force:!0})));let a=t.relative(n.dirPath,r);return i.map(e=>t.join(a,e))}function Wi(r){if(!Bi(r))return;let i=t.join(r.dirPath,`bash`,`cleanup.sh`);if(e.existsSync(i)&&n.spawnSync(`bash`,[i,`--keep-scripts`],{cwd:r.dirPath,stdio:`inherit`}).status!==0)throw Error(`Failed to run ${t.relative(r.dirPath,i)}`)}const J={},Gi={command:`prisma`,aliases:[`db`],describe:`Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init`,builder:e=>e.parserConfiguration({"populate--":!0}).command(Ki).command(qi).command(Ji).command(Yi).command(Xi).command(Qi).command($i).command(ra).command(ia).command(aa).command(oa).command(sa).command(ca).demandCommand().strict(!1),handler(){}},Ki={command:`cleanup-litestream`,describe:`Clean up temporal Litestream files`,builder:J,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db cleanup-litestream`,t))await H(Z(n).cleanUpLitestream(r),r,e)}},qi={command:`create-litestream-config`,describe:`Create Litestream configuration file`,builder:{...J,output:{description:`Output path of the Litestream configuration file.`,type:`string`,default:`/etc/litestream.yml`}},async handler(e){let t=await X(e);if(t.length>1)throw Error(`Creating Litestream configuration for multiple projects at once is not supported because they would overwrite each other.`);for(let{orm:n,project:r}of Q(`db create-litestream-config`,t))la(r,n,e.output)}},Ji={command:`deploy`,describe:`Apply migration to DB without initializing it`,builder:J,async handler(e){let t=await X(e),n=fa(e);for(let{orm:r,project:i}of Q(`db deploy`,t))await H(Y(r,i,Z(r).deploy(i,n)),i,e)}},Yi={command:`deploy-force`,describe:`Force to apply migration to DB utilizing Litestream's backup without initializing it`,builder:J,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db deploy-force`,t))await H(Z(n).deployForce(r),r,e)}},Xi={command:`generate`,describe:`Generate ORM client code`,builder:J,async handler(e){let t=await X(e),n=fa(e);for(let{orm:r,project:i}of Q(`db generate`,t))await H(Z(r).generate(i,n),i,e)}},Zi={...J,config:{description:`Path of the Litestream configuration file.`,type:`string`}},Qi={command:`list-backups`,describe:`List Litestream backups`,builder:Zi,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db list-backups`,t))await H(Z(n).listBackups(r,e.config),r,e)}},$i={command:`migrate`,describe:`Apply migration to DB with initializing it`,builder:{...J,"check-idempotency":{description:`Run the migration command twice to confirm it is idempotent.`,type:`boolean`}},async handler(e){let t=await X(e),n=fa(e,[`check-idempotency`]);for(let{orm:r,project:i}of Q(`db migrate`,t)){let t=Z(r);await H(Y(r,i,t.migrate(i,n)),i,e),ea(i,e.checkIdempotency)&&(na(i)?console.info(f.yellow(`Skipping idempotency check for ${i.name} in production environment.`)):await H(Y(r,i,t.deploy(i,n)),i,e))}}};function ea(e,t){return t??ta(e)}function ta(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}function na(e){return We(e,`production`)}const ra={command:`migrate-dev`,describe:`Create a migration file`,builder:J,async handler(e){let t=await X(e),n=fa(e);for(let{orm:r,project:i}of Q(`db migrate-dev`,t))await H(Z(r).migrateDev(i,n),i,e)}},ia={command:`reset`,describe:`Reset DB`,builder:J,async handler(e){let t=await X(e),n=fa(e);for(let{orm:r,project:i}of Q(`db reset`,t))await H(Y(r,i,Z(r).reset(i,n)),i,e);if(process.env.WB_ENV!==`test`){process.env.WB_ENV=`test`;for(let{orm:t,project:r}of Q(`WB_ENV=test db reset`,await X(e)))await H(Y(t,r,Z(t).reset(r,n)),r,e)}}},aa={command:`restore`,describe:`Restore DB from Litestream's backup`,builder:{...Zi,output:{description:`Output path of the restored database. Defaults to "<db|drizzle|prisma>/restored.sqlite3".`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db restore`,t)){let t=e.output??ua(r,n);await H(Z(n).restore(r,t,e.config),r,e)}}},oa={command:`seed`,describe:`Populate DB with seed data`,builder:{...J,file:{alias:`f`,description:`Path of the seed script.`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db seed`,t))await H(Y(n,r,Z(n).seed(r,e.file)),r,e)}},sa={command:`studio [db-url-or-path]`,describe:`Open database studio`,builder:{...J,"db-url-or-path":{description:`URL or path to the database`,type:`string`},restored:{description:`Whether to open the default restored database (<db|prisma>/restored.sqlite3).`,type:`boolean`}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw Error(`You cannot specify both --restored and --db-url-or-path.`);let t=await X(e),n=fa(e,[`db-url-or-path`,`restored`]);for(let{orm:r,project:i}of Q(`db studio`,t)){let t=e.restored?i.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:e.dbUrlOrPath?.toString();await H(Y(r,i,Z(r).studio(i,t,n)),i,e)}}},ca={command:`$0 <args..>`,describe:`Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.`,builder:{args:{type:`array`}},async handler(e){let t=await X(e),n=[(e.args?.join(` `)??``).trimEnd(),fa(e,[`args`])].filter(Boolean).join(` `);for(let{orm:r,project:i}of Q(`db ${n}`,t))await H(Y(r,i,r===`prisma`?`PRISMA ${n}`:Ut(i,n)),i,e)}};function Y(e,t,n){return e===`drizzle`?Ft(t,n):n}function la(t,n,r){let i=da(t,n),a={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(a).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw Error(`Missing environment variables for Litestream: ${o.join(`, `)}`);let s=`snapshot:
|
|
69
|
+
</html>`)})}async function $r(e,t,n){await new Promise((r,i)=>{let a=t=>{e.off(`listening`,o),i(t)},o=()=>{e.off(`error`,a),e.on(`error`,n),r()};e.once(`error`,a),e.once(`listening`,o),e.listen(t,`0.0.0.0`)})}async function ei(e){await new Promise(t=>{let n=()=>{process.off(`SIGINT`,n),process.off(`SIGTERM`,n),process.off(`SIGQUIT`,n),(async()=>{try{await ti(e)}catch(e){console.error(f.red(`Failed to close maintenance server: ${e.message}`))}finally{t()}})()};process.once(`SIGINT`,n),process.once(`SIGTERM`,n),process.once(`SIGQUIT`,n)})}async function ti(e){await new Promise((t,n)=>{e.close(e=>{if(e){if(e.code===`ERR_SERVER_NOT_RUNNING`){t();return}n(e);return}t()}),e.closeAllConnections()})}async function ni(e,n){let r=oi(e,n);return await y.mkdir(t.dirname(r),{recursive:!0}),await y.writeFile(r,`${process.pid}\n`,`utf8`),r}async function ri(e,t){let n=oi(e,t),r=await ai(n);if(r!==void 0&&r!==process.pid){try{F(r,`SIGTERM`)}catch{}await Rr(r)}await ii(n,r)}async function ii(e,t){t!==void 0&&await ai(e)!==t||await y.rm(e,{force:!0})}async function ai(e){try{let t=await y.readFile(e,`utf8`),n=Number(t.trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function oi(e,t){return si(e.rootDirPath,t)}function si(e,n){return t.join(e,`.wb`,`maintenance-${n}.pid`)}function*ci(e,t){for(let n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const li=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],ui=/\.(?:sqlite3?|db)(?:[-.](?:journal|shm|wal))?$/i,di=[`.cache`,`.mypy_cache`,`.next/cache`,`.parcel-cache`,`.pytest_cache`,`.ruff_cache`,`.tox`,`.turbo`,`.venv`,`.yarn/cache`,`.yarn/install-state.gz`,`__pycache__`,`coverage`,`node_modules/.cache`,`playwright-report`,`storybook-static`,`target`,`test-results`],fi=[`**/*.pyc`,`**/*.tsbuildinfo`,`**/__pycache__`],pi=[`prisma`,`db`,`drizzle`],mi=[`/data`],hi={command:`optimizeForDockerBuild`,describe:`Optimize configuration when building a Docker image`,builder:{outside:{description:`Whether the optimization is executed outside a docker container or not`,type:`boolean`,alias:`o`}},async handler(r){let i=await V(r);i||(console.error(f.red(`No project found.`)),process.exit(1));let a=[];for(let n of ci(`optimizeForDockerBuild`,i.descendants)){let i=n.packageJson;gi(n,i);let o=Si(r,i);if(wi(i,{removeWbPostinstall:!r.outside&&o.includes(`@willbooster/wb`)}),Ti(i),r.dryRun)continue;let s=r.outside?t.join(n.dirPath,`dist`):n.dirPath;await e.promises.mkdir(s,{recursive:!0}),await e.promises.writeFile(t.join(s,`package.json`),JSON.stringify(i),`utf8`),r.outside&&await bi(t.join(s,`bash`)),a.push(n)}!r.dryRun&&!r.outside&&(n.spawnSync(Ye,[`install`],{stdio:`inherit`}),console.info(`Installed dependencies.`),await Ei(a))}};function gi(e,t){return _i(e.rootDirPath,e.dirPath,t)}function _i(e,t,n){let r=[];for(let i of li){let a=n[i]??{};for(let[n,o]of Object.entries(a))o?.startsWith(`git@github.com:`)&&(a[n]=vi(e,t,n),r.push(`${i}.${n}`))}return console.info(`Rewrote private GitHub dependencies:`,r.join(`, `)||`none`),r}function vi(e,n,r){let i=t.join(e,`@willbooster`,yi(r)),a=t.relative(n,i);return a.startsWith(`.`)?a:`./${a}`}function yi(e){return e.replace(/^@willbooster\//,``)}async function bi(n){let r=xi();await e.promises.mkdir(n,{recursive:!0});for(let i of await e.promises.readdir(r,{withFileTypes:!0})){if(!i.isFile()||!i.name.endsWith(`.sh`))continue;let a=t.join(n,i.name);await e.promises.copyFile(t.join(r,i.name),a),await e.promises.chmod(a,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function xi(){let n=t.dirname(w(import.meta.url));for(;;){let r=t.join(n,`docker`,`bash`);if(e.existsSync(r))return r;let i=t.dirname(n);if(i===n)throw Error(`Docker shell scripts directory not found.`);n=i}}function Si(e,t){if(e.outside)return Ci(t);let n=Object.keys(t.devDependencies??{});return delete t.devDependencies,console.info(`Removed all devDependencies.`),n}function Ci(e){let t=e.devDependencies??{},n=[`artillery`,`biome`,`concurrently`,`conventional-changelog-conventionalcommits`,`eslint`,`husky`,`imagemin`,`jest`,`kill-port`,`lint-staged`,`open-cli`,`oxfmt`,`oxlint`,`playwright`,`prettier`,`pinst`,`railway`,`semantic-release`,`sort-package-json`,`wait-on`,`vitest`],r=[];for(let e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes(`willbooster`)&&e.includes(`config`))&&(delete t[e],r.push(e));return console.info(`Removed devDependencies:`,r.join(`, `)||`none`),r}function wi(e,t){let n=[`check`,`deploy`,`format`,`lint`,`start`,`test`],r=[`pinst `,`husky `],i=e.scripts??{},a=[];for(let[e,o]of Object.entries(i))(t.removeWbPostinstall&&e===`postinstall`&&o.trim()===`wb gen-code`||n.some(t=>e.startsWith(t))||r.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete i[e],a.push(e));console.info(`Removed scripts:`,a.join(`, `)||`none`)}function Ti(e){delete e.private,delete e.publishConfig,delete e.prettier}async function Ei(e){for(let t of e)await Di(t),await Ai(t),Ki(t)}async function Di(e){let t=[...await Oi(e),...await ki(e)];console.info(`Removed Docker build caches:`,t.join(`, `)||`none`)}async function Oi(n){let r=[];for(let i of di){let a=t.join(n.dirPath,i);e.existsSync(a)&&(await e.promises.rm(a,{force:!0,recursive:!0}),r.push(i))}return r}async function ki(n){let r=await p(fi,{cwd:n.dirPath,dot:!0,followSymbolicLinks:!1,ignore:[`**/node_modules`,`**/node_modules/**`,`**/.yarn`,`**/.yarn/**`,`**/.git`,`**/.git/**`],onlyFiles:!1});return await Promise.all(r.map(r=>e.promises.rm(t.join(n.dirPath,r),{force:!0,recursive:!0}))),r}async function Ai(e){let t=(await Promise.all([ji(e),Ni(e)])).flat();console.info(`Removed generated local data:`,t.join(`, `)||`none`)}async function ji(n){let r=Mi(n),i=[];for(let a of r){let r=t.join(n.dirPath,a);e.existsSync(r)&&(await e.promises.rm(r,{force:!0,recursive:!0}),i.push(a))}return i}function Mi(e){let n=pi.map(e=>t.join(e,`mount`)),r=Ue(e);if(!r)return n;let i=t.dirname(r);if(t.basename(i)!==`mount`||!Vi(e,i))return n;let a=t.relative(e.dirPath,i);return a?[...new Set([...n,a])]:n}async function Ni(e){return(await Promise.all([Pi(e),Ii(e)])).flat()}async function Pi(e){let t=await Fi(e);return(await Promise.all(t.map(t=>Gi(e,t)))).flat()}async function Fi(e){let n=pi.map(n=>t.join(e.dirPath,n)),r=await Promise.all(n.map(e=>Wi(e)));return n.filter((e,t)=>r[t])}async function Ii(n){let r=Li(n),i=[];for(let a of r)for(let r of Bi(a))await Ui(r)&&(await e.promises.rm(r,{force:!0}),i.push(t.relative(n.dirPath,r)));return i}function Li(e){let n=He(e),r=Ue(e);if(!n||!r)return[];let i=t.isAbsolute(n)?[n]:[r,...pi.map(r=>t.resolve(e.dirPath,r,n))];return[...new Set(i)].filter(t=>Ri(e,t))}function Ri(e,t){return Vi(e,t)||zi(e,t)}function zi(e,n){return Hi(e)?mi.some(e=>{let r=t.relative(e,n);return r!==``&&r!==`..`&&!r.startsWith(`../`)}):!1}function Bi(e){return[e,`${e}-journal`,`${e}-shm`,`${e}-wal`,`${e}.journal`,`${e}.shm`,`${e}.wal`]}function Vi(e,n){let r=t.relative(e.dirPath,n);return r===``||r!==`..`&&!r.startsWith(`..${t.sep}`)}function Hi(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}async function Ui(t){try{return(await e.promises.stat(t)).isFile()}catch{return!1}}async function Wi(t){try{return(await e.promises.stat(t)).isDirectory()}catch{return!1}}async function Gi(n,r){let i=(await e.promises.readdir(r,{withFileTypes:!0})).filter(e=>e.isFile()&&ui.test(e.name)).map(e=>e.name);await Promise.all(i.map(n=>e.promises.rm(t.join(r,n),{force:!0})));let a=t.relative(n.dirPath,r);return i.map(e=>t.join(a,e))}function Ki(r){if(!Hi(r))return;let i=t.join(r.dirPath,`bash`,`cleanup.sh`);if(e.existsSync(i)&&n.spawnSync(`bash`,[i,`--keep-scripts`],{cwd:r.dirPath,stdio:`inherit`}).status!==0)throw Error(`Failed to run ${t.relative(r.dirPath,i)}`)}const J={},qi={command:`prisma`,aliases:[`db`],describe:`Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init`,builder:e=>e.parserConfiguration({"populate--":!0}).command(Ji).command(Yi).command(Xi).command(Zi).command(Qi).command(ea).command(ta).command(aa).command(oa).command(sa).command(ca).command(la).command(ua).demandCommand().strict(!1),handler(){}},Ji={command:`cleanup-litestream`,describe:`Clean up temporal Litestream files`,builder:J,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db cleanup-litestream`,t))await H(Z(n).cleanUpLitestream(r),r,e)}},Yi={command:`create-litestream-config`,describe:`Create Litestream configuration file`,builder:{...J,output:{description:`Output path of the Litestream configuration file.`,type:`string`,default:`/etc/litestream.yml`}},async handler(e){let t=await X(e);if(t.length>1)throw Error(`Creating Litestream configuration for multiple projects at once is not supported because they would overwrite each other.`);for(let{orm:n,project:r}of Q(`db create-litestream-config`,t))da(r,n,e.output)}},Xi={command:`deploy`,describe:`Apply migration to DB without initializing it`,builder:J,async handler(e){let t=await X(e),n=ma(e);for(let{orm:r,project:i}of Q(`db deploy`,t))await H(Y(r,i,Z(r).deploy(i,n)),i,e)}},Zi={command:`deploy-force`,describe:`Force to apply migration to DB utilizing Litestream's backup without initializing it`,builder:J,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db deploy-force`,t))await H(Z(n).deployForce(r),r,e)}},Qi={command:`generate`,describe:`Generate ORM client code`,builder:J,async handler(e){let t=await X(e),n=ma(e);for(let{orm:r,project:i}of Q(`db generate`,t))await H(Z(r).generate(i,n),i,e)}},$i={...J,config:{description:`Path of the Litestream configuration file.`,type:`string`}},ea={command:`list-backups`,describe:`List Litestream backups`,builder:$i,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db list-backups`,t))await H(Z(n).listBackups(r,e.config),r,e)}},ta={command:`migrate`,describe:`Apply migration to DB with initializing it`,builder:{...J,"check-idempotency":{description:`Run the migration command twice to confirm it is idempotent.`,type:`boolean`}},async handler(e){let t=await X(e),n=ma(e,[`check-idempotency`]);for(let{orm:r,project:i}of Q(`db migrate`,t)){let t=Z(r);await H(Y(r,i,t.migrate(i,n)),i,e),na(i,e.checkIdempotency)&&(ia(i)?console.info(f.yellow(`Skipping idempotency check for ${i.name} in production environment.`)):await H(Y(r,i,t.deploy(i,n)),i,e))}}};function na(e,t){return t??ra(e)}function ra(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}function ia(e){return We(e,`production`)}const aa={command:`migrate-dev`,describe:`Create a migration file`,builder:J,async handler(e){let t=await X(e),n=ma(e);for(let{orm:r,project:i}of Q(`db migrate-dev`,t))await H(Z(r).migrateDev(i,n),i,e)}},oa={command:`reset`,describe:`Reset DB`,builder:J,async handler(e){let t=await X(e),n=ma(e);for(let{orm:r,project:i}of Q(`db reset`,t))await H(Y(r,i,Z(r).reset(i,n)),i,e);if(process.env.WB_ENV!==`test`){process.env.WB_ENV=`test`;for(let{orm:t,project:r}of Q(`WB_ENV=test db reset`,await X(e)))await H(Y(t,r,Z(t).reset(r,n)),r,e)}}},sa={command:`restore`,describe:`Restore DB from Litestream's backup`,builder:{...$i,output:{description:`Output path of the restored database. Defaults to "<db|drizzle|prisma>/restored.sqlite3".`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db restore`,t)){let t=e.output??fa(r,n);await H(Z(n).restore(r,t,e.config),r,e)}}},ca={command:`seed`,describe:`Populate DB with seed data`,builder:{...J,file:{alias:`f`,description:`Path of the seed script.`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db seed`,t))await H(Y(n,r,Z(n).seed(r,e.file)),r,e)}},la={command:`studio [db-url-or-path]`,describe:`Open database studio`,builder:{...J,"db-url-or-path":{description:`URL or path to the database`,type:`string`},restored:{description:`Whether to open the default restored database (<db|prisma>/restored.sqlite3).`,type:`boolean`}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw Error(`You cannot specify both --restored and --db-url-or-path.`);let t=await X(e),n=ma(e,[`db-url-or-path`,`restored`]);for(let{orm:r,project:i}of Q(`db studio`,t)){let t=e.restored?i.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:e.dbUrlOrPath?.toString();await H(Y(r,i,Z(r).studio(i,t,n)),i,e)}}},ua={command:`$0 <args..>`,describe:`Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.`,builder:{args:{type:`array`}},async handler(e){let t=await X(e),n=[(e.args?.join(` `)??``).trimEnd(),ma(e,[`args`])].filter(Boolean).join(` `);for(let{orm:r,project:i}of Q(`db ${n}`,t))await H(Y(r,i,r===`prisma`?`PRISMA ${n}`:Ut(i,n)),i,e)}};function Y(e,t,n){return e===`drizzle`?Ft(t,n):n}function da(t,n,r){let i=pa(t,n),a={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(a).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw Error(`Missing environment variables for Litestream: ${o.join(`, `)}`);let s=`snapshot:
|
|
70
70
|
interval: 24h # Create a backup per day
|
|
71
71
|
retention: 72h # Keep backups for 3 days
|
|
72
72
|
dbs:
|
|
@@ -80,26 +80,26 @@ dbs:
|
|
|
80
80
|
access-key-id: ${a.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}
|
|
81
81
|
secret-access-key: ${a.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}
|
|
82
82
|
sync-interval: 1m
|
|
83
|
-
`;try{e.writeFileSync(r,s),console.info(`Generated ${r}`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to write ${r}: ${t}`,{cause:e})}}function
|
|
83
|
+
`;try{e.writeFileSync(r,s),console.info(`Generated ${r}`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to write ${r}: ${t}`,{cause:e})}}function fa(e,t){return t===`prisma`?e.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:`drizzle/restored.sqlite3`}function pa(e,t){if(t===`prisma`)return`${e.packageJson.dependencies?.blitz?`db`:`prisma`}/mount/prod.sqlite3`;let n=Ue(e);if(!n)throw Error(`wb db create-litestream-config for Drizzle requires file: DATABASE_URL.`);return n}async function X(e,t){let n=await V(e);n||(console.error(f.red(`No project found.`)),process.exit(1));let r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!!e&&(!t||e.orm===t));return r.length===0&&(console.error(f.red(t?`No ${t} project found.`:`No supported database ORM project found.`)),process.exit(1)),r}function Z(e){return e===`prisma`?Mn:$t}function*Q(e,t){let n=new Map(t.map(e=>[e.project,e]));for(let r of ci(e,t.map(({project:e})=>e))){let e=n.get(r);if(!e)throw Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function ma(e,t=[]){let n=[],r=Object.keys(pt),i=Object.values(pt).flatMap(e=>`alias`in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),a=new Set([...t,...r,...i,`--`,`_`,`$0`]);for(let[t,r]of Object.entries(e))if(!a.has(t)){let i=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(i!==t&&e[i]!==void 0)continue;if(typeof r==`boolean`&&r)n.push(`--${t}`);else if(typeof r==`string`||typeof r==`number`)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(let e of r)n.push(`--${t}`,String(e))}let o=Array.isArray(e[`--`])?e[`--`].map(String):[];return G([...n,...o])}const ha={command:`retry [command] [args...]`,describe:`Retry the given command until it succeeds`,builder:{retry:{description:`A maximum retry count`,type:`number`,alias:`r`,default:3}},async handler(e){let t=B(e);t||(console.error(f.red(`No project found.`)),process.exit(1));let n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean),r=0;for(let i=0;i<e.retry;i++)if(i>0&&console.info(`\n${f.yellow(`#${i} Retrying: ${n.join(` `)}`)}`),r=await H(n.join(` `),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),r===0)return;process.exit(r)}},ga={command:`setup`,describe:`Setup development environment. .env files are ignored.`,builder:{},async handler(e){await _a(e)}};async function _a(e,t){let r=await V(e,!1,t);r||(console.error(f.red(`No project found.`)),process.exit(1));for(let t of ci(`setup`,r.descendants)){let i=await y.readdir(t.dirPath,{withFileTypes:!0});if(t===r.root&&(m.platform()===`darwin`&&await U(`brew install ${[`pstree`].join(` `)}`,t,e),i.some(e=>e.isFile()&&e.name.includes(`-version`))&&await H(`asdf install`,t,e,{exitIfFailed:!1})),i.some(e=>e.isFile()&&e.name===`pyproject.toml`)){await U(`poetry config virtualenvs.in-project true`,t,e);let[,r]=n.execSync(`asdf current python`).toString().trim().split(/\s+/);await U(`poetry env use ${r}`,t,e),await ot.promiseAll(),await H(`poetry run pip install --upgrade pip`,t,e),await H(`poetry install --ansi`,t,e)}(t===r.root||!r.root.packageJson.scripts?.[`gen-code`])&&t.packageJson.scripts?.[`gen-code`]&&await H(`${Xe} gen-code`,t,e)}let i=r.descendants.find(e=>e.packageJson.devDependencies?.playwright);i&&await H(`${Xe} playwright install --with-deps`,i,e)}const va=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],ya=/^git@github\.com:(?:WillBooster|WillBoosterLab)\/[^/#]+(?:\.git)?(?:#.*)?$/,ba={command:`setup-private-packages`,describe:`Copy private git dependencies for Docker builds`,builder:{"out-dir":{description:`Directory to copy private packages into`,type:`string`,default:`@willbooster`}},async handler(n){let r=Ge(n,!1);r||(console.error(f.red(`No project found.`)),process.exit(1));let i=t.resolve(r.root.dirPath,n.outDir);Sa(r.root.dirPath,i);let a=await xa(r.root.dirPath,r.root.packageJson,i);if(n.dryRun){ja(i,a);return}await e.promises.rm(i,{recursive:!0,force:!0}),await e.promises.mkdir(i,{recursive:!0});for(let n of a.values())await e.promises.cp(n.sourceDirPath,n.targetDirPath,{recursive:!0,force:!0,filter:e=>{let r=t.relative(n.sourceDirPath,e).split(t.sep);return!r.includes(`node_modules`)&&!r.includes(`.git`)}}),console.info(`Copied ${n.name} to ${t.relative(r.root.dirPath,n.targetDirPath)}`);await Ta(i,a)}};async function xa(e,t,n){let r=new Map,i=wa(t),a=new Set(i);for(let t=0;t<i.length;t++){let o=i[t];if(!o||r.has(o))continue;let s=Ca(e,n,o);r.set(o,s);for(let e of await Da(s.sourceDirPath)){let t=await Oa(e);for(let e of wa(t))a.has(e)||(a.add(e),i.push(e))}}return r}function Sa(e,n){let r=t.relative(e,n);r&&!r.startsWith(`..`)&&!t.isAbsolute(r)||(console.error(f.red(`Output directory must be a subdirectory of the project root: ${n}`)),process.exit(1))}function Ca(n,r,i){let a=Aa(i),o=t.join(n,`node_modules`,`@willbooster`,a);if(!e.existsSync(t.join(o,`package.json`)))throw Error(`Private package is not installed: ${i} (${o})`);return{name:i,sourceDirPath:o,targetDirPath:t.join(r,a)}}function wa(e){let t=[];for(let n of va){let r=e[n];if(r){for(let[e,n]of Object.entries(r))if(ka(n)){if(!e.startsWith(`@willbooster/`))throw Error(`Private git dependency must be an @willbooster package: ${e}`);t.push(e)}}}return[...new Set(t)]}async function Ta(n,r){for(let i of r.values())for(let a of await Da(i.targetDirPath)){let i=await Oa(a);Ea(a,i,r)&&(await e.promises.writeFile(a,`${JSON.stringify(i,void 0,2)}\n`,`utf8`),console.info(`Rewrote private dependencies in ${t.relative(n,a)}`))}}function Ea(e,n,r){let i=!1;for(let a of va){let o=n[a];if(o)for(let[n,a]of Object.entries(o)){if(!ka(a))continue;let s=r.get(n);s&&(o[n]=`file:${t.relative(t.dirname(e),s.targetDirPath)}`,i=!0)}}return i}async function Da(n){let r=[];for(let i of await e.promises.readdir(n,{withFileTypes:!0})){if(i.name===`node_modules`||i.name===`.git`)continue;let e=t.join(n,i.name);if(i.isDirectory()){r.push(...await Da(e));continue}i.isFile()&&i.name===`package.json`&&r.push(e)}return r}async function Oa(t){return JSON.parse(await e.promises.readFile(t,`utf8`))}function ka(e){return typeof e==`string`&&ya.test(e)}function Aa(e){return e.replace(/^@willbooster\//,``)}function ja(e,t){console.info(`[dry-run] Would recreate ${e}`);for(let e of t.values())console.info(`[dry-run] Would copy ${e.name}: ${e.sourceDirPath}`);console.info(`[dry-run] Would rewrite copied private git dependencies to file:../<name>`)}const Ma={watch:{description:`Whether to watch files`,type:`boolean`},args:{description:`Arguments for core command`,type:`array`,alias:`a`,default:[]},"docker-options":{description:`Arguments for "docker run"`,type:`array`,default:[]}};function Na(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e[`--`]??[]].map(e=>K(String(e))).join(` `),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>K(String(e))).join(` `)}function Pa(e){return e.silent?` > /dev/null`:``}const $=new class{buildImage(e,n){let r=e.dockerPackageJson.scripts?.[`docker/build/prepare`]?`YARN run docker/build/prepare && `:``,i=e.env.MISE_AGE_KEY?`
|
|
84
84
|
--secret id=mise_age_key,env=MISE_AGE_KEY`:``;return`cd ${t.dirname(e.findFile(`Dockerfile`))}
|
|
85
85
|
&& ${r}YARN wb optimizeForDockerBuild --outside
|
|
86
86
|
&& YARN wb retry -- docker build -t ${e.dockerImageName}
|
|
87
87
|
--build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)
|
|
88
88
|
--build-arg WB_ENV=${e.env.WB_ENV}
|
|
89
|
-
--build-arg WB_VERSION=${n}${i} .`}stopAndStart(e,t=``,n=``){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t=``,n=``){
|
|
89
|
+
--build-arg WB_VERSION=${n}${i} .`}stopAndStart(e,t=``,n=``){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t=``,n=``){Hr(this.stop(e),e);let r=n.includes(`/bin/bash`),i=e.env.MISE_AGE_KEY?`--env MISE_AGE_KEY `:``;return`docker run --rm ${r?`-it `:``}${i}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return`true $(docker rm -f $(docker ps -q) 2> /dev/null)`}};var Fa=class{shouldWaitAndOpenApp;constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return $.buildImage(e,t)}async startDev(e,t){return await Ar(e.env.PORT,e),this.shouldWaitAndOpenApp?G([`YARN`,`wb`,`concurrently`,...mt(t),`--kill-others-on-fail`,this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Ar(e.env.PORT,e),this.shouldWaitAndOpenApp?G([`YARN`,`wb`,`concurrently`,...mt(t),`--kill-others-on-fail`,this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Ar(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Ar(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,`development`)}
|
|
90
90
|
&& ${G([`YARN`,`wb`,`concurrently`,...mt(t),`--kill-others-on-fail`,$.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,`development`)}
|
|
91
|
-
&& ${$.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`}startProductionProtected(e,n){let r=
|
|
91
|
+
&& ${$.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`}startProductionProtected(e,n){let r=Ia(e);if(r){let i=`${G([`bash`,r])} ${n.normalizedArgsText??``}`.trim(),a=t.dirname(t.dirname(r));return this.buildProductionCommand(e,n,[e.buildCommand,a===e.dirPath?i:`(${G([`cd`,a])} && ${i})`])}let i=La(e),a=i?[e.buildCommand,`pm2-runtime start --no-autorestart ${i}`]:this.buildDefaultProductionStartCommands(e,n);return this.buildProductionCommand(e,n,a)}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`${e.isBunAvailable?`bun`:`node`} dist/index.js ${t.normalizedArgsText??``}`.trim()]}buildProductionCommand(e,t,n){let r=We(e,`test`)&&q(e)?[`rm -Rf "${zt(e)}"`]:[],i=!!Lt(e);return[...[...r,...e.hasPrisma?[Mn.migrate(e)]:[],...e.hasDrizzle&&!i?[Ft(e,$t.migrateForStart(e))]:[]].flatMap(e=>e.split(`&&`)),...n].filter(Boolean).map(e=>`${e} ${Pa(t)}`.trim()).join(` && `)}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,$.stopAndStart(e),n)}async testStart(e,t){return e.env.PORT||=`3000`,await Ar(e.env.PORT,e),`${At(`NODE_ENV`,``)} ${G([`YARN`,`wb`,`concurrently`,...mt(t),`--kill-others`,`--success`,`first`,this.startDevProtected(e,t),this.waitApp(e)])}`}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:i=[`test`,`test/e2e/`]}){e.env.PORT||=`3000`;let a=await Ar(e.env.PORT,e),o=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,s=Ra(i,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${s}${o}`:G([`YARN`,`wb`,`concurrently`,...mt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${a}
|
|
92
92
|
&& ${s}${o}`])}testUnit(e,t){let n=t.targets?.map(String);return e.hasVitest?G([`YARN`,`vitest`,`run`,...n?.length?n:[`test/unit/`],`--passWithNoTests`,`--allowOnly`,`--watch=false`,...t.bail?[`--bail=1`]:[]]):e.isBunAvailable?G([`bun`,`test`,...n?.length?n:[`test/unit/`],...t.bail?[`--bail`]:[]]):`echo "No tests."`}waitApp(e){let t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null
|
|
93
93
|
|| wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null
|
|
94
94
|
|| wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null
|
|
95
95
|
|| wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null
|
|
96
96
|
|| wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null
|
|
97
97
|
|| wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null
|
|
98
|
-
|| wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}};function Pa(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function Fa(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function Ia(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return La([...i,...e,...r],n);let o=e.slice(1),s=Ra(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return La([...i,`test`,...a,...c,...r],n)}function La(e,t){let n=e.indexOf(`playwright`),r=n!==-1&&e[n+1]===`test`;return!t||!r||e.some(e=>e===`--max-failures`||e.startsWith(`--max-failures=`))?G(e):G([...e,`--max-failures=1`])}function Ra(e){let t,n=[];for(let[r,i]of e.entries()){if(t){if(t===`required`||!i.startsWith(`-`)){t=void 0;continue}t=void 0}if(i===`--`)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(i.startsWith(`--`)){if(i.includes(`=`))continue;za.has(i)?t=`required`:Ba.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&Va.has(e)&&(t=`required`);continue}n.push(r)}return n}const za=new Set([`--browser`,`--config`,`--grep`,`--grep-invert`,`--global-timeout`,`--max-failures`,`--output`,`--project`,`--repeat-each`,`--reporter`,`--retries`,`--shard`,`--test-list`,`--test-list-invert`,`--timeout`,`--trace`,`--tsconfig`,`--ui-host`,`--ui-port`,`--ui-title`,`--workers`]),Ba=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),Va=new Set([`-c`,`-g`,`-j`]),Ha=new class extends Na{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??``}`}};var Ua=class extends Na{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);e.env.PORT||=`3000`;let i=await Or(e.env.PORT,e),a=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,o=t.targets?.map(String),s=o?.length?o:[`test/e2e/`],c=this.testUnit(e,{...t,targets:s});return G([`YARN`,`wb`,`concurrently`,...mt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${i} && ${c}${a}`])}};const Wa=new Ua,Ga=new class extends Na{constructor(){super(!0)}startDevProtected(e,t){return`YARN next dev --turbopack ${t.normalizedArgsText??``}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??``}`.trim()]}},Ka=new class extends Na{constructor(){super(!1)}startDevProtected(e,t){throw Error(`This method should not be called.`)}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${Je} dist/index.js ${t.normalizedArgsText??``} | tee server.log`)}startTest(){return Promise.resolve(`echo 'do nothing.'`)}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,`development`)} && ${$.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(){return Promise.resolve(`echo 'do nothing.'`)}testE2EProduction(){return Promise.resolve(`echo 'do nothing.'`)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},qa=new class extends Na{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??``}`}},Ja=new class extends Na{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[Mt(t,`.dev.vars`)],i=We(e,`test`)?Pt(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=Pt(e);return[e.buildCommand,Mt(t,`dist/server/.dev.vars`),...r?[r]:[],Nt(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${zt(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},Ya=new class extends Na{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??``}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??``}`.trim()}},Xa=new class extends Ua{startDevProtected(e,t){return this.buildWranglerDevCommands(e,t).join(` && `)}buildDefaultProductionStartCommands(e,t){return this.buildWranglerDevCommands(e,t)}buildWranglerDevCommands(e,t){e.env.PORT||=`8787`;let n=zt(e),r=[Mt(t,`.dev.vars`)],i=Pt(e);return i&&r.push(i),r.push(Nt(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}},Za=[`express`,`fastify`,`elysia`,`hono`],Qa={...Aa,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},$a={command:`start [args..]`,describe:`Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0`,builder:e=>e.parserConfiguration({"populate--":!0}).options(Qa),async handler(e){ja(e);let t=await V(e);t||(console.error(f.red(`No project found.`)),process.exit(1));for(let n of t.descendants){let t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{},i;if(t.blitz)i=Ha;else if(t.vinext||r.vinext)i=Ja;else if(t.next)i=Ga;else if(r[`@remix-run/dev`])i=qa;else if(r.vite)i=Ya;else if(q(n))i=Xa;else if(Za.some(e=>t[e])&&!t[`firebase-functions`]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=Wa;else if(t[`build-ts`]||r[`build-ts`])i=Ka;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await H(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await H(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await H(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await H(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await H(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},eo=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),to=.05,no={e2e:{description:`How to run E2E tests`,type:`string`,choices:[`headless`,`headless-dev`,`headed`,`headed-dev`,`docker`,`docker-debug`,`debug`,`generate`,`trace`],default:`headless`},silent:{description:`Reduce redundant outputs`,type:`boolean`},bail:{description:`Stop tests after the first failure`,type:`boolean`},"unit-timeout":{description:`Timeout for unit tests`,type:`number`}},ro={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},io={command:`test [targets...]`,describe:`Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'`,builder:e=>e.parserConfiguration({"populate--":!0}).options(no).positional(`targets`,ro.targets),async handler(e){process.exit(await ao(e))}};async function ao(n,r={}){let i=so(n),a=await V(i);if(!a)return console.error(f.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=yo(o,s);for(let n of a.descendants){n.env.WB_ENV||=`test`;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d;d=a.blitz?Ha:a.vinext||u.vinext?Ja:a.next?Ga:u[`@remix-run/dev`]?qa:u.vite?Ya:q(n)?Xa:Za.some(e=>a[e])&&!a[`firebase-functions`]?Wa:Ka,console.info(`Running "test" for ${n.name} ...`);let f=co(n);if(l&&f!==!1){let e=o.filter(e=>e.includes(`/unit`)),t=e.length>0?e:f.length>0?f:void 0,a={...i,targets:t},s=await fo(d.testUnit(n,a),n,i,{exitIfFailed:r.exitIfFailed,timeout:i.unitTimeout});if(s!==0)return s}if(!c||!e.existsSync(t.join(n.dirPath,`test`,`e2e`))){c&&oo(n);continue}let p=o.filter(e=>e.includes(`/e2e`)),m={...i,targets:p.length>0?p:void 0};switch(i.e2e){case`headless`:{let e=await uo(await d.testE2EProduction(n,m,{playwrightArgs:vo(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await uo(await d.testE2EDev(n,m,{playwrightArgs:vo(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await lo(n,m,d,vo(p,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await lo(n,m,d,vo(p,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.blitz||a.next||u[`@remix-run/dev`]||u.vite)switch(i.e2e){case`headed`:{let e=await uo(await d.testE2EProduction(n,m,{playwrightArgs:vo(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await uo(await d.testE2EDev(n,m,{playwrightArgs:vo(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await uo(await d.testE2EProduction(n,m,{playwrightArgs:vo(p,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await uo(await d.testE2EProduction(n,m,{playwrightArgs:[`codegen`,`http://localhost:${n.env.PORT}`]}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`trace`:{let e=await uo(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function oo(n){n.packageJson.workspaces||e.existsSync(t.join(n.dirPath,`playwright.config.ts`))&&console.warn(f.yellow(`Skipping e2e tests for ${n.name}: a Playwright config exists but the test/e2e directory is missing. wb only discovers Playwright specs under test/e2e/, so move them there to run e2e tests.`))}function so(e){return e.env?.length||e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?e:{...e,cascadeEnv:`test`}}function co(n){return e.existsSync(t.join(n.dirPath,`test`,`unit`))?[]:n.hasVitest&&e.existsSync(t.join(n.dirPath,`test`))?e.existsSync(t.join(n.dirPath,`test`,`e2e`))?[`test`,`--exclude`,`test/e2e/**`]:[`test`]:!1}async function lo(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await H(`${n.buildDocker(e,`test`)}${Ma(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await uo(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await H($.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function uo(e,t,n,r={}){return H(e,t,n,{...r,processSilentOutput:po})}function fo(e,t,n,r={}){return H(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function po(e){let t=[],n=new Set,r=[];for(let i of mo(e)){let e=go(i);n.has(e)||t.some(t=>_o(t,e))||(ho(t,n,e),r.push(i))}return r.join(`
|
|
99
|
-
`)}function*
|
|
100
|
-
`,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function
|
|
101
|
-
No type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.`:`No type errors found.`)),s}function
|
|
102
|
-
`+f.cyan(f.bold(`Start:`),e));let r=await t()??0;return r===0||n.allowFailure?n.silent||console.info(f.green(f.bold(`Finished:`),e)):(console.info(f.red(f.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function
|
|
103
|
-
`))}function
|
|
104
|
-
`+f.cyan(f.bold(`Command:`),e)+f.gray(` at ${t}`))}function
|
|
105
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsInQiLCJpIiwiZSIsIm8iLCJuIiwiciIsImEiLCJuIiwiZSIsInIiLCJuIiwidCIsImUiLCJidWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJhcmd1bWVudHNCdWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsIkxJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSIsIkRFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCIsImJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kIiwiZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiIsInBhcnNlIiwicGFyc2VEb3RlbnYiLCJkZXBsb3lDb21tYW5kIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsInNldFRpbWVvdXQiLCJidWlsZGVyIiwic2V0VGltZW91dCIsImZzIiwiYnVpbGRlciIsInRvVW5zY29wZWRQYWNrYWdlTmFtZSIsImlzRG9ja2VyRW5hYmxlZCIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiYnVpbGRlciIsImRlcGxveUNvbW1hbmQiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9iaW5QYXRoLnRzIiwiLi4vc3JjL3V0aWxzL2NpLnRzIiwiLi4vc3JjL3Byb2plY3QudHMiLCIuLi9zcmMvdXRpbHMvcnVudGltZS50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZElmTmVlZGVkLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy91dGlscy9zaGVsbC50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLnRzIiwiLi4vc3JjL3V0aWxzL3dyYW5nbGVyQ29uZmlnLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkRldlZhcnMudHMiLCIuLi9zcmMvY29tbWFuZHMvZGVwbG95LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2RvdGVudi50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvZ2VuQ29kZS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvb3V0cHV0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvdXRpbHMvcG9ydC50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL21haW50ZW5hbmNlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ByaXNtYS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cFByaXZhdGVQYWNrYWdlcy50cyIsIi4uL3NyYy9zY3JpcHRzL2J1aWxkZXIudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9sb2cudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9jb21tYW5kcy92ZXJpZnlDb2RlLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIG5hcmdzOiAxLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICAncXVpZXQtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3VwcHJlc3MgLmVudiBmaWxlIGxvYWRpbmcgaW5mb3JtYXRpb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJOYW1lc11bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICAvKipcbiAgICAgKiBMb2FkIHZhcmlhYmxlcyBldmVuIGlmIHRoZXkgYWxyZWFkeSBleGlzdCBpbiBwcm9jZXNzLmVudi5cbiAgICAgKiBVc2VmdWwgd2hlbiBhIHBhcmVudCBwcm9jZXNzIGhhcyBhbHJlYWR5IGluamVjdGVkIHRoZSAuZW52IHZhbHVlcyBpbnRvIHRoZSBlbnZpcm9ubWVudFxuICAgICAqIGFuZCB0aGUgZmlsZS1kZWZpbmVkIHZhcmlhYmxlcyB0aGVtc2VsdmVzIGFyZSBuZWVkZWQgKGUuZy4gYHdiIGdlbi1kZXYtdmFyc2ApLlxuICAgICAqL1xuICAgIGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuO1xuICB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGNvbnN0IHNob3VsZFN1cHByZXNzT3V0cHV0ID0gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtwcm9jZXNzLmVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtwcm9jZXNzLmVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpICYmIChvcHRpb25zPy5pZ25vcmVQcm9jZXNzRW52IHx8ICEoa2V5IGluIHByb2Nlc3MuZW52KSkpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZW52UGF0aCwga2V5c10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0ICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW21pc2VFbnZWYXJzLCBtaXNlRW52VmFyTmFtZXNdID0gcmVhZE1pc2VFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIGVudlZhcnMsIG9wdGlvbnMpO1xuICBPYmplY3QuYXNzaWduKGVudlZhcnMsIG1pc2VFbnZWYXJzKTtcbiAgaWYgKG1pc2VFbnZWYXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW21pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSksIG1pc2VFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHttaXNlRW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke21pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmICghYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGBSZWFkIGVudiBmaWxlczogJHtlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMubWFwKChbZW52UGF0aCwga2V5c10pID0+IChrZXlzLmxlbmd0aCA+IDAgPyBgJHtlbnZQYXRofSAoJHtrZXlzLmpvaW4oJywgJyl9KWAgOiBlbnZQYXRoKSkuam9pbignLCAnKSB8fCAnbm90aGluZyd9YFxuICAgICk7XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpKTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSAmJiAhKGtleSBpbiBwcm9jZXNzLmVudikpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIC8vIEV4cGFuZCByZWZlcmVuY2VzIGFnYWluc3QgdGhlIGxpdmUgZW52aXJvbm1lbnQgZm9yIGtleXMgTk9UIGxvYWRlZCBmcm9tIGZpbGVzLCBzbyB0aGF0IGFcbiAgLy8gcmVmZXJlbmNlIHRvIGFuIGV4cG9ydGVkIGtleSAoZXhjbHVkZWQgZnJvbSBlbnZWYXJzIGJ5IHByb2Nlc3MtZW52IHByZWNlZGVuY2UpIHJlc29sdmVzIHRvXG4gIC8vIHRoZSBlZmZlY3RpdmUgdmFsdWUgaW5zdGVhZCBvZiBhbiBlbXB0eSBzdHJpbmcuIExvYWRlZCBrZXlzIGFyZSBkZWxpYmVyYXRlbHkgYWJzZW50IGZyb21cbiAgLy8gdGhlIHJlZmVyZW5jZSBzZXQ6IGRvdGVudi1leHBhbmQgd291bGQgb3RoZXJ3aXNlIHJlcGxhY2UgdGhlaXIgcGFyc2VkIHZhbHVlcyB3aXRoIHRoZVxuICAvLyBwcm9jZXNzIHZhbHVlcywgYnJlYWtpbmcgY2FsbGVycyB0aGF0IG5lZWQgdGhlIGZpbGUtZGVmaW5lZCB2YWx1ZXMgdGhlbXNlbHZlcy5cbiAgY29uc3QgcmVmZXJlbmNlRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KSkge1xuICAgIC8vIEVzY2FwZSBkb2xsYXIgc2lnbnMgc28gZG90ZW52LWV4cGFuZCBzdWJzdGl0dXRlcyBleHBvcnRlZCB2YWx1ZXMgbGl0ZXJhbGx5IGluc3RlYWQgb2ZcbiAgICAvLyByZWN1cnNpdmVseSByZS1leHBhbmRpbmcgdGhlbSAoYW4gZXhwb3J0ZWQgYHBhJHdvcmRgIG11c3Qgc3RheSBgcGEkd29yZGApLlxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICEoa2V5IGluIGVudlZhcnMpKSByZWZlcmVuY2VFbnZba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoJyQnLCBTdHJpbmcucmF3YFxcJGApO1xuICB9XG4gIHJldHVybiBbZXhwYW5kKHsgcGFyc2VkOiBlbnZWYXJzLCBwcm9jZXNzRW52OiByZWZlcmVuY2VFbnYgfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvcHRpb25zPzogeyBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbiB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCFoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2QpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgYXJncyA9IFsnZW52JywgJy0tanNvbicsICctLWNkJywgY3dkXTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tZW52JywgY2FzY2FkZSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnbWlzZScsIGFyZ3MsIHtcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW3t9LCBbXV07XG4gIH1cbiAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwga2V5IGluIGN1cnJlbnRFbnZWYXJzKSBjb250aW51ZTtcbiAgICBpZiAob3B0aW9ucz8uaWdub3JlUHJvY2Vzc0Vudikge1xuICAgICAgLy8gYG1pc2UgZW52YCBhbHdheXMgZW1pdHMgUEFUSCBkdWUgdG8gdG9vbCBzaGltczsgY29uc3VtZXJzIG9mIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXNcbiAgICAgIC8vIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKSBtdXN0IG5vdCBwcm9wYWdhdGUgaXQuXG4gICAgICBpZiAoa2V5ID09PSAnUEFUSCcpIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QpOyA7IGN1cnJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJ21pc2UudG9tbCcpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5taXNlLnRvbWwnKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYG1pc2UgZW52IC0tZW52ICR7Y2FzY2FkZX1gIDogJ21pc2UgZW52Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCBvdXRwdXRPcHRpb25zID0gYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBxdWlldEVudj86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfTtcbiAgcmV0dXJuIG91dHB1dE9wdGlvbnMucXVpZXRFbnYgPT09IHRydWUgfHwgKG91dHB1dE9wdGlvbnMucXVpZXRFbnYgIT09IGZhbHNlICYmIG91dHB1dE9wdGlvbnMuc2lsZW50ID09PSB0cnVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgYmxhbmstb25seSBsaW5lcyBhcmUgc2tpcHBlZCB3aGlsZSBwcmludGluZyBzdGRvdXQvc3RkZXJyIGluIHJlYWx0aW1lICovXG4gIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBjb25zdCBzdGRvdXRQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3Rkb3V0LCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgY29uc3Qgc3RkZXJyUHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZGVyciwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHN0ZG91dFByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHN0ZGVyclByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgc3Rkb3V0UHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBzdGRlcnJQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcblxuZnVuY3Rpb24gY3JlYXRlUmVhbHRpbWVQcmludGVyKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0ZVN0cmVhbSxcbiAgb21pdEJsYW5rTGluZXMgPSBmYWxzZVxuKTogeyB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDsgZmx1c2g6ICgpID0+IHZvaWQgfSB7XG4gIGlmICghb21pdEJsYW5rTGluZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IChkYXRhKSA9PiBzdHJlYW0ud3JpdGUoZGF0YSksXG4gICAgICBmbHVzaDogKCkgPT4ge30sXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwZW5kaW5nID0gJyc7XG4gIHJldHVybiB7XG4gICAgd3JpdGU6IChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nICs9IGRhdGE7XG4gICAgICBjb25zdCBsaW5lcyA9IHBlbmRpbmcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKSA/PyAnJztcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWlzQmxhbmtMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgc3RyZWFtLndyaXRlKGAke2xpbmV9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoIWlzQmxhbmtMaW5lKHBlbmRpbmcpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShwZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSAnJztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JsYW5rTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobixlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogUHJlcGVuZCBldmVyeSBleGlzdGluZyBgbm9kZV9tb2R1bGVzLy5iaW5gIGRpcmVjdG9yeSBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkgdXAgdG8gdGhlXG4gKiByZXBvc2l0b3J5IHJvb3QgKG9yIGZpbGVzeXN0ZW0gcm9vdCkgdG8gdGhlIGVudmlyb25tZW50J3MgUEFUSCwgbmVhcmVzdCBkaXJlY3RvcnkgZmlyc3Qgc29cbiAqIGEgd29ya3NwYWNlLWxvY2FsIGRlcGVuZGVuY3kgd2lucyBvdmVyIGEgcmVwb3NpdG9yeS1yb290IG9uZS4gTmVlZGVkIHdoZXJldmVyIHdiIHN0cmlwc1xuICogeWFybidzIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGZyb20gUEFUSCAoeWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMgb25seVxuICogdGhyb3VnaCB0aGF0IGZvbGRlciwgbmV2ZXIgdGhyb3VnaCBgbm9kZV9tb2R1bGVzLy5iaW5gIG9uIFBBVEgpLCBzbyB0aGF0IGJhcmUgYmluYXJ5IG5hbWVzXG4gKiBpbiB3cmFwcGVkIGNvbW1hbmRzIGtlZXAgcmVzb2x2aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKGRpclBhdGg6IHN0cmluZywgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpblBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgYmluUGF0aHMucHVzaChiaW5QYXRoKTtcbiAgICB9XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICB9XG4gIGlmIChiaW5QYXRocy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgZW52LlBBVEggPSBlbnYuUEFUSCA/IGAke2JpblBhdGhzLmpvaW4oJzonKX06JHtlbnYuUEFUSH1gIDogYmluUGF0aHMuam9pbignOicpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFzQnVuVG9vbFZlcnNpb24oKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNCdW5Mb2NrZmlsZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNCdW5QYWNrYWdlTWFuYWdlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Ub29sVmVyc2lvbigpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuTG9ja2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgLy8gU29tZSByZXBvc2l0b3JpZXMgcmVseSBvbiB0aGUgbG9ja2ZpbGUgb3IgcGFja2FnZU1hbmFnZXIgZmllbGQgaW5zdGVhZCBvZiBtaXNlLlxuICAgIC8vIERvY2tlciBvcHRpbWl6YXRpb24gbXVzdCBmb2xsb3cgdGhlIHRhcmdldCBwcm9qZWN0LCBub3QgdGhlIHJ1bnRpbWUgdGhhdCBsYXVuY2hlZCB3Yi5cbiAgICByZXR1cm4gWydidW4ubG9jaycsICdidW4ubG9ja2InXS5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgcGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnYnVuQCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGlmICghc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCh0aGlzLmFyZ3YpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ByaXNtYScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCh0aGlzLmRpclBhdGgsIHRoaXMuZW52KTtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd1BhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKCcvLycpID8gcmF3UGF0aC5zbGljZSgyKSA6IHJhd1BhdGg7XG4gIHJldHVybiBub3JtYWxpemVkUGF0aCB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+ICYgUGFydGlhbDxQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdyb290RGlyUGF0aCc+PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBpZiAocGF0aC5pc0Fic29sdXRlKGRiUGF0aCkpIHJldHVybiBkYlBhdGg7XG5cbiAgY29uc3QgYmFzZURpclBhdGggPSBwcm9qZWN0LnJvb3REaXJQYXRoID8/IHByb2plY3QuZGlyUGF0aDtcbiAgcmV0dXJuIGJhc2VEaXJQYXRoID8gcGF0aC5yZXNvbHZlKGJhc2VEaXJQYXRoLCBkYlBhdGgpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBkZXNjZW5kYW50czogUHJvamVjdFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvamVjdC5lbnYuV0JfRU5WID09PSBuYW1lIHx8IHByb2plY3QuZW52Lk1JU0VfRU5WID09PSBuYW1lO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9XG4gIC8vIERldGVjdCBgYnVuIC0tYnVuIHJ1biB3YiAuLi5gLiBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICBwcm9jZXNzLnZlcnNpb25zLmJ1biB8fFxuICAvLyBEZXRlY3QgYGJ1biBydW4gd2IgLi4uYC5cbiAgcHJvY2Vzcy5hcmd2WzBdPy5lbmRzV2l0aCgnL2J1bicpIHx8XG4gIHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHMgcmVxdWlyaW5nXG4vLyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLiB3YiBvcHRzIGludG8gdGhlIGJ1biBydW50aW1lIGV4cGxpY2l0bHkgd2hlcmUgaXRcbi8vIGhlbHBzIChlLmcuIGBidW4gc3JjL2luZGV4LnRzYCkuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJ1aWxkQ29tbWFuZCA9XG4gICAgYXJndi5jb21tYW5kID8/XG4gICAgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIG9taXRTaWxlbnRTdGFydD86IGJvb2xlYW47XG4gIHByZXNlcnZlQ29sb3I/OiBib29sZWFuO1xuICBwcm9jZXNzU2lsZW50T3V0cHV0PzogKG91dHB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHByaW50UmF3T3V0cHV0PzogYm9vbGVhbjtcbiAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5PzogYm9vbGVhbjtcbiAgc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBzaWxlbnRTdWNjZXNzTWVzc2FnZT86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSdW5SZXN1bHQge1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBvdXRwdXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYgeyBzaWxlbnQ/OiBib29sZWFuIH0sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBpZiAoIShhcmd2LnNpbGVudCAmJiBvcHRzLm9taXRTaWxlbnRTdGFydCAmJiAhYXJndi5kcnlSdW4pKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgYXJndi5zaWxlbnQgPyAnQ29tbWFuZCcgOiAnU3RhcnQnKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3Qgc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCA9IEJvb2xlYW4oXG4gICAgYXJndi5zaWxlbnQgJiYgKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/PyBvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSlcbiAgKTtcbiAgbGV0IHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgY29uc3QgcHJvZ3Jlc3NUaW1lciA9XG4gICAgYXJndi5zaWxlbnQgJiYgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXNcbiAgICAgID8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuJyk7XG4gICAgICAgICAgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIH0sIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IChhcmd2LnNpbGVudCA/IHRydWUgOiB1bmRlZmluZWQpIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBhcmd2LnNpbGVudCA/ICdwaXBlJyA6ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nOiBhcmd2LnNpbGVudCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChwcm9ncmVzc1RpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAod3JvdGVTaWxlbnRQcm9ncmVzcykge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxuICBpZiAoc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCAmJiAoIW9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5IHx8IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPyBvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQocmV0LnN0ZG91dCkgOiByZXQuc3Rkb3V0KS50cmltKCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFyZ3Yuc2lsZW50ICYmIGV4aXRDb2RlID09PSAwICYmIG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4ob3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkpO1xuICB9XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgZXhpdENvZGUsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0ICYmICFvcHRzLnByaW50UmF3T3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8QnVmZmVyZWRSdW5SZXN1bHQ+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIG91dHB1dDogJycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIC8vIE5vIGAtLWJ1bmA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzIHRvb2xzIHJlcXVpcmluZ1xuICAvLyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICBjb25zdCBwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVuID0gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgL1BSSVNNQSBnZW5lcmF0ZSg/IVxccystLW5vLWhpbnRzKSg/PVxcc3wkKS9ndSxcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdQUklTTUEgZ2VuZXJhdGUnIDogJ1BSSVNNQSBnZW5lcmF0ZSAtLW5vLWhpbnRzJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gcnVuICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4pIHJ1bmAuXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIHJ1biBidW4gcnVuJywgJ2J1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAvLyBLZWVwIFBsYXl3cmlnaHQgYXMgYSBwYWNrYWdlLW1hbmFnZXIgY29tbWFuZCBpbnN0ZWFkIG9mIHJlc29sdmluZyBpdCB0aHJvdWdoIG5vZGVfbW9kdWxlcy8uYmluLlxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgIC5yZXBsYWNlQWxsKCdZQVJOICcsICFwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCk7XG4gIHJldHVybiB7XG4gICAgcHJpbnRhYmxlOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBkb3RlbnYgLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz4sXG4gIHByaW50T3B0aW9uczogeyBzaWxlbnRTdWNjZXNzPzogYm9vbGVhbiB9ID0ge31cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBpZiAocHJpbnRPcHRpb25zLnNpbGVudFN1Y2Nlc3MpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBjb25maWd1cmVDb2xvckVudihuZXdFbnYsIG9wdHMucHJlc2VydmVDb2xvcik7XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBjaGlsZC1wcm9jZXNzIGNvbG9yIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igd2ItbWFuYWdlZCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIGVudiBUaGUgY2hpbGQtcHJvY2VzcyBlbnZpcm9ubWVudCB0byBtdXRhdGUuXG4gKiBAcGFyYW0gcHJlc2VydmVDb2xvciBXaGV0aGVyIHdiIHNob3VsZCBwcmVzZXJ2ZSBjb2xvcnMgZm9yIG91dHB1dCB0aGF0IGl0IGNhcHR1cmVzIGFuZCByZXByaW50cyB0byBhbiBpbnRlcmFjdGl2ZSBUVFkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVDb2xvckVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIHByZXNlcnZlQ29sb3I/OiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChlbnYuTk9fQ09MT1IgIT09IHVuZGVmaW5lZCB8fCBwcmVzZXJ2ZUNvbG9yID09PSBmYWxzZSkge1xuICAgIC8vIE5PX0NPTE9SIGFuZCBwcmVzZXJ2ZUNvbG9yPWZhbHNlIGFyZSBleHBsaWNpdCBuby1jb2xvciBjaG9pY2VzLCBzbyBpbmhlcml0ZWQgRk9SQ0VfQ09MT1IgbXVzdCBub3QgbGVhayB0aHJvdWdoLlxuICAgIGRlbGV0ZSBlbnYuRk9SQ0VfQ09MT1I7XG4gIH0gZWxzZSBpZiAocHJlc2VydmVDb2xvciAmJiBwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAgIGVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICB9XG59XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9wdGlvbk5hbWUgb2YgT2JqZWN0LmtleXMoeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudikpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE9wdGlvblZhbHVlKGFyZ3YsIG9wdGlvbk5hbWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgYXJncy5wdXNoKHZhbHVlID8gYC0tJHtvcHRpb25OYW1lfWAgOiBgLS0ke29wdGlvbk5hbWV9PWZhbHNlYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHt2YWx1ZX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke2l0ZW19YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICAoYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBzaWxlbnQ/OiBib29sZWFuIH0pLnNpbGVudCA9PT0gdHJ1ZSAmJlxuICAgIGdldE9wdGlvblZhbHVlKGFyZ3YsICdxdWlldC1lbnYnKSA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGFyZ3MucHVzaCgnLS1xdWlldC1lbnYnKTtcbiAgfVxuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZ2V0T3B0aW9uVmFsdWUoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3B0aW9uTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGNhbWVsQ2FzZU9wdGlvbk5hbWUgPSBvcHRpb25OYW1lLnJlcGxhY2VBbGwoLy0oW2Etel0pL2csIChfLCBjaGFyYWN0ZXI6IHN0cmluZykgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xuICBjb25zdCBvcHRpb25zID0gYXJndiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIG9wdGlvbnNbb3B0aW9uTmFtZV0gPz8gb3B0aW9uc1tjYW1lbENhc2VPcHRpb25OYW1lXTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52LCBub3JtYWxpemVTY3JpcHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgRk9SQ0VfS0lMTF9ERUxBWV9NUyA9IDUwMDA7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdraWxsLW90aGVycyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBleGl0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAna2lsbC1vdGhlcnMtb24tZmFpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBmYWlscycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdWNjZXNzOiB7XG4gICAgZGVzY3JpcHRpb246ICdEZWZpbmUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNyaXRlcmlhJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FsbCcsICdmaXJzdCddLFxuICAgIGRlZmF1bHQ6ICdhbGwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmRzIHRvIHJ1biBjb25jdXJyZW50bHknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgUnVuQ29uY3VycmVudGx5T3B0aW9ucyB7XG4gIGNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAga2lsbE90aGVyczogYm9vbGVhbjtcbiAga2lsbE90aGVyc09uRmFpbDogYm9vbGVhbjtcbiAgc3VjY2VzczogJ2FsbCcgfCAnZmlyc3QnO1xuICBjaT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBjb25jdXJyZW50bHlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY29uY3VycmVudGx5IDxjb21tYW5kcy4uLj4nLFxuICBkZXNjcmliZTogJ1J1biBjb21tYW5kcyBjb25jdXJyZW50bHknLFxuICBidWlsZGVyOiB7IC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLCAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kcyA9IChhcmd2LmNvbW1hbmRzID8/IFtdKS5tYXAoU3RyaW5nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIGNvbW1hbmRzIHByb3ZpZGVkLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Db25jdXJyZW50bHkoe1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAga2lsbE90aGVyczogYXJndi5raWxsT3RoZXJzID8/IGZhbHNlLFxuICAgICAgICBraWxsT3RoZXJzT25GYWlsOiBhcmd2LmtpbGxPdGhlcnNPbkZhaWwgPz8gZmFsc2UsXG4gICAgICAgIHN1Y2Nlc3M6IGFyZ3Yuc3VjY2VzcyxcbiAgICAgICAgY2k6IHR5cGVvZiBhcmd2LmNpID09PSAnYm9vbGVhbicgPyBhcmd2LmNpIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29uY3VycmVudGx5KG9wdGlvbnM6IFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PlxuICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd24obm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIG9wdGlvbnMucHJvamVjdCkucnVubmFibGUsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5wcm9qZWN0LmRpclBhdGgsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogY29uZmlndXJlRW52KG9wdGlvbnMucHJvamVjdC5lbnYsIHsgY2k6IG9wdGlvbnMuY2kgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgKTtcblxuICBsZXQgc3RvcHBpbmcgPSBmYWxzZTtcbiAgbGV0IGludGVycnVwdGVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0UmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBzdG9wUmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZvcmNlS2lsbFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb208bnVtYmVyIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogY2hpbGRyZW4ubGVuZ3RoIH0pO1xuICBjb25zdCB3YWl0Rm9yRXhpdFByb21pc2VzID0gY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR0bGUgPSAoZXhpdENvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGV4aXRDb2RlO1xuICAgICAgICBmaXJzdFJlc3VsdCA/Pz0gZXhpdENvZGU7XG5cbiAgICAgICAgaWYgKCFzdG9wcGluZyAmJiBzaG91bGRTdG9wT3RoZXJzKGV4aXRDb2RlLCBvcHRpb25zKSkge1xuICAgICAgICAgIHN0b3BSZXN1bHQgPSBleGl0Q29kZTtcbiAgICAgICAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgICAgICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgJ1NJR1RFUk0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgY2hpbGQub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgICAgICBzZXR0bGUoMSk7XG4gICAgICB9KTtcbiAgICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHNldHRsZShnZXRFeGl0Q29kZShjb2RlID8/IHVuZGVmaW5lZCwgc2lnbmFsID8/IHVuZGVmaW5lZCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHN0b3BBbGwgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIGludGVycnVwdGVkU2lnbmFsID8/PSBzaWduYWw7XG4gICAgaWYgKHN0b3BwaW5nKSByZXR1cm47XG5cbiAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgc2lnbmFsKSk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ2ludCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdJTlQnKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lndGVybSA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdURVJNJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3F1aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHUVVJVCcpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gIHByb2Nlc3Mub24oJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yRXhpdFByb21pc2VzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChmb3JjZUtpbGxQcm9taXNlcyk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB9XG5cbiAgaWYgKGludGVycnVwdGVkU2lnbmFsKSB7XG4gICAgcmV0dXJuIGdldEV4aXRDb2RlKHVuZGVmaW5lZCwgaW50ZXJydXB0ZWRTaWduYWwpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0Jykge1xuICAgIHJldHVybiBmaXJzdFJlc3VsdCA/PyAxO1xuICB9XG4gIGlmIChzdG9wUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RvcFJlc3VsdDtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRDb2RlKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoc2lnbmFsICYmIHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykge1xuICAgIHJldHVybiAxMjggKyBjb25zdGFudHMuc2lnbmFsc1tzaWduYWxdO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdG9wT3RoZXJzKFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBvcHRpb25zOiBQaWNrPFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMsICdraWxsT3RoZXJzJyB8ICdraWxsT3RoZXJzT25GYWlsJyB8ICdzdWNjZXNzJz5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnIHx8IG9wdGlvbnMua2lsbE90aGVycyB8fCAob3B0aW9ucy5raWxsT3RoZXJzT25GYWlsICYmIGV4aXRDb2RlICE9PSAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9yY2VLaWxsUGlkcyA9IHNpZ25hbFBpZHModG9DaGlsZFBpZHMoY2hpbGRyZW4pLCBzaWduYWwpO1xuICBpZiAoZm9yY2VLaWxsUGlkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBpZiAoYXdhaXQgd2FpdEZvckZvcmNlS2lsbChmb3JjZUtpbGxQaWRzKSkge1xuICAgIHNpZ25hbFBpZHMoZm9yY2VLaWxsUGlkcywgJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0NoaWxkUGlkcyhjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNoaWxkcmVuLmZsYXRNYXAoKGNoaWxkKSA9PiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQgPyBbXSA6IFtjaGlsZC5waWRdKSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFBpZHMocGlkczogcmVhZG9ubHkgbnVtYmVyW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNpZ25hbGVkUGlkczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBwaWQgb2YgcGlkcykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWtpbGxQcm9jZXNzR3JvdXAocGlkLCBzaWduYWwpKSBjb250aW51ZTtcblxuICAgICAgc2lnbmFsZWRQaWRzLnB1c2gocGlkKTtcbiAgICAgIHRyZWVLaWxsKHBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8ga2lsbCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZ25hbGVkUGlkcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckZvcmNlS2lsbChwaWRzOiByZWFkb25seSBudW1iZXJbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBGT1JDRV9LSUxMX0RFTEFZX01TO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKHBpZHMuZXZlcnkoaXNQcm9jZXNzR3JvdXBHb25lKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgc2xlZXAoTWF0aC5taW4oMTAwLCBkZWFkbGluZSAtIERhdGUubm93KCkpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzR3JvdXBHb25lKHBpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIDApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24ga2lsbFByb2Nlc3NHcm91cChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCBzaWduYWwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCc7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChhcmcpKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfT0ke3NoZWxsRXNjYXBlQXJndW1lbnQodmFsdWUpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vOj0sQCUrLV0rJC91LnRlc3QoYXJnKSA/IGFyZyA6IGAnJHthcmcucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi9zaGVsbC5qcyc7XG5cbmNvbnN0IHdyYW5nbGVyQ29uZmlnRmlsZU5hbWVzID0gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXTtcblxuLyoqXG4gKiBCdWlsZCBhIGNvbW1hbmQgZ2VuZXJhdGluZyBhIC5kZXYudmFycyBmaWxlICh2aWEgYHdiIGdlbi1kZXYtdmFyc2ApIHNvIHRoYXRcbiAqIGB3cmFuZ2xlciBkZXZgIGNhbiBzZWUgdGhlIHdiLW1hbmFnZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2OiBTY3JpcHRBcmd2LCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3diJywgJ2dlbi1kZXYtdmFycycsIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSwgb3V0cHV0UGF0aF0pO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgYHdyYW5nbGVyIGRldmAtc3R5bGUgY29tbWFuZC4gYGVudiAtdSBDTE9VREZMQVJFX0VOVmAgbWFrZXMgd3JhbmdsZXIgc2VydmUgdGhlIHRvcC1sZXZlbFxuICogKG5vbi1kZXBsb3kpIGNvbmZpZy4gd3JhbmdsZXIgKGxpa2UgdmluZXh0KSByZXF1aXJlcyByZWFsIE5vZGUuanMg4oCUIGBidW4gcnVuYCByZXNwZWN0cyB0aGUgYmluJ3NcbiAqIG5vZGUgc2hlYmFuZywgYW5kIHdiIG5ldmVyIGNvbXBvc2VzIGAtLWJ1bmAgKHdob3NlIG5vZGUtPmJ1biBQQVRIIHNoaW0gYnJlYWtzIGJvdGggdG9vbHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoYXJnczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlYgWUFSTiB3cmFuZ2xlciAke2FyZ3N9YC50cmltKCk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGFwcGx5aW5nIHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIHRvIHRoZSBsb2NhbCBkYXRhYmFzZSwgb3IgdW5kZWZpbmVkXG4gKiBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2Ugb3Igbm8gd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5LlxuICogQ0k9dHJ1ZSBzdXBwcmVzc2VzIHdyYW5nbGVyJ3MgaW50ZXJhY3RpdmUgY29uZmlybWF0aW9uIHByb21wdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGF0YWJhc2VOYW1lID0gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCk7XG4gIGlmICghZGF0YWJhc2VOYW1lIHx8ICFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KSkgcmV0dXJuO1xuXG4gIHJldHVybiBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtkYXRhYmFzZU5hbWV9IC0tbG9jYWwgLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCJgO1xufVxuXG4vKipcbiAqIFByZWZpeCB0aGUgZ2l2ZW4gc2NyaXB0IHdpdGggY29tbWFuZHMgZXhwb3J0aW5nIERBVEFCQVNFX1VSTCBwb2ludGluZyB0byB0aGUgbG9jYWwgbWluaWZsYXJlIEQxIFNRTGl0ZSBmaWxlLFxuICogc28gdGhhdCBkcml6emxlLWtpdCBhbmQgc2VlZCBzY3JpcHRzIGNhbiBvcGVyYXRlIG9uIHRoZSBzYW1lIGRhdGFiYXNlIGFzIHRoZSBhcHAuXG4gKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBEMSBkYXRhYmFzZSBpbiBpdHMgd3JhbmdsZXIgY29uZmlnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnZW52Jz4sIHNjcmlwdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGF0YWJhc2VOYW1lID0gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCk7XG4gIGlmICghZGF0YWJhc2VOYW1lKSByZXR1cm4gc2NyaXB0O1xuXG4gIC8vIEV4Y2x1ZGluZyBtaW5pZmxhcmUncyBtZXRhZGF0YS5zcWxpdGUsIHdoaWNoIGxpdmVzIG5leHQgdG8gdGhlIGhhc2gtbmFtZWQgZGF0YWJhc2UgZmlsZS5cbiAgLy8gQW4gdW5tYXRjaGVkIGdsb2IgY2Fubm90IGhhcHBlbiBoZXJlOiB0aGUgc2NyaXB0IHJ1bnMgdW5kZXIgL2Jpbi9zaCAodmlhIE5vZGUncyBgc2hlbGw6IHRydWVgKSxcbiAgLy8gYW5kIHRoZSBwcmVjZWRpbmcgbWF0ZXJpYWxpemF0aW9uIGNvbW1hbmQgZ3VhcmFudGVlcyB0aGUgU1FMaXRlIGZpbGUgZXhpc3RzLlxuICAvLyBQcm9qZWN0cyB3aXRoIG11bHRpcGxlIEQxIGRhdGFiYXNlcyBhcmUgbm90IHN1cHBvcnRlZDogdGhlIGhhc2gtbmFtZWQgZmlsZXMgY2Fubm90IGJlXG4gIC8vIGRpc3Rpbmd1aXNoZWQgY2hlYXBseSAobWF0ZXJpYWxpemF0aW9uIGRvZXMgbm90IGV2ZW4gdXBkYXRlIHRoZSB0YXJnZXQgZmlsZSdzIG10aW1lKS5cbiAgLy8gVGhlIHN0YXRlIGRpcmVjdG9yeSBtdXN0IGJlIGFic29sdXRlIGJlY2F1c2UgdGhlIHdyYXBwZWQgc2NyaXB0IG1heSBgY2RgIHRvIHRoZSBtb25vcmVwbyByb290LlxuICBjb25zdCBzdGF0ZURpclBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCkpO1xuICBjb25zdCBleHBvcnRDb21tYW5kID0gYGV4cG9ydCBEQVRBQkFTRV9VUkw9XCJmaWxlOiQobHMgXCIke3N0YXRlRGlyUGF0aH1cIi92My9kMS9taW5pZmxhcmUtRDFEYXRhYmFzZU9iamVjdC8qLnNxbGl0ZSB8IGdyZXAgLXYgbWV0YWRhdGEgfCBoZWFkIC0xKVwiYDtcbiAgcmV0dXJuIGAke2J1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0LCBkYXRhYmFzZU5hbWUpfSAmJiAke2V4cG9ydENvbW1hbmR9ICYmICR7c2NyaXB0fWA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBEMSBkYXRhYmFzZSBkZWNsYXJlZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFjb25maWdQYXRoKSByZXR1cm47XG5cbiAgLy8gQ292ZXIgSlNPTihDKSAoYFwiZGF0YWJhc2VfbmFtZVwiOiBcIi4uLlwiYCkgYW5kIFRPTUwsIGluY2x1ZGluZyBpdHMgaW5saW5lLXRhYmxlIGZvcm1cbiAgLy8gKGBkMV9kYXRhYmFzZXMgPSBbeyAuLi4sIGRhdGFiYXNlX25hbWUgPSBcIi4uLlwiIH1dYCksIHdpdGhvdXQgZnVsbCBwYXJzZXJzLlxuICAvLyBDb21tZW50ZWQtb3V0IGxpbmVzIGFyZSBza2lwcGVkIHNvIHRoYXQgdGhleSBjYW5ub3Qgc2hhZG93IHRoZSBhY3RpdmUgZGF0YWJhc2UgbmFtZSxcbiAgLy8gYW5kIHRoZSBrZXkgbXVzdCBmb2xsb3cgYSBsaW5lIHN0YXJ0LCBge2Agb3IgYCxgIHNvIHRoYXQgcHJvc2UgbWVudGlvbmluZyBpdCBjYW5ub3QgbWF0Y2guXG4gIGZvciAoY29uc3QgbGluZSBvZiBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKS5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAoL15cXHMqKD86I3xcXC9cXC8pL3UudGVzdChsaW5lKSkgY29udGludWU7XG5cbiAgICBjb25zdCBtYXRjaCA9IC8oPzpefFsse10pXFxzKltcIiddP2RhdGFiYXNlX25hbWVbXCInXT9cXHMqWzo9XVxccypbXCInXShbXlwiJ10rKVtcIiddL3UuZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaFsxXTtcbiAgfVxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIFRlc3RzIG1heSBwYXNzIHBhcnRpYWwgUHJvamVjdCBvYmplY3RzIHdpdGhvdXQgZGlyUGF0aC5cbiAgaWYgKCFwcm9qZWN0LmRpclBhdGgpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIHdyYW5nbGVyQ29uZmlnRmlsZU5hbWVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcGF0aCBvZiB0aGUgd3JhbmdsZXItbmF0aXZlIEQxIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IChgbWlncmF0aW9uc19kaXJgIGluIHRoZSB3cmFuZ2xlclxuICogY29uZmlnLCBkZWZhdWx0aW5nIHRvIGBtaWdyYXRpb25zYCkgaWYgaXQgZXhpc3RzIG9uIGRpc2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFjb25maWdQYXRoKSByZXR1cm47XG5cbiAgbGV0IG1pZ3JhdGlvbnNEaXIgPSAnbWlncmF0aW9ucyc7XG4gIGZvciAoY29uc3QgbGluZSBvZiBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKS5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAoL15cXHMqKD86I3xcXC9cXC8pL3UudGVzdChsaW5lKSkgY29udGludWU7XG5cbiAgICBjb25zdCBtYXRjaCA9IC8oPzpefFsse10pXFxzKltcIiddP21pZ3JhdGlvbnNfZGlyW1wiJ10/XFxzKls6PV1cXHMqW1wiJ10oW15cIiddKylbXCInXS91LmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBtaWdyYXRpb25zRGlyID0gbWF0Y2hbMV0gYXMgc3RyaW5nO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWlncmF0aW9uc0Rpcik7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSA/IG1pZ3JhdGlvbnNEaXJQYXRoIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBtYXRlcmlhbGl6aW5nIHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKiBBIG5vLW9wIHF1ZXJ5IGZvcmNlcyBtaW5pZmxhcmUgdG8gY3JlYXRlIHRoZSBTUUxpdGUgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC5cbiAqIE9ubHkgc3Rkb3V0IGlzIHN1cHByZXNzZWQ7IHdyYW5nbGVyIHJlcG9ydHMgZXJyb3JzIG9uIHN0ZGVyciwgd2hpY2ggbXVzdCBzdGF5IHZpc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4sIGRhdGFiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBZQVJOIHdyYW5nbGVyIGQxIGV4ZWN1dGUgJHtkYXRhYmFzZU5hbWV9IC0tbG9jYWwgLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1jb21tYW5kIFwiU0VMRUNUIDFcIiA+IC9kZXYvbnVsbGA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBsb2NhbCB3cmFuZ2xlci9taW5pZmxhcmUgc3RhdGUgZGlyZWN0b3J5LlxuICogRGV2ZWxvcG1lbnQgZm9sbG93cyB3cmFuZ2xlcidzIGRlZmF1bHQgZGlyZWN0b3J5IHNvIHRoYXQgcGxhaW4gYHdyYW5nbGVyIGRldmAgLyBgdmluZXh0IGRldmBcbiAqICh3aXRob3V0IGEgcGVyc2lzdC1wYXRoIG92ZXJyaWRlKSBzaGFyZXMgdGhlIHNhbWUgZGF0YWJhc2UgYXMgd2ItbWFuYWdlZCBkYiBjb21tYW5kcy5cbiAqIE90aGVyIGVudmlyb25tZW50cyAoZS5nLiB0ZXN0KSBnZXQgdGhlaXIgb3duIGRpcmVjdG9yeSBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlc2V0XG4gKiB3aXRob3V0IGRlc3Ryb3lpbmcgZGV2ZWxvcG1lbnQgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4pOiBzdHJpbmcge1xuICAvLyBEZXN0cnVjdGl2ZSB0ZXN0IHJlc2V0cyBhcmUgZ2F0ZWQgb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSwgd2hpY2ggYWNjZXB0c1xuICAvLyBlaXRoZXIgV0JfRU5WIG9yIE1JU0VfRU5WOyByZXNvbHZlIHRvIHRoZSB0ZXN0IGRpcmVjdG9yeSB3aGVuZXZlciBlaXRoZXIgc2F5cyAndGVzdCcgc29cbiAgLy8gdGhhdCBzdWNoIHJlc2V0cyBjYW4gbmV2ZXIgdGFyZ2V0IHRoZSBkZXZlbG9wbWVudCBzdGF0ZS5cbiAgY29uc3Qgd2JFbnYgPSBbcHJvamVjdC5lbnYuV0JfRU5WLCBwcm9qZWN0LmVudi5NSVNFX0VOVl0uaW5jbHVkZXMoJ3Rlc3QnKVxuICAgID8gJ3Rlc3QnXG4gICAgOiBwcm9qZWN0LmVudi5XQl9FTlYgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlY7XG4gIHJldHVybiAhd2JFbnYgfHwgd2JFbnYgPT09ICdkZXZlbG9wbWVudCcgPyAnLndyYW5nbGVyL3N0YXRlJyA6IGAud3JhbmdsZXIvc3RhdGUtJHt3YkVudn1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IGJ1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZCwgZ2V0RDFEYXRhYmFzZU5hbWUsIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpciB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuY29uc3QgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FID0gJ2xpdGVzdHJlYW0ueW1sJztcbmNvbnN0IERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcblxuY2xhc3MgRHJpenpsZVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnY2xlYW51cC1saXRlc3RyZWFtJyk7XG4gICAgY29uc3Qgd2FsQ2hlY2twb2ludENvbW1hbmQgPSBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF0gJiYgY29tbWFuZCAtdiBzcWxpdGUzID4vZGV2L251bGw7IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBzcWxpdGUzIFwiJHtkYlBhdGh9XCI7IGZpYDtcbiAgICByZXR1cm4gYCR7d2FsQ2hlY2twb2ludENvbW1hbmR9OyBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qOyBybSAtUmYgXCIke3BhdGguZGlybmFtZShkYlBhdGgpfS8uJHtwYXRoLmJhc2VuYW1lKGRiUGF0aCl9XCIqIHx8IHRydWVgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgZDFEYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgICBpZiAoZDFEYXRhYmFzZU5hbWUpIHtcbiAgICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBEMSBzdWJ0cmVlIHNvIHRoYXQgb3RoZXIgbG9jYWxseS1wZXJzaXN0ZWQgYmluZGluZ3MgKEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKSBzdXJ2aXZlLFxuICAgICAgLy8gdGhlbiByZS1tYXRlcmlhbGl6ZSB0aGUgRDEgU1FMaXRlIGZpbGUuIEl0cyBwYXRoIGlzIGRldGVybWluaXN0aWMsIHNvIGEgREFUQUJBU0VfVVJMIGV4cG9ydGVkXG4gICAgICAvLyBiZWZvcmUgdGhlIHJlbW92YWwgc3RheXMgdmFsaWQuXG4gICAgICByZXR1cm4gYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfS92My9kMVwiICYmICR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGQxRGF0YWJhc2VOYW1lKX0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpO1xuICAgIGlmICghcmVtb3ZlQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgcmVzZXQgc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VlZENvbW1hbmQgPSB0aGlzLnNlZWQocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0ZUNvbW1hbmQgPSB0aGlzLmRlcGxveShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlZWRDb21tYW5kID09PSAndHJ1ZScgPyBtaWdyYXRlQ29tbWFuZCA6IGAke21pZ3JhdGVDb21tYW5kfSAmJiAke3NlZWRDb21tYW5kfWA7XG4gIH1cblxuICBtaWdyYXRlRm9yU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgKGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpIHx8IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgbWlncmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdkZXBsb3ktZm9yY2UnKTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGgpO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIFRoZSBlbnZpcm9ubWVudCBhc3NpZ25tZW50IG11c3QgZ28gdGhyb3VnaCBidWlsZERyaXp6bGVLaXRDb21tYW5kOiBwcmVmaXhpbmcgaXRzXG4gICAgLy8gcG9zc2libHktcGFyZW50aGVzaXplZCByZXN1bHQgd2l0aCBgQUxMT1dfVE9fU0tJUF9TRUVEPTBgIHdvdWxkIGJlIGEgc2hlbGwgc3ludGF4IGVycm9yLlxuICAgIGNvbnN0IG1pZ3JhdGVXaXRoU2VlZENvbW1hbmQgPSBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsICdtaWdyYXRlJywgJ0FMTE9XX1RPX1NLSVBfU0VFRD0wJyk7XG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07ICR7dGhpcy5kZXBsb3kocHJvamVjdCl9ICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofVwiICYmIGxzIC1haGwgXCIke2RiUGF0aH1cIiAmJiAke21pZ3JhdGVXaXRoU2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdsaXN0LWJhY2t1cHMnKTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ3Jlc3RvcmUnKTtcbiAgICByZXR1cm4gYCR7YnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKG91dHB1dFBhdGgpfTsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gXCIke291dHB1dFBhdGh9XCIgXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICBnZW5lcmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgZ2VuZXJhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cblxuICBtaWdyYXRlRGV2KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5zZWVkKSByZXR1cm4gJ1lBUk4gcnVuIHNlZWQnO1xuICAgIGNvbnN0IGRlZmF1bHRTZWVkUGF0aCA9IHBhdGguam9pbignZGInLCAnc2VlZC50cycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRlZmF1bHRTZWVkUGF0aCkpKSB7XG4gICAgICByZXR1cm4gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgQlVOICR7ZGVmYXVsdFNlZWRQYXRofWAgOiBgQlVOIGJ1aWxkLXRzIHJ1biAke2RlZmF1bHRTZWVkUGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHN0dWRpbyBmb3IgRHJpenpsZSBkb2VzIG5vdCBzdXBwb3J0IGRiLXVybC1vci1wYXRoLicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmdzOiBzdHJpbmcsIGVudmlyb25tZW50QXNzaWdubWVudCA9ICcnKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZCA9IGAke2Vudmlyb25tZW50QXNzaWdubWVudCAmJiBgJHtlbnZpcm9ubWVudEFzc2lnbm1lbnR9IGB9WUFSTiBkcml6emxlLWtpdCAke2FyZ3N9YDtcbiAgLy8gQSBjYWxsZXItc3VwcGxpZWQgLS1jb25maWcgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHNvIHRoZSBjd2QgbXVzdCBzdGF5IHRoZXJlLlxuICByZXR1cm4gYXJncy5pbmNsdWRlcygnLS1jb25maWcnKSA/IGNvbW1hbmQgOiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgY29tbWFuZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdDogUHJvamVjdCwgY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIC8vIGRyaXp6bGUta2l0IHJlc29sdmVzIHJlbGF0aXZlIHBhdGhzIGluIGl0cyBjb25maWcgYWdhaW5zdCB0aGUgY3dkLCBzbyB0aGUgY29tbWFuZCBtdXN0IHJ1blxuICAvLyBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZHJpenpsZS5jb25maWcuKiBldmVuIHdoZW4gbW9ub3JlcG8gcGFja2FnZXMgc2hhcmUgaXQgYXQgdGhlIHJvb3QuXG4gIHJldHVybiBjb25maWcgJiYgY29uZmlnLmRpclBhdGggIT09IHByb2plY3QuZGlyUGF0aFxuICAgID8gYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBjb25maWcuZGlyUGF0aF0pfSAmJiAke2NvbW1hbmR9KWBcbiAgICA6IGNvbW1hbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0OiBQcm9qZWN0KTogeyBkaXJQYXRoOiBzdHJpbmc7IGZpbGVOYW1lOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbJ2RyaXp6bGUuY29uZmlnLnRzJywgJ2RyaXp6bGUuY29uZmlnLm10cycsICdkcml6emxlLmNvbmZpZy5qcycsICdkcml6emxlLmNvbmZpZy5tanMnXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIFtwcm9qZWN0LmRpclBhdGgsIHByb2plY3Qucm9vdERpclBhdGhdKSB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBjYW5kaWRhdGVzLmZpbmQoKGZpbGVOYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSkpKTtcbiAgICBpZiAoZmlsZU5hbWUpIHJldHVybiB7IGRpclBhdGgsIGZpbGVOYW1lIH07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kRm9yUGF0aChhYnNvbHV0ZVBhdGgpO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1mIFwiJHtkYlBhdGh9XCIgXCIke2RiUGF0aH0td2FsXCIgXCIke2RiUGF0aH0tc2htXCJgO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRGJQYXRoT3JFcnJvcihwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgd2IgZGIgJHtjb21tYW5kTmFtZX0gc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC5gKTtcbiAgfVxuICByZXR1cm4gZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoT3JFcnJvcihwcm9qZWN0LCBjb21tYW5kTmFtZSk7XG4gIHJldHVybiBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZ1BhdGgpIHJldHVybiBgLWNvbmZpZyBcIiR7Y29uZmlnUGF0aH1cImA7XG5cbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxDb25maWdQYXRoKSkgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIKSkgcmV0dXJuIGAtY29uZmlnICR7REVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIfWA7XG4gIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuL3dyYW5nbGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBXcmFuZ2xlckQxRGF0YWJhc2Uge1xuICBiaW5kaW5nPzogc3RyaW5nO1xuICBkYXRhYmFzZV9uYW1lPzogc3RyaW5nO1xuICBkYXRhYmFzZV9pZD86IHN0cmluZztcbiAgbWlncmF0aW9uc19kaXI/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfcGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBEMSBiaW5kaW5nIHVzZXMgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgdGhhdCBgd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseWBcbiAqIHdvdWxkIGFjdHVhbGx5IGRpc2NvdmVyOiBhbiBleHBsaWNpdCBgbWlncmF0aW9uc19wYXR0ZXJuYCBvcHRzIGluLCBvdGhlcndpc2UgdGhlIG1pZ3JhdGlvbnNcbiAqIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gZmxhdCBgKi5zcWxgIGZpbGVzICh3cmFuZ2xlcidzIGRlZmF1bHQgcGF0dGVybikuIEEgZHJpenpsZS1raXQgYG91dGBcbiAqIGRpcmVjdG9yeSB3aXRoIG5lc3RlZCBgPG5hbWU+L21pZ3JhdGlvbi5zcWxgIGZpbGVzIGFuZCBubyBwYXR0ZXJuIHdvdWxkIG1hdGNoIG5vdGhpbmcgYW5kXG4gKiBzaWxlbnRseSBhcHBseSB6ZXJvIG1pZ3JhdGlvbnMsIHNvIGl0IG11c3QgZmFsbCB0aHJvdWdoIHRvIHRoZSBkcml6emxlLWtpdCBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPiwgZGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSk6IGJvb2xlYW4ge1xuICAvLyBBbiBleHBsaWNpdCBwYXR0ZXJuIG9wdHMgaW50byB0aGUgd3JhbmdsZXItbmF0aXZlIG1lY2hhbmlzbSBldmVuIGJlZm9yZSB0aGUgZGlyZWN0b3J5XG4gIC8vIGV4aXN0czsgd3JhbmdsZXIgdGhlbiBmYWlscyBzYWZlbHkgd2l0aCBcIk5vIG1pZ3JhdGlvbnMgZm9sZGVyIGZvdW5kXCIgaW5zdGVhZCBvZiB3YlxuICAvLyBzaWxlbnRseSBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgbWlncmF0aW9uIGVuZ2luZS5cbiAgaWYgKGRhdGFiYXNlLm1pZ3JhdGlvbnNfcGF0dGVybikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGF0YWJhc2UubWlncmF0aW9uc19kaXIgPz8gJ21pZ3JhdGlvbnMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZnMucmVhZGRpclN5bmMobWlncmF0aW9uc0RpclBhdGgpLnNvbWUoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5lbmRzV2l0aCgnLnNxbCcpKTtcbn1cblxuY29uc3QgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMgPSBuZXcgU2V0KFsnYmluZGluZ3MnLCAnc2VuZF9lbWFpbCcsICdyYXRlbGltaXRzJ10pO1xuY29uc3QgUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUyA9IG5ldyBTZXQoWyd3YXNtX21vZHVsZXMnLCAndGV4dF9ibG9icycsICdkYXRhX2Jsb2JzJ10pO1xuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgYmluZGluZyBuYW1lIGRlY2xhcmVkIGluIHRoZSAoZW52aXJvbm1lbnQtcmVzb2x2ZWQpIGNvbmZpZyBzdWJ0cmVlOiBgYmluZGluZ2BcbiAqIHByb3BlcnRpZXMgYW55d2hlcmUgKEQxLCBLViwgUjIsIHNlcnZpY2VzLCBhc3NldHMsIHF1ZXVlcywgZXRjLiksIHRoZSBgbmFtZWAta2V5ZWQgYmluZGluZ3NcbiAqIChgZHVyYWJsZV9vYmplY3RzLmJpbmRpbmdzYCwgYGxvZ2Z3ZHIuYmluZGluZ3NgLCBgc2VuZF9lbWFpbGAsIGByYXRlbGltaXRzYCksIGFuZCB0aGVcbiAqIHJlY29yZC1rZXllZCBsZWdhY3kgbW9kdWxlIGJpbmRpbmdzIChgd2FzbV9tb2R1bGVzYCwgYHRleHRfYmxvYnNgLCBgZGF0YV9ibG9ic2ApLiBBIHNlY3JldFxuICogc2hhcmluZyBhIGJpbmRpbmcncyBuYW1lIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhhdCBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcgb24gZGVwbG95LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyh2YWx1ZTogdW5rbm93biwgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKSwgcGFyZW50S2V5ID0gJycpOiBTZXQ8c3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgY29sbGVjdEJpbmRpbmdOYW1lcyhpdGVtLCBuYW1lcywgcGFyZW50S2V5KTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbmFtZXM7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChrZXkgPT09ICdiaW5kaW5nJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbmFtZScgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyAmJiBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUy5oYXMocGFyZW50S2V5KSkge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMuaGFzKGtleSkgJiYgY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmluZGluZ05hbWUgb2YgT2JqZWN0LmtleXMoY2hpbGQpKSBuYW1lcy5hZGQoYmluZGluZ05hbWUpO1xuICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnZW52JyAmJiBrZXkgIT09ICd2YXJzJyAmJiBrZXkgIT09ICdtZXRhZGF0YScgJiYga2V5ICE9PSAnb3B0aW9ucycpIHtcbiAgICAgIC8vIE5lc3RlZCBgZW52YCBzdWJ0cmVlcyBiZWxvbmcgdG8gb3RoZXIgZW52aXJvbm1lbnRzOyBgdmFyc2AgdmFsdWVzLCBgdW5zYWZlLm1ldGFkYXRhYCxcbiAgICAgIC8vIGFuZCBgdW5zYWZlLmJpbmRpbmdzW10uZGV2Lm9wdGlvbnNgIGFyZSBhcmJpdHJhcnkgSlNPTiB3aG9zZSBwcm9wZXJ0aWVzIChlLmcuIGFcbiAgICAgIC8vIFwiYmluZGluZ1wiIGZpZWxkKSBhcmUgZGF0YSwgbm90IFdvcmtlciBiaW5kaW5ncy5cbiAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoY2hpbGQsIG5hbWVzLCBrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB7XG4gIC8qKiBUaGUgV29ya2VyIG5hbWUgZm9yIHRoZSBkZXBsb3kgZW52aXJvbm1lbnQgKHdyYW5nbGVyIGFwcGVuZHMgYC08ZW52PmAgd2hlbiB0aGUgZW52IHNlY3Rpb24gaGFzIG5vIG93biBuYW1lKS4gKi9cbiAgd29ya2VyTmFtZT86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB2YXJLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBlbnZpcm9ubWVudCdzIGB2YXJzYCB2YWx1ZXMgKG5lZWRlZCBmb3IgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIGNvdW50L3NpemUgbGltaXRzKS4gKi9cbiAgdmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTZWNyZXRzIGRlY2xhcmVkIGFzIHJlcXVpcmVkIHZpYSB3cmFuZ2xlcidzIGBzZWNyZXRzLnJlcXVpcmVkYCAodmFsaWRhdGVkIGF0IGRlcGxveSB0aW1lKS4gKi9cbiAgcmVxdWlyZWRTZWNyZXROYW1lczogc3RyaW5nW107XG4gIC8qKiBOYW1lcyBvZiBhbGwgbm9uLXZhciBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzLCBzZW5kX2VtYWlsLCBzZXJ2aWNlcywgLi4uKS4gKi9cbiAgYmluZGluZ05hbWVzOiBzdHJpbmdbXTtcbiAgZDFEYXRhYmFzZXM6IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZW52aXJvbm1lbnQgY29tZXMgZnJvbSBhbiBgZW52LjxuYW1lPmAgc2VjdGlvbiAodGhlbiB3cmFuZ2xlciBjb21tYW5kcyBuZWVkXG4gICAqIGAtLWVudiA8bmFtZT5gIC8gYENMT1VERkxBUkVfRU5WPTxuYW1lPmApLiBgcHJvZHVjdGlvbmAgbWF5IGJlIGVpdGhlciB0aGUgdG9wIGxldmVsIG9yIGFcbiAgICogbmFtZWQgYGVudi5wcm9kdWN0aW9uYCBzZWN0aW9uOyB0aGUgc2VjdGlvbiB3aW5zIHdoZW4gaXQgZXhpc3RzLlxuICAgKi9cbiAgdXNlc0VudlNlY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSYXdXcmFuZ2xlckNvbmZpZyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZDFfZGF0YWJhc2VzPzogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIGFzc2V0cz86IHVua25vd247XG4gIGxvZ2Z3ZHI/OiB1bmtub3duO1xuICB3YXNtX21vZHVsZXM/OiB1bmtub3duO1xuICB0ZXh0X2Jsb2JzPzogdW5rbm93bjtcbiAgZGF0YV9ibG9icz86IHVua25vd247XG4gIHNpdGU/OiB1bmtub3duO1xuICBzZWNyZXRzPzogeyByZXF1aXJlZD86IHN0cmluZ1tdIH07XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIFJhd1dyYW5nbGVyQ29uZmlnPjtcbn1cblxuLy8gV29ya2VycyBTaXRlcyBpbXBsaWNpdGx5IGJpbmRzIGl0cyBLViBuYW1lc3BhY2UgYXMgX19TVEFUSUNfQ09OVEVOVC5cbmZ1bmN0aW9uIHNpdGVCaW5kaW5nTmFtZXMoY29uZmlnOiBSYXdXcmFuZ2xlckNvbmZpZywgZW52Q29uZmlnPzogUmF3V3JhbmdsZXJDb25maWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoZW52Q29uZmlnPy5zaXRlID8/IGNvbmZpZy5zaXRlKSA/IFsnX19TVEFUSUNfQ09OVEVOVCddIDogW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd3JhbmdsZXIgY29uZmlnIHZhbHVlcyBuZWVkZWQgZm9yIGRlcGxveWluZyB0byB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuXG4gKiBGb2xsb3dzIHdyYW5nbGVyJ3MgaW5oZXJpdGFuY2UgcnVsZXM6IGBhY2NvdW50X2lkYCBpcyBpbmhlcml0ZWQgYnkgbmFtZWQgZW52aXJvbm1lbnRzLFxuICogd2hpbGUgYHZhcnNgIGFuZCBgZDFfZGF0YWJhc2VzYCBhcmUgbm90IGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcbiAgaWYgKHBhdGguZXh0bmFtZShjb25maWdQYXRoKSA9PT0gJy50b21sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGVwbG95IHN1cHBvcnRzIHdyYW5nbGVyLmpzb25jL3dyYW5nbGVyLmpzb24gY29uZmlncyBvbmx5OyBtaWdyYXRlIHdyYW5nbGVyLnRvbWwgZmlyc3QuJyk7XG4gIH1cblxuICAvLyBqc29uYy1wYXJzZXIgaXMgZmF1bHQgdG9sZXJhbnQgYW5kIHdvdWxkIHJldHVybiBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsXG4gIC8vIHdoaWNoIGNvdWxkIG1pZ3JhdGUgYSByZW1vdGUgZGF0YWJhc2UgZnJvbSBhIGhhbGYtcmVhZCBjb25maWc7IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IuXG4gIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgY29uc3QgY29uZmlnID0gcGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JyksIHBhcnNlRXJyb3JzLCB7XG4gICAgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlLFxuICB9KSBhcyBSYXdXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2NvbmZpZ1BhdGh9OiAke3BhcnNlRXJyb3JzLmxlbmd0aH0gSlNPTkMgc3ludGF4IGVycm9yKHMpLmApO1xuICB9XG4gIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgY29uc3QgZW52Q29uZmlnID0gY29uZmlnLmVudj8uW2Vudk5hbWVdO1xuICBpZiAoIWVudkNvbmZpZyAmJiBlbnZOYW1lICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB3cmFuZ2xlciBjb25maWcgaGFzIG5vIFwiZW52XCI6IHsgXCIke2Vudk5hbWV9XCI6IC4uLiB9IHNlY3Rpb24uYCk7XG4gIH1cbiAgcmV0dXJuIGVudkNvbmZpZ1xuICAgID8ge1xuICAgICAgICB3b3JrZXJOYW1lOiBlbnZDb25maWcubmFtZSA/PyAoY29uZmlnLm5hbWUgPyBgJHtjb25maWcubmFtZX0tJHtlbnZOYW1lfWAgOiB1bmRlZmluZWQpLFxuICAgICAgICBhY2NvdW50SWQ6IGVudkNvbmZpZy5hY2NvdW50X2lkID8/IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhlbnZDb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGVudkNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICAvLyBNb3N0IGJpbmRpbmdzIGFyZSBub24taW5oZXJpdGFibGUgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQsIHNvIG9ubHkgdGhlXG4gICAgICAgIC8vIGVudmlyb25tZW50J3Mgb3duIG5hbWVzIGNvdW50IOKAlCBwbHVzIHRoZSBnZW51aW5lbHkgaW5oZXJpdGVkIHNoYXBlcyAoYXNzZXRzLCBsb2dmd2RyKSxcbiAgICAgICAgLy8gd2hpY2ggd3JhbmdsZXIgcmVzb2x2ZXMgYXMgd2hvbGUgZmllbGRzOiB0aGUgZW52aXJvbm1lbnQncyBvd24gZmllbGQgb3ZlcnJpZGVzIHRoZVxuICAgICAgICAvLyB0b3AgbGV2ZWwgZW50aXJlbHksIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSdzIG5hbWVzIGNvdW50LlxuICAgICAgICBiaW5kaW5nTmFtZXM6IFtcbiAgICAgICAgICAuLi5jb2xsZWN0QmluZGluZ05hbWVzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhc3NldHM6IGVudkNvbmZpZy5hc3NldHMgPz8gY29uZmlnLmFzc2V0cyxcbiAgICAgICAgICAgICAgbG9nZndkcjogZW52Q29uZmlnLmxvZ2Z3ZHIgPz8gY29uZmlnLmxvZ2Z3ZHIsXG4gICAgICAgICAgICAgIHdhc21fbW9kdWxlczogZW52Q29uZmlnLndhc21fbW9kdWxlcyA/PyBjb25maWcud2FzbV9tb2R1bGVzLFxuICAgICAgICAgICAgICB0ZXh0X2Jsb2JzOiBlbnZDb25maWcudGV4dF9ibG9icyA/PyBjb25maWcudGV4dF9ibG9icyxcbiAgICAgICAgICAgICAgZGF0YV9ibG9iczogZW52Q29uZmlnLmRhdGFfYmxvYnMgPz8gY29uZmlnLmRhdGFfYmxvYnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhlbnZDb25maWcpXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZywgZW52Q29uZmlnKSxcbiAgICAgICAgXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGVudkNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIC8vIGBzZWNyZXRzYCBpcyBub24taW5oZXJpdGFibGU6IGEgdG9wLWxldmVsIHJlcXVpcmVtZW50IG11c3Qgbm90IGZvcmNlIChvciB1cGxvYWQpXG4gICAgICAgIC8vIGEgc2VjcmV0IGludG8gYSBuYW1lZCBlbnZpcm9ubWVudC5cbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogZW52Q29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogdHJ1ZSxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgd29ya2VyTmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgIGFjY291bnRJZDogY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogY29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIGJpbmRpbmdOYW1lczogWy4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoY29uZmlnKSwgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcpXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IGZhbHNlLFxuICAgICAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlRG90ZW52IH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbi8vIENsb3VkZmxhcmUgV29ya2VycyBkb24ndCBzZWUgdGhlIHByb2Nlc3MgZW52aXJvbm1lbnQ7IHdyYW5nbGVyIGRldiByZWFkcyB2YXJzIGZyb20gYSAuZGV2LnZhcnNcbi8vIGZpbGUgbmV4dCB0byBpdHMgY29uZmlnIGZpbGUgaW5zdGVhZC4gVGhpcyBjb21tYW5kIGJyaWRnZXMgd2ItbWFuYWdlZCAuZW52IGZpbGVzIHRvIHRoYXQgZmlsZS5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyAmIHsgcGF0aD86IHN0cmluZyB9PjtcblxuZXhwb3J0IGNvbnN0IGdlbkRldlZhcnNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdnZW4tZGV2LXZhcnMgW3BhdGhdJyxcbiAgZGVzY3JpYmU6XG4gICAgJ0dlbmVyYXRlIGEgLmRldi52YXJzIGZpbGUgZm9yIGB3cmFuZ2xlciBkZXZgIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQgZnJvbSAuZW52IGZpbGVzIChwbHVzIFdCX0VOViBhbmQgTkVYVF9QVUJMSUNfV0JfRU5WKS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+XG4gICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIGdlbmVyYXRlZCAuZGV2LnZhcnMgZmlsZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnLmRldi52YXJzJyxcbiAgICB9KSBhcyB1bmtub3duIGFzIEFyZ3Y8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFJlc3RyaWN0IHRvIHRoZSB2YXJpYWJsZXMgbG9hZGVkIGZyb20gLmVudiBmaWxlcyAod2IncyBlbnZpcm9ubWVudCBjb250cmFjdCkgc28gdGhhdFxuICAgIC8vIHVucmVsYXRlZCBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZXZlciBsZWFrIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBJZ25vcmVcbiAgICAvLyBwcm9jZXNzLmVudiBiZWNhdXNlIHRoZSBwYXJlbnQgd2IgcHJvY2VzcyBpbmplY3RzIHRoZSAuZW52IHZhbHVlcyBpbnRvIGl0LCB3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBsb2FkaW5nIHRoZW0gaGVyZS5cbiAgICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBkb3RlbnYgdmFsdWVzIGZvciBmaWxlLWRlZmluZWRcbiAgICAvLyBrZXlzIChwcm9qZWN0LmVudiBhcHBsaWVzIHRoYXQgcHJlY2VkZW5jZSksIG9yIGBBVVRIX1NFQ1JFVD0uLi4gd2Igc3RhcnRgIHdvdWxkIHNlcnZlXG4gICAgLy8gdGhlIHN0YWxlIGZpbGUgdmFsdWUuIEFuIGV4cG9ydCB0aGF0IGVtcHRpZXMgYSBub24tZW1wdHkgZmlsZSB2YWx1ZSBpcyBkZWxpYmVyYXRlIGFuZFxuICAgIC8vIG11c3Qgc3Vydml2ZSB0aGUgZW1wdHktdmFsdWUgZmlsdGVyIGJlbG93ICh1bmxpa2UgYEtFWT1gIHBsYWNlaG9sZGVycyBpbiAuZW52IGZpbGVzLFxuICAgIC8vIHdoaWNoIHN0YXkgb21pdHRlZCBzbyB0aGV5IGNhbm5vdCBvdmVycmlkZSB3cmFuZ2xlciBgdmFyc2Agd2l0aCBlbXB0eSBzdHJpbmdzKS5cbiAgICBjb25zdCBleHBsaWNpdGx5RW1wdGllZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSAnJyAmJiBlbnZWYXJzW2tleV0gIT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgLy8gU3VwcGxlbWVudCB3aXRoIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFsdWVzIGZvciB0aGUga2V5cyBuYW1lZCBpbiAuZW52LmV4YW1wbGU6IENJIG9mdGVuXG4gICAgLy8gcHJvdmlkZXMgdGhlbSBhcyB3b3JrZmxvdyBlbnYgaW5zdGVhZCBvZiAuZW52IGZpbGVzIChzdGlsbCBhbiBhbGxvd2xpc3QsIHNvIHVucmVsYXRlZFxuICAgIC8vIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbm5vdCBsZWFrKS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ucmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3QpLCAnV0JfRU5WJywgJ05FWFRfUFVCTElDX1dCX0VOViddKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZW52VmFyc1trZXldIHx8IGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVudlZhcnNba2V5XSA9PT0gdW5kZWZpbmVkICYmIGVmZmVjdGl2ZVZhbHVlID09PSAnJykgZXhwbGljaXRseUVtcHRpZWRLZXlzLmFkZChrZXkpO1xuICAgICAgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gJycgfHwgZXhwbGljaXRseUVtcHRpZWRLZXlzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7cXVvdGVEb3RlbnZWYWx1ZShrZXksIHZhbHVlKX1gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYXJndi5wYXRoID8/ICcuZGV2LnZhcnMnKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBXb3VsZCBnZW5lcmF0ZSAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGxldCBlbnZFeGFtcGxlUGF0aDogc3RyaW5nO1xuICB0cnkge1xuICAgIGVudkV4YW1wbGVQYXRoID0gcHJvamVjdC5maW5kRmlsZSgnLmVudi5leGFtcGxlJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvLyBkb3RlbnYncyBvd24gcGFyc2VyIGNvdmVycyBgZXhwb3J0IEtFWT1gIHByZWZpeGVzIGFuZCB3aGl0ZXNwYWNlIGFyb3VuZCBgPWAsXG4gIC8vIHdoaWNoIGEgbGluZSByZWdleCB3b3VsZCBzaWxlbnRseSBtaXNzLlxuICByZXR1cm4gT2JqZWN0LmtleXMocGFyc2VEb3RlbnYoZnMucmVhZEZpbGVTeW5jKGVudkV4YW1wbGVQYXRoLCAndXRmOCcpKSk7XG59XG5cbi8qKlxuICogUXVvdGUgYSB2YWx1ZSBmb3IgZG90ZW52ICh3aGljaCB3cmFuZ2xlciB1c2VzIGZvciAuZGV2LnZhcnMpLiBFdmVyeSBjYW5kaWRhdGUgcmVwcmVzZW50YXRpb25cbiAqIGlzIHZlcmlmaWVkIGJ5IGFjdHVhbGx5IHBhcnNpbmcgaXQgYmFjayAob3VyIGRvdGVudiBwYXJzZXIgbWF0Y2hlcyB3cmFuZ2xlcidzIGJ1bmRsZWQgZG90ZW52XG4gKiAxNiBmb3IgdGhlc2UgY29uc3RydWN0cyksIHNvIGEgdmFsdWUgaXMgZWl0aGVyIHNlcmlhbGl6ZWQgbG9zc2xlc3NseSBvciByZWplY3RlZCDigJQgbmV2ZXJcbiAqIHNpbGVudGx5IGNvcnJ1cHRlZC4gQ2FuZGlkYXRlczogc2luZ2xlIHF1b3RlcyAobGl0ZXJhbCBzcGFuOyBjbG9zZWQgZWFybHkgYnkgYW4gYXBvc3Ryb3BoZSksXG4gKiBiYWNrdGlja3MgKGVxdWFsbHkgbGl0ZXJhbCksIHRoZW4gZG91YmxlIHF1b3RlcyB3aXRoIGVzY2FwZWQgbmV3bGluZXMvQ1JzIChkb3RlbnYgZG9lcyBub3RcbiAqIHVuZXNjYXBlIGlubmVyIFxcXCIg4oCUIGEgYCNgIGFmdGVyIGFuIGVtYmVkZGVkIHF1b3RlIHN0YXJ0cyBhIGNvbW1lbnQsIHdoaWNoIHRoZSByb3VuZC10cmlwXG4gKiBjaGVjayBjYXRjaGVzIGFuZCByZWplY3RzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlRG90ZW52VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkb3VibGVRdW90ZWRCb2R5ID0gdmFsdWUucmVwbGFjZUFsbCgnXFxuJywgU3RyaW5nLnJhd2BcXG5gKS5yZXBsYWNlQWxsKCdcXHInLCBTdHJpbmcucmF3YFxccmApO1xuICBjb25zdCBjYW5kaWRhdGVzID0gW2AnJHt2YWx1ZX0nYCwgYFxcYCR7dmFsdWV9XFxgYCwgYFwiJHtkb3VibGVRdW90ZWRCb2R5fVwiYF07XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAocGFyc2VEb3RlbnYoYCR7a2V5fT0ke2NhbmRpZGF0ZX1gKVtrZXldID09PSB2YWx1ZSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB2YWx1ZSBvZiAke2tleX0gY2Fubm90IGJlIGxvc3NsZXNzbHkgc2VyaWFsaXplZCBpbnRvIC5kZXYudmFyczsgc2ltcGxpZnkgaXRzIHF1b3RpbmcuYCk7XG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCwgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkV3JhbmdsZXJDb25maWcsIFdyYW5nbGVyRDFEYXRhYmFzZSB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlc29sdmVXcmFuZ2xlckNvbmZpZ0ZvckVudiwgdXNlc1dyYW5nbGVyTmF0aXZlTWlncmF0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyQ29uZmlnLmpzJztcblxuaW1wb3J0IHsgcmVhZEVudkV4YW1wbGVLZXlzIH0gZnJvbSAnLi9nZW5EZXZWYXJzLmpzJztcblxuLyoqXG4gKiBLZXlzIHRoYXQgZHJpdmUgdGhlIGRlcGxveSBpdHNlbGYgKG9yIGFyZSBtZWFuaW5nZnVsIG9ubHkgbG9jYWxseSkgYW5kIHRodXMgbXVzdCBuZXZlciBiZVxuICogcHVzaGVkIHRvIHRoZSBXb3JrZXIgYXMgc2VjcmV0cy4gYFdCX0VOVmAgLyBgTkVYVF9QVUJMSUNfV0JfRU5WYCBiZWxvbmcgaW4gd3JhbmdsZXIgYHZhcnNgLlxuICovXG5jb25zdCBOT05fU0VDUkVUX0tFWVMgPSBuZXcgU2V0KFtcbiAgJ0NJJyxcbiAgLy8gV3JhbmdsZXIgc3lzdGVtL2F1dGhlbnRpY2F0aW9uIHZhcmlhYmxlcyAoaHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3dvcmtlcnMvd3JhbmdsZXIvc3lzdGVtLWVudmlyb25tZW50LXZhcmlhYmxlcy8pLFxuICAvLyBpbmNsdWRpbmcgbGVnYWN5IGFsaWFzZXM7IGFwcC1zcGVjaWZpYyBuYW1lcyBzdWNoIGFzIENMT1VERkxBUkVfUjJfQUNDRVNTX0tFWV9JRCBzdGF5IGVsaWdpYmxlLlxuICAnQ0ZfQUNDT1VOVF9JRCcsXG4gICdDRl9BUElfQkFTRV9VUkwnLFxuICAnQ0ZfQVBJX0VNQUlMJyxcbiAgJ0NGX0FQSV9LRVknLFxuICAnQ0ZfQVBJX1RPS0VOJyxcbiAgJ0NGX0VNQUlMJyxcbiAgJ0NMT1VERkxBUkVfQUNDRVNTX0NMSUVOVF9JRCcsXG4gICdDTE9VREZMQVJFX0FDQ0VTU19DTElFTlRfU0VDUkVUJyxcbiAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCcsXG4gICdDTE9VREZMQVJFX0FQSV9CQVNFX1VSTCcsXG4gICdDTE9VREZMQVJFX0FQSV9LRVknLFxuICAnQ0xPVURGTEFSRV9BUElfVE9LRU4nLFxuICAnQ0xPVURGTEFSRV9BVVRIX1VTRV9LRVlSSU5HJyxcbiAgJ0NMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQnLFxuICAnQ0xPVURGTEFSRV9FTUFJTCcsXG4gICdDTE9VREZMQVJFX0VOVicsXG4gICdDTE9VREZMQVJFX0lOQ0xVREVfUFJPQ0VTU19FTlYnLFxuICAnQ0xPVURGTEFSRV9MT0FEX0RFVl9WQVJTX0ZST01fRE9UX0VOVicsXG4gICdET0NLRVJfSE9TVCcsXG4gICdIVFRQX1BST1hZJyxcbiAgJ0hUVFBTX1BST1hZJyxcbiAgJ2h0dHBfcHJveHknLFxuICAnaHR0cHNfcHJveHknLFxuICAnRk9SQ0VfQ09MT1InLFxuICAnTUlOSUZMQVJFX0NBQ0hFX0RJUicsXG4gICdNSVNFX0VOVicsXG4gICdOT19DT0xPUicsXG4gICdORVhUX1BVQkxJQ19XQl9FTlYnLFxuICAnTkVYVF9QVUJMSUNfV0JfVkVSU0lPTicsXG4gICdOT0RFX0VOVicsXG4gICdQT1JUJyxcbiAgJ1dCX0VOVicsXG4gICdXQl9WRVJTSU9OJyxcbl0pO1xuXG5jb25zdCBOT05fU0VDUkVUX0tFWV9QUkVGSVhFUyA9IFsnV1JBTkdMRVJfJywgJ0NMT1VERkxBUkVfSFlQRVJEUklWRV9MT0NBTF9DT05ORUNUSU9OX1NUUklOR18nLCAnQ0xPVURGTEFSRV9DRl9GRVRDSF8nXTtcblxuZnVuY3Rpb24gaXNOb25TZWNyZXRLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE5PTl9TRUNSRVRfS0VZUy5oYXMoa2V5KSB8fCBOT05fU0VDUkVUX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgRGVwbG95Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgRGVwbG95Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8RGVwbG95Q29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBEZXBsb3lDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTpcbiAgICAnRGVwbG95IGEgQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcCAodmluZXh0IG9yIHBsYWluIFdvcmtlcikgdG8gdGhlIFdCX0VOViBlbnZpcm9ubWVudDogdmFsaWRhdGUgc2VjcmV0cywgYnVpbGQsIGFwcGx5IHJlbW90ZSBEMSBtaWdyYXRpb25zLCB0aGVuIGRlcGxveSBjb2RlIGFuZCBzZWNyZXRzIGF0b21pY2FsbHkuJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB5YXJncyBhcyB1bmtub3duIGFzIEFyZ3Y8RGVwbG95Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3Y6IERlcGxveUNvbW1hbmRBcmd2KSB7XG4gICAgLy8gQSBzdHJheSBleHBvcnRlZCBDTE9VREZMQVJFX0VOViB3b3VsZCBiYWtlIHRoZSB3cm9uZyBlbnZpcm9ubWVudCBpbnRvIHRoZSBidWlsZCBhbmRcbiAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlIG9uIGRlcGxveTsgaXQgaXMgcmUtc2V0IGV4cGxpY2l0bHkgd2hlcmUgbmVlZGVkLlxuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DTE9VREZMQVJFX0VOVjtcblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHdyYW5nbGVyQ29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgaWYgKCF3cmFuZ2xlckNvbmZpZ1BhdGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCd3YiBkZXBsb3kgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcHMgKG5vIHdyYW5nbGVyIGNvbmZpZyBmb3VuZCkuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBwcm9qZWN0LmVudiBpcyBtZW1vaXplZCAoYSBzaW5nbGUgb2JqZWN0IHBlciBQcm9qZWN0IGluc3RhbmNlKSwgc28gaW4tcGxhY2VcbiAgICAvLyBtdXRhdGlvbnMgbGlrZSB0aGUgZm9sbG93aW5nIHBlcnNpc3QgZm9yIGV2ZXJ5IGxhdGVyIHJlYWQgYW5kIHNwYXduZWQgY29tbWFuZC5cbiAgICBkZWxldGUgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9FTlY7XG5cbiAgICBjb25zdCBlbnZOYW1lID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIGlmICghZW52TmFtZSB8fCBlbnZOYW1lID09PSAnZGV2ZWxvcG1lbnQnIHx8IGVudk5hbWUgPT09ICd0ZXN0Jykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBXQl9FTlYgbXVzdCBuYW1lIGEgZGVwbG95IGVudmlyb25tZW50IChlLmcuIHN0YWdpbmcgb3IgcHJvZHVjdGlvbiksIGJ1dCBpcyAke2Vudk5hbWV9LmApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIENJIHByb3ZpZGVzIHRoZSBDbG91ZGZsYXJlIEFQSSB0b2tlbiB2aWEgYSAuZW52LmNsb3VkZmxhcmUgZmlsZSAoZS5nLiB0aGUgcmV1c2FibGUgZGVwbG95XG4gICAgLy8gd29ya2Zsb3cncyBGSUxFX0NPTlRFTlRfMSk7IGFscmVhZHktZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbiBvdmVyIGl0cyB2YWx1ZXMuXG4gICAgY29uc3QgY2xvdWRmbGFyZUVudlBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLmVudi5jbG91ZGZsYXJlJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2xvdWRmbGFyZUVudlBhdGgpKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBjbG91ZGZsYXJlRW52UGF0aCwgcHJvY2Vzc0Vudjoge30sIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ0NMT1VERkxBUkVfRU5WJykgY29udGludWU7XG4gICAgICAgIC8vID8/PSBzbyB0aGF0IGFuIGV4cGxpY2l0bHkgZXhwb3J0ZWQgZW1wdHkgdmFsdWUgc3RpbGwgd2lucyBvdmVyIHRoZSBmaWxlLlxuICAgICAgICBwcm9qZWN0LmVudltrZXldID8/PSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVzb2x2ZWRDb25maWc6IFJlc29sdmVkV3JhbmdsZXJDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVkQ29uZmlnID0gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KHByb2plY3QsIGVudk5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFyZXNvbHZlZENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYEZhaWxlZCB0byBwYXJzZSAke3dyYW5nbGVyQ29uZmlnUGF0aH0uYCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBhY2NvdW50SWQgPSByZXNvbHZlZENvbmZpZy5hY2NvdW50SWQgPz8gcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BQ0NPVU5UX0lEO1xuICAgIC8vIFByZWZlciB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyB3aGVuZXZlciB0aGUgcmVzb2x2ZWQgZW52aXJvbm1lbnQncyBEMSBiaW5kaW5ncyBoYXZlIGFuXG4gICAgLy8gZXhpc3RpbmcgbWlncmF0aW9ucyBkaXJlY3Rvcnk6IGEgZHJpenpsZS1vcm0gZGVwZW5kZW5jeSBhbG9uZSBkb2VzIG5vdCBpbXBseSB0aGUgcHJvamVjdFxuICAgIC8vIG1pZ3JhdGVzIEQxIHdpdGggZHJpenpsZS1raXQncyBkMS1odHRwIGRyaXZlciAoc29tZSBkcml6emxlIGFwcHMgdXNlIHdyYW5nbGVyLW5hdGl2ZSkuXG4gICAgY29uc3Qgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcyA9IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmZpbHRlcigoZGF0YWJhc2UpID0+XG4gICAgICB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3QsIGRhdGFiYXNlKVxuICAgICk7XG4gICAgaWYgKFxuICAgICAgcHJvamVjdC5oYXNEcml6emxlICYmXG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoIDwgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAvLyBNaWdyYXRpbmcgb25seSB0aGUgd3JhbmdsZXItbmF0aXZlIHN1YnNldCB3b3VsZCBzaWxlbnRseSBkZXBsb3kgY29kZSBhZ2FpbnN0IHRoZVxuICAgICAgLy8gb3RoZXIsIHVubWlncmF0ZWQgZGF0YWJhc2VzLlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgZG9lcyBub3Qgc3VwcG9ydCBtaXhpbmcgd3JhbmdsZXItbmF0aXZlIGFuZCBub24tbmF0aXZlIEQxIG1pZ3JhdGlvbiBsYXlvdXRzLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBkcml6emxlRDFEYXRhYmFzZSA9XG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBwcm9qZWN0Lmhhc0RyaXp6bGUgPyByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlc1swXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAod3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPT09IDAgJiYgcHJvamVjdC5oYXNEcml6emxlICYmIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZCgnd2IgZGVwbG95IHN1cHBvcnRzIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMgb25seSBmb3IgYSBzaW5nbGUgRDEgYmluZGluZzsgZm91bmQgbXVsdGlwbGUuJylcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIERyeSBydW5zIGV4ZWN1dGUgbm90aGluZyBhdXRoZW50aWNhdGVkLCBzbyB0aGV5IHNraXAgdGhlIGNyZWRlbnRpYWwgcHJlZmxpZ2h0IGVudGlyZWx5LlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSAmJiAhcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfVE9LRU4pIHtcbiAgICAgICAgLy8gZHJpenpsZS1raXQncyBkMS1odHRwIGRyaXZlciByZXF1aXJlcyB0aGlzIHNwZWNpZmljIHRva2VuIGV2ZW4gZm9yIGxvY2FsIHJ1bnM7IGFcbiAgICAgICAgLy8gbG9jYWwgd3JhbmdsZXIgT0F1dGggbG9naW4gY292ZXJzIG9ubHkgdGhlIHdyYW5nbGVyLW5hdGl2ZSBwYXRoLlxuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnQ0xPVURGTEFSRV9BUElfVE9LRU4gaXMgcmVxdWlyZWQgZm9yIHJlbW90ZSBkcml6emxlLWtpdCBtaWdyYXRpb25zLicpKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzV3JhbmdsZXJBdXRoZW50aWNhdGlvbiA9XG4gICAgICAgICEhcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfVE9LRU4gfHxcbiAgICAgICAgISFwcm9qZWN0LmVudi5DRl9BUElfVE9LRU4gfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfS0VZICYmIHByb2plY3QuZW52LkNMT1VERkxBUkVfRU1BSUwpIHx8XG4gICAgICAgICEhKHByb2plY3QuZW52LkNGX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0ZfRU1BSUwpO1xuICAgICAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpICYmICFoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdXcmFuZ2xlciBhdXRoZW50aWNhdGlvbiAoZS5nLiBDTE9VREZMQVJFX0FQSV9UT0tFTikgaXMgcmVxdWlyZWQgdG8gZGVwbG95IG9uIENJLicpKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcC1zcGVjaWZpYyB2YWxpZGF0aW9uIGhvb2sgKGUuZy4gc2VjcmV0IHBhaXJzIHRoYXQgbXVzdCBiZSBib3RoLXNldC1vci1ib3RoLWVtcHR5KS5cbiAgICAvLyBUaGUgcmV1c2FibGUgZGVwbG95LnltbCBhbHJlYWR5IHJ1bnMgaXQgb24gQ0k7IHJ1biBpdCBoZXJlIGZvciBsb2NhbCBkZXBsb3lzLlxuICAgIGlmICghaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RlcGxveS9jaS1zZXR1cCddKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9jaS1zZXR1cCcsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIC8vIDEuIFJlc29sdmUgYW5kIHZhbGlkYXRlIGFsbCBzZWNyZXRzIGJlZm9yZSBhbnkgYnVpbGQgb3IgcmVtb3RlIG11dGF0aW9uLCBzbyBhIG1pc3NpbmdcbiAgICAvLyAgICBzZWNyZXQgYWJvcnRzIHRoZSBkZXBsb3kgaW5zdGVhZCBvZiBsZWF2aW5nIGEgbWlncmF0ZWQgZGF0YWJhc2UgYmVoaW5kIGFuIG9sZCBXb3JrZXIuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlNvdXJjZXNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIHByb2plY3QuZGlyUGF0aCwgeyBpZ25vcmVQcm9jZXNzRW52OiB0cnVlIH0pO1xuICAgIC8vIFJlc3RyaWN0IHRoZSBzZWNyZXRzIGRvbWFpbiB0byBrZXlzIGRlZmluZWQgaW4gdGhlIHByb2plY3QncyAuZW52IGZpbGVzOiBgbWlzZSBlbnZgXG4gICAgLy8gb3V0cHV0IChyZXBvcnRlZCBhcyBhIHBzZXVkby1zb3VyY2UpIG1peGVzIGluIGhvc3QvdG9vbCB2YXJpYWJsZXMgc3VjaCBhcyBDQVJHT19IT01FLFxuICAgIC8vIHdoaWNoIG11c3QgbmV2ZXIgYmUgdXBsb2FkZWQgYXMgV29ya2VyIHNlY3JldHMuXG4gICAgY29uc3QgZG90ZW52S2V5cyA9IG5ldyBTZXQoXG4gICAgICBlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgaWYgKCFkb3RlbnZLZXlzLmhhcyhrZXkpKSBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgICBjb25zdCByZXF1aXJlZEtleXMgPSByZWFkRW52RXhhbXBsZUtleXMocHJvamVjdCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcmVxdWlyZWRLZXlzKSB7XG4gICAgICBlbnZWYXJzW2tleV0gPz89IHByb2plY3QuZW52W2tleV0gPz8gJyc7XG4gICAgfVxuICAgIC8vIE5hbWVzIGRlY2xhcmVkIHZpYSB3cmFuZ2xlciBgc2VjcmV0cy5yZXF1aXJlZGAgbWF5IGxpa2V3aXNlIGJlIHN1cHBsaWVkIHB1cmVseSBhc1xuICAgIC8vIGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiBDSSB3b3JrZmxvdyBlbnYpIGluc3RlYWQgb2YgZG90ZW52IHZhbHVlcy5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzKSB7XG4gICAgICBjb25zdCBleHBvcnRlZFZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gPT09IHVuZGVmaW5lZCAmJiBleHBvcnRlZFZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGV4cG9ydGVkVmFsdWU7XG4gICAgfVxuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgd2luIG92ZXIgZG90ZW52IHZhbHVlcyAocHJvamVjdC5lbnYgYWxyZWFkeVxuICAgIC8vIGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBkZXBsb3lgIHdvdWxkIHB1c2ggdGhlIHN0YWxlIGZpbGUgdmFsdWUuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgeyBtaXNzaW5nS2V5cywgc2VjcmV0cyB9ID0gc2VsZWN0V29ya2VyU2VjcmV0cyhcbiAgICAgIGVudlZhcnMsXG4gICAgICBbLi4ucmVzb2x2ZWRDb25maWcudmFyS2V5cywgLi4ucmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzXSxcbiAgICAgIHJlcXVpcmVkS2V5c1xuICAgICk7XG4gICAgLy8gYC0tdmFyIFdCX1ZFUlNJT046Li4uYCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgb24gZGVwbG95LCBzbyBhXG4gICAgLy8gcmVzb3VyY2UgYmluZGluZyBvZiB0aGF0IG5hbWUgd291bGQgc2lsZW50bHkgYmVjb21lIGEgc3RyaW5nIHZhcmlhYmxlLlxuICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OICYmIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcygnV0JfVkVSU0lPTicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnV0JfVkVSU0lPTiBjb2xsaWRlcyB3aXRoIGEgV29ya2VyIGJpbmRpbmcgbmFtZTsgcmVuYW1lIHRoZSBiaW5kaW5nLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgYmluZGluZ0NvbGxpc2lvbnMgPSBPYmplY3Qua2V5cyhlbnZWYXJzKS5maWx0ZXIoKGtleSkgPT4gcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKGtleSkpO1xuICAgIGlmIChiaW5kaW5nQ29sbGlzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBVcGxvYWRpbmcgYSBzZWNyZXQgbmFtZWQgbGlrZSBhIGJpbmRpbmcgd291bGQgcmVwbGFjZSB0aGUgYmluZGluZyB3aXRoIGEgcGxhaW4gc3RyaW5nLlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYFNraXBwaW5nIGVudiBrZXlzIHRoYXQgY29sbGlkZSB3aXRoIFdvcmtlciBiaW5kaW5nIG5hbWVzOiAke2JpbmRpbmdDb2xsaXNpb25zLmpvaW4oJywgJyl9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChmcm9tIC5lbnYuZXhhbXBsZSBvciB3cmFuZ2xlciBzZWNyZXRzLnJlcXVpcmVkKTogJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gV3JhbmdsZXIgdmFsaWRhdGVzIGBzZWNyZXRzLnJlcXVpcmVkYCBvbmx5IGR1cmluZyB0aGUgcmVhbCB1cGxvYWQg4oCUIGFmdGVyIG1pZ3JhdGlvbnMg4oCUXG4gICAgLy8gc28gd2IgY2hlY2tzIHVwZnJvbnQ6IGVhY2ggcmVxdWlyZWQgbmFtZSBtdXN0IGJlIGEga2V5IGluIHRoZSBvdXRnb2luZyBwYXlsb2FkIChwcmVzZW5jZSxcbiAgICAvLyBub3QgdHJ1dGhpbmVzcyDigJQgYW4gZXhwbGljaXQgZW1wdHkgY2xlYXJzIGEgc3RhbGUgdmFsdWUpIG9yIGFuIGVmZmVjdGl2ZSB2YXIvYmluZGluZy5cbiAgICBjb25zdCB1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMgPSByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzLmZpbHRlcihcbiAgICAgIChuYW1lKSA9PlxuICAgICAgICAhKG5hbWUgaW4gc2VjcmV0cykgJiYgIXJlc29sdmVkQ29uZmlnLnZhcktleXMuaW5jbHVkZXMobmFtZSkgJiYgIXJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcyhuYW1lKVxuICAgICk7XG4gICAgaWYgKHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFNlY3JldHMgcmVxdWlyZWQgYnkgdGhlIHdyYW5nbGVyIGNvbmZpZyBhcmUgbm90IHByb3ZpZGVkOiAke3Vuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcy5qb2luKCcsICcpfWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0S2V5cyA9IE9iamVjdC5rZXlzKHNlY3JldHMpLnRvU29ydGVkKCk7XG4gICAgLy8gQ2xvdWRmbGFyZSBsaW1pdHMgYSBidWxrIHVwbG9hZCB0byAxMDAgc2VjcmV0cywgZWFjaCB2YXJpYWJsZS9zZWNyZXQgdmFsdWUgdG8gNSBLQiwgYW5kXG4gICAgLy8gdGhlIGNvbWJpbmVkIHZhcmlhYmxlK3NlY3JldCBjb3VudCB0byAxMjggKDY0IG9uIHRoZSBGcmVlIHBsYW4sIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZFxuICAgIC8vIGhlcmUg4oCUIGhlbmNlIGEgd2FybmluZykuIEZhaWxpbmcgYmVmb3JlIGFueSBidWlsZCBvciBtaWdyYXRpb24ga2VlcHMgYW4gb3ZlcnNpemVkIHBheWxvYWRcbiAgICAvLyBmcm9tIGFib3J0aW5nIHRoZSBkZXBsb3kgYWZ0ZXIgcmVtb3RlIG1pZ3JhdGlvbnMgYWxyZWFkeSByYW4uXG4gICAgaWYgKHNlY3JldEtleXMubGVuZ3RoID4gMTAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYENsb3VkZmxhcmUgYWNjZXB0cyBhdCBtb3N0IDEwMCBzZWNyZXRzIHBlciBkZXBsb3ksIGJ1dCAke3NlY3JldEtleXMubGVuZ3RofSB3ZXJlIHNlbGVjdGVkLmApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBUaGUgQ0xJLXByb3ZpZGVkIFdCX1ZFUlNJT04gb3ZlcmxheXMgYSBjb25maWd1cmVkIHZhciBvZiB0aGUgc2FtZSBuYW1lIG9uIGRlcGxveSxcbiAgICAvLyBzbyBvbmx5IHRoZSBlZmZlY3RpdmUgdmFsdWUgcGFydGljaXBhdGVzIGluIHRoZSBsaW1pdCBjaGVja3MuXG4gICAgY29uc3QgZWZmZWN0aXZlVmFycyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXM8dW5rbm93bj4ocmVzb2x2ZWRDb25maWcudmFycykpO1xuICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OKSBlZmZlY3RpdmVWYXJzLnNldCgnV0JfVkVSU0lPTicsIHByb2plY3QuZW52LldCX1ZFUlNJT04pO1xuICAgIGNvbnN0IHZhckVudHJpZXMgPSBbLi4uZWZmZWN0aXZlVmFyc107XG4gICAgY29uc3QgY29tYmluZWRDb3VudCA9IG5ldyBTZXQoWy4uLnNlY3JldEtleXMsIC4uLnZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KV0pLnNpemU7XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiAxMjgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgQ2xvdWRmbGFyZSBhbGxvd3MgYXQgbW9zdCAxMjggdmFyaWFibGVzIGFuZCBzZWNyZXRzIGNvbWJpbmVkLCBidXQgJHtjb21iaW5lZENvdW50fSB3ZXJlIHNlbGVjdGVkLmApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDY0KSB7XG4gICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGAke2NvbWJpbmVkQ291bnR9IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBleGNlZWQgdGhlIEZyZWUgcGxhbidzIGxpbWl0IG9mIDY0LmApKTtcbiAgICB9XG4gICAgY29uc3Qgb3ZlcnNpemVkS2V5cyA9IFtcbiAgICAgIC4uLnNlY3JldEtleXMuZmlsdGVyKChrZXkpID0+IEJ1ZmZlci5ieXRlTGVuZ3RoKHNlY3JldHNba2V5XSA/PyAnJywgJ3V0ZjgnKSA+IDUgKiAxMDI0KSxcbiAgICAgIC4uLnZhckVudHJpZXNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoWywgdmFsdWVdKSA9PiBCdWZmZXIuYnl0ZUxlbmd0aCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSksICd1dGY4JykgPiA1ICogMTAyNFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpLFxuICAgIF07XG4gICAgaWYgKG92ZXJzaXplZEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFZhcmlhYmxlIG9yIHNlY3JldCB2YWx1ZXMgZXhjZWVkIENsb3VkZmxhcmUncyA1IEtCIGxpbWl0OiAke292ZXJzaXplZEtleXMuam9pbignLCAnKX1gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgIGBEZXBsb3lpbmcgJHtyZXNvbHZlZENvbmZpZy53b3JrZXJOYW1lID8/IHByb2plY3QubmFtZX0gKCR7ZW52TmFtZX0pIHdpdGggJHtzZWNyZXRLZXlzLmxlbmd0aH0gc2VjcmV0czogJHtzZWNyZXRLZXlzLmpvaW4oJywgJyl9YFxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyAyLiBCdWlsZCAodmluZXh0IGVtYmVkcyB0aGUgZW52aXJvbm1lbnQtYXBwbGllZCB3cmFuZ2xlciBjb25maWcgaW50byBkaXN0L3NlcnZlci93cmFuZ2xlci5qc29uKS5cbiAgICAvLyAgICBCdWlsZGluZyBiZWZvcmUgbWlncmF0aW5nIGtlZXBzIGEgYnVpbGQgZmFpbHVyZSBmcm9tIGxlYXZpbmcgYSBtaWdyYXRlZCBzY2hlbWEgYmVoaW5kXG4gICAgLy8gICAgdGhlIG9sZCBXb3JrZXIuIFBsYWluIFdvcmtlcnMgaGF2ZSBubyBidWlsZCBzdGVwOyB3cmFuZ2xlciBidW5kbGVzIHRoZSBlbnRyeSBpdHNlbGYuXG4gICAgY29uc3QgaXNWaW5leHQgPSAhIShwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udmluZXh0ID8/IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aW5leHQpO1xuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZBc3NpZ25tZW50ID0gcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb25cbiAgICAgID8gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnQ0xPVURGTEFSRV9FTlYnLCBlbnZOYW1lKX0gYFxuICAgICAgOiAnJztcbiAgICBpZiAoaXNWaW5leHQpIHtcbiAgICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OKSB7XG4gICAgICAgIHByb2plY3QuZW52Lk5FWFRfUFVCTElDX1dCX1ZFUlNJT04gfHw9IHByb2plY3QuZW52LldCX1ZFUlNJT047XG4gICAgICB9XG4gICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdZQVJOIHJ1biBnZW4tY29kZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke2Nsb3VkZmxhcmVFbnZBc3NpZ25tZW50fVlBUk4gdmluZXh0IGJ1aWxkYCwgcHJvamVjdCwgYXJndik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBsYWluIFdvcmtlcnMgYXJlIGZpcnN0IGNvbXBpbGVkIGJ5IHdyYW5nbGVyIGR1cmluZyB0aGUgZGVwbG95IGl0c2VsZjsgYSBkcnkgcnVuXG4gICAgICAvLyBzdXJmYWNlcyBjb21waWxlIGVycm9ycyAoZS5nLiBhIG1pc3NpbmcgZW50cnkgcG9pbnQpIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnNcbiAgICAgIC8vIGJlbG93IG11dGF0ZSB0aGUgZGF0YWJhc2UuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IGAgLS1lbnYgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGVudk5hbWUpfWAgOiAnJ31gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIEFwcGx5IEQxIG1pZ3JhdGlvbnMgdG8gdGhlIHJlbW90ZSBkYXRhYmFzZSB3aXRoIHRoZSBwcm9qZWN0J3Mgc2luZ2xlIG1pZ3JhdGlvblxuICAgIC8vICAgIG1lY2hhbmlzbSAod3JhbmdsZXItbmF0aXZlIHdoZW4gYSBtaWdyYXRpb25zIGRpcmVjdG9yeSBleGlzdHMsIGVsc2UgZHJpenpsZS1raXQgZm9yXG4gICAgLy8gICAgZHJpenpsZS1vcm0gYXBwcykuIE1pZ3JhdGlvbnMgbXVzdCBiZSBiYWNrd2FyZCBjb21wYXRpYmxlOiB0aGUgb2xkIFdvcmtlciBzZXJ2ZXNcbiAgICAvLyAgICB0cmFmZmljIHVudGlsIHRoZSBkZXBsb3kgYmVsb3cuXG4gICAgY29uc3QgZW52T3B0aW9uID0gcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBgIC0tZW52ICR7c2hlbGxFc2NhcGVBcmd1bWVudChlbnZOYW1lKX1gIDogJyc7XG4gICAgZm9yIChjb25zdCBkYXRhYmFzZSBvZiB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKSB7XG4gICAgICBjb25zdCBkYXRhYmFzZU5hbWUgPSBkYXRhYmFzZS5kYXRhYmFzZV9uYW1lID8/IGRhdGFiYXNlLmJpbmRpbmc7XG4gICAgICBpZiAoIWRhdGFiYXNlTmFtZSkgY29udGludWU7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBDST10cnVlIFlBUk4gd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseSAke3NoZWxsRXNjYXBlQXJndW1lbnQoZGF0YWJhc2VOYW1lKX0gLS1yZW1vdGUgLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtlbnZPcHRpb259YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRyaXp6bGVEMURhdGFiYXNlKSB7XG4gICAgICBpZiAoIWRyaXp6bGVEMURhdGFiYXNlLmRhdGFiYXNlX2lkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBUaGUgJHtlbnZOYW1lfSBEMSBiaW5kaW5nIGhhcyBubyBkYXRhYmFzZV9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFhY2NvdW50SWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAnQ0xPVURGTEFSRV9BQ0NPVU5UX0lEIChvciBhY2NvdW50X2lkIGluIHRoZSB3cmFuZ2xlciBjb25maWcpIGlzIHJlcXVpcmVkIGZvciByZW1vdGUgZHJpenpsZS1raXQgbWlncmF0aW9ucy4nXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAnbWlncmF0ZScsXG4gICAgICAgICAgYENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ9JHtkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZH0gQ0xPVURGTEFSRV9BQ0NPVU5UX0lEPSR7YWNjb3VudElkfWBcbiAgICAgICAgKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA0LiBEZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5IChubyBwb3N0LWRlcGxveSBzZWNyZXQgcHVzaCB0aGF0IGNvdWxkIGxlYXZlIHRoZVxuICAgIC8vICAgIG5ldyB2ZXJzaW9uIHJ1bm5pbmcgd2l0aG91dCDigJQgb3Igd2l0aCBzdGFsZSDigJQgc2VjcmV0cykuIFRoZSBzZWNyZXRzIEpTT04gZ29lcyB0aHJvdWdoXG4gICAgLy8gICAgYSBtb2RlLTA2MDAgZmlsZSBpbiBhIHByaXZhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBkZWxldGVkIHJpZ2h0IGFmdGVyIHRoZSBkZXBsb3k6XG4gICAgLy8gICAgL2Rldi9zdGRpbiBpcyBOT1QgcmVsaWFibGUgaGVyZSBiZWNhdXNlIHdyYW5nbGVyIHJlYWRzIHRoZSBzZWNyZXRzIGZpbGUgb25seSBhZnRlclxuICAgIC8vICAgIHVwbG9hZGluZyBhc3NldHMsIGJ5IHdoaWNoIHBvaW50IHRoZSBwaXBlZCBzdGRpbiBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY29uc3VtZWQg4oCUXG4gICAgLy8gICAgb2JzZXJ2ZWQgYXMgYSBmbGFreSBgQ291bGQgbm90IHJlYWQgZmlsZTogL2Rldi9zdGRpbmAgb24gQ0kuIEV4cGxpY2l0bHkgZW1wdHkgdmFsdWVzXG4gICAgLy8gICAgc3RheSBpbiB0aGUgcGF5bG9hZDogLS1zZWNyZXRzLWZpbGUgaXMgYWRkaXRpdmUsIHNvIHB1c2hpbmcgJycgaXMgdGhlIG9ubHkgd2F5IHRvXG4gICAgLy8gICAgY2xlYXIgYSBzdGFsZSBzZWNyZXQuXG4gICAgY29uc3QgZGVwbG95Q29uZmlnUGF0aCA9IGlzVmluZXh0ID8gcGF0aC5qb2luKCdkaXN0JywgJ3NlcnZlcicsICd3cmFuZ2xlci5qc29uJykgOiB3cmFuZ2xlckNvbmZpZ1BhdGg7XG4gICAgaWYgKGlzVmluZXh0ICYmICFhcmd2LmRyeVJ1biAmJiAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkZXBsb3lDb25maWdQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGAke2RlcGxveUNvbmZpZ1BhdGh9IG5vdCBmb3VuZDsgdGhlIHZpbmV4dCBidWlsZCBkaWQgbm90IHByb2R1Y2UgYSBkZXBsb3kgY29uZmlnLmApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZGVwbG95QXJncyA9IFtcbiAgICAgICdkZXBsb3knLFxuICAgICAgJy0tY29uZmlnJyxcbiAgICAgIGRlcGxveUNvbmZpZ1BhdGgsXG4gICAgICAvLyB2aW5leHQncyBidWlsdCBjb25maWcgYWxyZWFkeSBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQ7IHBhc3NpbmcgLS1lbnYgdGhlcmUgd291bGRcbiAgICAgIC8vIGFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXggdHdpY2UuXG4gICAgICAuLi4oIWlzVmluZXh0ICYmIHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gWyctLWVudicsIGVudk5hbWVdIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuZW52LldCX1ZFUlNJT04gPyBbJy0tdmFyJywgYFdCX1ZFUlNJT046JHtwcm9qZWN0LmVudi5XQl9WRVJTSU9OfWBdIDogW10pLFxuICAgICAgJy0tc2VjcmV0cy1maWxlJyxcbiAgICBdO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2RlcGxveUFyZ3Muam9pbignICcpfSA8dGVtcG9yYXJ5IHNlY3JldHMgZmlsZT5gKSk7XG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgLy8gUmVhZGluZyBiaW5FeGlzdHMgcHJlcGVuZHMgbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8gcHJvamVjdC5lbnYuUEFUSCxcbiAgICAgIC8vIHNvIHRoZSBkaXJlY3QgKG5vbi1zaGVsbCkgd3JhbmdsZXIgc3Bhd24gYmVsb3cgcmVzb2x2ZXMgdGhlIGxvY2FsIGJpbmFyeS5cbiAgICAgIGlmICghcHJvamVjdC5iaW5FeGlzdHMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnbm9kZV9tb2R1bGVzLy5iaW4gbm90IGZvdW5kOyByZWx5aW5nIG9uIFBBVEggdG8gcmVzb2x2ZSB3cmFuZ2xlci4nKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXBsb3lFbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gICAgICBkZWxldGUgZGVwbG95RW52LkNMT1VERkxBUkVfRU5WO1xuICAgICAgLy8gMG83MDAgZGlyZWN0b3J5ICsgMG82MDAgZmlsZTogcmVhZGFibGUgb25seSBieSB0aGUgZGVwbG95aW5nIHVzZXIsIGxpa2UgdGhlIGRvdGVudlxuICAgICAgLy8gZmlsZXMgdGhlIENJIHdvcmtmbG93IGFscmVhZHkgd3JpdGVzIG5leHQgdG8gaXQuIHdyYW5nbGVyIHJ1bnMgdGhyb3VnaCBhbiBhc3luYyBzcGF3blxuICAgICAgLy8gKHNwYXduU3luYyB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCwgc28gYSBzaHV0ZG93biBzaWduYWwgd291bGQga2lsbCB0aGUgcHJvY2Vzc1xuICAgICAgLy8gYmVmb3JlIGFueSBjbGVhbnVwKSBhbmQgdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIGluIGEgZmluYWxseSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgICAgIC8vIGRlcGxveSBjYW5ub3QgbGVhdmUgdGhlIHBsYWludGV4dCBzZWNyZXRzIGJlaGluZC4gU2h1dGRvd24gaGFuZGxpbmcgZGV0YWlsczpcbiAgICAgIC8vIC0gSGFuZGxlcnMgKGluY2x1ZGluZyBTSUdIVVAsIG9uIHdoaWNoIE5vZGUgYWxzbyB0ZXJtaW5hdGVzIGJ5IGRlZmF1bHQpIGFyZSBpbnN0YWxsZWRcbiAgICAgIC8vICAgQkVGT1JFIHRoZSBmaWxlIGlzIHdyaXR0ZW4gYW5kIHVzZSBwcm9jZXNzLm9uLCBub3Qgb25jZSwgc28gYSByZXBlYXRlZCBzaWduYWwgY2Fubm90XG4gICAgICAvLyAgIGZhbGwgYmFjayB0byBkZWZhdWx0IHRlcm1pbmF0aW9uIGFuZCBieXBhc3MgdGhlIGZpbmFsbHkgY2xlYW51cC5cbiAgICAgIC8vIC0gU0lHSFVQL1NJR1FVSVQgYXJlIGZvcndhcmRlZCB0byB3cmFuZ2xlciBhcyBTSUdURVJNOiB3cmFuZ2xlcidzIGxhdW5jaGVyIHJlbGF5cyBvbmx5XG4gICAgICAvLyAgIFNJR0lOVC9TSUdURVJNIHRvIGl0cyBpbm5lciBOb2RlIHByb2Nlc3MsIGFuZCBhbnl0aGluZyBlbHNlIHdvdWxkIG9ycGhhbiBhIGRlcGxveW1lbnRcbiAgICAgIC8vICAgdGhhdCBrZWVwcyBtdXRhdGluZyB0aGUgcmVtb3RlIFdvcmtlciBhZnRlciB3YiBleGl0cy5cbiAgICAgIC8vIC0gVGhlIHJlLXJhaXNlIGJlbG93IHVzZXMgdGhlIHNpZ25hbCB3YiBpdHNlbGYgcmVjZWl2ZWQ6IHdyYW5nbGVyIGNhdGNoZXMgU0lHSU5UIGFuZFxuICAgICAgLy8gICBleGl0cyBudW1lcmljYWxseSAoZS5nLiAxNDMpLCB3aGljaCBtdXN0IG5vdCBtYXNxdWVyYWRlIGFzIGFuIG9yZGluYXJ5IGZhaWx1cmUuXG4gICAgICBjb25zdCBzZWNyZXRzRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLWRlcGxveS0nKSk7XG4gICAgICBjb25zdCBzaHV0ZG93blNpZ25hbHMgPSBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBsZXQgd3JhbmdsZXJQcm9jZXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWNlaXZlZFNodXRkb3duU2lnbmFsID8/PSBzaWduYWw7XG4gICAgICAgICAgaWYgKHdyYW5nbGVyUHJvY2Vzcykge1xuICAgICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLmtpbGwoc2lnbmFsID09PSAnU0lHSU5UJyB8fCBzaWduYWwgPT09ICdTSUdURVJNJyA/IHNpZ25hbCA6ICdTSUdURVJNJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIFdpdGggdGhlIGhhbmRsZXJzIHJlbW92ZWQsIHJlLXJhaXNpbmcgdHJpZ2dlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbGV0IGRlcGxveVN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VjcmV0c0ZpbGVQYXRoID0gcGF0aC5qb2luKHNlY3JldHNEaXJQYXRoLCAnc2VjcmV0cy5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2VjcmV0c0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZWNyZXRzKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICAgICAgZGVwbG95U3RhdHVzID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2VzcyA9IHNwYXduKCd3cmFuZ2xlcicsIFsuLi5kZXBsb3lBcmdzLCBzZWNyZXRzRmlsZVBhdGhdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGVudjogZGVwbG95RW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHNpZ25hbCA/IDEgOiAoY29kZSA/PyB1bmRlZmluZWQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBwcm9jZXNzLmV4aXQgc2tpcHMgZmluYWxseSBibG9ja3MsIHNvIHRoZSBleGl0LW9uLWZhaWx1cmUgYmVsb3cgc3RheXMgb3V0c2lkZS5cbiAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2VpdmVkU2h1dGRvd25TaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2Ugc28gdGhlIGNhbGxlciBvYnNlcnZlcyB0aGUgc2FtZSBzaWduYWwtZGVyaXZlZCBleGl0IHN0YXR1cy5cbiAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNodXRkb3duU2lnbmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRlcGxveVN0YXR1cyAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgd3JhbmdsZXIgZGVwbG95IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2RlcGxveVN0YXR1cyA/PyAndW5rbm93bid9LmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGRlcGxveVN0YXR1cyA/PyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LiBPcHRpb25hbCBwb3N0LWRlcGxveSBob29rIChlLmcuIHNlZWRpbmcgdGhlIHJlbW90ZSBEMSB2aWEgZHJpenpsZSdzIGQxLWh0dHAgZHJpdmVyKS5cbiAgICAvLyAgICBBc3NpZ24gdGhlIHJlc29sdmVkIGlkcyB1bmNvbmRpdGlvbmFsbHk6IGEgc3RhbGUgZXhwb3J0ZWQgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRFxuICAgIC8vICAgIG11c3Qgbm90IHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvcG9zdCddKSB7XG4gICAgICAvLyBUaGUgaWQgaXMgdW5hbWJpZ3VvdXMgb25seSB3aXRoIGEgc2luZ2xlIEQxIGJpbmRpbmc7IHdpdGggbXVsdGlwbGUsIHRoZSBob29rIG11c3RcbiAgICAgIC8vIHJlc29sdmUgaXRzIHRhcmdldCBpdHNlbGYuIENsZWFyIGZpcnN0IGVpdGhlciB3YXk6IGEgc3RhbGUgaW5oZXJpdGVkIGlkIG11c3Qgbm90XG4gICAgICAvLyByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgICAgY29uc3QgaG9va0QxRGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ7XG4gICAgICBpZiAocmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdNdWx0aXBsZSBEMSBiaW5kaW5ncyBleGlzdDsgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCBpcyBub3Qgc2V0IGZvciBkZXBsb3kvcG9zdC4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoaG9va0QxRGF0YWJhc2U/LmRhdGFiYXNlX2lkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEID0gaG9va0QxRGF0YWJhc2UuZGF0YWJhc2VfaWQ7XG4gICAgICBpZiAoYWNjb3VudElkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQgPSBhY2NvdW50SWQ7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9wb3N0JywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNlY3JldHMgdG8gcHVzaCB0byB0aGUgV29ya2VyIGZyb20gdGhlIGRvdGVudi1sb2FkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogZXZlcnkgZXhwbGljaXRseSBzZXQgdmFsdWUg4oCUIGluY2x1ZGluZyBlbXB0eSBzdHJpbmdzLCB3aGljaCBjbGVhciBzdGFsZSByZW1vdGUgc2VjcmV0c1xuICogc2luY2UgYHdyYW5nbGVyIGRlcGxveSAtLXNlY3JldHMtZmlsZWAgaXMgYWRkaXRpdmUg4oCUIGV4Y2VwdCB3cmFuZ2xlciBgdmFyc2AgKGEgc2VjcmV0IG1heVxuICogbm90IHNoYXJlIGEgbmFtZSB3aXRoIGEgdmFyKSwgZGVwbG95LWNvbnRyb2wga2V5cywgYW5kIGxvY2FsIGBmaWxlOmAgREFUQUJBU0VfVVJMcy5cbiAqIFJldHVybnMgdGhlIHJlcXVpcmVkIGtleXMgKGZyb20gLmVudi5leGFtcGxlKSB0aGF0IGFyZSBzdGlsbCBlbXB0eSBzbyB0aGUgZGVwbG95IGNhblxuICogYWJvcnQgYmVmb3JlIGFueSByZW1vdGUgbXV0YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RXb3JrZXJTZWNyZXRzKFxuICBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBjb25maWdWYXJLZXlzOiBzdHJpbmdbXSxcbiAgcmVxdWlyZWRLZXlzOiBzdHJpbmdbXVxuKTogeyBtaXNzaW5nS2V5czogc3RyaW5nW107IHNlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSB7XG4gIGNvbnN0IGNvbmZpZ0tleXMgPSBuZXcgU2V0KGNvbmZpZ1ZhcktleXMpO1xuICBjb25zdCBzZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgY29uZmlnS2V5cy5oYXMoa2V5KSB8fCBpc05vblNlY3JldEtleShrZXkpKSBjb250aW51ZTtcbiAgICBpZiAoa2V5ID09PSAnREFUQUJBU0VfVVJMJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdmaWxlOicpKSBjb250aW51ZTtcbiAgICBzZWNyZXRzW2tleV0gPSB2YWx1ZTtcbiAgfVxuICBjb25zdCBtaXNzaW5nS2V5cyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoKGtleSkgPT4gIWNvbmZpZ0tleXMuaGFzKGtleSkgJiYgIWlzTm9uU2VjcmV0S2V5KGtleSkgJiYgIWVudlZhcnNba2V5XSk7XG4gIHJldHVybiB7IG1pc3NpbmdLZXlzLCBzZWNyZXRzIH07XG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmludGVyZmFjZSBQYXJzZWREb3RlbnZBcmdzIHtcbiAgY29tbWFuZDogc3RyaW5nW107XG59XG5cbmNvbnN0IHNodXRkb3duU2lnbmFscyA9IG5ldyBTZXQ8Tm9kZUpTLlNpZ25hbHM+KFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKTtcblxuZXhwb3J0IGNvbnN0IGRvdGVudkNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdkb3RlbnYgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ0xvYWQgLmVudiBmaWxlcyBhbmQgcnVuIGEgY29tbWFuZC4nLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+IHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHJ1blBhcnNlZERvdGVudkNvbW1hbmQoZ2V0UGFyc2VkRG90ZW52QXJnc0Zyb21ZYXJncyhhcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuRG90ZW52Q29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5QYXJzZWREb3RlbnZDb21tYW5kKHBhcnNlRG90ZW52QXJncyhhcmdzKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blBhcnNlZERvdGVudkNvbW1hbmQoeyBjb21tYW5kIH06IFBhcnNlZERvdGVudkFyZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNvbW1hbmQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcignVXNhZ2U6IHdiIGRvdGVudiAtLSA8Y29tbWFuZD4gW2FyZ3MuLi5dJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgY3dkID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpO1xuICByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QpO1xuICBjb25zdCBiZXJyeUJpbkZvbGRlclBhdGggPSBwcm9jZXNzLmVudi5CRVJSWV9CSU5fRk9MREVSO1xuICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICAvLyBTdHJpcHBpbmcgeWFybidzIGVudmlyb25tZW50IGFsc28gcmVtb3ZlcyBpdHMgdGVtcG9yYXJ5IGJpbiBmb2xkZXIg4oCUIHRoZSBPTkxZIHBsYWNlXG4gIC8vIHlhcm4gQmVycnkgZXhwb3NlcyBkZXBlbmRlbmN5IGV4ZWN1dGFibGVzIOKAlCBzbyByZXN0b3JlIHRoZSBwcm9qZWN0J3Mgb3duXG4gIC8vIG5vZGVfbW9kdWxlcy8uYmluIGRpcmVjdG9yaWVzIHRvIGtlZXAgYmFyZSBiaW5hcnkgbmFtZXMgcmVzb2x2YWJsZS4gUGx1ZyduJ1BsYXkgaW5zdGFsbHNcbiAgLy8gY3JlYXRlIG5vIG5vZGVfbW9kdWxlcyBhdCBhbGw7IHRoZSB0ZW1wb3JhcnkgYmluIGZvbGRlciBpcyB0aGVuIHRoZSBzb2xlIHNvdXJjZSBvZlxuICAvLyBkZXBlbmRlbmN5IGV4ZWN1dGFibGVzLCBzbyByZXN0b3JlIGl0IGluc3RlYWQuXG4gIC8vIFRoZSB0ZW1wb3JhcnkgZm9sZGVyIGlzIGRlbGliZXJhdGVseSBOT1QgcmVzdG9yZWQgd2hlbiAuYmluIGRpcmVjdG9yaWVzIGV4aXN0OiBpdCBhbHNvXG4gIC8vIGNvbnRhaW5zIG5vZGUveWFybiBzaGltcywgYW5kIGEgbGVha2VkIG5vZGUgc2hpbSB3b3VsZCB2aW9sYXRlIHdiJ3MgcmVhbC1Ob2RlIGd1YXJhbnRlZVxuICAvLyBmb3IgdG9vbHMgbGlrZSB3cmFuZ2xlci92aW5leHQuIENoaWxkIGB5YXJuYCBpbnZvY2F0aW9ucyBzdGF5IHJlc29sdmFibGUgdGhyb3VnaCB0aGVcbiAgLy8gbGF1bmNoZXIgb24gdGhlIGJhc2UgUEFUSCAobWlzZS9jb3JlcGFjayksIHdoaWNoIGV2ZXJ5IHN1cHBvcnRlZCBlbnZpcm9ubWVudCBoYXMg4oCUXG4gIC8vIG5vdGhpbmcgY291bGQgaGF2ZSBzdGFydGVkIGB5YXJuIHJ1bmAvYHdiIGRvdGVudmAgd2l0aG91dCBpdC5cbiAgaWYgKCFwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgoY3dkLCBwcm9jZXNzLmVudikgJiYgYmVycnlCaW5Gb2xkZXJQYXRoKSB7XG4gICAgcHJvY2Vzcy5lbnYuUEFUSCA9IHByb2Nlc3MuZW52LlBBVEggPyBgJHtiZXJyeUJpbkZvbGRlclBhdGh9OiR7cHJvY2Vzcy5lbnYuUEFUSH1gIDogYmVycnlCaW5Gb2xkZXJQYXRoO1xuICB9XG5cbiAgY29uc3QgY2hpbGQgPSBzcGF3bihjb21tYW5kWzBdISwgY29tbWFuZC5zbGljZSgxKSwge1xuICAgIGN3ZCxcbiAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gIGxldCBmb3J3YXJkZWRTaHV0ZG93blNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNodXRkb3duU2lnbmFscykge1xuICAgIGNvbnN0IHNpZ25hbEhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBmb3J3YXJkZWRTaHV0ZG93blNpZ25hbCA9IHNpZ25hbDtcbiAgICAgIGNoaWxkLmtpbGwoc2lnbmFsKTtcbiAgICB9O1xuICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgIHByb2Nlc3Mub25jZShzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICB9XG4gIGNoaWxkLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgIH1cbiAgICBpZiAoc2lnbmFsICYmIHNpZ25hbCA9PT0gZm9yd2FyZGVkU2h1dGRvd25TaWduYWwpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoY29kZSA/PyAxKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFBhcnNlZERvdGVudkFyZ3NGcm9tWWFyZ3MoYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlKTogUGFyc2VkRG90ZW52QXJncyB7XG4gIHJldHVybiB7XG4gICAgY29tbWFuZDogW1xuICAgICAgLi4uKChhcmd2LmFyZ3MgYXMgdW5rbm93bltdIHwgdW5kZWZpbmVkKSA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgICAuLi4oKGFyZ3ZbJy0tJ10gYXMgdW5rbm93bltdIHwgdW5kZWZpbmVkKSA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEb3RlbnZBcmdzKGFyZ3M6IHN0cmluZ1tdKTogUGFyc2VkRG90ZW52QXJncyB7XG4gIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gYXJncy5pbmRleE9mKCctLScpO1xuICByZXR1cm4geyBjb21tYW5kOiBzZXBhcmF0b3JJbmRleCA9PT0gLTEgPyBhcmdzIDogYXJncy5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpIH07XG59XG5cbmZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHBhcnNlZCA9IHtcbiAgICAuLi5jb25maWcoeyBwYXRoOiBwYXRoLmpvaW4oY3dkLCAnLmVudicpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkLFxuICAgIC4uLihwcm9jZXNzLmVudi5XQl9FTlZcbiAgICAgID8gKGNvbmZpZyh7IHBhdGg6IHBhdGguam9pbihjd2QsIGAuZW52LiR7cHJvY2Vzcy5lbnYuV0JfRU5WfWApLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9KVxuICAgICAgOiB7fSksXG4gIH07XG4gIGNvbnN0IGVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQsIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyBwYXJzZWQ7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBGSUxFX1NDSEVNQSwgZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5jb25zdCBQT1NTSUJMRV9QUklTTUFfUEFUSFMgPSBbXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG5dO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYCBvciBgWUFSTiBibGl0eiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNsZWFuVXBDb21tYW5kID0gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBDbGVhbnVwIGV4aXN0aW5nIGFydGlmYWN0cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBMaXRlc3RyZWFtIHJlcGxpY2F0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCBkb24ndCBtZXJnZSBtdWx0aXBsZSBybSBjb21tYW5kcyBpbnRvIG9uZSwgYmVjYXVzZSBpZiBvbmUgZmFpbHMsIHRoZSBzdWJzZXF1ZW50IG9uZXMgd29uJ3QgcnVuLlxuICAgIHJldHVybiBgJHtjbGVhblVwQ29tbWFuZH07IHJtIC1SZiAke2RpclBhdGh9Ly5wcm9kLnNxbGl0ZTMqIHx8IHRydWVgO1xuICB9XG5cbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGdlbmVyYXRlKF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBbJ1BSSVNNQSBnZW5lcmF0ZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnT3B0aW9uID0gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KTtcbiAgICAvLyBgcHJpc21hIG1pZ3JhdGUgcmVzZXRgIGNhbiBmYWlsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFiYXNlLCBzbyB3ZSByZW1vdmUgaXQgZmlyc3QuXG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgJHtsaXRlc3RyZWFtQ29uZmlnT3B0aW9ufSAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmICR7dGhpcy5nZW5lcmF0ZShwcm9qZWN0KX0gJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY2xlYW51cENvbW1hbmQgPSBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0KTtcbiAgICBpZiAoY2xlYW51cENvbW1hbmQpIHN0ZXBzLnB1c2goY2xlYW51cENvbW1hbmQpO1xuICAgIGNvbnN0IHJlc2V0Q29tbWFuZCA9IFsnUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIHN0ZXBzLnB1c2gocmVzZXRDb21tYW5kKTtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSB7XG4gICAgICAvLyBCbGl0eiBkb2VzIG5vdCB0cmlnZ2VyIHNlZWQgYXV0b21hdGljYWxseSwgc28gd2UgbmVlZCB0byBydW4gaXQgbWFudWFsbHkuXG4gICAgICBzdGVwcy5wdXNoKHRoaXMuc2VlZChwcm9qZWN0KSk7XG4gICAgfVxuICAgIHJldHVybiBzdGVwcy5maWx0ZXIoQm9vbGVhbikuam9pbignICYmICcpO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBvdXRwdXRQYXRoOiBzdHJpbmcsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtvdXRwdXRQYXRofSo7IGxpdGVzdHJlYW0gcmVzdG9yZSAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCwgY29uZmlnUGF0aCl9IC1vICR7b3V0cHV0UGF0aH0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uc2VlZCkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgICAgIGlmIChiYXNlRGlyKSB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIsIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8gJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgcmV0dXJuIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYi9tb3VudCcgOiAncHJpc21hL21vdW50Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFBPU1NJQkxFX1BSSVNNQV9QQVRIUy5maW5kKCh7IHNjaGVtYVBhdGggfSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBzY2hlbWFQYXRoKSkpXG4gICAgPy5kYlBhdGg7XG59XG5cbmZ1bmN0aW9uIGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWdQYXRoKSByZXR1cm4gYC1jb25maWcgXCIke2NvbmZpZ1BhdGh9XCJgO1xuXG4gIGNvbnN0IGxvY2FsQ29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsQ29uZmlnUGF0aCkpIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG4gIGlmIChmcy5leGlzdHNTeW5jKERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCkpIHJldHVybiBgLWNvbmZpZyAke0RFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSH1gO1xuICByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3RGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRHJpenpsZUNvbmZpZywgd3JhcFdpdGhEcml6emxlQ29uZmlnRGlyIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgZ2VuQ29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdnZW4tY29kZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgY29kZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VuQ29kZVRhcmdldHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgICAgLm1hcCgocHJvamVjdCkgPT4gKHsgcHJvamVjdCwgc2NyaXB0czogZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdCkgfSkpXG4gICAgICAuZmlsdGVyKCh7IHNjcmlwdHMgfSkgPT4gc2NyaXB0cy5sZW5ndGggPiAwKTtcbiAgICBpZiAoZ2VuQ29kZVRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCwgc2NyaXB0cyB9IG9mIGdlbkNvZGVUYXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJnZW4tY29kZVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG4gICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBzY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwcmlzbWFHZW5lcmF0ZVNjcmlwdCA9IGdldFByaXNtYUdlbmVyYXRlU2NyaXB0KHByb2plY3QpO1xuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpICYmIHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgIHNjcmlwdHMucHVzaCgnWUFSTiBibGl0eiBjb2RlZ2VuJyk7XG4gICAgaWYgKHByaXNtYUdlbmVyYXRlU2NyaXB0KSB7XG4gICAgICBzY3JpcHRzLnB1c2gocHJpc21hR2VuZXJhdGVTY3JpcHQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwcmlzbWFHZW5lcmF0ZVNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChwcmlzbWFHZW5lcmF0ZVNjcmlwdCk7XG4gIH1cblxuICBjb25zdCBjaGFrcmFUeXBlZ2VuU2NyaXB0ID0gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3QpO1xuICBpZiAoY2hha3JhVHlwZWdlblNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChjaGFrcmFUeXBlZ2VuU2NyaXB0KTtcbiAgfVxuXG4gIGNvbnN0IGRyaXp6bGVDaGVja1NjcmlwdCA9IHNjcmlwdHMubGVuZ3RoID09PSAwID8gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3QpIDogdW5kZWZpbmVkO1xuICBpZiAoZHJpenpsZUNoZWNrU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGRyaXp6bGVDaGVja1NjcmlwdCk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzU2NyaXB0ID0gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3QpO1xuICBpZiAoZ2VuSTE4blRzU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGdlbkkxOG5Uc1NjcmlwdCk7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbkkxOG5Uc1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSB7XG4gICAgaWYgKCFwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHJldHVybjtcbiAgICByZXR1cm4gJ1lBUk4gcnVuIGdlbi1pMThuLXRzJztcbiAgfVxuICBpZiAoXG4gICAgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdnZW4taTE4bi10cycpICYmXG4gICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnaTE4bicpKVxuICApIHtcbiAgICByZXR1cm4gJ1lBUk4gZ2VuLWkxOG4tdHMgLWkgaTE4biAtbyBzcmMvX19nZW5lcmF0ZWRfXy9pMThuLnRzIC1kIGphLUpQJztcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUdlbmVyYXRlU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzUHJpc21hKSByZXR1cm47XG4gIGlmICghaGFzUHJpc21hU2NoZW1hKHByb2plY3QpKSByZXR1cm47XG4gIHJldHVybiBwcmlzbWFTY3JpcHRzLmdlbmVyYXRlKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBnZXRDaGFrcmFTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdAY2hha3JhLXVpL2NsaScpKSByZXR1cm47XG5cbiAgaWYgKGdldE93bkRlcGVuZGVuY3lNYWpvcihwcm9qZWN0LCAnQGNoYWtyYS11aS9jbGknKSA9PT0gMikge1xuICAgIHJldHVybiAnWUFSTiBjaGFrcmEtY2xpIHRva2VucyBzcmMvY29yZS90aGVtZS50cyc7XG4gIH1cbiAgaWYgKGZpbGVFeGlzdHMocHJvamVjdCwgJ3NyYy90aGVtZS50cycpKSB7XG4gICAgcmV0dXJuICdZQVJOIGNoYWtyYSB0eXBlZ2VuIHNyYy90aGVtZS50cyAtLXN0cmljdCc7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBnZXREcml6emxlQ2hlY2tTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNEcml6emxlKSByZXR1cm47XG4gIGNvbnN0IGNvbmZpZyA9IGZpbmREcml6emxlQ29uZmlnKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuICAvLyBLZWVwIHRoZSBleHBsaWNpdCAtLWNvbmZpZyBiZWNhdXNlIGRyaXp6bGUta2l0J3MgZGVmYXVsdCBsb29rdXAgbWlzc2VzIHNvbWUgZXh0ZW5zaW9ucyAoZS5nLiAubXRzKS5cbiAgcmV0dXJuIGAke3dyYXBXaXRoRHJpenpsZUNvbmZpZ0Rpcihwcm9qZWN0LCBgWUFSTiBkcml6emxlLWtpdCBjaGVjayAtLWNvbmZpZyAke2NvbmZpZy5maWxlTmFtZX1gKX0gfHwgdHJ1ZWA7XG59XG5cbmZ1bmN0aW9uIGdldE93bkRlcGVuZGVuY3lNYWpvcihwcm9qZWN0OiBQcm9qZWN0LCBwYWNrYWdlTmFtZTogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICBjb25zdCB2ZXJzaW9uID1cbiAgICBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV07XG4gIGNvbnN0IG1ham9yID0gdmVyc2lvbj8ubWF0Y2goL1xcZCsvdSk/LlswXTtcbiAgcmV0dXJuIG1ham9yID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBOdW1iZXIobWFqb3IpO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaGFzUHJpc21hU2NoZW1hKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsncHJpc21hL3NjaGVtYS5wcmlzbWEnLCAncHJpc21hL3NjaGVtYScsICdkYi9zY2hlbWEucHJpc21hJ10uc29tZSgoZmlsZVBhdGgpID0+XG4gICAgZmlsZUV4aXN0cyhwcm9qZWN0LCBmaWxlUGF0aClcbiAgKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlLCBvdXRwdXQpKSByZXR1cm47XG5cbiAgY29uc3Qgbm9ybWFsaXplZE91dHB1dCA9IG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dCk7XG4gIGlmIChub3JtYWxpemVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobm9ybWFsaXplZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBleGl0Q29kZSAhPT0gMCB8fCBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvdXRwdXQudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFxid2Fybig/OmluZyk/cz9cXGIvaS50ZXN0KG91dHB1dC5yZXBsYWNlQWxsKC9cXGIoPzowfG5vKSB3YXJuaW5ncz9cXGIvZ2ksICcnKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBCdWZmZXJlZFJ1blJlc3VsdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVNjcmlwdCwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByaW50QnVmZmVyZWRPdXRwdXQsIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQgfSBmcm9tICcuLi91dGlscy9vdXRwdXQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBxdWlldDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVwb3J0IGVycm9ycyBvbmx5JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUHJpbnQgb25seSBmYWlsZWQgb3Igd2FybmluZyBjb21tYW5kIG91dHB1dCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8XG4gIHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyXG4+O1xuZXhwb3J0IHR5cGUgTGludENvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPExpbnRDb21tYW5kT3B0aW9ucz4gJiB7XG4gICctLSc/OiB1bmtub3duW107XG4gIF86IHVua25vd25bXTtcbiAgcHJpbnRBbGxPdXRwdXQ/OiBib29sZWFuO1xufTtcblxuY29uc3Qgb3hsaW50RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10pO1xuY29uc3QgcHl0aG9uRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydweSddKTtcbmNvbnN0IGRhcnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2RhcnQnXSk7XG5jb25zdCBydXN0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydycyddKTtcbmNvbnN0IG94Zm10RXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAuLi5veGxpbnRFeHRlbnNpb25zLFxuICAnY3NzJyxcbiAgJ2dxbCcsXG4gICdncmFwaHFsJyxcbiAgJ2hicycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2xlc3MnLFxuICAnbWQnLFxuICAnbWR4JyxcbiAgJ3Njc3MnLFxuICAndG9tbCcsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnamF2YScsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhb3hmbXRFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5jb25zdCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuID0gJyEqKi90ZXN0ey0sL31maXh0dXJlcy8qKic7XG5cbnR5cGUgQnVmZmVyZWRMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRSdW5SZXN1bHQgJiB7IGNvbW1hbmQ6IHN0cmluZzsgY3dkOiBzdHJpbmcgfTtcbnR5cGUgTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCB8IHsgZXhpdENvZGU6IG51bWJlciB9O1xuaW50ZXJmYWNlIExpbnRSdW5Db21tYW5kIHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xufVxuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTGludENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBsaW50KGFyZ3YgYXMgTGludENvbW1hbmRBcmd2KTtcbiAgICBpZiAoZXhpdENvZGUpIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludChhcmd2OiBMaW50Q29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdldExpbnRUYXJnZXRGaWxlcyhhcmd2KTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIC8vIGBjYXJnbyBmbXQgLS1hbGxgIGFsd2F5cyBmb3JtYXRzIHRoZSB3aG9sZSB3b3Jrc3BhY2UsIHNvIHdlIHRyYWNrIHRhcmdldFxuICAvLyBwcm9qZWN0cyByYXRoZXIgdGhhbiBpbmRpdmlkdWFsIGZpbGUgcGF0aHMuIEV2ZXJ5IHByb2plY3Qgd2l0aCBpdHMgb3duXG4gIC8vIGBDYXJnby50b21sYCBydW5zIGl0cyBvd24gYGNhcmdvIGZtdCAtLWFsbGA7IHdlIGludGVudGlvbmFsbHkgZG8gbm90IGRlZHVwXG4gIC8vIGJ5IGRpcmVjdG9yeS4gQSBuZXN0ZWQgb3Igc2libGluZyBjcmF0ZSBjYW4gYmUgYW4gaW5kZXBlbmRlbnQgQ2FyZ29cbiAgLy8gd29ya3NwYWNlIHRoYXQgYSBwYXJlbnQncyBgY2FyZ28gZm10IC0tYWxsYCBuZXZlciByZWFjaGVzLCBzbyBza2lwcGluZyBpdFxuICAvLyB3b3VsZCBsZWF2ZSBpdCB1bmZvcm1hdHRlZCwgd2hpbGUgYW55IGdlbnVpbmVseSBvdmVybGFwcGluZyBydW5zIGFyZVxuICAvLyBoYXJtbGVzcyBiZWNhdXNlIHJ1c3RmbXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgaWRlbXBvdGVudC4gRGVkdXBpbmcgYnkgcmVhbFxuICAvLyB3b3Jrc3BhY2UgbWVtYmVyc2hpcCB3b3VsZCByZXF1aXJlIGludm9raW5nIGBjYXJnbyBsb2NhdGUtcHJvamVjdGAuXG4gIGNvbnN0IGNhcmdvRm9ybWF0UHJvamVjdHMgPSBuZXcgU2V0PFByb2plY3Q+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzQ2FyZ29Ub21sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcnVzdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY2FyZ29Gb3JtYXRQcm9qZWN0cy5hZGQocHJvamVjdCk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIHByZXNlcnZlQ29sb3I6ICFhcmd2LnByaW50QWxsT3V0cHV0IH0gYXMgY29uc3Q7XG4gIGNvbnN0IHNob3VsZFJ1bkZvcm1hdHRlcnMgPSBCb29sZWFuKGFyZ3YuZm9ybWF0KTtcbiAgY29uc3Qgc2hvdWxkUnVuTGludGVycyA9ICFhcmd2LmZvcm1hdCB8fCBhcmd2LmZpeDtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndiwgbGludEZpbGVQYXRocyk7XG4gICAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgcHl0aG9uRmlsZVBhdGhzXSBvZiBweXRob25GaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3YsIHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGRhcnRGaWxlUGF0aHNdIG9mIGRhcnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIGNhcmdvRm9ybWF0UHJvamVjdHMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkQ2FyZ29Gb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBveGZtdEZpbGVQYXRoc10gb2Ygb3hmbXRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKG94Zm10RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgaWYgKGxpbnRDb21tYW5kKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzQ2FyZ29Ub21sKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRDYXJnb0Zvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludEV4aXRDb2RlczogbnVtYmVyW10gPSBbXTtcblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGNvbnN0IGZvcm1hdHRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMoZm9ybWF0dGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGZvcm1hdHRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5mb3JtYXR0ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGlmIChwcmV0dGllckFyZ3MubGVuZ3RoID4gMCAmJiBwcm9qZWN0cy5zZWxmLmhhc1ByZXR0aWVyKSB7XG4gICAgICBjb25zdCBwcmV0dGllclJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgJ1lBUk4nLFxuICAgICAgICAgICdwcmV0dGllcicsXG4gICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgICAgICAnLS13cml0ZScsXG4gICAgICAgICAgJy0tJyxcbiAgICAgICAgICAuLi5wcmV0dGllckFyZ3MsXG4gICAgICAgIF0pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3ByZXR0aWVyUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2gocHJldHRpZXJSZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cbiAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0UGFja2FnZUpzb25SZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJy0tJywgLi4uc29ydFBhY2thZ2VKc29uQXJnc10pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3NvcnRQYWNrYWdlSnNvblJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHNvcnRQYWNrYWdlSnNvblJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICBjb25zdCBsaW50ZXJSZXN1bHRzID0gYXdhaXQgcnVuTGludENvbW1hbmRzKGxpbnRlckNvbW1hbmRzLCBhcmd2LCBsaW50UnVuT3B0aW9ucyk7XG4gICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhsaW50ZXJSZXN1bHRzLCBhcmd2KTtcbiAgICBsaW50RXhpdENvZGVzLnB1c2goLi4ubGludGVyUmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LmV4aXRDb2RlKSk7XG4gIH1cblxuICByZXR1cm4gbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kcyhcbiAgY29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10sXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdFtdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChjb21tYW5kcy5tYXAoKHsgY29tbWFuZCwgcHJvamVjdCB9KSA9PiBydW5MaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKSkpO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+IHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKHJlc3VsdCkgPT4gKHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIGNvbW1hbmQ6IG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLFxuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKGV4aXRDb2RlKSA9PiAoeyBleGl0Q29kZSB9KSk7XG59XG5cbmZ1bmN0aW9uIHByaW50U2lsZW50TGludE91dHB1dHMoXG4gIHJlc3VsdHM6IExpbnRSdW5SZXN1bHRbXSxcbiAgYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICdwcmludEFsbE91dHB1dCcgfCAnc2lsZW50Jz5cbik6IHZvaWQge1xuICBjb25zdCBwcmludGFibGVSZXN1bHRzID1cbiAgICBhcmd2LnNpbGVudCAmJiAhYXJndi5wcmludEFsbE91dHB1dFxuICAgICAgPyByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiAnb3V0cHV0JyBpbiByZXN1bHQgJiYgc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpKVxuICAgICAgOiByZXN1bHRzO1xuICBpZiAocHJpbnRhYmxlUmVzdWx0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBwcmludGFibGVSZXN1bHRzKSB7XG4gICAgaWYgKCEoJ291dHB1dCcgaW4gcmVzdWx0KSkgY29udGludWU7XG5cbiAgICBpZiAoYXJndi5wcmludEFsbE91dHB1dCkge1xuICAgICAgcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcmd2LnNpbGVudCkge1xuICAgICAgICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuICAgICAgfVxuICAgICAgcHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0OiBCdWZmZXJlZExpbnRSdW5SZXN1bHQpOiB2b2lkIHtcbiAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcblxuICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChyZXN1bHQuY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dC50cmltKCk7XG4gIGlmIChvdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRIZWFkZXIoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnIG94Zm10ICcpIHx8IGNvbW1hbmQuaW5jbHVkZXMoJyBzb3J0LXBhY2thZ2UtanNvbiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzVHlwZUF3YXJlT3hsaW50Jz4sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnb3hsaW50JyxcbiAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgIC8vIFR5cGUtYXdhcmUgbW9kZSBtYWtlcyBveGxpbnQgcmVwb3J0IHR5cGUtY2hlY2sgZGlhZ25vc3RpY3MuIFBhc3MgdGhlIGZsYWdzIGV4cGxpY2l0bHlcbiAgICAgIC8vIGJlY2F1c2Ugb3hsaW50IHJlamVjdHMgdGhlIGVxdWl2YWxlbnQgb3B0aW9ucyBpbiBub24tcm9vdCBjb25maWdzLCBzbyBwZXItcGFja2FnZSBydW5zXG4gICAgICAvLyBpbiBtb25vcmVwb3Mgd291bGQgb3RoZXJ3aXNlIG1pc3MgdHlwZSBlcnJvcnMuXG4gICAgICAuLi4ocHJvamVjdC5oYXNUeXBlQXdhcmVPeGxpbnQgPyBbJy0tdHlwZS1hd2FyZScsICctLXR5cGUtY2hlY2snXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LnF1aWV0ID8gWyctLXF1aWV0J10gOiBbXSksXG4gICAgICAuLi4oYXJndi5maXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3hmbXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICdZQVJOJyxcbiAgICAnb3hmbXQnLFxuICAgICctLXdyaXRlJyxcbiAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICAnISoqL3BhY2thZ2UuanNvbicsXG4gIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBbXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2lzb3J0JywgJy0tcHJvZmlsZScsICdibGFjaycsICctLWZpbHRlci1maWxlcycsIC4uLnRhcmdldHNdKSxcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnYmxhY2snLCAuLi50YXJnZXRzXSksXG4gIF0uam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2OiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sIGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnZmxha2U4JywgLi4uKGFyZ3YucXVpZXQgPyBbJy1xJ10gOiBbXSksIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2FyZ29Gb3JtYXRDb21tYW5kKCk6IHN0cmluZyB7XG4gIC8vIEZvcm1hdHRpbmcgbXVzdCBnbyB0aHJvdWdoIGNhcmdvIChub3QgcnVzdGZtdCBvbiBpbmRpdmlkdWFsIGZpbGVzKSBzbyBlYWNoXG4gIC8vIGNyYXRlJ3MgZWRpdGlvbiBhbmQgcnVzdGZtdCBjb25maWd1cmF0aW9uIGFyZSByZXNwZWN0ZWQ7IGAtLWFsbGAgY292ZXJzXG4gIC8vIGV2ZXJ5IHdvcmtzcGFjZSBtZW1iZXIgYW5kIGlzIGEgbm8tb3Agc3VmZml4IGZvciBzaW5nbGUtY3JhdGUgcHJvamVjdHMuXG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2NhcmdvJywgJ2ZtdCcsICctLWFsbCddKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdmb3JtYXQnLCAuLi50YXJnZXRzXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRMaW50Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2FuYWx5emUnLCAuLi50YXJnZXRzXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByZXR0aWVyQXJncyhcbiAgc2VsZkRpclBhdGg6IHN0cmluZyxcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPltdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3MgPSBuZXcgU2V0PHN0cmluZz4oW2AqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWAsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKCFuZWVkc1ByZXR0aWVyKHByb2plY3QpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHByb2plY3RQYXR0ZXJuID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJyoqL3suKi8sfSoueycgKyBbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5qb2luKCcsJykgKyAnfScpO1xuICAgIGFyZ3MuYWRkKHBhdGgucmVsYXRpdmUoc2VsZkRpclBhdGgsIHByb2plY3RQYXR0ZXJuKSB8fCBwcm9qZWN0UGF0dGVybik7XG4gIH1cbiAgcmV0dXJuIFsuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHM6IFByb2plY3RbXSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBsZXQgb3duaW5nUHJvamVjdDogUHJvamVjdCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKFxuICAgICAgKGZpbGVQYXRoID09PSBwcm9qZWN0LmRpclBhdGggfHwgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtwcm9qZWN0LmRpclBhdGh9L2ApKSAmJlxuICAgICAgKCFvd25pbmdQcm9qZWN0IHx8IHByb2plY3QuZGlyUGF0aC5sZW5ndGggPiBvd25pbmdQcm9qZWN0LmRpclBhdGgubGVuZ3RoKVxuICAgICkge1xuICAgICAgb3duaW5nUHJvamVjdCA9IHByb2plY3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBvd25pbmdQcm9qZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAnLS0nIHwgJ18nIHwgJ2ZpbGVzJz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGxpbnRUYXJnZXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgWy4uLihhcmd2LmZpbGVzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldKSB7XG4gICAgbGludFRhcmdldHMuYWRkKFN0cmluZyh2YWx1ZSkpO1xuICB9XG4gIHJldHVybiBbLi4ubGludFRhcmdldHNdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCdkaXJlY3RvcnknIHwgJ290aGVyJz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHJldHVybiAnZGlyZWN0b3J5JztcbiAgfSBjYXRjaCB7XG4gICAgLy8gTWlzc2luZyBwYXRocyBhcmUgaGFuZGxlZCBieSB0aGUgZG93bnN0cmVhbSB0b29scy5cbiAgfVxuXG4gIHJldHVybiAnb3RoZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QuaGFzT3hmbXQpIHJldHVybiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIGlmIChuZWVkc1ByZXR0aWVyKHByb2plY3QpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHByZXR0aWVyT25seUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXTtcbiAgfVxuICBpZiAoc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKHByb2plY3QsIGV4dGVuc2lvbikpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihmaWxlUGF0aCwgYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMoXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwYWNrYWdlSnNvblBhdGgnPltdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIHJldHVybiBbXTtcbiAgcmV0dXJuIHByb2plY3RzXG4gICAgLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PlxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCA9PT0gcGF0aC5qb2luKGZpbGVQYXRoLCAncGFja2FnZS5qc29uJykgfHxcbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApXG4gICAgLm1hcCgocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvblBhdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhcbiAgcHJvamVjdHM6IFByb2plY3RbXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogeyBsaW50UGF0aDogc3RyaW5nOyBwcm9qZWN0OiBQcm9qZWN0IH1bXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICBjb25zdCBkZXNjZW5kYW50UHJvamVjdHMgPSBwcm9qZWN0cy5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT4gcHJvamVjdC5kaXJQYXRoID09PSBmaWxlUGF0aCB8fCBwcm9qZWN0LmRpclBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApO1xuICAgIGlmIChkZXNjZW5kYW50UHJvamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGRlc2NlbmRhbnRQcm9qZWN0cy5tYXAoKHByb2plY3QpID0+ICh7IGxpbnRQYXRoOiBwcm9qZWN0LmRpclBhdGgsIHByb2plY3QgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0cywgZmlsZVBhdGgpO1xuICByZXR1cm4gcHJvamVjdCA/IFt7IGxpbnRQYXRoOiBmaWxlUGF0aCwgcHJvamVjdCB9XSA6IFtdO1xufVxuXG5mdW5jdGlvbiBpc1BvdGVudGlhbExpbnRUYXJnZXQoZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LCBleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBuZWVkc1ByZXR0aWVyKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPik6IGJvb2xlYW4ge1xuICByZXR1cm4gIXByb2plY3QuaGFzT3hmbXQgJiYgcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMsIHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4vcG9ydC5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuY29uc3Qgc3RhbGVQcm9jZXNzUG9sbEludGVydmFsTXMgPSAxMDA7XG5jb25zdCBzdGFsZVByb2Nlc3NNYXhQb2xscyA9IDEwO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KTtcbiAgaWYgKCFhdmFpbGFibGUpIHtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH1cblxuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydCwgcHJvamVjdCk7XG4gIGtpbGxMaXN0ZW5pbmdQcm9jZXNzZXNCeVBvcnQocG9ydCk7XG59XG5cbmZ1bmN0aW9uIGtpbGxMaXN0ZW5pbmdQcm9jZXNzZXNCeVBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcGlkIG9mIGxpc3RMaXN0ZW5pbmdQcm9jZXNzSWRzKHBvcnQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChwaWQsICdTSUdLSUxMJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RMaXN0ZW5pbmdQcm9jZXNzSWRzKHBvcnQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoJ2xzb2YnLCBbJy10aScsIGB0Y3A6JHtwb3J0fWAsICctc1RDUDpMSVNURU4nXSwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLFxuICAgICAgdGltZW91dDogMjAwMCxcbiAgICB9KTtcbiAgICByZXR1cm4gc3Rkb3V0XG4gICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgocGlkKSA9PiBOdW1iZXIocGlkLnRyaW0oKSkpXG4gICAgICAuZmlsdGVyKChwaWQpID0+IE51bWJlci5pc0ludGVnZXIocGlkKSAmJiBwaWQgPiAwICYmIHBpZCAhPT0gcHJvY2Vzcy5waWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWxlUHJvY2Vzc01heFBvbGxzOyBpKyspIHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KHN0YWxlUHJvY2Vzc1BvbGxJbnRlcnZhbE1zKTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRVNSQ0gnKSByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCAnU0lHS0lMTCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZShpbWFnZU5hbWU6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgbmFtZT0ke2ltYWdlTmFtZX1gXSwgcHJvamVjdCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzLCByZW1vdmVTdGFsZVByb2Nlc3MgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2RlbGF5LW1zJzoge1xuICAgIGRlZmF1bHQ6IDUwMDAsXG4gICAgZGVzY3JpYmU6ICdEZWxheSBiZWZvcmUgc3RhcnRpbmcgdGhlIG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xudHlwZSBNYWludGVuYW5jZUFyZ3YgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPiAmIHtcbiAgYWN0aW9uOiAnc3RhcnQnIHwgJ3N0b3AnO1xufTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMgPSA1O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMgPSAxMDA7XG5jb25zdCBtYXhUaW1lb3V0RGVsYXlNcyA9IDJfMTQ3XzQ4M182NDc7XG5jb25zdCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUgPSAnLndiJztcbmNvbnN0IG1haW50ZW5hbmNlSHRtbCA9IGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJqYVwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj5cbiAgICA8dGl0bGU+44Oh44Oz44OG44OK44Oz44K55LitPC90aXRsZT5cbiAgICA8c3R5bGU+XG4gICAgICBib2R5IHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgICAgY29sb3I6ICMxMTE4Mjc7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7XG4gICAgICB9XG5cbiAgICAgIG1haW4ge1xuICAgICAgICBwYWRkaW5nOiAyNHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOiAyOHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgICBtYXJnaW46IDAgMCAxNnB4O1xuICAgICAgfVxuXG4gICAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS44O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bWFpbj5cbiAgICAgIDxoMT7nj77lnKjjg6Hjg7Pjg4bjg4rjg7PjgrnkuK3jgafjgZk8L2gxPlxuICAgICAgPHA+55qG5qeY44Gr44Gv44GU5LiN5L6/44KS44GK44GL44GR44GX44G+44GZ44GM44CB44Oh44Oz44OG44OK44Oz44K557WC5LqG44G+44Gn44GX44Gw44KJ44GP44GK5b6F44Gh44GP44Gg44GV44GE44CCPC9wPlxuICAgIDwvbWFpbj5cbiAgPC9ib2R5PlxuPC9odG1sPmA7XG5cbmV4cG9ydCBjb25zdCBtYWludGVuYW5jZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTWFpbnRlbmFuY2VBcmd2PiA9IHtcbiAgY29tbWFuZDogJ21haW50ZW5hbmNlIDxhY3Rpb24+JyxcbiAgZGVzY3JpYmU6ICdTdGFydCBvciBzdG9wIGEgbGlnaHR3ZWlnaHQgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuIEV4YW1wbGU6IHdiIG1haW50ZW5hbmNlIHN0YXJ0JyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzXG4gICAgICAucG9zaXRpb25hbCgnYWN0aW9uJywge1xuICAgICAgICBjaG9pY2VzOiBbJ3N0YXJ0JywgJ3N0b3AnXSBhcyBjb25zdCxcbiAgICAgICAgZGVzY3JpYmU6ICdNYWludGVuYW5jZSBzZXJ2ZXIgYWN0aW9uJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcikgYXMgdW5rbm93biBhcyBBcmd2PE1haW50ZW5hbmNlQXJndj4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gYXJndi5hY3Rpb247XG4gICAgaWYgKHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2UgJHthY3Rpb259IGJlY2F1c2UgV0JfRU5WIGlzIHRlc3QuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChwcm9qZWN0LmVudi5QT1JUKTtcbiAgICBpZiAoYWN0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgICBhd2FpdCBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQsIGFyZ3YuZGVsYXlNcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICdzdG9wJykge1xuICAgICAgYXdhaXQgc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtYWludGVuYW5jZSBhY3Rpb246ICR7YWN0aW9ufWApO1xuICB9LFxufTtcblxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGFzc2VydC5vayhOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpICYmIHBvcnQgPiAwLCBgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlciwgZGVsYXlNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFzc2VydC5vayhcbiAgICBOdW1iZXIuaXNGaW5pdGUoZGVsYXlNcykgJiYgZGVsYXlNcyA+PSAwICYmIGRlbGF5TXMgPD0gbWF4VGltZW91dERlbGF5TXMsXG4gICAgYGRlbGF5LW1zIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke21heFRpbWVvdXREZWxheU1zfTogJHtkZWxheU1zfWBcbiAgKTtcblxuICBjb25zdCBwaWRGaWxlUGF0aCA9IGF3YWl0IHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwcm9jZXNzLnBpZCk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlU2lnbmFsSGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KGRlbGF5TXMsIHVuZGVmaW5lZCwgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0KTtcbiAgICBpZiAoIXNlcnZlcikgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBTdGFydGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgYXdhaXQgd2FpdEZvclNodXRkb3duKHNlcnZlcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGF3YWl0IGNsZWFudXAoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0OiBudW1iZXIpOiBQcm9taXNlPGh0dHAuU2VydmVyIHwgdW5kZWZpbmVkPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHNlcnZlciwgcG9ydCwgaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IpO1xuICAgICAgcmV0dXJuIHNlcnZlcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScgJiYgYXR0ZW1wdCA8IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlIHNlcnZlciBiZWNhdXNlIHBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQsIGVycik7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZSBtYWludGVuYW5jZSBzZXJ2ZXIgc3RhcnR1cCBzdGF0ZS4nKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydDogbnVtYmVyLCBlcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKTogbmV2ZXIge1xuICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICBjb25zb2xlLmluZm8oYFN0b3BwZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTogaHR0cC5TZXJ2ZXIge1xuICByZXR1cm4gaHR0cC5jcmVhdGVTZXJ2ZXIoKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDMsIHtcbiAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLXN0b3JlJyxcbiAgICAgICdjb250ZW50LXR5cGUnOiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyxcbiAgICB9KTtcbiAgICByZXNwb25zZS5lbmQobWFpbnRlbmFuY2VIdG1sKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKFxuICBzZXJ2ZXI6IGh0dHAuU2VydmVyLFxuICBwb3J0OiBudW1iZXIsXG4gIG9uUnVudGltZUVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uU3RhcnR1cEVycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTGlzdGVuaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgICBzZXJ2ZXIub24oJ2Vycm9yJywgb25SdW50aW1lRXJyb3IpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMC4wLjAuMCcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclNodXRkb3duKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzaHV0ZG93biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIGNsb3NlIG1haW50ZW5hbmNlIHNlcnZlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9O1xuICAgIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNlcnZlci5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VSUl9TRVJWRVJfTk9UX1JVTk5JTkcnKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLmNsb3NlQWxsQ29ubmVjdGlvbnMoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHBpZEZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShwaWRGaWxlUGF0aCwgYCR7cHJvY2Vzcy5waWR9XFxuYCwgJ3V0ZjgnKTtcbiAgcmV0dXJuIHBpZEZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICBpZiAocGlkICE9PSB1bmRlZmluZWQgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCkge1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwaWQsICdTSUdURVJNJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQpO1xuICB9XG4gIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcGlkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcsIGV4cGVjdGVkUGlkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleHBlY3RlZFBpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gICAgaWYgKHBpZCAhPT0gZXhwZWN0ZWRQaWQpIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy5ybShwaWRGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaWRUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUocGlkRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGlkID0gTnVtYmVyKHBpZFRleHQudHJpbSgpKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgPyBwaWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LnJvb3REaXJQYXRoLCBwb3J0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocm9vdERpclBhdGg6IHN0cmluZywgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihyb290RGlyUGF0aCwgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lLCBgbWFpbnRlbmFuY2UtJHtwb3J0fS5waWRgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQge1xuICBmaW5kRGVzY2VuZGFudFByb2plY3RzLFxuICBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIGdldEZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIHR5cGUgUHJvamVjdCxcbn0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBzcWxpdGVGaWxlUGF0dGVybiA9IC9cXC4oPzpzcWxpdGUzP3xkYikoPzpbLS5dKD86am91cm5hbHxzaG18d2FsKSk/JC9pO1xuY29uc3QgZG9ja2VyQnVpbGRDYWNoZVBhdGhzID0gW1xuICAnLmNhY2hlJyxcbiAgJy5teXB5X2NhY2hlJyxcbiAgJy5uZXh0L2NhY2hlJyxcbiAgJy5wYXJjZWwtY2FjaGUnLFxuICAnLnB5dGVzdF9jYWNoZScsXG4gICcucnVmZl9jYWNoZScsXG4gICcudG94JyxcbiAgJy50dXJibycsXG4gICcudmVudicsXG4gICcueWFybi9jYWNoZScsXG4gICcueWFybi9pbnN0YWxsLXN0YXRlLmd6JyxcbiAgJ19fcHljYWNoZV9fJyxcbiAgJ2NvdmVyYWdlJyxcbiAgJ25vZGVfbW9kdWxlcy8uY2FjaGUnLFxuICAncGxheXdyaWdodC1yZXBvcnQnLFxuICAnc3Rvcnlib29rLXN0YXRpYycsXG4gICd0YXJnZXQnLFxuICAndGVzdC1yZXN1bHRzJyxcbl07XG5jb25zdCBkb2NrZXJCdWlsZENhY2hlUGF0dGVybnMgPSBbJyoqLyoucHljJywgJyoqLyoudHNidWlsZGluZm8nLCAnKiovX19weWNhY2hlX18nXTtcbmNvbnN0IGdlbmVyYXRlZFNxbGl0ZURpck5hbWVzID0gWydwcmlzbWEnLCAnZGInLCAnZHJpenpsZSddIGFzIGNvbnN0O1xuY29uc3QgZG9ja2VyR2VuZXJhdGVkRGF0YURpclBhdGhzID0gWycvZGF0YSddIGFzIGNvbnN0O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGltaXplZFByb2plY3RzOiBQcm9qZWN0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdCwgcGFja2FnZUpzb24pO1xuICAgICAgY29uc3QgcmVtb3ZlZERldkRlcGVuZGVuY2llcyA9IG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uLCB7XG4gICAgICAgIHJlbW92ZVdiUG9zdGluc3RhbGw6ICFhcmd2Lm91dHNpZGUgJiYgcmVtb3ZlZERldkRlcGVuZGVuY2llcy5pbmNsdWRlcygnQHdpbGxib29zdGVyL3diJyksXG4gICAgICB9KTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgICAgYXdhaXQgd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMocGF0aC5qb2luKGRpc3REaXJQYXRoLCAnYmFzaCcpKTtcbiAgICAgIH1cbiAgICAgIG9wdGltaXplZFByb2plY3RzLnB1c2gocHJvamVjdCk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICAgIGF3YWl0IGNsZWFudXBEb2NrZXJCdWlsZEFydGlmYWN0cyhvcHRpbWl6ZWRQcm9qZWN0cyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdDogUHJvamVjdCwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXNGb3JEaXIocHJvamVjdC5yb290RGlyUGF0aCwgcHJvamVjdC5kaXJQYXRoLCBwYWNrYWdlSnNvbik7XG59XG5cbmZ1bmN0aW9uIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzRm9yRGlyKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb25cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmV3cml0dGVuRGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgLy8gRG9ja2VyIGJ1aWxkcyBjYW5ub3QgYWNjZXNzIHByaXZhdGUgU1NIIFVSTHMgdW5sZXNzIGNyZWRlbnRpYWxzIGFyZSBmb3J3YXJkZWQuXG4gICAgICAgIC8vIFRoZSBEb2NrZXJmaWxlIGNvcGllcyB0aG9zZSB3b3Jrc3BhY2UgcGFja2FnZXMgaW50byB0aGUgaW1hZ2UgaW5zdGVhZC5cbiAgICAgICAgZGVwc1tuYW1lXSA9IGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKHJvb3REaXJQYXRoLCBwYWNrYWdlRGlyUGF0aCwgbmFtZSk7XG4gICAgICAgIHJld3JpdHRlbkRlcGVuZGVuY2llcy5wdXNoKGAke2tleX0uJHtuYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1Jld3JvdGUgcHJpdmF0ZSBHaXRIdWIgZGVwZW5kZW5jaWVzOicsIHJld3JpdHRlbkRlcGVuZGVuY2llcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZXdyaXR0ZW5EZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKHJvb3REaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwcml2YXRlUGFja2FnZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdAd2lsbGJvb3N0ZXInLCB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VEaXJQYXRoKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuXG5mdW5jdGlvbiB0b1Vuc2NvcGVkUGFja2FnZU5hbWUocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYWNrYWdlTmFtZS5yZXBsYWNlKC9eQHdpbGxib29zdGVyXFwvLywgJycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc291cmNlRGlyUGF0aCA9IGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHNvdXJjZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRmlsZSgpIHx8ICFkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnNoJykpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdGFyZ2V0RmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLmNvcHlGaWxlKHBhdGguam9pbihzb3VyY2VEaXJQYXRoLCBkaXJlbnQubmFtZSksIHRhcmdldEZpbGVQYXRoKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jaG1vZCh0YXJnZXRGaWxlUGF0aCwgMG83NTUpO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhgR2VuZXJhdGVkIERvY2tlciBzaGVsbCBzY3JpcHRzOiAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZGlyUGF0aCkgfHwgZGlyUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gZmluZERvY2tlclNoZWxsU2NyaXB0c0RpclBhdGgoKTogc3RyaW5nIHtcbiAgbGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICdkb2NrZXInLCAnYmFzaCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG9ja2VyIHNoZWxsIHNjcmlwdHMgZGlyZWN0b3J5IG5vdCBmb3VuZC4nKTtcbiAgICB9XG4gICAgY3VycmVudERpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAvLyBPdXRzaWRlIG9wdGltaXphdGlvbiB3cml0ZXMgZGlzdC9wYWNrYWdlLmpzb24gYmVmb3JlIERvY2tlciBidWlsZHMgdGhlIGFwcC5cbiAgICAvLyBLZWVwIGJ1aWxkLXRpbWUgZGVwZW5kZW5jaWVzIGFuZCByZW1vdmUgb25seSBrbm93biBub24tYnVpbGQgdG9vbGluZy5cbiAgICByZXR1cm4gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb24pO1xuICB9XG5cbiAgLy8gSW5zaWRlIERvY2tlciwgY29kZWdlbi9idWlsZCBoYXMgYWxyZWFkeSBmaW5pc2hlZCwgc28gcHJvZHVjdGlvbiBpbnN0YWxsIHNob3VsZCBub3Qgc2VlIGRldiB0b29saW5nLlxuICBjb25zdCByZW1vdmVkRGVwZW5kZW5jaWVzID0gT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9KTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gIHJldHVybiByZW1vdmVkRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVVbm5lY2Vzc2FyeURldkRlcGVuZGVuY2llc0Zvck91dHNpZGVEb2NrZXJCdWlsZChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIC8vIEluIC0tb3V0c2lkZSBtb2RlLCBEb2NrZXIgc3RpbGwgcnVucyBjb2RlZ2VuL2J1aWxkIGJlZm9yZSBhIHNlY29uZCBpbi1pbWFnZSBvcHRpbWl6YXRpb24uXG4gIC8vIFJlbW92ZSBvbmx5IHRvb2xpbmcgdGhhdCBpcyBub3QgbmVlZGVkIGZvciB0aGF0IGJ1aWxkIHBoYXNlLlxuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnYmlvbWUnLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdveGZtdCcsXG4gICAgJ294bGludCcsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFNoYXJlZCBjb25maWcgcGFja2FnZXMgYXJlIG5lZWRlZCBvbmx5IGZvciBsaW50L2Zvcm1hdC90ZXN0IGNvbW1hbmRzLCBub3QgRG9ja2VyIGJ1aWxkcy5cbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbiAgcmV0dXJuIHJlbW92ZWREZXBzO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uLCBvcHRpb25zOiB7IHJlbW92ZVdiUG9zdGluc3RhbGw6IGJvb2xlYW4gfSk6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICAob3B0aW9ucy5yZW1vdmVXYlBvc3RpbnN0YWxsICYmIG5hbWUgPT09ICdwb3N0aW5zdGFsbCcgJiYgY29udGVudC50cmltKCkgPT09ICd3YiBnZW4tY29kZScpIHx8XG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBEb2NrZXJCdWlsZEFydGlmYWN0cyhwcm9qZWN0czogUHJvamVjdFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGF3YWl0IHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdCk7XG4gICAgYXdhaXQgcmVtb3ZlR2VuZXJhdGVkTG9jYWxEYXRhKHByb2plY3QpO1xuICAgIHJ1bkRvY2tlckNsZWFudXBTY3JpcHQocHJvamVjdCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUHJvamVjdENhY2hlcyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBbXG4gICAgLi4uKGF3YWl0IHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXRocyhwcm9qZWN0KSksXG4gICAgLi4uKGF3YWl0IHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0KSksXG4gIF07XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBEb2NrZXIgYnVpbGQgY2FjaGVzOicsIHJlbGF0aXZlUGF0aHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiBkb2NrZXJCdWlsZENhY2hlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBhd2FpdCBnbG9iYnkoZG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMnLCAnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqLy55YXJuJywgJyoqLy55YXJuLyoqJywgJyoqLy5naXQnLCAnKiovLmdpdC8qKiddLFxuICAgIG9ubHlGaWxlczogZmFsc2UsXG4gIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByZWxhdGl2ZVBhdGhzLm1hcCgocmVsYXRpdmVQYXRoKSA9PlxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgKVxuICApO1xuICByZXR1cm4gcmVsYXRpdmVQYXRocztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTG9jYWxEYXRhKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVtb3ZlZFBhdGhHcm91cHMgPSBhd2FpdCBQcm9taXNlLmFsbChbcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3QpLCByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0KV0pO1xuICBjb25zdCByZW1vdmVkUGF0aHMgPSByZW1vdmVkUGF0aEdyb3Vwcy5mbGF0KCk7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBnZW5lcmF0ZWQgbG9jYWwgZGF0YTonLCByZW1vdmVkUGF0aHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRNb3VudERpcnMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRocyA9IGdldEdlbmVyYXRlZE1vdW50RGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgcmVsYXRpdmVQYXRocykge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXRQYXRoKSkgY29udGludWU7XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0YXJnZXRQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmVtb3ZlZFBhdGhzLnB1c2gocmVsYXRpdmVQYXRoKTtcbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlZmF1bHRQYXRocyA9IGdlbmVyYXRlZFNxbGl0ZURpck5hbWVzLm1hcCgoZGlyTmFtZSkgPT4gcGF0aC5qb2luKGRpck5hbWUsICdtb3VudCcpKTtcbiAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuIGRlZmF1bHRQYXRocztcblxuICBjb25zdCBhYnNvbHV0ZURpclBhdGggPSBwYXRoLmRpcm5hbWUoZGJQYXRoKTtcbiAgaWYgKHBhdGguYmFzZW5hbWUoYWJzb2x1dGVEaXJQYXRoKSAhPT0gJ21vdW50JyB8fCAhaXNQYXRoSW5zaWRlUHJvamVjdChwcm9qZWN0LCBhYnNvbHV0ZURpclBhdGgpKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRQYXRocztcbiAgfVxuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgYWJzb2x1dGVEaXJQYXRoKTtcbiAgaWYgKCFyZWxhdGl2ZVBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kZWZhdWx0UGF0aHMsIHJlbGF0aXZlUGF0aF0pXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzSW5EZWZhdWx0RGlycyhwcm9qZWN0KSxcbiAgICByZW1vdmVFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0KSxcbiAgXSk7XG4gIHJldHVybiByZW1vdmVkUGF0aHMuZmxhdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBhd2FpdCBnZXRHZW5lcmF0ZWRTcWxpdGVEaXJQYXRocyhwcm9qZWN0KTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gYXdhaXQgUHJvbWlzZS5hbGwoZGlyUGF0aHMubWFwKChkaXJQYXRoKSA9PiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGlyKHByb2plY3QsIGRpclBhdGgpKSk7XG4gIHJldHVybiByZW1vdmVkUGF0aHMuZmxhdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRHZW5lcmF0ZWRTcWxpdGVEaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkaXJQYXRocyA9IGdlbmVyYXRlZFNxbGl0ZURpck5hbWVzLm1hcCgoZGlyTmFtZSkgPT4gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZGlyTmFtZSkpO1xuICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoZGlyUGF0aHMubWFwKChkaXJQYXRoKSA9PiBpc0RpcmVjdG9yeShkaXJQYXRoKSkpO1xuICByZXR1cm4gZGlyUGF0aHMuZmlsdGVyKChfLCBpbmRleCkgPT4gcmVzdWx0c1tpbmRleF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkYkZpbGVQYXRocyA9IGdldEVudkdlbmVyYXRlZFNxbGl0ZUZpbGVQYXRocyhwcm9qZWN0KTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRiRmlsZVBhdGggb2YgZGJGaWxlUGF0aHMpIHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldFBhdGggb2YgZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGgpKSB7XG4gICAgICBpZiAoIShhd2FpdCBpc0ZpbGUodGFyZ2V0UGF0aCkpKSBjb250aW51ZTtcblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHJlbW92ZWRQYXRocy5wdXNoKHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmZ1bmN0aW9uIGdldEVudkdlbmVyYXRlZFNxbGl0ZUZpbGVQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZURiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGggfHwgIWFic29sdXRlRGJQYXRoKSByZXR1cm4gW107XG5cbiAgY29uc3QgZmlsZVBhdGhzID0gcGF0aC5pc0Fic29sdXRlKGRiUGF0aClcbiAgICA/IFtkYlBhdGhdXG4gICAgOiBbYWJzb2x1dGVEYlBhdGgsIC4uLmdlbmVyYXRlZFNxbGl0ZURpck5hbWVzLm1hcCgoZGlyTmFtZSkgPT4gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGlyTmFtZSwgZGJQYXRoKSldO1xuICByZXR1cm4gWy4uLm5ldyBTZXQoZmlsZVBhdGhzKV0uZmlsdGVyKChmaWxlUGF0aCkgPT4gaXNHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aFNhZmUocHJvamVjdCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aFNhZmUocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQYXRoSW5zaWRlUHJvamVjdChwcm9qZWN0LCBmaWxlUGF0aCkgfHwgaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdCwgZmlsZVBhdGgpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckdlbmVyYXRlZERhdGFGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghaXNEb2NrZXJFbmFibGVkKHByb2plY3QpKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRvY2tlckdlbmVyYXRlZERhdGFEaXJQYXRocy5zb21lKChkaXJQYXRoKSA9PiB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJycgJiYgcmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVGaWxlRmFtaWx5UGF0aHMoZGJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGRiRmlsZVBhdGgsXG4gICAgYCR7ZGJGaWxlUGF0aH0tam91cm5hbGAsXG4gICAgYCR7ZGJGaWxlUGF0aH0tc2htYCxcbiAgICBgJHtkYkZpbGVQYXRofS13YWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LmpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LnNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0ud2FsYCxcbiAgXTtcbn1cblxuZnVuY3Rpb24gaXNQYXRoSW5zaWRlUHJvamVjdChwcm9qZWN0OiBQcm9qZWN0LCB0YXJnZXRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHRhcmdldFBhdGgpO1xuICAvLyBgc3RhcnRzV2l0aCgnLi4nKWAgd291bGQgcmVqZWN0IHByb2plY3QtbG9jYWwgbmFtZXMgc3VjaCBhcyBgLi5jYWNoZWAuXG4gIHJldHVybiByZWxhdGl2ZVBhdGggPT09ICcnIHx8IChyZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKGAuLiR7cGF0aC5zZXB9YCkpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9qZWN0LmVudi5XQl9ET0NLRVIgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnMCcgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnZmFsc2UnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpc0ZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0ZpbGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGRpclBhdGgpO1xuICAgIHJldHVybiBzdGF0LmlzRGlyZWN0b3J5KCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGlyKHByb2plY3Q6IFByb2plY3QsIGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBzcWxpdGVGaWxlTmFtZXMgPSBkaXJlbnRzXG4gICAgLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgc3FsaXRlRmlsZVBhdHRlcm4udGVzdChkaXJlbnQubmFtZSkpXG4gICAgLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG5cbiAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGRpclBhdGgpO1xuICByZXR1cm4gc3FsaXRlRmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGguam9pbihyZWxhdGl2ZURpclBhdGgsIGZpbGVOYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRvY2tlckNsZWFudXBTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNjcmlwdFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnYmFzaCcsICdjbGVhbnVwLnNoJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzY3JpcHRQYXRoKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdiYXNoJywgW3NjcmlwdFBhdGgsICctLWtlZXAtc2NyaXB0cyddLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHNjcmlwdFBhdGgpfWApO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VPcm0sIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMsIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCwgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQsIGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgYWxpYXNlczogWydkYiddLFxuICBkZXNjcmliZTpcbiAgICBcIlJ1biBkYXRhYmFzZSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIERyaXp6bGUgcHJvamVjdHMgdXNlIGRyaXp6bGUta2l0LiBFeGFtcGxlOiB3YiBwcmlzbWEgbWlncmF0ZS1kZXYgLS0gLS1uYW1lIGluaXRcIixcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLmNvbW1hbmQoY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZ2VuZXJhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGlzdEJhY2t1cHNDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NsZWFudXAtbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnQ2xlYW4gdXAgdGVtcG9yYWwgTGl0ZXN0cmVhbSBmaWxlcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBjbGVhbnVwLWxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5jbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy9ldGMvbGl0ZXN0cmVhbS55bWwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcjogY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgaWYgKGFsbFByb2plY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NyZWF0aW5nIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmb3IgbXVsdGlwbGUgcHJvamVjdHMgYXQgb25jZSBpcyBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgdGhleSB3b3VsZCBvdmVyd3JpdGUgZWFjaCBvdGhlci4nXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0LCBvcm0sIGFyZ3Yub3V0cHV0KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZGVwbG95Rm9yY2UocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGdlbmVyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdnZW5lcmF0ZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgT1JNIGNsaWVudCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGdlbmVyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuZ2VuZXJhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgY29uZmlnOiB7XG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGxpdGVzdHJlYW1Db25maWdCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXN0LWJhY2t1cHMnLFxuICBkZXNjcmliZTogJ0xpc3QgTGl0ZXN0cmVhbSBiYWNrdXBzJyxcbiAgYnVpbGRlcjogbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBsaXN0LWJhY2t1cHMnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5saXN0QmFja3Vwcyhwcm9qZWN0LCBhcmd2LmNvbmZpZyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnY2hlY2staWRlbXBvdGVuY3knOiB7XG4gICAgZGVzY3JpcHRpb246ICdSdW4gdGhlIG1pZ3JhdGlvbiBjb21tYW5kIHR3aWNlIHRvIGNvbmZpcm0gaXQgaXMgaWRlbXBvdGVudC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIG1pZ3JhdGVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyOiBtaWdyYXRlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2NoZWNrLWlkZW1wb3RlbmN5J10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3JtU2NyaXB0cyA9IGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBvcm1TY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0LCBhcmd2LmNoZWNrSWRlbXBvdGVuY3kpKSB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0KSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFNraXBwaW5nIGlkZW1wb3RlbmN5IGNoZWNrIGZvciAke3Byb2plY3QubmFtZX0gaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIG9ybVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3Q6IFByb2plY3QsIGNoZWNrSWRlbXBvdGVuY3k6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrSWRlbXBvdGVuY3kgPz8gaXNEb2NrZXJFbmFibGVkKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9qZWN0LmVudi5XQl9ET0NLRVIgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnMCcgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnZmFsc2UnO1xufVxuXG5mdW5jdGlvbiBpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAncHJvZHVjdGlvbicpO1xufVxuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gRm9yY2UgdG8gcmVzZXQgdGVzdCBkYXRhYmFzZVxuICAgIGlmIChwcm9jZXNzLmVudi5XQl9FTlYgIT09ICd0ZXN0Jykge1xuICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WID0gJ3Rlc3QnO1xuICAgICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKFxuICAgICAgICAnV0JfRU5WPXRlc3QgZGIgcmVzZXQnLFxuICAgICAgICBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KVxuICAgICAgKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8ZHJpenpsZXxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGFyZ3Yub3V0cHV0ID8/IGdldERlZmF1bHRSZXN0b3JlT3V0cHV0KHByb2plY3QsIG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzdG9yZShwcm9qZWN0LCBvdXRwdXQsIGFyZ3YuY29uZmlnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gZGF0YWJhc2Ugc3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydkYi11cmwtb3ItcGF0aCcsICdyZXN0b3JlZCddKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6XG4gICAgICAgICAgPyAnZGIvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgICA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgZnVsbENvbW1hbmQpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBjb21tYW5kKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBNYWtlIERyaXp6bGUgY29tbWFuZHMgd29yayBvbiBDbG91ZGZsYXJlIEQxIHByb2plY3RzIGJ5IHBvaW50aW5nIERBVEFCQVNFX1VSTFxuICogYXQgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqL1xuZnVuY3Rpb24gd2l0aExvY2FsRDFJZk5lZWRlZChvcm06IERhdGFiYXNlT3JtLCBwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvcm0gPT09ICdkcml6emxlJyA/IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3QsIHNjcmlwdCkgOiBzY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSwgY29uZmlnUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldExpdGVzdHJlYW1EYlBhdGgocHJvamVjdCwgb3JtKTtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgc25hcHNob3Q6XG4gIGludGVydmFsOiAyNGggICMgQ3JlYXRlIGEgYmFja3VwIHBlciBkYXlcbiAgcmV0ZW50aW9uOiA3MmggIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSk6IHN0cmluZyB7XG4gIGlmIChvcm0gPT09ICdwcmlzbWEnKVxuICAgIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnO1xuICByZXR1cm4gJ2RyaXp6bGUvcmVzdG9yZWQuc3FsaXRlMyc7XG59XG5cbmZ1bmN0aW9uIGdldExpdGVzdHJlYW1EYlBhdGgocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSk6IHN0cmluZyB7XG4gIGlmIChvcm0gPT09ICdwcmlzbWEnKSB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgICByZXR1cm4gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3diIGRiIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZyBmb3IgRHJpenpsZSByZXF1aXJlcyBmaWxlOiBEQVRBQkFTRV9VUkwuJyk7XG4gIH1cbiAgcmV0dXJuIGRiUGF0aDtcbn1cblxuaW50ZXJmYWNlIERhdGFiYXNlT3JtUHJvamVjdCB7XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIG9ybTogRGF0YWJhc2VPcm07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9ybT86IERhdGFiYXNlT3JtKTogUHJvbWlzZTxEYXRhYmFzZU9ybVByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgIC5tYXAoKHByb2plY3QpID0+IChwcm9qZWN0LmRhdGFiYXNlT3JtID8geyBwcm9qZWN0LCBvcm06IHByb2plY3QuZGF0YWJhc2VPcm0gfSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcigocHJvamVjdCk6IHByb2plY3QgaXMgRGF0YWJhc2VPcm1Qcm9qZWN0ID0+ICEhcHJvamVjdCAmJiAoIW9ybSB8fCBwcm9qZWN0Lm9ybSA9PT0gb3JtKSk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChvcm0gPyBgTm8gJHtvcm19IHByb2plY3QgZm91bmQuYCA6ICdObyBzdXBwb3J0ZWQgZGF0YWJhc2UgT1JNIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm06IERhdGFiYXNlT3JtKTogdHlwZW9mIHByaXNtYVNjcmlwdHMgfCB0eXBlb2YgZHJpenpsZVNjcmlwdHMge1xuICByZXR1cm4gb3JtID09PSAncHJpc21hJyA/IHByaXNtYVNjcmlwdHMgOiBkcml6emxlU2NyaXB0cztcbn1cblxuZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBwcm9qZWN0czogRGF0YWJhc2VPcm1Qcm9qZWN0W11cbik6IEdlbmVyYXRvcjxEYXRhYmFzZU9ybVByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgY29uc3Qgb3JtUHJvamVjdEJ5UHJvamVjdCA9IG5ldyBNYXAocHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiBbcHJvamVjdC5wcm9qZWN0LCBwcm9qZWN0XSkpO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKFxuICAgIGNvbW1hbmROYW1lLFxuICAgIHByb2plY3RzLm1hcCgoeyBwcm9qZWN0IH0pID0+IHByb2plY3QpXG4gICkpIHtcbiAgICBjb25zdCBvcm1Qcm9qZWN0ID0gb3JtUHJvamVjdEJ5UHJvamVjdC5nZXQocHJvamVjdCk7XG4gICAgaWYgKCFvcm1Qcm9qZWN0KSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXRlY3QgZGF0YWJhc2UgT1JNIGZvciAke3Byb2plY3QubmFtZX0uYCk7XG5cbiAgICB5aWVsZCBvcm1Qcm9qZWN0O1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gT1JNIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3Y6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCB1bmtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBCdWlsZCBsaXN0IG9mIGtub3duIG9wdGlvbnMgZnJvbSBzaGFyZWQgb3B0aW9ucyBidWlsZGVyc1xuICBjb25zdCBzaGFyZWRPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpO1xuICBjb25zdCBzaGFyZWRPcHRpb25BbGlhc2VzID0gT2JqZWN0LnZhbHVlcyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgICAuZmxhdE1hcCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoJ2FsaWFzJyBpbiBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3B0aW9uLmFsaWFzKSA/IG9wdGlvbi5hbGlhcyA6IFtvcHRpb24uYWxpYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGFsbEtub3duT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAgIC4uLmtub3duT3B0aW9ucyxcbiAgICAuLi5zaGFyZWRPcHRpb25LZXlzLFxuICAgIC4uLnNoYXJlZE9wdGlvbkFsaWFzZXMsXG4gICAgLy8gSW50ZXJuYWwgeWFyZ3MgcHJvcGVydGllc1xuICAgICctLScsXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXNzdGhyb3VnaEFyZ3MgPSBBcnJheS5pc0FycmF5KGFyZ3ZbJy0tJ10pID8gYXJndlsnLS0nXS5tYXAoU3RyaW5nKSA6IFtdO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLnVua25vd25PcHRpb25zLCAuLi5wYXNzdGhyb3VnaEFyZ3NdKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmludGVyZmFjZSBQcml2YXRlUGFja2FnZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgc291cmNlRGlyUGF0aDogc3RyaW5nO1xuICB0YXJnZXREaXJQYXRoOiBzdHJpbmc7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lLZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IHByaXZhdGVHaXREZXBlbmRlbmN5UGF0dGVybiA9IC9eZ2l0QGdpdGh1YlxcLmNvbTooPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilcXC9bXi8jXSsoPzpcXC5naXQpPyg/OiMuKik/JC87XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdvdXQtZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGlyZWN0b3J5IHRvIGNvcHkgcHJpdmF0ZSBwYWNrYWdlcyBpbnRvJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnQHdpbGxib29zdGVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8eyBkcnlSdW4/OiBib29sZWFuIH0sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwLXByaXZhdGUtcGFja2FnZXMnLFxuICBkZXNjcmliZTogJ0NvcHkgcHJpdmF0ZSBnaXQgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dERpclBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdHMucm9vdC5kaXJQYXRoLCBhcmd2Lm91dERpcik7XG4gICAgYXNzZXJ0U3ViZGlyZWN0b3J5KHByb2plY3RzLnJvb3QuZGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gICAgY29uc3QgY29waWVkUGFja2FnZXMgPSBhd2FpdCBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbiwgb3V0RGlyUGF0aCk7XG5cbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGgsIGNvcGllZFBhY2thZ2VzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShvdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIob3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBjb3BpZWRQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMuY3AocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCwge1xuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICBmaWx0ZXI6IChzcmMpID0+IHtcbiAgICAgICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGgucmVsYXRpdmUocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCwgc3JjKS5zcGxpdChwYXRoLnNlcCk7XG4gICAgICAgICAgcmV0dXJuICFzZWdtZW50cy5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykgJiYgIXNlZ21lbnRzLmluY2x1ZGVzKCcuZ2l0Jyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgYENvcGllZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9IHRvICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0cy5yb290LmRpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgcmVwbGFjZVByaXZhdGVHaXREZXBlbmRlbmNpZXMob3V0RGlyUGF0aCwgY29waWVkUGFja2FnZXMpO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcm9vdFBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgb3V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPj4ge1xuICBjb25zdCBjb3BpZWRQYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4oKTtcbiAgLy8gU3RhcnQgZnJvbSB0aGUgcm9vdCBwYWNrYWdlLmpzb24gYnkgZGVzaWduOyB3b3Jrc3BhY2UgcGFja2FnZSBkZXBlbmRlbmNpZXMgYXJlIG91dHNpZGUgdGhpcyBjb21tYW5kJ3MgdGFyZ2V0LlxuICBjb25zdCBwYWNrYWdlTmFtZXNUb0NvcHkgPSBmaW5kUHJpdmF0ZUdpdERlcGVuZGVuY3lOYW1lcyhyb290UGFja2FnZUpzb24pO1xuICBjb25zdCBxdWV1ZWRQYWNrYWdlTmFtZXMgPSBuZXcgU2V0KHBhY2thZ2VOYW1lc1RvQ29weSk7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhY2thZ2VOYW1lc1RvQ29weS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lc1RvQ29weVtpbmRleF07XG4gICAgaWYgKCFwYWNrYWdlTmFtZSkgY29udGludWU7XG4gICAgaWYgKGNvcGllZFBhY2thZ2VzLmhhcyhwYWNrYWdlTmFtZSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJpdmF0ZVBhY2thZ2UgPSBidWlsZFByaXZhdGVQYWNrYWdlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoLCBwYWNrYWdlTmFtZSk7XG4gICAgY29waWVkUGFja2FnZXMuc2V0KHBhY2thZ2VOYW1lLCBwcml2YXRlUGFja2FnZSk7XG5cbiAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyhwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIGZvciAoY29uc3QgbmVzdGVkUGFja2FnZU5hbWUgb2YgZmluZFByaXZhdGVHaXREZXBlbmRlbmN5TmFtZXMocGFja2FnZUpzb24pKSB7XG4gICAgICAgIGlmICghcXVldWVkUGFja2FnZU5hbWVzLmhhcyhuZXN0ZWRQYWNrYWdlTmFtZSkpIHtcbiAgICAgICAgICBxdWV1ZWRQYWNrYWdlTmFtZXMuYWRkKG5lc3RlZFBhY2thZ2VOYW1lKTtcbiAgICAgICAgICBwYWNrYWdlTmFtZXNUb0NvcHkucHVzaChuZXN0ZWRQYWNrYWdlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29waWVkUGFja2FnZXM7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFN1YmRpcmVjdG9yeShyb290RGlyUGF0aDogc3RyaW5nLCBvdXREaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gIGlmIChyZWxhdGl2ZVBhdGggJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSkgcmV0dXJuO1xuXG4gIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBPdXRwdXQgZGlyZWN0b3J5IG11c3QgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3Qgcm9vdDogJHtvdXREaXJQYXRofWApKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBidWlsZFByaXZhdGVQYWNrYWdlKHJvb3REaXJQYXRoOiBzdHJpbmcsIG91dERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IFByaXZhdGVQYWNrYWdlIHtcbiAgY29uc3QgdW5zY29wZWRQYWNrYWdlTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnQHdpbGxib29zdGVyJywgdW5zY29wZWRQYWNrYWdlTmFtZSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUHJpdmF0ZSBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICR7cGFja2FnZU5hbWV9ICgke3NvdXJjZURpclBhdGh9KWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBwYWNrYWdlTmFtZSxcbiAgICBzb3VyY2VEaXJQYXRoLFxuICAgIHRhcmdldERpclBhdGg6IHBhdGguam9pbihvdXREaXJQYXRoLCB1bnNjb3BlZFBhY2thZ2VOYW1lKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZFByaXZhdGVHaXREZXBlbmRlbmN5TmFtZXMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBwYWNrYWdlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lLZXlzKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb25ba2V5XTtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwZW5kZW5jaWVzKSkge1xuICAgICAgaWYgKCFpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSkgY29udGludWU7XG5cbiAgICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIGdpdCBkZXBlbmRlbmN5IG11c3QgYmUgYW4gQHdpbGxib29zdGVyIHBhY2thZ2U6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VOYW1lcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLm5ldyBTZXQocGFja2FnZU5hbWVzKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VQcml2YXRlR2l0RGVwZW5kZW5jaWVzKFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIGNvcGllZFBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT5cbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIGNvcGllZFBhY2thZ2VzLnZhbHVlcygpKSB7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICBpZiAoIXJlcGxhY2VQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhwYWNrYWdlSnNvblBhdGgsIHBhY2thZ2VKc29uLCBjb3BpZWRQYWNrYWdlcykpIGNvbnRpbnVlO1xuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBgJHtKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKX1cXG5gLCAndXRmOCcpO1xuICAgICAgY29uc29sZS5pbmZvKGBSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzIGluICR7cGF0aC5yZWxhdGl2ZShvdXREaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpfWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGNvcGllZFBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT5cbik6IGJvb2xlYW4ge1xuICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5S2V5cykge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uW2tleV07XG4gICAgaWYgKCFkZXBlbmRlbmNpZXMpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykpIHtcbiAgICAgIGlmICghaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdGFyZ2V0UGFja2FnZSA9IGNvcGllZFBhY2thZ2VzLmdldChuYW1lKTtcbiAgICAgIGlmICghdGFyZ2V0UGFja2FnZSkgY29udGludWU7XG5cbiAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9IGBmaWxlOiR7cGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgdGFyZ2V0UGFja2FnZS50YXJnZXREaXJQYXRoKX1gO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25QYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKGRpcmVudC5uYW1lID09PSAnbm9kZV9tb2R1bGVzJyB8fCBkaXJlbnQubmFtZSA9PT0gJy5naXQnKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goLi4uKGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKGNoaWxkUGF0aCkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lID09PSAncGFja2FnZS5qc29uJykge1xuICAgICAgcGFja2FnZUpzb25QYXRocy5wdXNoKGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWNrYWdlSnNvblBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4udGVzdCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15Ad2lsbGJvb3N0ZXJcXC8vLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgY29waWVkUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPik6IHZvaWQge1xuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZWNyZWF0ZSAke291dERpclBhdGh9YCk7XG4gIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06ICR7cHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aH1gKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZXdyaXRlIGNvcGllZCBwcml2YXRlIGdpdCBkZXBlbmRlbmNpZXMgdG8gZmlsZTouLi88bmFtZT5gKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gICctLSc/OiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYgeyAnLS0nPzogc3RyaW5nW10gfVxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICBjb25zdCBtaXNlQWdlS2V5U2VjcmV0T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZXG4gICAgICA/ICdcXG4gICAgICAgIC0tc2VjcmV0IGlkPW1pc2VfYWdlX2tleSxlbnY9TUlTRV9BR0VfS0VZJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259JHttaXNlQWdlS2V5U2VjcmV0T3B0aW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3RoaXMuc3RhcnQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMsIGFkZGl0aW9uYWxBcmdzKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgY29uc3QgYWxsb2NhdGVUdHkgPSBhZGRpdGlvbmFsQXJncy5pbmNsdWRlcygnL2Jpbi9iYXNoJyk7XG4gICAgY29uc3QgbWlzZUFnZUtleUVudk9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWSA/ICctLWVudiBNSVNFX0FHRV9LRVkgJyA6ICcnO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30ke21pc2VBZ2VLZXlFbnZPcHRpb259LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kLCBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHtcbiAgZmluZEQxTWlncmF0aW9uc0RpclBhdGgsXG4gIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbiAgd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwsXG59IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBkcml6emxlU2NyaXB0cyB9IGZyb20gJy4uL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyB7XG4gIC8qKiAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgKi9cbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXTtcbiAgLyoqIFJhdyBQbGF5d3JpZ2h0IGFyZ3MgZm9yd2FyZGVkIGFmdGVyIGB3YiB0ZXN0IC0tIC4uLmAgKi9cbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcC5cbiAqIE5vdGUgdGhhdCBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVNjcmlwdHMge1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3Ioc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwID0gc2hvdWxkV2FpdEFuZE9wZW5BcHA7XG4gIH1cblxuICBidWlsZERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkSW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuICBhc3luYyBzdGFydERldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXN5bmMgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3diJyxcbiAgICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICAgIGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyksXG4gICAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgICBdKX1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgY3VzdG9tU3RhcnRTY3JpcHRQYXRoID0gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdCk7XG4gICAgaWYgKGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCkge1xuICAgICAgY29uc3Qgc3RhcnRDb21tYW5kID1cbiAgICAgICAgYCR7YnVpbGRTaGVsbENvbW1hbmQoWydiYXNoJywgY3VzdG9tU3RhcnRTY3JpcHRQYXRoXSl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gICAgICAvLyBBIHN0YXJ0IHNjcmlwdCBmb3VuZCBhdCB0aGUgbW9ub3JlcG8gcm9vdCAoY2YuIFByb2plY3QuZmluZEZpbGUpIGlzIHdyaXR0ZW4gdG8gcnVuIGZyb21cbiAgICAgIC8vIHRoZSByb290LCBsaWtlIERvY2tlcidzIFdPUktESVIsIHNvIGl0cyBjd2QgbXVzdCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc2NyaXB0cy8uXG4gICAgICBjb25zdCBzY3JpcHRSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSk7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3QsIGFyZ3YsIFtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIHNjcmlwdFJvb3REaXJQYXRoID09PSBwcm9qZWN0LmRpclBhdGhcbiAgICAgICAgICA/IHN0YXJ0Q29tbWFuZFxuICAgICAgICAgIDogYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBzY3JpcHRSb290RGlyUGF0aF0pfSAmJiAke3N0YXJ0Q29tbWFuZH0pYCxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIGNvbnN0IGVjb3N5c3RlbUNvbmZpZ1BhdGggPSBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjb21tYW5kcyA9IGVjb3N5c3RlbUNvbmZpZ1BhdGhcbiAgICAgID8gW3Byb2plY3QuYnVpbGRDb21tYW5kLCBgcG0yLXJ1bnRpbWUgc3RhcnQgLS1uby1hdXRvcmVzdGFydCAke2Vjb3N5c3RlbUNvbmZpZ1BhdGh9YF1cbiAgICAgIDogdGhpcy5idWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgY29tbWFuZHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgYCR7cHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4nIDogJ25vZGUnfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIGNvbW1hbmRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgLy8gVGVzdC1lbnZpcm9ubWVudCB3cmFuZ2xlciBzdGF0ZSBpcyBkaXNwb3NhYmxlOyB3aXBlIGl0IGVudGlyZWx5IChub3QganVzdCBEMSkgYmVmb3JlXG4gICAgLy8gbWlncmF0aW5nLCBzaW5jZSBzdGFsZSBLViBjYWNoZSBlbnRyaWVzIG9yIER1cmFibGUgT2JqZWN0IHN0b3JhZ2UgY2FuIGJyZWFrIGUyZSB0ZXN0cy5cbiAgICBjb25zdCB3cmFuZ2xlclN0YXRlV2lwZUNvbW1hbmRzID1cbiAgICAgIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KVxuICAgICAgICA/IFtgcm0gLVJmIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCJgXVxuICAgICAgICA6IFtdO1xuICAgIC8vIEEgcHJvamVjdCB3aG9zZSBEMSBiaW5kaW5ncyBjYXJyeSB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyBhcHBsaWVzIHRoZW0gd2l0aCB3cmFuZ2xlclxuICAgIC8vIChzZWUgV29ya2Vyc1NjcmlwdHMgLyBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCkuIFJ1bm5pbmcgZHJpenpsZS1raXQgbWlncmF0ZSBhZ2FpbnN0XG4gICAgLy8gdGhlIHNhbWUgbG9jYWwgRDEgd291bGQgYXBwbHkgdGhlIHNhbWUgU1FMIHR3aWNlIOKAlCBkcml6emxlJ3MgZ2VuZXJhdGVkIHN0YXRlbWVudHMgYXJlIG5vdFxuICAgIC8vIGlkZW1wb3RlbnQgKGBDUkVBVEUgSU5ERVhgIHdpdGhvdXQgSUYgTk9UIEVYSVNUUykg4oCUIHNvIGRyaXp6bGUgc3RheXMgT1JNLW9ubHkgdGhlcmUuXG4gICAgY29uc3QgbWlncmF0ZXNEMVdpdGhXcmFuZ2xlciA9ICEhZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZHMgPSBbXG4gICAgICAuLi53cmFuZ2xlclN0YXRlV2lwZUNvbW1hbmRzLFxuICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5oYXNEcml6emxlICYmICFtaWdyYXRlc0QxV2l0aFdyYW5nbGVyXG4gICAgICAgID8gW3dyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3QsIGRyaXp6bGVTY3JpcHRzLm1pZ3JhdGVGb3JTdGFydChwcm9qZWN0KSldXG4gICAgICAgIDogW10pLFxuICAgIF07XG4gICAgLy8gU3BsaXR0aW5nIG1heSBjdXQgdGhyb3VnaCBhIGAoY2Qg4oCmICYmIOKApilgIHN1YnNoZWxsLCBidXQgcmVqb2luaW5nIHdpdGggJyAmJiAnIGFuZCBwZXItcGllY2VcbiAgICAvLyByZWRpcmVjdHMga2VlcHMgdGhlIHNjcmlwdCB2YWxpZCwgYW5kIHdiLWdlbmVyYXRlZCBwYXRocyBuZXZlciBjb250YWluICcmJicuXG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcy5mbGF0TWFwKChjbWQpID0+IGNtZC5zcGxpdCgnJiYnKSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgLy8gVXNlIGVtcHR5IE5PREVfRU5WIHRvIGF2b2lkIFwicHJvZHVjdGlvblwiIG1vZGUgaW4gc29tZSBmcmFtZXdvcmtzIGxpa2UgQmxpdHouanMuXG4gICAgcmV0dXJuIGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ05PREVfRU5WJywgJycpfSAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBcHAocHJvamVjdCksXG4gICAgXSl9YDtcbiAgfVxuXG4gIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICB7IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gW10sIHBsYXl3cmlnaHRBcmdzID0gWyd0ZXN0JywgJ3Rlc3QvZTJlLyddIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMsIGFyZ3YuYmFpbCwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICdydW4nLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnc2NyaXB0cy9zdGFydC1wcm9kdWN0aW9uLnNoJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gc3VwZXIudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBzdGFydENvbW1hbmQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXRzID0gdGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC9lMmUvJ107XG4gICAgY29uc3QgdGVzdENvbW1hbmQgPSB0aGlzLnRlc3RVbml0KHByb2plY3QsIHsgLi4uYXJndiwgdGFyZ2V0czogbm9ybWFsaXplZFRhcmdldHMgfSk7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgJHt0ZXN0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gbmV4dCBkZXYgLS10dXJib3BhY2sgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYFlBUk4gbmV4dCBzdGFydCAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBTRVJWRVJfTE9HX0ZJTEUgPSAnc2VydmVyLmxvZyc7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQge1xuICBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCxcbiAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZCxcbiAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyB2aW5leHQgKE5leHQuanMgb24gVml0ZSkgYXBwcyB0YXJnZXRpbmcgQ2xvdWRmbGFyZSBXb3JrZXJzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaW5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgLy8gVW5saWtlIGBuZXh0IGRldmAsIFZpdGUtYmFzZWQgdmluZXh0IGRvZXMgbm90IHJlYWQgdGhlIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAgY29uc3QgZGV2Q29tbWFuZCA9IGBZQVJOIHZpbmV4dCBkZXYgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAvLyBUaGUgQ2xvdWRmbGFyZSB2aXRlIHBsdWdpbiAobWluaWZsYXJlKSByZWFkcyBydW50aW1lIHZhcnMgb25seSBmcm9tIGEgLmRldi52YXJzIGZpbGUsXG4gICAgLy8gc28gaXQgbXVzdCBiZSByZWdlbmVyYXRlZCBmcm9tIHRoZSB3Yi1tYW5hZ2VkIC5lbnYgZmlsZXMgYmVmb3JlIHNlcnZpbmcuXG4gICAgY29uc3QgY29tbWFuZHMgPSBbYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnLmRldi52YXJzJyldO1xuICAgIC8vIGB2aW5leHQgZGV2YCAobWluaWZsYXJlKSBzdGFydHMgd2l0aCBhbiBlbXB0eSBsb2NhbCBEMSBhbmQgYXBwbGllcyBubyBtaWdyYXRpb25zIGl0c2VsZjtcbiAgICAvLyB0aGUgdGVzdCBlbnZpcm9ubWVudCB3aXBlcyBpdHMgc3RhdGUgZGlyZWN0b3J5LCBzbyBldmVyeSBwYWdlIHdvdWxkIDUwMCB3aXRob3V0IHRoaXMuXG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZCA9IGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgPyBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobWlncmF0aW9uQ29tbWFuZCkgY29tbWFuZHMucHVzaChtaWdyYXRpb25Db21tYW5kKTtcbiAgICByZXR1cm4gWy4uLmNvbW1hbmRzLCBkZXZDb21tYW5kXS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgLy8gU2VydmluZyB0aGUgYnVpbHQgd29ya2VyIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IChvciB3aXBlZCkgbG9jYWwgRDEsIHNvIHdyYW5nbGVyLW5hdGl2ZVxuICAgIC8vIG1pZ3JhdGlvbnMgKGlmIGFueSkgbXVzdCBiZSBhcHBsaWVkIGZpcnN0OyBkcml6emxlL3ByaXNtYSBtaWdyYXRpb25zIGFyZSBoYW5kbGVkIGJ5XG4gICAgLy8gYnVpbGRQcm9kdWN0aW9uQ29tbWFuZC5cbiAgICBjb25zdCBkMU1pZ3JhdGlvbnNDb21tYW5kID0gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCk7XG4gICAgLy8gYHZpbmV4dCBidWlsZGAgZW1pdHMgYSB3b3JrZXIgYnVuZGxlIGFuZCBpdHMgd3JhbmdsZXIgY29uZmlnIHVuZGVyIGRpc3Qvc2VydmVyLCBzbyB0aGVcbiAgICAvLyAuZGV2LnZhcnMgZmlsZSBleHBvc2luZyB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcyBtdXN0IGJlIGdlbmVyYXRlZCBhZnRlciBidWlsZGluZy5cbiAgICAvLyBgLS1sb2NhbC11cHN0cmVhbWAga2VlcHMgcmVxdWVzdCBVUkxzIG9uIHRoZSBsb2NhbCBob3N0OyBvdGhlcndpc2UsIHdyYW5nbGVyIGRldiBzaW11bGF0ZXNcbiAgICAvLyB0aGUgcHJvZHVjdGlvbiBjdXN0b20gZG9tYWluIGRlY2xhcmVkIGluIHRoZSB3cmFuZ2xlciBjb25maWcgcm91dGVzLlxuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJ2Rpc3Qvc2VydmVyLy5kZXYudmFycycpLFxuICAgICAgLi4uKGQxTWlncmF0aW9uc0NvbW1hbmQgPyBbZDFNaWdyYXRpb25zQ29tbWFuZF0gOiBbXSksXG4gICAgICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChcbiAgICAgICAgYGRldiAtLWNvbmZpZyBkaXN0L3NlcnZlci93cmFuZ2xlci5qc29uIC0taXAgMTI3LjAuMC4xIC0tcG9ydCAke3BvcnR9IC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiIC0tbG9jYWwtdXBzdHJlYW0gbG9jYWxob3N0OiR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKVxuICAgICAgKSxcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aW5leHRTY3JpcHRzID0gbmV3IFZpbmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgSHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHBzIChkZXRlY3RlZCB2aWEgYSB3cmFuZ2xlclxuICogY29uZmlnIGZpbGUgd2hlbiBubyBvdGhlciBmcmFtZXdvcmsgbWF0Y2hlczsgdmluZXh0IGFwcHMgaGF2ZSB0aGVpciBvd24gc2NyaXB0cykuXG4gKiBFeHRlbmRzIEh0dHBTZXJ2ZXJTY3JpcHRzIHNvIHRoYXQgZTJlIHRlc3RzIHJ1biB2aWEgdGhlIHVuaXQtdGVzdCBydW5uZXIgYWdhaW5zdCB0aGUgcnVubmluZ1xuICogd29ya2VyIHdoZW4gdGhlIHByb2plY3QgaGFzIG5vIFBsYXl3cmlnaHQgY29uZmlnLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBXb3JrZXJzU2NyaXB0cyBleHRlbmRzIEh0dHBTZXJ2ZXJTY3JpcHRzIHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0LCBhcmd2KS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICAvLyB3cmFuZ2xlciBkZXYgYnVuZGxlcyB0aGUgd29ya2VyIGl0c2VsZiwgc28gbm8gc2VwYXJhdGUgYnVpbGQgc3RlcCBpcyBuZWVkZWQuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnODc4Nyc7XG4gICAgY29uc3Qgc3RhdGVEaXIgPSBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCk7XG5cbiAgICAvLyBUaGVzZSBoZWxwZXJzIHJlYWQgdGhlIGRlZmF1bHQtbmFtZWQgd3JhbmdsZXIgY29uZmlnOyB0aGF0IGlzIHNhZmUgYmVjYXVzZSB3b3JrZXJzU2NyaXB0c1xuICAgIC8vIGl0c2VsZiBpcyBvbmx5IHNlbGVjdGVkIHdoZW4gc3VjaCBhIGNvbmZpZyBmaWxlIGV4aXN0cyBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuXG4gICAgY29uc3QgY29tbWFuZHMgPSBbYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnLmRldi52YXJzJyldO1xuICAgIC8vIEFwcGx5IHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIChpZiBhbnkpIHNvIHRoZSBsb2NhbCBkYXRhYmFzZSBtYXRjaGVzIHRoZSBkZXBsb3llZCBvbmUuXG4gICAgY29uc3QgZDFNaWdyYXRpb25zQ29tbWFuZCA9IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpO1xuICAgIGlmIChkMU1pZ3JhdGlvbnNDb21tYW5kKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGQxTWlncmF0aW9uc0NvbW1hbmQpO1xuICAgIH1cbiAgICBjb21tYW5kcy5wdXNoKFxuICAgICAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoXG4gICAgICAgIGBkZXYgLS1pcCAxMjcuMC4wLjEgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gLS1wZXJzaXN0LXRvIFwiJHtzdGF0ZURpcn1cIiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHdvcmtlcnNTY3JpcHRzID0gbmV3IFdvcmtlcnNTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiU3RhcnQgYXBwLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGFwcCBjb21tYW5kLiBFeGFtcGxlOiB3YiBzdGFydCAtLSAtLWhvc3QgMC4wLjAuMFwiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KS5vcHRpb25zKGJ1aWxkZXIpIGFzIEFyZ3Y8XG4gICAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuICAgID4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy52aW5leHQgfHwgZGV2RGVwcy52aW5leHQpIHtcbiAgICAgICAgLy8gdmluZXh0IGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gdGhpcyBjaGVjayBtdXN0IGNvbWUgZmlyc3QuXG4gICAgICAgIHNjcmlwdHMgPSB2aW5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCkpIHtcbiAgICAgICAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICAgICAgICBzY3JpcHRzID0gd29ya2Vyc1NjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlID8/ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ2RldmVsb3BtZW50JztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERldihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhd2FpdCBzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQgPSAyMDA7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPID0gMC4wNTtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246ICdIb3cgdG8gcnVuIEUyRSB0ZXN0cycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYmFpbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RvcCB0ZXN0cyBhZnRlciB0aGUgZmlyc3QgZmFpbHVyZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgYXJyYXk6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdVbml0IG9yIEUyRSB0ZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFRlc3RDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj47XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VGVzdENvbW1hbmRPcHRpb25zPiAmIHsgJy0tJz86IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdFJ1bk9wdGlvbnMge1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVGVzdENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgZmxhZ3MgdG8gUGxheXdyaWdodC4gRXhhbXBsZTogd2IgdGVzdCAtLSAtLWdyZXAgJ3VwbG9hZGVkIGltYWdlIGFzc2V0J1wiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pOiBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4gPT5cbiAgICB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpXG4gICAgICAucG9zaXRpb25hbCgndGFyZ2V0cycsIGFyZ3VtZW50c0J1aWxkZXIudGFyZ2V0cykgYXMgQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoYXJndjogVGVzdENvbW1hbmRBcmd2LCBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3YpO1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHModGVzdEFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKHRlc3RBcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IHRlc3RBcmd2WyctLSddID8/IFtdO1xuICBjb25zdCB7IHNob3VsZFJ1bkUyZSwgc2hvdWxkUnVuVW5pdCB9ID0gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKHRlc3RUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSB7XG4gICAgICAvLyB2aW5leHQgYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyB0aGlzIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbiAgICAgIHNjcmlwdHMgPSB2aW5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpKSB7XG4gICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICBzY3JpcHRzID0gd29ya2Vyc1NjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZGVmYXVsdFVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgICB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiBkZWZhdWx0VW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IGRlZmF1bHRVbml0VGFyZ2V0cyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgIHRpbWVvdXQ6IHRlc3RBcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBpZiAoc2hvdWxkUnVuRTJlKSB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZShwcm9qZWN0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBlMmUgdGFyZ2V0cyBmb3IgdGhpcyBwcm9qZWN0XG4gICAgY29uc3QgZTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMuYmxpdHogfHwgZGVwcy5uZXh0IHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10gfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgICAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vKipcbiAqIFdhcm4gd2hlbiBhIHByb2plY3QgaGFzIGEgUGxheXdyaWdodCBjb25maWcgYnV0IG5vIHRlc3QvZTJlIGRpcmVjdG9yeS5cbiAqIHdiIGRpc2NvdmVycyBlMmUgdGVzdHMgb25seSB1bmRlciB0ZXN0L2UyZS8sIHNvIHN1Y2ggcHJvamVjdHMgd291bGQgb3RoZXJ3aXNlIGhhdmUgdGhlaXJcbiAqIFBsYXl3cmlnaHQgc3BlY3Mgc2lsZW50bHkgc2tpcHBlZCBhbmQgYHdiIHRlc3RgIC8gYHdiIHZlcmlmeSAtLWZ1bGxgIHdvdWxkIHJlcG9ydCBzdWNjZXNzXG4gKiB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ25hbWUnIHwgJ3BhY2thZ2VKc29uJz5cbik6IHZvaWQge1xuICAvLyBDYWxsZXJzIGludm9rZSB0aGlzIG9ubHkgYWZ0ZXIgZXN0YWJsaXNoaW5nIHRoYXQgdGVzdC9lMmUgaXMgbWlzc2luZywgc28gaXQgaXMgbm90IHJlLWNoZWNrZWRcbiAgLy8gaGVyZS4gQSB3b3Jrc3BhY2Ugcm9vdCBkZWxlZ2F0ZXMgZTJlIHRvIGl0cyBwYWNrYWdlcywgc28gaXQgbmV2ZXIgd2FybnMgKGNoZWNrZWQgZmlyc3QgdG8gc2tpcFxuICAvLyB0aGUgZmlsZXN5c3RlbSBsb29rdXAgYmVsb3cpLiBPbmx5IGEgcHJvamVjdCdzIE9XTiBQbGF5d3JpZ2h0IGNvbmZpZyBjb3VudHM6IGBoYXNQbGF5d3JpZ2h0Q29uZmlnYFxuICAvLyB3YWxrcyB1cCB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc28gcmV1c2luZyBpdCB3b3VsZCBmYWxzZS1wb3NpdGl2ZSBvbiBsaWJyYXJ5IHBhY2thZ2VzIGFuZCB0aGVcbiAgLy8gcm9vdCBpdHNlbGYsIHdoaWNoIGxlZ2l0aW1hdGVseSBzaGFyZSBhIHJvb3QtbGV2ZWwgcGxheXdyaWdodC5jb25maWcudHMgYnV0IGtlZXAgZTJlIHNwZWNzIGluIGFcbiAgLy8gc2luZ2xlIGFwcCBwYWNrYWdlLlxuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSByZXR1cm47XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKSkpIHJldHVybjtcblxuICBjb25zb2xlLndhcm4oXG4gICAgY2hhbGsueWVsbG93KFxuICAgICAgYFNraXBwaW5nIGUyZSB0ZXN0cyBmb3IgJHtwcm9qZWN0Lm5hbWV9OiBhIFBsYXl3cmlnaHQgY29uZmlnIGV4aXN0cyBidXQgdGhlIHRlc3QvZTJlIGRpcmVjdG9yeSBpcyBtaXNzaW5nLiB3YiBvbmx5IGRpc2NvdmVycyBQbGF5d3JpZ2h0IHNwZWNzIHVuZGVyIHRlc3QvZTJlLywgc28gbW92ZSB0aGVtIHRoZXJlIHRvIHJ1biBlMmUgdGVzdHMuYFxuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndjogVGVzdENvbW1hbmRBcmd2KTogVGVzdENvbW1hbmRBcmd2IHtcbiAgaWYgKGFyZ3YuZW52Py5sZW5ndGggfHwgYXJndi5jYXNjYWRlRW52IHx8IGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gYXJndjtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSA/IFsndGVzdCcsICctLWV4Y2x1ZGUnLCAndGVzdC9lMmUvKionXSA6IFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgd29ya2Vyc1NjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZSB9IGZyb20gJy4vdGVzdC5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBTcGF3bmVkIGNvbW1hbmRzIHJlLWRlcml2ZSB0aGVpciBkb3RlbnYgY2FzY2FkZSBmcm9tIHRoZSBleHBvcnRlZCBXQl9FTlYsIHNvIGFuIHVuZXhwb3J0ZWRcbiAgLy8gV0JfRU5WIHdvdWxkIGxldCBhIGNvbW1pdHRlZCBgLmVudmAgKGUuZy4gV0JfRU5WPWRldmVsb3BtZW50KSBzZWxlY3QgdGhlIGRldmVsb3BtZW50XG4gIC8vIGVudmlyb25tZW50IOKAlCBydW5uaW5nIHRoZSBkZXN0cnVjdGl2ZSBlMmUgc3VpdGUgYWdhaW5zdCB0aGUgZGV2ZWxvcGVyJ3Mgb3duIGRhdGFiYXNlLlxuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuQ0kgfHw9ICcxJztcbiAgICAvLyBPdmVyd3JpdGUsIG5vdCB8fD06IHByb2plY3QuZW52IGFscmVhZHkgY2FycmllcyB0aGUgZG90ZW52LWRlcml2ZWQgdmFsdWUuXG4gICAgcHJvamVjdC5lbnYuV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuXG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLnZpbmV4dCB8fCBkZXZEZXBzLnZpbmV4dCkge1xuICAgICAgLy8gdmluZXh0IGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gdGhpcyBjaGVjayBtdXN0IGNvbWUgZmlyc3QuXG4gICAgICBzY3JpcHRzID0gdmluZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkge1xuICAgICAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICAgICAgc2NyaXB0cyA9IHdvcmtlcnNTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3QgaGFzRG9ja2VyZmlsZSA9IHByb2plY3QuaGFzRG9ja2VyZmlsZTtcbiAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIC8vIENvbmZpcm0gZGV2IHNlcnZlciBzdGFydHVwIGZvciBjb25zaXN0ZW5jeSBhY3Jvc3MgcHJvamVjdHMgd2l0aCBFMkUgdGVzdHMuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGF3YWl0IHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NyaXB0ID0gaGFzRG9ja2VyZmlsZVxuICAgICAgICA/IGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7fSlcbiAgICAgICAgOiBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHt9KTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0LnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUocHJvamVjdCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmludGVyZmFjZSBUcmVlS2lsbENvbW1hbmRBcmdzIHtcbiAgcGlkOiBudW1iZXI7XG4gIHNpZ25hbDogc3RyaW5nO1xufVxuXG5jb25zdCBidWlsZGVyID0gKHlhcmdzOiBBcmd2KTogQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPiA9PlxuICB5YXJnc1xuICAgIC5wb3NpdGlvbmFsKCdwaWQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwcm9jZXNzIElEIHRvIGtpbGwuJyxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbignc2lnbmFsJywge1xuICAgICAgZGVzY3JpcHRpb246ICdTaWduYWwgdG8gc2VuZCB0byB0aGUgcHJvY2VzcyB0cmVlLicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHQ6ICdTSUdURVJNJyxcbiAgICB9KSBhcyBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+O1xuXG5leHBvcnQgY29uc3QgdHJlZUtpbGxDb21tYW5kOiBDb21tYW5kTW9kdWxlPG9iamVjdCwgVHJlZUtpbGxDb21tYW5kQXJncz4gPSB7XG4gIGNvbW1hbmQ6ICd0cmVlLWtpbGwgPHBpZD4gW3NpZ25hbF0nLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIGdpdmVuIHByb2Nlc3MgYW5kIGFsbCBkZXNjZW5kYW50cycsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBhcmd2LnNpZ25hbCBhcyBOb2RlSlMuU2lnbmFscztcbiAgICAgIGlmICghKHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpZ25hbDogJHtzaWduYWx9YCk7XG4gICAgICB9XG4gICAgICB0cmVlS2lsbChhcmd2LnBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xuZXhwb3J0IHR5cGUgVHlwZUNoZWNrQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0eXBlQ2hlY2soYXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHR5cGVDaGVjayhhcmd2OiBUeXBlQ2hlY2tDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBsZXQgcmVtb3ZlZE5leHREaXIgPSBmYWxzZSBhcyBib29sZWFuO1xuICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzIHx8IHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgICAgY29tbWFuZHMucHVzaCguLi5idWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0KSk7XG4gICAgfVxuICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgncHlyaWdodCcpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICB9XG4gICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZUNvbG9yOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgcmVtb3ZlZE5leHREaXIgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgfVxuICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgIH1cbiAgfVxuICBpZiAoIWZpbmFsRXhpdENvZGUpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgIHJlbW92ZWROZXh0RGlyXG4gICAgICAgICAgPyAnLS0tLS1cXG5ObyB0eXBlIGVycm9ycyBmb3VuZC4gUGxlYXNlIGlnbm9yZSB0aGUgcHJldmlvdXMgdHlwZSBlcnJvcnMsIGFzIHRoZXkgd2VyZSBjYXVzZWQgYnkgb3V0ZGF0ZWQgTmV4dC5qcyBjYWNoZSBmaWxlcy4nXG4gICAgICAgICAgOiAnTm8gdHlwZSBlcnJvcnMgZm91bmQuJ1xuICAgICAgKVxuICAgICk7XG4gIHJldHVybiBmaW5hbEV4aXRDb2RlO1xufVxuXG5mdW5jdGlvbiBidWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyBgdHlwZXNjcmlwdGAgKGB0c2NgKTsgd2JmeSByZW1vdmVzIHRoZVxuICAvLyBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSBwcmV2aWV3IGZyb20gbm9uLU5leHQuanMgcmVwb3MgKE5leHQuanMtZmFtaWx5XG4gIC8vIHJlcG9zIGtlZXAgaXQgZm9yIGBuZXh0IGJ1aWxkYCksIHNvIHJlcG9zIHN0aWxsIG9uIHRoZSBwcmV2aWV3IHNob3VsZCBydW4gd2JmeVxuICAvLyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYSB0c2dvIGZhbGxiYWNrIGhlcmUuXG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3R5cGVzY3JpcHQnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2MgLS1ub0VtaXQnXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMsIGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2LCB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52IH0gZnJvbSAnLi90ZXN0LmpzJztcbmltcG9ydCB7IHR5cGVDaGVjaywgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiB9IGZyb20gJy4vdHlwZWNoZWNrLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xudHlwZSBQYWNrYWdlQ29tbWFuZEFyZ3YgPSBQaWNrPFZlcmlmeUNvZGVDb21tYW5kQXJndiwgJ2RyeVJ1bicgfCAndmVyYm9zZSc+O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCAoYXJndi5mdWxsID8gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YpIDogdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2KTtcbiAgICBhd2FpdCBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgLCBwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAnY2xlYW51cCcsXG4gICAgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBMaW50Q29tbWFuZEFyZ3YpLFxuICAgIHsgc2lsZW50OiB0cnVlIH1cbiAgKTtcbiAgLy8gVHlwZS1hd2FyZSBsaW50IHJlcG9ydHMgVHlwZVNjcmlwdCBkaWFnbm9zdGljcyBvbmx5IGZvciB0aGUgZmlsZXMgb3hsaW50IGFjdHVhbGx5IGxpbnRzLCBhbmRcbiAgLy8gdGhlIHNoYXJlZCBjb25maWcgaWdub3JlcyBkaXJlY3RvcmllcyB0c2Mgc3RpbGwgY29tcGlsZXMgKGUuZy4gYF9fZ2VuZXJhdGVkX19gLCBgQHR5cGVzYCxcbiAgLy8gYGRpc3RgKS4gS2VlcCB0aGUgdHlwZWNoZWNrIGNvbW1hbmQgc28gYHZlcmlmeWAgc3RheXMgZXF1aXZhbGVudCB0byBcInRoZSByZXBvc2l0b3J5IGNvbXBpbGVzXCIuXG4gIC8vIFRoZSBvdmVybGFwIHdpdGggbGludCBpcyBkZWxpYmVyYXRlOiBgLS10eXBlLWF3YXJlYCBhbHNvIHBvd2VycyB0eXBlLWF3YXJlIGxpbnQgcnVsZXMsIGFuZFxuICAvLyBkcm9wcGluZyBvbmx5IGAtLXR5cGUtY2hlY2tgIGZyb20gbGludCBzYXZlcyB+MC4xcywgZmFyIGxlc3MgdGhhbiB0aGUgY292ZXJhZ2UgaXQgd291bGQgY29zdC5cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAndHlwZWNoZWNrJyxcbiAgICAoKSA9PiB0eXBlQ2hlY2soeyAuLi5hcmd2LCBfOiBbJ3R5cGVjaGVjayddIH0gYXMgdW5rbm93biBhcyBUeXBlQ2hlY2tDb21tYW5kQXJndiksXG4gICAgeyBzaWxlbnQ6IHRydWUgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KHtcbiAgICAuLi5hcmd2LFxuICAgIF86IFsndGVzdCddLFxuICAgIGUyZTogJ2hlYWRsZXNzJyxcbiAgICBzaWxlbnQ6IHRydWUsXG4gIH0gYXMgdW5rbm93biBhcyBUZXN0Q29tbWFuZEFyZ3YpO1xuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSByZXR1cm47XG5cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGItcmVzZXQnXSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCAndGVzdCcpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKFxuICAgIGNoYWxrLnllbGxvdygnVGVzdHMgZmFpbGVkLiBUaGlzIHByb2plY3QgZGVmaW5lcyBcImRiLXJlc2V0XCIsIHNvIHdiIHdpbGwgcmVzZXQgdGhlIGRhdGFiYXNlIG9uY2UgYW5kIHJldHJ5IHRlc3RzLicpXG4gICk7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3BhY2thZ2VNYW5hZ2VyfSBkYi1yZXNldGAsIGZpbmRUZXN0UHJvamVjdChwcm9qZWN0LCB0ZXN0QXJndiksIHRlc3RBcmd2LCB7XG4gICAgcHJpbnRSYXdPdXRwdXQ6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IHJldHJ5RXhpdENvZGUgPSBhd2FpdCB0ZXN0KHRlc3RBcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gIGlmIChyZXRyeUV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke3JldHJ5RXhpdENvZGV9KTpgKSwgJ3Rlc3QgYWZ0ZXIgZGItcmVzZXQgcmV0cnknKSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldHJ5RXhpdENvZGUpO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignVGVzdHMgcGFzc2VkIGFmdGVyIGRiLXJlc2V0IHJldHJ5LicpKTtcbn1cblxuZnVuY3Rpb24gZmluZFRlc3RQcm9qZWN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFByb2plY3Qge1xuICBjb25zdCB0ZXN0UHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoIXRlc3RQcm9qZWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0IG5vdCBmb3VuZDogJHtwcm9qZWN0LmRpclBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHRlc3RQcm9qZWN0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5JblByb2Nlc3NDb21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBjb21tYW5kOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkpO1xuICB9XG4gIGNvbnN0IGV4aXRDb2RlID0gKGF3YWl0IGNvbW1hbmQoKSkgPz8gMDtcbiAgaWYgKGV4aXRDb2RlID09PSAwIHx8IG9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBjb21tYW5kTmFtZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFja2FnZUNvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHByaW50UmF3T3V0cHV0PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgcHJlc2VydmVDb2xvcjogZmFsc2UgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICghb3B0aW9ucy5wcmludFJhd091dHB1dCkge1xuICAgIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZCwgZXhpdENvZGUsIHJldC5zdGRvdXQpO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUHJpbnRzIHBhY2thZ2UgY29tbWFuZCBvdXRwdXQgZm9yIGB3YiB2ZXJpZnlgLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBzbyBzdWNjZXNzZnVsIG5vaXN5XG4gKiBjb21tYW5kcyBhcmUgc3VtbWFyaXplZCB3aGlsZSBmYWlsdXJlIG91dHB1dCByZW1haW5zIGF2YWlsYWJsZSBmb3IgZGlhZ25vc2lzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIFRoZSBleGVjdXRlZCBjb21tYW5kLlxuICogQHBhcmFtIGV4aXRDb2RlIFRoZSBjb21tYW5kIGV4aXQgY29kZS5cbiAqIEBwYXJhbSBvdXRwdXQgVGhlIG1lcmdlZCBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kOiBzdHJpbmcsIGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCAmJiAoY29tbWFuZCA9PT0gYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIHx8IGNvbW1hbmQgPT09IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZWApKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWRPdXRwdXQgPSBvdXRwdXQudHJpbSgpO1xuICBpZiAodHJpbW1lZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHRyaW1tZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdDogUHJvamVjdCk6IHtcbiAgZmFpbDogKGVycm9yPzogdW5rbm93bikgPT4gdm9pZDtcbiAgZmluaXNoOiAoKSA9PiB2b2lkO1xuICBzdWNjZWVkOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHdiRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcud2InKTtcbiAgZnMubWtkaXJTeW5jKHdiRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4od2JEaXJQYXRoLCAndmVyaWZ5LWZ1bGwubG9nJyk7XG4gIGNvbnN0IGxvZ0ZpbGUgPSBmcy5vcGVuU3luYyhsb2dGaWxlUGF0aCwgJ3cnKTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRvdXRXcml0ZSA9IHByb2Nlc3Muc3Rkb3V0LndyaXRlLmJpbmQocHJvY2Vzcy5zdGRvdXQpO1xuICBjb25zdCBvcmlnaW5hbFN0ZGVycldyaXRlID0gcHJvY2Vzcy5zdGRlcnIud3JpdGUuYmluZChwcm9jZXNzLnN0ZGVycik7XG4gIGxldCBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZG91dFdyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUob3JpZ2luYWxTdGRlcnJXcml0ZSwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihjaGFsay5ib2xkKCdGdWxsIGxvZzonKSwgbG9nRmlsZVBhdGgpKTtcblxuICBjb25zdCBmaW5pc2ggPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSBvcmlnaW5hbFN0ZG91dFdyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IG9yaWdpbmFsU3RkZXJyV3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuXG4gICAgY29uc3QgZWxhcHNlZFRpbWUgPSBmb3JtYXRFbGFwc2VkVGltZShEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBzdGF0dXMgPSBzdWNjZWVkZWQgPyAnU3VjY2VlZGVkJyA6ICdGYWlsZWQnO1xuICAgIGNvbnN0IHN1bW1hcnkgPSBgJHtzdGF0dXN9IGluICR7ZWxhcHNlZFRpbWV9LiBGdWxsIGxvZzogJHtsb2dGaWxlUGF0aH1cXG5gO1xuICAgIGNvbnN0IGNvbG9yZWRTdW1tYXJ5ID0gc3VjY2VlZGVkID8gY2hhbGsuZ3JlZW4oc3VtbWFyeSkgOiBjaGFsay5yZWQoc3VtbWFyeSk7XG4gICAgb3JpZ2luYWxTdGRvdXRXcml0ZShjb2xvcmVkU3VtbWFyeSk7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIHN1bW1hcnkpO1xuICAgIGZzLmNsb3NlU3luYyhsb2dGaWxlKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCBmaW5pc2gpO1xuXG4gIHJldHVybiB7XG4gICAgZmFpbDogKGVycm9yKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbmlzaDogKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignZXhpdCcsIGZpbmlzaCk7XG4gICAgICBmaW5pc2goKTtcbiAgICB9LFxuICAgIHN1Y2NlZWQ6ICgpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGVlV3JpdGUob3JpZ2luYWxXcml0ZTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlLCBsb2dGaWxlOiBudW1iZXIpOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUge1xuICByZXR1cm4gKChcbiAgICBjaHVuazogVWludDhBcnJheSB8IHN0cmluZyxcbiAgICBlbmNvZGluZ09yQ2FsbGJhY2s/OiBCdWZmZXJFbmNvZGluZyB8ICgoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpLFxuICAgIGNhbGxiYWNrPzogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkXG4gICkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9XG4gICAgICB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnXG4gICAgICAgID8gQnVmZmVyLmZyb20oY2h1bmssIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdzdHJpbmcnID8gZW5jb2RpbmdPckNhbGxiYWNrIDogJ3V0ZjgnKVxuICAgICAgICA6IGNodW5rO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBidWZmZXIpO1xuICAgIC8vIFdyaXRlIHRvIHRoZSB0ZXJtaW5hbCB2aWEgdGhlIG9yaWdpbmFsIHN0cmVhbSBtZXRob2Q6IGEgc3luY2hyb25vdXMgZnMud3JpdGVTeW5jIG9uIHRoZVxuICAgIC8vIHN0ZG91dC9zdGRlcnIgZmQgdGhyb3dzIEVBR0FJTiBvbiBDSSdzIG5vbi1ibG9ja2luZyBwaXBlcyB3aGVuIGxhcmdlIG91dHB1dCBmbHVzaGVzIGF0IG9uY2UsXG4gICAgLy8gd2hpbGUgdGhlIHN0cmVhbSBtZXRob2QgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBoYW5kbGVzIGJhY2twcmVzc3VyZS5cbiAgICByZXR1cm4gb3JpZ2luYWxXcml0ZShidWZmZXIsIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiBjYWxsYmFjayk7XG4gIH0pIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gYCR7cmVtYWluaW5nU2Vjb25kc31zYDtcbiAgfVxuICByZXR1cm4gYCR7bWludXRlc31tICR7cmVtYWluaW5nU2Vjb25kc31zYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBjb25jdXJyZW50bHlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jb25jdXJyZW50bHkuanMnO1xuaW1wb3J0IHsgZGVwbG95Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZGVwbG95LmpzJztcbmltcG9ydCB7IGRvdGVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2RvdGVudi5qcyc7XG5pbXBvcnQgeyBnZW5Db2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuQ29kZS5qcyc7XG5pbXBvcnQgeyBnZW5EZXZWYXJzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuRGV2VmFycy5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgbWFpbnRlbmFuY2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9tYWludGVuYW5jZS5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRyZWVLaWxsQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHJlZUtpbGwuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgdmVyaWZ5Q29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeUNvZGUuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52LlBBVEg/LmluY2x1ZGVzKCcvYnVuLW5vZGUtJykpIHtcbiAgICAgIC8vIE5vdCBmaXhlZCB1cCBoZXJlOiB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KSBtYXkgaGFuZyBvclxuICAgICAgLy8gY3Jhc2ggdW5kZXIgdGhlIHNoaW0sIGFuZCBzb21lICh3cmFuZ2xlciBkZXYpIGZhaWwgc2lsZW50bHksIHNvIHN1cmZhY2UgdGhlIGNhdXNlIHVwZnJvbnQuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiV2FybmluZzogUEFUSCBjb250YWlucyBhIGJ1bi1ub2RlIHNoaW0gKGZyb20gYGJ1biAtLWJ1bmAgb3IgYnVuZmlnJ3MgYHJ1bi5idW5gKTsgXCIgK1xuICAgICAgICAgICdydW4gd2Igd2l0aG91dCBgLS1idW5gIGFuZCByZW1vdmUgYFtydW5dIGJ1bmAgZnJvbSBidW5maWcudG9tbC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKHZlcmlmeUNvZGVDb21tYW5kKVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoY29uY3VycmVudGx5Q29tbWFuZClcbiAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgLmNvbW1hbmQoZG90ZW52Q29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuQ29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkRldlZhcnNDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQobWFpbnRlbmFuY2VDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0cmVlS2lsbENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuXG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2Nlc3MucGlkfSkgZHVyaW5nIHNodXRkb3duOmAsIGVycm9yKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls2LDcsOCw5LDEwXSwibWFwcGluZ3MiOiIwd0JBUUEsTUFBYSxFQUE0QixDQUN2QyxJQUFLLENBQ0gsWUFBYSwyQkFDYixNQUFPLEVBQ1AsS0FBTSxPQUNSLEVBQ0EsY0FBZSxDQUNiLFlBQ0Usd0xBQ0YsS0FBTSxRQUNSLEVBQ0EsbUJBQW9CLENBQ2xCLFlBQWEsMEZBQ2IsS0FBTSxTQUNSLEVBQ0EsbUJBQW9CLENBQ2xCLFlBQWEsaUVBQ2IsS0FBTSxVQUNOLFFBQVMsRUFDWCxFQUNBLG1CQUFvQixDQUNsQixZQUFhLHFHQUNiLEtBQU0sVUFDTixRQUFTLEVBQ1gsRUFDQSxZQUFhLENBQ1gsWUFBYSxxRkFDYixLQUFNLFNBQ04sUUFBUyxjQUNYLEVBQ0EsWUFBYSxDQUNYLFlBQWEsMENBQ2IsS0FBTSxTQUNSLEVBQ0EsUUFBUyxDQUNQLFlBQWEsc0NBQ2IsS0FBTSxVQUNOLE1BQU8sR0FDVCxDQUNGLEVBU0EsU0FBZ0IsRUFDZCxFQUNBLEVBQ0EsRUFRZ0QsQ0FDaEQsSUFBSSxHQUFZLEVBQUssS0FBTyxDQUFDLEVBQUEsQ0FBRyxJQUFLLEdBQVksRUFBSyxRQUFRLEVBQUssRUFBUSxTQUFTLENBQUMsQ0FBQyxFQUNoRixFQUNKLEVBQUssYUFDSixFQUFLLGVBQUEsYUFFRixFQUFLLGVBQ0gsUUFBUSxJQUFJLFFBQUEsYUFDWixJQUFBLElBQ1IsR0FBSSxPQUFPLEdBQVksU0FBVSxDQUMv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TUFBTSxDQUNSLENBQ0Y7Ozs7Ozs7OztBQzVDQSxNQUFNQyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsRUFBRSxHQUFFLENBQUMsRUFBRSxLQUFLLE9BQU8sU0FBUyxFQUFFQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFQyxHQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsV0FBVyxXQUFXLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxXQUFXLE1BQU0sV0FBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksV0FBVyxNQUFNLFdBQVcsTUFBTSxXQUFXLE1BQU0sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFLFdBQVcsV0FBVyxXQUFXLFdBQVcsTUFBTSxXQUFXLFdBQVcsRUFBRSxXQUFXLFVBQVUsRUFBRSxTQUFTQyxHQUFFLEVBQUUsQ0FBQyxPQUFPLElBQUksR0FBRSxJQUFJLEdBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNQyxHQUFFLEdBQUcsQ0FBQyxJQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFNLEdBQU4sS0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLFFBQVEsRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLFdBQVcsTUFBTSxHQUFHLElBQUksRUFBRSxLQUFLLFVBQVUsS0FBSyxZQUFZLEVBQUUsS0FBSyxhQUFhLEdBQUcsRUFBRSxLQUFLLFlBQVksR0FBRyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEtBQUssVUFBVSxNQUFVLE1BQU0seUJBQXlCLEVBQUUsSUFBTSxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLE1BQU0sSUFBSSxLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHSCxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUlBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sR0FBRyxPQUFPLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEtBQUssSUFBSSxHQUFHLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxHQUFHLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsTUFBTSxHQUFHLEtBQUssY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsRUFBRSxLQUFLLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFNLE1BQUssTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLENBQUMsRUFBRSxJQUFNLEVBQUUsS0FBSyxPQUFXLEVBQUUsS0FBSyxjQUFvQixFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEtBQUssUUFBUSxFQUFFLEdBQUcsS0FBSyxnQkFBZ0IsS0FBSyxVQUFVLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFLElBQU0sRUFBRSxLQUFLLFdBQWUsRUFBRSxLQUFLLEVBQVEsRUFBRSxLQUFLLGFBQWEsRUFBRSxLQUFLLFdBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHRCxFQUFFLEdBQUcsRUFBRSxJQUFJQSxFQUFFLEdBQUcsR0FBR0EsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEVBQUUsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFSSxHQUFFLENBQUMsRUFBRUMsR0FBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUdMLEVBQUUsR0FBRyxFQUFFLElBQUlBLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFDLE1BQU1LLEdBQUUsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEVBQUcsR0FBRyxFQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssR0FBRyxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsRUFBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUcsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksRUFBRyxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUcsR0FBRyxFQUFFLElBQUlILEdBQUUsR0FBRyxFQUFFLElBQUlBLEdBQUUsRUFBRSxFQUFFLEVDUmhsSyxHQUFFLFVBQVUsQ0FBc3lCLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBNXlCLFNBQVMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBZ0IsRUFBRSxRQUFYLElBQUssSUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQVcsRUFBRSxRQUFYLElBQUssS0FBdUIsRUFBRSxRQUFYLElBQUssSUFBYSxFQUFFLEtBQUssSUFBSyxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxTQUFhLE1BQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQVcsSUFBVCxJQUFLLEdBQU0sT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQVcsSUFBVCxJQUFLLEtBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBNmdCLEVBQUUsQ0FBemdCLFNBQVMsV0FBVyxLQUFLLEdBQUcsQ0FBQyxLQUFLSSxHQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBS0MsR0FBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQTJiLEVBQUUsQ0FBdmIsU0FBUyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFtVixFQUFFLENBQS9VLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxJQUFJLElBQUksU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQU0sS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBZ1AsRUFBRSxDQUE1TyxTQUFTLEtBQUssS0FBSyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFpTCxFQUFFLENBQTdLLFNBQVMsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQXdGLEVBQUUsQ0FBcEYsU0FBUyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQStCLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFQSxHQUFFLElBQUksWUFBWUQsR0FBRSxJQUFJLFlBQVksT0FBTyxFQ0FoekIsU0FBUyxHQUFFLEVBQUUsRUFBRSxHQUFFLENBQUMsT0FBTyxLQUFLLFVBQVUsR0FBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFFLEVBQUUsQ0FBQyxHQUFZLElBQVQsSUFBSyxHQUFNLE1BQU0sR0FBRyxHQUFhLE9BQU8sR0FBakIsU0FBbUIsQ0FBQyxHQUFHLE9BQU8sTUFBTSxDQUFDLEVBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRSxDQUFDLEVBQUUsU0FBUyxHQUFFLEVBQUUsRUFBRSxHQUFFLENBQUMsSUFBTSxFQUFFLEdBQUVFLENBQUMsRUFBRSxHQUFVLElBQVAsS0FBUyxPQUFPLEVBQUUsSUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksSUFBSSxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBTSxFQUFFLEdBQUVBLENBQUMsRUFBRSxHQUFVLElBQVAsS0FBUyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSUEsQ0FBQyxFQUFFLEdBQVksSUFBVCxJQUFLLEdBQU0sT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sT0FBT0EsRUFBekIsQ0FBNEIsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFVBQVUsRUFBRSxHQUFHQSxFQUFFLEVBQUUsSUFBSUEsRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsRUFBRSxHQUFHLENBQUMsR0FBR0EsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSUEsRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsR0FBVUEsSUFBUCxLQUFTLEVBQUUsR0FBR0EsRUFBRSxFQUFFLElBQUlBLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxRQUFRQSxDQUFDLEVBQUUsQ0FBQyxJQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxHQUFFLE9BQU8sRUFBRSxDQUFDLElBQU0sRUFBRSxHQUFFLE9BQU8sR0FBRSxPQUFPLEVBQUUsR0FBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFQSxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUlBLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBSyxDQUFDLEVBQUUsS0FBS0EsRUFBRSxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFLLENBQUMsRUFBRSxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBTSxFQUFFLEVBQUUsWUFBWSxHQUFlLE9BQU8sR0FBbkIsV0FBcUIsQ0FBQyxJQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUVBLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBWSxJQUFULElBQUssR0FBTSxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFNLEVBQUUsT0FBTyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQSxHQUFHLENBQUMsQ0FBQyxFQUFFQSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUlBLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUVBLENBQUMsRUFBRSxDQUFDLENDQXZwQyxTQUFTLEdBQUUsRUFBRSxFQUFFLENBQUMsT0FBT0MsR0FBRUMsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFpQyxTQUFTLElBQUcsQ0FBQyxNQUFNLEVBQUUsQ0NBMUYsTUFBTSxFQUFFLEdBQUUsQ0FBQyxZQUFZQyxFQUFDLENBQUMsRUFBSSxHQUFFLENBQUMsWUFBWUMsRUFBQyxDQUFDLEVBQUUsU0FBUyxHQUFFLENBQUMsY0FBYyxFQUFFLElBQXlCLFlBQVksRUFBRUQsSUFBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFpQixHQUFHLE9BQWQs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
|
|
98
|
+
|| wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}};function Ia(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function La(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function Ra(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return za([...i,...e,...r],n);let o=e.slice(1),s=Ba(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return za([...i,`test`,...a,...c,...r],n)}function za(e,t){let n=e.indexOf(`playwright`),r=n!==-1&&e[n+1]===`test`;return!t||!r||e.some(e=>e===`--max-failures`||e.startsWith(`--max-failures=`))?G(e):G([...e,`--max-failures=1`])}function Ba(e){let t,n=[];for(let[r,i]of e.entries()){if(t){if(t===`required`||!i.startsWith(`-`)){t=void 0;continue}t=void 0}if(i===`--`)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(i.startsWith(`--`)){if(i.includes(`=`))continue;Va.has(i)?t=`required`:Ha.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&Ua.has(e)&&(t=`required`);continue}n.push(r)}return n}const Va=new Set([`--browser`,`--config`,`--grep`,`--grep-invert`,`--global-timeout`,`--max-failures`,`--output`,`--project`,`--repeat-each`,`--reporter`,`--retries`,`--shard`,`--test-list`,`--test-list-invert`,`--timeout`,`--trace`,`--tsconfig`,`--ui-host`,`--ui-port`,`--ui-title`,`--workers`]),Ha=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),Ua=new Set([`-c`,`-g`,`-j`]),Wa=new class extends Fa{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??``}`}};var Ga=class extends Fa{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);e.env.PORT||=`3000`;let i=await Ar(e.env.PORT,e),a=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,o=t.targets?.map(String),s=o?.length?o:[`test/e2e/`],c=this.testUnit(e,{...t,targets:s});return G([`YARN`,`wb`,`concurrently`,...mt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${i} && ${c}${a}`])}};const Ka=new Ga,qa=new class extends Fa{constructor(){super(!0)}startDevProtected(e,t){return`YARN next dev --turbopack ${t.normalizedArgsText??``}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??``}`.trim()]}},Ja=new class extends Fa{constructor(){super(!1)}startDevProtected(e,t){throw Error(`This method should not be called.`)}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${Je} dist/index.js ${t.normalizedArgsText??``} | tee server.log`)}startTest(){return Promise.resolve(`echo 'do nothing.'`)}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,`development`)} && ${$.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(){return Promise.resolve(`echo 'do nothing.'`)}testE2EProduction(){return Promise.resolve(`echo 'do nothing.'`)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},Ya=new class extends Fa{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??``}`}},Xa=new class extends Fa{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[Mt(t,`.dev.vars`)],i=We(e,`test`)?Pt(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=Pt(e);return[e.buildCommand,Mt(t,`dist/server/.dev.vars`),...r?[r]:[],Nt(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${zt(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},Za=new class extends Fa{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??``}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??``}`.trim()}},Qa=new class extends Ga{startDevProtected(e,t){return this.buildWranglerDevCommands(e,t).join(` && `)}buildDefaultProductionStartCommands(e,t){return this.buildWranglerDevCommands(e,t)}buildWranglerDevCommands(e,t){e.env.PORT||=`8787`;let n=zt(e),r=[Mt(t,`.dev.vars`)],i=Pt(e);return i&&r.push(i),r.push(Nt(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}},$a=[`express`,`fastify`,`elysia`,`hono`],eo={...Ma,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},to={command:`start [args..]`,describe:`Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0`,builder:e=>e.parserConfiguration({"populate--":!0}).options(eo),async handler(e){Na(e);let t=await V(e);t||(console.error(f.red(`No project found.`)),process.exit(1));for(let n of t.descendants){let t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{},i;if(t.blitz)i=Wa;else if(t.vinext||r.vinext)i=Xa;else if(t.next)i=qa;else if(r[`@remix-run/dev`])i=Ya;else if(r.vite)i=Za;else if(q(n))i=Qa;else if($a.some(e=>t[e])&&!t[`firebase-functions`]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=Ka;else if(t[`build-ts`]||r[`build-ts`])i=Ja;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await H(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await H(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await H(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await H(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await H(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},no=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),ro=.05,io={e2e:{description:`How to run E2E tests`,type:`string`,choices:[`headless`,`headless-dev`,`headed`,`headed-dev`,`docker`,`docker-debug`,`debug`,`generate`,`trace`],default:`headless`},silent:{description:`Reduce redundant outputs`,type:`boolean`},bail:{description:`Stop tests after the first failure`,type:`boolean`},"unit-timeout":{description:`Timeout for unit tests`,type:`number`}},ao={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},oo={command:`test [targets...]`,describe:`Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'`,builder:e=>e.parserConfiguration({"populate--":!0}).options(io).positional(`targets`,ao.targets),async handler(e){process.exit(await so(e))}};async function so(n,r={}){let i=lo(n),a=await V(i);if(!a)return console.error(f.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=xo(o,s);for(let n of a.descendants){n.env.WB_ENV||=`test`;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d;d=a.blitz?Wa:a.vinext||u.vinext?Xa:a.next?qa:u[`@remix-run/dev`]?Ya:u.vite?Za:q(n)?Qa:$a.some(e=>a[e])&&!a[`firebase-functions`]?Ka:Ja,console.info(`Running "test" for ${n.name} ...`);let f=uo(n);if(l&&f!==!1){let e=o.filter(e=>e.includes(`/unit`)),t=e.length>0?e:f.length>0?f:void 0,a={...i,targets:t},s=await mo(d.testUnit(n,a),n,i,{exitIfFailed:r.exitIfFailed,timeout:i.unitTimeout});if(s!==0)return s}if(!c||!e.existsSync(t.join(n.dirPath,`test`,`e2e`))){c&&co(n);continue}let p=o.filter(e=>e.includes(`/e2e`)),m={...i,targets:p.length>0?p:void 0};switch(i.e2e){case`headless`:{let e=await po(await d.testE2EProduction(n,m,{playwrightArgs:bo(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await po(await d.testE2EDev(n,m,{playwrightArgs:bo(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await fo(n,m,d,bo(p,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await fo(n,m,d,bo(p,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.blitz||a.next||u[`@remix-run/dev`]||u.vite)switch(i.e2e){case`headed`:{let e=await po(await d.testE2EProduction(n,m,{playwrightArgs:bo(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await po(await d.testE2EDev(n,m,{playwrightArgs:bo(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await po(await d.testE2EProduction(n,m,{playwrightArgs:bo(p,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await po(await d.testE2EProduction(n,m,{playwrightArgs:[`codegen`,`http://localhost:${n.env.PORT}`]}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`trace`:{let e=await po(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function co(n){n.packageJson.workspaces||e.existsSync(t.join(n.dirPath,`playwright.config.ts`))&&console.warn(f.yellow(`Skipping e2e tests for ${n.name}: a Playwright config exists but the test/e2e directory is missing. wb only discovers Playwright specs under test/e2e/, so move them there to run e2e tests.`))}function lo(e){return e.env?.length||e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?e:{...e,cascadeEnv:`test`}}function uo(n){return e.existsSync(t.join(n.dirPath,`test`,`unit`))?[]:n.hasVitest&&e.existsSync(t.join(n.dirPath,`test`))?e.existsSync(t.join(n.dirPath,`test`,`e2e`))?[`test`,`--exclude`,`test/e2e/**`]:[`test`]:!1}async function fo(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await H(`${n.buildDocker(e,`test`)}${Pa(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await po(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await H($.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function po(e,t,n,r={}){return H(e,t,n,{...r,processSilentOutput:ho})}function mo(e,t,n,r={}){return H(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function ho(e){let t=[],n=new Set,r=[];for(let i of go(e)){let e=vo(i);n.has(e)||t.some(t=>yo(t,e))||(_o(t,n,e),r.push(i))}return r.join(`
|
|
99
|
+
`)}function*go(e){let t=0;for(;t<=e.length;){let n=e.indexOf(`
|
|
100
|
+
`,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function _o(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;let r=e.shift();r!==void 0&&t.delete(r)}function vo(e){return e.replaceAll(no,``).trim().replaceAll(/^(?:\[[^\]]+\]\s*)+/g,``).replaceAll(/\(node:\d+\)/g,`(node:<number>)`).replaceAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?\b/g,`<timestamp>`).replaceAll(/([?&]cache=)\d+/g,`$1<number>`)}function yo(e,t){let n=Math.max(e.length,t.length);return n===0?!0:Math.abs(e.length-t.length)>n*ro?!1:T(e,t)/n<=ro}function bo(e,t=[],n=[]){let r=Ba(t).length>0;return[`test`,...e.length>0||r?[]:[`test/e2e/`],...n]}function xo(e,t=[]){let n=e.some(e=>e.includes(`/e2e`)),r=e.some(e=>e.includes(`/unit`)),i=e.length===0&&t.length===0;return{shouldRunUnit:i||r,shouldRunE2e:i||n||t.length>0}}const So={command:`test-on-ci`,describe:`Test project on CI with no options.`,builder:{silent:{description:`Reduce redundant outputs`,type:`boolean`}},async handler(e){await Co(e)}};async function Co(n){process.env.WB_ENV||=`test`;let r=await V(n);r||(console.error(f.red(`No project found.`)),process.exit(1));for(let i of r.descendants){i.env.CI||=`1`,i.env.WB_ENV=process.env.WB_ENV;let r=i.packageJson.dependencies??{},a=i.packageJson.devDependencies??{},o;o=r.blitz?Wa:r.vinext||a.vinext?Xa:r.next?qa:a[`@remix-run/dev`]?Ya:a.vite?Za:q(i)?Qa:$a.some(e=>r[e])&&!r[`firebase-functions`]?Ka:Ja,console.info(`Running "test-on-ci" for ${i.name} ...`);let s=i.hasDockerfile;if(s&&await U($.stopAll(),i,n),e.existsSync(t.join(i.dirPath,`test`,`unit`))&&await U(o.testUnit(i,n).replaceAll(` --allowOnly`,``),i,n),e.existsSync(t.join(i.dirPath,`test`,`e2e`))){await U(await o.testStart(i,n),i,n),await ot.promiseAll(),s&&(i.env.WB_DOCKER||=`1`,await H(`${o.buildDocker(i,`test`)}${Pa(n)}`,i,n));let e=s?await o.testE2EDocker(i,n,{}):await o.testE2EProduction(i,n,{});process.exitCode=await H(e.replaceAll(` --allowOnly`,``),i,n,{exitIfFailed:!1}),s&&await H($.stop(i),i,n)}else co(i)}}const wo={command:`tree-kill <pid> [signal]`,describe:`Kill the given process and all descendants`,builder:e=>e.positional(`pid`,{description:`The process ID to kill.`,type:`number`,demandOption:!0}).option(`signal`,{description:`Signal to send to the process tree.`,type:`string`,default:`SIGTERM`}),handler(e){try{let t=e.signal;if(!(t in h.signals))throw Error(`Invalid signal: ${t}`);F(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},To={command:`typecheck`,describe:`Run type checking. .env files are ignored.`,builder:{},async handler(e){process.exit(await Eo(e))}};async function Eo(n){let r=await V(n,!1);if(!r)return console.error(f.red(`No project found.`)),1;let i=!1,a=r.descendants.map(async a=>{let o=[];for((!a.packageJson.workspaces||a.hasSourceCode)&&o.push(...Do(a)),!a.packageJson.workspaces&&a.hasOwnDependency(`pyright`)&&o.push(`YARN pyright`);o.length>0;){let s=await U(o.join(` && `),a,n,{ci:r.descendants.length>1,exitIfFailed:!1,preserveColor:!0}),c=t.join(a.dirPath,`.next`);if(s&&e.existsSync(c)){e.rmSync(c,{force:!0,recursive:!0}),console.info(f.yellow("Removed `.next` directory. We will re-try type checking.")),i=!0;continue}return s}}),o=await Promise.all(a),s=0;for(let[e,t]of o.entries())t&&((r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(f.yellow(`Please try "yarn gen-code" if you face unknown type errors.`)),s=t);return s||console.info(f.green(i?`-----
|
|
101
|
+
No type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.`:`No type errors found.`)),s}function Do(e){return e.hasOwnDependency(`typescript`)?[`BUN tsc --noEmit`]:[]}const Oo={...To,command:`tc`},ko={command:`verify`,describe:`Verify project code`,builder:{full:{type:`boolean`,default:!1,describe:`Run tests after verifying project code`}},async handler(e){let t=Ge(e,!1);t||(console.error(f.red(`No project found.`)),process.exit(1)),await(e.full?Ao(t.self,e):jo(t.self,e))}};async function Ao(e,t){let n=Ro(e);try{await jo(e,t),await Mo(e,t),n.succeed()}catch(e){throw n.fail(e),e}finally{n.finish()}}async function jo(e,t){await Fo(`${Ye} install`,e,t),e.packageJson.scripts?.[`gen-code`]&&await Fo(`${Ye} gen-code`,e,t),await Po(`cleanup`,()=>ir({...t,_:[`lint`],fix:!0,format:!0,silent:!0}),{silent:!0}),await Po(`typecheck`,()=>Eo({...t,_:[`typecheck`]}),{silent:!0})}async function Mo(e,t){let n=lo({...t,_:[`test`],e2e:`headless`,silent:!0}),r=await so(n,{exitIfFailed:!1});if(r===0)return;e.packageJson.scripts?.[`db-reset`]||(console.info(f.red(f.bold(`Failed (exit code ${r}):`),`test`)),process.exit(r)),console.info(f.yellow(`Tests failed. This project defines "db-reset", so wb will reset the database once and retry tests.`)),await Fo(`${Ye} db-reset`,No(e,n),n,{printRawOutput:!0});let i=await so(n,{exitIfFailed:!1});i!==0&&(console.info(f.red(f.bold(`Failed (exit code ${i}):`),`test after db-reset retry`)),process.exit(i)),console.info(f.green(`Tests passed after db-reset retry.`))}function No(e,t){let n=B(t,!0,e.dirPath);if(!n)throw Error(`Project not found: ${e.dirPath}`);return n}async function Po(e,t,n={}){n.silent||console.info(`
|
|
102
|
+
`+f.cyan(f.bold(`Start:`),e));let r=await t()??0;return r===0||n.allowFailure?n.silent||console.info(f.green(f.bold(`Finished:`),e)):(console.info(f.red(f.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function Fo(e,t,n,r={}){if(Lo(e,t.dirPath),n.dryRun)return 0;let i=await I(e,void 0,{cwd:t.dirPath,env:dt(t.env,{preserveColor:!1}),shell:!0,stdio:`pipe`,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),a=i.status??1;return r.printRawOutput||Io(e,a,i.stdout),a!==0&&!r.allowFailure&&(console.info(f.red(f.bold(`Failed (exit code ${a}):`),e)),process.exit(a)),a}function Io(e,t,n){if(t===0&&(e===`${Ye} install`||e===`${Ye} gen-code`)){console.info(f.green(`Succeeded.`));return}let r=n.trim();r&&(process.stdout.write(r),process.stdout.write(`
|
|
103
|
+
`))}function Lo(e,t){console.info(`
|
|
104
|
+
`+f.cyan(f.bold(`Command:`),e)+f.gray(` at ${t}`))}function Ro(n){let r=Date.now(),i=t.join(n.dirPath,`.wb`);e.mkdirSync(i,{recursive:!0});let a=t.join(i,`verify-full.log`),o=e.openSync(a,`w`),s=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr),l=!1,u=!1;process.stdout.write=zo(s,o),process.stderr.write=zo(c,o),console.info(f.cyan(f.bold(`Full log:`),a));let d=()=>{if(u)return;u=!0,process.stdout.write=s,process.stderr.write=c;let t=Bo(Date.now()-r),n=`${l?`Succeeded`:`Failed`} in ${t}. Full log: ${a}\n`,i=l?f.green(n):f.red(n);s(i),e.writeSync(o,n),e.closeSync(o)};return process.once(`exit`,d),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener(`exit`,d),d()},succeed:()=>{l=!0}}}function zo(t,n){return((r,i,a)=>{let o=typeof r==`string`?Buffer.from(r,typeof i==`string`?i:`utf8`):r;return e.writeSync(n,o),t(o,typeof i==`function`?i:a)})}function Bo(e){let t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}await u(d(process.argv)).scriptName(`wb`).options(pt).middleware(e=>{let n=e[`working-dir`];if(n){let e=t.resolve(n);process.chdir(e)}process.env.PATH?.includes(`/bun-node-`)&&console.warn("Warning: PATH contains a bun-node shim (from `bun --bun` or bunfig's `run.bun`); run wb without `--bun` and remove `[run] bun` from bunfig.toml."),P(process.env)}).command(ko).command(Ze).command(vt).command(pn).command(vn).command(Nn).command(sn).command(Hn).command(rr).command(Gr).command(hi).command(qi).command(ha).command(ga).command(ba).command(to).command(oo).command(So).command(wo).command(To).command(Oo).demandCommand().strict().version(Vo()).help().argv;function Vo(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,`package.json`));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`)).version}let Ho=!1;for(let e of[`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,()=>{if(!Ho){Ho=!0;try{F(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
|
|
105
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsInQiLCJpIiwiZSIsIm8iLCJuIiwiciIsImEiLCJuIiwiZSIsInIiLCJuIiwidCIsImUiLCJidWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJhcmd1bWVudHNCdWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsIkxJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSIsIkRFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCIsImJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kIiwiZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiIsInBhcnNlIiwicGFyc2VEb3RlbnYiLCJkZXBsb3lDb21tYW5kIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsInNldFRpbWVvdXQiLCJidWlsZGVyIiwic2V0VGltZW91dCIsImZzIiwiYnVpbGRlciIsInRvVW5zY29wZWRQYWNrYWdlTmFtZSIsImlzRG9ja2VyRW5hYmxlZCIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiYnVpbGRlciIsImRlcGxveUNvbW1hbmQiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9iaW5QYXRoLnRzIiwiLi4vc3JjL3V0aWxzL2NpLnRzIiwiLi4vc3JjL3Byb2plY3QudHMiLCIuLi9zcmMvdXRpbHMvcnVudGltZS50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZElmTmVlZGVkLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy91dGlscy9zaGVsbC50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLnRzIiwiLi4vc3JjL3V0aWxzL3dyYW5nbGVyQ29uZmlnLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkRldlZhcnMudHMiLCIuLi9zcmMvY29tbWFuZHMvZGVwbG95LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2RvdGVudi50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvZ2VuQ29kZS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvb3V0cHV0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvdXRpbHMvcG9ydC50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL21haW50ZW5hbmNlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ByaXNtYS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cFByaXZhdGVQYWNrYWdlcy50cyIsIi4uL3NyYy9zY3JpcHRzL2J1aWxkZXIudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9sb2cudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9jb21tYW5kcy92ZXJpZnlDb2RlLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIG5hcmdzOiAxLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICAncXVpZXQtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3VwcHJlc3MgLmVudiBmaWxlIGxvYWRpbmcgaW5mb3JtYXRpb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJOYW1lc11bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICAvKipcbiAgICAgKiBMb2FkIHZhcmlhYmxlcyBldmVuIGlmIHRoZXkgYWxyZWFkeSBleGlzdCBpbiBwcm9jZXNzLmVudi5cbiAgICAgKiBVc2VmdWwgd2hlbiBhIHBhcmVudCBwcm9jZXNzIGhhcyBhbHJlYWR5IGluamVjdGVkIHRoZSAuZW52IHZhbHVlcyBpbnRvIHRoZSBlbnZpcm9ubWVudFxuICAgICAqIGFuZCB0aGUgZmlsZS1kZWZpbmVkIHZhcmlhYmxlcyB0aGVtc2VsdmVzIGFyZSBuZWVkZWQgKGUuZy4gYHdiIGdlbi1kZXYtdmFyc2ApLlxuICAgICAqL1xuICAgIGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuO1xuICB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGNvbnN0IHNob3VsZFN1cHByZXNzT3V0cHV0ID0gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtwcm9jZXNzLmVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtwcm9jZXNzLmVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpICYmIChvcHRpb25zPy5pZ25vcmVQcm9jZXNzRW52IHx8ICEoa2V5IGluIHByb2Nlc3MuZW52KSkpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZW52UGF0aCwga2V5c10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0ICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW21pc2VFbnZWYXJzLCBtaXNlRW52VmFyTmFtZXNdID0gcmVhZE1pc2VFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIGVudlZhcnMsIG9wdGlvbnMpO1xuICBPYmplY3QuYXNzaWduKGVudlZhcnMsIG1pc2VFbnZWYXJzKTtcbiAgaWYgKG1pc2VFbnZWYXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW21pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSksIG1pc2VFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHttaXNlRW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke21pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmICghYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGBSZWFkIGVudiBmaWxlczogJHtlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMubWFwKChbZW52UGF0aCwga2V5c10pID0+IChrZXlzLmxlbmd0aCA+IDAgPyBgJHtlbnZQYXRofSAoJHtrZXlzLmpvaW4oJywgJyl9KWAgOiBlbnZQYXRoKSkuam9pbignLCAnKSB8fCAnbm90aGluZyd9YFxuICAgICk7XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpKTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSAmJiAhKGtleSBpbiBwcm9jZXNzLmVudikpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIC8vIEV4cGFuZCByZWZlcmVuY2VzIGFnYWluc3QgdGhlIGxpdmUgZW52aXJvbm1lbnQgZm9yIGtleXMgTk9UIGxvYWRlZCBmcm9tIGZpbGVzLCBzbyB0aGF0IGFcbiAgLy8gcmVmZXJlbmNlIHRvIGFuIGV4cG9ydGVkIGtleSAoZXhjbHVkZWQgZnJvbSBlbnZWYXJzIGJ5IHByb2Nlc3MtZW52IHByZWNlZGVuY2UpIHJlc29sdmVzIHRvXG4gIC8vIHRoZSBlZmZlY3RpdmUgdmFsdWUgaW5zdGVhZCBvZiBhbiBlbXB0eSBzdHJpbmcuIExvYWRlZCBrZXlzIGFyZSBkZWxpYmVyYXRlbHkgYWJzZW50IGZyb21cbiAgLy8gdGhlIHJlZmVyZW5jZSBzZXQ6IGRvdGVudi1leHBhbmQgd291bGQgb3RoZXJ3aXNlIHJlcGxhY2UgdGhlaXIgcGFyc2VkIHZhbHVlcyB3aXRoIHRoZVxuICAvLyBwcm9jZXNzIHZhbHVlcywgYnJlYWtpbmcgY2FsbGVycyB0aGF0IG5lZWQgdGhlIGZpbGUtZGVmaW5lZCB2YWx1ZXMgdGhlbXNlbHZlcy5cbiAgY29uc3QgcmVmZXJlbmNlRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KSkge1xuICAgIC8vIEVzY2FwZSBkb2xsYXIgc2lnbnMgc28gZG90ZW52LWV4cGFuZCBzdWJzdGl0dXRlcyBleHBvcnRlZCB2YWx1ZXMgbGl0ZXJhbGx5IGluc3RlYWQgb2ZcbiAgICAvLyByZWN1cnNpdmVseSByZS1leHBhbmRpbmcgdGhlbSAoYW4gZXhwb3J0ZWQgYHBhJHdvcmRgIG11c3Qgc3RheSBgcGEkd29yZGApLlxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICEoa2V5IGluIGVudlZhcnMpKSByZWZlcmVuY2VFbnZba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoJyQnLCBTdHJpbmcucmF3YFxcJGApO1xuICB9XG4gIHJldHVybiBbZXhwYW5kKHsgcGFyc2VkOiBlbnZWYXJzLCBwcm9jZXNzRW52OiByZWZlcmVuY2VFbnYgfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvcHRpb25zPzogeyBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbiB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCFoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2QpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgYXJncyA9IFsnZW52JywgJy0tanNvbicsICctLWNkJywgY3dkXTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tZW52JywgY2FzY2FkZSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnbWlzZScsIGFyZ3MsIHtcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW3t9LCBbXV07XG4gIH1cbiAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwga2V5IGluIGN1cnJlbnRFbnZWYXJzKSBjb250aW51ZTtcbiAgICBpZiAob3B0aW9ucz8uaWdub3JlUHJvY2Vzc0Vudikge1xuICAgICAgLy8gYG1pc2UgZW52YCBhbHdheXMgZW1pdHMgUEFUSCBkdWUgdG8gdG9vbCBzaGltczsgY29uc3VtZXJzIG9mIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXNcbiAgICAgIC8vIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKSBtdXN0IG5vdCBwcm9wYWdhdGUgaXQuXG4gICAgICBpZiAoa2V5ID09PSAnUEFUSCcpIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QpOyA7IGN1cnJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJ21pc2UudG9tbCcpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5taXNlLnRvbWwnKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYG1pc2UgZW52IC0tZW52ICR7Y2FzY2FkZX1gIDogJ21pc2UgZW52Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCBvdXRwdXRPcHRpb25zID0gYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBxdWlldEVudj86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfTtcbiAgcmV0dXJuIG91dHB1dE9wdGlvbnMucXVpZXRFbnYgPT09IHRydWUgfHwgKG91dHB1dE9wdGlvbnMucXVpZXRFbnYgIT09IGZhbHNlICYmIG91dHB1dE9wdGlvbnMuc2lsZW50ID09PSB0cnVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgYmxhbmstb25seSBsaW5lcyBhcmUgc2tpcHBlZCB3aGlsZSBwcmludGluZyBzdGRvdXQvc3RkZXJyIGluIHJlYWx0aW1lICovXG4gIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBjb25zdCBzdGRvdXRQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3Rkb3V0LCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgY29uc3Qgc3RkZXJyUHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZGVyciwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHN0ZG91dFByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHN0ZGVyclByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgc3Rkb3V0UHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBzdGRlcnJQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcblxuZnVuY3Rpb24gY3JlYXRlUmVhbHRpbWVQcmludGVyKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0ZVN0cmVhbSxcbiAgb21pdEJsYW5rTGluZXMgPSBmYWxzZVxuKTogeyB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDsgZmx1c2g6ICgpID0+IHZvaWQgfSB7XG4gIGlmICghb21pdEJsYW5rTGluZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IChkYXRhKSA9PiBzdHJlYW0ud3JpdGUoZGF0YSksXG4gICAgICBmbHVzaDogKCkgPT4ge30sXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwZW5kaW5nID0gJyc7XG4gIHJldHVybiB7XG4gICAgd3JpdGU6IChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nICs9IGRhdGE7XG4gICAgICBjb25zdCBsaW5lcyA9IHBlbmRpbmcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKSA/PyAnJztcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWlzQmxhbmtMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgc3RyZWFtLndyaXRlKGAke2xpbmV9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoIWlzQmxhbmtMaW5lKHBlbmRpbmcpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShwZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSAnJztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JsYW5rTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobixlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogUHJlcGVuZCBldmVyeSBleGlzdGluZyBgbm9kZV9tb2R1bGVzLy5iaW5gIGRpcmVjdG9yeSBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkgdXAgdG8gdGhlXG4gKiByZXBvc2l0b3J5IHJvb3QgKG9yIGZpbGVzeXN0ZW0gcm9vdCkgdG8gdGhlIGVudmlyb25tZW50J3MgUEFUSCwgbmVhcmVzdCBkaXJlY3RvcnkgZmlyc3Qgc29cbiAqIGEgd29ya3NwYWNlLWxvY2FsIGRlcGVuZGVuY3kgd2lucyBvdmVyIGEgcmVwb3NpdG9yeS1yb290IG9uZS4gTmVlZGVkIHdoZXJldmVyIHdiIHN0cmlwc1xuICogeWFybidzIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGZyb20gUEFUSCAoeWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMgb25seVxuICogdGhyb3VnaCB0aGF0IGZvbGRlciwgbmV2ZXIgdGhyb3VnaCBgbm9kZV9tb2R1bGVzLy5iaW5gIG9uIFBBVEgpLCBzbyB0aGF0IGJhcmUgYmluYXJ5IG5hbWVzXG4gKiBpbiB3cmFwcGVkIGNvbW1hbmRzIGtlZXAgcmVzb2x2aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKGRpclBhdGg6IHN0cmluZywgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpblBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgYmluUGF0aHMucHVzaChiaW5QYXRoKTtcbiAgICB9XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICB9XG4gIGlmIChiaW5QYXRocy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgZW52LlBBVEggPSBlbnYuUEFUSCA/IGAke2JpblBhdGhzLmpvaW4oJzonKX06JHtlbnYuUEFUSH1gIDogYmluUGF0aHMuam9pbignOicpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFzQnVuVG9vbFZlcnNpb24oKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNCdW5Mb2NrZmlsZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNCdW5QYWNrYWdlTWFuYWdlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5Ub29sVmVyc2lvbigpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuTG9ja2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgLy8gU29tZSByZXBvc2l0b3JpZXMgcmVseSBvbiB0aGUgbG9ja2ZpbGUgb3IgcGFja2FnZU1hbmFnZXIgZmllbGQgaW5zdGVhZCBvZiBtaXNlLlxuICAgIC8vIERvY2tlciBvcHRpbWl6YXRpb24gbXVzdCBmb2xsb3cgdGhlIHRhcmdldCBwcm9qZWN0LCBub3QgdGhlIHJ1bnRpbWUgdGhhdCBsYXVuY2hlZCB3Yi5cbiAgICByZXR1cm4gWydidW4ubG9jaycsICdidW4ubG9ja2InXS5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgcGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnYnVuQCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGlmICghc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCh0aGlzLmFyZ3YpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ByaXNtYScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCh0aGlzLmRpclBhdGgsIHRoaXMuZW52KTtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd1BhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKCcvLycpID8gcmF3UGF0aC5zbGljZSgyKSA6IHJhd1BhdGg7XG4gIHJldHVybiBub3JtYWxpemVkUGF0aCB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+ICYgUGFydGlhbDxQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdyb290RGlyUGF0aCc+PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBpZiAocGF0aC5pc0Fic29sdXRlKGRiUGF0aCkpIHJldHVybiBkYlBhdGg7XG5cbiAgY29uc3QgYmFzZURpclBhdGggPSBwcm9qZWN0LnJvb3REaXJQYXRoID8/IHByb2plY3QuZGlyUGF0aDtcbiAgcmV0dXJuIGJhc2VEaXJQYXRoID8gcGF0aC5yZXNvbHZlKGJhc2VEaXJQYXRoLCBkYlBhdGgpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBkZXNjZW5kYW50czogUHJvamVjdFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvamVjdC5lbnYuV0JfRU5WID09PSBuYW1lIHx8IHByb2plY3QuZW52Lk1JU0VfRU5WID09PSBuYW1lO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9XG4gIC8vIERldGVjdCBgYnVuIC0tYnVuIHJ1biB3YiAuLi5gLiBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICBwcm9jZXNzLnZlcnNpb25zLmJ1biB8fFxuICAvLyBEZXRlY3QgYGJ1biBydW4gd2IgLi4uYC5cbiAgcHJvY2Vzcy5hcmd2WzBdPy5lbmRzV2l0aCgnL2J1bicpIHx8XG4gIHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHMgcmVxdWlyaW5nXG4vLyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLiB3YiBvcHRzIGludG8gdGhlIGJ1biBydW50aW1lIGV4cGxpY2l0bHkgd2hlcmUgaXRcbi8vIGhlbHBzIChlLmcuIGBidW4gc3JjL2luZGV4LnRzYCkuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJ1aWxkQ29tbWFuZCA9XG4gICAgYXJndi5jb21tYW5kID8/XG4gICAgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIG9taXRTaWxlbnRTdGFydD86IGJvb2xlYW47XG4gIHByZXNlcnZlQ29sb3I/OiBib29sZWFuO1xuICBwcm9jZXNzU2lsZW50T3V0cHV0PzogKG91dHB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHByaW50UmF3T3V0cHV0PzogYm9vbGVhbjtcbiAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5PzogYm9vbGVhbjtcbiAgc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBzaWxlbnRTdWNjZXNzTWVzc2FnZT86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSdW5SZXN1bHQge1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBvdXRwdXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYgeyBzaWxlbnQ/OiBib29sZWFuIH0sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBpZiAoIShhcmd2LnNpbGVudCAmJiBvcHRzLm9taXRTaWxlbnRTdGFydCAmJiAhYXJndi5kcnlSdW4pKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgYXJndi5zaWxlbnQgPyAnQ29tbWFuZCcgOiAnU3RhcnQnKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3Qgc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCA9IEJvb2xlYW4oXG4gICAgYXJndi5zaWxlbnQgJiYgKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/PyBvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSlcbiAgKTtcbiAgbGV0IHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgY29uc3QgcHJvZ3Jlc3NUaW1lciA9XG4gICAgYXJndi5zaWxlbnQgJiYgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXNcbiAgICAgID8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuJyk7XG4gICAgICAgICAgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIH0sIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IChhcmd2LnNpbGVudCA/IHRydWUgOiB1bmRlZmluZWQpIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBhcmd2LnNpbGVudCA/ICdwaXBlJyA6ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nOiBhcmd2LnNpbGVudCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChwcm9ncmVzc1RpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAod3JvdGVTaWxlbnRQcm9ncmVzcykge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxuICBpZiAoc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCAmJiAoIW9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5IHx8IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPyBvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQocmV0LnN0ZG91dCkgOiByZXQuc3Rkb3V0KS50cmltKCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFyZ3Yuc2lsZW50ICYmIGV4aXRDb2RlID09PSAwICYmIG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4ob3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkpO1xuICB9XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgZXhpdENvZGUsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0ICYmICFvcHRzLnByaW50UmF3T3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8QnVmZmVyZWRSdW5SZXN1bHQ+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIG91dHB1dDogJycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIC8vIE5vIGAtLWJ1bmA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzIHRvb2xzIHJlcXVpcmluZ1xuICAvLyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICBjb25zdCBwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVuID0gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgL1BSSVNNQSBnZW5lcmF0ZSg/IVxccystLW5vLWhpbnRzKSg/PVxcc3wkKS9ndSxcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdQUklTTUEgZ2VuZXJhdGUnIDogJ1BSSVNNQSBnZW5lcmF0ZSAtLW5vLWhpbnRzJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gcnVuICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4pIHJ1bmAuXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIHJ1biBidW4gcnVuJywgJ2J1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBuZXdTY3JpcHQucmVwbGFjZUFsbCgnWUFSTiAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAvLyBLZWVwIFBsYXl3cmlnaHQgYXMgYSBwYWNrYWdlLW1hbmFnZXIgY29tbWFuZCBpbnN0ZWFkIG9mIHJlc29sdmluZyBpdCB0aHJvdWdoIG5vZGVfbW9kdWxlcy8uYmluLlxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgIC5yZXBsYWNlQWxsKCdZQVJOICcsICFwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCk7XG4gIHJldHVybiB7XG4gICAgcHJpbnRhYmxlOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBkb3RlbnYgLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz4sXG4gIHByaW50T3B0aW9uczogeyBzaWxlbnRTdWNjZXNzPzogYm9vbGVhbiB9ID0ge31cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBpZiAocHJpbnRPcHRpb25zLnNpbGVudFN1Y2Nlc3MpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBjb25maWd1cmVDb2xvckVudihuZXdFbnYsIG9wdHMucHJlc2VydmVDb2xvcik7XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBjaGlsZC1wcm9jZXNzIGNvbG9yIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igd2ItbWFuYWdlZCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIGVudiBUaGUgY2hpbGQtcHJvY2VzcyBlbnZpcm9ubWVudCB0byBtdXRhdGUuXG4gKiBAcGFyYW0gcHJlc2VydmVDb2xvciBXaGV0aGVyIHdiIHNob3VsZCBwcmVzZXJ2ZSBjb2xvcnMgZm9yIG91dHB1dCB0aGF0IGl0IGNhcHR1cmVzIGFuZCByZXByaW50cyB0byBhbiBpbnRlcmFjdGl2ZSBUVFkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVDb2xvckVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIHByZXNlcnZlQ29sb3I/OiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChlbnYuTk9fQ09MT1IgIT09IHVuZGVmaW5lZCB8fCBwcmVzZXJ2ZUNvbG9yID09PSBmYWxzZSkge1xuICAgIC8vIE5PX0NPTE9SIGFuZCBwcmVzZXJ2ZUNvbG9yPWZhbHNlIGFyZSBleHBsaWNpdCBuby1jb2xvciBjaG9pY2VzLCBzbyBpbmhlcml0ZWQgRk9SQ0VfQ09MT1IgbXVzdCBub3QgbGVhayB0aHJvdWdoLlxuICAgIGRlbGV0ZSBlbnYuRk9SQ0VfQ09MT1I7XG4gIH0gZWxzZSBpZiAocHJlc2VydmVDb2xvciAmJiBwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAgIGVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICB9XG59XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9wdGlvbk5hbWUgb2YgT2JqZWN0LmtleXMoeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudikpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE9wdGlvblZhbHVlKGFyZ3YsIG9wdGlvbk5hbWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgYXJncy5wdXNoKHZhbHVlID8gYC0tJHtvcHRpb25OYW1lfWAgOiBgLS0ke29wdGlvbk5hbWV9PWZhbHNlYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHt2YWx1ZX1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke2l0ZW19YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICAoYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBzaWxlbnQ/OiBib29sZWFuIH0pLnNpbGVudCA9PT0gdHJ1ZSAmJlxuICAgIGdldE9wdGlvblZhbHVlKGFyZ3YsICdxdWlldC1lbnYnKSA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGFyZ3MucHVzaCgnLS1xdWlldC1lbnYnKTtcbiAgfVxuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZ2V0T3B0aW9uVmFsdWUoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3B0aW9uTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGNhbWVsQ2FzZU9wdGlvbk5hbWUgPSBvcHRpb25OYW1lLnJlcGxhY2VBbGwoLy0oW2Etel0pL2csIChfLCBjaGFyYWN0ZXI6IHN0cmluZykgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xuICBjb25zdCBvcHRpb25zID0gYXJndiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIG9wdGlvbnNbb3B0aW9uTmFtZV0gPz8gb3B0aW9uc1tjYW1lbENhc2VPcHRpb25OYW1lXTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52LCBub3JtYWxpemVTY3JpcHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgRk9SQ0VfS0lMTF9ERUxBWV9NUyA9IDUwMDA7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdraWxsLW90aGVycyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBleGl0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAna2lsbC1vdGhlcnMtb24tZmFpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBmYWlscycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdWNjZXNzOiB7XG4gICAgZGVzY3JpcHRpb246ICdEZWZpbmUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNyaXRlcmlhJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FsbCcsICdmaXJzdCddLFxuICAgIGRlZmF1bHQ6ICdhbGwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmRzIHRvIHJ1biBjb25jdXJyZW50bHknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgUnVuQ29uY3VycmVudGx5T3B0aW9ucyB7XG4gIGNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAga2lsbE90aGVyczogYm9vbGVhbjtcbiAga2lsbE90aGVyc09uRmFpbDogYm9vbGVhbjtcbiAgc3VjY2VzczogJ2FsbCcgfCAnZmlyc3QnO1xuICBjaT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBjb25jdXJyZW50bHlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY29uY3VycmVudGx5IDxjb21tYW5kcy4uLj4nLFxuICBkZXNjcmliZTogJ1J1biBjb21tYW5kcyBjb25jdXJyZW50bHknLFxuICBidWlsZGVyOiB7IC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLCAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kcyA9IChhcmd2LmNvbW1hbmRzID8/IFtdKS5tYXAoU3RyaW5nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIGNvbW1hbmRzIHByb3ZpZGVkLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Db25jdXJyZW50bHkoe1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAga2lsbE90aGVyczogYXJndi5raWxsT3RoZXJzID8/IGZhbHNlLFxuICAgICAgICBraWxsT3RoZXJzT25GYWlsOiBhcmd2LmtpbGxPdGhlcnNPbkZhaWwgPz8gZmFsc2UsXG4gICAgICAgIHN1Y2Nlc3M6IGFyZ3Yuc3VjY2VzcyxcbiAgICAgICAgY2k6IHR5cGVvZiBhcmd2LmNpID09PSAnYm9vbGVhbicgPyBhcmd2LmNpIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29uY3VycmVudGx5KG9wdGlvbnM6IFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PlxuICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd24obm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIG9wdGlvbnMucHJvamVjdCkucnVubmFibGUsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5wcm9qZWN0LmRpclBhdGgsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogY29uZmlndXJlRW52KG9wdGlvbnMucHJvamVjdC5lbnYsIHsgY2k6IG9wdGlvbnMuY2kgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSlcbiAgKTtcblxuICBsZXQgc3RvcHBpbmcgPSBmYWxzZTtcbiAgbGV0IGludGVycnVwdGVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgbGV0IGZpcnN0UmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBzdG9wUmVzdWx0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZvcmNlS2lsbFByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb208bnVtYmVyIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogY2hpbGRyZW4ubGVuZ3RoIH0pO1xuICBjb25zdCB3YWl0Rm9yRXhpdFByb21pc2VzID0gY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR0bGUgPSAoZXhpdENvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGV4aXRDb2RlO1xuICAgICAgICBmaXJzdFJlc3VsdCA/Pz0gZXhpdENvZGU7XG5cbiAgICAgICAgaWYgKCFzdG9wcGluZyAmJiBzaG91bGRTdG9wT3RoZXJzKGV4aXRDb2RlLCBvcHRpb25zKSkge1xuICAgICAgICAgIHN0b3BSZXN1bHQgPSBleGl0Q29kZTtcbiAgICAgICAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgICAgICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgJ1NJR1RFUk0nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgY2hpbGQub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgICAgICBzZXR0bGUoMSk7XG4gICAgICB9KTtcbiAgICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHNldHRsZShnZXRFeGl0Q29kZShjb2RlID8/IHVuZGVmaW5lZCwgc2lnbmFsID8/IHVuZGVmaW5lZCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHN0b3BBbGwgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIGludGVycnVwdGVkU2lnbmFsID8/PSBzaWduYWw7XG4gICAgaWYgKHN0b3BwaW5nKSByZXR1cm47XG5cbiAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgZm9yY2VLaWxsUHJvbWlzZXMucHVzaCh0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbiwgc2lnbmFsKSk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ2ludCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdJTlQnKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lndGVybSA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdURVJNJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3F1aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHUVVJVCcpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gIHByb2Nlc3Mub24oJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yRXhpdFByb21pc2VzKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChmb3JjZUtpbGxQcm9taXNlcyk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB9XG5cbiAgaWYgKGludGVycnVwdGVkU2lnbmFsKSB7XG4gICAgcmV0dXJuIGdldEV4aXRDb2RlKHVuZGVmaW5lZCwgaW50ZXJydXB0ZWRTaWduYWwpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0Jykge1xuICAgIHJldHVybiBmaXJzdFJlc3VsdCA/PyAxO1xuICB9XG4gIGlmIChzdG9wUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RvcFJlc3VsdDtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRDb2RlKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoc2lnbmFsICYmIHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykge1xuICAgIHJldHVybiAxMjggKyBjb25zdGFudHMuc2lnbmFsc1tzaWduYWxdO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdG9wT3RoZXJzKFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBvcHRpb25zOiBQaWNrPFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMsICdraWxsT3RoZXJzJyB8ICdraWxsT3RoZXJzT25GYWlsJyB8ICdzdWNjZXNzJz5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnIHx8IG9wdGlvbnMua2lsbE90aGVycyB8fCAob3B0aW9ucy5raWxsT3RoZXJzT25GYWlsICYmIGV4aXRDb2RlICE9PSAwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9yY2VLaWxsUGlkcyA9IHNpZ25hbFBpZHModG9DaGlsZFBpZHMoY2hpbGRyZW4pLCBzaWduYWwpO1xuICBpZiAoZm9yY2VLaWxsUGlkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBpZiAoYXdhaXQgd2FpdEZvckZvcmNlS2lsbChmb3JjZUtpbGxQaWRzKSkge1xuICAgIHNpZ25hbFBpZHMoZm9yY2VLaWxsUGlkcywgJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0NoaWxkUGlkcyhjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNoaWxkcmVuLmZsYXRNYXAoKGNoaWxkKSA9PiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQgPyBbXSA6IFtjaGlsZC5waWRdKSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFBpZHMocGlkczogcmVhZG9ubHkgbnVtYmVyW10sIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNpZ25hbGVkUGlkczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBwaWQgb2YgcGlkcykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWtpbGxQcm9jZXNzR3JvdXAocGlkLCBzaWduYWwpKSBjb250aW51ZTtcblxuICAgICAgc2lnbmFsZWRQaWRzLnB1c2gocGlkKTtcbiAgICAgIHRyZWVLaWxsKHBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8ga2lsbCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpZ25hbGVkUGlkcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckZvcmNlS2lsbChwaWRzOiByZWFkb25seSBudW1iZXJbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBGT1JDRV9LSUxMX0RFTEFZX01TO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgaWYgKHBpZHMuZXZlcnkoaXNQcm9jZXNzR3JvdXBHb25lKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgc2xlZXAoTWF0aC5taW4oMTAwLCBkZWFkbGluZSAtIERhdGUubm93KCkpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzR3JvdXBHb25lKHBpZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIDApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZnVuY3Rpb24ga2lsbFByb2Nlc3NHcm91cChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCBzaWduYWwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCc7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChhcmcpKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfT0ke3NoZWxsRXNjYXBlQXJndW1lbnQodmFsdWUpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vOj0sQCUrLV0rJC91LnRlc3QoYXJnKSA/IGFyZyA6IGAnJHthcmcucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi9zaGVsbC5qcyc7XG5cbmNvbnN0IHdyYW5nbGVyQ29uZmlnRmlsZU5hbWVzID0gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXTtcblxuLyoqXG4gKiBCdWlsZCBhIGNvbW1hbmQgZ2VuZXJhdGluZyBhIC5kZXYudmFycyBmaWxlICh2aWEgYHdiIGdlbi1kZXYtdmFyc2ApIHNvIHRoYXRcbiAqIGB3cmFuZ2xlciBkZXZgIGNhbiBzZWUgdGhlIHdiLW1hbmFnZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2OiBTY3JpcHRBcmd2LCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3diJywgJ2dlbi1kZXYtdmFycycsIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSwgb3V0cHV0UGF0aF0pO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgYHdyYW5nbGVyIGRldmAtc3R5bGUgY29tbWFuZC4gYGVudiAtdSBDTE9VREZMQVJFX0VOVmAgbWFrZXMgd3JhbmdsZXIgc2VydmUgdGhlIHRvcC1sZXZlbFxuICogKG5vbi1kZXBsb3kpIGNvbmZpZy4gd3JhbmdsZXIgKGxpa2UgdmluZXh0KSByZXF1aXJlcyByZWFsIE5vZGUuanMg4oCUIGBidW4gcnVuYCByZXNwZWN0cyB0aGUgYmluJ3NcbiAqIG5vZGUgc2hlYmFuZywgYW5kIHdiIG5ldmVyIGNvbXBvc2VzIGAtLWJ1bmAgKHdob3NlIG5vZGUtPmJ1biBQQVRIIHNoaW0gYnJlYWtzIGJvdGggdG9vbHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoYXJnczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlYgWUFSTiB3cmFuZ2xlciAke2FyZ3N9YC50cmltKCk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGFwcGx5aW5nIHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIHRvIHRoZSBsb2NhbCBkYXRhYmFzZSwgb3IgdW5kZWZpbmVkXG4gKiBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2Ugb3Igbm8gd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5LlxuICogQ0k9dHJ1ZSBzdXBwcmVzc2VzIHdyYW5nbGVyJ3MgaW50ZXJhY3RpdmUgY29uZmlybWF0aW9uIHByb21wdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGF0YWJhc2VOYW1lID0gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCk7XG4gIGlmICghZGF0YWJhc2VOYW1lIHx8ICFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KSkgcmV0dXJuO1xuXG4gIHJldHVybiBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtkYXRhYmFzZU5hbWV9IC0tbG9jYWwgLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCJgO1xufVxuXG4vKipcbiAqIFByZWZpeCB0aGUgZ2l2ZW4gc2NyaXB0IHdpdGggY29tbWFuZHMgZXhwb3J0aW5nIERBVEFCQVNFX1VSTCBwb2ludGluZyB0byB0aGUgbG9jYWwgbWluaWZsYXJlIEQxIFNRTGl0ZSBmaWxlLFxuICogc28gdGhhdCBkcml6emxlLWtpdCBhbmQgc2VlZCBzY3JpcHRzIGNhbiBvcGVyYXRlIG9uIHRoZSBzYW1lIGRhdGFiYXNlIGFzIHRoZSBhcHAuXG4gKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBEMSBkYXRhYmFzZSBpbiBpdHMgd3JhbmdsZXIgY29uZmlnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnZW52Jz4sIHNjcmlwdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGF0YWJhc2VOYW1lID0gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCk7XG4gIGlmICghZGF0YWJhc2VOYW1lKSByZXR1cm4gc2NyaXB0O1xuXG4gIC8vIEV4Y2x1ZGluZyBtaW5pZmxhcmUncyBtZXRhZGF0YS5zcWxpdGUsIHdoaWNoIGxpdmVzIG5leHQgdG8gdGhlIGhhc2gtbmFtZWQgZGF0YWJhc2UgZmlsZS5cbiAgLy8gQW4gdW5tYXRjaGVkIGdsb2IgY2Fubm90IGhhcHBlbiBoZXJlOiB0aGUgc2NyaXB0IHJ1bnMgdW5kZXIgL2Jpbi9zaCAodmlhIE5vZGUncyBgc2hlbGw6IHRydWVgKSxcbiAgLy8gYW5kIHRoZSBwcmVjZWRpbmcgbWF0ZXJpYWxpemF0aW9uIGNvbW1hbmQgZ3VhcmFudGVlcyB0aGUgU1FMaXRlIGZpbGUgZXhpc3RzLlxuICAvLyBQcm9qZWN0cyB3aXRoIG11bHRpcGxlIEQxIGRhdGFiYXNlcyBhcmUgbm90IHN1cHBvcnRlZDogdGhlIGhhc2gtbmFtZWQgZmlsZXMgY2Fubm90IGJlXG4gIC8vIGRpc3Rpbmd1aXNoZWQgY2hlYXBseSAobWF0ZXJpYWxpemF0aW9uIGRvZXMgbm90IGV2ZW4gdXBkYXRlIHRoZSB0YXJnZXQgZmlsZSdzIG10aW1lKS5cbiAgLy8gVGhlIHN0YXRlIGRpcmVjdG9yeSBtdXN0IGJlIGFic29sdXRlIGJlY2F1c2UgdGhlIHdyYXBwZWQgc2NyaXB0IG1heSBgY2RgIHRvIHRoZSBtb25vcmVwbyByb290LlxuICBjb25zdCBzdGF0ZURpclBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCkpO1xuICBjb25zdCBleHBvcnRDb21tYW5kID0gYGV4cG9ydCBEQVRBQkFTRV9VUkw9XCJmaWxlOiQobHMgXCIke3N0YXRlRGlyUGF0aH1cIi92My9kMS9taW5pZmxhcmUtRDFEYXRhYmFzZU9iamVjdC8qLnNxbGl0ZSB8IGdyZXAgLXYgbWV0YWRhdGEgfCBoZWFkIC0xKVwiYDtcbiAgcmV0dXJuIGAke2J1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0LCBkYXRhYmFzZU5hbWUpfSAmJiAke2V4cG9ydENvbW1hbmR9ICYmICR7c2NyaXB0fWA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBEMSBkYXRhYmFzZSBkZWNsYXJlZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFjb25maWdQYXRoKSByZXR1cm47XG5cbiAgLy8gQ292ZXIgSlNPTihDKSAoYFwiZGF0YWJhc2VfbmFtZVwiOiBcIi4uLlwiYCkgYW5kIFRPTUwsIGluY2x1ZGluZyBpdHMgaW5saW5lLXRhYmxlIGZvcm1cbiAgLy8gKGBkMV9kYXRhYmFzZXMgPSBbeyAuLi4sIGRhdGFiYXNlX25hbWUgPSBcIi4uLlwiIH1dYCksIHdpdGhvdXQgZnVsbCBwYXJzZXJzLlxuICAvLyBDb21tZW50ZWQtb3V0IGxpbmVzIGFyZSBza2lwcGVkIHNvIHRoYXQgdGhleSBjYW5ub3Qgc2hhZG93IHRoZSBhY3RpdmUgZGF0YWJhc2UgbmFtZSxcbiAgLy8gYW5kIHRoZSBrZXkgbXVzdCBmb2xsb3cgYSBsaW5lIHN0YXJ0LCBge2Agb3IgYCxgIHNvIHRoYXQgcHJvc2UgbWVudGlvbmluZyBpdCBjYW5ub3QgbWF0Y2guXG4gIGZvciAoY29uc3QgbGluZSBvZiBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKS5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAoL15cXHMqKD86I3xcXC9cXC8pL3UudGVzdChsaW5lKSkgY29udGludWU7XG5cbiAgICBjb25zdCBtYXRjaCA9IC8oPzpefFsse10pXFxzKltcIiddP2RhdGFiYXNlX25hbWVbXCInXT9cXHMqWzo9XVxccypbXCInXShbXlwiJ10rKVtcIiddL3UuZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaFsxXTtcbiAgfVxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIFRlc3RzIG1heSBwYXNzIHBhcnRpYWwgUHJvamVjdCBvYmplY3RzIHdpdGhvdXQgZGlyUGF0aC5cbiAgaWYgKCFwcm9qZWN0LmRpclBhdGgpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIHdyYW5nbGVyQ29uZmlnRmlsZU5hbWVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcGF0aCBvZiB0aGUgd3JhbmdsZXItbmF0aXZlIEQxIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IChgbWlncmF0aW9uc19kaXJgIGluIHRoZSB3cmFuZ2xlclxuICogY29uZmlnLCBkZWZhdWx0aW5nIHRvIGBtaWdyYXRpb25zYCkgaWYgaXQgZXhpc3RzIG9uIGRpc2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFjb25maWdQYXRoKSByZXR1cm47XG5cbiAgbGV0IG1pZ3JhdGlvbnNEaXIgPSAnbWlncmF0aW9ucyc7XG4gIGZvciAoY29uc3QgbGluZSBvZiBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKS5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAoL15cXHMqKD86I3xcXC9cXC8pL3UudGVzdChsaW5lKSkgY29udGludWU7XG5cbiAgICBjb25zdCBtYXRjaCA9IC8oPzpefFsse10pXFxzKltcIiddP21pZ3JhdGlvbnNfZGlyW1wiJ10/XFxzKls6PV1cXHMqW1wiJ10oW15cIiddKylbXCInXS91LmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBtaWdyYXRpb25zRGlyID0gbWF0Y2hbMV0gYXMgc3RyaW5nO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWlncmF0aW9uc0Rpcik7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSA/IG1pZ3JhdGlvbnNEaXJQYXRoIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBtYXRlcmlhbGl6aW5nIHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKiBBIG5vLW9wIHF1ZXJ5IGZvcmNlcyBtaW5pZmxhcmUgdG8gY3JlYXRlIHRoZSBTUUxpdGUgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC5cbiAqIE9ubHkgc3Rkb3V0IGlzIHN1cHByZXNzZWQ7IHdyYW5nbGVyIHJlcG9ydHMgZXJyb3JzIG9uIHN0ZGVyciwgd2hpY2ggbXVzdCBzdGF5IHZpc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4sIGRhdGFiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBZQVJOIHdyYW5nbGVyIGQxIGV4ZWN1dGUgJHtkYXRhYmFzZU5hbWV9IC0tbG9jYWwgLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1jb21tYW5kIFwiU0VMRUNUIDFcIiA+IC9kZXYvbnVsbGA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBsb2NhbCB3cmFuZ2xlci9taW5pZmxhcmUgc3RhdGUgZGlyZWN0b3J5LlxuICogRGV2ZWxvcG1lbnQgZm9sbG93cyB3cmFuZ2xlcidzIGRlZmF1bHQgZGlyZWN0b3J5IHNvIHRoYXQgcGxhaW4gYHdyYW5nbGVyIGRldmAgLyBgdmluZXh0IGRldmBcbiAqICh3aXRob3V0IGEgcGVyc2lzdC1wYXRoIG92ZXJyaWRlKSBzaGFyZXMgdGhlIHNhbWUgZGF0YWJhc2UgYXMgd2ItbWFuYWdlZCBkYiBjb21tYW5kcy5cbiAqIE90aGVyIGVudmlyb25tZW50cyAoZS5nLiB0ZXN0KSBnZXQgdGhlaXIgb3duIGRpcmVjdG9yeSBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlc2V0XG4gKiB3aXRob3V0IGRlc3Ryb3lpbmcgZGV2ZWxvcG1lbnQgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4pOiBzdHJpbmcge1xuICAvLyBEZXN0cnVjdGl2ZSB0ZXN0IHJlc2V0cyBhcmUgZ2F0ZWQgb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSwgd2hpY2ggYWNjZXB0c1xuICAvLyBlaXRoZXIgV0JfRU5WIG9yIE1JU0VfRU5WOyByZXNvbHZlIHRvIHRoZSB0ZXN0IGRpcmVjdG9yeSB3aGVuZXZlciBlaXRoZXIgc2F5cyAndGVzdCcgc29cbiAgLy8gdGhhdCBzdWNoIHJlc2V0cyBjYW4gbmV2ZXIgdGFyZ2V0IHRoZSBkZXZlbG9wbWVudCBzdGF0ZS5cbiAgY29uc3Qgd2JFbnYgPSBbcHJvamVjdC5lbnYuV0JfRU5WLCBwcm9qZWN0LmVudi5NSVNFX0VOVl0uaW5jbHVkZXMoJ3Rlc3QnKVxuICAgID8gJ3Rlc3QnXG4gICAgOiBwcm9qZWN0LmVudi5XQl9FTlYgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlY7XG4gIHJldHVybiAhd2JFbnYgfHwgd2JFbnYgPT09ICdkZXZlbG9wbWVudCcgPyAnLndyYW5nbGVyL3N0YXRlJyA6IGAud3JhbmdsZXIvc3RhdGUtJHt3YkVudn1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IGJ1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZCwgZ2V0RDFEYXRhYmFzZU5hbWUsIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpciB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcblxuY29uc3QgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FID0gJ2xpdGVzdHJlYW0ueW1sJztcbmNvbnN0IERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcblxuY2xhc3MgRHJpenpsZVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnY2xlYW51cC1saXRlc3RyZWFtJyk7XG4gICAgY29uc3Qgd2FsQ2hlY2twb2ludENvbW1hbmQgPSBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF0gJiYgY29tbWFuZCAtdiBzcWxpdGUzID4vZGV2L251bGw7IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBzcWxpdGUzIFwiJHtkYlBhdGh9XCI7IGZpYDtcbiAgICByZXR1cm4gYCR7d2FsQ2hlY2twb2ludENvbW1hbmR9OyBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qOyBybSAtUmYgXCIke3BhdGguZGlybmFtZShkYlBhdGgpfS8uJHtwYXRoLmJhc2VuYW1lKGRiUGF0aCl9XCIqIHx8IHRydWVgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgZDFEYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgICBpZiAoZDFEYXRhYmFzZU5hbWUpIHtcbiAgICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBEMSBzdWJ0cmVlIHNvIHRoYXQgb3RoZXIgbG9jYWxseS1wZXJzaXN0ZWQgYmluZGluZ3MgKEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKSBzdXJ2aXZlLFxuICAgICAgLy8gdGhlbiByZS1tYXRlcmlhbGl6ZSB0aGUgRDEgU1FMaXRlIGZpbGUuIEl0cyBwYXRoIGlzIGRldGVybWluaXN0aWMsIHNvIGEgREFUQUJBU0VfVVJMIGV4cG9ydGVkXG4gICAgICAvLyBiZWZvcmUgdGhlIHJlbW92YWwgc3RheXMgdmFsaWQuXG4gICAgICByZXR1cm4gYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfS92My9kMVwiICYmICR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGQxRGF0YWJhc2VOYW1lKX0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpO1xuICAgIGlmICghcmVtb3ZlQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgcmVzZXQgc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VlZENvbW1hbmQgPSB0aGlzLnNlZWQocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0ZUNvbW1hbmQgPSB0aGlzLmRlcGxveShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlZWRDb21tYW5kID09PSAndHJ1ZScgPyBtaWdyYXRlQ29tbWFuZCA6IGAke21pZ3JhdGVDb21tYW5kfSAmJiAke3NlZWRDb21tYW5kfWA7XG4gIH1cblxuICBtaWdyYXRlRm9yU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgKGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpIHx8IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgbWlncmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdkZXBsb3ktZm9yY2UnKTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGgpO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIFRoZSBlbnZpcm9ubWVudCBhc3NpZ25tZW50IG11c3QgZ28gdGhyb3VnaCBidWlsZERyaXp6bGVLaXRDb21tYW5kOiBwcmVmaXhpbmcgaXRzXG4gICAgLy8gcG9zc2libHktcGFyZW50aGVzaXplZCByZXN1bHQgd2l0aCBgQUxMT1dfVE9fU0tJUF9TRUVEPTBgIHdvdWxkIGJlIGEgc2hlbGwgc3ludGF4IGVycm9yLlxuICAgIGNvbnN0IG1pZ3JhdGVXaXRoU2VlZENvbW1hbmQgPSBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsICdtaWdyYXRlJywgJ0FMTE9XX1RPX1NLSVBfU0VFRD0wJyk7XG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07ICR7dGhpcy5kZXBsb3kocHJvamVjdCl9ICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofVwiICYmIGxzIC1haGwgXCIke2RiUGF0aH1cIiAmJiAke21pZ3JhdGVXaXRoU2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdsaXN0LWJhY2t1cHMnKTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ3Jlc3RvcmUnKTtcbiAgICByZXR1cm4gYCR7YnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKG91dHB1dFBhdGgpfTsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gXCIke291dHB1dFBhdGh9XCIgXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICBnZW5lcmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgZ2VuZXJhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cblxuICBtaWdyYXRlRGV2KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5zZWVkKSByZXR1cm4gJ1lBUk4gcnVuIHNlZWQnO1xuICAgIGNvbnN0IGRlZmF1bHRTZWVkUGF0aCA9IHBhdGguam9pbignZGInLCAnc2VlZC50cycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRlZmF1bHRTZWVkUGF0aCkpKSB7XG4gICAgICByZXR1cm4gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgQlVOICR7ZGVmYXVsdFNlZWRQYXRofWAgOiBgQlVOIGJ1aWxkLXRzIHJ1biAke2RlZmF1bHRTZWVkUGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHN0dWRpbyBmb3IgRHJpenpsZSBkb2VzIG5vdCBzdXBwb3J0IGRiLXVybC1vci1wYXRoLicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmdzOiBzdHJpbmcsIGVudmlyb25tZW50QXNzaWdubWVudCA9ICcnKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZCA9IGAke2Vudmlyb25tZW50QXNzaWdubWVudCAmJiBgJHtlbnZpcm9ubWVudEFzc2lnbm1lbnR9IGB9WUFSTiBkcml6emxlLWtpdCAke2FyZ3N9YDtcbiAgLy8gQSBjYWxsZXItc3VwcGxpZWQgLS1jb25maWcgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHNvIHRoZSBjd2QgbXVzdCBzdGF5IHRoZXJlLlxuICByZXR1cm4gYXJncy5pbmNsdWRlcygnLS1jb25maWcnKSA/IGNvbW1hbmQgOiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgY29tbWFuZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdDogUHJvamVjdCwgY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIC8vIGRyaXp6bGUta2l0IHJlc29sdmVzIHJlbGF0aXZlIHBhdGhzIGluIGl0cyBjb25maWcgYWdhaW5zdCB0aGUgY3dkLCBzbyB0aGUgY29tbWFuZCBtdXN0IHJ1blxuICAvLyBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZHJpenpsZS5jb25maWcuKiBldmVuIHdoZW4gbW9ub3JlcG8gcGFja2FnZXMgc2hhcmUgaXQgYXQgdGhlIHJvb3QuXG4gIHJldHVybiBjb25maWcgJiYgY29uZmlnLmRpclBhdGggIT09IHByb2plY3QuZGlyUGF0aFxuICAgID8gYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBjb25maWcuZGlyUGF0aF0pfSAmJiAke2NvbW1hbmR9KWBcbiAgICA6IGNvbW1hbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0OiBQcm9qZWN0KTogeyBkaXJQYXRoOiBzdHJpbmc7IGZpbGVOYW1lOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbJ2RyaXp6bGUuY29uZmlnLnRzJywgJ2RyaXp6bGUuY29uZmlnLm10cycsICdkcml6emxlLmNvbmZpZy5qcycsICdkcml6emxlLmNvbmZpZy5tanMnXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIFtwcm9qZWN0LmRpclBhdGgsIHByb2plY3Qucm9vdERpclBhdGhdKSB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBjYW5kaWRhdGVzLmZpbmQoKGZpbGVOYW1lKSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSkpKTtcbiAgICBpZiAoZmlsZU5hbWUpIHJldHVybiB7IGRpclBhdGgsIGZpbGVOYW1lIH07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kRm9yUGF0aChhYnNvbHV0ZVBhdGgpO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1mIFwiJHtkYlBhdGh9XCIgXCIke2RiUGF0aH0td2FsXCIgXCIke2RiUGF0aH0tc2htXCJgO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRGJQYXRoT3JFcnJvcihwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgd2IgZGIgJHtjb21tYW5kTmFtZX0gc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC5gKTtcbiAgfVxuICByZXR1cm4gZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0U3FsaXRlRGJQYXRoT3JFcnJvcihwcm9qZWN0LCBjb21tYW5kTmFtZSk7XG4gIHJldHVybiBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZ1BhdGgpIHJldHVybiBgLWNvbmZpZyBcIiR7Y29uZmlnUGF0aH1cImA7XG5cbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxDb25maWdQYXRoKSkgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIKSkgcmV0dXJuIGAtY29uZmlnICR7REVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIfWA7XG4gIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuL3dyYW5nbGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBXcmFuZ2xlckQxRGF0YWJhc2Uge1xuICBiaW5kaW5nPzogc3RyaW5nO1xuICBkYXRhYmFzZV9uYW1lPzogc3RyaW5nO1xuICBkYXRhYmFzZV9pZD86IHN0cmluZztcbiAgbWlncmF0aW9uc19kaXI/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfcGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBEMSBiaW5kaW5nIHVzZXMgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgdGhhdCBgd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseWBcbiAqIHdvdWxkIGFjdHVhbGx5IGRpc2NvdmVyOiBhbiBleHBsaWNpdCBgbWlncmF0aW9uc19wYXR0ZXJuYCBvcHRzIGluLCBvdGhlcndpc2UgdGhlIG1pZ3JhdGlvbnNcbiAqIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gZmxhdCBgKi5zcWxgIGZpbGVzICh3cmFuZ2xlcidzIGRlZmF1bHQgcGF0dGVybikuIEEgZHJpenpsZS1raXQgYG91dGBcbiAqIGRpcmVjdG9yeSB3aXRoIG5lc3RlZCBgPG5hbWU+L21pZ3JhdGlvbi5zcWxgIGZpbGVzIGFuZCBubyBwYXR0ZXJuIHdvdWxkIG1hdGNoIG5vdGhpbmcgYW5kXG4gKiBzaWxlbnRseSBhcHBseSB6ZXJvIG1pZ3JhdGlvbnMsIHNvIGl0IG11c3QgZmFsbCB0aHJvdWdoIHRvIHRoZSBkcml6emxlLWtpdCBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPiwgZGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSk6IGJvb2xlYW4ge1xuICAvLyBBbiBleHBsaWNpdCBwYXR0ZXJuIG9wdHMgaW50byB0aGUgd3JhbmdsZXItbmF0aXZlIG1lY2hhbmlzbSBldmVuIGJlZm9yZSB0aGUgZGlyZWN0b3J5XG4gIC8vIGV4aXN0czsgd3JhbmdsZXIgdGhlbiBmYWlscyBzYWZlbHkgd2l0aCBcIk5vIG1pZ3JhdGlvbnMgZm9sZGVyIGZvdW5kXCIgaW5zdGVhZCBvZiB3YlxuICAvLyBzaWxlbnRseSBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgbWlncmF0aW9uIGVuZ2luZS5cbiAgaWYgKGRhdGFiYXNlLm1pZ3JhdGlvbnNfcGF0dGVybikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGF0YWJhc2UubWlncmF0aW9uc19kaXIgPz8gJ21pZ3JhdGlvbnMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZnMucmVhZGRpclN5bmMobWlncmF0aW9uc0RpclBhdGgpLnNvbWUoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5lbmRzV2l0aCgnLnNxbCcpKTtcbn1cblxuY29uc3QgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMgPSBuZXcgU2V0KFsnYmluZGluZ3MnLCAnc2VuZF9lbWFpbCcsICdyYXRlbGltaXRzJ10pO1xuY29uc3QgUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUyA9IG5ldyBTZXQoWyd3YXNtX21vZHVsZXMnLCAndGV4dF9ibG9icycsICdkYXRhX2Jsb2JzJ10pO1xuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgYmluZGluZyBuYW1lIGRlY2xhcmVkIGluIHRoZSAoZW52aXJvbm1lbnQtcmVzb2x2ZWQpIGNvbmZpZyBzdWJ0cmVlOiBgYmluZGluZ2BcbiAqIHByb3BlcnRpZXMgYW55d2hlcmUgKEQxLCBLViwgUjIsIHNlcnZpY2VzLCBhc3NldHMsIHF1ZXVlcywgZXRjLiksIHRoZSBgbmFtZWAta2V5ZWQgYmluZGluZ3NcbiAqIChgZHVyYWJsZV9vYmplY3RzLmJpbmRpbmdzYCwgYGxvZ2Z3ZHIuYmluZGluZ3NgLCBgc2VuZF9lbWFpbGAsIGByYXRlbGltaXRzYCksIGFuZCB0aGVcbiAqIHJlY29yZC1rZXllZCBsZWdhY3kgbW9kdWxlIGJpbmRpbmdzIChgd2FzbV9tb2R1bGVzYCwgYHRleHRfYmxvYnNgLCBgZGF0YV9ibG9ic2ApLiBBIHNlY3JldFxuICogc2hhcmluZyBhIGJpbmRpbmcncyBuYW1lIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhhdCBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcgb24gZGVwbG95LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyh2YWx1ZTogdW5rbm93biwgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKSwgcGFyZW50S2V5ID0gJycpOiBTZXQ8c3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgY29sbGVjdEJpbmRpbmdOYW1lcyhpdGVtLCBuYW1lcywgcGFyZW50S2V5KTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbmFtZXM7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChrZXkgPT09ICdiaW5kaW5nJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbmFtZScgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyAmJiBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUy5oYXMocGFyZW50S2V5KSkge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMuaGFzKGtleSkgJiYgY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmluZGluZ05hbWUgb2YgT2JqZWN0LmtleXMoY2hpbGQpKSBuYW1lcy5hZGQoYmluZGluZ05hbWUpO1xuICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnZW52JyAmJiBrZXkgIT09ICd2YXJzJyAmJiBrZXkgIT09ICdtZXRhZGF0YScgJiYga2V5ICE9PSAnb3B0aW9ucycpIHtcbiAgICAgIC8vIE5lc3RlZCBgZW52YCBzdWJ0cmVlcyBiZWxvbmcgdG8gb3RoZXIgZW52aXJvbm1lbnRzOyBgdmFyc2AgdmFsdWVzLCBgdW5zYWZlLm1ldGFkYXRhYCxcbiAgICAgIC8vIGFuZCBgdW5zYWZlLmJpbmRpbmdzW10uZGV2Lm9wdGlvbnNgIGFyZSBhcmJpdHJhcnkgSlNPTiB3aG9zZSBwcm9wZXJ0aWVzIChlLmcuIGFcbiAgICAgIC8vIFwiYmluZGluZ1wiIGZpZWxkKSBhcmUgZGF0YSwgbm90IFdvcmtlciBiaW5kaW5ncy5cbiAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoY2hpbGQsIG5hbWVzLCBrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB7XG4gIC8qKiBUaGUgV29ya2VyIG5hbWUgZm9yIHRoZSBkZXBsb3kgZW52aXJvbm1lbnQgKHdyYW5nbGVyIGFwcGVuZHMgYC08ZW52PmAgd2hlbiB0aGUgZW52IHNlY3Rpb24gaGFzIG5vIG93biBuYW1lKS4gKi9cbiAgd29ya2VyTmFtZT86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB2YXJLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBlbnZpcm9ubWVudCdzIGB2YXJzYCB2YWx1ZXMgKG5lZWRlZCBmb3IgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIGNvdW50L3NpemUgbGltaXRzKS4gKi9cbiAgdmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTZWNyZXRzIGRlY2xhcmVkIGFzIHJlcXVpcmVkIHZpYSB3cmFuZ2xlcidzIGBzZWNyZXRzLnJlcXVpcmVkYCAodmFsaWRhdGVkIGF0IGRlcGxveSB0aW1lKS4gKi9cbiAgcmVxdWlyZWRTZWNyZXROYW1lczogc3RyaW5nW107XG4gIC8qKiBOYW1lcyBvZiBhbGwgbm9uLXZhciBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzLCBzZW5kX2VtYWlsLCBzZXJ2aWNlcywgLi4uKS4gKi9cbiAgYmluZGluZ05hbWVzOiBzdHJpbmdbXTtcbiAgZDFEYXRhYmFzZXM6IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZW52aXJvbm1lbnQgY29tZXMgZnJvbSBhbiBgZW52LjxuYW1lPmAgc2VjdGlvbiAodGhlbiB3cmFuZ2xlciBjb21tYW5kcyBuZWVkXG4gICAqIGAtLWVudiA8bmFtZT5gIC8gYENMT1VERkxBUkVfRU5WPTxuYW1lPmApLiBgcHJvZHVjdGlvbmAgbWF5IGJlIGVpdGhlciB0aGUgdG9wIGxldmVsIG9yIGFcbiAgICogbmFtZWQgYGVudi5wcm9kdWN0aW9uYCBzZWN0aW9uOyB0aGUgc2VjdGlvbiB3aW5zIHdoZW4gaXQgZXhpc3RzLlxuICAgKi9cbiAgdXNlc0VudlNlY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSYXdXcmFuZ2xlckNvbmZpZyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZDFfZGF0YWJhc2VzPzogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIGFzc2V0cz86IHVua25vd247XG4gIGxvZ2Z3ZHI/OiB1bmtub3duO1xuICB3YXNtX21vZHVsZXM/OiB1bmtub3duO1xuICB0ZXh0X2Jsb2JzPzogdW5rbm93bjtcbiAgZGF0YV9ibG9icz86IHVua25vd247XG4gIHNpdGU/OiB1bmtub3duO1xuICBzZWNyZXRzPzogeyByZXF1aXJlZD86IHN0cmluZ1tdIH07XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIFJhd1dyYW5nbGVyQ29uZmlnPjtcbn1cblxuLy8gV29ya2VycyBTaXRlcyBpbXBsaWNpdGx5IGJpbmRzIGl0cyBLViBuYW1lc3BhY2UgYXMgX19TVEFUSUNfQ09OVEVOVC5cbmZ1bmN0aW9uIHNpdGVCaW5kaW5nTmFtZXMoY29uZmlnOiBSYXdXcmFuZ2xlckNvbmZpZywgZW52Q29uZmlnPzogUmF3V3JhbmdsZXJDb25maWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoZW52Q29uZmlnPy5zaXRlID8/IGNvbmZpZy5zaXRlKSA/IFsnX19TVEFUSUNfQ09OVEVOVCddIDogW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd3JhbmdsZXIgY29uZmlnIHZhbHVlcyBuZWVkZWQgZm9yIGRlcGxveWluZyB0byB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuXG4gKiBGb2xsb3dzIHdyYW5nbGVyJ3MgaW5oZXJpdGFuY2UgcnVsZXM6IGBhY2NvdW50X2lkYCBpcyBpbmhlcml0ZWQgYnkgbmFtZWQgZW52aXJvbm1lbnRzLFxuICogd2hpbGUgYHZhcnNgIGFuZCBgZDFfZGF0YWJhc2VzYCBhcmUgbm90IGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcbiAgaWYgKHBhdGguZXh0bmFtZShjb25maWdQYXRoKSA9PT0gJy50b21sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGVwbG95IHN1cHBvcnRzIHdyYW5nbGVyLmpzb25jL3dyYW5nbGVyLmpzb24gY29uZmlncyBvbmx5OyBtaWdyYXRlIHdyYW5nbGVyLnRvbWwgZmlyc3QuJyk7XG4gIH1cblxuICAvLyBqc29uYy1wYXJzZXIgaXMgZmF1bHQgdG9sZXJhbnQgYW5kIHdvdWxkIHJldHVybiBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsXG4gIC8vIHdoaWNoIGNvdWxkIG1pZ3JhdGUgYSByZW1vdGUgZGF0YWJhc2UgZnJvbSBhIGhhbGYtcmVhZCBjb25maWc7IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IuXG4gIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgY29uc3QgY29uZmlnID0gcGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JyksIHBhcnNlRXJyb3JzLCB7XG4gICAgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlLFxuICB9KSBhcyBSYXdXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2NvbmZpZ1BhdGh9OiAke3BhcnNlRXJyb3JzLmxlbmd0aH0gSlNPTkMgc3ludGF4IGVycm9yKHMpLmApO1xuICB9XG4gIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgY29uc3QgZW52Q29uZmlnID0gY29uZmlnLmVudj8uW2Vudk5hbWVdO1xuICBpZiAoIWVudkNvbmZpZyAmJiBlbnZOYW1lICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB3cmFuZ2xlciBjb25maWcgaGFzIG5vIFwiZW52XCI6IHsgXCIke2Vudk5hbWV9XCI6IC4uLiB9IHNlY3Rpb24uYCk7XG4gIH1cbiAgcmV0dXJuIGVudkNvbmZpZ1xuICAgID8ge1xuICAgICAgICB3b3JrZXJOYW1lOiBlbnZDb25maWcubmFtZSA/PyAoY29uZmlnLm5hbWUgPyBgJHtjb25maWcubmFtZX0tJHtlbnZOYW1lfWAgOiB1bmRlZmluZWQpLFxuICAgICAgICBhY2NvdW50SWQ6IGVudkNvbmZpZy5hY2NvdW50X2lkID8/IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhlbnZDb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGVudkNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICAvLyBNb3N0IGJpbmRpbmdzIGFyZSBub24taW5oZXJpdGFibGUgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQsIHNvIG9ubHkgdGhlXG4gICAgICAgIC8vIGVudmlyb25tZW50J3Mgb3duIG5hbWVzIGNvdW50IOKAlCBwbHVzIHRoZSBnZW51aW5lbHkgaW5oZXJpdGVkIHNoYXBlcyAoYXNzZXRzLCBsb2dmd2RyKSxcbiAgICAgICAgLy8gd2hpY2ggd3JhbmdsZXIgcmVzb2x2ZXMgYXMgd2hvbGUgZmllbGRzOiB0aGUgZW52aXJvbm1lbnQncyBvd24gZmllbGQgb3ZlcnJpZGVzIHRoZVxuICAgICAgICAvLyB0b3AgbGV2ZWwgZW50aXJlbHksIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSdzIG5hbWVzIGNvdW50LlxuICAgICAgICBiaW5kaW5nTmFtZXM6IFtcbiAgICAgICAgICAuLi5jb2xsZWN0QmluZGluZ05hbWVzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhc3NldHM6IGVudkNvbmZpZy5hc3NldHMgPz8gY29uZmlnLmFzc2V0cyxcbiAgICAgICAgICAgICAgbG9nZndkcjogZW52Q29uZmlnLmxvZ2Z3ZHIgPz8gY29uZmlnLmxvZ2Z3ZHIsXG4gICAgICAgICAgICAgIHdhc21fbW9kdWxlczogZW52Q29uZmlnLndhc21fbW9kdWxlcyA/PyBjb25maWcud2FzbV9tb2R1bGVzLFxuICAgICAgICAgICAgICB0ZXh0X2Jsb2JzOiBlbnZDb25maWcudGV4dF9ibG9icyA/PyBjb25maWcudGV4dF9ibG9icyxcbiAgICAgICAgICAgICAgZGF0YV9ibG9iczogZW52Q29uZmlnLmRhdGFfYmxvYnMgPz8gY29uZmlnLmRhdGFfYmxvYnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhlbnZDb25maWcpXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZywgZW52Q29uZmlnKSxcbiAgICAgICAgXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGVudkNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIC8vIGBzZWNyZXRzYCBpcyBub24taW5oZXJpdGFibGU6IGEgdG9wLWxldmVsIHJlcXVpcmVtZW50IG11c3Qgbm90IGZvcmNlIChvciB1cGxvYWQpXG4gICAgICAgIC8vIGEgc2VjcmV0IGludG8gYSBuYW1lZCBlbnZpcm9ubWVudC5cbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogZW52Q29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogdHJ1ZSxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgd29ya2VyTmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgIGFjY291bnRJZDogY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogY29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIGJpbmRpbmdOYW1lczogWy4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoY29uZmlnKSwgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcpXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IGZhbHNlLFxuICAgICAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlRG90ZW52IH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbi8vIENsb3VkZmxhcmUgV29ya2VycyBkb24ndCBzZWUgdGhlIHByb2Nlc3MgZW52aXJvbm1lbnQ7IHdyYW5nbGVyIGRldiByZWFkcyB2YXJzIGZyb20gYSAuZGV2LnZhcnNcbi8vIGZpbGUgbmV4dCB0byBpdHMgY29uZmlnIGZpbGUgaW5zdGVhZC4gVGhpcyBjb21tYW5kIGJyaWRnZXMgd2ItbWFuYWdlZCAuZW52IGZpbGVzIHRvIHRoYXQgZmlsZS5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyAmIHsgcGF0aD86IHN0cmluZyB9PjtcblxuZXhwb3J0IGNvbnN0IGdlbkRldlZhcnNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdnZW4tZGV2LXZhcnMgW3BhdGhdJyxcbiAgZGVzY3JpYmU6XG4gICAgJ0dlbmVyYXRlIGEgLmRldi52YXJzIGZpbGUgZm9yIGB3cmFuZ2xlciBkZXZgIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQgZnJvbSAuZW52IGZpbGVzIChwbHVzIFdCX0VOViBhbmQgTkVYVF9QVUJMSUNfV0JfRU5WKS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+XG4gICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIGdlbmVyYXRlZCAuZGV2LnZhcnMgZmlsZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnLmRldi52YXJzJyxcbiAgICB9KSBhcyB1bmtub3duIGFzIEFyZ3Y8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFJlc3RyaWN0IHRvIHRoZSB2YXJpYWJsZXMgbG9hZGVkIGZyb20gLmVudiBmaWxlcyAod2IncyBlbnZpcm9ubWVudCBjb250cmFjdCkgc28gdGhhdFxuICAgIC8vIHVucmVsYXRlZCBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZXZlciBsZWFrIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBJZ25vcmVcbiAgICAvLyBwcm9jZXNzLmVudiBiZWNhdXNlIHRoZSBwYXJlbnQgd2IgcHJvY2VzcyBpbmplY3RzIHRoZSAuZW52IHZhbHVlcyBpbnRvIGl0LCB3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBsb2FkaW5nIHRoZW0gaGVyZS5cbiAgICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBkb3RlbnYgdmFsdWVzIGZvciBmaWxlLWRlZmluZWRcbiAgICAvLyBrZXlzIChwcm9qZWN0LmVudiBhcHBsaWVzIHRoYXQgcHJlY2VkZW5jZSksIG9yIGBBVVRIX1NFQ1JFVD0uLi4gd2Igc3RhcnRgIHdvdWxkIHNlcnZlXG4gICAgLy8gdGhlIHN0YWxlIGZpbGUgdmFsdWUuIEFuIGV4cG9ydCB0aGF0IGVtcHRpZXMgYSBub24tZW1wdHkgZmlsZSB2YWx1ZSBpcyBkZWxpYmVyYXRlIGFuZFxuICAgIC8vIG11c3Qgc3Vydml2ZSB0aGUgZW1wdHktdmFsdWUgZmlsdGVyIGJlbG93ICh1bmxpa2UgYEtFWT1gIHBsYWNlaG9sZGVycyBpbiAuZW52IGZpbGVzLFxuICAgIC8vIHdoaWNoIHN0YXkgb21pdHRlZCBzbyB0aGV5IGNhbm5vdCBvdmVycmlkZSB3cmFuZ2xlciBgdmFyc2Agd2l0aCBlbXB0eSBzdHJpbmdzKS5cbiAgICBjb25zdCBleHBsaWNpdGx5RW1wdGllZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSAnJyAmJiBlbnZWYXJzW2tleV0gIT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgLy8gU3VwcGxlbWVudCB3aXRoIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFsdWVzIGZvciB0aGUga2V5cyBuYW1lZCBpbiAuZW52LmV4YW1wbGU6IENJIG9mdGVuXG4gICAgLy8gcHJvdmlkZXMgdGhlbSBhcyB3b3JrZmxvdyBlbnYgaW5zdGVhZCBvZiAuZW52IGZpbGVzIChzdGlsbCBhbiBhbGxvd2xpc3QsIHNvIHVucmVsYXRlZFxuICAgIC8vIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbm5vdCBsZWFrKS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ucmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3QpLCAnV0JfRU5WJywgJ05FWFRfUFVCTElDX1dCX0VOViddKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZW52VmFyc1trZXldIHx8IGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVudlZhcnNba2V5XSA9PT0gdW5kZWZpbmVkICYmIGVmZmVjdGl2ZVZhbHVlID09PSAnJykgZXhwbGljaXRseUVtcHRpZWRLZXlzLmFkZChrZXkpO1xuICAgICAgZW52VmFyc1trZXldID0gZWZmZWN0aXZlVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gJycgfHwgZXhwbGljaXRseUVtcHRpZWRLZXlzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7cXVvdGVEb3RlbnZWYWx1ZShrZXksIHZhbHVlKX1gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYXJndi5wYXRoID8/ICcuZGV2LnZhcnMnKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBXb3VsZCBnZW5lcmF0ZSAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudkV4YW1wbGVLZXlzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGxldCBlbnZFeGFtcGxlUGF0aDogc3RyaW5nO1xuICB0cnkge1xuICAgIGVudkV4YW1wbGVQYXRoID0gcHJvamVjdC5maW5kRmlsZSgnLmVudi5leGFtcGxlJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvLyBkb3RlbnYncyBvd24gcGFyc2VyIGNvdmVycyBgZXhwb3J0IEtFWT1gIHByZWZpeGVzIGFuZCB3aGl0ZXNwYWNlIGFyb3VuZCBgPWAsXG4gIC8vIHdoaWNoIGEgbGluZSByZWdleCB3b3VsZCBzaWxlbnRseSBtaXNzLlxuICByZXR1cm4gT2JqZWN0LmtleXMocGFyc2VEb3RlbnYoZnMucmVhZEZpbGVTeW5jKGVudkV4YW1wbGVQYXRoLCAndXRmOCcpKSk7XG59XG5cbi8qKlxuICogUXVvdGUgYSB2YWx1ZSBmb3IgZG90ZW52ICh3aGljaCB3cmFuZ2xlciB1c2VzIGZvciAuZGV2LnZhcnMpLiBFdmVyeSBjYW5kaWRhdGUgcmVwcmVzZW50YXRpb25cbiAqIGlzIHZlcmlmaWVkIGJ5IGFjdHVhbGx5IHBhcnNpbmcgaXQgYmFjayAob3VyIGRvdGVudiBwYXJzZXIgbWF0Y2hlcyB3cmFuZ2xlcidzIGJ1bmRsZWQgZG90ZW52XG4gKiAxNiBmb3IgdGhlc2UgY29uc3RydWN0cyksIHNvIGEgdmFsdWUgaXMgZWl0aGVyIHNlcmlhbGl6ZWQgbG9zc2xlc3NseSBvciByZWplY3RlZCDigJQgbmV2ZXJcbiAqIHNpbGVudGx5IGNvcnJ1cHRlZC4gQ2FuZGlkYXRlczogc2luZ2xlIHF1b3RlcyAobGl0ZXJhbCBzcGFuOyBjbG9zZWQgZWFybHkgYnkgYW4gYXBvc3Ryb3BoZSksXG4gKiBiYWNrdGlja3MgKGVxdWFsbHkgbGl0ZXJhbCksIHRoZW4gZG91YmxlIHF1b3RlcyB3aXRoIGVzY2FwZWQgbmV3bGluZXMvQ1JzIChkb3RlbnYgZG9lcyBub3RcbiAqIHVuZXNjYXBlIGlubmVyIFxcXCIg4oCUIGEgYCNgIGFmdGVyIGFuIGVtYmVkZGVkIHF1b3RlIHN0YXJ0cyBhIGNvbW1lbnQsIHdoaWNoIHRoZSByb3VuZC10cmlwXG4gKiBjaGVjayBjYXRjaGVzIGFuZCByZWplY3RzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlRG90ZW52VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkb3VibGVRdW90ZWRCb2R5ID0gdmFsdWUucmVwbGFjZUFsbCgnXFxuJywgU3RyaW5nLnJhd2BcXG5gKS5yZXBsYWNlQWxsKCdcXHInLCBTdHJpbmcucmF3YFxccmApO1xuICBjb25zdCBjYW5kaWRhdGVzID0gW2AnJHt2YWx1ZX0nYCwgYFxcYCR7dmFsdWV9XFxgYCwgYFwiJHtkb3VibGVRdW90ZWRCb2R5fVwiYF07XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAocGFyc2VEb3RlbnYoYCR7a2V5fT0ke2NhbmRpZGF0ZX1gKVtrZXldID09PSB2YWx1ZSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB2YWx1ZSBvZiAke2tleX0gY2Fubm90IGJlIGxvc3NsZXNzbHkgc2VyaWFsaXplZCBpbnRvIC5kZXYudmFyczsgc2ltcGxpZnkgaXRzIHF1b3RpbmcuYCk7XG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGREcml6emxlS2l0Q29tbWFuZCB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50LCBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZywgV3JhbmdsZXJEMURhdGFiYXNlIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXJDb25maWcuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52LCB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXJDb25maWcuanMnO1xuXG5pbXBvcnQgeyByZWFkRW52RXhhbXBsZUtleXMgfSBmcm9tICcuL2dlbkRldlZhcnMuanMnO1xuXG4vKipcbiAqIEtleXMgdGhhdCBkcml2ZSB0aGUgZGVwbG95IGl0c2VsZiAob3IgYXJlIG1lYW5pbmdmdWwgb25seSBsb2NhbGx5KSBhbmQgdGh1cyBtdXN0IG5ldmVyIGJlXG4gKiBwdXNoZWQgdG8gdGhlIFdvcmtlciBhcyBzZWNyZXRzLiBgV0JfRU5WYCAvIGBORVhUX1BVQkxJQ19XQl9FTlZgIGJlbG9uZyBpbiB3cmFuZ2xlciBgdmFyc2AuXG4gKi9cbmNvbnN0IE5PTl9TRUNSRVRfS0VZUyA9IG5ldyBTZXQoW1xuICAnQ0knLFxuICAvLyBXcmFuZ2xlciBzeXN0ZW0vYXV0aGVudGljYXRpb24gdmFyaWFibGVzIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy93cmFuZ2xlci9zeXN0ZW0tZW52aXJvbm1lbnQtdmFyaWFibGVzLyksXG4gIC8vIGluY2x1ZGluZyBsZWdhY3kgYWxpYXNlczsgYXBwLXNwZWNpZmljIG5hbWVzIHN1Y2ggYXMgQ0xPVURGTEFSRV9SMl9BQ0NFU1NfS0VZX0lEIHN0YXkgZWxpZ2libGUuXG4gICdDRl9BQ0NPVU5UX0lEJyxcbiAgJ0NGX0FQSV9CQVNFX1VSTCcsXG4gICdDRl9BUElfRU1BSUwnLFxuICAnQ0ZfQVBJX0tFWScsXG4gICdDRl9BUElfVE9LRU4nLFxuICAnQ0ZfRU1BSUwnLFxuICAnQ0xPVURGTEFSRV9BQ0NFU1NfQ0xJRU5UX0lEJyxcbiAgJ0NMT1VERkxBUkVfQUNDRVNTX0NMSUVOVF9TRUNSRVQnLFxuICAnQ0xPVURGTEFSRV9BQ0NPVU5UX0lEJyxcbiAgJ0NMT1VERkxBUkVfQVBJX0JBU0VfVVJMJyxcbiAgJ0NMT1VERkxBUkVfQVBJX0tFWScsXG4gICdDTE9VREZMQVJFX0FQSV9UT0tFTicsXG4gICdDTE9VREZMQVJFX0FVVEhfVVNFX0tFWVJJTkcnLFxuICAnQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCcsXG4gICdDTE9VREZMQVJFX0VNQUlMJyxcbiAgJ0NMT1VERkxBUkVfRU5WJyxcbiAgJ0NMT1VERkxBUkVfSU5DTFVERV9QUk9DRVNTX0VOVicsXG4gICdDTE9VREZMQVJFX0xPQURfREVWX1ZBUlNfRlJPTV9ET1RfRU5WJyxcbiAgJ0RPQ0tFUl9IT1NUJyxcbiAgJ0hUVFBfUFJPWFknLFxuICAnSFRUUFNfUFJPWFknLFxuICAnaHR0cF9wcm94eScsXG4gICdodHRwc19wcm94eScsXG4gICdGT1JDRV9DT0xPUicsXG4gICdNSU5JRkxBUkVfQ0FDSEVfRElSJyxcbiAgJ01JU0VfRU5WJyxcbiAgJ05PX0NPTE9SJyxcbiAgJ05FWFRfUFVCTElDX1dCX0VOVicsXG4gICdORVhUX1BVQkxJQ19XQl9WRVJTSU9OJyxcbiAgJ05PREVfRU5WJyxcbiAgJ1BPUlQnLFxuICAnV0JfRU5WJyxcbiAgJ1dCX1ZFUlNJT04nLFxuXSk7XG5cbmNvbnN0IE5PTl9TRUNSRVRfS0VZX1BSRUZJWEVTID0gWydXUkFOR0xFUl8nLCAnQ0xPVURGTEFSRV9IWVBFUkRSSVZFX0xPQ0FMX0NPTk5FQ1RJT05fU1RSSU5HXycsICdDTE9VREZMQVJFX0NGX0ZFVENIXyddO1xuXG5mdW5jdGlvbiBpc05vblNlY3JldEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gTk9OX1NFQ1JFVF9LRVlTLmhhcyhrZXkpIHx8IE5PTl9TRUNSRVRfS0VZX1BSRUZJWEVTLnNvbWUoKHByZWZpeCkgPT4ga2V5LnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBEZXBsb3lDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBEZXBsb3lDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxEZXBsb3lDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIERlcGxveUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOlxuICAgICdEZXBsb3kgYSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwICh2aW5leHQgb3IgcGxhaW4gV29ya2VyKSB0byB0aGUgV0JfRU5WIGVudmlyb25tZW50OiB2YWxpZGF0ZSBzZWNyZXRzLCBidWlsZCwgYXBwbHkgcmVtb3RlIEQxIG1pZ3JhdGlvbnMsIHRoZW4gZGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHlhcmdzIGFzIHVua25vd24gYXMgQXJndjxEZXBsb3lDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogRGVwbG95Q29tbWFuZEFyZ3YpIHtcbiAgICAvLyBBIHN0cmF5IGV4cG9ydGVkIENMT1VERkxBUkVfRU5WIHdvdWxkIGJha2UgdGhlIHdyb25nIGVudmlyb25tZW50IGludG8gdGhlIGJ1aWxkIGFuZFxuICAgIC8vIGFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXggdHdpY2Ugb24gZGVwbG95OyBpdCBpcyByZS1zZXQgZXhwbGljaXRseSB3aGVyZSBuZWVkZWQuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNMT1VERkxBUkVfRU5WO1xuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBpZiAoIXdyYW5nbGVyQ29uZmlnUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ3diIGRlcGxveSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAobm8gd3JhbmdsZXIgY29uZmlnIGZvdW5kKS4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIE9ubHkgcHJvY2Vzcy5lbnYgaXMgd29ydGggbXV0YXRpbmc6IGBwcm9qZWN0LmVudmAgcmVjb21wb3NlcyBpdHNlbGYgZnJvbSBwcm9jZXNzLmVudiBwbHVzXG4gICAgLy8gdGhlIGRvdGVudiBmaWxlcyBvbiBldmVyeSByZWFkLCBzbyBhbiBpbi1wbGFjZSBtdXRhdGlvbiBvZiBpdCBuZXZlciByZWFjaGVzIGEgbGF0ZXIgcmVhZFxuICAgIC8vIG9yIGEgc3Bhd25lZCBjb21tYW5kLiBDTE9VREZMQVJFX0VOViBpcyBhbHJlYWR5IGRlbGV0ZWQgZnJvbSBwcm9jZXNzLmVudiBhYm92ZTsgYSBkb3RlbnZcbiAgICAvLyBmaWxlIGRlZmluaW5nIGl0IHdvdWxkIHN0aWxsIHN1cmZhY2UsIHdoaWNoIHRoZSBleHBsaWNpdCBgLS1lbnZgIGZsYWdzIGJlbG93IG92ZXJyaWRlLlxuXG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBDSSBwcm92aWRlcyB0aGUgQ2xvdWRmbGFyZSBBUEkgdG9rZW4gdmlhIGEgLmVudi5jbG91ZGZsYXJlIGZpbGUgKGUuZy4gdGhlIHJldXNhYmxlIGRlcGxveVxuICAgIC8vIHdvcmtmbG93J3MgRklMRV9DT05URU5UXzEpOyBhbHJlYWR5LWV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aW4gb3ZlciBpdHMgdmFsdWVzLlxuICAgIC8vIFRoZSB2YWx1ZXMgZ28gaW50byBwcm9jZXNzLmVudiwgbm90IHByb2plY3QuZW52OiBgcHJvamVjdC5lbnZgIHJlY29tcG9zZXMgaXRzZWxmIGZyb21cbiAgICAvLyBwcm9jZXNzLmVudiBwbHVzIHRoZSBkb3RlbnYgZmlsZXMgb24gZXZlcnkgcmVhZCwgc28gYW4gaW4tcGxhY2UgbXV0YXRpb24gb2YgaXQgd291bGQgYmVcbiAgICAvLyBkcm9wcGVkIGJlZm9yZSB0aGUgc3Bhd25lZCB3cmFuZ2xlci9kcml6emxlLWtpdCBjb21tYW5kcyBpbmhlcml0IHRoZWlyIGVudmlyb25tZW50IOKAlFxuICAgIC8vIHdyYW5nbGVyIHRoZW4gYWJvcnRlZCB3aXRoIFwiaXQncyBuZWNlc3NhcnkgdG8gc2V0IGEgQ0xPVURGTEFSRV9BUElfVE9LRU5cIi5cbiAgICBjb25zdCBjbG91ZGZsYXJlRW52UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcuZW52LmNsb3VkZmxhcmUnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjbG91ZGZsYXJlRW52UGF0aCkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IGNsb3VkZmxhcmVFbnZQYXRoLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnQ0xPVURGTEFSRV9FTlYnKSBjb250aW51ZTtcbiAgICAgICAgLy8gPz89IHNvIHRoYXQgYW4gZXhwbGljaXRseSBleHBvcnRlZCBlbXB0eSB2YWx1ZSBzdGlsbCB3aW5zIG92ZXIgdGhlIGZpbGUuXG4gICAgICAgIHByb2Nlc3MuZW52W2tleV0gPz89IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWRDb25maWcgPSByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYocHJvamVjdCwgZW52TmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoIXJlc29sdmVkQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHBhcnNlICR7d3JhbmdsZXJDb25maWdQYXRofS5gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGFjY291bnRJZCA9IHJlc29sdmVkQ29uZmlnLmFjY291bnRJZCA/PyBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQ7XG4gICAgLy8gUHJlZmVyIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIHdoZW5ldmVyIHRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCdzIEQxIGJpbmRpbmdzIGhhdmUgYW5cbiAgICAvLyBleGlzdGluZyBtaWdyYXRpb25zIGRpcmVjdG9yeTogYSBkcml6emxlLW9ybSBkZXBlbmRlbmN5IGFsb25lIGRvZXMgbm90IGltcGx5IHRoZSBwcm9qZWN0XG4gICAgLy8gbWlncmF0ZXMgRDEgd2l0aCBkcml6emxlLWtpdCdzIGQxLWh0dHAgZHJpdmVyIChzb21lIGRyaXp6bGUgYXBwcyB1c2Ugd3JhbmdsZXItbmF0aXZlKS5cbiAgICBjb25zdCB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT5cbiAgICAgIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMocHJvamVjdCwgZGF0YWJhc2UpXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICBwcm9qZWN0Lmhhc0RyaXp6bGUgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID4gMCAmJlxuICAgICAgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPCByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIC8vIE1pZ3JhdGluZyBvbmx5IHRoZSB3cmFuZ2xlci1uYXRpdmUgc3Vic2V0IHdvdWxkIHNpbGVudGx5IGRlcGxveSBjb2RlIGFnYWluc3QgdGhlXG4gICAgICAvLyBvdGhlciwgdW5taWdyYXRlZCBkYXRhYmFzZXMuXG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoJ3diIGRlcGxveSBkb2VzIG5vdCBzdXBwb3J0IG1peGluZyB3cmFuZ2xlci1uYXRpdmUgYW5kIG5vbi1uYXRpdmUgRDEgbWlncmF0aW9uIGxheW91dHMuJylcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGRyaXp6bGVEMURhdGFiYXNlID1cbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID09PSAwICYmIHByb2plY3QuaGFzRHJpenpsZSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgIGlmICh3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBwcm9qZWN0Lmhhc0RyaXp6bGUgJiYgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgc3VwcG9ydHMgZHJpenpsZS1raXQgbWlncmF0aW9ucyBvbmx5IGZvciBhIHNpbmdsZSBEMSBiaW5kaW5nOyBmb3VuZCBtdWx0aXBsZS4nKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gRHJ5IHJ1bnMgZXhlY3V0ZSBub3RoaW5nIGF1dGhlbnRpY2F0ZWQsIHNvIHRoZXkgc2tpcCB0aGUgY3JlZGVudGlhbCBwcmVmbGlnaHQgZW50aXJlbHkuXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgaWYgKGRyaXp6bGVEMURhdGFiYXNlICYmICFwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9UT0tFTikge1xuICAgICAgICAvLyBkcml6emxlLWtpdCdzIGQxLWh0dHAgZHJpdmVyIHJlcXVpcmVzIHRoaXMgc3BlY2lmaWMgdG9rZW4gZXZlbiBmb3IgbG9jYWwgcnVuczsgYVxuICAgICAgICAvLyBsb2NhbCB3cmFuZ2xlciBPQXV0aCBsb2dpbiBjb3ZlcnMgb25seSB0aGUgd3JhbmdsZXItbmF0aXZlIHBhdGguXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdDTE9VREZMQVJFX0FQSV9UT0tFTiBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uID1cbiAgICAgICAgISFwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIXByb2plY3QuZW52LkNGX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIShwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9FTUFJTCkgfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0ZfQVBJX0tFWSAmJiBwcm9qZWN0LmVudi5DRl9FTUFJTCk7XG4gICAgICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgIWhhc1dyYW5nbGVyQXV0aGVudGljYXRpb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dyYW5nbGVyIGF1dGhlbnRpY2F0aW9uIChlLmcuIENMT1VERkxBUkVfQVBJX1RPS0VOKSBpcyByZXF1aXJlZCB0byBkZXBsb3kgb24gQ0kuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwLXNwZWNpZmljIHZhbGlkYXRpb24gaG9vayAoZS5nLiBzZWNyZXQgcGFpcnMgdGhhdCBtdXN0IGJlIGJvdGgtc2V0LW9yLWJvdGgtZW1wdHkpLlxuICAgIC8vIFRoZSByZXVzYWJsZSBkZXBsb3kueW1sIGFscmVhZHkgcnVucyBpdCBvbiBDSTsgcnVuIGl0IGhlcmUgZm9yIGxvY2FsIGRlcGxveXMuXG4gICAgaWYgKCFpc0NJKHByb2plY3QuZW52LkNJKSAmJiBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGVwbG95L2NpLXNldHVwJ10pIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZGVwbG95L2NpLXNldHVwJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgLy8gMS4gUmVzb2x2ZSBhbmQgdmFsaWRhdGUgYWxsIHNlY3JldHMgYmVmb3JlIGFueSBidWlsZCBvciByZW1vdGUgbXV0YXRpb24sIHNvIGEgbWlzc2luZ1xuICAgIC8vICAgIHNlY3JldCBhYm9ydHMgdGhlIGRlcGxveSBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBtaWdyYXRlZCBkYXRhYmFzZSBiZWhpbmQgYW4gb2xkIFdvcmtlci5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gUmVzdHJpY3QgdGhlIHNlY3JldHMgZG9tYWluIHRvIGtleXMgZGVmaW5lZCBpbiB0aGUgcHJvamVjdCdzIC5lbnYgZmlsZXM6IGBtaXNlIGVudmBcbiAgICAvLyBvdXRwdXQgKHJlcG9ydGVkIGFzIGEgcHNldWRvLXNvdXJjZSkgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyBzdWNoIGFzIENBUkdPX0hPTUUsXG4gICAgLy8gd2hpY2ggbXVzdCBuZXZlciBiZSB1cGxvYWRlZCBhcyBXb3JrZXIgc2VjcmV0cy5cbiAgICBjb25zdCBkb3RlbnZLZXlzID0gbmV3IFNldChcbiAgICAgIGVudlNvdXJjZXMuZmlsdGVyKChbc291cmNlXSkgPT4gIXNvdXJjZS5zdGFydHNXaXRoKCdtaXNlIGVudicpKS5mbGF0TWFwKChbLCBrZXlzXSkgPT4ga2V5cylcbiAgICApO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBpZiAoIWRvdGVudktleXMuaGFzKGtleSkpIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVpcmVkS2V5cyA9IHJlYWRFbnZFeGFtcGxlS2V5cyhwcm9qZWN0KTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZXF1aXJlZEtleXMpIHtcbiAgICAgIGVudlZhcnNba2V5XSA/Pz0gcHJvamVjdC5lbnZba2V5XSA/PyAnJztcbiAgICB9XG4gICAgLy8gTmFtZXMgZGVjbGFyZWQgdmlhIHdyYW5nbGVyIGBzZWNyZXRzLnJlcXVpcmVkYCBtYXkgbGlrZXdpc2UgYmUgc3VwcGxpZWQgcHVyZWx5IGFzXG4gICAgLy8gZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuIENJIHdvcmtmbG93IGVudikgaW5zdGVhZCBvZiBkb3RlbnYgdmFsdWVzLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMpIHtcbiAgICAgIGNvbnN0IGV4cG9ydGVkVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVudlZhcnNba2V5XSA9PT0gdW5kZWZpbmVkICYmIGV4cG9ydGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgZW52VmFyc1trZXldID0gZXhwb3J0ZWRWYWx1ZTtcbiAgICB9XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBkb3RlbnYgdmFsdWVzIChwcm9qZWN0LmVudiBhbHJlYWR5XG4gICAgLy8gYXBwbGllcyB0aGF0IHByZWNlZGVuY2UpLCBvciBgQVVUSF9TRUNSRVQ9Li4uIHdiIGRlcGxveWAgd291bGQgcHVzaCB0aGUgc3RhbGUgZmlsZSB2YWx1ZS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cbiAgICBjb25zdCB7IG1pc3NpbmdLZXlzLCBzZWNyZXRzIH0gPSBzZWxlY3RXb3JrZXJTZWNyZXRzKFxuICAgICAgZW52VmFycyxcbiAgICAgIFsuLi5yZXNvbHZlZENvbmZpZy52YXJLZXlzLCAuLi5yZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXNdLFxuICAgICAgcmVxdWlyZWRLZXlzXG4gICAgKTtcbiAgICAvLyBgLS12YXIgV0JfVkVSU0lPTjouLi5gIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBjb25maWd1cmF0aW9uIHZhbHVlcyBvbiBkZXBsb3ksIHNvIGFcbiAgICAvLyByZXNvdXJjZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSB3b3VsZCBzaWxlbnRseSBiZWNvbWUgYSBzdHJpbmcgdmFyaWFibGUuXG4gICAgaWYgKHByb2plY3QuZW52LldCX1ZFUlNJT04gJiYgcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKCdXQl9WRVJTSU9OJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdXQl9WRVJTSU9OIGNvbGxpZGVzIHdpdGggYSBXb3JrZXIgYmluZGluZyBuYW1lOyByZW5hbWUgdGhlIGJpbmRpbmcuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBiaW5kaW5nQ29sbGlzaW9ucyA9IE9iamVjdC5rZXlzKGVudlZhcnMpLmZpbHRlcigoa2V5KSA9PiByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgaWYgKGJpbmRpbmdDb2xsaXNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFVwbG9hZGluZyBhIHNlY3JldCBuYW1lZCBsaWtlIGEgYmluZGluZyB3b3VsZCByZXBsYWNlIHRoZSBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgZW52IGtleXMgdGhhdCBjb2xsaWRlIHdpdGggV29ya2VyIGJpbmRpbmcgbmFtZXM6ICR7YmluZGluZ0NvbGxpc2lvbnMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgTWlzc2luZyByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGZyb20gLmVudi5leGFtcGxlIG9yIHdyYW5nbGVyIHNlY3JldHMucmVxdWlyZWQpOiAke21pc3NpbmdLZXlzLmpvaW4oJywgJyl9YFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBXcmFuZ2xlciB2YWxpZGF0ZXMgYHNlY3JldHMucmVxdWlyZWRgIG9ubHkgZHVyaW5nIHRoZSByZWFsIHVwbG9hZCDigJQgYWZ0ZXIgbWlncmF0aW9ucyDigJRcbiAgICAvLyBzbyB3YiBjaGVja3MgdXBmcm9udDogZWFjaCByZXF1aXJlZCBuYW1lIG11c3QgYmUgYSBrZXkgaW4gdGhlIG91dGdvaW5nIHBheWxvYWQgKHByZXNlbmNlLFxuICAgIC8vIG5vdCB0cnV0aGluZXNzIOKAlCBhbiBleHBsaWNpdCBlbXB0eSBjbGVhcnMgYSBzdGFsZSB2YWx1ZSkgb3IgYW4gZWZmZWN0aXZlIHZhci9iaW5kaW5nLlxuICAgIGNvbnN0IHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcyA9IHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMuZmlsdGVyKFxuICAgICAgKG5hbWUpID0+XG4gICAgICAgICFPYmplY3QuaGFzT3duKHNlY3JldHMsIG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy52YXJLZXlzLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMobmFtZSlcbiAgICApO1xuICAgIGlmICh1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBTZWNyZXRzIHJlcXVpcmVkIGJ5IHRoZSB3cmFuZ2xlciBjb25maWcgYXJlIG5vdCBwcm92aWRlZDogJHt1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMuam9pbignLCAnKX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHNlY3JldEtleXMgPSBPYmplY3Qua2V5cyhzZWNyZXRzKS50b1NvcnRlZCgpO1xuICAgIC8vIENsb3VkZmxhcmUgbGltaXRzIGEgYnVsayB1cGxvYWQgdG8gMTAwIHNlY3JldHMsIGVhY2ggdmFyaWFibGUvc2VjcmV0IHZhbHVlIHRvIDUgS0IsIGFuZFxuICAgIC8vIHRoZSBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgY291bnQgdG8gMTI4ICg2NCBvbiB0aGUgRnJlZSBwbGFuLCB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWRcbiAgICAvLyBoZXJlIOKAlCBoZW5jZSBhIHdhcm5pbmcpLiBGYWlsaW5nIGJlZm9yZSBhbnkgYnVpbGQgb3IgbWlncmF0aW9uIGtlZXBzIGFuIG92ZXJzaXplZCBwYXlsb2FkXG4gICAgLy8gZnJvbSBhYm9ydGluZyB0aGUgZGVwbG95IGFmdGVyIHJlbW90ZSBtaWdyYXRpb25zIGFscmVhZHkgcmFuLlxuICAgIGlmIChzZWNyZXRLZXlzLmxlbmd0aCA+IDEwMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBDbG91ZGZsYXJlIGFjY2VwdHMgYXQgbW9zdCAxMDAgc2VjcmV0cyBwZXIgZGVwbG95LCBidXQgJHtzZWNyZXRLZXlzLmxlbmd0aH0gd2VyZSBzZWxlY3RlZC5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gVGhlIENMSS1wcm92aWRlZCBXQl9WRVJTSU9OIG92ZXJsYXlzIGEgY29uZmlndXJlZCB2YXIgb2YgdGhlIHNhbWUgbmFtZSBvbiBkZXBsb3ksXG4gICAgLy8gc28gb25seSB0aGUgZWZmZWN0aXZlIHZhbHVlIHBhcnRpY2lwYXRlcyBpbiB0aGUgbGltaXQgY2hlY2tzLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVZhcnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzPHVua25vd24+KHJlc29sdmVkQ29uZmlnLnZhcnMpKTtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikgZWZmZWN0aXZlVmFycy5zZXQoJ1dCX1ZFUlNJT04nLCBwcm9qZWN0LmVudi5XQl9WRVJTSU9OKTtcbiAgICBjb25zdCB2YXJFbnRyaWVzID0gWy4uLmVmZmVjdGl2ZVZhcnNdO1xuICAgIGNvbnN0IG92ZXJzaXplZEtleXMgPSBbXG4gICAgICAuLi5zZWNyZXRLZXlzLmZpbHRlcigoa2V5KSA9PiBCdWZmZXIuYnl0ZUxlbmd0aChzZWNyZXRzW2tleV0gPz8gJycsICd1dGY4JykgPiA1ICogMTAyNCksXG4gICAgICAuLi52YXJFbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFssIHZhbHVlXSkgPT4gQnVmZmVyLmJ5dGVMZW5ndGgodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpLCAndXRmOCcpID4gNSAqIDEwMjRcbiAgICAgICAgKVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICBdO1xuICAgIGlmIChvdmVyc2l6ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBWYXJpYWJsZSBvciBzZWNyZXQgdmFsdWVzIGV4Y2VlZCBDbG91ZGZsYXJlJ3MgNSBLQiBsaW1pdDogJHtvdmVyc2l6ZWRLZXlzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlOiByZW1vdGUgc2VjcmV0cyBhYnNlbnQgZnJvbSB0aGUgcGF5bG9hZCBzdGF5IGF0dGFjaGVkIHRvIHRoZVxuICAgIC8vIG5ldyB2ZXJzaW9uLCBzbyB0aGV5IGNvdW50IGFnYWluc3QgdGhlIGNvbWJpbmVkIGxpbWl0IHRvby4gTGlzdGluZyB0aGVtIG5lZWRzIGFuXG4gICAgLy8gYXV0aGVudGljYXRlZCByZW1vdGUgcm91bmQtdHJpcCwgd2hpY2ggZHJ5IHJ1bnMgc2tpcDsgd2hlbiB0aGUgbGlzdGluZyBmYWlscyBmb3IgYW55XG4gICAgLy8gcmVhc29uIG90aGVyIHRoYW4gYSBub3QteWV0LWNyZWF0ZWQgV29ya2VyLCBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGNvdW50IGluc3RlYWQgb2ZcbiAgICAvLyBibG9ja2luZyBhIGRlcGxveSB0aGF0IHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuXG4gICAgY29uc3QgcmVtb3RlU2VjcmV0TmFtZXMgPSBhcmd2LmRyeVJ1blxuICAgICAgPyBbXVxuICAgICAgOiBhd2FpdCBsaXN0UmVtb3RlV29ya2VyU2VjcmV0TmFtZXMocHJvamVjdCwgYXJndiwgd3JhbmdsZXJDb25maWdQYXRoLCByZXNvbHZlZENvbmZpZywgZW52TmFtZSk7XG4gICAgY29uc3QgaW5oZXJpdGVkU2VjcmV0TmFtZXMgPSBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgICAgIHJlbW90ZVNlY3JldE5hbWVzID8/IFtdLFxuICAgICAgc2VjcmV0cyxcbiAgICAgIHZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICAgIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc1xuICAgICk7XG4gICAgY29uc3QgY29tYmluZWRDb3VudCA9XG4gICAgICBuZXcgU2V0KFsuLi5zZWNyZXRLZXlzLCAuLi52YXJFbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSldKS5zaXplICsgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoO1xuICAgIGNvbnN0IGluaGVyaXRlZE5vdGUgPVxuICAgICAgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgKGluY2x1ZGluZyAke2luaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aH0gcmVtb3RlIHNlY3JldHMga2VwdCBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uOiAke2luaGVyaXRlZFNlY3JldE5hbWVzLmpvaW4oJywgJyl9KWBcbiAgICAgICAgOiAnJztcbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDEyOCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBDbG91ZGZsYXJlIGFsbG93cyBhdCBtb3N0IDEyOCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgY29tYmluZWQsIGJ1dCAke2NvbWJpbmVkQ291bnR9IHdlcmUgc2VsZWN0ZWQke2luaGVyaXRlZE5vdGV9LmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiA2NCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYCR7Y29tYmluZWRDb3VudH0gdmFyaWFibGVzIGFuZCBzZWNyZXRzJHtpbmhlcml0ZWROb3RlfSBleGNlZWQgdGhlIEZyZWUgcGxhbidzIGxpbWl0IG9mIDY0LmApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5jeWFuKFxuICAgICAgICBgRGVwbG95aW5nICR7cmVzb2x2ZWRDb25maWcud29ya2VyTmFtZSA/PyBwcm9qZWN0Lm5hbWV9ICgke2Vudk5hbWV9KSB3aXRoICR7c2VjcmV0S2V5cy5sZW5ndGh9IHNlY3JldHM6ICR7c2VjcmV0S2V5cy5qb2luKCcsICcpfWBcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gMi4gQnVpbGQgKHZpbmV4dCBlbWJlZHMgdGhlIGVudmlyb25tZW50LWFwcGxpZWQgd3JhbmdsZXIgY29uZmlnIGludG8gZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbikuXG4gICAgLy8gICAgQnVpbGRpbmcgYmVmb3JlIG1pZ3JhdGluZyBrZWVwcyBhIGJ1aWxkIGZhaWx1cmUgZnJvbSBsZWF2aW5nIGEgbWlncmF0ZWQgc2NoZW1hIGJlaGluZFxuICAgIC8vICAgIHRoZSBvbGQgV29ya2VyLiBQbGFpbiBXb3JrZXJzIGhhdmUgbm8gYnVpbGQgc3RlcDsgd3JhbmdsZXIgYnVuZGxlcyB0aGUgZW50cnkgaXRzZWxmLlxuICAgIGNvbnN0IGlzVmluZXh0ID0gISEocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpbmV4dCA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udmluZXh0KTtcbiAgICBjb25zdCBkZXBsb3lDb25maWdQYXRoID0gaXNWaW5leHQgPyBwYXRoLmpvaW4oJ2Rpc3QnLCAnc2VydmVyJywgJ3dyYW5nbGVyLmpzb24nKSA6IHdyYW5nbGVyQ29uZmlnUGF0aDtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52QXNzaWdubWVudCA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uXG4gICAgICA/IGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ0NMT1VERkxBUkVfRU5WJywgZW52TmFtZSl9IGBcbiAgICAgIDogJyc7XG4gICAgaWYgKGlzVmluZXh0KSB7XG4gICAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikge1xuICAgICAgICBwcm9qZWN0LmVudi5ORVhUX1BVQkxJQ19XQl9WRVJTSU9OIHx8PSBwcm9qZWN0LmVudi5XQl9WRVJTSU9OO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZ2VuLWNvZGUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtjbG91ZGZsYXJlRW52QXNzaWdubWVudH1ZQVJOIHZpbmV4dCBidWlsZGAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgLy8gT24gZHJ5IHJ1bnMgdGhlIHZpbmV4dCBidWlsZCBhYm92ZSBpcyBhIHByaW50ZWQgbm8tb3AsIHNvIHRoZSBidWlsdCBjb25maWcgaXNcbiAgICAgIC8vIGxlZ2l0aW1hdGVseSBhYnNlbnQgYW5kIG11c3Qgbm90IGFib3J0IHRoZSBydW4uXG4gICAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRlcGxveUNvbmZpZ1BhdGgpKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgJHtkZXBsb3lDb25maWdQYXRofSBub3QgZm91bmQ7IHRoZSB2aW5leHQgYnVpbGQgZGlkIG5vdCBwcm9kdWNlIGEgZGVwbG95IGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIFdyYW5nbGVyIHZhbGlkYXRlcyBpdHMgY29uZmlnIHNjaGVtYSBvbmx5IHdoZW4gaXQgcnVucywgc28gYSBkcnkgcnVuIG9mIHRoZSBidWlsdFxuICAgICAgLy8gY29uZmlnIHN1cmZhY2VzIGNvbmZpZyBhbmQgYnVuZGxlIGVycm9ycyBCRUZPUkUgdGhlIHJlbW90ZSBtaWdyYXRpb25zIGJlbG93IG11dGF0ZVxuICAgICAgLy8gdGhlIGRhdGFiYXNlLCBtaXJyb3JpbmcgdGhlIHBsYWluLVdvcmtlciBkcnkgcnVuLiBObyAtLWVudjogdGhlIGJ1aWx0IGNvbmZpZyBhbHJlYWR5XG4gICAgICAvLyBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRlcGxveUNvbmZpZ1BhdGgpfWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBsYWluIFdvcmtlcnMgYXJlIGZpcnN0IGNvbXBpbGVkIGJ5IHdyYW5nbGVyIGR1cmluZyB0aGUgZGVwbG95IGl0c2VsZjsgYSBkcnkgcnVuXG4gICAgICAvLyBzdXJmYWNlcyBjb21waWxlIGVycm9ycyAoZS5nLiBhIG1pc3NpbmcgZW50cnkgcG9pbnQpIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnNcbiAgICAgIC8vIGJlbG93IG11dGF0ZSB0aGUgZGF0YWJhc2UuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IGAgLS1lbnYgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGVudk5hbWUpfWAgOiAnJ31gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIEFwcGx5IEQxIG1pZ3JhdGlvbnMgdG8gdGhlIHJlbW90ZSBkYXRhYmFzZSB3aXRoIHRoZSBwcm9qZWN0J3Mgc2luZ2xlIG1pZ3JhdGlvblxuICAgIC8vICAgIG1lY2hhbmlzbSAod3JhbmdsZXItbmF0aXZlIHdoZW4gYSBtaWdyYXRpb25zIGRpcmVjdG9yeSBleGlzdHMsIGVsc2UgZHJpenpsZS1raXQgZm9yXG4gICAgLy8gICAgZHJpenpsZS1vcm0gYXBwcykuIE1pZ3JhdGlvbnMgbXVzdCBiZSBiYWNrd2FyZCBjb21wYXRpYmxlOiB0aGUgb2xkIFdvcmtlciBzZXJ2ZXNcbiAgICAvLyAgICB0cmFmZmljIHVudGlsIHRoZSBkZXBsb3kgYmVsb3cuXG4gICAgY29uc3QgZW52T3B0aW9uID0gcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBgIC0tZW52ICR7c2hlbGxFc2NhcGVBcmd1bWVudChlbnZOYW1lKX1gIDogJyc7XG4gICAgZm9yIChjb25zdCBkYXRhYmFzZSBvZiB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKSB7XG4gICAgICBjb25zdCBkYXRhYmFzZU5hbWUgPSBkYXRhYmFzZS5kYXRhYmFzZV9uYW1lID8/IGRhdGFiYXNlLmJpbmRpbmc7XG4gICAgICBpZiAoIWRhdGFiYXNlTmFtZSkgY29udGludWU7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBDST10cnVlIFlBUk4gd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseSAke3NoZWxsRXNjYXBlQXJndW1lbnQoZGF0YWJhc2VOYW1lKX0gLS1yZW1vdGUgLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtlbnZPcHRpb259YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRyaXp6bGVEMURhdGFiYXNlKSB7XG4gICAgICBpZiAoIWRyaXp6bGVEMURhdGFiYXNlLmRhdGFiYXNlX2lkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBUaGUgJHtlbnZOYW1lfSBEMSBiaW5kaW5nIGhhcyBubyBkYXRhYmFzZV9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFhY2NvdW50SWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAnQ0xPVURGTEFSRV9BQ0NPVU5UX0lEIChvciBhY2NvdW50X2lkIGluIHRoZSB3cmFuZ2xlciBjb25maWcpIGlzIHJlcXVpcmVkIGZvciByZW1vdGUgZHJpenpsZS1raXQgbWlncmF0aW9ucy4nXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAnbWlncmF0ZScsXG4gICAgICAgICAgYENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ9JHtkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZH0gQ0xPVURGTEFSRV9BQ0NPVU5UX0lEPSR7YWNjb3VudElkfWBcbiAgICAgICAgKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA0LiBEZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5IChubyBwb3N0LWRlcGxveSBzZWNyZXQgcHVzaCB0aGF0IGNvdWxkIGxlYXZlIHRoZVxuICAgIC8vICAgIG5ldyB2ZXJzaW9uIHJ1bm5pbmcgd2l0aG91dCDigJQgb3Igd2l0aCBzdGFsZSDigJQgc2VjcmV0cykuIFRoZSBzZWNyZXRzIEpTT04gZ29lcyB0aHJvdWdoXG4gICAgLy8gICAgYSBtb2RlLTA2MDAgZmlsZSBpbiBhIHByaXZhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBkZWxldGVkIHJpZ2h0IGFmdGVyIHRoZSBkZXBsb3k6XG4gICAgLy8gICAgL2Rldi9zdGRpbiBpcyBOT1QgcmVsaWFibGUgaGVyZSBiZWNhdXNlIHdyYW5nbGVyIHJlYWRzIHRoZSBzZWNyZXRzIGZpbGUgb25seSBhZnRlclxuICAgIC8vICAgIHVwbG9hZGluZyBhc3NldHMsIGJ5IHdoaWNoIHBvaW50IHRoZSBwaXBlZCBzdGRpbiBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gY29uc3VtZWQg4oCUXG4gICAgLy8gICAgb2JzZXJ2ZWQgYXMgYSBmbGFreSBgQ291bGQgbm90IHJlYWQgZmlsZTogL2Rldi9zdGRpbmAgb24gQ0kuIEV4cGxpY2l0bHkgZW1wdHkgdmFsdWVzXG4gICAgLy8gICAgc3RheSBpbiB0aGUgcGF5bG9hZDogLS1zZWNyZXRzLWZpbGUgaXMgYWRkaXRpdmUsIHNvIHB1c2hpbmcgJycgaXMgdGhlIG9ubHkgd2F5IHRvXG4gICAgLy8gICAgY2xlYXIgYSBzdGFsZSBzZWNyZXQuXG4gICAgY29uc3QgZGVwbG95QXJncyA9IFtcbiAgICAgICdkZXBsb3knLFxuICAgICAgJy0tY29uZmlnJyxcbiAgICAgIGRlcGxveUNvbmZpZ1BhdGgsXG4gICAgICAvLyB2aW5leHQncyBidWlsdCBjb25maWcgYWxyZWFkeSBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQ7IHBhc3NpbmcgLS1lbnYgdGhlcmUgd291bGRcbiAgICAgIC8vIGFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXggdHdpY2UuXG4gICAgICAuLi4oIWlzVmluZXh0ICYmIHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gWyctLWVudicsIGVudk5hbWVdIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuZW52LldCX1ZFUlNJT04gPyBbJy0tdmFyJywgYFdCX1ZFUlNJT046JHtwcm9qZWN0LmVudi5XQl9WRVJTSU9OfWBdIDogW10pLFxuICAgICAgJy0tc2VjcmV0cy1maWxlJyxcbiAgICBdO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2RlcGxveUFyZ3Muam9pbignICcpfSA8dGVtcG9yYXJ5IHNlY3JldHMgZmlsZT5gKSk7XG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgLy8gUmVhZGluZyBiaW5FeGlzdHMgcHJlcGVuZHMgbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8gcHJvamVjdC5lbnYuUEFUSCxcbiAgICAgIC8vIHNvIHRoZSBkaXJlY3QgKG5vbi1zaGVsbCkgd3JhbmdsZXIgc3Bhd24gYmVsb3cgcmVzb2x2ZXMgdGhlIGxvY2FsIGJpbmFyeS5cbiAgICAgIGlmICghcHJvamVjdC5iaW5FeGlzdHMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnbm9kZV9tb2R1bGVzLy5iaW4gbm90IGZvdW5kOyByZWx5aW5nIG9uIFBBVEggdG8gcmVzb2x2ZSB3cmFuZ2xlci4nKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXBsb3lFbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gICAgICBkZWxldGUgZGVwbG95RW52LkNMT1VERkxBUkVfRU5WO1xuICAgICAgLy8gMG83MDAgZGlyZWN0b3J5ICsgMG82MDAgZmlsZTogcmVhZGFibGUgb25seSBieSB0aGUgZGVwbG95aW5nIHVzZXIsIGxpa2UgdGhlIGRvdGVudlxuICAgICAgLy8gZmlsZXMgdGhlIENJIHdvcmtmbG93IGFscmVhZHkgd3JpdGVzIG5leHQgdG8gaXQuIHdyYW5nbGVyIHJ1bnMgdGhyb3VnaCBhbiBhc3luYyBzcGF3blxuICAgICAgLy8gKHNwYXduU3luYyB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCwgc28gYSBzaHV0ZG93biBzaWduYWwgd291bGQga2lsbCB0aGUgcHJvY2Vzc1xuICAgICAgLy8gYmVmb3JlIGFueSBjbGVhbnVwKSBhbmQgdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIGluIGEgZmluYWxseSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgICAgIC8vIGRlcGxveSBjYW5ub3QgbGVhdmUgdGhlIHBsYWludGV4dCBzZWNyZXRzIGJlaGluZC4gU2h1dGRvd24gaGFuZGxpbmcgZGV0YWlsczpcbiAgICAgIC8vIC0gSGFuZGxlcnMgKGluY2x1ZGluZyBTSUdIVVAsIG9uIHdoaWNoIE5vZGUgYWxzbyB0ZXJtaW5hdGVzIGJ5IGRlZmF1bHQpIGFyZSBpbnN0YWxsZWRcbiAgICAgIC8vICAgQkVGT1JFIHRoZSBmaWxlIGlzIHdyaXR0ZW4gYW5kIHVzZSBwcm9jZXNzLm9uLCBub3Qgb25jZSwgc28gYSByZXBlYXRlZCBzaWduYWwgY2Fubm90XG4gICAgICAvLyAgIGZhbGwgYmFjayB0byBkZWZhdWx0IHRlcm1pbmF0aW9uIGFuZCBieXBhc3MgdGhlIGZpbmFsbHkgY2xlYW51cC5cbiAgICAgIC8vIC0gU0lHSFVQL1NJR1FVSVQgYXJlIGZvcndhcmRlZCB0byB3cmFuZ2xlciBhcyBTSUdURVJNOiB3cmFuZ2xlcidzIGxhdW5jaGVyIHJlbGF5cyBvbmx5XG4gICAgICAvLyAgIFNJR0lOVC9TSUdURVJNIHRvIGl0cyBpbm5lciBOb2RlIHByb2Nlc3MsIGFuZCBhbnl0aGluZyBlbHNlIHdvdWxkIG9ycGhhbiBhIGRlcGxveW1lbnRcbiAgICAgIC8vICAgdGhhdCBrZWVwcyBtdXRhdGluZyB0aGUgcmVtb3RlIFdvcmtlciBhZnRlciB3YiBleGl0cy5cbiAgICAgIC8vIC0gVGhlIHJlLXJhaXNlIGJlbG93IHVzZXMgdGhlIHNpZ25hbCB3YiBpdHNlbGYgcmVjZWl2ZWQ6IHdyYW5nbGVyIGNhdGNoZXMgU0lHSU5UIGFuZFxuICAgICAgLy8gICBleGl0cyBudW1lcmljYWxseSAoZS5nLiAxNDMpLCB3aGljaCBtdXN0IG5vdCBtYXNxdWVyYWRlIGFzIGFuIG9yZGluYXJ5IGZhaWx1cmUuXG4gICAgICBjb25zdCBzZWNyZXRzRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLWRlcGxveS0nKSk7XG4gICAgICBjb25zdCBzaHV0ZG93blNpZ25hbHMgPSBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBsZXQgd3JhbmdsZXJQcm9jZXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWNlaXZlZFNodXRkb3duU2lnbmFsID8/PSBzaWduYWw7XG4gICAgICAgICAgaWYgKHdyYW5nbGVyUHJvY2Vzcykge1xuICAgICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLmtpbGwoc2lnbmFsID09PSAnU0lHSU5UJyB8fCBzaWduYWwgPT09ICdTSUdURVJNJyA/IHNpZ25hbCA6ICdTSUdURVJNJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIFdpdGggdGhlIGhhbmRsZXJzIHJlbW92ZWQsIHJlLXJhaXNpbmcgdHJpZ2dlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbGV0IGRlcGxveVN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VjcmV0c0ZpbGVQYXRoID0gcGF0aC5qb2luKHNlY3JldHNEaXJQYXRoLCAnc2VjcmV0cy5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2VjcmV0c0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZWNyZXRzKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICAgICAgZGVwbG95U3RhdHVzID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2VzcyA9IHNwYXduKCd3cmFuZ2xlcicsIFsuLi5kZXBsb3lBcmdzLCBzZWNyZXRzRmlsZVBhdGhdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGVudjogZGVwbG95RW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHNpZ25hbCA/IDEgOiAoY29kZSA/PyB1bmRlZmluZWQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBwcm9jZXNzLmV4aXQgc2tpcHMgZmluYWxseSBibG9ja3MsIHNvIHRoZSBleGl0LW9uLWZhaWx1cmUgYmVsb3cgc3RheXMgb3V0c2lkZS5cbiAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2VpdmVkU2h1dGRvd25TaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2Ugc28gdGhlIGNhbGxlciBvYnNlcnZlcyB0aGUgc2FtZSBzaWduYWwtZGVyaXZlZCBleGl0IHN0YXR1cy5cbiAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNodXRkb3duU2lnbmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRlcGxveVN0YXR1cyAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgd3JhbmdsZXIgZGVwbG95IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2RlcGxveVN0YXR1cyA/PyAndW5rbm93bid9LmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGRlcGxveVN0YXR1cyA/PyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LiBPcHRpb25hbCBwb3N0LWRlcGxveSBob29rIChlLmcuIHNlZWRpbmcgdGhlIHJlbW90ZSBEMSB2aWEgZHJpenpsZSdzIGQxLWh0dHAgZHJpdmVyKS5cbiAgICAvLyAgICBBc3NpZ24gdGhlIHJlc29sdmVkIGlkcyB1bmNvbmRpdGlvbmFsbHk6IGEgc3RhbGUgZXhwb3J0ZWQgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRFxuICAgIC8vICAgIG11c3Qgbm90IHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvcG9zdCddKSB7XG4gICAgICAvLyBUaGUgaWQgaXMgdW5hbWJpZ3VvdXMgb25seSB3aXRoIGEgc2luZ2xlIEQxIGJpbmRpbmc7IHdpdGggbXVsdGlwbGUsIHRoZSBob29rIG11c3RcbiAgICAgIC8vIHJlc29sdmUgaXRzIHRhcmdldCBpdHNlbGYuIENsZWFyIGZpcnN0IGVpdGhlciB3YXk6IGEgc3RhbGUgaW5oZXJpdGVkIGlkIG11c3Qgbm90XG4gICAgICAvLyByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgICAgY29uc3QgaG9va0QxRGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ7XG4gICAgICBpZiAocmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdNdWx0aXBsZSBEMSBiaW5kaW5ncyBleGlzdDsgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCBpcyBub3Qgc2V0IGZvciBkZXBsb3kvcG9zdC4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoaG9va0QxRGF0YWJhc2U/LmRhdGFiYXNlX2lkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEID0gaG9va0QxRGF0YWJhc2UuZGF0YWJhc2VfaWQ7XG4gICAgICBpZiAoYWNjb3VudElkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQgPSBhY2NvdW50SWQ7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9wb3N0JywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNlY3JldHMgdG8gcHVzaCB0byB0aGUgV29ya2VyIGZyb20gdGhlIGRvdGVudi1sb2FkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogZXZlcnkgZXhwbGljaXRseSBzZXQgdmFsdWUg4oCUIGluY2x1ZGluZyBlbXB0eSBzdHJpbmdzLCB3aGljaCBjbGVhciBzdGFsZSByZW1vdGUgc2VjcmV0c1xuICogc2luY2UgYHdyYW5nbGVyIGRlcGxveSAtLXNlY3JldHMtZmlsZWAgaXMgYWRkaXRpdmUg4oCUIGV4Y2VwdCB3cmFuZ2xlciBgdmFyc2AgKGEgc2VjcmV0IG1heVxuICogbm90IHNoYXJlIGEgbmFtZSB3aXRoIGEgdmFyKSwgZGVwbG95LWNvbnRyb2wga2V5cywgYW5kIGxvY2FsIGBmaWxlOmAgREFUQUJBU0VfVVJMcy5cbiAqIFJldHVybnMgdGhlIHJlcXVpcmVkIGtleXMgKGZyb20gLmVudi5leGFtcGxlKSB0aGF0IGFyZSBzdGlsbCBlbXB0eSBzbyB0aGUgZGVwbG95IGNhblxuICogYWJvcnQgYmVmb3JlIGFueSByZW1vdGUgbXV0YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RXb3JrZXJTZWNyZXRzKFxuICBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBjb25maWdWYXJLZXlzOiBzdHJpbmdbXSxcbiAgcmVxdWlyZWRLZXlzOiBzdHJpbmdbXVxuKTogeyBtaXNzaW5nS2V5czogc3RyaW5nW107IHNlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSB7XG4gIGNvbnN0IGNvbmZpZ0tleXMgPSBuZXcgU2V0KGNvbmZpZ1ZhcktleXMpO1xuICBjb25zdCBzZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgY29uZmlnS2V5cy5oYXMoa2V5KSB8fCBpc05vblNlY3JldEtleShrZXkpKSBjb250aW51ZTtcbiAgICBpZiAoa2V5ID09PSAnREFUQUJBU0VfVVJMJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdmaWxlOicpKSBjb250aW51ZTtcbiAgICBzZWNyZXRzW2tleV0gPSB2YWx1ZTtcbiAgfVxuICBjb25zdCBtaXNzaW5nS2V5cyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoKGtleSkgPT4gIWNvbmZpZ0tleXMuaGFzKGtleSkgJiYgIWlzTm9uU2VjcmV0S2V5KGtleSkgJiYgIWVudlZhcnNba2V5XSk7XG4gIHJldHVybiB7IG1pc3NpbmdLZXlzLCBzZWNyZXRzIH07XG59XG5cbi8qKlxuICogTGlzdCB0aGUgc2VjcmV0IG5hbWVzIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgZGVwbG95IHRhcmdldCBXb3JrZXIuIFJldHVybnMgdW5kZWZpbmVkIHdoZW5cbiAqIHRoZSBsaXN0aW5nIGZhaWxzIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gdGhlIFdvcmtlciBub3QgZXhpc3RpbmcgeWV0IChmaXJzdCBkZXBsb3kpLCBzb1xuICogdGhlIGNhbGxlciBjYW4gZGVncmFkZSB0byB0aGUgbG9jYWwtb25seSBsaW1pdCBjaGVja3MgaW5zdGVhZCBvZiBibG9ja2luZyBhIGRlcGxveSB0aGF0XG4gKiB3cmFuZ2xlciBpdHNlbGYgbWlnaHQgYWNjZXB0LiBGYWlsaW5nIGNsb3NlZCBpbnN0ZWFkIHdvdWxkIHR1cm4gZXZlcnkgdHJhbnNpZW50IGxpc3RpbmdcbiAqIGZhaWx1cmUgKG5ldHdvcmssIGEgdG9rZW4gd2l0aG91dCBzZWNyZXQtcmVhZCBwZXJtaXNzaW9uKSBpbnRvIGEgZGVwbG95IGJsb2NrZXIsIGFuZCDigJQgc2luY2VcbiAqIHdyYW5nbGVyIDQueCByZXBvcnRzIGEgbWlzc2luZyBXb3JrZXIgb25seSB2aWEgYW4gZXJyb3ItbWVzc2FnZSBoaW50IOKAlCBhbnkgdW5yZWNvZ25pemVkXG4gKiBub3QtZm91bmQgc2hhcGUgd291bGQgdGhlbiBibG9jayBmaXJzdCBkZXBsb3lzIGVudGlyZWx5OyB0aGlzIHByZWZsaWdodCBtdXN0IG9ubHkgZXZlciBhZGRcbiAqIGZhaWx1cmVzIHRoYXQgd3JhbmdsZXIgaXRzZWxmIHdvdWxkIHJhaXNlIGFmdGVyIHRoZSBtaWdyYXRpb25zLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0UmVtb3RlV29ya2VyU2VjcmV0TmFtZXMoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IERlcGxveUNvbW1hbmRBcmd2LFxuICB3cmFuZ2xlckNvbmZpZ1BhdGg6IHN0cmluZyxcbiAgcmVzb2x2ZWRDb25maWc6IFJlc29sdmVkV3JhbmdsZXJDb25maWcsXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD4ge1xuICAvLyBSZWFkaW5nIGJpbkV4aXN0cyBwcmVwZW5kcyBub2RlX21vZHVsZXMvLmJpbiBkaXJlY3RvcmllcyB0byBwcm9qZWN0LmVudi5QQVRILFxuICAvLyBzbyB0aGUgZGlyZWN0IChub24tc2hlbGwpIHdyYW5nbGVyIHNwYXduIGJlbG93IHJlc29sdmVzIHRoZSBsb2NhbCBiaW5hcnkuXG4gIGlmICghcHJvamVjdC5iaW5FeGlzdHMpIHtcbiAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdub2RlX21vZHVsZXMvLmJpbiBub3QgZm91bmQ7IHJlbHlpbmcgb24gUEFUSCB0byByZXNvbHZlIHdyYW5nbGVyLicpKTtcbiAgfVxuICBjb25zdCBsaXN0QXJncyA9IFtcbiAgICAnc2VjcmV0JyxcbiAgICAnbGlzdCcsXG4gICAgJy0tZm9ybWF0JyxcbiAgICAnanNvbicsXG4gICAgJy0tY29uZmlnJyxcbiAgICB3cmFuZ2xlckNvbmZpZ1BhdGgsXG4gICAgLi4uKHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gWyctLWVudicsIGVudk5hbWVdIDogW10pLFxuICBdO1xuICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogd3JhbmdsZXIgJHtsaXN0QXJncy5qb2luKCcgJyl9YCkpO1xuICBsZXQgcmV0O1xuICB0cnkge1xuICAgIHJldCA9IGF3YWl0IHNwYXduQXN5bmMoJ3dyYW5nbGVyJywgbGlzdEFyZ3MsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudiBhcyBOb2RlSlMuUHJvY2Vzc0VudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgYEZhaWxlZCB0byBydW4gd3JhbmdsZXIgdG8gbGlzdCByZW1vdGUgc2VjcmV0czsgY2hlY2tpbmcgb25seSB0aGUgbG9jYWwgcGF5bG9hZCBhZ2FpbnN0IENsb3VkZmxhcmUncyBsaW1pdHMuXFxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAocmV0LnN0YXR1cyA9PT0gMCkge1xuICAgIC8vIEN1dCB0aGUgSlNPTiBhcnJheSBvdXQgb2YgdGhlIHN1cnJvdW5kaW5nIG91dHB1dDogd3JhbmdsZXIgbWF5IHByaW50IGl0cyBiYW5uZXIgYW5kXG4gICAgLy8gXCJNdWx0aXBsZSBlbnZpcm9ubWVudHNcIiB3YXJuaW5ncyBhcm91bmQgdGhlIHBheWxvYWQuXG4gICAgY29uc3QganNvblN0YXJ0ID0gcmV0LnN0ZG91dC5pbmRleE9mKCdbJyk7XG4gICAgY29uc3QganNvbkVuZCA9IHJldC5zdGRvdXQubGFzdEluZGV4T2YoJ10nKTtcbiAgICBpZiAoanNvblN0YXJ0ICE9PSAtMSAmJiBqc29uRW5kICE9PSAtMSAmJiBqc29uU3RhcnQgPCBqc29uRW5kKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJldC5zdGRvdXQuc2xpY2UoanNvblN0YXJ0LCBqc29uRW5kICsgMSkpIGFzIHsgbmFtZT86IHVua25vd24gfVtdO1xuICAgICAgICByZXR1cm4gcGFyc2VkLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLmZpbHRlcigobmFtZSk6IG5hbWUgaXMgc3RyaW5nID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHRoZSB3YXJuaW5nIGJlbG93LlxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICgvXFxbY29kZTogMTAwKDA3fDkwKVxcXXxJZiB0aGlzIGlzIGEgbmV3IFdvcmtlci8udGVzdChyZXQuc3Rkb3V0ICsgcmV0LnN0ZGVycikpIHtcbiAgICAvLyBUaGUgV29ya2VyIGRvZXMgbm90IGV4aXN0IHlldCwgc28gYSBmaXJzdCBkZXBsb3kgaW5oZXJpdHMgbm90aGluZy4gV3JhbmdsZXIgNC54IGNhdGNoZXNcbiAgICAvLyB0aGUgQ2xvdWRmbGFyZSBBUEkgZXJyb3JzIDEwMDA3ICh3b3JrZXJzLmFwaS5lcnJvci5zZXJ2aWNlX25vdF9mb3VuZCkgYW5kIDEwMDkwXG4gICAgLy8gKHdvcmtlcnMuYXBpLmVycm9yLnNjcmlwdF9ub3RfZm91bmQpIGFuZCByZXRocm93cyB0aGVtIGFzIGEgVXNlckVycm9yIGNvbnRhaW5pbmcgdGhlXG4gICAgLy8gJ0lmIHRoaXMgaXMgYSBuZXcgV29ya2VyLCBydW4gYHdyYW5nbGVyIGRlcGxveWAgZmlyc3QnIGhpbnQgd2l0aG91dCB0aGUgbnVtZXJpYyBjb2RlLFxuICAgIC8vIHNvIG1hdGNoIGJvdGggc2hhcGVzLlxuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgY2hhbGsueWVsbG93KFxuICAgICAgYEZhaWxlZCB0byBsaXN0IHRoZSByZW1vdGUgV29ya2VyIHNlY3JldHM7IGNoZWNraW5nIG9ubHkgdGhlIGxvY2FsIHBheWxvYWQgYWdhaW5zdCBDbG91ZGZsYXJlJ3MgbGltaXRzLlxcbiR7KHJldC5zdGRlcnIgfHwgcmV0LnN0ZG91dCkudHJpbSgpfWBcbiAgICApXG4gICk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVtb3RlIHNlY3JldHMgdGhhdCBzdGF5IGF0dGFjaGVkIHRvIHRoZSBuZXcgdmVyc2lvbjogYHdyYW5nbGVyIGRlcGxveSAtLXNlY3JldHMtZmlsZWAgaXNcbiAqIGFkZGl0aXZlLCBzbyBldmVyeSByZW1vdGUgc2VjcmV0IHRoZSBvdXRnb2luZyBwYXlsb2FkIGRvZXMgbm90IG92ZXJ3cml0ZSBrZWVwcyBjb3VudGluZ1xuICogYWdhaW5zdCBDbG91ZGZsYXJlJ3MgY29tYmluZWQgdmFyaWFibGUrc2VjcmV0IGxpbWl0IOKAlCBleGNlcHQgbmFtZXMgdGhhdCBhbiBlZmZlY3RpdmUgdmFyIG9yXG4gKiBiaW5kaW5nIHJlcGxhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0SW5oZXJpdGVkUmVtb3RlU2VjcmV0TmFtZXMoXG4gIHJlbW90ZVNlY3JldE5hbWVzOiBzdHJpbmdbXSxcbiAgb3V0Z29pbmdTZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBlZmZlY3RpdmVWYXJLZXlzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYmluZGluZ05hbWVzOiByZWFkb25seSBzdHJpbmdbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCByZXBsYWNlZE5hbWVzID0gbmV3IFNldChbLi4uZWZmZWN0aXZlVmFyS2V5cywgLi4uYmluZGluZ05hbWVzXSk7XG4gIHJldHVybiByZW1vdGVTZWNyZXROYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFPYmplY3QuaGFzT3duKG91dGdvaW5nU2VjcmV0cywgbmFtZSkgJiYgIXJlcGxhY2VkTmFtZXMuaGFzKG5hbWUpKTtcbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHsgZXhwYW5kIH0gZnJvbSAnZG90ZW52LWV4cGFuZCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFBhcnNlZERvdGVudkFyZ3Mge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbn1cblxuY29uc3Qgc2h1dGRvd25TaWduYWxzID0gbmV3IFNldDxOb2RlSlMuU2lnbmFscz4oWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pO1xuXG5leHBvcnQgY29uc3QgZG90ZW52Q29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ2RvdGVudiBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnTG9hZCAuZW52IGZpbGVzIGFuZCBydW4gYSBjb21tYW5kLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT4geWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgcnVuUGFyc2VkRG90ZW52Q29tbWFuZChnZXRQYXJzZWREb3RlbnZBcmdzRnJvbVlhcmdzKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Eb3RlbnZDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1blBhcnNlZERvdGVudkNvbW1hbmQocGFyc2VEb3RlbnZBcmdzKGFyZ3MpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFyc2VkRG90ZW52Q29tbWFuZCh7IGNvbW1hbmQgfTogUGFyc2VkRG90ZW52QXJncyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY29tbWFuZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdVc2FnZTogd2IgZG90ZW52IC0tIDxjb21tYW5kPiBbYXJncy4uLl0nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBjd2QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSk7XG4gIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCk7XG4gIGNvbnN0IGJlcnJ5QmluRm9sZGVyUGF0aCA9IHByb2Nlc3MuZW52LkJFUlJZX0JJTl9GT0xERVI7XG4gIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIC8vIFN0cmlwcGluZyB5YXJuJ3MgZW52aXJvbm1lbnQgYWxzbyByZW1vdmVzIGl0cyB0ZW1wb3JhcnkgYmluIGZvbGRlciDigJQgdGhlIE9OTFkgcGxhY2VcbiAgLy8geWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMg4oCUIHNvIHJlc3RvcmUgdGhlIHByb2plY3QncyBvd25cbiAgLy8gbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8ga2VlcCBiYXJlIGJpbmFyeSBuYW1lcyByZXNvbHZhYmxlLiBQbHVnJ24nUGxheSBpbnN0YWxsc1xuICAvLyBjcmVhdGUgbm8gbm9kZV9tb2R1bGVzIGF0IGFsbDsgdGhlIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGlzIHRoZW4gdGhlIHNvbGUgc291cmNlIG9mXG4gIC8vIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMsIHNvIHJlc3RvcmUgaXQgaW5zdGVhZC5cbiAgLy8gVGhlIHRlbXBvcmFyeSBmb2xkZXIgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZXN0b3JlZCB3aGVuIC5iaW4gZGlyZWN0b3JpZXMgZXhpc3Q6IGl0IGFsc29cbiAgLy8gY29udGFpbnMgbm9kZS95YXJuIHNoaW1zLCBhbmQgYSBsZWFrZWQgbm9kZSBzaGltIHdvdWxkIHZpb2xhdGUgd2IncyByZWFsLU5vZGUgZ3VhcmFudGVlXG4gIC8vIGZvciB0b29scyBsaWtlIHdyYW5nbGVyL3ZpbmV4dC4gQ2hpbGQgYHlhcm5gIGludm9jYXRpb25zIHN0YXkgcmVzb2x2YWJsZSB0aHJvdWdoIHRoZVxuICAvLyBsYXVuY2hlciBvbiB0aGUgYmFzZSBQQVRIIChtaXNlL2NvcmVwYWNrKSwgd2hpY2ggZXZlcnkgc3VwcG9ydGVkIGVudmlyb25tZW50IGhhcyDigJRcbiAgLy8gbm90aGluZyBjb3VsZCBoYXZlIHN0YXJ0ZWQgYHlhcm4gcnVuYC9gd2IgZG90ZW52YCB3aXRob3V0IGl0LlxuICBpZiAoIXByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChjd2QsIHByb2Nlc3MuZW52KSAmJiBiZXJyeUJpbkZvbGRlclBhdGgpIHtcbiAgICBwcm9jZXNzLmVudi5QQVRIID0gcHJvY2Vzcy5lbnYuUEFUSCA/IGAke2JlcnJ5QmluRm9sZGVyUGF0aH06JHtwcm9jZXNzLmVudi5QQVRIfWAgOiBiZXJyeUJpbkZvbGRlclBhdGg7XG4gIH1cblxuICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgY3dkLFxuICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgbGV0IGZvcndhcmRlZFNodXRkb3duU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2h1dGRvd25TaWduYWxzKSB7XG4gICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGZvcndhcmRlZFNodXRkb3duU2lnbmFsID0gc2lnbmFsO1xuICAgICAgY2hpbGQua2lsbChzaWduYWwpO1xuICAgIH07XG4gICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gIH1cbiAgY2hpbGQub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChzaWduYWwgJiYgc2lnbmFsID09PSBmb3J3YXJkZWRTaHV0ZG93blNpZ25hbCkge1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDEpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VkRG90ZW52QXJnc0Zyb21ZYXJncyhhcmd2OiBBcmd1bWVudHNDYW1lbENhc2UpOiBQYXJzZWREb3RlbnZBcmdzIHtcbiAgcmV0dXJuIHtcbiAgICBjb21tYW5kOiBbXG4gICAgICAuLi4oKGFyZ3YuYXJncyBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAgIC4uLigoYXJndlsnLS0nXSBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICBdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZURvdGVudkFyZ3MoYXJnczogc3RyaW5nW10pOiBQYXJzZWREb3RlbnZBcmdzIHtcbiAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSBhcmdzLmluZGV4T2YoJy0tJyk7XG4gIHJldHVybiB7IGNvbW1hbmQ6IHNlcGFyYXRvckluZGV4ID09PSAtMSA/IGFyZ3MgOiBhcmdzLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSkgfTtcbn1cblxuZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcGFyc2VkID0ge1xuICAgIC4uLmNvbmZpZyh7IHBhdGg6IHBhdGguam9pbihjd2QsICcuZW52JyksIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQsXG4gICAgLi4uKHByb2Nlc3MuZW52LldCX0VOVlxuICAgICAgPyAoY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKGN3ZCwgYC5lbnYuJHtwcm9jZXNzLmVudi5XQl9FTlZ9YCksIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge30pXG4gICAgICA6IHt9KSxcbiAgfTtcbiAgY29uc3QgZW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZCwgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IHBhcnNlZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IEZJTEVfU0NIRU1BLCBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSA9ICdsaXRlc3RyZWFtLnltbCc7XG5jb25zdCBERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY2xlYW5VcENvbW1hbmQgPSBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIENsZWFudXAgZXhpc3RpbmcgYXJ0aWZhY3RzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIExpdGVzdHJlYW0gcmVwbGljYXRpb24uXG4gICAgLy8gTm90ZSB0aGF0IGRvbid0IG1lcmdlIG11bHRpcGxlIHJtIGNvbW1hbmRzIGludG8gb25lLCBiZWNhdXNlIGlmIG9uZSBmYWlscywgdGhlIHN1YnNlcXVlbnQgb25lcyB3b24ndCBydW4uXG4gICAgcmV0dXJuIGAke2NsZWFuVXBDb21tYW5kfTsgcm0gLVJmICR7ZGlyUGF0aH0vLnByb2Quc3FsaXRlMyogfHwgdHJ1ZWA7XG4gIH1cblxuICBkZXBsb3koXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgZ2VuZXJhdGUoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFsnUFJJU01BIGdlbmVyYXRlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAke2xpdGVzdHJlYW1Db25maWdPcHRpb259IC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCwgY29uZmlnUGF0aCl9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgJHt0aGlzLmdlbmVyYXRlKHByb2plY3QpfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjbGVhbnVwQ29tbWFuZCA9IGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3QpO1xuICAgIGlmIChjbGVhbnVwQ29tbWFuZCkgc3RlcHMucHVzaChjbGVhbnVwQ29tbWFuZCk7XG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gWydQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgc3RlcHMucHVzaChyZXNldENvbW1hbmQpO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICAgIHN0ZXBzLnB1c2godGhpcy5zZWVkKHByb2plY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICAgICAgaWYgKGJhc2VEaXIpIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciwgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL21vdW50JyA6ICdwcmlzbWEvbW91bnQnO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUE9TU0lCTEVfUFJJU01BX1BBVEhTLmZpbmQoKHsgc2NoZW1hUGF0aCB9KSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSlcbiAgICA/LmRiUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZ1BhdGgpIHJldHVybiBgLWNvbmZpZyBcIiR7Y29uZmlnUGF0aH1cImA7XG5cbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxDb25maWdQYXRoKSkgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIKSkgcmV0dXJuIGAtY29uZmlnICR7REVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIfWA7XG4gIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtUmYgXCIke2RiUGF0aH1cIipgO1xufVxuXG5mdW5jdGlvbiBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXTsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IFBSSVNNQSBkYiBleGVjdXRlIC0tc3RkaW4gLS11cmwgXCIke0ZJTEVfU0NIRU1BfSR7ZGJQYXRofVwiOyBmaSAmJiBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXdEYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocmF3RGJQYXRoKVxuICAgID8gcmF3RGJQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyID8/ICcuJywgcmF3RGJQYXRoKTtcblxuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREcml6emxlQ29uZmlnLCB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBnZW5Db2RlQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ2dlbi1jb2RlJyxcbiAgZGVzY3JpYmU6ICdHZW5lcmF0ZSBjb2RlIGZvciB0aGUgY3VycmVudCBwcm9qZWN0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBnZW5Db2RlVGFyZ2V0cyA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgICAubWFwKChwcm9qZWN0KSA9PiAoeyBwcm9qZWN0LCBzY3JpcHRzOiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0KSB9KSlcbiAgICAgIC5maWx0ZXIoKHsgc2NyaXB0cyB9KSA9PiBzY3JpcHRzLmxlbmd0aCA+IDApO1xuICAgIGlmIChnZW5Db2RlVGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignTm8gY29kZSBnZW5lcmF0aW9uIG5lZWRlZC4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0LCBzY3JpcHRzIH0gb2YgZ2VuQ29kZVRhcmdldHMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcImdlbi1jb2RlXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcbiAgICAgIGZvciAoY29uc3Qgc2NyaXB0IG9mIHNjcmlwdHMpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHByaXNtYUdlbmVyYXRlU2NyaXB0ID0gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdCk7XG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2JsaXR6JykgJiYgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgc2NyaXB0cy5wdXNoKCdZQVJOIGJsaXR6IGNvZGVnZW4nKTtcbiAgICBpZiAocHJpc21hR2VuZXJhdGVTY3JpcHQpIHtcbiAgICAgIHNjcmlwdHMucHVzaChwcmlzbWFHZW5lcmF0ZVNjcmlwdCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHByaXNtYUdlbmVyYXRlU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKHByaXNtYUdlbmVyYXRlU2NyaXB0KTtcbiAgfVxuXG4gIGNvbnN0IGNoYWtyYVR5cGVnZW5TY3JpcHQgPSBnZXRDaGFrcmFTY3JpcHQocHJvamVjdCk7XG4gIGlmIChjaGFrcmFUeXBlZ2VuU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGNoYWtyYVR5cGVnZW5TY3JpcHQpO1xuICB9XG5cbiAgY29uc3QgZHJpenpsZUNoZWNrU2NyaXB0ID0gc2NyaXB0cy5sZW5ndGggPT09IDAgPyBnZXREcml6emxlQ2hlY2tTY3JpcHQocHJvamVjdCkgOiB1bmRlZmluZWQ7XG4gIGlmIChkcml6emxlQ2hlY2tTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZHJpenpsZUNoZWNrU2NyaXB0KTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNTY3JpcHQgPSBnZXRHZW5JMThuVHNTY3JpcHQocHJvamVjdCk7XG4gIGlmIChnZW5JMThuVHNTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZ2VuSTE4blRzU2NyaXB0KTtcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHtcbiAgICBpZiAoIXByb2plY3QuaGFzU291cmNlQ29kZSkgcmV0dXJuO1xuICAgIHJldHVybiAnWUFSTiBydW4gZ2VuLWkxOG4tdHMnO1xuICB9XG4gIGlmIChcbiAgICBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2dlbi1pMThuLXRzJykgJiZcbiAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdpMThuJykpXG4gICkge1xuICAgIHJldHVybiAnWUFSTiBnZW4taTE4bi10cyAtaSBpMThuIC1vIHNyYy9fX2dlbmVyYXRlZF9fL2kxOG4udHMgLWQgamEtSlAnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNQcmlzbWEpIHJldHVybjtcbiAgaWYgKCFoYXNQcmlzbWFTY2hlbWEocHJvamVjdCkpIHJldHVybjtcbiAgcmV0dXJuIHByaXNtYVNjcmlwdHMuZ2VuZXJhdGUocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGdldENoYWtyYVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ0BjaGFrcmEtdWkvY2xpJykpIHJldHVybjtcblxuICBpZiAoZ2V0T3duRGVwZW5kZW5jeU1ham9yKHByb2plY3QsICdAY2hha3JhLXVpL2NsaScpID09PSAyKSB7XG4gICAgcmV0dXJuICdZQVJOIGNoYWtyYS1jbGkgdG9rZW5zIHNyYy9jb3JlL3RoZW1lLnRzJztcbiAgfVxuICBpZiAoZmlsZUV4aXN0cyhwcm9qZWN0LCAnc3JjL3RoZW1lLnRzJykpIHtcbiAgICByZXR1cm4gJ1lBUk4gY2hha3JhIHR5cGVnZW4gc3JjL3RoZW1lLnRzIC0tc3RyaWN0JztcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGdldERyaXp6bGVDaGVja1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc0RyaXp6bGUpIHJldHVybjtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIGlmICghY29uZmlnKSByZXR1cm47XG4gIC8vIEtlZXAgdGhlIGV4cGxpY2l0IC0tY29uZmlnIGJlY2F1c2UgZHJpenpsZS1raXQncyBkZWZhdWx0IGxvb2t1cCBtaXNzZXMgc29tZSBleHRlbnNpb25zIChlLmcuIC5tdHMpLlxuICByZXR1cm4gYCR7d3JhcFdpdGhEcml6emxlQ29uZmlnRGlyKHByb2plY3QsIGBZQVJOIGRyaXp6bGUta2l0IGNoZWNrIC0tY29uZmlnICR7Y29uZmlnLmZpbGVOYW1lfWApfSB8fCB0cnVlYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3duRGVwZW5kZW5jeU1ham9yKHByb2plY3Q6IFByb2plY3QsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gIGNvbnN0IHZlcnNpb24gPVxuICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXTtcbiAgY29uc3QgbWFqb3IgPSB2ZXJzaW9uPy5tYXRjaCgvXFxkKy91KT8uWzBdO1xuICByZXR1cm4gbWFqb3IgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE51bWJlcihtYWpvcik7XG59XG5cbmZ1bmN0aW9uIGZpbGVFeGlzdHMocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBmaWxlUGF0aCkpO1xufVxuXG5mdW5jdGlvbiBoYXNQcmlzbWFTY2hlbWEocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydwcmlzbWEvc2NoZW1hLnByaXNtYScsICdwcmlzbWEvc2NoZW1hJywgJ2RiL3NjaGVtYS5wcmlzbWEnXS5zb21lKChmaWxlUGF0aCkgPT5cbiAgICBmaWxlRXhpc3RzKHByb2plY3QsIGZpbGVQYXRoKVxuICApO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGUsIG91dHB1dCkpIHJldHVybjtcblxuICBjb25zdCBub3JtYWxpemVkT3V0cHV0ID0gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShub3JtYWxpemVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4aXRDb2RlICE9PSAwIHx8IGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG91dHB1dC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGJ3YXJuKD86aW5nKT9zP1xcYi9pLnRlc3Qob3V0cHV0LnJlcGxhY2VBbGwoL1xcYig/OjB8bm8pIHdhcm5pbmdzP1xcYi9naSwgJycpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IEJ1ZmZlcmVkUnVuUmVzdWx0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplU2NyaXB0LCBydW5XaXRoU3Bhd25JblBhcmFsbGVsLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRCdWZmZXJlZE91dHB1dCwgc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dCB9IGZyb20gJy4uL3V0aWxzL291dHB1dC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdQcmludCBvbmx5IGZhaWxlZCBvciB3YXJuaW5nIGNvbW1hbmQgb3V0cHV0JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgTGludENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczxcbiAgdHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXJcbj47XG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8TGludENvbW1hbmRPcHRpb25zPiAmIHtcbiAgJy0tJz86IHVua25vd25bXTtcbiAgXzogdW5rbm93bltdO1xuICBwcmludEFsbE91dHB1dD86IGJvb2xlYW47XG59O1xuXG5jb25zdCBveGxpbnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXSk7XG5jb25zdCBweXRob25FeHRlbnNpb25zID0gbmV3IFNldChbJ3B5J10pO1xuY29uc3QgZGFydEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnZGFydCddKTtcbmNvbnN0IHJ1c3RFeHRlbnNpb25zID0gbmV3IFNldChbJ3JzJ10pO1xuY29uc3Qgb3hmbXRFeHRlbnNpb25zID0gbmV3IFNldChbXG4gIC4uLm94bGludEV4dGVuc2lvbnMsXG4gICdjc3MnLFxuICAnZ3FsJyxcbiAgJ2dyYXBocWwnLFxuICAnaGJzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnbGVzcycsXG4gICdtZCcsXG4gICdtZHgnLFxuICAnc2NzcycsXG4gICd0b21sJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqYXZhJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFveGZtdEV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcbmNvbnN0IHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4gPSAnISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqJztcblxudHlwZSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZFJ1blJlc3VsdCAmIHsgY29tbWFuZDogc3RyaW5nOyBjd2Q6IHN0cmluZyB9O1xudHlwZSBMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRMaW50UnVuUmVzdWx0IHwgeyBleGl0Q29kZTogbnVtYmVyIH07XG5pbnRlcmZhY2UgTGludFJ1bkNvbW1hbmQge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIHByb2plY3Q6IFByb2plY3Q7XG59XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBMaW50Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IGxpbnQoYXJndiBhcyBMaW50Q29tbWFuZEFyZ3YpO1xuICAgIGlmIChleGl0Q29kZSkgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50KGFyZ3Y6IExpbnRDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3YpO1xuICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3Qgb3hmbXRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBweXRob25GaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgLy8gYGNhcmdvIGZtdCAtLWFsbGAgYWx3YXlzIGZvcm1hdHMgdGhlIHdob2xlIHdvcmtzcGFjZSwgc28gd2UgdHJhY2sgdGFyZ2V0XG4gIC8vIHByb2plY3RzIHJhdGhlciB0aGFuIGluZGl2aWR1YWwgZmlsZSBwYXRocy4gRXZlcnkgcHJvamVjdCB3aXRoIGl0cyBvd25cbiAgLy8gYENhcmdvLnRvbWxgIHJ1bnMgaXRzIG93biBgY2FyZ28gZm10IC0tYWxsYDsgd2UgaW50ZW50aW9uYWxseSBkbyBub3QgZGVkdXBcbiAgLy8gYnkgZGlyZWN0b3J5LiBBIG5lc3RlZCBvciBzaWJsaW5nIGNyYXRlIGNhbiBiZSBhbiBpbmRlcGVuZGVudCBDYXJnb1xuICAvLyB3b3Jrc3BhY2UgdGhhdCBhIHBhcmVudCdzIGBjYXJnbyBmbXQgLS1hbGxgIG5ldmVyIHJlYWNoZXMsIHNvIHNraXBwaW5nIGl0XG4gIC8vIHdvdWxkIGxlYXZlIGl0IHVuZm9ybWF0dGVkLCB3aGlsZSBhbnkgZ2VudWluZWx5IG92ZXJsYXBwaW5nIHJ1bnMgYXJlXG4gIC8vIGhhcm1sZXNzIGJlY2F1c2UgcnVzdGZtdCBpcyBkZXRlcm1pbmlzdGljIGFuZCBpZGVtcG90ZW50LiBEZWR1cGluZyBieSByZWFsXG4gIC8vIHdvcmtzcGFjZSBtZW1iZXJzaGlwIHdvdWxkIHJlcXVpcmUgaW52b2tpbmcgYGNhcmdvIGxvY2F0ZS1wcm9qZWN0YC5cbiAgY29uc3QgY2FyZ29Gb3JtYXRQcm9qZWN0cyA9IG5ldyBTZXQ8UHJvamVjdD4oKTtcbiAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3M6IHN0cmluZ1tdO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbnRUYXJnZXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVLaW5kID0gYXdhaXQgZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtpbmQsIGZpbGVQYXRoIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgZm9yIChjb25zdCB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9IG9mIGxpbnRUYXJnZXRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goLi4uZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKTtcblxuICAgICAgZm9yIChjb25zdCB7IGxpbnRQYXRoLCBwcm9qZWN0IH0gb2YgZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSkge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBweXRob25GaWxlUGF0aHMgPSBweXRob25GaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIHB5dGhvbkZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBkYXJ0RmlsZVBhdGhzID0gZGFydEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgZGFydEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNDYXJnb1RvbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBydXN0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjYXJnb0Zvcm1hdFByb2plY3RzLmFkZChwcm9qZWN0KTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgY29uc3QgbGludEZpbGVQYXRocyA9IGxpbnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgbGludEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgbGludEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihsaW50UGF0aCksIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmb3JtYXR0ZXJQYXRoIG9mIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKHByb2plY3QsIGxpbnRQYXRoLCBmaWxlS2luZCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhcmd2LmZvcm1hdCAmJiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCAmJiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE5vIGxpbnRlciBmb3VuZCBmb3IgJHtwcm9qZWN0Lm5hbWV9LiBJbnN0YWxsIE94bGludC5gKSk7XG4gICAgICAgICAgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gWy4uLm5ldyBTZXQocGFja2FnZUpzb25GaWxlUGF0aHMpXTtcbiAgfSBlbHNlIHtcbiAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBwLnBhY2thZ2VKc29uUGF0aCk7XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50UnVuT3B0aW9ucyA9IHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgcHJlc2VydmVDb2xvcjogIWFyZ3YucHJpbnRBbGxPdXRwdXQgfSBhcyBjb25zdDtcbiAgY29uc3Qgc2hvdWxkUnVuRm9ybWF0dGVycyA9IEJvb2xlYW4oYXJndi5mb3JtYXQpO1xuICBjb25zdCBzaG91bGRSdW5MaW50ZXJzID0gIWFyZ3YuZm9ybWF0IHx8IGFyZ3YuZml4O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBsaW50RmlsZVBhdGhzXSBvZiBsaW50RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBweXRob25GaWxlUGF0aHNdIG9mIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQocHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgZGFydEZpbGVQYXRoc10gb2YgZGFydEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgY2FyZ29Gb3JtYXRQcm9qZWN0cykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRDYXJnb0Zvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIG94Zm10RmlsZVBhdGhzXSBvZiBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRPeGZtdENvbW1hbmQob3hmbXRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzIHx8IHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBpZiAobGludENvbW1hbmQpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2KSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNDYXJnb1RvbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBsaW50RXhpdENvZGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgY29uc3QgZm9ybWF0dGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhmb3JtYXR0ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMoZm9ybWF0dGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmZvcm1hdHRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgaWYgKHByZXR0aWVyQXJncy5sZW5ndGggPiAwICYmIHByb2plY3RzLnNlbGYuaGFzUHJldHRpZXIpIHtcbiAgICAgIGNvbnN0IHByZXR0aWVyUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgJ3ByZXR0aWVyJyxcbiAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgICAgICctLXdyaXRlJyxcbiAgICAgICAgICAnLS0nLFxuICAgICAgICAgIC4uLnByZXR0aWVyQXJncyxcbiAgICAgICAgXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbcHJldHRpZXJSZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChwcmV0dGllclJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvcnRQYWNrYWdlSnNvblJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnLS0nLCAuLi5zb3J0UGFja2FnZUpzb25BcmdzXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbc29ydFBhY2thZ2VKc29uUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2goc29ydFBhY2thZ2VKc29uUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgIGNvbnN0IGxpbnRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMobGludGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGxpbnRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5saW50ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcbiAgfVxuXG4gIHJldHVybiBsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkgPyAxIDogMDtcbn1cblxuZnVuY3Rpb24gcnVuTGludENvbW1hbmRzKFxuICBjb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSxcbiAgYXJndjogTGludENvbW1hbmRBcmd2LFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd25JblBhcmFsbGVsPlszXVxuKTogUHJvbWlzZTxMaW50UnVuUmVzdWx0W10+IHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGNvbW1hbmRzLm1hcCgoeyBjb21tYW5kLCBwcm9qZWN0IH0pID0+IHJ1bkxpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpKSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdD4ge1xuICBpZiAoYXJndi5zaWxlbnQpIHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIHByb2plY3QpO1xuICAgIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykudGhlbigocmVzdWx0KSA9PiAoe1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgY29tbWFuZDogbm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsXG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykudGhlbigoZXhpdENvZGUpID0+ICh7IGV4aXRDb2RlIH0pKTtcbn1cblxuZnVuY3Rpb24gcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhcbiAgcmVzdWx0czogTGludFJ1blJlc3VsdFtdLFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kQXJndiwgJ3ByaW50QWxsT3V0cHV0JyB8ICdzaWxlbnQnPlxuKTogdm9pZCB7XG4gIGNvbnN0IHByaW50YWJsZVJlc3VsdHMgPVxuICAgIGFyZ3Yuc2lsZW50ICYmICFhcmd2LnByaW50QWxsT3V0cHV0XG4gICAgICA/IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+ICdvdXRwdXQnIGluIHJlc3VsdCAmJiBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0Lm91dHB1dCkpXG4gICAgICA6IHJlc3VsdHM7XG4gIGlmIChwcmludGFibGVSZXN1bHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHByaW50YWJsZVJlc3VsdHMpIHtcbiAgICBpZiAoISgnb3V0cHV0JyBpbiByZXN1bHQpKSBjb250aW51ZTtcblxuICAgIGlmIChhcmd2LnByaW50QWxsT3V0cHV0KSB7XG4gICAgICBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgICAgIHByaW50Q29tbWFuZEhlYWRlcihyZXN1bHQuY29tbWFuZCwgcmVzdWx0LmN3ZCk7XG4gICAgICB9XG4gICAgICBwcmludEJ1ZmZlcmVkT3V0cHV0KHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0Lm91dHB1dCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQ6IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCk6IHZvaWQge1xuICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuXG4gIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDAgJiYgc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KHJlc3VsdC5jb21tYW5kKSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU3VjY2VlZGVkLicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0LnRyaW0oKTtcbiAgaWYgKG91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZEhlYWRlcihjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQoY29tbWFuZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCcgb3hmbXQgJykgfHwgY29tbWFuZC5pbmNsdWRlcygnIHNvcnQtcGFja2FnZS1qc29uICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMaW50Q29tbWFuZChcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNUeXBlQXdhcmVPeGxpbnQnPixcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgLy8gVHlwZS1hd2FyZSBtb2RlIG1ha2VzIG94bGludCByZXBvcnQgdHlwZS1jaGVjayBkaWFnbm9zdGljcy4gUGFzcyB0aGUgZmxhZ3MgZXhwbGljaXRseVxuICAgICAgLy8gYmVjYXVzZSBveGxpbnQgcmVqZWN0cyB0aGUgZXF1aXZhbGVudCBvcHRpb25zIGluIG5vbi1yb290IGNvbmZpZ3MsIHNvIHBlci1wYWNrYWdlIHJ1bnNcbiAgICAgIC8vIGluIG1vbm9yZXBvcyB3b3VsZCBvdGhlcndpc2UgbWlzcyB0eXBlIGVycm9ycy5cbiAgICAgIC4uLihwcm9qZWN0Lmhhc1R5cGVBd2FyZU94bGludCA/IFsnLS10eXBlLWF3YXJlJywgJy0tdHlwZS1jaGVjayddIDogW10pLFxuICAgICAgLi4uKGFyZ3YucXVpZXQgPyBbJy0tcXVpZXQnXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LmZpeCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPeGZtdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgJ1lBUk4nLFxuICAgICdveGZtdCcsXG4gICAgJy0td3JpdGUnLFxuICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgICchKiovcGFja2FnZS5qc29uJyxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIFtcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnaXNvcnQnLCAnLS1wcm9maWxlJywgJ2JsYWNrJywgJy0tZmlsdGVyLWZpbGVzJywgLi4udGFyZ2V0c10pLFxuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdibGFjaycsIC4uLnRhcmdldHNdKSxcbiAgXS5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3Y6IFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PiwgZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDYXJnb0Zvcm1hdENvbW1hbmQoKTogc3RyaW5nIHtcbiAgLy8gRm9ybWF0dGluZyBtdXN0IGdvIHRocm91Z2ggY2FyZ28gKG5vdCBydXN0Zm10IG9uIGluZGl2aWR1YWwgZmlsZXMpIHNvIGVhY2hcbiAgLy8gY3JhdGUncyBlZGl0aW9uIGFuZCBydXN0Zm10IGNvbmZpZ3VyYXRpb24gYXJlIHJlc3BlY3RlZDsgYC0tYWxsYCBjb3ZlcnNcbiAgLy8gZXZlcnkgd29ya3NwYWNlIG1lbWJlciBhbmQgaXMgYSBuby1vcCBzdWZmaXggZm9yIHNpbmdsZS1jcmF0ZSBwcm9qZWN0cy5cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnY2FyZ28nLCAnZm10JywgJy0tYWxsJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydExpbnRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnYW5hbHl6ZScsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYywgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi9wb3J0LmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5jb25zdCBzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyA9IDEwMDtcbmNvbnN0IHN0YWxlUHJvY2Vzc01heFBvbGxzID0gMTA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpO1xuICBpZiAoIWF2YWlsYWJsZSkge1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfVxuXG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0KTtcbn1cblxuZnVuY3Rpb24ga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBwaWQgb2YgbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydCkpIHtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydDogbnVtYmVyKTogbnVtYmVyW10ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYygnbHNvZicsIFsnLXRpJywgYHRjcDoke3BvcnR9YCwgJy1zVENQOkxJU1RFTiddLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICAgIHJldHVybiBzdGRvdXRcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKChwaWQpID0+IE51bWJlcihwaWQudHJpbSgpKSlcbiAgICAgIC5maWx0ZXIoKHBpZCkgPT4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlU3RhbGVQcm9jZXNzKHBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhbGVQcm9jZXNzTWF4UG9sbHM7IGkrKykge1xuICAgIGF3YWl0IHNldFRpbWVvdXQoc3RhbGVQcm9jZXNzUG9sbEludGVydmFsTXMpO1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFU1JDSCcpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsICdTSUdLSUxMJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MsIHJlbW92ZVN0YWxlUHJvY2VzcyB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAnZGVsYXktbXMnOiB7XG4gICAgZGVmYXVsdDogNTAwMCxcbiAgICBkZXNjcmliZTogJ0RlbGF5IGJlZm9yZSBzdGFydGluZyB0aGUgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG50eXBlIE1haW50ZW5hbmNlQXJndiA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+ICYge1xuICBhY3Rpb246ICdzdGFydCcgfCAnc3RvcCc7XG59O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5NYXhBdHRlbXB0cyA9IDU7XG5jb25zdCBtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyA9IDEwMDtcbmNvbnN0IG1heFRpbWVvdXREZWxheU1zID0gMl8xNDdfNDgzXzY0NztcbmNvbnN0IG1haW50ZW5hbmNlUGlkRGlyZWN0b3J5TmFtZSA9ICcud2InO1xuY29uc3QgbWFpbnRlbmFuY2VIdG1sID0gYDwhZG9jdHlwZSBodG1sPlxuPGh0bWwgbGFuZz1cImphXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiPlxuICAgIDx0aXRsZT7jg6Hjg7Pjg4bjg4rjg7PjgrnkuK08L3RpdGxlPlxuICAgIDxzdHlsZT5cbiAgICAgIGJvZHkge1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgICBjb2xvcjogIzExMTgyNztcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBzYW5zLXNlcmlmO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDtcbiAgICAgIH1cblxuICAgICAgbWFpbiB7XG4gICAgICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIH1cblxuICAgICAgaDEge1xuICAgICAgICBmb250LXNpemU6IDI4cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICAgIG1hcmdpbjogMCAwIDE2cHg7XG4gICAgICB9XG5cbiAgICAgIHAge1xuICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjg7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxtYWluPlxuICAgICAgPGgxPuePvuWcqOODoeODs+ODhuODiuODs+OCueS4reOBp+OBmTwvaDE+XG4gICAgICA8cD7nmobmp5jjgavjga/jgZTkuI3kvr/jgpLjgYrjgYvjgZHjgZfjgb7jgZnjgYzjgIHjg6Hjg7Pjg4bjg4rjg7PjgrnntYLkuobjgb7jgafjgZfjgbDjgonjgY/jgYrlvoXjgaHjgY/jgaDjgZXjgYTjgII8L3A+XG4gICAgPC9tYWluPlxuICA8L2JvZHk+XG48L2h0bWw+YDtcblxuZXhwb3J0IGNvbnN0IG1haW50ZW5hbmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBNYWludGVuYW5jZUFyZ3Y+ID0ge1xuICBjb21tYW5kOiAnbWFpbnRlbmFuY2UgPGFjdGlvbj4nLFxuICBkZXNjcmliZTogJ1N0YXJ0IG9yIHN0b3AgYSBsaWdodHdlaWdodCBtYWludGVuYW5jZSBwYWdlIHNlcnZlci4gRXhhbXBsZTogd2IgbWFpbnRlbmFuY2Ugc3RhcnQnLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wb3NpdGlvbmFsKCdhY3Rpb24nLCB7XG4gICAgICAgIGNob2ljZXM6IFsnc3RhcnQnLCAnc3RvcCddIGFzIGNvbnN0LFxuICAgICAgICBkZXNjcmliZTogJ01haW50ZW5hbmNlIHNlcnZlciBhY3Rpb24nLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIH0pXG4gICAgICAub3B0aW9ucyhidWlsZGVyKSBhcyB1bmtub3duIGFzIEFyZ3Y8TWFpbnRlbmFuY2VBcmd2PixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSBhcmd2LmFjdGlvbjtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBtYWludGVuYW5jZSAke2FjdGlvbn0gYmVjYXVzZSBXQl9FTlYgaXMgdGVzdC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gcGFyc2VQb3J0KHByb2plY3QuZW52LlBPUlQpO1xuICAgIGlmIChhY3Rpb24gPT09ICdzdGFydCcpIHtcbiAgICAgIGF3YWl0IHN0YXJ0TWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdCwgcG9ydCwgYXJndi5kZWxheU1zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3N0b3AnKSB7XG4gICAgICBhd2FpdCBzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdCwgcG9ydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1haW50ZW5hbmNlIGFjdGlvbjogJHthY3Rpb259YCk7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBwYXJzZVBvcnQocG9ydEVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgYXNzZXJ0Lm9rKE51bWJlci5pc0ludGVnZXIocG9ydCkgJiYgcG9ydCA+IDAsIGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyLCBkZWxheU1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXNzZXJ0Lm9rKFxuICAgIE51bWJlci5pc0Zpbml0ZShkZWxheU1zKSAmJiBkZWxheU1zID49IDAgJiYgZGVsYXlNcyA8PSBtYXhUaW1lb3V0RGVsYXlNcyxcbiAgICBgZGVsYXktbXMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICR7bWF4VGltZW91dERlbGF5TXN9OiAke2RlbGF5TXN9YFxuICApO1xuXG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gYXdhaXQgd3JpdGVNYWludGVuYW5jZVBpZEZpbGUocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgY2xlYW51cCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCByZW1vdmVNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgsIHByb2Nlc3MucGlkKTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICB9O1xuICBjb25zdCByZW1vdmVTaWduYWxIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBwcm9jZXNzLm9mZignU0lHSU5UJywgaGFuZGxlU2lnbmFsKTtcbiAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1FVSVQnLCBoYW5kbGVTaWduYWwpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgaGFuZGxlU2lnbmFsKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgaGFuZGxlU2lnbmFsKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHNldFRpbWVvdXQoZGVsYXlNcywgdW5kZWZpbmVkLCB7IHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGNvbnN0IHNlcnZlciA9IGF3YWl0IGNyZWF0ZUFuZExpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHBvcnQpO1xuICAgIGlmICghc2VydmVyKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmluZm8oYFN0YXJ0ZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbiAgICBhd2FpdCB3YWl0Rm9yU2h1dGRvd24oc2VydmVyKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjtcblxuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIHJlbW92ZVNpZ25hbEhhbmRsZXJzKCk7XG4gICAgYXdhaXQgY2xlYW51cCgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFuZExpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHBvcnQ6IG51bWJlcik6IFByb21pc2U8aHR0cC5TZXJ2ZXIgfCB1bmRlZmluZWQ+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWFpbnRlbmFuY2VMaXN0ZW5NYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyLCBwb3J0LCBoYW5kbGVSdW50aW1lTWFpbnRlbmFuY2VTZXJ2ZXJFcnJvcik7XG4gICAgICByZXR1cm4gc2VydmVyO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcik7XG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb247XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJyAmJiBhdHRlbXB0IDwgbWFpbnRlbmFuY2VMaXN0ZW5NYXhBdHRlbXB0cykge1xuICAgICAgICBhd2FpdCBzZXRUaW1lb3V0KG1haW50ZW5hbmNlTGlzdGVuUmV0cnlEZWxheU1zKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2Ugc2VydmVyIGJlY2F1c2UgcG9ydCAke3BvcnR9IGlzIGFscmVhZHkgaW4gdXNlLmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydCwgZXJyKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1VucmVhY2hhYmxlIG1haW50ZW5hbmNlIHNlcnZlciBzdGFydHVwIHN0YXRlLicpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVNYWludGVuYW5jZVN0YXJ0dXBFcnJvcihwb3J0OiBudW1iZXIsIGVycm9yOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pOiBuZXZlciB7XG4gIGlmIChlcnJvci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUG9ydCAke3BvcnR9IGlzIGFscmVhZHkgaW4gdXNlLmApKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICB9XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IoZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBNYWludGVuYW5jZSBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKSk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3QsIHBvcnQpO1xuICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIGNvbnNvbGUuaW5mbyhgU3RvcHBlZCBtYWludGVuYW5jZSBzZXJ2ZXIgb24gcG9ydCAke3BvcnR9LmApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYWludGVuYW5jZVNlcnZlcigpOiBodHRwLlNlcnZlciB7XG4gIHJldHVybiBodHRwLmNyZWF0ZVNlcnZlcigoX3JlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMywge1xuICAgICAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tc3RvcmUnLFxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnLFxuICAgIH0pO1xuICAgIHJlc3BvbnNlLmVuZChtYWludGVuYW5jZUh0bWwpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIoXG4gIHNlcnZlcjogaHR0cC5TZXJ2ZXIsXG4gIHBvcnQ6IG51bWJlcixcbiAgb25SdW50aW1lRXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25TdGFydHVwRXJyb3IgPSAoZXJyb3I6IEVycm9yKTogdm9pZCA9PiB7XG4gICAgICBzZXJ2ZXIub2ZmKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH07XG4gICAgY29uc3Qgb25MaXN0ZW5pbmcgPSAoKTogdm9pZCA9PiB7XG4gICAgICBzZXJ2ZXIub2ZmKCdlcnJvcicsIG9uU3RhcnR1cEVycm9yKTtcbiAgICAgIHNlcnZlci5vbignZXJyb3InLCBvblJ1bnRpbWVFcnJvcik7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsIG9uTGlzdGVuaW5nKTtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICcwLjAuMC4wJyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yU2h1dGRvd24oc2VydmVyOiBodHRwLlNlcnZlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNodXRkb3duID0gKCk6IHZvaWQgPT4ge1xuICAgICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdURVJNJywgc2h1dGRvd24pO1xuICAgICAgcHJvY2Vzcy5vZmYoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gY2xvc2UgbWFpbnRlbmFuY2Ugc2VydmVyOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH07XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIHNodXRkb3duKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyOiBodHRwLlNlcnZlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2VydmVyLmNsb3NlKChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRVJSX1NFUlZFUl9OT1RfUlVOTklORycpIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgICBzZXJ2ZXIuY2xvc2VBbGxDb25uZWN0aW9ucygpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVNYWludGVuYW5jZVBpZEZpbGUocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcGlkRmlsZVBhdGggPSBtYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3QsIHBvcnQpO1xuICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUocGlkRmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHBpZEZpbGVQYXRoLCBgJHtwcm9jZXNzLnBpZH1cXG5gLCAndXRmOCcpO1xuICByZXR1cm4gcGlkRmlsZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxNYWludGVuYW5jZVByb2Nlc3MocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gIGlmIChwaWQgIT09IHVuZGVmaW5lZCAmJiBwaWQgIT09IHByb2Nlc3MucGlkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHBpZCwgJ1NJR1RFUk0nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgYXdhaXQgcmVtb3ZlU3RhbGVQcm9jZXNzKHBpZCk7XG4gIH1cbiAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwaWQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGg6IHN0cmluZywgZXhwZWN0ZWRQaWQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGV4cGVjdGVkUGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwaWQgPSBhd2FpdCByZWFkTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoKTtcbiAgICBpZiAocGlkICE9PSBleHBlY3RlZFBpZCkgcmV0dXJuO1xuICB9XG4gIGF3YWl0IGZzLnJtKHBpZEZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBpZFRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShwaWRGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBwaWQgPSBOdW1iZXIocGlkVGV4dC50cmltKCkpO1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgJiYgcGlkID4gMCA/IHBpZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBnZXRNYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3Qucm9vdERpclBhdGgsIHBvcnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChyb290RGlyUGF0aDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKHJvb3REaXJQYXRoLCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUsIGBtYWludGVuYW5jZS0ke3BvcnR9LnBpZGApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7XG4gIGZpbmREZXNjZW5kYW50UHJvamVjdHMsXG4gIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCxcbiAgZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCxcbiAgdHlwZSBQcm9qZWN0LFxufSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IHNxbGl0ZUZpbGVQYXR0ZXJuID0gL1xcLig/OnNxbGl0ZTM/fGRiKSg/OlstLl0oPzpqb3VybmFsfHNobXx3YWwpKT8kL2k7XG5jb25zdCBkb2NrZXJCdWlsZENhY2hlUGF0aHMgPSBbXG4gICcuY2FjaGUnLFxuICAnLm15cHlfY2FjaGUnLFxuICAnLm5leHQvY2FjaGUnLFxuICAnLnBhcmNlbC1jYWNoZScsXG4gICcucHl0ZXN0X2NhY2hlJyxcbiAgJy5ydWZmX2NhY2hlJyxcbiAgJy50b3gnLFxuICAnLnR1cmJvJyxcbiAgJy52ZW52JyxcbiAgJy55YXJuL2NhY2hlJyxcbiAgJy55YXJuL2luc3RhbGwtc3RhdGUuZ3onLFxuICAnX19weWNhY2hlX18nLFxuICAnY292ZXJhZ2UnLFxuICAnbm9kZV9tb2R1bGVzLy5jYWNoZScsXG4gICdwbGF5d3JpZ2h0LXJlcG9ydCcsXG4gICdzdG9yeWJvb2stc3RhdGljJyxcbiAgJ3RhcmdldCcsXG4gICd0ZXN0LXJlc3VsdHMnLFxuXTtcbmNvbnN0IGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyA9IFsnKiovKi5weWMnLCAnKiovKi50c2J1aWxkaW5mbycsICcqKi9fX3B5Y2FjaGVfXyddO1xuY29uc3QgZ2VuZXJhdGVkU3FsaXRlRGlyTmFtZXMgPSBbJ3ByaXNtYScsICdkYicsICdkcml6emxlJ10gYXMgY29uc3Q7XG5jb25zdCBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMgPSBbJy9kYXRhJ10gYXMgY29uc3Q7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW1pemVkUHJvamVjdHM6IFByb2plY3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llcyhwcm9qZWN0LCBwYWNrYWdlSnNvbik7XG4gICAgICBjb25zdCByZW1vdmVkRGV2RGVwZW5kZW5jaWVzID0gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24sIHtcbiAgICAgICAgcmVtb3ZlV2JQb3N0aW5zdGFsbDogIWFyZ3Yub3V0c2lkZSAmJiByZW1vdmVkRGV2RGVwZW5kZW5jaWVzLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvd2InKSxcbiAgICAgIH0pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgICAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgICAgICBhd2FpdCB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhwYXRoLmpvaW4oZGlzdERpclBhdGgsICdiYXNoJykpO1xuICAgICAgfVxuICAgICAgb3B0aW1pemVkUHJvamVjdHMucHVzaChwcm9qZWN0KTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgICAgYXdhaXQgY2xlYW51cERvY2tlckJ1aWxkQXJ0aWZhY3RzKG9wdGltaXplZFByb2plY3RzKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llcyhwcm9qZWN0OiBQcm9qZWN0LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llc0ZvckRpcihwcm9qZWN0LnJvb3REaXJQYXRoLCBwcm9qZWN0LmRpclBhdGgsIHBhY2thZ2VKc29uKTtcbn1cblxuZnVuY3Rpb24gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXNGb3JEaXIoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICBjb25zdCByZXdyaXR0ZW5EZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAvLyBEb2NrZXIgYnVpbGRzIGNhbm5vdCBhY2Nlc3MgcHJpdmF0ZSBTU0ggVVJMcyB1bmxlc3MgY3JlZGVudGlhbHMgYXJlIGZvcndhcmRlZC5cbiAgICAgICAgLy8gVGhlIERvY2tlcmZpbGUgY29waWVzIHRob3NlIHdvcmtzcGFjZSBwYWNrYWdlcyBpbnRvIHRoZSBpbWFnZSBpbnN0ZWFkLlxuICAgICAgICBkZXBzW25hbWVdID0gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIocm9vdERpclBhdGgsIHBhY2thZ2VEaXJQYXRoLCBuYW1lKTtcbiAgICAgICAgcmV3cml0dGVuRGVwZW5kZW5jaWVzLnB1c2goYCR7a2V5fS4ke25hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmV3cm90ZSBwcml2YXRlIEdpdEh1YiBkZXBlbmRlbmNpZXM6JywgcmV3cml0dGVuRGVwZW5kZW5jaWVzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbiAgcmV0dXJuIHJld3JpdHRlbkRlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ0B3aWxsYm9vc3RlcicsIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwcml2YXRlUGFja2FnZURpclBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbmZ1bmN0aW9uIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15Ad2lsbGJvb3N0ZXJcXC8vLCAnJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlRG9ja2VyU2hlbGxTY3JpcHRzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzb3VyY2VEaXJQYXRoID0gZmluZERvY2tlclNoZWxsU2NyaXB0c0RpclBhdGgoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoc291cmNlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNGaWxlKCkgfHwgIWRpcmVudC5uYW1lLmVuZHNXaXRoKCcuc2gnKSkgY29udGludWU7XG5cbiAgICBjb25zdCB0YXJnZXRGaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY29weUZpbGUocGF0aC5qb2luKHNvdXJjZURpclBhdGgsIGRpcmVudC5uYW1lKSwgdGFyZ2V0RmlsZVBhdGgpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLmNobW9kKHRhcmdldEZpbGVQYXRoLCAwbzc1NSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgRG9ja2VyIHNoZWxsIHNjcmlwdHM6ICR7cGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBkaXJQYXRoKSB8fCBkaXJQYXRofWApO1xufVxuXG5mdW5jdGlvbiBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpOiBzdHJpbmcge1xuICBsZXQgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ2RvY2tlcicsICdiYXNoJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb2NrZXIgc2hlbGwgc2NyaXB0cyBkaXJlY3Rvcnkgbm90IGZvdW5kLicpO1xuICAgIH1cbiAgICBjdXJyZW50RGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgIC8vIE91dHNpZGUgb3B0aW1pemF0aW9uIHdyaXRlcyBkaXN0L3BhY2thZ2UuanNvbiBiZWZvcmUgRG9ja2VyIGJ1aWxkcyB0aGUgYXBwLlxuICAgIC8vIEtlZXAgYnVpbGQtdGltZSBkZXBlbmRlbmNpZXMgYW5kIHJlbW92ZSBvbmx5IGtub3duIG5vbi1idWlsZCB0b29saW5nLlxuICAgIHJldHVybiByZW1vdmVVbm5lY2Vzc2FyeURldkRlcGVuZGVuY2llc0Zvck91dHNpZGVEb2NrZXJCdWlsZChwYWNrYWdlSnNvbik7XG4gIH1cblxuICAvLyBJbnNpZGUgRG9ja2VyLCBjb2RlZ2VuL2J1aWxkIGhhcyBhbHJlYWR5IGZpbmlzaGVkLCBzbyBwcm9kdWN0aW9uIGluc3RhbGwgc2hvdWxkIG5vdCBzZWUgZGV2IHRvb2xpbmcuXG4gIGNvbnN0IHJlbW92ZWREZXBlbmRlbmNpZXMgPSBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge30pO1xuICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgcmV0dXJuIHJlbW92ZWREZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgLy8gSW4gLS1vdXRzaWRlIG1vZGUsIERvY2tlciBzdGlsbCBydW5zIGNvZGVnZW4vYnVpbGQgYmVmb3JlIGEgc2Vjb25kIGluLWltYWdlIG9wdGltaXphdGlvbi5cbiAgLy8gUmVtb3ZlIG9ubHkgdG9vbGluZyB0aGF0IGlzIG5vdCBuZWVkZWQgZm9yIHRoYXQgYnVpbGQgcGhhc2UuXG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdiaW9tZScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ294Zm10JyxcbiAgICAnb3hsaW50JyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdyYWlsd2F5JyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgLy8gU2hhcmVkIGNvbmZpZyBwYWNrYWdlcyBhcmUgbmVlZGVkIG9ubHkgZm9yIGxpbnQvZm9ybWF0L3Rlc3QgY29tbWFuZHMsIG5vdCBEb2NrZXIgYnVpbGRzLlxuICAgICAgKG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICAgIHJlbW92ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBkZXZEZXBlbmRlbmNpZXM6JywgcmVtb3ZlZERlcHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xuICByZXR1cm4gcmVtb3ZlZERlcHM7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIG9wdGlvbnM6IHsgcmVtb3ZlV2JQb3N0aW5zdGFsbDogYm9vbGVhbiB9KTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IHJlbW92ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIChvcHRpb25zLnJlbW92ZVdiUG9zdGluc3RhbGwgJiYgbmFtZSA9PT0gJ3Bvc3RpbnN0YWxsJyAmJiBjb250ZW50LnRyaW0oKSA9PT0gJ3diIGdlbi1jb2RlJykgfHxcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuc3RhcnRzV2l0aCh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cERvY2tlckJ1aWxkQXJ0aWZhY3RzKHByb2plY3RzOiBQcm9qZWN0W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgYXdhaXQgcmVtb3ZlUHJvamVjdENhY2hlcyhwcm9qZWN0KTtcbiAgICBhd2FpdCByZW1vdmVHZW5lcmF0ZWRMb2NhbERhdGEocHJvamVjdCk7XG4gICAgcnVuRG9ja2VyQ2xlYW51cFNjcmlwdChwcm9qZWN0KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRocyA9IFtcbiAgICAuLi4oYXdhaXQgcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3QpKSxcbiAgICAuLi4oYXdhaXQgcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zKHByb2plY3QpKSxcbiAgXTtcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIERvY2tlciBidWlsZCBjYWNoZXM6JywgcmVsYXRpdmVQYXRocy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIGRvY2tlckJ1aWxkQ2FjaGVQYXRocykge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXRQYXRoKSkgY29udGludWU7XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0YXJnZXRQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmVtb3ZlZFBhdGhzLnB1c2gocmVsYXRpdmVQYXRoKTtcbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRocyA9IGF3YWl0IGdsb2JieShkb2NrZXJCdWlsZENhY2hlUGF0dGVybnMsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcycsICcqKi9ub2RlX21vZHVsZXMvKionLCAnKiovLnlhcm4nLCAnKiovLnlhcm4vKionLCAnKiovLmdpdCcsICcqKi8uZ2l0LyoqJ10sXG4gICAgb25seUZpbGVzOiBmYWxzZSxcbiAgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJlbGF0aXZlUGF0aHMubWFwKChyZWxhdGl2ZVBhdGgpID0+XG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICApXG4gICk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRMb2NhbERhdGEocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZW1vdmVkUGF0aEdyb3VwcyA9IGF3YWl0IFByb21pc2UuYWxsKFtyZW1vdmVHZW5lcmF0ZWRNb3VudERpcnMocHJvamVjdCksIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3QpXSk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IHJlbW92ZWRQYXRoR3JvdXBzLmZsYXQoKTtcbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGdlbmVyYXRlZCBsb2NhbCBkYXRhOicsIHJlbW92ZWRQYXRocy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0KTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiByZWxhdGl2ZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZE1vdW50RGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVmYXVsdFBhdGhzID0gZ2VuZXJhdGVkU3FsaXRlRGlyTmFtZXMubWFwKChkaXJOYW1lKSA9PiBwYXRoLmpvaW4oZGlyTmFtZSwgJ21vdW50JykpO1xuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIGNvbnN0IGFic29sdXRlRGlyUGF0aCA9IHBhdGguZGlybmFtZShkYlBhdGgpO1xuICBpZiAocGF0aC5iYXNlbmFtZShhYnNvbHV0ZURpclBhdGgpICE9PSAnbW91bnQnIHx8ICFpc1BhdGhJbnNpZGVQcm9qZWN0KHByb2plY3QsIGFic29sdXRlRGlyUGF0aCkpIHtcbiAgICByZXR1cm4gZGVmYXVsdFBhdGhzO1xuICB9XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBhYnNvbHV0ZURpclBhdGgpO1xuICBpZiAoIXJlbGF0aXZlUGF0aCkgcmV0dXJuIGRlZmF1bHRQYXRocztcblxuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmRlZmF1bHRQYXRocywgcmVsYXRpdmVQYXRoXSldO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlcyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZW1vdmVkUGF0aHMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3QpLFxuICAgIHJlbW92ZUVudkdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3QpLFxuICBdKTtcbiAgcmV0dXJuIHJlbW92ZWRQYXRocy5mbGF0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzSW5EZWZhdWx0RGlycyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkaXJQYXRocyA9IGF3YWl0IGdldEdlbmVyYXRlZFNxbGl0ZURpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHMgPSBhd2FpdCBQcm9taXNlLmFsbChkaXJQYXRocy5tYXAoKGRpclBhdGgpID0+IHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzSW5EaXIocHJvamVjdCwgZGlyUGF0aCkpKTtcbiAgcmV0dXJuIHJlbW92ZWRQYXRocy5mbGF0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEdlbmVyYXRlZFNxbGl0ZURpclBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gZ2VuZXJhdGVkU3FsaXRlRGlyTmFtZXMubWFwKChkaXJOYW1lKSA9PiBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBkaXJOYW1lKSk7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChkaXJQYXRocy5tYXAoKGRpclBhdGgpID0+IGlzRGlyZWN0b3J5KGRpclBhdGgpKSk7XG4gIHJldHVybiBkaXJQYXRocy5maWx0ZXIoKF8sIGluZGV4KSA9PiByZXN1bHRzW2luZGV4XSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUVudkdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRiRmlsZVBhdGhzID0gZ2V0RW52R2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGJGaWxlUGF0aCBvZiBkYkZpbGVQYXRocykge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0UGF0aCBvZiBnZXRTcWxpdGVGaWxlRmFtaWx5UGF0aHMoZGJGaWxlUGF0aCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGlzRmlsZSh0YXJnZXRQYXRoKSkpIGNvbnRpbnVlO1xuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0YXJnZXRQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgcmVtb3ZlZFBhdGhzLnB1c2gocGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHRhcmdldFBhdGgpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0RW52R2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlRGJQYXRoID0gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCB8fCAhYWJzb2x1dGVEYlBhdGgpIHJldHVybiBbXTtcblxuICBjb25zdCBmaWxlUGF0aHMgPSBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKVxuICAgID8gW2RiUGF0aF1cbiAgICA6IFthYnNvbHV0ZURiUGF0aCwgLi4uZ2VuZXJhdGVkU3FsaXRlRGlyTmFtZXMubWFwKChkaXJOYW1lKSA9PiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkaXJOYW1lLCBkYlBhdGgpKV07XG4gIHJldHVybiBbLi4ubmV3IFNldChmaWxlUGF0aHMpXS5maWx0ZXIoKGZpbGVQYXRoKSA9PiBpc0dlbmVyYXRlZFNxbGl0ZUZpbGVQYXRoU2FmZShwcm9qZWN0LCBmaWxlUGF0aCkpO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFNxbGl0ZUZpbGVQYXRoU2FmZShwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1BhdGhJbnNpZGVQcm9qZWN0KHByb2plY3QsIGZpbGVQYXRoKSB8fCBpc0RvY2tlckdlbmVyYXRlZERhdGFGaWxlUGF0aChwcm9qZWN0LCBmaWxlUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZG9ja2VyR2VuZXJhdGVkRGF0YURpclBhdGhzLnNvbWUoKGRpclBhdGgpID0+IHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gcmVsYXRpdmVQYXRoICE9PSAnJyAmJiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgZGJGaWxlUGF0aCxcbiAgICBgJHtkYkZpbGVQYXRofS1qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS1zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LXdhbGAsXG4gICAgYCR7ZGJGaWxlUGF0aH0uam91cm5hbGAsXG4gICAgYCR7ZGJGaWxlUGF0aH0uc2htYCxcbiAgICBgJHtkYkZpbGVQYXRofS53YWxgLFxuICBdO1xufVxuXG5mdW5jdGlvbiBpc1BhdGhJbnNpZGVQcm9qZWN0KHByb2plY3Q6IFByb2plY3QsIHRhcmdldFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCk7XG4gIC8vIGBzdGFydHNXaXRoKCcuLicpYCB3b3VsZCByZWplY3QgcHJvamVjdC1sb2NhbCBuYW1lcyBzdWNoIGFzIGAuLmNhY2hlYC5cbiAgcmV0dXJuIHJlbGF0aXZlUGF0aCA9PT0gJycgfHwgKHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoYC4uJHtwYXRoLnNlcH1gKSk7XG59XG5cbmZ1bmN0aW9uIGlzRG9ja2VyRW5hYmxlZChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXByb2plY3QuZW52LldCX0RPQ0tFUiAmJiBwcm9qZWN0LmVudi5XQl9ET0NLRVIgIT09ICcwJyAmJiBwcm9qZWN0LmVudi5XQl9ET0NLRVIgIT09ICdmYWxzZSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZmlsZVBhdGgpO1xuICAgIHJldHVybiBzdGF0LmlzRmlsZSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNEaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZGlyUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNEaXJlY3RvcnkoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzSW5EaXIocHJvamVjdDogUHJvamVjdCwgZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IHNxbGl0ZUZpbGVOYW1lcyA9IGRpcmVudHNcbiAgICAuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBzcWxpdGVGaWxlUGF0dGVybi50ZXN0KGRpcmVudC5uYW1lKSlcbiAgICAubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoc3FsaXRlRmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSksIHsgZm9yY2U6IHRydWUgfSkpKTtcblxuICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgZGlyUGF0aCk7XG4gIHJldHVybiBzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5qb2luKHJlbGF0aXZlRGlyUGF0aCwgZmlsZU5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcnVuRG9ja2VyQ2xlYW51cFNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGlmICghaXNEb2NrZXJFbmFibGVkKHByb2plY3QpKSByZXR1cm47XG5cbiAgY29uc3Qgc2NyaXB0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdiYXNoJywgJ2NsZWFudXAuc2gnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNjcmlwdFBhdGgpKSByZXR1cm47XG5cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2Jhc2gnLCBbc2NyaXB0UGF0aCwgJy0ta2VlcC1zY3JpcHRzJ10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJHtwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgc2NyaXB0UGF0aCl9YCk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZU9ybSwgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGREcml6emxlS2l0Q29tbWFuZCwgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBhbGlhc2VzOiBbJ2RiJ10sXG4gIGRlc2NyaWJlOlxuICAgIFwiUnVuIGRhdGFiYXNlIGNvbW1hbmRzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIFByaXNtYS4gRHJpenpsZSBwcm9qZWN0cyB1c2UgZHJpenpsZS1raXQuIEV4YW1wbGU6IHdiIHByaXNtYSBtaWdyYXRlLWRldiAtLSAtLW5hbWUgaW5pdFwiLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChnZW5lcmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnL2V0Yy9saXRlc3RyZWFtLnltbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyOiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoYWxsUHJvamVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ3JlYXRpbmcgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZvciBtdWx0aXBsZSBwcm9qZWN0cyBhdCBvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0aGV5IHdvdWxkIG92ZXJ3cml0ZSBlYWNoIG90aGVyLidcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QsIG9ybSwgYXJndi5vdXRwdXQpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZ2VuZXJhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2dlbmVyYXRlJyxcbiAgZGVzY3JpYmU6ICdHZW5lcmF0ZSBPUk0gY2xpZW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZ2VuZXJhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5nZW5lcmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db25maWdCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBjb25maWc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBsaXN0QmFja3Vwc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyOiBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGxpc3QtYmFja3VwcycsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmxpc3RCYWNrdXBzKHByb2plY3QsIGFyZ3YuY29uZmlnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdjaGVjay1pZGVtcG90ZW5jeSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgbWlncmF0aW9uIGNvbW1hbmQgdHdpY2UgdG8gY29uZmlybSBpdCBpcyBpZGVtcG90ZW50LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbWlncmF0ZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXI6IG1pZ3JhdGVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnY2hlY2staWRlbXBvdGVuY3knXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvcm1TY3JpcHRzID0gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24od2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIG9ybVNjcmlwdHMubWlncmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmIChzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3QsIGFyZ3YuY2hlY2tJZGVtcG90ZW5jeSkpIHtcbiAgICAgICAgaWYgKGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3QpKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgaWRlbXBvdGVuY3kgY2hlY2sgZm9yICR7cHJvamVjdC5uYW1lfSBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50LmApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgb3JtU2NyaXB0cy5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENoZWNrSWRlbXBvdGVuY3kocHJvamVjdDogUHJvamVjdCwgY2hlY2tJZGVtcG90ZW5jeTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tJZGVtcG90ZW5jeSA/PyBpc0RvY2tlckVuYWJsZWQocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGlzRG9ja2VyRW5hYmxlZChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXByb2plY3QuZW52LldCX0RPQ0tFUiAmJiBwcm9qZWN0LmVudi5XQl9ET0NLRVIgIT09ICcwJyAmJiBwcm9qZWN0LmVudi5XQl9ET0NLRVIgIT09ICdmYWxzZSc7XG59XG5cbmZ1bmN0aW9uIGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICdwcm9kdWN0aW9uJyk7XG59XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4ubGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxkcml6emxlfHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZScsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXJndi5vdXRwdXQgPz8gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdCwgb3JtKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXN0b3JlKHByb2plY3QsIG91dHB1dCwgYXJndi5jb25maWcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSkpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHpcbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6XG4gICAgXCJQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gdGhlIGRldGVjdGVkIE9STSBhcyBpcy4gQWRkaXRpb25hbCBQcmlzbWEgZmxhZ3MgY2FuIGFsc28gYmUgZm9yd2FyZGVkIGFmdGVyICctLScuXCIsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoYGRiICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBjb21tYW5kID0gb3JtID09PSAncHJpc21hJyA/IGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gIDogYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBmdWxsQ29tbWFuZCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24od2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGNvbW1hbmQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIE1ha2UgRHJpenpsZSBjb21tYW5kcyB3b3JrIG9uIENsb3VkZmxhcmUgRDEgcHJvamVjdHMgYnkgcG9pbnRpbmcgREFUQUJBU0VfVVJMXG4gKiBhdCB0aGUgbG9jYWwgbWluaWZsYXJlIEQxIFNRTGl0ZSBmaWxlLlxuICovXG5mdW5jdGlvbiB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybTogRGF0YWJhc2VPcm0sIHByb2plY3Q6IFByb2plY3QsIHNjcmlwdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ2RyaXp6bGUnID8gd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdCwgc2NyaXB0KSA6IHNjcmlwdDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0OiBQcm9qZWN0LCBvcm06IERhdGFiYXNlT3JtLCBjb25maWdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0TGl0ZXN0cmVhbURiUGF0aChwcm9qZWN0LCBvcm0pO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZyA9IGBzbmFwc2hvdDpcbiAgaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICByZXRlbnRpb246IDcyaCAjIEtlZXAgYmFja3VwcyBmb3IgMyBkYXlzXG5kYnM6XG4gIC0gcGF0aDogJHtkYlBhdGh9XG4gICAgYnVzeS10aW1lb3V0OiA1c1xuICAgIGNoZWNrcG9pbnQtaW50ZXJ2YWw6IDFtXG4gICAgcmVwbGljYTpcbiAgICAgIHR5cGU6IHMzXG4gICAgICBlbmRwb2ludDogaHR0cHM6Ly8ke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRH0ucjIuY2xvdWRmbGFyZXN0b3JhZ2UuY29tXG4gICAgICBidWNrZXQ6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRX1cbiAgICAgIGFjY2Vzcy1rZXktaWQ6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEfVxuICAgICAgc2VjcmV0LWFjY2Vzcy1rZXk6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWX1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDFtXG5gO1xuXG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBsaXRlc3RyZWFtQ29uZmlnKTtcbiAgICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCAke2NvbmZpZ1BhdGh9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlICR7Y29uZmlnUGF0aH06ICR7cmVhc29ufWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0UmVzdG9yZU91dHB1dChwcm9qZWN0OiBQcm9qZWN0LCBvcm06IERhdGFiYXNlT3JtKTogc3RyaW5nIHtcbiAgaWYgKG9ybSA9PT0gJ3ByaXNtYScpXG4gICAgcmV0dXJuIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMyc7XG4gIHJldHVybiAnZHJpenpsZS9yZXN0b3JlZC5zcWxpdGUzJztcbn1cblxuZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbURiUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBvcm06IERhdGFiYXNlT3JtKTogc3RyaW5nIHtcbiAgaWYgKG9ybSA9PT0gJ3ByaXNtYScpIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIHJldHVybiBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGIgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnIGZvciBEcml6emxlIHJlcXVpcmVzIGZpbGU6IERBVEFCQVNFX1VSTC4nKTtcbiAgfVxuICByZXR1cm4gZGJQYXRoO1xufVxuXG5pbnRlcmZhY2UgRGF0YWJhc2VPcm1Qcm9qZWN0IHtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAgb3JtOiBEYXRhYmFzZU9ybTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3JtPzogRGF0YWJhc2VPcm0pOiBQcm9taXNlPERhdGFiYXNlT3JtUHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgLm1hcCgocHJvamVjdCkgPT4gKHByb2plY3QuZGF0YWJhc2VPcm0gPyB7IHByb2plY3QsIG9ybTogcHJvamVjdC5kYXRhYmFzZU9ybSB9IDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKChwcm9qZWN0KTogcHJvamVjdCBpcyBEYXRhYmFzZU9ybVByb2plY3QgPT4gISFwcm9qZWN0ICYmICghb3JtIHx8IHByb2plY3Qub3JtID09PSBvcm0pKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKG9ybSA/IGBObyAke29ybX0gcHJvamVjdCBmb3VuZC5gIDogJ05vIHN1cHBvcnRlZCBkYXRhYmFzZSBPUk0gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybTogRGF0YWJhc2VPcm0pOiB0eXBlb2YgcHJpc21hU2NyaXB0cyB8IHR5cGVvZiBkcml6emxlU2NyaXB0cyB7XG4gIHJldHVybiBvcm0gPT09ICdwcmlzbWEnID8gcHJpc21hU2NyaXB0cyA6IGRyaXp6bGVTY3JpcHRzO1xufVxuXG5mdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIHByb2plY3RzOiBEYXRhYmFzZU9ybVByb2plY3RbXVxuKTogR2VuZXJhdG9yPERhdGFiYXNlT3JtUHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBjb25zdCBvcm1Qcm9qZWN0QnlQcm9qZWN0ID0gbmV3IE1hcChwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IFtwcm9qZWN0LnByb2plY3QsIHByb2plY3RdKSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoXG4gICAgY29tbWFuZE5hbWUsXG4gICAgcHJvamVjdHMubWFwKCh7IHByb2plY3QgfSkgPT4gcHJvamVjdClcbiAgKSkge1xuICAgIGNvbnN0IG9ybVByb2plY3QgPSBvcm1Qcm9qZWN0QnlQcm9qZWN0LmdldChwcm9qZWN0KTtcbiAgICBpZiAoIW9ybVByb2plY3QpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRldGVjdCBkYXRhYmFzZSBPUk0gZm9yICR7cHJvamVjdC5uYW1lfS5gKTtcblxuICAgIHlpZWxkIG9ybVByb2plY3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBPUk0gY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJy0tJyxcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IEFycmF5LmlzQXJyYXkoYXJndlsnLS0nXSkgPyBhcmd2WyctLSddLm1hcChTdHJpbmcpIDogW107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4udW5rbm93bk9wdGlvbnMsIC4uLnBhc3N0aHJvdWdoQXJnc10pO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIG9uU2lnbmFsOiAoc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW50ZXJmYWNlIFByaXZhdGVQYWNrYWdlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBzb3VyY2VEaXJQYXRoOiBzdHJpbmc7XG4gIHRhcmdldERpclBhdGg6IHN0cmluZztcbn1cblxuY29uc3QgZGVwZW5kZW5jeUtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3QgcHJpdmF0ZUdpdERlcGVuZGVuY3lQYXR0ZXJuID0gL15naXRAZ2l0aHViXFwuY29tOig/OldpbGxCb29zdGVyfFdpbGxCb29zdGVyTGFiKVxcL1teLyNdKyg/OlxcLmdpdCk/KD86Iy4qKT8kLztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ291dC1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdEaXJlY3RvcnkgdG8gY29weSBwcml2YXRlIHBhY2thZ2VzIGludG8nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICdAd2lsbGJvb3N0ZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx7IGRyeVJ1bj86IGJvb2xlYW4gfSwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAtcHJpdmF0ZS1wYWNrYWdlcycsXG4gIGRlc2NyaWJlOiAnQ29weSBwcml2YXRlIGdpdCBkZXBlbmRlbmNpZXMgZm9yIERvY2tlciBidWlsZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0cy5yb290LmRpclBhdGgsIGFyZ3Yub3V0RGlyKTtcbiAgICBhc3NlcnRTdWJkaXJlY3RvcnkocHJvamVjdHMucm9vdC5kaXJQYXRoLCBvdXREaXJQYXRoKTtcbiAgICBjb25zdCBjb3BpZWRQYWNrYWdlcyA9IGF3YWl0IGNvbGxlY3RQcml2YXRlUGFja2FnZXMocHJvamVjdHMucm9vdC5kaXJQYXRoLCBwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLCBvdXREaXJQYXRoKTtcblxuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnREcnlSdW5SZXN1bHQob3V0RGlyUGF0aCwgY29waWVkUGFja2FnZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKG91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihvdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIGNvcGllZFBhY2thZ2VzLnZhbHVlcygpKSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5jcChwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoLCBwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoLCB7XG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIGZpbHRlcjogKHNyYykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5yZWxhdGl2ZShwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoLCBzcmMpLnNwbGl0KHBhdGguc2VwKTtcbiAgICAgICAgICByZXR1cm4gIXNlZ21lbnRzLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSAmJiAhc2VnbWVudHMuaW5jbHVkZXMoJy5naXQnKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgQ29waWVkICR7cHJpdmF0ZVBhY2thZ2UubmFtZX0gdG8gJHtwYXRoLnJlbGF0aXZlKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCByZXBsYWNlUHJpdmF0ZUdpdERlcGVuZGVuY2llcyhvdXREaXJQYXRoLCBjb3BpZWRQYWNrYWdlcyk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICByb290UGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBvdXREaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8TWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+PiB7XG4gIGNvbnN0IGNvcGllZFBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICAvLyBTdGFydCBmcm9tIHRoZSByb290IHBhY2thZ2UuanNvbiBieSBkZXNpZ247IHdvcmtzcGFjZSBwYWNrYWdlIGRlcGVuZGVuY2llcyBhcmUgb3V0c2lkZSB0aGlzIGNvbW1hbmQncyB0YXJnZXQuXG4gIGNvbnN0IHBhY2thZ2VOYW1lc1RvQ29weSA9IGZpbmRQcml2YXRlR2l0RGVwZW5kZW5jeU5hbWVzKHJvb3RQYWNrYWdlSnNvbik7XG4gIGNvbnN0IHF1ZXVlZFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQocGFja2FnZU5hbWVzVG9Db3B5KTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGFja2FnZU5hbWVzVG9Db3B5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVzVG9Db3B5W2luZGV4XTtcbiAgICBpZiAoIXBhY2thZ2VOYW1lKSBjb250aW51ZTtcbiAgICBpZiAoY29waWVkUGFja2FnZXMuaGFzKHBhY2thZ2VOYW1lKSkgY29udGludWU7XG5cbiAgICBjb25zdCBwcml2YXRlUGFja2FnZSA9IGJ1aWxkUHJpdmF0ZVBhY2thZ2Uocm9vdERpclBhdGgsIG91dERpclBhdGgsIHBhY2thZ2VOYW1lKTtcbiAgICBjb3BpZWRQYWNrYWdlcy5zZXQocGFja2FnZU5hbWUsIHByaXZhdGVQYWNrYWdlKTtcblxuICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgZm9yIChjb25zdCBuZXN0ZWRQYWNrYWdlTmFtZSBvZiBmaW5kUHJpdmF0ZUdpdERlcGVuZGVuY3lOYW1lcyhwYWNrYWdlSnNvbikpIHtcbiAgICAgICAgaWYgKCFxdWV1ZWRQYWNrYWdlTmFtZXMuaGFzKG5lc3RlZFBhY2thZ2VOYW1lKSkge1xuICAgICAgICAgIHF1ZXVlZFBhY2thZ2VOYW1lcy5hZGQobmVzdGVkUGFja2FnZU5hbWUpO1xuICAgICAgICAgIHBhY2thZ2VOYW1lc1RvQ29weS5wdXNoKG5lc3RlZFBhY2thZ2VOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb3BpZWRQYWNrYWdlcztcbn1cblxuZnVuY3Rpb24gYXNzZXJ0U3ViZGlyZWN0b3J5KHJvb3REaXJQYXRoOiBzdHJpbmcsIG91dERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKTtcbiAgaWYgKHJlbGF0aXZlUGF0aCAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpKSByZXR1cm47XG5cbiAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE91dHB1dCBkaXJlY3RvcnkgbXVzdCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCByb290OiAke291dERpclBhdGh9YCkpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJpdmF0ZVBhY2thZ2Uocm9vdERpclBhdGg6IHN0cmluZywgb3V0RGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJpdmF0ZVBhY2thZ2Uge1xuICBjb25zdCB1bnNjb3BlZFBhY2thZ2VOYW1lID0gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTtcbiAgY29uc3Qgc291cmNlRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICdAd2lsbGJvb3N0ZXInLCB1bnNjb3BlZFBhY2thZ2VOYW1lKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzb3VyY2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJHtwYWNrYWdlTmFtZX0gKCR7c291cmNlRGlyUGF0aH0pYCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6IHBhY2thZ2VOYW1lLFxuICAgIHNvdXJjZURpclBhdGgsXG4gICAgdGFyZ2V0RGlyUGF0aDogcGF0aC5qb2luKG91dERpclBhdGgsIHVuc2NvcGVkUGFja2FnZU5hbWUpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kUHJpdmF0ZUdpdERlcGVuZGVuY3lOYW1lcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBpZiAoIWlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpKSBjb250aW51ZTtcblxuICAgICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgZ2l0IGRlcGVuZGVuY3kgbXVzdCBiZSBhbiBAd2lsbGJvb3N0ZXIgcGFja2FnZTogJHtuYW1lfWApO1xuICAgICAgfVxuICAgICAgcGFja2FnZU5hbWVzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChwYWNrYWdlTmFtZXMpXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZVByaXZhdGVHaXREZXBlbmRlbmNpZXMoXG4gIG91dERpclBhdGg6IHN0cmluZyxcbiAgY29waWVkUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyhwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIGlmICghcmVwbGFjZVBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uUGF0aCwgcGFja2FnZUpzb24sIGNvcGllZFBhY2thZ2VzKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIGAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCB1bmRlZmluZWQsIDIpfVxcbmAsICd1dGY4Jyk7XG4gICAgICBjb25zb2xlLmluZm8oYFJld3JvdGUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgaW4gJHtwYXRoLnJlbGF0aXZlKG91dERpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25QYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgY29waWVkUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPlxuKTogYm9vbGVhbiB7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lLZXlzKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb25ba2V5XTtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwZW5kZW5jaWVzKSkge1xuICAgICAgaWYgKCFpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSkgY29udGludWU7XG4gICAgICBjb25zdCB0YXJnZXRQYWNrYWdlID0gY29waWVkUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCF0YXJnZXRQYWNrYWdlKSBjb250aW51ZTtcblxuICAgICAgZGVwZW5kZW5jaWVzW25hbWVdID0gYGZpbGU6JHtwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCB0YXJnZXRQYWNrYWdlLnRhcmdldERpclBhdGgpfWA7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblBhdGhzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoZGlyZW50Lm5hbWUgPT09ICdub2RlX21vZHVsZXMnIHx8IGRpcmVudC5uYW1lID09PSAnLmdpdCcpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHBhY2thZ2VKc29uUGF0aHMucHVzaCguLi4oYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoY2hpbGRQYXRoKSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUgPT09ICdwYWNrYWdlLmpzb24nKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goY2hpbGRQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IFByb21pc2U8UGFja2FnZUpzb24+IHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbn1cblxuZnVuY3Rpb24gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHByaXZhdGVHaXREZXBlbmRlbmN5UGF0dGVybi50ZXN0KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgvXkB3aWxsYm9vc3RlclxcLy8sICcnKTtcbn1cblxuZnVuY3Rpb24gcHJpbnREcnlSdW5SZXN1bHQob3V0RGlyUGF0aDogc3RyaW5nLCBjb3BpZWRQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhgW2RyeS1ydW5dIFdvdWxkIHJlY3JlYXRlICR7b3V0RGlyUGF0aH1gKTtcbiAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBjb3BpZWRQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgW2RyeS1ydW5dIFdvdWxkIGNvcHkgJHtwcml2YXRlUGFja2FnZS5uYW1lfTogJHtwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRofWApO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhgW2RyeS1ydW5dIFdvdWxkIHJld3JpdGUgY29waWVkIHByaXZhdGUgZ2l0IGRlcGVuZGVuY2llcyB0byBmaWxlOi4uLzxuYW1lPmApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgJy0tJz86IHN0cmluZ1tdO1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbiAgc2lsZW50PzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7ICctLSc/OiBzdHJpbmdbXSB9XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZXZOdWxsKGFyZ3Y6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKGFyZ3YgYXMgeyBzaWxlbnQ6IGJvb2xlYW4gfSkuc2lsZW50ID8gYCA+IC9kZXYvbnVsbGAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZEltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICdZQVJOIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IG1pc2VBZ2VLZXlTZWNyZXRPcHRpb24gPSBwcm9qZWN0LmVudi5NSVNFX0FHRV9LRVlcbiAgICAgID8gJ1xcbiAgICAgICAgLS1zZWNyZXQgaWQ9bWlzZV9hZ2Vfa2V5LGVudj1NSVNFX0FHRV9LRVknXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIHg4Nl82NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0ke21pc2VBZ2VLZXlTZWNyZXRPcHRpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICBjb25zdCBtaXNlQWdlS2V5RW52T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZID8gJy0tZW52IE1JU0VfQUdFX0tFWSAnIDogJyc7XG4gICAgcmV0dXJuIGBkb2NrZXIgcnVuIC0tcm0gJHthbGxvY2F0ZVR0eSA/ICctaXQgJyA6ICcnfSR7bWlzZUFnZUtleUVudk9wdGlvbn0tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQge1xuICBmaW5kRDFNaWdyYXRpb25zRGlyUGF0aCxcbiAgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxuICB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXN0b21TdGFydFNjcmlwdFBhdGggPSBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0KTtcbiAgICBpZiAoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSB7XG4gICAgICBjb25zdCBzdGFydENvbW1hbmQgPVxuICAgICAgICBgJHtidWlsZFNoZWxsQ29tbWFuZChbJ2Jhc2gnLCBjdXN0b21TdGFydFNjcmlwdFBhdGhdKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAgIC8vIEEgc3RhcnQgc2NyaXB0IGZvdW5kIGF0IHRoZSBtb25vcmVwbyByb290IChjZi4gUHJvamVjdC5maW5kRmlsZSkgaXMgd3JpdHRlbiB0byBydW4gZnJvbVxuICAgICAgLy8gdGhlIHJvb3QsIGxpa2UgRG9ja2VyJ3MgV09SS0RJUiwgc28gaXRzIGN3ZCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBzY3JpcHRzLy5cbiAgICAgIGNvbnN0IHNjcmlwdFJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShjdXN0b21TdGFydFNjcmlwdFBhdGgpKTtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgc2NyaXB0Um9vdERpclBhdGggPT09IHByb2plY3QuZGlyUGF0aFxuICAgICAgICAgID8gc3RhcnRDb21tYW5kXG4gICAgICAgICAgOiBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIHNjcmlwdFJvb3REaXJQYXRoXSl9ICYmICR7c3RhcnRDb21tYW5kfSlgLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZWNvc3lzdGVtQ29uZmlnUGF0aCA9IGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gZWNvc3lzdGVtQ29uZmlnUGF0aFxuICAgICAgPyBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXVxuICAgICAgOiB0aGlzLmJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBjb21tYW5kcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAvLyBUZXN0LWVudmlyb25tZW50IHdyYW5nbGVyIHN0YXRlIGlzIGRpc3Bvc2FibGU7IHdpcGUgaXQgZW50aXJlbHkgKG5vdCBqdXN0IEQxKSBiZWZvcmVcbiAgICAvLyBtaWdyYXRpbmcsIHNpbmNlIHN0YWxlIEtWIGNhY2hlIGVudHJpZXMgb3IgRHVyYWJsZSBPYmplY3Qgc3RvcmFnZSBjYW4gYnJlYWsgZTJlIHRlc3RzLlxuICAgIGNvbnN0IHdyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMgPVxuICAgICAgaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpXG4gICAgICAgID8gW2BybSAtUmYgXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImBdXG4gICAgICAgIDogW107XG4gICAgLy8gQSBwcm9qZWN0IHdob3NlIEQxIGJpbmRpbmdzIGNhcnJ5IHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGFwcGxpZXMgdGhlbSB3aXRoIHdyYW5nbGVyXG4gICAgLy8gKHNlZSBXb3JrZXJzU2NyaXB0cyAvIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKS4gUnVubmluZyBkcml6emxlLWtpdCBtaWdyYXRlIGFnYWluc3RcbiAgICAvLyB0aGUgc2FtZSBsb2NhbCBEMSB3b3VsZCBhcHBseSB0aGUgc2FtZSBTUUwgdHdpY2Ug4oCUIGRyaXp6bGUncyBnZW5lcmF0ZWQgc3RhdGVtZW50cyBhcmUgbm90XG4gICAgLy8gaWRlbXBvdGVudCAoYENSRUFURSBJTkRFWGAgd2l0aG91dCBJRiBOT1QgRVhJU1RTKSDigJQgc28gZHJpenpsZSBzdGF5cyBPUk0tb25seSB0aGVyZS5cbiAgICBjb25zdCBtaWdyYXRlc0QxV2l0aFdyYW5nbGVyID0gISFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kcyA9IFtcbiAgICAgIC4uLndyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMsXG4gICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc0RyaXp6bGUgJiYgIW1pZ3JhdGVzRDFXaXRoV3JhbmdsZXJcbiAgICAgICAgPyBbd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwocHJvamVjdCwgZHJpenpsZVNjcmlwdHMubWlncmF0ZUZvclN0YXJ0KHByb2plY3QpKV1cbiAgICAgICAgOiBbXSksXG4gICAgXTtcbiAgICAvLyBTcGxpdHRpbmcgbWF5IGN1dCB0aHJvdWdoIGEgYChjZCDigKYgJiYg4oCmKWAgc3Vic2hlbGwsIGJ1dCByZWpvaW5pbmcgd2l0aCAnICYmICcgYW5kIHBlci1waWVjZVxuICAgIC8vIHJlZGlyZWN0cyBrZWVwcyB0aGUgc2NyaXB0IHZhbGlkLCBhbmQgd2ItZ2VuZXJhdGVkIHBhdGhzIG5ldmVyIGNvbnRhaW4gJyYmJy5cbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLmZsYXRNYXAoKGNtZCkgPT4gY21kLnNwbGl0KCcmJicpKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCBwbGF5d3JpZ2h0Q29tbWFuZCA9IGJ1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cywgYXJndi5iYWlsLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiB0ZXN0IChlMmUpIGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgJ3J1bicsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAnLS1wYXNzV2l0aE5vVGVzdHMnLFxuICAgICAgICAnLS1hbGxvd09ubHknLFxuICAgICAgICAnLS13YXRjaD1mYWxzZScsXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbD0xJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdidW4nLFxuICAgICAgICAndGVzdCcsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWwnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgOTAwMDAgLWkgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3RcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9qZWN0LmZpbmRGaWxlKCdzY3JpcHRzL3N0YXJ0LXByb2R1Y3Rpb24uc2gnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChcbiAgcGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdLFxuICB0YXJnZXRzOiBUZXN0QXJndlsndGFyZ2V0cyddLFxuICBiYWlsPzogYm9vbGVhbixcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBbJ0JVTicsICdwbGF5d3JpZ2h0J107XG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXRzID0gdGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gIGlmIChwbGF5d3JpZ2h0QXJnc1swXSAhPT0gJ3Rlc3QnIHx8ICFub3JtYWxpemVkVGFyZ2V0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFsuLi5iYXNlLCAuLi5wbGF5d3JpZ2h0QXJncywgLi4uZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NdLCBiYWlsKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3QgPSBwbGF5d3JpZ2h0QXJncy5zbGljZSgxKTtcbiAgY29uc3QgZXhwbGljaXRUYXJnZXRJbmRleGVzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMocmVzdCk7XG4gIGNvbnN0IHJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQgPVxuICAgIGV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5sZW5ndGggPT09IDAgPyByZXN0IDogcmVzdC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhZXhwbGljaXRUYXJnZXRJbmRleGVzLmluY2x1ZGVzKGluZGV4KSk7XG4gIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihcbiAgICBbLi4uYmFzZSwgJ3Rlc3QnLCAuLi5ub3JtYWxpemVkVGFyZ2V0cywgLi4ucmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCwgLi4uZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NdLFxuICAgIGJhaWxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oY29tbWFuZEFyZ3M6IHN0cmluZ1tdLCBiYWlsPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHBsYXl3cmlnaHRJbmRleCA9IGNvbW1hbmRBcmdzLmluZGV4T2YoJ3BsYXl3cmlnaHQnKTtcbiAgY29uc3QgaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQgPSBwbGF5d3JpZ2h0SW5kZXggIT09IC0xICYmIGNvbW1hbmRBcmdzW3BsYXl3cmlnaHRJbmRleCArIDFdID09PSAndGVzdCc7XG4gIGlmICghYmFpbCB8fCAhaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIGlmIChjb21tYW5kQXJncy5zb21lKChhcmcpID0+IGFyZyA9PT0gJy0tbWF4LWZhaWx1cmVzJyB8fCBhcmcuc3RhcnRzV2l0aCgnLS1tYXgtZmFpbHVyZXM9JykpKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLmNvbW1hbmRBcmdzLCAnLS1tYXgtZmFpbHVyZXM9MSddKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGFyZ3M6IHN0cmluZ1tdKTogbnVtYmVyW10ge1xuICBsZXQgcGVuZGluZ1ZhbHVlTW9kZTogJ29wdGlvbmFsJyB8ICdyZXF1aXJlZCcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHRhcmdldEluZGV4ZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGFyZ10gb2YgYXJncy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSkge1xuICAgICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUgPT09ICdyZXF1aXJlZCcgfHwgIWFyZy5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgIHJldHVybiBbLi4udGFyZ2V0SW5kZXhlcywgLi4uYXJncy5zbGljZShpbmRleCArIDEpLm1hcCgoXywgb2Zmc2V0KSA9PiBpbmRleCArIDEgKyBvZmZzZXQpXTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICBpZiAoYXJnLmluY2x1ZGVzKCc9JykpIGNvbnRpbnVlO1xuICAgICAgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAncmVxdWlyZWQnO1xuICAgICAgfSBlbHNlIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ29wdGlvbmFsJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0nKSAmJiBhcmcgIT09ICctJykge1xuICAgICAgY29uc3Qgc2hvcnRPcHRpb24gPSBhcmcuc2xpY2UoMCwgMik7XG4gICAgICBpZiAoYXJnLmxlbmd0aCA9PT0gMiAmJiBQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoc2hvcnRPcHRpb24pKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAncmVxdWlyZWQnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRhcmdldEluZGV4ZXMucHVzaChpbmRleCk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0SW5kZXhlcztcbn1cblxuY29uc3QgUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFtcbiAgJy0tYnJvd3NlcicsXG4gICctLWNvbmZpZycsXG4gICctLWdyZXAnLFxuICAnLS1ncmVwLWludmVydCcsXG4gICctLWdsb2JhbC10aW1lb3V0JyxcbiAgJy0tbWF4LWZhaWx1cmVzJyxcbiAgJy0tb3V0cHV0JyxcbiAgJy0tcHJvamVjdCcsXG4gICctLXJlcGVhdC1lYWNoJyxcbiAgJy0tcmVwb3J0ZXInLFxuICAnLS1yZXRyaWVzJyxcbiAgJy0tc2hhcmQnLFxuICAnLS10ZXN0LWxpc3QnLFxuICAnLS10ZXN0LWxpc3QtaW52ZXJ0JyxcbiAgJy0tdGltZW91dCcsXG4gICctLXRyYWNlJyxcbiAgJy0tdHNjb25maWcnLFxuICAnLS11aS1ob3N0JyxcbiAgJy0tdWktcG9ydCcsXG4gICctLXVpLXRpdGxlJyxcbiAgJy0td29ya2VycycsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMgPSBuZXcgU2V0KFtcbiAgJy0tb25seS1jaGFuZ2VkJyxcbiAgJy0tdXBkYXRlLXNuYXBzaG90cycsXG4gICctLXVwZGF0ZS1zb3VyY2UtbWV0aG9kJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoWyctYycsICctZycsICctaiddKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzLCB0eXBlIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBjbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXTtcbiAgICBjb25zdCB0ZXN0Q29tbWFuZCA9IHRoaXMudGVzdFVuaXQocHJvamVjdCwgeyAuLi5hcmd2LCB0YXJnZXRzOiBub3JtYWxpemVkVGFyZ2V0cyB9KTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiAke3Rlc3RDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBuZXh0IGRldiAtLXR1cmJvcGFjayAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW3Byb2plY3QuYnVpbGRDb21tYW5kLCBgWUFSTiBuZXh0IHN0YXJ0ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCldO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IFNFUlZFUl9MT0dfRklMRSA9ICdzZXJ2ZXIubG9nJztcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgU0VSVkVSX0xPR19GSUxFIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHZpbmV4dCAoTmV4dC5qcyBvbiBWaXRlKSBhcHBzIHRhcmdldGluZyBDbG91ZGZsYXJlIFdvcmtlcnMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpbmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICAvLyBVbmxpa2UgYG5leHQgZGV2YCwgVml0ZS1iYXNlZCB2aW5leHQgZG9lcyBub3QgcmVhZCB0aGUgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICBjb25zdCBkZXZDb21tYW5kID0gYFlBUk4gdmluZXh0IGRldiAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICAgIC8vIFRoZSBDbG91ZGZsYXJlIHZpdGUgcGx1Z2luIChtaW5pZmxhcmUpIHJlYWRzIHJ1bnRpbWUgdmFycyBvbmx5IGZyb20gYSAuZGV2LnZhcnMgZmlsZSxcbiAgICAvLyBzbyBpdCBtdXN0IGJlIHJlZ2VuZXJhdGVkIGZyb20gdGhlIHdiLW1hbmFnZWQgLmVudiBmaWxlcyBiZWZvcmUgc2VydmluZy5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICcuZGV2LnZhcnMnKV07XG4gICAgLy8gYHZpbmV4dCBkZXZgIChtaW5pZmxhcmUpIHN0YXJ0cyB3aXRoIGFuIGVtcHR5IGxvY2FsIEQxIGFuZCBhcHBsaWVzIG5vIG1pZ3JhdGlvbnMgaXRzZWxmO1xuICAgIC8vIHRoZSB0ZXN0IGVudmlyb25tZW50IHdpcGVzIGl0cyBzdGF0ZSBkaXJlY3RvcnksIHNvIGV2ZXJ5IHBhZ2Ugd291bGQgNTAwIHdpdGhvdXQgdGhpcy5cbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kID0gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSA/IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtaWdyYXRpb25Db21tYW5kKSBjb21tYW5kcy5wdXNoKG1pZ3JhdGlvbkNvbW1hbmQpO1xuICAgIHJldHVybiBbLi4uY29tbWFuZHMsIGRldkNvbW1hbmRdLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICAvLyBTZXJ2aW5nIHRoZSBidWlsdCB3b3JrZXIgc3RhcnRzIGZyb20gYW4gZW1wdHkgKG9yIHdpcGVkKSBsb2NhbCBEMSwgc28gd3JhbmdsZXItbmF0aXZlXG4gICAgLy8gbWlncmF0aW9ucyAoaWYgYW55KSBtdXN0IGJlIGFwcGxpZWQgZmlyc3Q7IGRyaXp6bGUvcHJpc21hIG1pZ3JhdGlvbnMgYXJlIGhhbmRsZWQgYnlcbiAgICAvLyBidWlsZFByb2R1Y3Rpb25Db21tYW5kLlxuICAgIGNvbnN0IGQxTWlncmF0aW9uc0NvbW1hbmQgPSBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KTtcbiAgICAvLyBgdmluZXh0IGJ1aWxkYCBlbWl0cyBhIHdvcmtlciBidW5kbGUgYW5kIGl0cyB3cmFuZ2xlciBjb25maWcgdW5kZXIgZGlzdC9zZXJ2ZXIsIHNvIHRoZVxuICAgIC8vIC5kZXYudmFycyBmaWxlIGV4cG9zaW5nIHdiLW1hbmFnZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3QgYmUgZ2VuZXJhdGVkIGFmdGVyIGJ1aWxkaW5nLlxuICAgIC8vIGAtLWxvY2FsLXVwc3RyZWFtYCBrZWVwcyByZXF1ZXN0IFVSTHMgb24gdGhlIGxvY2FsIGhvc3Q7IG90aGVyd2lzZSwgd3JhbmdsZXIgZGV2IHNpbXVsYXRlc1xuICAgIC8vIHRoZSBwcm9kdWN0aW9uIGN1c3RvbSBkb21haW4gZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyByb3V0ZXMuXG4gICAgcmV0dXJuIFtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnZGlzdC9zZXJ2ZXIvLmRldi52YXJzJyksXG4gICAgICAuLi4oZDFNaWdyYXRpb25zQ29tbWFuZCA/IFtkMU1pZ3JhdGlvbnNDb21tYW5kXSA6IFtdKSxcbiAgICAgIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKFxuICAgICAgICBgZGV2IC0tY29uZmlnIGRpc3Qvc2VydmVyL3dyYW5nbGVyLmpzb24gLS1pcCAxMjcuMC4wLjEgLS1wb3J0ICR7cG9ydH0gLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1sb2NhbC11cHN0cmVhbSBsb2NhbGhvc3Q6JHtwb3J0fSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXG4gICAgICApLFxuICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpbmV4dFNjcmlwdHMgPSBuZXcgVmluZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFZpdGUtYmFzZWQgYXBwcyB3aXRoIFBsYXl3cmlnaHQgZTJlIHRlc3RzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaXRlU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIHZpdGUgZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgWUFSTiB2aXRlIHByZXZpZXcgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgdml0ZVNjcmlwdHMgPSBuZXcgVml0ZVNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQsXG4gIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQsXG4gIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kLFxuICBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIsXG59IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBIdHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgcGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcHMgKGRldGVjdGVkIHZpYSBhIHdyYW5nbGVyXG4gKiBjb25maWcgZmlsZSB3aGVuIG5vIG90aGVyIGZyYW1ld29yayBtYXRjaGVzOyB2aW5leHQgYXBwcyBoYXZlIHRoZWlyIG93biBzY3JpcHRzKS5cbiAqIEV4dGVuZHMgSHR0cFNlcnZlclNjcmlwdHMgc28gdGhhdCBlMmUgdGVzdHMgcnVuIHZpYSB0aGUgdW5pdC10ZXN0IHJ1bm5lciBhZ2FpbnN0IHRoZSBydW5uaW5nXG4gKiB3b3JrZXIgd2hlbiB0aGUgcHJvamVjdCBoYXMgbm8gUGxheXdyaWdodCBjb25maWcuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFdvcmtlcnNTY3JpcHRzIGV4dGVuZHMgSHR0cFNlcnZlclNjcmlwdHMge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3QsIGFyZ3YpLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIC8vIHdyYW5nbGVyIGRldiBidW5kbGVzIHRoZSB3b3JrZXIgaXRzZWxmLCBzbyBubyBzZXBhcmF0ZSBidWlsZCBzdGVwIGlzIG5lZWRlZC5cbiAgICByZXR1cm4gdGhpcy5idWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICc4Nzg3JztcbiAgICBjb25zdCBzdGF0ZURpciA9IGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KTtcblxuICAgIC8vIFRoZXNlIGhlbHBlcnMgcmVhZCB0aGUgZGVmYXVsdC1uYW1lZCB3cmFuZ2xlciBjb25maWc7IHRoYXQgaXMgc2FmZSBiZWNhdXNlIHdvcmtlcnNTY3JpcHRzXG4gICAgLy8gaXRzZWxmIGlzIG9ubHkgc2VsZWN0ZWQgd2hlbiBzdWNoIGEgY29uZmlnIGZpbGUgZXhpc3RzIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICcuZGV2LnZhcnMnKV07XG4gICAgLy8gQXBwbHkgd3JhbmdsZXItbmF0aXZlIEQxIG1pZ3JhdGlvbnMgKGlmIGFueSkgc28gdGhlIGxvY2FsIGRhdGFiYXNlIG1hdGNoZXMgdGhlIGRlcGxveWVkIG9uZS5cbiAgICBjb25zdCBkMU1pZ3JhdGlvbnNDb21tYW5kID0gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKGQxTWlncmF0aW9uc0NvbW1hbmQpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goZDFNaWdyYXRpb25zQ29tbWFuZCk7XG4gICAgfVxuICAgIGNvbW1hbmRzLnB1c2goXG4gICAgICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChcbiAgICAgICAgYGRldiAtLWlwIDEyNy4wLjAuMSAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAtLXBlcnNpc3QtdG8gXCIke3N0YXRlRGlyfVwiICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBjb21tYW5kcztcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd29ya2Vyc1NjcmlwdHMgPSBuZXcgV29ya2Vyc1NjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnLCAnaG9ubyddO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aW5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHdvcmtlcnNTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vd29ya2Vyc1NjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IHRlc3QnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJTdGFydCBhcHAuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gdGhlIHVuZGVybHlpbmcgYXBwIGNvbW1hbmQuIEV4YW1wbGU6IHdiIHN0YXJ0IC0tIC0taG9zdCAwLjAuMC4wXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLm9wdGlvbnMoYnVpbGRlcikgYXMgQXJndjxcbiAgICAgIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4gICAgPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLnZpbmV4dCB8fCBkZXZEZXBzLnZpbmV4dCkge1xuICAgICAgICAvLyB2aW5leHQgYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyB0aGlzIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbiAgICAgICAgc2NyaXB0cyA9IHZpbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkge1xuICAgICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICAgIHNjcmlwdHMgPSB3b3JrZXJzU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aW5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHdvcmtlcnNTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vd29ya2Vyc1NjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0UnVuT3B0aW9ucyB7XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcilcbiAgICAgIC5wb3NpdGlvbmFsKCd0YXJnZXRzJywgYXJndW1lbnRzQnVpbGRlci50YXJnZXRzKSBhcyBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YsIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndik7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyh0ZXN0QXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAodGVzdEFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gdGVzdEFyZ3ZbJy0tJ10gPz8gW107XG4gIGNvbnN0IHsgc2hvdWxkUnVuRTJlLCBzaG91bGRSdW5Vbml0IH0gPSByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHModGVzdFRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy52aW5leHQgfHwgZGV2RGVwcy52aW5leHQpIHtcbiAgICAgIC8vIHZpbmV4dCBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIHRoaXMgY2hlY2sgbXVzdCBjb21lIGZpcnN0LlxuICAgICAgc2NyaXB0cyA9IHZpbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCkpIHtcbiAgICAgIC8vIFBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHA7IHZpbmV4dCBhcHBzIGFyZSBkZXRlY3RlZCBhYm92ZS5cbiAgICAgIHNjcmlwdHMgPSB3b3JrZXJzU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGNvbnN0IGRlZmF1bHRVbml0VGFyZ2V0cyA9IGdldERlZmF1bHRVbml0VGFyZ2V0cyhwcm9qZWN0KTtcbiAgICBpZiAoc2hvdWxkUnVuVW5pdCAmJiBkZWZhdWx0VW5pdFRhcmdldHMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB1bml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICAgICAgY29uc3QgdGFyZ2V0cyA9XG4gICAgICAgIHVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyB1bml0VGFyZ2V0cyA6IGRlZmF1bHRVbml0VGFyZ2V0cy5sZW5ndGggPiAwID8gZGVmYXVsdFVuaXRUYXJnZXRzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzIH07XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blVuaXRUZXN0Q29tbWFuZChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgdGVzdEFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgdGltZW91dDogdGVzdEFyZ3YudW5pdFRpbWVvdXQsXG4gICAgICB9KTtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNraXAgZTJlIHRlc3RzIGlmIG5vdCBuZWVkZWQgb3Igbm8gZTJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIXNob3VsZFJ1bkUyZSB8fCAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGlmIChzaG91bGRSdW5FMmUpIHdhcm5JZlBsYXl3cmlnaHRTcGVjc0FyZVVuZGlzY292ZXJhYmxlKHByb2plY3QpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0czogZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuXG4gICAgc3dpdGNoICh0ZXN0QXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBbJ2NvZGVnZW4nLCBgaHR0cDovL2xvY2FsaG9zdDoke3Byb2plY3QuZW52LlBPUlR9YF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgdGVzdEFyZ3YsIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogV2FybiB3aGVuIGEgcHJvamVjdCBoYXMgYSBQbGF5d3JpZ2h0IGNvbmZpZyBidXQgbm8gdGVzdC9lMmUgZGlyZWN0b3J5LlxuICogd2IgZGlzY292ZXJzIGUyZSB0ZXN0cyBvbmx5IHVuZGVyIHRlc3QvZTJlLywgc28gc3VjaCBwcm9qZWN0cyB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0aGVpclxuICogUGxheXdyaWdodCBzcGVjcyBzaWxlbnRseSBza2lwcGVkIGFuZCBgd2IgdGVzdGAgLyBgd2IgdmVyaWZ5IC0tZnVsbGAgd291bGQgcmVwb3J0IHN1Y2Nlc3NcbiAqIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZShcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnbmFtZScgfCAncGFja2FnZUpzb24nPlxuKTogdm9pZCB7XG4gIC8vIENhbGxlcnMgaW52b2tlIHRoaXMgb25seSBhZnRlciBlc3RhYmxpc2hpbmcgdGhhdCB0ZXN0L2UyZSBpcyBtaXNzaW5nLCBzbyBpdCBpcyBub3QgcmUtY2hlY2tlZFxuICAvLyBoZXJlLiBBIHdvcmtzcGFjZSByb290IGRlbGVnYXRlcyBlMmUgdG8gaXRzIHBhY2thZ2VzLCBzbyBpdCBuZXZlciB3YXJucyAoY2hlY2tlZCBmaXJzdCB0byBza2lwXG4gIC8vIHRoZSBmaWxlc3lzdGVtIGxvb2t1cCBiZWxvdykuIE9ubHkgYSBwcm9qZWN0J3MgT1dOIFBsYXl3cmlnaHQgY29uZmlnIGNvdW50czogYGhhc1BsYXl3cmlnaHRDb25maWdgXG4gIC8vIHdhbGtzIHVwIHRvIHRoZSBtb25vcmVwbyByb290LCBzbyByZXVzaW5nIGl0IHdvdWxkIGZhbHNlLXBvc2l0aXZlIG9uIGxpYnJhcnkgcGFja2FnZXMgYW5kIHRoZVxuICAvLyByb290IGl0c2VsZiwgd2hpY2ggbGVnaXRpbWF0ZWx5IHNoYXJlIGEgcm9vdC1sZXZlbCBwbGF5d3JpZ2h0LmNvbmZpZy50cyBidXQga2VlcCBlMmUgc3BlY3MgaW4gYVxuICAvLyBzaW5nbGUgYXBwIHBhY2thZ2UuXG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHJldHVybjtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdwbGF5d3JpZ2h0LmNvbmZpZy50cycpKSkgcmV0dXJuO1xuXG4gIGNvbnNvbGUud2FybihcbiAgICBjaGFsay55ZWxsb3coXG4gICAgICBgU2tpcHBpbmcgZTJlIHRlc3RzIGZvciAke3Byb2plY3QubmFtZX06IGEgUGxheXdyaWdodCBjb25maWcgZXhpc3RzIGJ1dCB0aGUgdGVzdC9lMmUgZGlyZWN0b3J5IGlzIG1pc3NpbmcuIHdiIG9ubHkgZGlzY292ZXJzIFBsYXl3cmlnaHQgc3BlY3MgdW5kZXIgdGVzdC9lMmUvLCBzbyBtb3ZlIHRoZW0gdGhlcmUgdG8gcnVuIGUyZSB0ZXN0cy5gXG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudihhcmd2OiBUZXN0Q29tbWFuZEFyZ3YpOiBUZXN0Q29tbWFuZEFyZ3Yge1xuICBpZiAoYXJndi5lbnY/Lmxlbmd0aCB8fCBhcmd2LmNhc2NhZGVFbnYgfHwgYXJndi5jYXNjYWRlTm9kZUVudiB8fCBhcmd2LmF1dG9DYXNjYWRlRW52ID09PSBmYWxzZSkge1xuICAgIHJldHVybiBhcmd2O1xuICB9XG4gIHJldHVybiB7IC4uLmFyZ3YsIGNhc2NhZGVFbnY6ICd0ZXN0JyB9O1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHwgZmFsc2Uge1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JykpKSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpID8gWyd0ZXN0JywgJy0tZXhjbHVkZScsICd0ZXN0L2UyZS8qKiddIDogWyd0ZXN0J107XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW10sXG4gIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICBjb25zdCBidWlsZEV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmIChidWlsZEV4aXRDb2RlICE9PSAwKSB7XG4gICAgcmV0dXJuIGJ1aWxkRXhpdENvZGU7XG4gIH1cbiAgY29uc3QgdGVzdEV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgfSksXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGNvbnN0IHN0b3BFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YsIHtcbiAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICB9KTtcbiAgaWYgKHRlc3RFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiB0ZXN0RXhpdENvZGU7XG4gIH1cbiAgcmV0dXJuIHN0b3BFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gcnVuVGVzdENvbW1hbmQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzJdLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzNdID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBwcm9jZXNzU2lsZW50T3V0cHV0OiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW5Vbml0VGVzdENvbW1hbmQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzJdLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzNdID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBvbWl0U2lsZW50U3RhcnQ6IHRydWUsXG4gICAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5OiB0cnVlLFxuICAgIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNczogMTBfMDAwLFxuICAgIHNpbGVudFN1Y2Nlc3NNZXNzYWdlOiAnVW5pdCB0ZXN0cyBwYXNzZWQuJyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZHVwZU5vaXN5VGVzdE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcmVjZW50UHJpbnRlZExpbmVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVkdXBlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgaXRlcmF0ZUxpbmVzKG91dHB1dCkpIHtcbiAgICBjb25zdCBub3JtYWxpemVkTGluZSA9IG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmUpO1xuICAgIGlmIChyZWNlbnRQcmludGVkTGluZVNldC5oYXMobm9ybWFsaXplZExpbmUpKSBjb250aW51ZTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVzLnNvbWUoKHByaW50ZWRMaW5lKSA9PiBhcmVMaW5lc1NpbWlsYXIocHJpbnRlZExpbmUsIG5vcm1hbGl6ZWRMaW5lKSkpIGNvbnRpbnVlO1xuXG4gICAgcHVzaFJlY2VudFByaW50ZWRMaW5lKHJlY2VudFByaW50ZWRMaW5lcywgcmVjZW50UHJpbnRlZExpbmVTZXQsIG5vcm1hbGl6ZWRMaW5lKTtcbiAgICBkZWR1cGVkTGluZXMucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gZGVkdXBlZExpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiogaXRlcmF0ZUxpbmVzKG91dHB1dDogc3RyaW5nKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICBsZXQgbGluZVN0YXJ0SW5kZXggPSAwO1xuICB3aGlsZSAobGluZVN0YXJ0SW5kZXggPD0gb3V0cHV0Lmxlbmd0aCkge1xuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IG91dHB1dC5pbmRleE9mKCdcXG4nLCBsaW5lU3RhcnRJbmRleCk7XG4gICAgaWYgKGxpbmVFbmRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgeWllbGQgb3V0cHV0LnNsaWNlKGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgpO1xuICAgIGxpbmVTdGFydEluZGV4ID0gbGluZUVuZEluZGV4ICsgMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoUmVjZW50UHJpbnRlZExpbmUobGluZXM6IHN0cmluZ1tdLCBsaW5lU2V0OiBTZXQ8c3RyaW5nPiwgbGluZTogc3RyaW5nKTogdm9pZCB7XG4gIGxpbmVzLnB1c2gobGluZSk7XG4gIGxpbmVTZXQuYWRkKGxpbmUpO1xuICBpZiAobGluZXMubGVuZ3RoIDw9IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCkgcmV0dXJuO1xuXG4gIGNvbnN0IHJlbW92ZWRMaW5lID0gbGluZXMuc2hpZnQoKTtcbiAgaWYgKHJlbW92ZWRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICBsaW5lU2V0LmRlbGV0ZShyZW1vdmVkTGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGluZUZvclNpbWlsYXJpdHkobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmVcbiAgICAucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlQWxsKC9eKD86XFxbW15cXF1dK1xcXVxccyopKy9nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFwobm9kZTpcXGQrXFwpL2csICcobm9kZTo8bnVtYmVyPiknKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZCspP1o/XFxiL2csICc8dGltZXN0YW1wPicpXG4gICAgLnJlcGxhY2VBbGwoLyhbPyZdY2FjaGU9KVxcZCsvZywgJyQxPG51bWJlcj4nKTtcbn1cblxuZnVuY3Rpb24gYXJlTGluZXNTaW1pbGFyKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gIGlmIChtYXhMZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBpZiAoTWF0aC5hYnMoYS5sZW5ndGggLSBiLmxlbmd0aCkgPiBtYXhMZW5ndGggKiBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRpc3RhbmNlKGEsIGIpIC8gbWF4TGVuZ3RoIDw9IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU87XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKFxuICBlMmVUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW10sXG4gIGFkZGl0aW9uYWxBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBbJ3Rlc3QnLCAuLi4oZTJlVGFyZ2V0cy5sZW5ndGggPiAwIHx8IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID8gW10gOiBbJ3Rlc3QvZTJlLyddKSwgLi4uYWRkaXRpb25hbEFyZ3NdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKFxuICB0ZXN0VGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiB7IHNob3VsZFJ1blVuaXQ6IGJvb2xlYW47IHNob3VsZFJ1bkUyZTogYm9vbGVhbiB9IHtcbiAgY29uc3QgaGFzRTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICBjb25zdCBoYXNVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSB0ZXN0VGFyZ2V0cy5sZW5ndGggPT09IDAgJiYgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID09PSAwO1xuXG4gIHJldHVybiB7XG4gICAgc2hvdWxkUnVuVW5pdDogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHMsXG4gICAgc2hvdWxkUnVuRTJlOiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNFMmVUYXJnZXRzIHx8IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA+IDAsXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcbmltcG9ydCB7IHdhcm5JZlBsYXl3cmlnaHRTcGVjc0FyZVVuZGlzY292ZXJhYmxlIH0gZnJvbSAnLi90ZXN0LmpzJztcblxuY29uc3QgdGVzdE9uQ2lCdWlsZGVyID0ge1xuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCB0ZXN0T25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0LW9uLWNpJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3Qgb24gQ0kgd2l0aCBubyBvcHRpb25zLicsXG4gIGJ1aWxkZXI6IHRlc3RPbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdE9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdE9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFNwYXduZWQgY29tbWFuZHMgcmUtZGVyaXZlIHRoZWlyIGRvdGVudiBjYXNjYWRlIGZyb20gdGhlIGV4cG9ydGVkIFdCX0VOViwgc28gYW4gdW5leHBvcnRlZFxuICAvLyBXQl9FTlYgd291bGQgbGV0IGEgY29tbWl0dGVkIGAuZW52YCAoZS5nLiBXQl9FTlY9ZGV2ZWxvcG1lbnQpIHNlbGVjdCB0aGUgZGV2ZWxvcG1lbnRcbiAgLy8gZW52aXJvbm1lbnQg4oCUIHJ1bm5pbmcgdGhlIGRlc3RydWN0aXZlIGUyZSBzdWl0ZSBhZ2FpbnN0IHRoZSBkZXZlbG9wZXIncyBvd24gZGF0YWJhc2UuXG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBwcm9qZWN0LmVudi5DSSB8fD0gJzEnO1xuICAgIC8vIE92ZXJ3cml0ZSwgbm90IHx8PTogcHJvamVjdC5lbnYgYWxyZWFkeSBjYXJyaWVzIHRoZSBkb3RlbnYtZGVyaXZlZCB2YWx1ZS5cbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG5cbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSB7XG4gICAgICAvLyB2aW5leHQgYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyB0aGlzIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbiAgICAgIHNjcmlwdHMgPSB2aW5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpKSB7XG4gICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICBzY3JpcHRzID0gd29ya2Vyc1NjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZShwcm9qZWN0KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFRyZWVLaWxsQ29tbWFuZEFyZ3Mge1xuICBwaWQ6IG51bWJlcjtcbiAgc2lnbmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSAoeWFyZ3M6IEFyZ3YpOiBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0+XG4gIHlhcmdzXG4gICAgLnBvc2l0aW9uYWwoJ3BpZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByb2Nlc3MgSUQgdG8ga2lsbC4nLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdzaWduYWwnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpZ25hbCB0byBzZW5kIHRvIHRoZSBwcm9jZXNzIHRyZWUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJ1NJR1RFUk0nLFxuICAgIH0pIGFzIEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz47XG5cbmV4cG9ydCBjb25zdCB0cmVlS2lsbENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8b2JqZWN0LCBUcmVlS2lsbENvbW1hbmRBcmdzPiA9IHtcbiAgY29tbWFuZDogJ3RyZWUta2lsbCA8cGlkPiBbc2lnbmFsXScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgYWxsIGRlc2NlbmRhbnRzJyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGFyZ3Yuc2lnbmFsIGFzIE5vZGVKUy5TaWduYWxzO1xuICAgICAgaWYgKCEoc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgIH1cbiAgICAgIHRyZWVLaWxsKGFyZ3YucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG5leHBvcnQgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHR5cGVDaGVjayhhcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZUNoZWNrKGFyZ3Y6IFR5cGVDaGVja0NvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKC4uLmJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpKTtcbiAgICB9XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdweXJpZ2h0JykpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgIH1cbiAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIHByZXNlcnZlQ29sb3I6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0/LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICB9XG4gICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgfVxuICB9XG4gIGlmICghZmluYWxFeGl0Q29kZSlcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgcmVtb3ZlZE5leHREaXJcbiAgICAgICAgICA/ICctLS0tLVxcbk5vIHR5cGUgZXJyb3JzIGZvdW5kLiBQbGVhc2UgaWdub3JlIHRoZSBwcmV2aW91cyB0eXBlIGVycm9ycywgYXMgdGhleSB3ZXJlIGNhdXNlZCBieSBvdXRkYXRlZCBOZXh0LmpzIGNhY2hlIGZpbGVzLidcbiAgICAgICAgICA6ICdObyB0eXBlIGVycm9ycyBmb3VuZC4nXG4gICAgICApXG4gICAgKTtcbiAgcmV0dXJuIGZpbmFsRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIGB0eXBlc2NyaXB0YCAoYHRzY2ApOyB3YmZ5IHJlbW92ZXMgdGhlXG4gIC8vIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHByZXZpZXcgZnJvbSBub24tTmV4dC5qcyByZXBvcyAoTmV4dC5qcy1mYW1pbHlcbiAgLy8gcmVwb3Mga2VlcCBpdCBmb3IgYG5leHQgYnVpbGRgKSwgc28gcmVwb3Mgc3RpbGwgb24gdGhlIHByZXZpZXcgc2hvdWxkIHJ1biB3YmZ5XG4gIC8vIGluc3RlYWQgb2YgcmVseWluZyBvbiBhIHRzZ28gZmFsbGJhY2sgaGVyZS5cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgbGludCwgdHlwZSBMaW50Q29tbWFuZEFyZ3YgfSBmcm9tICcuL2xpbnQuanMnO1xuaW1wb3J0IHsgdGVzdCwgdHlwZSBUZXN0Q29tbWFuZEFyZ3YsIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYgfSBmcm9tICcuL3Rlc3QuanMnO1xuaW1wb3J0IHsgdHlwZUNoZWNrLCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2IH0gZnJvbSAnLi90eXBlY2hlY2suanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmdWxsOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIGRlc2NyaWJlOiAnUnVuIHRlc3RzIGFmdGVyIHZlcmlmeWluZyBwcm9qZWN0IGNvZGUnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz47XG50eXBlIFBhY2thZ2VDb21tYW5kQXJndiA9IFBpY2s8VmVyaWZ5Q29kZUNvbW1hbmRBcmd2LCAnZHJ5UnVuJyB8ICd2ZXJib3NlJz47XG5cbmV4cG9ydCBjb25zdCB2ZXJpZnlDb2RlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndmVyaWZ5JyxcbiAgZGVzY3JpYmU6ICdWZXJpZnkgcHJvamVjdCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGF3YWl0IChhcmd2LmZ1bGwgPyB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdHMuc2VsZiwgYXJndikgOiB2ZXJpZnlDb2RlKHByb2plY3RzLnNlbGYsIGFyZ3YpKTtcbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGVGdWxseShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3J0ZXIgPSBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3QsIGFyZ3YpO1xuICAgIGF3YWl0IHJ1blByb2plY3RUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgIHJlcG9ydGVyLnN1Y2NlZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRlci5mYWlsKGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZXBvcnRlci5maW5pc2goKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAsIHByb2plY3QsIGFyZ3YpO1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwYWNrYWdlTWFuYWdlcn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKFxuICAgICdjbGVhbnVwJyxcbiAgICAoKSA9PlxuICAgICAgbGludCh7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIF86IFsnbGludCddLFxuICAgICAgICBmaXg6IHRydWUsXG4gICAgICAgIGZvcm1hdDogdHJ1ZSxcbiAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgfSBhcyB1bmtub3duIGFzIExpbnRDb21tYW5kQXJndiksXG4gICAgeyBzaWxlbnQ6IHRydWUgfVxuICApO1xuICAvLyBUeXBlLWF3YXJlIGxpbnQgcmVwb3J0cyBUeXBlU2NyaXB0IGRpYWdub3N0aWNzIG9ubHkgZm9yIHRoZSBmaWxlcyBveGxpbnQgYWN0dWFsbHkgbGludHMsIGFuZFxuICAvLyB0aGUgc2hhcmVkIGNvbmZpZyBpZ25vcmVzIGRpcmVjdG9yaWVzIHRzYyBzdGlsbCBjb21waWxlcyAoZS5nLiBgX19nZW5lcmF0ZWRfX2AsIGBAdHlwZXNgLFxuICAvLyBgZGlzdGApLiBLZWVwIHRoZSB0eXBlY2hlY2sgY29tbWFuZCBzbyBgdmVyaWZ5YCBzdGF5cyBlcXVpdmFsZW50IHRvIFwidGhlIHJlcG9zaXRvcnkgY29tcGlsZXNcIi5cbiAgLy8gVGhlIG92ZXJsYXAgd2l0aCBsaW50IGlzIGRlbGliZXJhdGU6IGAtLXR5cGUtYXdhcmVgIGFsc28gcG93ZXJzIHR5cGUtYXdhcmUgbGludCBydWxlcywgYW5kXG4gIC8vIGRyb3BwaW5nIG9ubHkgYC0tdHlwZS1jaGVja2AgZnJvbSBsaW50IHNhdmVzIH4wLjFzLCBmYXIgbGVzcyB0aGFuIHRoZSBjb3ZlcmFnZSBpdCB3b3VsZCBjb3N0LlxuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKFxuICAgICd0eXBlY2hlY2snLFxuICAgICgpID0+IHR5cGVDaGVjayh7IC4uLmFyZ3YsIF86IFsndHlwZWNoZWNrJ10gfSBhcyB1bmtub3duIGFzIFR5cGVDaGVja0NvbW1hbmRBcmd2KSxcbiAgICB7IHNpbGVudDogdHJ1ZSB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByb2plY3RUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoe1xuICAgIC4uLmFyZ3YsXG4gICAgXzogWyd0ZXN0J10sXG4gICAgZTJlOiAnaGVhZGxlc3MnLFxuICAgIHNpbGVudDogdHJ1ZSxcbiAgfSBhcyB1bmtub3duIGFzIFRlc3RDb21tYW5kQXJndik7XG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAoZXhpdENvZGUgPT09IDApIHJldHVybjtcblxuICBpZiAoIXByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkYi1yZXNldCddKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksICd0ZXN0JykpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oXG4gICAgY2hhbGsueWVsbG93KCdUZXN0cyBmYWlsZWQuIFRoaXMgcHJvamVjdCBkZWZpbmVzIFwiZGItcmVzZXRcIiwgc28gd2Igd2lsbCByZXNldCB0aGUgZGF0YWJhc2Ugb25jZSBhbmQgcmV0cnkgdGVzdHMuJylcbiAgKTtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGRiLXJlc2V0YCwgZmluZFRlc3RQcm9qZWN0KHByb2plY3QsIHRlc3RBcmd2KSwgdGVzdEFyZ3YsIHtcbiAgICBwcmludFJhd091dHB1dDogdHJ1ZSxcbiAgfSk7XG5cbiAgY29uc3QgcmV0cnlFeGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKHJldHJ5RXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7cmV0cnlFeGl0Q29kZX0pOmApLCAndGVzdCBhZnRlciBkYi1yZXNldCByZXRyeScpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0cnlFeGl0Q29kZSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdUZXN0cyBwYXNzZWQgYWZ0ZXIgZGItcmVzZXQgcmV0cnkuJykpO1xufVxuXG5mdW5jdGlvbiBmaW5kVGVzdFByb2plY3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdENvbW1hbmRBcmd2KTogUHJvamVjdCB7XG4gIGNvbnN0IHRlc3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmICghdGVzdFByb2plY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2plY3Qgbm90IGZvdW5kOiAke3Byb2plY3QuZGlyUGF0aH1gKTtcbiAgfVxuICByZXR1cm4gdGVzdFByb2plY3Q7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH1cbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYWNrYWdlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBwcmVzZXJ2ZUNvbG9yOiBmYWxzZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKCFvcHRpb25zLnByaW50UmF3T3V0cHV0KSB7XG4gICAgcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kLCBleGl0Q29kZSwgcmV0LnN0ZG91dCk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDAgJiYgIW9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBQcmludHMgcGFja2FnZSBjb21tYW5kIG91dHB1dCBmb3IgYHdiIHZlcmlmeWAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIHNvIHN1Y2Nlc3NmdWwgbm9pc3lcbiAqIGNvbW1hbmRzIGFyZSBzdW1tYXJpemVkIHdoaWxlIGZhaWx1cmUgb3V0cHV0IHJlbWFpbnMgYXZhaWxhYmxlIGZvciBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgVGhlIGV4ZWN1dGVkIGNvbW1hbmQuXG4gKiBAcGFyYW0gZXhpdENvZGUgVGhlIGNvbW1hbmQgZXhpdCBjb2RlLlxuICogQHBhcmFtIG91dHB1dCBUaGUgbWVyZ2VkIHN0ZG91dCBhbmQgc3RkZXJyIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQ6IHN0cmluZywgZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwICYmIChjb21tYW5kID09PSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfHwgY29tbWFuZCA9PT0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGlmICh0cmltbWVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodHJpbW1lZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0OiBQcm9qZWN0KToge1xuICBmYWlsOiAoZXJyb3I/OiB1bmtub3duKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd2JEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy53YicpO1xuICBmcy5ta2RpclN5bmMod2JEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBsb2dGaWxlUGF0aCA9IHBhdGguam9pbih3YkRpclBhdGgsICd2ZXJpZnktZnVsbC5sb2cnKTtcbiAgY29uc3QgbG9nRmlsZSA9IGZzLm9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCAndycpO1xuICBjb25zdCBvcmlnaW5hbFN0ZG91dFdyaXRlID0gcHJvY2Vzcy5zdGRvdXQud3JpdGUuYmluZChwcm9jZXNzLnN0ZG91dCk7XG4gIGNvbnN0IG9yaWdpbmFsU3RkZXJyV3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKTtcbiAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IHRlZVdyaXRlKG9yaWdpbmFsU3Rkb3V0V3JpdGUsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZGVycldyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0Z1bGwgbG9nOicpLCBsb2dGaWxlUGF0aCkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoZmluaXNoZWQpIHJldHVybjtcbiAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IG9yaWdpbmFsU3Rkb3V0V3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gb3JpZ2luYWxTdGRlcnJXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG5cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IGZvcm1hdEVsYXBzZWRUaW1lKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWRlZCA/ICdTdWNjZWVkZWQnIDogJ0ZhaWxlZCc7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGAke3N0YXR1c30gaW4gJHtlbGFwc2VkVGltZX0uIEZ1bGwgbG9nOiAke2xvZ0ZpbGVQYXRofVxcbmA7XG4gICAgY29uc3QgY29sb3JlZFN1bW1hcnkgPSBzdWNjZWVkZWQgPyBjaGFsay5ncmVlbihzdW1tYXJ5KSA6IGNoYWxrLnJlZChzdW1tYXJ5KTtcbiAgICBvcmlnaW5hbFN0ZG91dFdyaXRlKGNvbG9yZWRTdW1tYXJ5KTtcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgc3VtbWFyeSk7XG4gICAgZnMuY2xvc2VTeW5jKGxvZ0ZpbGUpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnZXhpdCcsIGZpbmlzaCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmYWlsOiAoZXJyb3IpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmluaXNoOiAoKSA9PiB7XG4gICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdleGl0JywgZmluaXNoKTtcbiAgICAgIGZpbmlzaCgpO1xuICAgIH0sXG4gICAgc3VjY2VlZDogKCkgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0ZWVXcml0ZShvcmlnaW5hbFdyaXRlOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUsIGxvZ0ZpbGU6IG51bWJlcik6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSB7XG4gIHJldHVybiAoKFxuICAgIGNodW5rOiBVaW50OEFycmF5IHwgc3RyaW5nLFxuICAgIGVuY29kaW5nT3JDYWxsYmFjaz86IEJ1ZmZlckVuY29kaW5nIHwgKChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCksXG4gICAgY2FsbGJhY2s/OiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWRcbiAgKSA9PiB7XG4gICAgY29uc3QgYnVmZmVyID1cbiAgICAgIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBCdWZmZXIuZnJvbShjaHVuaywgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ3N0cmluZycgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiAndXRmOCcpXG4gICAgICAgIDogY2h1bms7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIGJ1ZmZlcik7XG4gICAgLy8gV3JpdGUgdG8gdGhlIHRlcm1pbmFsIHZpYSB0aGUgb3JpZ2luYWwgc3RyZWFtIG1ldGhvZDogYSBzeW5jaHJvbm91cyBmcy53cml0ZVN5bmMgb24gdGhlXG4gICAgLy8gc3Rkb3V0L3N0ZGVyciBmZCB0aHJvd3MgRUFHQUlOIG9uIENJJ3Mgbm9uLWJsb2NraW5nIHBpcGVzIHdoZW4gbGFyZ2Ugb3V0cHV0IGZsdXNoZXMgYXQgb25jZSxcbiAgICAvLyB3aGlsZSB0aGUgc3RyZWFtIG1ldGhvZCBidWZmZXJzIGludGVybmFsbHkgYW5kIGhhbmRsZXMgYmFja3ByZXNzdXJlLlxuICAgIHJldHVybiBvcmlnaW5hbFdyaXRlKGJ1ZmZlciwgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6IGNhbGxiYWNrKTtcbiAgfSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBgJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xuICB9XG4gIHJldHVybiBgJHttaW51dGVzfW0gJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBkZXBsb3lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9kZXBsb3kuanMnO1xuaW1wb3J0IHsgZG90ZW52Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZG90ZW52LmpzJztcbmltcG9ydCB7IGdlbkNvZGVDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5Db2RlLmpzJztcbmltcG9ydCB7IGdlbkRldlZhcnNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5EZXZWYXJzLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBtYWludGVuYW5jZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL21haW50ZW5hbmNlLmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cFByaXZhdGVQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuUEFUSD8uaW5jbHVkZXMoJy9idW4tbm9kZS0nKSkge1xuICAgICAgLy8gTm90IGZpeGVkIHVwIGhlcmU6IHRvb2xzIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpIG1heSBoYW5nIG9yXG4gICAgICAvLyBjcmFzaCB1bmRlciB0aGUgc2hpbSwgYW5kIHNvbWUgKHdyYW5nbGVyIGRldikgZmFpbCBzaWxlbnRseSwgc28gc3VyZmFjZSB0aGUgY2F1c2UgdXBmcm9udC5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJXYXJuaW5nOiBQQVRIIGNvbnRhaW5zIGEgYnVuLW5vZGUgc2hpbSAoZnJvbSBgYnVuIC0tYnVuYCBvciBidW5maWcncyBgcnVuLmJ1bmApOyBcIiArXG4gICAgICAgICAgJ3J1biB3YiB3aXRob3V0IGAtLWJ1bmAgYW5kIHJlbW92ZSBgW3J1bl0gYnVuYCBmcm9tIGJ1bmZpZy50b21sLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQodmVyaWZ5Q29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChjb25jdXJyZW50bHlDb21tYW5kKVxuICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAuY29tbWFuZChkb3RlbnZDb21tYW5kKVxuICAuY29tbWFuZChnZW5Db2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuRGV2VmFyc0NvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChtYWludGVuYW5jZUNvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHRyZWVLaWxsQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxubGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG5cbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwcm9jZXNzLnBpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvY2Vzcy5waWR9KSBkdXJpbmcgc2h1dGRvd246YCwgZXJyb3IpO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoKTtcbiAgfSk7XG59XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzYsNyw4LDksMTBdLCJtYXBwaW5ncyI6IjB3QkFRQSxNQUFhLEVBQTRCLENBQ3ZDLElBQUssQ0FDSCxZQUFhLDJCQUNiLE1BQU8sRUFDUCxLQUFNLE9BQ1IsRUFDQSxjQUFlLENBQ2IsWUFDRSx3TEFDRixLQUFNLFFBQ1IsRUFDQSxtQkFBb0IsQ0FDbEIsWUFBYSwwRkFDYixLQUFNLFNBQ1IsRUFDQSxtQkFBb0IsQ0FDbEIsWUFBYSxpRUFDYixLQUFNLFVBQ04sUUFBUyxFQUNYLEVBQ0EsbUJBQW9CLENBQ2xCLFlBQWEscUdBQ2IsS0FBTSxVQUNOLFFBQVMsRUFDWCxFQUNBLFlBQWEsQ0FDWCxZQUFhLHFGQUNiLEtBQU0sU0FDTixRQUFTLGNBQ1gsRUFDQSxZQUFhLENBQ1gsWUFBYSwwQ0FDYixLQUFNLFNBQ1IsRUFDQSxRQUFTLENBQ1AsWUFB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TSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssUUFBUSxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssV0FBVyxNQUFNLEdBQUcsSUFBSSxFQUFFLEtBQUssVUFBVSxLQUFLLFlBQVksRUFBRSxLQUFLLGFBQWEsR0FBRyxFQUFFLEtBQUssWUFBWSxHQUFHLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsS0FBSyxVQUFVLE1BQVUsTUFBTSx5QkFBeUIsRUFBRSxJQUFNLEVBQUUsS0FBSyxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxXQUFXLEVBQUUsS0FBSyxFQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssTUFBTSxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUdILEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUlBLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxHQUFHLE9BQU8sRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsS0FBSyxJQUFJLEdBQUcsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBS0EsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEdBQUcsS0FBS0EsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUlBLEVBQUUsRUFBRSxNQUFNLEdBQUcsS0FBSyxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxFQUFFLEtBQUssTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFFLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEtBQU0sTUFBSyxNQUFNLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLFVBQVUsT0FBTyxLQUFLLFVBQVUsQ0FBQyxFQUFFLElBQU0sRUFBRSxLQUFLLE9BQVcsRUFBRSxLQUFLLGNBQW9CLEVBQUUsS0FBSyxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksS0FBSyxRQUFRLEVBQUUsR0FBRyxLQUFLLGdCQUFnQixLQUFLLFVBQVUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLEVBQUUsSUFBTSxFQUFFLEtBQUssV0FBZSxFQUFFLEtBQUssRUFBUSxFQUFFLEtBQUssYUFBYSxFQUFFLEtBQUssV0FBZSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUdELEVBQUUsR0FBRyxFQUFFLElBQUlBLEVBQUUsR0FBRyxHQUFHQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsRUFBRSxJQUFJQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUVJLEdBQUUsQ0FBQyxFQUFFQyxHQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLEdBQUcsR0FBR0wsRUFBRSxHQUFHLEVBQUUsSUFBSUEsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUdBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUdBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUMsTUFBTUssR0FBRSxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsRUFBRyxHQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxHQUFHLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRyxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRyxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRSxFQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsR0FBRSxHQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsR0FBRSxFQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsR0FBRSxHQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsRUFBRSxHQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsR0FBRSxHQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsRUFBRSxHQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsR0FBRSxHQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRSxHQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsR0FBRSxHQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRSxHQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsR0FBRSxFQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsR0FBRSxFQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsR0FBRSxHQUFFLEVBQUUsSUFBSSxHQUFFLENBQUMsR0FBRSxH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Q0FBQyxTQUFTLEdBQUUsRUFBRSxDQUFDLEdBQVksSUFBVCxJQUFLLEdBQU0sTUFBTSxHQUFHLEdBQWEsT0FBTyxHQUFqQixTQUFtQixDQUFDLEdBQUcsT0FBTyxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFFLENBQUMsRUFBRSxTQUFTLEdBQUUsRUFBRSxFQUFFLEdBQUUsQ0FBQyxJQUFNLEVBQUUsR0FBRUUsQ0FBQyxFQUFFLEdBQVUsSUFBUCxLQUFTLE9BQU8sRUFBRSxJQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxJQUFJLE9BQU8sU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFNLEVBQUUsR0FBRUEsQ0FBQyxFQUFFLEdBQVUsSUFBUCxLQUFTLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJQSxDQUFDLEVBQUUsR0FBWSxJQUFULElBQUssR0FBTSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxPQUFPQSxFQUF6QixDQUE0QixJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksVUFBVSxFQUFFLEdBQUdBLEVBQUUsRUFBRSxJQUFJQSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHQSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJQSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxHQUFVQSxJQUFQLEtBQVMsRUFBRSxHQUFHQSxFQUFFLEVBQUUsSUFBSUEsRUFBRSxDQUFDLE9BQU8sR0FBRyxNQUFNLFFBQVFBLENBQUMsRUFBRSxDQUFDLElBQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUUsT0FBTyxFQUFFLENBQUMsSUFBTSxFQUFFLEdBQUUsT0FBTyxHQUFFLE9BQU8sRUFBRSxHQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUVBLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSUEsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFLLENBQUMsRUFBRSxLQUFLQSxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUssQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFNLEVBQUUsRUFBRSxZQUFZLEdBQWUsT0FBTyxHQUFuQixXQUFxQixDQUFDLElBQU0sRUFBRSxFQUFFLEtBQUssRUFBRUEsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFZLElBQVQsSUFBSyxHQUFNLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQU0sRUFBRSxPQUFPLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFBLEdBQUcsQ0FBQyxDQUFDLEVBQUVBLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSUEsRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRUEsQ0FBQyxFQUFFLENBQUMsQ0NBdnBDLFNBQVMsR0FBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPQyxHQUFFQyxHQUFFLENBQUMsRUFBRSxD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
|