build-ts 14.0.1 → 14.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{readAndApplyEnvironmentVariables as e,yargsOptionsBuilderForEnv as o,removeNpmAndYarnEnvironmentVariables as n}from"@willbooster/shared-lib-node";import s from"yargs";import{hideBin as i}from"yargs/helpers";import t from"node:fs";import r from"node:path";import c from"chalk";import a from"date-time";import p from"pretty-ms";import{rollup as l,watch as d}from"rollup";import{onExit as m}from"signal-exit";import u from"node:url";import{babel as f}from"@rollup/plugin-babel";import y from"@rollup/plugin-commonjs";import g from"@rollup/plugin-json";import b from"@rollup/plugin-node-resolve";import h from"@rollup/plugin-replace";import j from"@rollup/plugin-terser";import v from"rollup-plugin-analyzer";import{keepImport as w}from"rollup-plugin-keep-import";import{nodeExternals as x}from"rollup-plugin-node-externals";import k from"rollup-plugin-preserve-directives";import{string as S}from"rollup-plugin-string";import $ from"node:process";import E from"typescript";import*as D from"node:child_process";let T;function O(o,n){return T||(T=e(o,n),o.verbose&&console.info("Loaded env vars:",Object.keys(T))),T}function F(e){const o={},n=new Set((e.inline??[]).flatMap((e=>e.toString().split(","))));for(const e of n)void 0!==process.env[e]&&(o[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info("Inline env vars:",Object.keys(o)),o}const _=["app","functions","lib"];async function N(e){const o=r.join(e,"package.json");try{const e=await t.promises.readFile(o,"utf8");return[JSON.parse(e),o]}catch{}return[void 0,o]}const B={...o,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},R={...B,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"},keepImport:{description:"Identifiers to be kept as import statements.",type:"array"},bundleBuiltins:{description:"Module names same with builtins (e.g., undici) to be bundled.",type:"array"}},C={...R,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},L={...C,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},A={...R,moduleType:{description:"esm, cjs, either, or both (default).",type:"string",alias:"m"},jsExtension:{description:"Whether to use .js in cjs and/or esm: either (default), both, or none.",type:"string",alias:"j"}};function I(e,o,n,s,i,c){const a=[...e.external??[]].map((e=>e.toString()));if(n.dependencies?.["@prisma/client"]&&a.push("prisma-client"),a.push(...Object.keys(n.dependencies??{}),...Object.keys(n.peerDependencies??{}),...Object.keys(n.optionalDependencies??{})),t.existsSync(r.join("..","..","package.json"))){const e=t.readdirSync(r.join(".."),{withFileTypes:!0});for(const o of e){if(!o.isDirectory())continue;const e=r.join("..",o.name,"package.json");if(!t.existsSync(e))continue;const s=JSON.parse(t.readFileSync(e,"utf8"));n.dependencies?.[s.name??""]&&a.push(...Object.keys(s.dependencies??{}),...Object.keys(s.peerDependencies??{}),...Object.keys(s.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=r.join(u.fileURLToPath(r.dirname(r.dirname(import.meta.url))),"babel.config.mjs"),d=[h({delimiters:["",""],preventAssignment:!0,values:F(e)}),g(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:a.map((e=>new RegExp(`^${e}(?:\\/.+)?`))),exclude:s&&new RegExp(`^@?${s}(?:\\/.+)?`)}),b({extensions:p,preferBuiltins:o=>!e.bundleBuiltins?.includes(o)}),y(),w({moduleNames:e.keepImport?.map((e=>e.toString()))??[]})],m="app-node"===o||"functions"===o||!a.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=m?"":"1",d.push(f({configFile:l,extensions:p,babelHelpers:m?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...c.some((e=>e.preserveModules))?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),e.minify&&d.push(j({compress:{directives:!1}})),d.push(v({summaryOnly:!0})),d}async function P(e,o){const n=E.findConfigFile(o,E.sys.fileExists);if(!n)throw new Error(`Failed to find tsconfig.json in ${o}.`);e.verbose&&console.info("Found tsconfig.json:",n);const s=[];let i=r.join("dist",r.basename(o),"src");if(t.existsSync(i)){const e=r.dirname(o),n=await t.promises.readdir(e,{withFileTypes:!0});o=r.resolve(o);for(const i of n){if(!i.isDirectory())continue;const n=r.resolve(e,i.name);if(n===o)continue;const c=E.findConfigFile(n,E.sys.fileExists),a=r.join("dist",i.name,"src");c&&t.existsSync(a)&&s.push([n,c,a])}}else i="dist";s.push([o,n,i]);let c=!0;for(const[n,i,t]of s)c&&=U(e,n,i,r.join(o,t));return c}function U(e,o,n,s){e.verbose&&console.info("runTypeScriptCompiler()",o,n,s);const{config:i}=E.readConfigFile(n,E.sys.readFile);i.compilerOptions={...i.compilerOptions,declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:s},i.include=["src/**/*"];const{errors:t,fileNames:r,options:c}=E.parseJsonConfigFileContent(i,E.sys,o),a=E.createProgram({options:c,rootNames:r,configFileParsingDiagnostics:t}),{diagnostics:p,emitSkipped:l}=a.emit(),d=[...E.getPreEmitDiagnostics(a),...p,...t];if(d.length>0){const e={getCanonicalFileName:e=>e,getCurrentDirectory:E.sys.getCurrentDirectory,getNewLine:()=>E.sys.newLine},o=E.formatDiagnostics(d,e);console.warn(o)}return!l}const W={command:"app [package]",describe:"Build an app",builder:C,handler:async e=>G(e,"app")},J={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:L,async handler(e){if(!e.onlyPackageJson)return G(e,"functions");{const o=r.resolve(e.package?.toString()??"."),[n,s]=await N(o);n||(console.error(`Failed to parse package.json (${s}).`),process.exit(1)),await H(o,n,e.moduleType)}}},M={command:"lib [package]",describe:"Build a Node.js / React library",builder:A,handler:async e=>G(e,"lib")};async function G(e,o){process.env.NODE_ENV||="production";const n=!e.silent&&e.verbose,s=process.cwd(),i=r.resolve(e.package?.toString()??"."),[u,f]=await N(i);u||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),O(e,i);const y=function(e,o,n){if(e.input&&e.input.length>0)return e.input.map((e=>r.join(o,e.toString())));const s=r.join(n,"src");for(const e of["ts","tsx","cts","mts"]){const o=r.join(s,`index.${e}`);if(t.existsSync(o))return[o]}console.error("Failed to detect input file."),process.exit(1)}(e,s,i),g=function(e,o){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return o.some((e=>e.endsWith(".tsx")))?"lib-react":"lib";default:console.error("target option must be one of: "+_.join(", ")),process.exit(1)}}(o,y);n&&(console.info("argv:",e),console.info("packageJsonPath:",f),console.info("Target (Category):",`${g} (${o})`));const[b]=function(e){const o=e.name?.toString()||"",n=/@([^/]+)\/(.+)/.exec(o),[,s,i]=n||[];return[s,i]}(u),h="module"===u.type;e["core-js"]?process.env.BUILD_TS_COREJS="1":e["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),n&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=o,process.env.BUILD_TS_TARGET_DETAIL=g;const j=function(e,o,n,s){const i=r.join(n,"dist");if("app-node"===o||"functions"===o)return[{dir:i,format:V(s,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const t=[],c=e.moduleType||"both",a=e.jsExtension||"either";("cjs"===c||"both"===c||"either"===c&&!s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&!s?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===c||"both"===c||"either"===c&&s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&s?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return t}(e,g,i,h);n&&console.info("OutputOptions:",j),0===j.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(i),await t.promises.rm(r.join(i,"dist"),{recursive:!0,force:!0}),"functions"===g&&await H(i,u,e.moduleType);const v={input:"functions"===g?Object.fromEntries(y.map(((e,o)=>[0===o?"index":r.basename(e,r.extname(e)),e]))):y,plugins:I(e,g,u,b,0,j),watch:e.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map((e=>r.relative(i,e)));if(e.watch)!function(e,o,n,s,i,t){const r=d({...s,output:i}),l=async e=>{process.removeListener("uncaughtException",l),process.stdin.removeListener("end",l),r&&await r.close(),e&&process.exit(e)};m(l),process.on("uncaughtException",l),process.stdin.isTTY||(process.stdin.on("end",l),process.stdin.resume());r.on("event",(async s=>{switch(s.code){case"ERROR":!function(e,o=!1){const n=e.name||e.cause?.name,s=n?`${n}: `:"",i=`${e.plugin?`(plugin ${e.plugin}) `:""}${s}${e.message}`,t=[c.bold(c.red(`[!] ${c.bold(i.toString())}`))];e.url&&t.push(c.cyan(e.url)),e.loc?t.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&t.push(e.id),e.frame&&t.push(c.dim(e.frame)),e.stack&&t.push(c.dim(e.stack?.replace(`${s}${e.message}\n`,""))),t.push("",""),console.error(t.join("\n")),o||$.exit(1)}(s.error,!0);break;case"BUNDLE_START":{if(e.silent)break;const o=s.input,i=[];"string"==typeof o?i.push(o):i.push(...Array.isArray(o)?o:Object.values(o)),console.info(c.cyan(`Bundles ${c.bold(t(i).join(", "))} → ${c.bold(t(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(c.green(`Created ${c.bold(t(s.output).join(", "))} in ${c.bold(p(s.duration))}`)),"app-node"!==o&&"functions"!==o&&await P(e,n);break;case"END":if(e.silent)break;console.info(`\n[${a()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()}))}(e,g,i,v,j,w);else{let o;e.silent||console.info(c.cyan(`Bundles ${c.bold(w(y).join(", "))} → ${c.bold(w(j.map((e=>e.file||e.dir||""))).join(", "))}\non ${i} ...`));let n=!1;try{const n=Date.now(),s=await l(v);o=s,await Promise.all(j.map((e=>s.write(e)))),e.silent||console.info(c.green(`Created ${w(j.map((e=>e.file||e.dir||""))).join(", ")} in ${c.bold(p(Date.now()-n))}`))}catch(e){n=!0,console.error("Failed to build due to:",e)}await(o?.close()),n&&process.exit(1),"app-node"===g||"functions"===g||await P(e,i)||process.exit(1)}}async function H(e,o,n){o.name+="-dist";const s="module"===o.type,i=V(s,n);o.main=s===i?"index.js":i?"index.mjs":"index.cjs",delete o.scripts,delete o.devDependencies,await t.promises.mkdir(r.join(e,"dist"),{recursive:!0}),await t.promises.writeFile(r.join(e,"dist","package.json"),JSON.stringify(o))}function V(e,o){return"esm"===o||(!o||"either"===o)&&e}const Y={command:"run <file>",describe:"Run script",builder:{...B,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){O(e,process.cwd());const o=e.file?.toString()||"",n=process.versions.bun,s=n?"bun":"node",i=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&i.push("--watch"),i.push(o);const[,...t]=e._,r=[...i,...t.map((e=>e.toString()))];e.verbose&&console.info(`Running '${s} ${r.join(" ")}'`);const c=D.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(c.status??1)}};n(process.env),await s(i(process.argv)).scriptName("build-ts").options(B).command(W).command(J).command(M).command(Y).demandCommand().strict().help().argv;
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW52VmFyc0RlZjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBlbnZWYXJOYW1lcyA9IG5ldyBTZXQoKGFyZ3YuaW5saW5lID8/IFtdKS5mbGF0TWFwKChlKSA9PiBlLnRvU3RyaW5nKCkuc3BsaXQoJywnKSkpO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgZW52VmFyTmFtZXMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnZbbmFtZV0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBlbnZWYXJzRGVmW2Bwcm9jZXNzLmVudi4ke25hbWV9YF0gPSBKU09OLnN0cmluZ2lmeShwcm9jZXNzLmVudltuYW1lXSk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnSW5saW5lIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnNEZWYpKTtcbiAgfVxuICByZXR1cm4gZW52VmFyc0RlZjtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzLCBPcHRpb25zIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0Q2F0ZWdvcmllcyA9IFsnYXBwJywgJ2Z1bmN0aW9ucycsICdsaWInXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0Q2F0ZWdvcnkgPSAodHlwZW9mIGFsbFRhcmdldENhdGVnb3JpZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBhbGxUYXJnZXREZXRhaWxzID0gWydhcHAtbm9kZScsICdmdW5jdGlvbnMnLCAnbGliJywgJ2xpYi1yZWFjdCddIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUYXJnZXREZXRhaWwgPSAodHlwZW9mIGFsbFRhcmdldERldGFpbHMpW251bWJlcl07XG5cbmV4cG9ydCB0eXBlIEFyZ3VtZW50c1R5cGU8VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogT3B0aW9ucyB9PiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPFQ+PjtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdXJsIGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxbUGFja2FnZUpzb24gfCB1bmRlZmluZWQsIHN0cmluZ10+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgcmV0dXJuIFtKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF07XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgcGFja2FnZUpzb25QYXRoXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1aWxkVHNSb290UGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gdXJsLmZpbGVVUkxUb1BhdGgocGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShpbXBvcnQubWV0YS51cmwpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZyB8IHVuZGVmaW5lZF0ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VKc29uLm5hbWU/LnRvU3RyaW5nKCkgfHwgJyc7XG4gIGNvbnN0IG1hdGNoID0gL0AoW14vXSspXFwvKC4rKS8uZXhlYyhwYWNrYWdlTmFtZSk7XG4gIGNvbnN0IFssIG5hbWVzcGFjZSwgbmFtZV0gPSBtYXRjaCB8fCBbXTtcbiAgcmV0dXJuIFtuYW1lc3BhY2UsIG5hbWVdO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdzJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICBpbnB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGhzIG9mIHNvdXJjZSBjb2RlIGZpbGVzIHRvIGJlIGJ1aWx0LiBUaGUgZmlyc3QgZmlsZSBpcyBtYWluLiBJZiBubyBvcHRpb24gaXMgZ2l2ZW4sIFwic3JjL2luZGV4Lnt0cyx0c3h9XCIgZnJvbSBwYWNrYWdlIGRpcmVjdG9yeSBpcyB0YXJnZXRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdpJyxcbiAgfSxcbiAgJ2NvcmUtanMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICAnY29yZS1qcy1wcm9wb3NhbHMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIHdpdGggcHJvcG9zYWxzIHN1cHBvcnQgaXMgZW1wbG95ZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIG1pbmlmeToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgbWluaWZpY2F0aW9uIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgc291cmNlbWFwOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBzb3VyY2VtYXAgaXMgZW5hYmxlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBleHRlcm5hbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBleHRlcm5hbCBkZXBlbmRlbmNpZXMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICBpbmxpbmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Vudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBpbmxpbmVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gIGtlZXBJbXBvcnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lkZW50aWZpZXJzIHRvIGJlIGtlcHQgYXMgaW1wb3J0IHN0YXRlbWVudHMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICBidW5kbGVCdWlsdGluczoge1xuICAgIGRlc2NyaXB0aW9uOiAnTW9kdWxlIG5hbWVzIHNhbWUgd2l0aCBidWlsdGlucyAoZS5nLiwgdW5kaWNpKSB0byBiZSBidW5kbGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBhcHBCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgb3IgZWl0aGVyIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zQnVpbGRlciA9IHtcbiAgLi4uYXBwQnVpbGRlcixcbiAgb25seVBhY2thZ2VKc29uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIGdlbmVyYXRlIG9ubHkgcGFja2FnZS5qc29uLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGxpYkJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG1vZHVsZVR5cGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ2VzbSwgY2pzLCBlaXRoZXIsIG9yIGJvdGggKGRlZmF1bHQpLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbiAgLy8gLmpzIGZpbGVzIGluIGEgcGFja2FnZSB3aXRoIGBcInR5cGVcIjogXCJtb2R1bGVcImAgYXJlIHRyZWF0ZWQgYXMgZXNtLlxuICAvLyBIb3dldmVyLCB3ZSB3YW50IHRvIHRyZWF0IHRoZW0gYXMgY2pzIGluIHRoZSBjYXNlIHdoZXJlIGEgY2pzIHByb2plY3QgaW1wb3J0cyBhbiBlc20gcGFja2FnZS5cbiAgLy8gVG8gZGVhbCB3aXRoIHRoZSBjYXNlLCB3ZSB1c2UgLmNqcyBhbmQgLm1qcyBleHRlbnNpb25zIGluc3RlYWQgb2YgLmpzIGV4dGVuc2lvbi5cbiAganNFeHRlbnNpb246IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gdXNlIC5qcyBpbiBjanMgYW5kL29yIGVzbTogZWl0aGVyIChkZWZhdWx0KSwgYm90aCwgb3Igbm9uZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnaicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBbnlCdWlsZGVyVHlwZSA9IHR5cGVvZiBhcHBCdWlsZGVyIHwgdHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXIgfCB0eXBlb2YgbGliQnVpbGRlcjtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGJhYmVsIH0gZnJvbSAnQHJvbGx1cC9wbHVnaW4tYmFiZWwnO1xuaW1wb3J0IGNvbW1vbmpzIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWNvbW1vbmpzJztcbmltcG9ydCBqc29uIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWpzb24nO1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnQHJvbGx1cC9wbHVnaW4tbm9kZS1yZXNvbHZlJztcbmltcG9ydCByZXBsYWNlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXJlcGxhY2UnO1xuaW1wb3J0IHRlcnNlciBmcm9tICdAcm9sbHVwL3BsdWdpbi10ZXJzZXInO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRPcHRpb25zLCBQbHVnaW4gfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IGFuYWx5emUgZnJvbSAncm9sbHVwLXBsdWdpbi1hbmFseXplcic7XG5pbXBvcnQgeyBrZWVwSW1wb3J0IH0gZnJvbSAncm9sbHVwLXBsdWdpbi1rZWVwLWltcG9ydCc7XG5pbXBvcnQgeyBub2RlRXh0ZXJuYWxzIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1ub2RlLWV4dGVybmFscyc7XG5pbXBvcnQgcHJlc2VydmVEaXJlY3RpdmVzIGZyb20gJ3JvbGx1cC1wbHVnaW4tcHJlc2VydmUtZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICdyb2xsdXAtcGx1Z2luLXN0cmluZyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0RGV0YWlsIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0QnVpbGRUc1Jvb3RQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQbHVnaW5zKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW11cbik6IFBsdWdpbltdIHtcbiAgY29uc3QgZXh0ZXJuYWxEZXBzID0gWy4uLihhcmd2LmV4dGVybmFsID8/IFtdKV0ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpO1xuICBpZiAocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ0BwcmlzbWEvY2xpZW50J10pIHtcbiAgICBleHRlcm5hbERlcHMucHVzaCgncHJpc21hLWNsaWVudCcpO1xuICB9XG4gIC8vIFNpbmNlIGBkZXBzOiB0cnVlYCBkb2VzIG5vdCB3b3JrIGZvciBgaW1wb3J0IGNodW5rIGZyb20gJ2xvZGFzaC5jaHVuay9pbmRleC5qcyc7YFxuICBleHRlcm5hbERlcHMucHVzaChcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IHt9KVxuICApO1xuICAvLyBBZGQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZyb20gc2libGluZyBwYWNrYWdlc1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhY2thZ2VEaXJzID0gZnMucmVhZGRpclN5bmMocGF0aC5qb2luKCcuLicpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlRGlyIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgICBpZiAoIXBhY2thZ2VEaXIuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbignLi4nLCBwYWNrYWdlRGlyLm5hbWUsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgb3RoZXJQYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW290aGVyUGFja2FnZUpzb24ubmFtZSA/PyAnJ10pIHtcbiAgICAgICAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBleHRlbnNpb25zID0gWycuY2pzJywgJy5tanMnLCAnLmpzJywgJy5qc3gnLCAnLmpzb24nLCAnLmN0cycsICcubXRzJywgJy50cycsICcudHN4J107XG4gIGNvbnN0IGJhYmVsQ29uZmlnUGF0aCA9IHBhdGguam9pbihnZXRCdWlsZFRzUm9vdFBhdGgoKSwgJ2JhYmVsLmNvbmZpZy5tanMnKTtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSBbXG4gICAgcmVwbGFjZSh7XG4gICAgICAvLyBJZ25vcmUgd29yZCBib3VuZGFyaWVzIGFuZCByZXBsYWNlIGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBzdHJpbmcuXG4gICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL3RyZWUvbWFzdGVyL3BhY2thZ2VzL3JlcGxhY2Ujd29yZC1ib3VuZGFyaWVzXG4gICAgICBkZWxpbWl0ZXJzOiBbJycsICcnXSxcbiAgICAgIHByZXZlbnRBc3NpZ25tZW50OiB0cnVlLFxuICAgICAgdmFsdWVzOiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oYXJndiksXG4gICAgfSksXG4gICAganNvbigpLFxuICAgIG5vZGVFeHRlcm5hbHMoe1xuICAgICAgZGVwczogdHJ1ZSxcbiAgICAgIGRldkRlcHM6IGZhbHNlLFxuICAgICAgcGVlckRlcHM6IHRydWUsXG4gICAgICBvcHREZXBzOiB0cnVlLFxuICAgICAgaW5jbHVkZTogZXh0ZXJuYWxEZXBzLm1hcCgobmFtZSkgPT4gbmV3IFJlZ0V4cChgXiR7bmFtZX0oPzpcXFxcLy4rKT9gKSksXG4gICAgICBleGNsdWRlOiBuYW1lc3BhY2UgJiYgbmV3IFJlZ0V4cChgXkA/JHtuYW1lc3BhY2V9KD86XFxcXC8uKyk/YCksXG4gICAgfSksXG4gICAgcmVzb2x2ZSh7XG4gICAgICBleHRlbnNpb25zLFxuICAgICAgcHJlZmVyQnVpbHRpbnM6IChpZDogc3RyaW5nKSA9PiAhYXJndi5idW5kbGVCdWlsdGlucz8uaW5jbHVkZXMoaWQpLFxuICAgIH0pLFxuICAgIGNvbW1vbmpzKCksXG4gICAga2VlcEltcG9ydCh7IG1vZHVsZU5hbWVzOiBhcmd2LmtlZXBJbXBvcnQ/Lm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKSA/PyBbXSB9KSxcbiAgXTtcbiAgY29uc3QgaXNCYWJlbEhlbHBlcnNCdW5kbGVkID1cbiAgICB0YXJnZXREZXRhaWwgPT09ICdhcHAtbm9kZScgfHwgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJyB8fCAhZXh0ZXJuYWxEZXBzLmluY2x1ZGVzKCdAYmFiZWwvcnVudGltZScpO1xuICBwcm9jZXNzLmVudi5CVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FID0gaXNCYWJlbEhlbHBlcnNCdW5kbGVkID8gJycgOiAnMSc7XG4gIHBsdWdpbnMucHVzaChcbiAgICBiYWJlbCh7XG4gICAgICBjb25maWdGaWxlOiBiYWJlbENvbmZpZ1BhdGgsXG4gICAgICBleHRlbnNpb25zLFxuICAgICAgLy8gV2UgbmVlZCBgcnVudGltZSBzaW5jZSBgYnVuZGxlZGAgbWF5IGJyZWFrIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYnkgY3JlYXRpbmcgX3ZpcnR1YWwgZGlyZWN0b3J5LlxuICAgICAgYmFiZWxIZWxwZXJzOiBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnYnVuZGxlZCcgOiAncnVudGltZScsXG4gICAgICBleGNsdWRlOiAvXiguK1xcLyk/bm9kZV9tb2R1bGVzXFwvLiskLyxcbiAgICB9KSxcbiAgICAuLi4ob3V0cHV0T3B0aW9uc0xpc3Quc29tZSgob3B0cykgPT4gb3B0cy5wcmVzZXJ2ZU1vZHVsZXMpID8gW3ByZXNlcnZlRGlyZWN0aXZlcygpXSA6IFtdKSxcbiAgICBzdHJpbmcoeyBpbmNsdWRlOiBbJyoqLyouY3N2JywgJyoqLyoudHh0J10gfSlcbiAgKTtcbiAgaWYgKGFyZ3YubWluaWZ5KSB7XG4gICAgcGx1Z2lucy5wdXNoKHRlcnNlcih7IGNvbXByZXNzOiB7IGRpcmVjdGl2ZXM6IGZhbHNlIH0gfSkpO1xuICB9XG4gIHBsdWdpbnMucHVzaChhbmFseXplKHsgc3VtbWFyeU9ubHk6IHRydWUgfSkpO1xuICByZXR1cm4gcGx1Z2lucztcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG4vLyBXZSBjYW5ub3QgdXNlIG5hbWVkIGltcG9ydHMgZnJvbSAndHlwZXNjcmlwdCcgYmVjYXVzZSBvZiBidWlsZCBlcnJvcnMuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBjb3JlUHJvamVjdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvcmVDb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUoY29yZVByb2plY3REaXJQYXRoLCB0cy5zeXMuZmlsZUV4aXN0cyk7XG4gIGlmICghY29yZUNvbmZpZ0ZpbGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgdHNjb25maWcuanNvbiBpbiAke2NvcmVQcm9qZWN0RGlyUGF0aH0uYCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0ZvdW5kIHRzY29uZmlnLmpzb246JywgY29yZUNvbmZpZ0ZpbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGxldCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBwYXRoLmJhc2VuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCksICdzcmMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29yZVByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChwcm9qZWN0RGlyUGF0aCA9PT0gY29yZVByb2plY3REaXJQYXRoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHRzLmZpbmRDb25maWdGaWxlKHByb2plY3REaXJQYXRoLCB0cy5zeXMuZmlsZUV4aXN0cyk7XG4gICAgICBjb25zdCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBkaXJlbnQubmFtZSwgJ3NyYycpO1xuICAgICAgaWYgKGNvbmZpZ0ZpbGUgJiYgZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgICAgIHByb2plY3RzLnB1c2goW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0RGlyID0gJ2Rpc3QnO1xuICB9XG4gIHByb2plY3RzLnB1c2goW2NvcmVQcm9qZWN0RGlyUGF0aCwgY29yZUNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuXG4gIGxldCBhbGxTdWNjZWVkZWQgPSB0cnVlO1xuICBmb3IgKGNvbnN0IFtwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyXSBvZiBwcm9qZWN0cykge1xuICAgIGFsbFN1Y2NlZWRlZCAmJj0gcnVuVHlwZVNjcmlwdENvbXBpbGVyKGFyZ3YsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBwYXRoLmpvaW4oY29yZVByb2plY3REaXJQYXRoLCBvdXREaXIpKTtcbiAgfVxuICByZXR1cm4gYWxsU3VjY2VlZGVkO1xufVxuXG5mdW5jdGlvbiBydW5UeXBlU2NyaXB0Q29tcGlsZXIoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygncnVuVHlwZVNjcmlwdENvbXBpbGVyKCknLCBwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyKTtcbiAgfVxuXG4gIGNvbnN0IHsgY29uZmlnIH0gPSB0cy5yZWFkQ29uZmlnRmlsZShjb25maWdGaWxlLCB0cy5zeXMucmVhZEZpbGUpO1xuICBjb25maWcuY29tcGlsZXJPcHRpb25zID0ge1xuICAgIC4uLmNvbmZpZy5jb21waWxlck9wdGlvbnMsXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgZW1pdERlY2xhcmF0aW9uT25seTogdHJ1ZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG5vRW1pdE9uRXJyb3I6IHRydWUsXG4gICAgb3V0RGlyLFxuICB9O1xuICBjb25maWcuaW5jbHVkZSA9IFsnc3JjLyoqLyonXTtcbiAgY29uc3QgeyBlcnJvcnMsIGZpbGVOYW1lcywgb3B0aW9ucyB9ID0gdHMucGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQoY29uZmlnLCB0cy5zeXMsIHByb2plY3REaXJQYXRoKTtcblxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbSh7IG9wdGlvbnMsIHJvb3ROYW1lczogZmlsZU5hbWVzLCBjb25maWdGaWxlUGFyc2luZ0RpYWdub3N0aWNzOiBlcnJvcnMgfSk7XG4gIGNvbnN0IHsgZGlhZ25vc3RpY3MsIGVtaXRTa2lwcGVkIH0gPSBwcm9ncmFtLmVtaXQoKTtcblxuICBjb25zdCBhbGxEaWFnbm9zdGljcyA9IFsuLi50cy5nZXRQcmVFbWl0RGlhZ25vc3RpY3MocHJvZ3JhbSksIC4uLmRpYWdub3N0aWNzLCAuLi5lcnJvcnNdO1xuICBpZiAoYWxsRGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZvcm1hdEhvc3Q6IHRzLkZvcm1hdERpYWdub3N0aWNzSG9zdCA9IHtcbiAgICAgIGdldENhbm9uaWNhbEZpbGVOYW1lOiAocGF0aCkgPT4gcGF0aCxcbiAgICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6IHRzLnN5cy5nZXRDdXJyZW50RGlyZWN0b3J5LFxuICAgICAgZ2V0TmV3TGluZTogKCkgPT4gdHMuc3lzLm5ld0xpbmUsXG4gICAgfTtcbiAgICBjb25zdCBtZXNzYWdlID0gdHMuZm9ybWF0RGlhZ25vc3RpY3MoYWxsRGlhZ25vc3RpY3MsIGZvcm1hdEhvc3QpO1xuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gIWVtaXRTa2lwcGVkO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBkYXRlVGltZSBmcm9tICdkYXRlLXRpbWUnO1xuaW1wb3J0IG1zIGZyb20gJ3ByZXR0eS1tcyc7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFJvbGx1cEJ1aWxkLCBSb2xsdXBPcHRpb25zIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCB7IHJvbGx1cCwgd2F0Y2ggfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyIH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHsgb25FeGl0IH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldENhdGVnb3J5LCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbGxUYXJnZXRDYXRlZ29yaWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmFtZXNwYWNlQW5kTmFtZSwgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlLCBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGFwcEJ1aWxkZXIsIGZ1bmN0aW9uc0J1aWxkZXIsIGxpYkJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgc2V0dXBQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW4uanMnO1xuaW1wb3J0IHsgaGFuZGxlRXJyb3IgfSBmcm9tICcuL3JvbGx1cExvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMgfSBmcm9tICcuL3R5cGVTY3JpcHQuanMnO1xuXG5leHBvcnQgY29uc3QgYXBwOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGFwcEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2FwcCBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGFuIGFwcCcsXG4gIGJ1aWxkZXI6IGFwcEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnYXBwJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2Z1bmN0aW9ucyBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgR0NQL0ZpcmViYXNlIGZ1bmN0aW9ucyBhcHAnLFxuICBidWlsZGVyOiBmdW5jdGlvbnNCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5vbmx5UGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICAgICAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgIGlmICghcGFja2FnZUpzb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWlsZChhcmd2LCAnZnVuY3Rpb25zJyk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGxpYjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBsaWJCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaWIgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIE5vZGUuanMgLyBSZWFjdCBsaWJyYXJ5JyxcbiAgYnVpbGRlcjogbGliQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdsaWInKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgdGFyZ2V0Q2F0ZWdvcnk6IFRhcmdldENhdGVnb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8PSAncHJvZHVjdGlvbic7XG5cbiAgLy8gYHNpbGVudGAgaXMgc3Ryb25nZXIgdGhhbiBgdmVyYm9zZWAuXG4gIGNvbnN0IHZlcmJvc2UgPSAhYXJndi5zaWxlbnQgJiYgYXJndi52ZXJib3NlO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcGFja2FnZURpclBhdGgpO1xuXG4gIGNvbnN0IGlucHV0cyA9IHZlcmlmeUlucHV0KGFyZ3YsIGN3ZCwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCB0YXJnZXREZXRhaWwgPSBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnksIGlucHV0cyk7XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ2FyZ3Y6JywgYXJndik7XG4gICAgY29uc29sZS5pbmZvKCdwYWNrYWdlSnNvblBhdGg6JywgcGFja2FnZUpzb25QYXRoKTtcbiAgICBjb25zb2xlLmluZm8oJ1RhcmdldCAoQ2F0ZWdvcnkpOicsIGAke3RhcmdldERldGFpbH0gKCR7dGFyZ2V0Q2F0ZWdvcnl9KWApO1xuICB9XG5cbiAgY29uc3QgW25hbWVzcGFjZV0gPSBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uKTtcbiAgY29uc3QgaXNFc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG5cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKUyA9ICcxJztcbiAgfSBlbHNlIGlmIChhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTID0gJzEnO1xuICB9XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19WRVJCT1NFID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSA9IHRhcmdldENhdGVnb3J5O1xuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfREVUQUlMID0gdGFyZ2V0RGV0YWlsO1xuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0ID0gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlRGlyUGF0aCwgaXNFc21QYWNrYWdlKTtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ091dHB1dE9wdGlvbnM6Jywgb3V0cHV0T3B0aW9uc0xpc3QpO1xuICB9XG4gIGlmIChvdXRwdXRPcHRpb25zTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IG91dHB1dCBmaWxlcy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmNoZGlyKHBhY2thZ2VEaXJQYXRoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBSb2xsdXBPcHRpb25zID0ge1xuICAgIGlucHV0OlxuICAgICAgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJ1xuICAgICAgICA/IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIGlucHV0cy5tYXAoKGlucHV0LCBpbmRleCkgPT4gW2luZGV4ID09PSAwID8gJ2luZGV4JyA6IHBhdGguYmFzZW5hbWUoaW5wdXQsIHBhdGguZXh0bmFtZShpbnB1dCkpLCBpbnB1dF0pXG4gICAgICAgICAgKVxuICAgICAgICA6IGlucHV0cyxcbiAgICBwbHVnaW5zOiBzZXR1cFBsdWdpbnMoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlSnNvbiwgbmFtZXNwYWNlLCBwYWNrYWdlRGlyUGF0aCwgb3V0cHV0T3B0aW9uc0xpc3QpLFxuICAgIHdhdGNoOiBhcmd2LndhdGNoID8geyBjbGVhclNjcmVlbjogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgfTtcblxuICBjb25zdCBwYXRoVG9SZWxhdGl2ZVBhdGggPSAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHN0cmluZ1tdID0+XG4gICAgKEFycmF5LmlzQXJyYXkocGF0aHMpID8gcGF0aHMgOiBbcGF0aHNdKS5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHApKTtcbiAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICB3YXRjaFJvbGx1cChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBvcHRpb25zLCBvdXRwdXRPcHRpb25zTGlzdCwgcGF0aFRvUmVsYXRpdmVQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dHMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbignLCAnKVxuICAgICAgICAgICl9XFxub24gJHtwYWNrYWdlRGlyUGF0aH0gLi4uYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBidW5kbGU6IFJvbGx1cEJ1aWxkIHwgdW5kZWZpbmVkO1xuICAgIGxldCBidWlsZEZhaWxlZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgX2J1bmRsZSA9IGF3YWl0IHJvbGx1cChvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke3BhdGhUb1JlbGF0aXZlUGF0aChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IG9wdHMuZmlsZSB8fCBvcHRzLmRpciB8fCAnJykpLmpvaW4oXG4gICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICl9IGluICR7Y2hhbGsuYm9sZChtcyhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJlxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJyAmJlxuICAgICAgIShhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgpKVxuICAgICkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXRjaFJvbGx1cChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHRhcmdldERldGFpbDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSb2xsdXBPcHRpb25zLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdLFxuICBwYXRoVG9SZWxhdGl2ZVBhdGg6IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KSA9PiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGNvbnN0IHdhdGNoZXIgPSB3YXRjaCh7IC4uLm9wdGlvbnMsIG91dHB1dDogb3V0cHV0T3B0aW9uc0xpc3QgfSk7XG5cbiAgY29uc3QgY2xvc2UgPSBhc3luYyAoY29kZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsb3NlKTtcbiAgICBpZiAod2F0Y2hlcikgYXdhaXQgd2F0Y2hlci5jbG9zZSgpO1xuICAgIGlmIChjb2RlKSBwcm9jZXNzLmV4aXQoY29kZSk7XG4gIH07XG4gIG9uRXhpdChjbG9zZSBhcyB1bmtub3duIGFzIEhhbmRsZXIpO1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlKTtcbiAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbignZW5kJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG4gIH1cblxuICB3YXRjaGVyLm9uKCdldmVudCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGV2ZW50LmVycm9yLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCVU5ETEVfU1RBUlQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc3QgZXZlbnRJbnB1dCA9IGV2ZW50LmlucHV0O1xuICAgICAgICBjb25zdCBpbnB1dEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGV2ZW50SW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKGV2ZW50SW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlucHV0RmlsZXMucHVzaChcbiAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KGV2ZW50SW5wdXQpID8gZXZlbnRJbnB1dCA6IE9iamVjdC52YWx1ZXMoZXZlbnRJbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dEZpbGVzKS5qb2luKCcsICcpKX0g4oaSICR7Y2hhbGsuYm9sZChcbiAgICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKVxuICAgICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9FTkQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgYENyZWF0ZWQgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChldmVudC5vdXRwdXQpLmpvaW4oJywgJykpfSBpbiAke2NoYWxrLmJvbGQobXMoZXZlbnQuZHVyYXRpb24pKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiYgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJykge1xuICAgICAgICAgIGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFTkQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG5bJHtkYXRlVGltZSgpfV0gd2FpdGluZyBmb3IgY2hhbmdlcy4uLmApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ3Jlc3VsdCcgaW4gZXZlbnQgJiYgZXZlbnQucmVzdWx0KSB7XG4gICAgICB2b2lkIGV2ZW50LnJlc3VsdC5jbG9zZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUlucHV0KGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LCBjd2Q6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3YuaW5wdXQgJiYgYXJndi5pbnB1dC5sZW5ndGggPiAwKSByZXR1cm4gYXJndi5pbnB1dC5tYXAoKHApID0+IHBhdGguam9pbihjd2QsIHAudG9TdHJpbmcoKSkpO1xuXG4gIGNvbnN0IHNyY0RpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKTtcbiAgZm9yIChjb25zdCBleHQgb2YgWyd0cycsICd0c3gnLCAnY3RzJywgJ210cyddKSB7XG4gICAgY29uc3QgaW5wdXQgPSBwYXRoLmpvaW4oc3JjRGlyUGF0aCwgYGluZGV4LiR7ZXh0fWApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGlucHV0KSkgcmV0dXJuIFtpbnB1dF07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IGlucHV0IGZpbGUuJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5OiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10pOiBUYXJnZXREZXRhaWwge1xuICBzd2l0Y2ggKHRhcmdldENhdGVnb3J5KSB7XG4gICAgY2FzZSAnYXBwJzoge1xuICAgICAgcmV0dXJuICdhcHAtbm9kZSc7XG4gICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9ucyc6IHtcbiAgICAgIHJldHVybiAnZnVuY3Rpb25zJztcbiAgICB9XG4gICAgY2FzZSAnbGliJzoge1xuICAgICAgaWYgKGlucHV0cy5zb21lKChpbnB1dCkgPT4gaW5wdXQuZW5kc1dpdGgoJy50c3gnKSkpIHtcbiAgICAgICAgcmV0dXJuICdsaWItcmVhY3QnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdsaWInO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0YXJnZXQgb3B0aW9uIG11c3QgYmUgb25lIG9mOiAnICsgYWxsVGFyZ2V0Q2F0ZWdvcmllcy5qb2luKCcsICcpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBwYWNrYWdlSnNvbi5uYW1lICs9ICctZGlzdCc7XG4gIGNvbnN0IGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgY29uc3QgZXNtT3V0cHV0ID0gaXNFc21PdXRwdXQoZXNtUGFja2FnZSwgbW9kdWxlVHlwZSk7XG4gIHBhY2thZ2VKc29uLm1haW4gPSBlc21QYWNrYWdlID09PSBlc21PdXRwdXQgPyAnaW5kZXguanMnIDogZXNtT3V0cHV0ID8gJ2luZGV4Lm1qcycgOiAnaW5kZXguY2pzJztcblxuICAvLyBQcmV2ZW50IEZpcmViYXNlIEZ1bmN0aW9ucyBmcm9tIHJ1bm5pbmcgYGJ1aWxkYCBzY3JpcHQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIC8vIGRldkRlcGVuZGVuY2llcyBhcmUgbm90IHJlcXVpcmVkIHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSk7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dE9wdGlvbnNMaXN0KFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIGlzRXNtUGFja2FnZTogYm9vbGVhblxuKTogT3V0cHV0T3B0aW9uc1tdIHtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgICBmb3JtYXQ6IGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZSwgYXJndi5tb2R1bGVUeXBlKSA/ICdtb2R1bGUnIDogJ2NvbW1vbmpzJyxcbiAgICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCAmJiAnaW5saW5lJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoZSBmb2xsb3dpbmcgaW1wb3J0IHN0YXRlbWVudCBpbiBhbiBlc20gbW9kdWxlIGNhdXNlcyB0aGUgZm9sbG93aW5nIGVycm9yOlxuICAvLyBTdGF0ZW1lbnQ6XG4gIC8vICAgaW1wb3J0IHsgdXNlUHJldmlvdXMgfSBmcm9tICdyZWFjdC11c2UnO1xuICAvLyBFcnJvcjpcbiAgLy8gICBOYW1lZCBleHBvcnQgJ3VzZVByZXZpb3VzJyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICdyZWFjdC11c2UnIGlzIGEgQ29tbW9uSlMgbW9kdWxlLFxuICAvLyAgIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbiAgLy8gV2UgbmVlZCBjanMgbW9kdWxlcyBmb3Igd2ViIGFwcHMgdG8gYXZvaWQgdGhlIGVycm9yLlxuICAvLyBBbHNvLCBzcGxpdHRpbmcgYSBsaWJyYXJ5IGlzIHVzZWZ1bCBpbiBib3RoIG1vZHVsZXMsIHNvIHByZXNlcnZlTW9kdWxlcyBzaG91bGQgYmUgdHJ1ZS5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSA9IFtdO1xuICBjb25zdCBtb2R1bGVUeXBlID0gYXJndi5tb2R1bGVUeXBlIHx8ICdib3RoJztcbiAgY29uc3QganNFeHQgPSBhcmd2LmpzRXh0ZW5zaW9uIHx8ICdlaXRoZXInO1xuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2NqcycgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5janMnLFxuICAgICAgZm9ybWF0OiAnY29tbW9uanMnLFxuICAgICAgcHJlc2VydmVNb2R1bGVzOiB0cnVlLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICB9KTtcbiAgfVxuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0ubWpzJyxcbiAgICAgIGZvcm1hdDogJ21vZHVsZScsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvdXRwdXRPcHRpb25zTGlzdDtcbn1cblxuZnVuY3Rpb24gaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlOiBib29sZWFuLCBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1vZHVsZVR5cGUgPT09ICdlc20nIHx8ICgoIW1vZHVsZVR5cGUgfHwgbW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicpICYmIGlzRXNtUGFja2FnZSk7XG59XG4iLCJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBSb2xsdXBFcnJvciB9IGZyb20gJ3JvbGx1cCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcjogUm9sbHVwRXJyb3IsIHJlY292ZXIgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZSB8fCAoZXJyb3IuY2F1c2UgYXMgRXJyb3IpPy5uYW1lO1xuICBjb25zdCBuYW1lU2VjdGlvbiA9IG5hbWUgPyBgJHtuYW1lfTogYCA6ICcnO1xuICBjb25zdCBwbHVnaW5TZWN0aW9uID0gZXJyb3IucGx1Z2luID8gYChwbHVnaW4gJHtlcnJvci5wbHVnaW59KSBgIDogJyc7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtwbHVnaW5TZWN0aW9ufSR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfWA7XG5cbiAgY29uc3Qgb3V0cHV0TGluZXMgPSBbY2hhbGsuYm9sZChjaGFsay5yZWQoYFshXSAke2NoYWxrLmJvbGQobWVzc2FnZS50b1N0cmluZygpKX1gKSldO1xuXG4gIGlmIChlcnJvci51cmwpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmN5YW4oZXJyb3IudXJsKSk7XG4gIH1cblxuICBpZiAoZXJyb3IubG9jKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChgJHtlcnJvci5sb2MuZmlsZSB8fCBlcnJvci5pZH0gKCR7ZXJyb3IubG9jLmxpbmV9OiR7ZXJyb3IubG9jLmNvbHVtbn0pYCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IuaWQpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGVycm9yLmlkKTtcbiAgfVxuXG4gIGlmIChlcnJvci5mcmFtZSkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLmZyYW1lKSk7XG4gIH1cblxuICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmRpbShlcnJvci5zdGFjaz8ucmVwbGFjZShgJHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9XFxuYCwgJycpKSk7XG4gIH1cblxuICBvdXRwdXRMaW5lcy5wdXNoKCcnLCAnJyk7XG4gIGNvbnNvbGUuZXJyb3Iob3V0cHV0TGluZXMuam9pbignXFxuJykpO1xuXG4gIGlmICghcmVjb3ZlcikgcHJvY2Vzcy5leGl0KDEpO1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uL2Vudi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsXG4gIG1vZHVsZToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtb2R1bGUgdHlwZTogY2pzIG9yIGVzbScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcnVuOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3J1biA8ZmlsZT4nLFxuICBkZXNjcmliZTogJ1J1biBzY3JpcHQnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcHJvY2Vzcy5jd2QoKSk7XG5cbiAgICBjb25zdCBmaWxlID0gYXJndi5maWxlPy50b1N0cmluZygpIHx8ICcnO1xuXG4gICAgLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgICBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MudmVyc2lvbnMuYnVuO1xuICAgIGNvbnN0IHJ1bnRpbWUgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ25vZGUnO1xuICAgIGNvbnN0IGFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/IFsnLS1idW4nXSA6IFsnLS1uby13YXJuaW5ncycsICctLWltcG9ydCcsICd0c3gnXTtcbiAgICBpZiAoYXJndi53YXRjaCkge1xuICAgICAgYXJncy5wdXNoKCctLXdhdGNoJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChmaWxlKTtcbiAgICBjb25zdCBbLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzXSA9IGFyZ3YuXztcbiAgICBjb25zdCBydW50aW1lQXJncyA9IFsuLi5hcmdzLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzLm1hcCgoYXJnKSA9PiBhcmcudG9TdHJpbmcoKSldO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyAnJHtydW50aW1lfSAke3J1bnRpbWVBcmdzLmpvaW4oJyAnKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHJ1bnRpbWUsIHJ1bnRpbWVBcmdzLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52IH0sXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMgPz8gMSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBhcHAsIGZ1bmN0aW9ucywgbGliIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZC9idWlsZC5qcyc7XG5pbXBvcnQgeyBydW4gfSBmcm9tICcuL2NvbW1hbmRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5yZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCdidWlsZC10cycpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAuY29tbWFuZChhcHApXG4gIC5jb21tYW5kKGZ1bmN0aW9ucylcbiAgLmNvbW1hbmQobGliKVxuICAuY29tbWFuZChydW4pXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC5oZWxwKCkuYXJndjtcbiJdLCJuYW1lcyI6WyJlbnZWYXJzIiwibG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIiwiYXJndiIsImN3ZCIsInJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwiT2JqZWN0Iiwia2V5cyIsImNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiIsImVudlZhcnNEZWYiLCJlbnZWYXJOYW1lcyIsIlNldCIsImlubGluZSIsImZsYXRNYXAiLCJlIiwidG9TdHJpbmciLCJzcGxpdCIsIm5hbWUiLCJ1bmRlZmluZWQiLCJwcm9jZXNzIiwiZW52IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbFRhcmdldENhdGVnb3JpZXMiLCJhc3luYyIsInJlYWRQYWNrYWdlSnNvbiIsImRpclBhdGgiLCJwYWNrYWdlSnNvblBhdGgiLCJwYXRoIiwiam9pbiIsInBhY2thZ2VKc29uVGV4dCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInBhcnNlIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Iiwic2lsZW50IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJidWlsZGVyIiwiaW5wdXQiLCJkZWZhdWx0IiwibWluaWZ5Iiwic291cmNlbWFwIiwiZXh0ZXJuYWwiLCJ3YXRjaCIsImtlZXBJbXBvcnQiLCJidW5kbGVCdWlsdGlucyIsImFwcEJ1aWxkZXIiLCJtb2R1bGVUeXBlIiwiZnVuY3Rpb25zQnVpbGRlciIsIm9ubHlQYWNrYWdlSnNvbiIsImxpYkJ1aWxkZXIiLCJqc0V4dGVuc2lvbiIsInNldHVwUGx1Z2lucyIsInRhcmdldERldGFpbCIsInBhY2thZ2VKc29uIiwibmFtZXNwYWNlIiwicGFja2FnZURpclBhdGgiLCJvdXRwdXRPcHRpb25zTGlzdCIsImV4dGVybmFsRGVwcyIsIm1hcCIsIml0ZW0iLCJkZXBlbmRlbmNpZXMiLCJwdXNoIiwicGVlckRlcGVuZGVuY2llcyIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwiZXhpc3RzU3luYyIsInBhY2thZ2VEaXJzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicGFja2FnZURpciIsImlzRGlyZWN0b3J5Iiwib3RoZXJQYWNrYWdlSnNvbiIsInJlYWRGaWxlU3luYyIsImV4dGVuc2lvbnMiLCJiYWJlbENvbmZpZ1BhdGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZGlybmFtZSIsInBsdWdpbnMiLCJyZXBsYWNlIiwiZGVsaW1pdGVycyIsInByZXZlbnRBc3NpZ25tZW50IiwidmFsdWVzIiwianNvbiIsIm5vZGVFeHRlcm5hbHMiLCJkZXBzIiwiZGV2RGVwcyIsInBlZXJEZXBzIiwib3B0RGVwcyIsImluY2x1ZGUiLCJSZWdFeHAiLCJleGNsdWRlIiwicmVzb2x2ZSIsInByZWZlckJ1aWx0aW5zIiwiaWQiLCJpbmNsdWRlcyIsImNvbW1vbmpzIiwibW9kdWxlTmFtZXMiLCJpc0JhYmVsSGVscGVyc0J1bmRsZWQiLCJCVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FIiwiYmFiZWwiLCJjb25maWdGaWxlIiwiYmFiZWxIZWxwZXJzIiwic29tZSIsIm9wdHMiLCJwcmVzZXJ2ZU1vZHVsZXMiLCJwcmVzZXJ2ZURpcmVjdGl2ZXMiLCJzdHJpbmciLCJ0ZXJzZXIiLCJjb21wcmVzcyIsImRpcmVjdGl2ZXMiLCJhbmFseXplIiwic3VtbWFyeU9ubHkiLCJnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMiLCJjb3JlUHJvamVjdERpclBhdGgiLCJjb3JlQ29uZmlnRmlsZSIsInRzIiwiZmluZENvbmZpZ0ZpbGUiLCJzeXMiLCJmaWxlRXhpc3RzIiwiRXJyb3IiLCJwcm9qZWN0cyIsIm91dERpciIsImJhc2VuYW1lIiwicGFyZW50RGlyUGF0aCIsImRpcmVudHMiLCJyZWFkZGlyIiwiZGlyZW50IiwicHJvamVjdERpclBhdGgiLCJhbGxTdWNjZWVkZWQiLCJydW5UeXBlU2NyaXB0Q29tcGlsZXIiLCJjb25maWciLCJyZWFkQ29uZmlnRmlsZSIsImNvbXBpbGVyT3B0aW9ucyIsImRlY2xhcmF0aW9uIiwiZW1pdERlY2xhcmF0aW9uT25seSIsIm5vRW1pdCIsIm5vRW1pdE9uRXJyb3IiLCJlcnJvcnMiLCJmaWxlTmFtZXMiLCJvcHRpb25zIiwicGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQiLCJwcm9ncmFtIiwiY3JlYXRlUHJvZ3JhbSIsInJvb3ROYW1lcyIsImNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3MiLCJkaWFnbm9zdGljcyIsImVtaXRTa2lwcGVkIiwiZW1pdCIsImFsbERpYWdub3N0aWNzIiwiZ2V0UHJlRW1pdERpYWdub3N0aWNzIiwibGVuZ3RoIiwiZm9ybWF0SG9zdCIsImdldENhbm9uaWNhbEZpbGVOYW1lIiwiZ2V0Q3VycmVudERpcmVjdG9yeSIsImdldE5ld0xpbmUiLCJuZXdMaW5lIiwibWVzc2FnZSIsImZvcm1hdERpYWdub3N0aWNzIiwid2FybiIsImFwcCIsImNvbW1hbmQiLCJkZXNjcmliZSIsImhhbmRsZXIiLCJidWlsZCIsImZ1bmN0aW9ucyIsInBhY2thZ2UiLCJlcnJvciIsImV4aXQiLCJnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zIiwibGliIiwidGFyZ2V0Q2F0ZWdvcnkiLCJOT0RFX0VOViIsImlucHV0cyIsInAiLCJzcmNEaXJQYXRoIiwiZXh0IiwidmVyaWZ5SW5wdXQiLCJlbmRzV2l0aCIsImRldGVjdFRhcmdldERldGFpbCIsInBhY2thZ2VOYW1lIiwibWF0Y2giLCJleGVjIiwiZ2V0TmFtZXNwYWNlQW5kTmFtZSIsImlzRXNtUGFja2FnZSIsIkJVSUxEX1RTX0NPUkVKUyIsIkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyIsIkJVSUxEX1RTX1ZFUkJPU0UiLCJCVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkiLCJCVUlMRF9UU19UQVJHRVRfREVUQUlMIiwib3V0RGlyUGF0aCIsImRpciIsImZvcm1hdCIsImlzRXNtT3V0cHV0IiwianNFeHQiLCJlbnRyeUZpbGVOYW1lcyIsImdldE91dHB1dE9wdGlvbnNMaXN0IiwiY2hkaXIiLCJybSIsInJlY3Vyc2l2ZSIsImZvcmNlIiwiZnJvbUVudHJpZXMiLCJpbmRleCIsImV4dG5hbWUiLCJjbGVhclNjcmVlbiIsInBhdGhUb1JlbGF0aXZlUGF0aCIsInBhdGhzIiwiQXJyYXkiLCJpc0FycmF5IiwicmVsYXRpdmUiLCJ3YXRjaGVyIiwib3V0cHV0IiwiY2xvc2UiLCJyZW1vdmVMaXN0ZW5lciIsInN0ZGluIiwiY29kZSIsIm9uRXhpdCIsIm9uIiwiaXNUVFkiLCJyZXN1bWUiLCJldmVudCIsInJlY292ZXIiLCJjYXVzZSIsIm5hbWVTZWN0aW9uIiwicGx1Z2luIiwib3V0cHV0TGluZXMiLCJjaGFsayIsImJvbGQiLCJyZWQiLCJjeWFuIiwibG9jIiwiZmlsZSIsImxpbmUiLCJjb2x1bW4iLCJmcmFtZSIsImRpbSIsInN0YWNrIiwiaGFuZGxlRXJyb3IiLCJldmVudElucHV0IiwiaW5wdXRGaWxlcyIsImdyZWVuIiwibXMiLCJkdXJhdGlvbiIsImRhdGVUaW1lIiwicmVzdWx0Iiwid2F0Y2hSb2xsdXAiLCJidW5kbGUiLCJidWlsZEZhaWxlZCIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJfYnVuZGxlIiwicm9sbHVwIiwiUHJvbWlzZSIsImFsbCIsIndyaXRlIiwiZXNtUGFja2FnZSIsImVzbU91dHB1dCIsIm1haW4iLCJzY3JpcHRzIiwiZGV2RGVwZW5kZW5jaWVzIiwibWtkaXIiLCJ3cml0ZUZpbGUiLCJydW4iLCJtb2R1bGUiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwicnVudGltZSIsImFyZ3MiLCJhZGRpdGlvbmFsQXJndW1lbnRzIiwiXyIsInJ1bnRpbWVBcmdzIiwiYXJnIiwicmV0IiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luYyIsInN0ZGlvIiwic3RhdHVzIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwieWFyZ3MiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJoZWxwIl0sIm1hcHBpbmdzIjoicy9CQU1BLElBQUlBLEVBS0csU0FBU0MsRUFDZEMsRUFDQUMsR0FRQSxPQU5LSCxJQUNIQSxFQUFVSSxFQUFpQ0Ys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
1
+ import{readAndApplyEnvironmentVariables as e,yargsOptionsBuilderForEnv as o,removeNpmAndYarnEnvironmentVariables as n}from"@willbooster/shared-lib-node";import s from"yargs";import{hideBin as i}from"yargs/helpers";import t from"node:fs";import r from"node:path";import c from"chalk";import a from"date-time";import p from"pretty-ms";import{rollup as l,watch as d}from"rollup";import{onExit as u}from"signal-exit";import m from"node:url";import{babel as f}from"@rollup/plugin-babel";import y from"@rollup/plugin-commonjs";import b from"@rollup/plugin-json";import g from"@rollup/plugin-node-resolve";import h from"@rollup/plugin-replace";import j from"@rollup/plugin-terser";import v from"rollup-plugin-analyzer";import{keepImport as w}from"rollup-plugin-keep-import";import{nodeExternals as x}from"rollup-plugin-node-externals";import k from"rollup-plugin-preserve-directives";import{string as S}from"rollup-plugin-string";import $ from"node:process";import E from"typescript";import*as D from"node:child_process";let O;function T(o,n){return O||(O=e(o,n),o.verbose&&console.info("Loaded env vars:",Object.keys(O))),O}function F(e,o){const n={},s=new Set([...(e.inline??[]).flatMap((e=>e.toString().split(","))),...e.autoInline?Object.keys(T(e,o)):[]]);for(const e of s)void 0!==process.env[e]&&(n[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info("Inline env vars:",Object.keys(n)),n}const _=["app","functions","lib"];async function N(e){const o=r.join(e,"package.json");try{const e=await t.promises.readFile(o,"utf8");return[JSON.parse(e),o]}catch{}return[void 0,o]}const B={...o,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},R={...B,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},"auto-inline":{description:"Inline environment variables defined at env files.",type:"boolean",default:!1},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"},keepImport:{description:"Identifiers to be kept as import statements.",type:"array"},bundleBuiltins:{description:"Module names same with builtins (e.g., undici) to be bundled.",type:"array"}},C={...R,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},L={...C,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},I={...R,moduleType:{description:"esm, cjs, either, or both (default).",type:"string",alias:"m"},jsExtension:{description:"Whether to use .js in cjs and/or esm: either (default), both, or none.",type:"string",alias:"j"}};function A(e,o,n,s,i,c){const a=[...e.external??[]].map((e=>e.toString()));if(n.dependencies?.["@prisma/client"]&&a.push("prisma-client"),a.push(...Object.keys(n.dependencies??{}),...Object.keys(n.peerDependencies??{}),...Object.keys(n.optionalDependencies??{})),t.existsSync(r.join("..","..","package.json"))){const e=t.readdirSync(r.join(".."),{withFileTypes:!0});for(const o of e){if(!o.isDirectory())continue;const e=r.join("..",o.name,"package.json");if(!t.existsSync(e))continue;const s=JSON.parse(t.readFileSync(e,"utf8"));n.dependencies?.[s.name??""]&&a.push(...Object.keys(s.dependencies??{}),...Object.keys(s.peerDependencies??{}),...Object.keys(s.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=r.join(m.fileURLToPath(r.dirname(r.dirname(import.meta.url))),"babel.config.mjs"),d=[h({delimiters:["",""],preventAssignment:!0,values:F(e,i)}),b(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:a.map((e=>new RegExp(`^${e}(?:\\/.+)?`))),exclude:s&&new RegExp(`^@?${s}(?:\\/.+)?`)}),g({extensions:p,preferBuiltins:o=>!e.bundleBuiltins?.includes(o)}),y(),w({moduleNames:e.keepImport?.map((e=>e.toString()))??[]})],u="app-node"===o||"functions"===o||!a.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=u?"":"1",d.push(f({configFile:l,extensions:p,babelHelpers:u?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...c.some((e=>e.preserveModules))?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),e.minify&&d.push(j({compress:{directives:!1}})),d.push(v({summaryOnly:!0})),d}async function P(e,o){const n=E.findConfigFile(o,E.sys.fileExists);if(!n)throw new Error(`Failed to find tsconfig.json in ${o}.`);e.verbose&&console.info("Found tsconfig.json:",n);const s=[];let i=r.join("dist",r.basename(o),"src");if(t.existsSync(i)){const e=r.dirname(o),n=await t.promises.readdir(e,{withFileTypes:!0});o=r.resolve(o);for(const i of n){if(!i.isDirectory())continue;const n=r.resolve(e,i.name);if(n===o)continue;const c=E.findConfigFile(n,E.sys.fileExists),a=r.join("dist",i.name,"src");c&&t.existsSync(a)&&s.push([n,c,a])}}else i="dist";s.push([o,n,i]);let c=!0;for(const[n,i,t]of s)c&&=U(e,n,i,r.join(o,t));return c}function U(e,o,n,s){e.verbose&&console.info("runTypeScriptCompiler()",o,n,s);const{config:i}=E.readConfigFile(n,E.sys.readFile);i.compilerOptions={...i.compilerOptions,declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:s},i.include=["src/**/*"];const{errors:t,fileNames:r,options:c}=E.parseJsonConfigFileContent(i,E.sys,o),a=E.createProgram({options:c,rootNames:r,configFileParsingDiagnostics:t}),{diagnostics:p,emitSkipped:l}=a.emit(),d=[...E.getPreEmitDiagnostics(a),...p,...t];if(d.length>0){const e={getCanonicalFileName:e=>e,getCurrentDirectory:E.sys.getCurrentDirectory,getNewLine:()=>E.sys.newLine},o=E.formatDiagnostics(d,e);console.warn(o)}return!l}const W={command:"app [package]",describe:"Build an app",builder:C,handler:async e=>G(e,"app")},J={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:L,async handler(e){if(!e.onlyPackageJson)return G(e,"functions");{const o=r.resolve(e.package?.toString()??"."),[n,s]=await N(o);n||(console.error(`Failed to parse package.json (${s}).`),process.exit(1)),await H(o,n,e.moduleType)}}},M={command:"lib [package]",describe:"Build a Node.js / React library",builder:I,handler:async e=>G(e,"lib")};async function G(e,o){process.env.NODE_ENV||="production";const n=!e.silent&&e.verbose,s=process.cwd(),i=r.resolve(e.package?.toString()??"."),[m,f]=await N(i);m||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),T(e,i);const y=function(e,o,n){if(e.input&&e.input.length>0)return e.input.map((e=>r.join(o,e.toString())));const s=r.join(n,"src");for(const e of["ts","tsx","cts","mts"]){const o=r.join(s,`index.${e}`);if(t.existsSync(o))return[o]}console.error("Failed to detect input file."),process.exit(1)}(e,s,i),b=function(e,o){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return o.some((e=>e.endsWith(".tsx")))?"lib-react":"lib";default:console.error("target option must be one of: "+_.join(", ")),process.exit(1)}}(o,y);n&&(console.info("argv:",e),console.info("packageJsonPath:",f),console.info("Target (Category):",`${b} (${o})`));const[g]=function(e){const o=e.name?.toString()||"",n=/@([^/]+)\/(.+)/.exec(o),[,s,i]=n||[];return[s,i]}(m),h="module"===m.type;e["core-js"]?process.env.BUILD_TS_COREJS="1":e["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),n&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=o,process.env.BUILD_TS_TARGET_DETAIL=b;const j=function(e,o,n,s){const i=r.join(n,"dist");if("app-node"===o||"functions"===o)return[{dir:i,format:V(s,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const t=[],c=e.moduleType||"both",a=e.jsExtension||"either";("cjs"===c||"both"===c||"either"===c&&!s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&!s?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===c||"both"===c||"either"===c&&s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&s?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return t}(e,b,i,h);n&&console.info("OutputOptions:",j),0===j.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(i),await t.promises.rm(r.join(i,"dist"),{recursive:!0,force:!0}),"functions"===b&&await H(i,m,e.moduleType);const v={input:"functions"===b?Object.fromEntries(y.map(((e,o)=>[0===o?"index":r.basename(e,r.extname(e)),e]))):y,plugins:A(e,b,m,g,i,j),watch:e.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map((e=>r.relative(i,e)));if(e.watch)!function(e,o,n,s,i,t){const r=d({...s,output:i}),l=async e=>{process.removeListener("uncaughtException",l),process.stdin.removeListener("end",l),r&&await r.close(),e&&process.exit(e)};u(l),process.on("uncaughtException",l),process.stdin.isTTY||(process.stdin.on("end",l),process.stdin.resume());r.on("event",(async s=>{switch(s.code){case"ERROR":!function(e,o=!1){const n=e.name||e.cause?.name,s=n?`${n}: `:"",i=`${e.plugin?`(plugin ${e.plugin}) `:""}${s}${e.message}`,t=[c.bold(c.red(`[!] ${c.bold(i.toString())}`))];e.url&&t.push(c.cyan(e.url)),e.loc?t.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&t.push(e.id),e.frame&&t.push(c.dim(e.frame)),e.stack&&t.push(c.dim(e.stack?.replace(`${s}${e.message}\n`,""))),t.push("",""),console.error(t.join("\n")),o||$.exit(1)}(s.error,!0);break;case"BUNDLE_START":{if(e.silent)break;const o=s.input,i=[];"string"==typeof o?i.push(o):i.push(...Array.isArray(o)?o:Object.values(o)),console.info(c.cyan(`Bundles ${c.bold(t(i).join(", "))} → ${c.bold(t(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(c.green(`Created ${c.bold(t(s.output).join(", "))} in ${c.bold(p(s.duration))}`)),"app-node"!==o&&"functions"!==o&&await P(e,n);break;case"END":if(e.silent)break;console.info(`\n[${a()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()}))}(e,b,i,v,j,w);else{let o;e.silent||console.info(c.cyan(`Bundles ${c.bold(w(y).join(", "))} → ${c.bold(w(j.map((e=>e.file||e.dir||""))).join(", "))}\non ${i} ...`));let n=!1;try{const n=Date.now(),s=await l(v);o=s,await Promise.all(j.map((e=>s.write(e)))),e.silent||console.info(c.green(`Created ${w(j.map((e=>e.file||e.dir||""))).join(", ")} in ${c.bold(p(Date.now()-n))}`))}catch(e){n=!0,console.error("Failed to build due to:",e)}await(o?.close()),n&&process.exit(1),"app-node"===b||"functions"===b||await P(e,i)||process.exit(1)}}async function H(e,o,n){o.name+="-dist";const s="module"===o.type,i=V(s,n);o.main=s===i?"index.js":i?"index.mjs":"index.cjs",delete o.scripts,delete o.devDependencies,await t.promises.mkdir(r.join(e,"dist"),{recursive:!0}),await t.promises.writeFile(r.join(e,"dist","package.json"),JSON.stringify(o))}function V(e,o){return"esm"===o||(!o||"either"===o)&&e}const Y={command:"run <file>",describe:"Run script",builder:{...B,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){T(e,process.cwd());const o=e.file?.toString()||"",n=process.versions.bun,s=n?"bun":"node",i=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&i.push("--watch"),i.push(o);const[,...t]=e._,r=[...i,...t.map((e=>e.toString()))];e.verbose&&console.info(`Running '${s} ${r.join(" ")}'`);const c=D.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(c.status??1)}};n(process.env),await s(i(process.argv)).scriptName("build-ts").options(B).command(W).command(J).command(M).command(Y).demandCommand().strict().help().argv;
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgZW52VmFyTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi4oYXJndi5hdXRvSW5saW5lID8gT2JqZWN0LmtleXMobG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIGN3ZCkpIDogW10pLFxuICBdKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgZW52VmFyc0RlZltgcHJvY2Vzcy5lbnYuJHtuYW1lfWBdID0gSlNPTi5zdHJpbmdpZnkocHJvY2Vzcy5lbnZbbmFtZV0pO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0lubGluZSBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzRGVmKSk7XG4gIH1cbiAgcmV0dXJuIGVudlZhcnNEZWY7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcywgT3B0aW9ucyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldENhdGVnb3JpZXMgPSBbJ2FwcCcsICdmdW5jdGlvbnMnLCAnbGliJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldENhdGVnb3J5ID0gKHR5cGVvZiBhbGxUYXJnZXRDYXRlZ29yaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0RGV0YWlscyA9IFsnYXBwLW5vZGUnLCAnZnVuY3Rpb25zJywgJ2xpYicsICdsaWItcmVhY3QnXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0RGV0YWlsID0gKHR5cGVvZiBhbGxUYXJnZXREZXRhaWxzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBBcmd1bWVudHNUeXBlPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IE9wdGlvbnMgfT4gPSBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczxUPj47XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8W1BhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBzdHJpbmddPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIHJldHVybiBbSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHBhY2thZ2VKc29uUGF0aF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWlsZFRzUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHVybC5maWxlVVJMVG9QYXRoKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoaW1wb3J0Lm1ldGEudXJsKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lPy50b1N0cmluZygpIHx8ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggfHwgW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAncycsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgaW5wdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRocyBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4fVwiIGZyb20gcGFja2FnZSBkaXJlY3RvcnkgaXMgdGFyZ2V0ZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnaScsXG4gIH0sXG4gICdjb3JlLWpzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgJ2NvcmUtanMtcHJvcG9zYWxzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyB3aXRoIHByb3Bvc2FscyBzdXBwb3J0IGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBiYWJlbCB9IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWJhYmVsJztcbmltcG9ydCBjb21tb25qcyBmcm9tICdAcm9sbHVwL3BsdWdpbi1jb21tb25qcyc7XG5pbXBvcnQganNvbiBmcm9tICdAcm9sbHVwL3BsdWdpbi1qc29uJztcbmltcG9ydCByZXNvbHZlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZSc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICdAcm9sbHVwL3BsdWdpbi1yZXBsYWNlJztcbmltcG9ydCB0ZXJzZXIgZnJvbSAnQHJvbGx1cC9wbHVnaW4tdGVyc2VyJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUGx1Z2luIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCBhbmFseXplIGZyb20gJ3JvbGx1cC1wbHVnaW4tYW5hbHl6ZXInO1xuaW1wb3J0IHsga2VlcEltcG9ydCB9IGZyb20gJ3JvbGx1cC1wbHVnaW4ta2VlcC1pbXBvcnQnO1xuaW1wb3J0IHsgbm9kZUV4dGVybmFscyB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tbm9kZS1leHRlcm5hbHMnO1xuaW1wb3J0IHByZXNlcnZlRGlyZWN0aXZlcyBmcm9tICdyb2xsdXAtcGx1Z2luLXByZXNlcnZlLWRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2lucyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdXG4pOiBQbHVnaW5bXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBTaW5jZSBgZGVwczogdHJ1ZWAgZG9lcyBub3Qgd29yayBmb3IgYGltcG9ydCBjaHVuayBmcm9tICdsb2Rhc2guY2h1bmsvaW5kZXguanMnO2BcbiAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgKTtcbiAgLy8gQWRkIGV4dGVybmFsIGRlcGVuZGVuY2llcyBmcm9tIHNpYmxpbmcgcGFja2FnZXNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKCcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlycyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguam9pbignLi4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oJy4uJywgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW1xuICAgIHJlcGxhY2Uoe1xuICAgICAgLy8gSWdub3JlIHdvcmQgYm91bmRhcmllcyBhbmQgcmVwbGFjZSBldmVyeSBpbnN0YW5jZSBvZiB0aGUgc3RyaW5nLlxuICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcGx1Z2lucy90cmVlL21hc3Rlci9wYWNrYWdlcy9yZXBsYWNlI3dvcmQtYm91bmRhcmllc1xuICAgICAgZGVsaW1pdGVyczogWycnLCAnJ10sXG4gICAgICBwcmV2ZW50QXNzaWdubWVudDogdHJ1ZSxcbiAgICAgIHZhbHVlczogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB9KSxcbiAgICBqc29uKCksXG4gICAgbm9kZUV4dGVybmFscyh7XG4gICAgICBkZXBzOiB0cnVlLFxuICAgICAgZGV2RGVwczogZmFsc2UsXG4gICAgICBwZWVyRGVwczogdHJ1ZSxcbiAgICAgIG9wdERlcHM6IHRydWUsXG4gICAgICBpbmNsdWRlOiBleHRlcm5hbERlcHMubWFwKChuYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHtuYW1lfSg/OlxcXFwvLispP2ApKSxcbiAgICAgIGV4Y2x1ZGU6IG5hbWVzcGFjZSAmJiBuZXcgUmVnRXhwKGBeQD8ke25hbWVzcGFjZX0oPzpcXFxcLy4rKT9gKSxcbiAgICB9KSxcbiAgICByZXNvbHZlKHtcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICBwcmVmZXJCdWlsdGluczogKGlkOiBzdHJpbmcpID0+ICFhcmd2LmJ1bmRsZUJ1aWx0aW5zPy5pbmNsdWRlcyhpZCksXG4gICAgfSksXG4gICAgY29tbW9uanMoKSxcbiAgICBrZWVwSW1wb3J0KHsgbW9kdWxlTmFtZXM6IGFyZ3Yua2VlcEltcG9ydD8ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpID8/IFtdIH0pLFxuICBdO1xuICBjb25zdCBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPVxuICAgIHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnIHx8ICFleHRlcm5hbERlcHMuaW5jbHVkZXMoJ0BiYWJlbC9ydW50aW1lJyk7XG4gIHByb2Nlc3MuZW52LkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUgPSBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnJyA6ICcxJztcbiAgcGx1Z2lucy5wdXNoKFxuICAgIGJhYmVsKHtcbiAgICAgIGNvbmZpZ0ZpbGU6IGJhYmVsQ29uZmlnUGF0aCxcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAvLyBXZSBuZWVkIGBydW50aW1lIHNpbmNlIGBidW5kbGVkYCBtYXkgYnJlYWsgZGlyZWN0b3J5IHN0cnVjdHVyZSBieSBjcmVhdGluZyBfdmlydHVhbCBkaXJlY3RvcnkuXG4gICAgICBiYWJlbEhlbHBlcnM6IGlzQmFiZWxIZWxwZXJzQnVuZGxlZCA/ICdidW5kbGVkJyA6ICdydW50aW1lJyxcbiAgICAgIGV4Y2x1ZGU6IC9eKC4rXFwvKT9ub2RlX21vZHVsZXNcXC8uKyQvLFxuICAgIH0pLFxuICAgIC4uLihvdXRwdXRPcHRpb25zTGlzdC5zb21lKChvcHRzKSA9PiBvcHRzLnByZXNlcnZlTW9kdWxlcykgPyBbcHJlc2VydmVEaXJlY3RpdmVzKCldIDogW10pLFxuICAgIHN0cmluZyh7IGluY2x1ZGU6IFsnKiovKi5jc3YnLCAnKiovKi50eHQnXSB9KVxuICApO1xuICBpZiAoYXJndi5taW5pZnkpIHtcbiAgICBwbHVnaW5zLnB1c2godGVyc2VyKHsgY29tcHJlc3M6IHsgZGlyZWN0aXZlczogZmFsc2UgfSB9KSk7XG4gIH1cbiAgcGx1Z2lucy5wdXNoKGFuYWx5emUoeyBzdW1tYXJ5T25seTogdHJ1ZSB9KSk7XG4gIHJldHVybiBwbHVnaW5zO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbi8vIFdlIGNhbm5vdCB1c2UgbmFtZWQgaW1wb3J0cyBmcm9tICd0eXBlc2NyaXB0JyBiZWNhdXNlIG9mIGJ1aWxkIGVycm9ycy5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIGNvcmVQcm9qZWN0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY29yZUNvbmZpZ0ZpbGUgPSB0cy5maW5kQ29uZmlnRmlsZShjb3JlUHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgbGV0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhcmVudERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb3JlUHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKHByb2plY3REaXJQYXRoID09PSBjb3JlUHJvamVjdERpclBhdGgpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUocHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgICAgIGNvbnN0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIGRpcmVudC5uYW1lLCAnc3JjJyk7XG4gICAgICBpZiAoY29uZmlnRmlsZSAmJiBmcy5leGlzdHNTeW5jKG91dERpcikpIHtcbiAgICAgICAgcHJvamVjdHMucHVzaChbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXREaXIgPSAnZGlzdCc7XG4gIH1cbiAgcHJvamVjdHMucHVzaChbY29yZVByb2plY3REaXJQYXRoLCBjb3JlQ29uZmlnRmlsZSwgb3V0RGlyXSk7XG5cbiAgbGV0IGFsbFN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdIG9mIHByb2plY3RzKSB7XG4gICAgYWxsU3VjY2VlZGVkICYmPSBydW5UeXBlU2NyaXB0Q29tcGlsZXIoYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIHBhdGguam9pbihjb3JlUHJvamVjdERpclBhdGgsIG91dERpcikpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1blR5cGVTY3JpcHRDb21waWxlcihcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ0ZpbGU6IHN0cmluZyxcbiAgb3V0RGlyOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdydW5UeXBlU2NyaXB0Q29tcGlsZXIoKScsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIpO1xuICB9XG5cbiAgY29uc3QgeyBjb25maWcgfSA9IHRzLnJlYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUsIHRzLnN5cy5yZWFkRmlsZSk7XG4gIGNvbmZpZy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgLi4uY29uZmlnLmNvbXBpbGVyT3B0aW9ucyxcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBlbWl0RGVjbGFyYXRpb25Pbmx5OiB0cnVlLFxuICAgIG5vRW1pdDogZmFsc2UsXG4gICAgbm9FbWl0T25FcnJvcjogdHJ1ZSxcbiAgICBvdXREaXIsXG4gIH07XG4gIGNvbmZpZy5pbmNsdWRlID0gWydzcmMvKiovKiddO1xuICBjb25zdCB7IGVycm9ycywgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSB0cy5wYXJzZUpzb25Db25maWdGaWxlQ29udGVudChjb25maWcsIHRzLnN5cywgcHJvamVjdERpclBhdGgpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKHsgb3B0aW9ucywgcm9vdE5hbWVzOiBmaWxlTmFtZXMsIGNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3M6IGVycm9ycyB9KTtcbiAgY29uc3QgeyBkaWFnbm9zdGljcywgZW1pdFNraXBwZWQgfSA9IHByb2dyYW0uZW1pdCgpO1xuXG4gIGNvbnN0IGFsbERpYWdub3N0aWNzID0gWy4uLnRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKSwgLi4uZGlhZ25vc3RpY3MsIC4uLmVycm9yc107XG4gIGlmIChhbGxEaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZm9ybWF0SG9zdDogdHMuRm9ybWF0RGlhZ25vc3RpY3NIb3N0ID0ge1xuICAgICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWU6IChwYXRoKSA9PiBwYXRoLFxuICAgICAgZ2V0Q3VycmVudERpcmVjdG9yeTogdHMuc3lzLmdldEN1cnJlbnREaXJlY3RvcnksXG4gICAgICBnZXROZXdMaW5lOiAoKSA9PiB0cy5zeXMubmV3TGluZSxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0cy5mb3JtYXREaWFnbm9zdGljcyhhbGxEaWFnbm9zdGljcywgZm9ybWF0SG9zdCk7XG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiAhZW1pdFNraXBwZWQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGRhdGVUaW1lIGZyb20gJ2RhdGUtdGltZSc7XG5pbXBvcnQgbXMgZnJvbSAncHJldHR5LW1zJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUm9sbHVwQnVpbGQsIFJvbGx1cE9wdGlvbnMgfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHsgcm9sbHVwLCB3YXRjaCB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXIgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgeyBvbkV4aXQgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0Q2F0ZWdvcnksIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGFsbFRhcmdldENhdGVnb3JpZXMgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXROYW1lc3BhY2VBbmROYW1lLCByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQW55QnVpbGRlclR5cGUsIGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYXBwQnVpbGRlciwgZnVuY3Rpb25zQnVpbGRlciwgbGliQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBzZXR1cFBsdWdpbnMgfSBmcm9tICcuL3BsdWdpbi5qcyc7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gJy4vcm9sbHVwTG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyB9IGZyb20gJy4vdHlwZVNjcmlwdC5qcyc7XG5cbmV4cG9ydCBjb25zdCBhcHA6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgYXBwQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYXBwIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYW4gYXBwJyxcbiAgYnVpbGRlcjogYXBwQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdhcHAnKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgZnVuY3Rpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZnVuY3Rpb25zIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBHQ1AvRmlyZWJhc2UgZnVuY3Rpb25zIGFwcCcsXG4gIGJ1aWxkZXI6IGZ1bmN0aW9uc0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2Lm9ubHlQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gICAgICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdmdW5jdGlvbnMnKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbGliOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGxpYkJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpYiBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgTm9kZS5qcyAvIFJlYWN0IGxpYnJhcnknLFxuICBidWlsZGVyOiBsaWJCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2xpYicpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LCB0YXJnZXRDYXRlZ29yeTogVGFyZ2V0Q2F0ZWdvcnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHw9ICdwcm9kdWN0aW9uJztcblxuICAvLyBgc2lsZW50YCBpcyBzdHJvbmdlciB0aGFuIGB2ZXJib3NlYC5cbiAgY29uc3QgdmVyYm9zZSA9ICFhcmd2LnNpbGVudCAmJiBhcmd2LnZlcmJvc2U7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gIGlmICghcGFja2FnZUpzb24pIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG5cbiAgY29uc3QgaW5wdXRzID0gdmVyaWZ5SW5wdXQoYXJndiwgY3dkLCBwYWNrYWdlRGlyUGF0aCk7XG4gIGNvbnN0IHRhcmdldERldGFpbCA9IGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeSwgaW5wdXRzKTtcblxuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnYXJndjonLCBhcmd2KTtcbiAgICBjb25zb2xlLmluZm8oJ3BhY2thZ2VKc29uUGF0aDonLCBwYWNrYWdlSnNvblBhdGgpO1xuICAgIGNvbnNvbGUuaW5mbygnVGFyZ2V0IChDYXRlZ29yeSk6JywgYCR7dGFyZ2V0RGV0YWlsfSAoJHt0YXJnZXRDYXRlZ29yeX0pYCk7XG4gIH1cblxuICBjb25zdCBbbmFtZXNwYWNlXSA9IGdldE5hbWVzcGFjZUFuZE5hbWUocGFja2FnZUpzb24pO1xuICBjb25zdCBpc0VzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcblxuICBpZiAoYXJndlsnY29yZS1qcyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTID0gJzEnO1xuICB9IGVsc2UgaWYgKGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlNfV0lUSF9QUk9QT1NBTFMgPSAnMSc7XG4gIH1cblxuICBpZiAodmVyYm9zZSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX1ZFUkJPU0UgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0NBVEVHT1JZID0gdGFyZ2V0Q2F0ZWdvcnk7XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwgPSB0YXJnZXREZXRhaWw7XG5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3QgPSBnZXRPdXRwdXRPcHRpb25zTGlzdChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBpc0VzbVBhY2thZ2UpO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnT3V0cHV0T3B0aW9uczonLCBvdXRwdXRPcHRpb25zTGlzdCk7XG4gIH1cbiAgaWYgKG91dHB1dE9wdGlvbnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3Qgb3V0cHV0IGZpbGVzLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuY2hkaXIocGFja2FnZURpclBhdGgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMgPSB7XG4gICAgaW5wdXQ6XG4gICAgICB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnXG4gICAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaW5wdXRzLm1hcCgoaW5wdXQsIGluZGV4KSA9PiBbaW5kZXggPT09IDAgPyAnaW5kZXgnIDogcGF0aC5iYXNlbmFtZShpbnB1dCwgcGF0aC5leHRuYW1lKGlucHV0KSksIGlucHV0XSlcbiAgICAgICAgICApXG4gICAgICAgIDogaW5wdXRzLFxuICAgIHBsdWdpbnM6IHNldHVwUGx1Z2lucyhhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VKc29uLCBuYW1lc3BhY2UsIHBhY2thZ2VEaXJQYXRoLCBvdXRwdXRPcHRpb25zTGlzdCksXG4gICAgd2F0Y2g6IGFyZ3Yud2F0Y2ggPyB7IGNsZWFyU2NyZWVuOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICB9O1xuXG4gIGNvbnN0IHBhdGhUb1JlbGF0aXZlUGF0aCA9IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KTogc3RyaW5nW10gPT5cbiAgICAoQXJyYXkuaXNBcnJheShwYXRocykgPyBwYXRocyA6IFtwYXRoc10pLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgcCkpO1xuICBpZiAoYXJndi53YXRjaCkge1xuICAgIHdhdGNoUm9sbHVwKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZURpclBhdGgsIG9wdGlvbnMsIG91dHB1dE9wdGlvbnNMaXN0LCBwYXRoVG9SZWxhdGl2ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0cykuam9pbignLCAnKSl9IOKGkiAke2NoYWxrLmJvbGQoXG4gICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKCcsICcpXG4gICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbHVwQnVpbGQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJ1aWxkRmFpbGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBfYnVuZGxlID0gYXdhaXQgcm9sbHVwKG9wdGlvbnMpO1xuICAgICAgYnVuZGxlID0gX2J1bmRsZTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gX2J1bmRsZS53cml0ZShvcHRzKSkpO1xuXG4gICAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtjaGFsay5ib2xkKG1zKERhdGUubm93KCkgLSBzdGFydFRpbWUpKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBidWlsZEZhaWxlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYnVpbGQgZHVlIHRvOicsIGVycm9yKTtcbiAgICB9XG4gICAgYXdhaXQgYnVuZGxlPy5jbG9zZSgpO1xuICAgIGlmIChidWlsZEZhaWxlZCkgcHJvY2Vzcy5leGl0KDEpO1xuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmXG4gICAgICB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnICYmXG4gICAgICAhKGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCkpXG4gICAgKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhdGNoUm9sbHVwKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10sXG4gIHBhdGhUb1JlbGF0aXZlUGF0aDogKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pID0+IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHsgLi4ub3B0aW9ucywgb3V0cHV0OiBvdXRwdXRPcHRpb25zTGlzdCB9KTtcblxuICBjb25zdCBjbG9zZSA9IGFzeW5jIChjb2RlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xvc2UpO1xuICAgIGlmICh3YXRjaGVyKSBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgaWYgKGNvZGUpIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfTtcbiAgb25FeGl0KGNsb3NlIGFzIHVua25vd24gYXMgSGFuZGxlcik7XG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgfVxuXG4gIHdhdGNoZXIub24oJ2V2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXZlbnQuZXJyb3IsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9TVEFSVCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zdCBldmVudElucHV0ID0gZXZlbnQuaW5wdXQ7XG4gICAgICAgIGNvbnN0IGlucHV0RmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnRJbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpbnB1dEZpbGVzLnB1c2goZXZlbnRJbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZlbnRJbnB1dCkgPyBldmVudElucHV0IDogT2JqZWN0LnZhbHVlcyhldmVudElucHV0IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0RmlsZXMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpXG4gICAgICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQlVORExFX0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKSl9IGluICR7Y2hhbGsuYm9sZChtcyhldmVudC5kdXJhdGlvbikpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJiB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnKSB7XG4gICAgICAgICAgYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oYFxcblske2RhdGVUaW1lKCl9XSB3YWl0aW5nIGZvciBjaGFuZ2VzLi4uYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgncmVzdWx0JyBpbiBldmVudCAmJiBldmVudC5yZXN1bHQpIHtcbiAgICAgIHZvaWQgZXZlbnQucmVzdWx0LmNsb3NlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5SW5wdXQoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sIGN3ZDogc3RyaW5nLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5pbnB1dCAmJiBhcmd2LmlucHV0Lmxlbmd0aCA+IDApIHJldHVybiBhcmd2LmlucHV0Lm1hcCgocCkgPT4gcGF0aC5qb2luKGN3ZCwgcC50b1N0cmluZygpKSk7XG5cbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICBmb3IgKGNvbnN0IGV4dCBvZiBbJ3RzJywgJ3RzeCcsICdjdHMnLCAnbXRzJ10pIHtcbiAgICBjb25zdCBpbnB1dCA9IHBhdGguam9pbihzcmNEaXJQYXRoLCBgaW5kZXguJHtleHR9YCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5wdXQpKSByZXR1cm4gW2lucHV0XTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3QgaW5wdXQgZmlsZS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnk6IHN0cmluZywgaW5wdXRzOiBzdHJpbmdbXSk6IFRhcmdldERldGFpbCB7XG4gIHN3aXRjaCAodGFyZ2V0Q2F0ZWdvcnkpIHtcbiAgICBjYXNlICdhcHAnOiB7XG4gICAgICByZXR1cm4gJ2FwcC1ub2RlJztcbiAgICB9XG4gICAgY2FzZSAnZnVuY3Rpb25zJzoge1xuICAgICAgcmV0dXJuICdmdW5jdGlvbnMnO1xuICAgIH1cbiAgICBjYXNlICdsaWInOiB7XG4gICAgICBpZiAoaW5wdXRzLnNvbWUoKGlucHV0KSA9PiBpbnB1dC5lbmRzV2l0aCgnLnRzeCcpKSkge1xuICAgICAgICByZXR1cm4gJ2xpYi1yZWFjdCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2xpYic7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RhcmdldCBvcHRpb24gbXVzdCBiZSBvbmUgb2Y6ICcgKyBhbGxUYXJnZXRDYXRlZ29yaWVzLmpvaW4oJywgJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHBhY2thZ2VKc29uLm5hbWUgKz0gJy1kaXN0JztcbiAgY29uc3QgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICBjb25zdCBlc21PdXRwdXQgPSBpc0VzbU91dHB1dChlc21QYWNrYWdlLCBtb2R1bGVUeXBlKTtcbiAgcGFja2FnZUpzb24ubWFpbiA9IGVzbVBhY2thZ2UgPT09IGVzbU91dHB1dCA/ICdpbmRleC5qcycgOiBlc21PdXRwdXQgPyAnaW5kZXgubWpzJyA6ICdpbmRleC5janMnO1xuXG4gIC8vIFByZXZlbnQgRmlyZWJhc2UgRnVuY3Rpb25zIGZyb20gcnVubmluZyBgYnVpbGRgIHNjcmlwdCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cztcbiAgLy8gZGV2RGVwZW5kZW5jaWVzIGFyZSBub3QgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcblxuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuXG4pOiBPdXRwdXRPcHRpb25zW10ge1xuICBjb25zdCBvdXREaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICAgIGZvcm1hdDogaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlLCBhcmd2Lm1vZHVsZVR5cGUpID8gJ21vZHVsZScgOiAnY29tbW9uanMnLFxuICAgICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwICYmICdpbmxpbmUnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBpbXBvcnQgc3RhdGVtZW50IGluIGFuIGVzbSBtb2R1bGUgY2F1c2VzIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gIC8vIFN0YXRlbWVudDpcbiAgLy8gICBpbXBvcnQgeyB1c2VQcmV2aW91cyB9IGZyb20gJ3JlYWN0LXVzZSc7XG4gIC8vIEVycm9yOlxuICAvLyAgIE5hbWVkIGV4cG9ydCAndXNlUHJldmlvdXMnIG5vdCBmb3VuZC4gVGhlIHJlcXVlc3RlZCBtb2R1bGUgJ3JlYWN0LXVzZScgaXMgYSBDb21tb25KUyBtb2R1bGUsXG4gIC8vICAgd2hpY2ggbWF5IG5vdCBzdXBwb3J0IGFsbCBtb2R1bGUuZXhwb3J0cyBhcyBuYW1lZCBleHBvcnRzLlxuICAvLyBXZSBuZWVkIGNqcyBtb2R1bGVzIGZvciB3ZWIgYXBwcyB0byBhdm9pZCB0aGUgZXJyb3IuXG4gIC8vIEFsc28sIHNwbGl0dGluZyBhIGxpYnJhcnkgaXMgdXNlZnVsIGluIGJvdGggbW9kdWxlcywgc28gcHJlc2VydmVNb2R1bGVzIHNob3VsZCBiZSB0cnVlLlxuICBjb25zdCBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdID0gW107XG4gIGNvbnN0IG1vZHVsZVR5cGUgPSBhcmd2Lm1vZHVsZVR5cGUgfHwgJ2JvdGgnO1xuICBjb25zdCBqc0V4dCA9IGFyZ3YuanNFeHRlbnNpb24gfHwgJ2VpdGhlcic7XG4gIGlmIChtb2R1bGVUeXBlID09PSAnY2pzJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLmNqcycsXG4gICAgICBmb3JtYXQ6ICdjb21tb25qcycsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIGlmIChtb2R1bGVUeXBlID09PSAnZXNtJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5tanMnLFxuICAgICAgZm9ybWF0OiAnbW9kdWxlJyxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dE9wdGlvbnNMaXN0O1xufVxuXG5mdW5jdGlvbiBpc0VzbU91dHB1dChpc0VzbVBhY2thZ2U6IGJvb2xlYW4sIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgKCghbW9kdWxlVHlwZSB8fCBtb2R1bGVUeXBlID09PSAnZWl0aGVyJykgJiYgaXNFc21QYWNrYWdlKTtcbn1cbiIsImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFJvbGx1cEVycm9yIH0gZnJvbSAncm9sbHVwJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yOiBSb2xsdXBFcnJvciwgcmVjb3ZlciA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBlcnJvci5uYW1lIHx8IChlcnJvci5jYXVzZSBhcyBFcnJvcik/Lm5hbWU7XG4gIGNvbnN0IG5hbWVTZWN0aW9uID0gbmFtZSA/IGAke25hbWV9OiBgIDogJyc7XG4gIGNvbnN0IHBsdWdpblNlY3Rpb24gPSBlcnJvci5wbHVnaW4gPyBgKHBsdWdpbiAke2Vycm9yLnBsdWdpbn0pIGAgOiAnJztcbiAgY29uc3QgbWVzc2FnZSA9IGAke3BsdWdpblNlY3Rpb259JHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9YDtcblxuICBjb25zdCBvdXRwdXRMaW5lcyA9IFtjaGFsay5ib2xkKGNoYWxrLnJlZChgWyFdICR7Y2hhbGsuYm9sZChtZXNzYWdlLnRvU3RyaW5nKCkpfWApKV07XG5cbiAgaWYgKGVycm9yLnVybCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuY3lhbihlcnJvci51cmwpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5sb2MpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGAke2Vycm9yLmxvYy5maWxlIHx8IGVycm9yLmlkfSAoJHtlcnJvci5sb2MubGluZX06JHtlcnJvci5sb2MuY29sdW1ufSlgKTtcbiAgfSBlbHNlIGlmIChlcnJvci5pZCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goZXJyb3IuaWQpO1xuICB9XG5cbiAgaWYgKGVycm9yLmZyYW1lKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChjaGFsay5kaW0oZXJyb3IuZnJhbWUpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5zdGFjaykge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLnN0YWNrPy5yZXBsYWNlKGAke25hbWVTZWN0aW9ufSR7ZXJyb3IubWVzc2FnZX1cXG5gLCAnJykpKTtcbiAgfVxuXG4gIG91dHB1dExpbmVzLnB1c2goJycsICcnKTtcbiAgY29uc29sZS5lcnJvcihvdXRwdXRMaW5lcy5qb2luKCdcXG4nKSk7XG5cbiAgaWYgKCFyZWNvdmVyKSBwcm9jZXNzLmV4aXQoMSk7XG59XG4iLCJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vZW52LmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgbW9kdWxlOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1vZHVsZSB0eXBlOiBjanMgb3IgZXNtJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBydW46IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncnVuIDxmaWxlPicsXG4gIGRlc2NyaWJlOiAnUnVuIHNjcmlwdCcsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwcm9jZXNzLmN3ZCgpKTtcblxuICAgIGNvbnN0IGZpbGUgPSBhcmd2LmZpbGU/LnRvU3RyaW5nKCkgfHwgJyc7XG5cbiAgICAvLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICAgIGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW47XG4gICAgY29uc3QgcnVudGltZSA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAnbm9kZSc7XG4gICAgY29uc3QgYXJncyA9IGlzUnVubmluZ09uQnVuID8gWyctLWJ1biddIDogWyctLW5vLXdhcm5pbmdzJywgJy0taW1wb3J0JywgJ3RzeCddO1xuICAgIGlmIChhcmd2LndhdGNoKSB7XG4gICAgICBhcmdzLnB1c2goJy0td2F0Y2gnKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKGZpbGUpO1xuICAgIGNvbnN0IFssIC4uLmFkZGl0aW9uYWxBcmd1bWVudHNdID0gYXJndi5fO1xuICAgIGNvbnN0IHJ1bnRpbWVBcmdzID0gWy4uLmFyZ3MsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHMubWFwKChhcmcpID0+IGFyZy50b1N0cmluZygpKV07XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nICcke3J1bnRpbWV9ICR7cnVudGltZUFyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocnVudGltZSwgcnVudGltZUFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYgfSxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGFwcCwgZnVuY3Rpb25zLCBsaWIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkLmpzJztcbmltcG9ydCB7IHJ1biB9IGZyb20gJy4vY29tbWFuZHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbnJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ2J1aWxkLXRzJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5jb21tYW5kKGFwcClcbiAgLmNvbW1hbmQoZnVuY3Rpb25zKVxuICAuY29tbWFuZChsaWIpXG4gIC5jb21tYW5kKHJ1bilcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLmhlbHAoKS5hcmd2O1xuIl0sIm5hbWVzIjpbImVudlZhcnMiLCJsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUiLCJhcmd2IiwiY3dkIiwicmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJPYmplY3QiLCJrZXlzIiwiY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uIiwiZW52VmFyc0RlZiIsImVudlZhck5hbWVzIiwiU2V0IiwiaW5saW5lIiwiZmxhdE1hcCIsImUiLCJ0b1N0cmluZyIsInNwbGl0IiwiYXV0b0lubGluZSIsIm5hbWUiLCJ1bmRlZmluZWQiLCJwcm9jZXNzIiwiZW52IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbFRhcmdldENhdGVnb3JpZXMiLCJhc3luYyIsInJlYWRQYWNrYWdlSnNvbiIsImRpclBhdGgiLCJwYWNrYWdlSnNvblBhdGgiLCJwYXRoIiwiam9pbiIsInBhY2thZ2VKc29uVGV4dCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInBhcnNlIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Iiwic2lsZW50IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJidWlsZGVyIiwiaW5wdXQiLCJkZWZhdWx0IiwibWluaWZ5Iiwic291cmNlbWFwIiwiZXh0ZXJuYWwiLCJ3YXRjaCIsImtlZXBJbXBvcnQiLCJidW5kbGVCdWlsdGlucyIsImFwcEJ1aWxkZXIiLCJtb2R1bGVUeXBlIiwiZnVuY3Rpb25zQnVpbGRlciIsIm9ubHlQYWNrYWdlSnNvbiIsImxpYkJ1aWxkZXIiLCJqc0V4dGVuc2lvbiIsInNldHVwUGx1Z2lucyIsInRhcmdldERldGFpbCIsInBhY2thZ2VKc29uIiwibmFtZXNwYWNlIiwicGFja2FnZURpclBhdGgiLCJvdXRwdXRPcHRpb25zTGlzdCIsImV4dGVybmFsRGVwcyIsIm1hcCIsIml0ZW0iLCJkZXBlbmRlbmNpZXMiLCJwdXNoIiwicGVlckRlcGVuZGVuY2llcyIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwiZXhpc3RzU3luYyIsInBhY2thZ2VEaXJzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicGFja2FnZURpciIsImlzRGlyZWN0b3J5Iiwib3RoZXJQYWNrYWdlSnNvbiIsInJlYWRGaWxlU3luYyIsImV4dGVuc2lvbnMiLCJiYWJlbENvbmZpZ1BhdGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZGlybmFtZSIsInBsdWdpbnMiLCJyZXBsYWNlIiwiZGVsaW1pdGVycyIsInByZXZlbnRBc3NpZ25tZW50IiwidmFsdWVzIiwianNvbiIsIm5vZGVFeHRlcm5hbHMiLCJkZXBzIiwiZGV2RGVwcyIsInBlZXJEZXBzIiwib3B0RGVwcyIsImluY2x1ZGUiLCJSZWdFeHAiLCJleGNsdWRlIiwicmVzb2x2ZSIsInByZWZlckJ1aWx0aW5zIiwiaWQiLCJpbmNsdWRlcyIsImNvbW1vbmpzIiwibW9kdWxlTmFtZXMiLCJpc0JhYmVsSGVscGVyc0J1bmRsZWQiLCJCVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FIiwiYmFiZWwiLCJjb25maWdGaWxlIiwiYmFiZWxIZWxwZXJzIiwic29tZSIsIm9wdHMiLCJwcmVzZXJ2ZU1vZHVsZXMiLCJwcmVzZXJ2ZURpcmVjdGl2ZXMiLCJzdHJpbmciLCJ0ZXJzZXIiLCJjb21wcmVzcyIsImRpcmVjdGl2ZXMiLCJhbmFseXplIiwic3VtbWFyeU9ubHkiLCJnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMiLCJjb3JlUHJvamVjdERpclBhdGgiLCJjb3JlQ29uZmlnRmlsZSIsInRzIiwiZmluZENvbmZpZ0ZpbGUiLCJzeXMiLCJmaWxlRXhpc3RzIiwiRXJyb3IiLCJwcm9qZWN0cyIsIm91dERpciIsImJhc2VuYW1lIiwicGFyZW50RGlyUGF0aCIsImRpcmVudHMiLCJyZWFkZGlyIiwiZGlyZW50IiwicHJvamVjdERpclBhdGgiLCJhbGxTdWNjZWVkZWQiLCJydW5UeXBlU2NyaXB0Q29tcGlsZXIiLCJjb25maWciLCJyZWFkQ29uZmlnRmlsZSIsImNvbXBpbGVyT3B0aW9ucyIsImRlY2xhcmF0aW9uIiwiZW1pdERlY2xhcmF0aW9uT25seSIsIm5vRW1pdCIsIm5vRW1pdE9uRXJyb3IiLCJlcnJvcnMiLCJmaWxlTmFtZXMiLCJvcHRpb25zIiwicGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQiLCJwcm9ncmFtIiwiY3JlYXRlUHJvZ3JhbSIsInJvb3ROYW1lcyIsImNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3MiLCJkaWFnbm9zdGljcyIsImVtaXRTa2lwcGVkIiwiZW1pdCIsImFsbERpYWdub3N0aWNzIiwiZ2V0UHJlRW1pdERpYWdub3N0aWNzIiwibGVuZ3RoIiwiZm9ybWF0SG9zdCIsImdldENhbm9uaWNhbEZpbGVOYW1lIiwiZ2V0Q3VycmVudERpcmVjdG9yeSIsImdldE5ld0xpbmUiLCJuZXdMaW5lIiwibWVzc2FnZSIsImZvcm1hdERpYWdub3N0aWNzIiwid2FybiIsImFwcCIsImNvbW1hbmQiLCJkZXNjcmliZSIsImhhbmRsZXIiLCJidWlsZCIsImZ1bmN0aW9ucyIsInBhY2thZ2UiLCJlcnJvciIsImV4aXQiLCJnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zIiwibGliIiwidGFyZ2V0Q2F0ZWdvcnkiLCJOT0RFX0VOViIsImlucHV0cyIsInAiLCJzcmNEaXJQYXRoIiwiZXh0IiwidmVyaWZ5SW5wdXQiLCJlbmRzV2l0aCIsImRldGVjdFRhcmdldERldGFpbCIsInBhY2thZ2VOYW1lIiwibWF0Y2giLCJleGVjIiwiZ2V0TmFtZXNwYWNlQW5kTmFtZSIsImlzRXNtUGFja2FnZSIsIkJVSUxEX1RTX0NPUkVKUyIsIkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyIsIkJVSUxEX1RTX1ZFUkJPU0UiLCJCVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkiLCJCVUlMRF9UU19UQVJHRVRfREVUQUlMIiwib3V0RGlyUGF0aCIsImRpciIsImZvcm1hdCIsImlzRXNtT3V0cHV0IiwianNFeHQiLCJlbnRyeUZpbGVOYW1lcyIsImdldE91dHB1dE9wdGlvbnNMaXN0IiwiY2hkaXIiLCJybSIsInJlY3Vyc2l2ZSIsImZvcmNlIiwiZnJvbUVudHJpZXMiLCJpbmRleCIsImV4dG5hbWUiLCJjbGVhclNjcmVlbiIsInBhdGhUb1JlbGF0aXZlUGF0aCIsInBhdGhzIiwiQXJyYXkiLCJpc0FycmF5IiwicmVsYXRpdmUiLCJ3YXRjaGVyIiwib3V0cHV0IiwiY2xvc2UiLCJyZW1vdmVMaXN0ZW5lciIsInN0ZGluIiwiY29kZSIsIm9uRXhpdCIsIm9uIiwiaXNUVFkiLCJyZXN1bWUiLCJldmVudCIsInJlY292ZXIiLCJjYXVzZSIsIm5hbWVTZWN0aW9uIiwicGx1Z2luIiwib3V0cHV0TGluZXMiLCJjaGFsayIsImJvbGQiLCJyZWQiLCJjeWFuIiwibG9jIiwiZmlsZSIsImxpbmUiLCJjb2x1bW4iLCJmcmFtZSIsImRpbSIsInN0YWNrIiwiaGFuZGxlRXJyb3IiLCJldmVudElucHV0IiwiaW5wdXRGaWxlcyIsImdyZWVuIiwibXMiLCJkdXJhdGlvbiIsImRhdGVUaW1lIiwicmVzdWx0Iiwid2F0Y2hSb2xsdXAiLCJidW5kbGUiLCJidWlsZEZhaWxlZCIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJfYnVuZGxlIiwicm9sbHVwIiwiUHJvbWlzZSIsImFsbCIsIndyaXRlIiwiZXNtUGFja2FnZSIsImVzbU91dHB1dCIsIm1haW4iLCJzY3JpcHRzIiwiZGV2RGVwZW5kZW5jaWVzIiwibWtkaXIiLCJ3cml0ZUZpbGUiLCJydW4iLCJtb2R1bGUiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwicnVudGltZSIsImFyZ3MiLCJhZGRpdGlvbmFsQXJndW1lbnRzIiwiXyIsInJ1bnRpbWVBcmdzIiwiYXJnIiwicmV0IiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luYyIsInN0ZGlvIiwic3RhdHVzIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwieWFyZ3MiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJoZWxwIl0sIm1hcHBpbmdzIjoicy9CQU1BLElBQUlBLEVBS0csU0FBU0MsRUFDZEMsRUFDQUMsR0FRQSxPQU5LSCxJQUNIQSxFQUFVSSxFQUFpQ0YsRUFBTUMsR0FDN0NELEVBQUtHLFNBQ1BDLFFBQVFDLEtBQUssbUJBQW9CQyxPQUFPQyxLQUFLVCxLQUcxQ0EsQ0FDVCxDQUtPLFNBQVNVLEVBQ2RSLEVBQ0FDLEdBRUEsTUFBTVEsRUFBcUMsQ0FBRSxFQUN2Q0MsRUFBYyxJQUFJQyxJQUFJLEtBQ3RCWCxFQUFLWSxRQUFVLElBQUlDLFNBQVNDLEdBQU1BLEVBQUVDLFdBQVdDLE1BQU0sVUFDckRoQixFQUFLaUIsV0FBYVgsT0FBT0MsS0FBS1IsRUFBa0NDLEVBQU1DLElBQVEsS0FFcEYsSUFBSyxNQUFNaUIsS0FBUVIsT0FDU1MsSUFBdEJDLFFBQVFDLElBQUlILEtBRWhCVCxFQUFXLGVBQWVTLEtBQVVJLEtBQUtDLFVBQVVILFFBQVFDLElBQUlILEtBS2pFLE9BSElsQixFQUFLRyxTQUNQQyxRQUFRQyxLQUFLLG1CQUFvQkMsT0FBT0MsS0FBS0UsSUFFeENBLENBQ1QsQ0MzQ08sTUFBTWUsRUFBc0IsQ0FBQyxNQUFPLFlBQWEsT0NJakRDLGVBQWVDLEVBQWdCQyxHQUNwQyxNQUFNQyxFQUFrQkMsRUFBS0MsS0FBS0gsRUFBUyxnQkFDM0MsSUFDRSxNQUFNSSxRQUF3QkMsRUFBR0MsU0FBU0MsU0FBU04sRUFBaUIsUUFDcEUsTUFBTyxDQUFDTixLQUFLYSxNQUFNSixHQUFpQ0gsRUFDdEQsQ0FBRSxNQUNBLENBRUYs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "build-ts",
3
- "version": "14.0.1",
3
+ "version": "14.0.3",
4
4
  "repository": "github:WillBooster/build-ts",
5
5
  "license": "UNLICENSED",
6
6
  "author": "WillBooster Inc.",
@@ -45,7 +45,7 @@
45
45
  "@rollup/plugin-replace": "6.0.2",
46
46
  "@rollup/plugin-terser": "0.4.4",
47
47
  "@rollup/pluginutils": "5.1.4",
48
- "@willbooster/shared-lib-node": "6.1.17",
48
+ "@willbooster/shared-lib-node": "6.1.18",
49
49
  "babel-plugin-polyfill-corejs3": "0.12.0",
50
50
  "babel-plugin-transform-remove-console": "6.9.4",
51
51
  "chalk": "5.4.1",
@@ -76,7 +76,7 @@
76
76
  "@willbooster/babel-configs": "2.1.0",
77
77
  "@willbooster/eslint-config-ts": "11.2.0",
78
78
  "@willbooster/prettier-config": "10.0.0",
79
- "@willbooster/wb": "8.1.1",
79
+ "@willbooster/wb": "8.1.2",
80
80
  "conventional-changelog-conventionalcommits": "8.0.0",
81
81
  "eslint": "9.26.0",
82
82
  "eslint-config-flat-gitignore": "2.1.0",