build-ts 17.1.29 → 17.1.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/babel.config.mjs CHANGED
@@ -2,7 +2,14 @@ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import url from 'node:url';
4
4
 
5
- /** @type {import('@babel/core').TransformOptions} */
5
+ import pluginProposalDecorators from '@babel/plugin-proposal-decorators';
6
+ import pluginTransformExplicitResourceManagement from '@babel/plugin-transform-explicit-resource-management';
7
+ import presetEnv from '@babel/preset-env';
8
+ import presetReact from '@babel/preset-react';
9
+ import presetTypescript from '@babel/preset-typescript';
10
+ import pluginPolyfillCorejs3 from 'babel-plugin-polyfill-corejs3';
11
+
12
+ /** @type {import('@babel/core').InputOptions} */
6
13
  const config = {
7
14
  assumptions: {
8
15
  constantReexports: true,
@@ -19,23 +26,12 @@ const config = {
19
26
  setPublicClassFields: true,
20
27
  superIsCallableConstructor: true,
21
28
  },
22
- presets: [
23
- [
24
- '@babel/preset-env',
25
- {
26
- bugfixes: true,
27
- },
28
- ],
29
- '@babel/typescript',
30
- ],
29
+ presets: [[presetEnv, {}], presetTypescript],
31
30
  plugins: [
32
- // cf. https://babeljs.io/blog/2023/05/26/7.22.0#import-attributes-15536-15620
33
- '@babel/plugin-syntax-import-attributes',
34
- // cf. https://babeljs.io/blog/2023/05/26/7.22.0#explicit-resource-management-15633-15520
35
- '@babel/plugin-proposal-explicit-resource-management',
31
+ pluginTransformExplicitResourceManagement,
36
32
  // cf. https://babeljs.io/blog/2024/02/28/7.24.0#decorators-updates-16242
37
33
  [
38
- '@babel/plugin-proposal-decorators',
34
+ pluginProposalDecorators,
39
35
  {
40
36
  version: '2023-11',
41
37
  },
@@ -50,19 +46,19 @@ if (process.env.BUILD_TS_COREJS || process.env.BUILD_TS_COREJS_WITH_PROPOSALS) {
50
46
  const proposals = process.env.BUILD_TS_COREJS_WITH_PROPOSALS ? { proposals: true } : {};
51
47
 
52
48
  if (process.env.BUILD_TS_TARGET_CATEGORY === 'app') {
53
- /** @type {import('@babel/core').PluginItem} */
54
- const presetEnvConfig = config.presets[0][1];
55
- presetEnvConfig.useBuiltIns = 'usage';
56
- presetEnvConfig.corejs = { version: `${major}.${minor}`, ...proposals };
49
+ config.plugins.push([
50
+ pluginPolyfillCorejs3,
51
+ { method: 'usage-global', version: `${major}.${minor}`, ...proposals },
52
+ ]);
57
53
  } else if (process.env.BUILD_TS_TARGET_CATEGORY === 'lib') {
58
54
  // cf. https://github.com/babel/babel-polyfills#injection-methods
59
- config.plugins.push(['polyfill-corejs3', { method: 'usage-pure', version: `${major}.${minor}`, ...proposals }]);
55
+ config.plugins.push([pluginPolyfillCorejs3, { method: 'usage-pure', version: `${major}.${minor}`, ...proposals }]);
60
56
  }
61
57
  }
62
58
 
63
59
  if (process.env.BUILD_TS_TARGET_DETAIL === 'lib-react') {
64
60
  config.presets.push([
65
- '@babel/preset-react',
61
+ presetReact,
66
62
  {
67
63
  runtime: 'automatic',
68
64
  },
package/dist/index.js CHANGED
@@ -1,2 +1,4 @@
1
- import e from"node:fs";import t from"node:path";import{readAndApplyEnvironmentVariables as n,removeNpmAndYarnEnvironmentVariables as o,yargsOptionsBuilderForEnv as r}from"@willbooster/shared-lib-node";import s from"yargs";import{hideBin as i}from"yargs/helpers";import c from"chalk";import a from"date-time";import u from"pretty-ms";import{rolldown as p,watch as d}from"rolldown";import{onExit as l}from"signal-exit";import f from"node:url";import m from"node:process";import{builtinModules as y,createRequire as h}from"node:module";import j from"magic-string";import{parseSync as g,visitorKeys as b}from"oxc-parser";import{minify as w}from"terser";import*as v from"node:child_process";let x;function S(e,t){return x||(x=n(e,t),e.verbose&&console.info("Loaded env vars:",Object.keys(x))),x}function k(e,t){const n={},o=new Set([...(e.inline??[]).flatMap(e=>e.toString().split(",")),...e.autoInline?Object.keys(S(e,t)):[]]);for(const e of o)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 O(n){const o=t.join(n,"package.json");try{const t=await e.promises.readFile(o,"utf8");return[JSON.parse(t),o]}catch{}return[void 0,o]}const E={...r,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},$={...E,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"}},D={...$,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},F={...D,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},T={...$,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(n,o,r,s){const i=function(n,o,r,s){const i=[...n.external??[]].map(e=>e.toString());r.dependencies?.["@prisma/client"]&&i.push("prisma-client");if(i.push(...Object.keys(r.dependencies??{}),...Object.keys(r.peerDependencies??{}),...Object.keys(r.optionalDependencies??{})),e.existsSync(t.join("..","..","package.json"))){const n=e.readdirSync(t.join(".."),{withFileTypes:!0});for(const o of n){if(!o.isDirectory())continue;const n=t.join("..",o.name,"package.json");if(!e.existsSync(n))continue;const s=JSON.parse(e.readFileSync(n,"utf8"));r.dependencies?.[s.name??""]&&i.push(...Object.keys(s.dependencies??{}),...Object.keys(s.peerDependencies??{}),...Object.keys(s.optionalDependencies??{}))}}const c=W(n),a=function(e){return"app-node"===e||"functions"===e}(o)&&s?new RegExp(`^@?${s}(?:/.+)?`):void 0;return i.filter(e=>!c.has(V(e))&&!a?.test(e))}(n,o,r,s),c=W(n);return e=>!U(e,c)&&(q(e)||i.some(t=>e===t||e.startsWith(`${t}/`)))}function P(t,n,o){const r=[C(t,o),(s=t.keepImport?.map(e=>e.toString())??[],{name:"keep-import",resolveDynamicImport:e=>!s.includes(e)&&void 0}),Q()];var s;return t["core-js"]||t["core-js-proposals"]?(r.push(G("babel-core-js",()=>!0)),n.some(e=>e.preserveModules)||r.push({name:"commonjs-runtime-prelude",renderChunk(e,t,n){const o=function(e,t){return e.includes("__commonJSMin")?function(e){return"cjs"===e||"commonjs"===e}(t)?e.includes("__toESM")?Oe:void 0:"var __commonJSMin=(moduleFactory,module)=>()=>(module||(module={exports:{}},moduleFactory(module.exports,module)),module.exports);":void 0}(e,n.format);if(!o)return;const r=new j(e);return function(e,t,n){e.appendLeft(function(e){let t=0;if(e.startsWith("#!")){const n=e.indexOf("\n");if(-1===n)return e.length;t=n+1}const n=/(?:(?:"[^"\n]*"|'[^'\n]*');?\s*)/y;for(;;){if(n.lastIndex=t,!n.exec(e)?.[0])return t;t=n.lastIndex}}(t),`${n}\n`)}(r,e,o),{code:r.toString(),map:r.generateMap({hires:!0})}}})):r.push(G("babel-decorators",Ee)),r.push({name:"text",async load(t){if(!t.endsWith(".csv")&&!t.endsWith(".txt"))return;const n=await e.promises.readFile(t,"utf8");return{code:`export default ${JSON.stringify(n)};`,moduleType:"js"}}}),t.minify&&!n.some(e=>e.preserveModules)&&r.push({name:"terser",async renderChunk(e,t,n){const o=n.sourcemap?{asObject:!0}:void 0,r=await w(e,{compress:{directives:!1},ecma:2022,format:{comments:!1},module:"es"===n.format,sourceMap:o});if(r.code)return{code:r.code,map:r.map}}}),r}function W(e){return new Set(e.bundleBuiltins?.map(e=>V(e.toString()))??[])}function C(n,o){const r=W(n),s=h(t.join(o,"package.json"));return{name:"bundle-builtins",resolveId(n,i,c){const a=U(n,r);if(a)return function(n,o,r,s,i){const c=function(n,o,r){const s=n.resolve.paths(o)??n.resolve.paths("__build_ts_package_lookup__")??[];for(const n of[t.join(r,"node_modules"),...s]){const r=t.join(n,o,"package.json");if(e.existsSync(r))return e.realpathSync(r)}throw new Error(`Failed to resolve package.json for ${o}`)}(n,o,r),a=JSON.parse(e.readFileSync(c,"utf8"));if(!a.exports){const r=function(n,o,r,s){if("."===s)return n.resolve(o);const i=n.resolve(`${o}/${s.slice(2)}`);return q(i)?function(n,o){const r=L(o);if(!r)throw new Error(`Failed to resolve package subpath ${o}`);const s=t.join(n,r),i=M(s)??function(n){const o=t.join(n,"package.json");if(e.existsSync(o)){const r=JSON.parse(e.readFileSync(o,"utf8")),s=M(t.join(n,r.main??"index.js"));if(s)return s}return M(t.join(n,"index"))}(s);if(i)return i;throw new Error(`Failed to resolve package subpath ${o}`)}(r,s):i}(n,o,t.dirname(c),i);if(r!==o&&!r.startsWith("node:"))return r}const u=function(e,t,n){if(e.exports){const o=N(e.exports,t,n);return null===o?void 0:L(o)}return"."===n?e.main??"index.js":L(n)}(a,s,i);if(!u)throw new Error(`Failed to resolve package export for ${o}`);return t.join(t.dirname(c),u)}(s,a,o,function(e){const t=new Set(["node-addons","node","module-sync","default"]);"require-call"===e?t.add("require"):t.add("import");return t}(c.kind),function(e,t){const n=V(e);return n===t?".":`./${n.slice(t.length+1)}`}(n,a))}}}function M(n){return(t.extname(n)?[n]:[n,`${n}.js`,`${n}.json`,`${n}.node`]).find(t=>e.existsSync(t)&&e.statSync(t).isFile())}function N(e,t,n,o){if("string"==typeof e)return"."===n?R(e,o):void 0;if(null===e)return null;if(Array.isArray(e)){if("."!==n)return;for(const r of e){let e;try{e=N(r,t,n,o)}catch{continue}if(e)return e}return}if("object"!=typeof e)return;const r=e;if(function(e){return Object.keys(e).some(e=>"."===e||e.startsWith("./"))}(r)){if(Object.hasOwn(r,n))return N(r[n],t,".");const e=function(e,t){for(const[n,o]of Object.entries(e).sort(([e],[t])=>function(e,t){const n=e.indexOf("*"),o=t.indexOf("*");return-1===n&&-1===o?0:-1===n?1:-1===o?-1:o-n||t.length-e.length}(e,t))){const e=A(n,t);if(void 0!==e)return{value:B(o,e)}}}(r,n);return void 0===e?void 0:N(e.value,t,".")}if("."===n)for(const[e,s]of Object.entries(r)){if(!t.has(e))continue;const r=N(s,t,n,o);if(void 0!==r)return r}}function A(e,t){if(!e.startsWith("./")||!e.includes("*"))return;const[n,o]=e.split("*",2);return t===n||!t.startsWith(n)||!t.endsWith(o)||t.length<e.length?void 0:t.slice(n.length,t.length-o.length)}function B(e,t){return"string"==typeof e?R(e,t):Array.isArray(e)?e.map(e=>B(e,t)):e&&"object"==typeof e?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,B(n,t)])):e}function R(e,t){return function(e){if(!e.startsWith("./"))throw new Error(`Invalid package export target: ${e}`);J(e.slice(2),e)}(e),void 0===t?e:(function(e){J(e,e)}(t),e.replaceAll("*",t))}function J(e,t){const n=function(e,t){try{return decodeURIComponent(e).toLowerCase()}catch{throw new Error(`Invalid package export path segment in ${t}`)}}(e,t),o=new Set(["",".","..","node_modules"]);for(const e of n.split(/[\\/]/u))if(o.has(e))throw new Error(`Invalid package export path segment in ${t}`)}function L(e){return e?.replace(/^\.\//,"")}function U(e,t){const n=V(e);for(const e of t)if(n===e||n.startsWith(`${e}/`))return e}function V(e){return e.startsWith("node:")?e.slice(5):e}function q(e){return e.startsWith("node:")||y.includes(e)}function G(e,n){const o=[".cjs",".mjs",".js",".jsx",".cts",".mts",".ts",".tsx"],r=t.join(f.fileURLToPath(t.dirname(t.dirname(import.meta.url))),"babel.config.mjs");return{name:e,async transform(e,t){if(!n(e)||!o.some(e=>t.endsWith(e))||K(t))return;const{transformAsync:s}=await import("@babel/core"),i=await s(e,{caller:{name:"build-ts",supportsDynamicImport:!0,supportsExportNamespaceFrom:!0,supportsStaticESM:!0},configFile:r,filename:t,sourceMaps:!0});return i?.code?{code:i.code,map:i.map}:void 0}}}function K(e){return e.startsWith("\0")||function(e){return e.includes("/node_modules/")||e.includes("\\node_modules\\")}(e)}function Q(){const e=[".cjs",".mjs",".js",".jsx",".cts",".mts",".ts",".tsx"];return{name:"remove-console",transform(t,n){if(e.some(e=>n.endsWith(e))&&!K(n))return function(e,t){const n=function(){const{env:e}=process;if("production"===e.NODE_ENV)return new Set(["error","info","warn"]);if("test"===e.NODE_ENV)return new Set(["debug","error","info","warn"])}();if(!n)return;const o=function(e,t){const n=function(e){return e.endsWith(".tsx")?"tsx":e.endsWith(".ts")||e.endsWith(".cts")||e.endsWith(".mts")?"ts":e.endsWith(".jsx")?"jsx":"js"}(t),o=function(e){return e.endsWith(".cjs")||e.endsWith(".cts")?"commonjs":"unambiguous"}(t),r=g(t,e,{lang:n,sourceType:o});if(!Y(r))return r;if(t.endsWith(".js")&&"unambiguous"===o){const o=g(t,e,{lang:n,sourceType:"commonjs"});if(!Y(o))return o}}(e,t);if(!o)return;const r=new j(e),s=[];X(o.program,[],[],s,n);for(const e of function(e){const t=[];for(const n of e.toSorted((e,t)=>e.start-t.start||t.end-e.end))t.some(e=>e.start<=n.start&&n.end<=e.end)||t.push(n);return t.toSorted((e,t)=>t.start-e.start)}(s))r.overwrite(e.start,e.end,e.value);return r.hasChanged()?{code:r.toString(),map:r.generateMap({hires:!0})}:void 0}(t,n)}}}function Y(e){return e.errors.some(e=>"Error"===e.severity)}const H="(function () {})",z="(void 0)";function X(e,t,n,o,r){const s=function(e,t){if("Program"===e.type)return{end:e.end,shadowsConsole:Z(e),start:e.start};if(me(e))return{end:e.end,shadowsConsole:ee(e),start:e.start};if("BlockStatement"===e.type){const n=!!t&&me(t);return{end:e.end,shadowsConsole:te(e,!1)||n&&ce(e),start:e.start}}if("CatchClause"===e.type)return{end:e.end,shadowsConsole:fe(e.param),start:e.start};if("ClassExpression"===e.type)return{end:e.end,shadowsConsole:fe(e.id),start:e.start};if("StaticBlock"===e.type||"TSModuleBlock"===e.type)return{end:e.end,shadowsConsole:te(e,!1)||ce(e)||"TSModuleBlock"===e.type&&ue(t),start:e.start};if("SwitchStatement"===e.type)return{end:e.end,shadowsConsole:ne(e),start:oe(e)};if("SwitchCase"===e.type){const n="SwitchStatement"===t?.type&&ne(t);return{end:e.end,shadowsConsole:n||re(e),start:se(e)}}if("ForStatement"===e.type||"ForInStatement"===e.type||"ForOfStatement"===e.type)return{end:e.end,shadowsConsole:ie(e),start:e.start}}(e,t.at(-1));s&&n.push(s),ye(n,e)||"CallExpression"!==e.type||function(e,t,n,o){const r=t.at(-1),s=Se(e,"callee");if(!0===e.optional)return;if(!s||!be(s,o))return void(s&&function(e,t){if("MemberExpression"!==e.type)return!1;const n=Se(e,"object"),o=Se(e,"property");if(!n||!o||"MemberExpression"!==n.type)return!1;if(!0===e.computed||"Identifier"!==o.type||"bind"!==o.name)return!1;if(!ve(Se(n,"object")))return!1;const r=Se(n,"property");return!!r&&!we(n,r,t)}(s,o)&&n.push({kind:"replace",start:e.start,end:e.end,value:je(e,t)}));"ExpressionStatement"===r?.type?n.push({kind:"replace",start:r.start,end:r.end,value:";"}):n.push({kind:"replace",start:e.start,end:e.end,value:he(e,t)})}(e,t,o,r),ye(n,e)||"MemberExpression"!==e.type||function(e,t,n,o){const r=t.at(-1),s=t.at(-2);if(!be(e,o)||"MemberExpression"===r?.type)return;if("CallExpression"===r?.type&&r.callee===e&&!0!==r.optional)return;if(function(e,t,n){return"UpdateExpression"===t?.type&&t.argument===e||(("ForInStatement"===t?.type||"ForOfStatement"===t?.type)&&t.left===e||("ArrayPattern"===t?.type||("AssignmentPattern"===t?.type&&t.left===e||"Property"===t?.type&&t.value===e&&"ObjectPattern"===n?.type)))}(e,r,s))return;if("AssignmentExpression"===r?.type&&r.left===e){const e=Se(r,"right");return void(e&&n.push({kind:"replace",start:e.start,end:e.end,value:je(e,t)}))}n.push({kind:"replace",start:e.start,end:e.end,value:je(e,t)})}(e,t,o,r);const i=[...t,e];for(const t of xe(e))X(t,i,n,o,r);s&&n.pop()}function Z(e){for(const t of ke(e,"body"))if(ae(t,!0))return!0;return ce(e)}function ee(e){if(fe(e.id))return!0;for(const t of ke(e,"params"))if(fe(t))return!0;return!1}function te(e,t){for(const n of ke(e,"body"))if(ae(n,t))return!0;return!1}function ne(e){for(const t of ke(e,"cases"))for(const e of ke(t,"consequent"))if(ae(e,!1))return!0;return!1}function oe(e){for(const t of ke(e,"cases")){const e=se(t);if(e<t.end)return e}return e.end}function re(e){for(const t of ke(e,"consequent"))if(ae(t,!1))return!0;return!1}function se(e){const t=Se(e,"test");return t?t.start:ke(e,"consequent")[0]?.start??e.end}function ie(e){const t=Se(e,"ForStatement"===e.type?"init":"left");return!!t&&"VariableDeclaration"===t.type&&"var"!==t.kind&&le(t)}function ce(e){if(!e)return!1;for(const t of xe(e))if(t===e||!me(t)&&"StaticBlock"!==t.type&&"TSModuleBlock"!==t.type){if("VariableDeclaration"===t.type&&"var"===t.kind&&le(t))return!0;if(ce(t))return!0}return!1}function ae(e,t){const n=function(e){return"ExportNamedDeclaration"!==e.type&&"ExportDefaultDeclaration"!==e.type?void 0:Se(e,"declaration")}(e)??e;return!0!==n.declare&&("ImportDeclaration"===n.type?function(e){return"type"!==e.importKind&&ke(e,"specifiers").some(e=>"type"!==e.importKind&&fe(e.local))}(n):"FunctionDeclaration"===n.type||"ClassDeclaration"===n.type?fe(n.id):"TSImportEqualsDeclaration"===n.type?"type"!==n.importKind&&fe(n.id):"TSEnumDeclaration"===n.type||"TSModuleDeclaration"===n.type?pe(Se(n,"id")):"VariableDeclaration"===n.type&&(t||"var"!==n.kind)&&le(n))}function ue(e){return"TSModuleDeclaration"===e?.type&&!0!==e.declare&&de(Se(e,"id"))}function pe(e){return!!e&&("Identifier"===e.type?"console"===e.name:"TSQualifiedName"===e.type&&pe(Se(e,"left")))}function de(e){return!!e&&("Identifier"===e.type?"console"===e.name:"TSQualifiedName"===e.type&&(de(Se(e,"left"))||de(Se(e,"right"))))}function le(e){return ke(e,"declarations").some(e=>fe(Se(e,"id")))}function fe(e){return!!_e(e)&&("Identifier"===e.type&&"console"===e.name||("AssignmentPattern"===e.type||"RestElement"===e.type?fe(e.left??e.argument):"TSParameterProperty"===e.type?fe(e.parameter):"TSQualifiedName"===e.type?fe(e.left):"ArrayPattern"===e.type?ke(e,"elements").some(e=>fe(e)):"ObjectPattern"===e.type&&ke(e,"properties").some(e=>fe(e.value??e.argument))))}function me(e){return"FunctionDeclaration"===e.type||"FunctionExpression"===e.type||"ArrowFunctionExpression"===e.type}function ye(e,t){return e.some(e=>e.shadowsConsole&&e.start<=t.start&&t.end<=e.end)}function he(e,t){return ge(e,t)?`;${z}`:z}function je(e,t){return ge(e,t)?`;${H}`:H}function ge(e,t){const n=t.findLastIndex(e=>"ExpressionStatement"===e.type);if(n<0)return!1;const o=t[n];if(!o)return!1;const r=t[n-1];return o.start===e.start&&function(e){return"Program"===e?.type||"BlockStatement"===e?.type||"StaticBlock"===e?.type||"TSModuleBlock"===e?.type||"SwitchCase"===e?.type}(r)}function be(e,t){if("MemberExpression"!==e.type)return!1;const n=Se(e,"object"),o=Se(e,"property");return!0!==e.optional&&(!(!n||!o||we(e,o,t))&&(!!ve(n)||"MemberExpression"===n.type&&ve(Se(n,"object"))&&!0!==e.computed&&"Identifier"===o.type&&("call"===o.name||"apply"===o.name)))}function we(e,t,n){return!0!==e.computed&&"Identifier"===t.type&&n.has(t.name)}function ve(e){return"Identifier"===e?.type&&"console"===e.name}function xe(e){return(b[e.type]??[]).flatMap(t=>{const n=e[t];return Array.isArray(n)?n:[n]}).filter(e=>_e(e))}function Se(e,t){const n=e[t];return _e(n)?n:void 0}function ke(e,t){const n=e[t];return Array.isArray(n)?n.filter(e=>_e(e)):[]}function _e(e){return!!e&&"object"==typeof e&&"string"==typeof e.type}const Oe='var __create=Object.create,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__commonJSMin=(moduleFactory,module)=>()=>(module||(module={exports:{}},moduleFactory(module.exports,module)),module.exports),__copyProps=(to,from,except,descriptor)=>{if(from&&"object"==typeof from||"function"==typeof from)for(var key,names=__getOwnPropNames(from),index=0,length=names.length;index<length;index++)key=names[index],__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:(key=>from[key]).bind(null,key),enumerable:!(descriptor=__getOwnPropDesc(from,key))||descriptor.enumerable});return to},__toESM=(mod,isNodeMode,target)=>(target=null!=mod?__create(__getProtoOf(mod)):{},__copyProps(!isNodeMode&&mod&&mod.__esModule?target:__defProp(target,"default",{value:mod,enumerable:!0}),mod));';function Ee(e){return/(^|[^\p{ID_Continue}*])@\s*[(\p{ID_Start}$_]/u.test(function(e){let t,n="",o=0;for(;o<e.length;){const r=e[o],s=e[o+1];if(t){if("\\"===r){n+=" ",s&&(n+="\n"===s?"\n":" "),o+=2;continue}r===t&&(t=void 0),n+="\n"===r?"\n":" ",o++}else if('"'!==r&&"'"!==r&&"`"!==r){if("/"===r&&"/"!==s&&"*"!==s&&Fe(n)){const t=Ie(e,o);n+=Pe(e.slice(o,t)),o=t;continue}if("/"!==r||"/"!==s)if("/"!==r||"*"!==s)n+=r,o++;else{for(o+=2;o<e.length&&("*"!==e[o]||"/"!==e[o+1]);)n+="\n"===e[o]?"\n":" ",o++;o+=2}else{for(o+=2;o<e.length&&"\n"!==e[o];)o++;n+="\n"}}else t=r,n+=" ",o++}return n}(e))}const $e=new Set(["(","[","{",":",",",";","=","!","?","&","|","^","~","+","-","*","%","<",">"]),De=new Set(["await","case","default","delete","do","else","in","instanceof","new","of","return","throw","typeof","void","yield"]);function Fe(e){const t=Te(e);if(-1===t)return!0;const n=e[t]??"";if(")"===n)return function(e,t){const n=function(e,t){let n=0;for(let o=t;o>=0;o--){const t=e[o];if(")"===t)n++;else if("("===t&&(n--,0===n))return o}return-1}(e,t);if(-1===n)return!1;const o=Te(e,n-1);if(-1===o)return!1;const r=e.slice(0,o+1).match(/[\p{ID_Start}$_][\p{ID_Continue}$\u200c\u200d]*$/u)?.[0];return!!r&&["for","if","while","with"].includes(r)}(e,t);if(("+"===n||"-"===n)&&e[Te(e,t-1)]===n)return!1;if($e.has(n))return!0;const o=e.slice(0,t+1).match(/[\p{ID_Start}$_][\p{ID_Continue}$\u200c\u200d]*$/u)?.[0];return!!o&&De.has(o)}function Te(e,t=e.length-1){for(let n=t;n>=0;n--)if(!/\s/u.test(e[n]??""))return n;return-1}function Ie(e,t){let n=t+1,o=!1;for(;n<e.length;){const t=e[n];if("\\"!==t){if("["===t&&(o=!0),"]"===t&&(o=!1),"/"===t&&!o){for(n++;/[\p{ID_Continue}$\u200c\u200d]/u.test(e[n]??"");)n++;return n}if("\n"===t)return n;n++}else n+=2}return n}function Pe(e){return e.replace(/[^\n]/gu," ")}const We=h(import.meta.url);async function Ce(n,o){const r=Ne(o);if(!r)throw new Error(`Failed to find tsconfig.json in ${o}.`);n.verbose&&console.info("Found tsconfig.json:",r);const s=[];let i=t.join("dist",t.basename(o),"src");if(e.existsSync(i)){const n=t.dirname(o),r=await e.promises.readdir(n,{withFileTypes:!0});o=t.resolve(o);for(const i of r){if(!i.isDirectory())continue;const r=t.resolve(n,i.name);if(r===o)continue;const c=Ne(r),a=t.join("dist",i.name,"src");c&&e.existsSync(a)&&s.push([r,c,a])}}else i="dist";s.push([o,r,i]);let c=!0;for(const[e,r,i]of s)c&&=await Me(n,e,r,t.join(o,i));return c}async function Me(n,o,r,s){n.verbose&&console.info("runTsgo()",o,r,s);const i=t.dirname(r),c=t.join(i,`.build-ts-tsgo.${process.pid}.${Date.now()}.json`);try{await e.promises.writeFile(c,JSON.stringify(await async function(n,o,r){const s={declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:r,rootDir:"src"};if(await Be(t.join(n,"src"))){const o=function(n){let o=t.resolve(n);for(;;){const n=t.join(o,"node_modules","@types");if(e.existsSync(n))return n;const r=t.dirname(o);if(r===o)return;o=r}}(n),r=o?await async function(t){try{return(await e.promises.readdir(t,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}(o):[];r.includes("node")&&(s.types=r)}return{compilerOptions:s,extends:Re(t.dirname(o),o),include:["src/**/*"]}}(o,r,s),void 0,2));const n=v.spawnSync(process.execPath,[Ae(),"-p",c],{cwd:o,stdio:"inherit"});if(n.error)throw n.error;return 0===n.status}finally{await e.promises.rm(c,{force:!0})}}function Ne(n){let o=t.resolve(n);for(;;){const n=t.join(o,"tsconfig.json");if(e.existsSync(n))return n;const r=t.dirname(o);if(r===o)return;o=r}}function Ae(){const e=We.resolve("@typescript/native-preview/package.json");return t.join(t.dirname(e),"bin","tsgo.js")}async function Be(n){try{const o=await e.promises.readdir(n,{withFileTypes:!0});for(const r of o){const o=t.join(n,r.name);if(r.isDirectory()){if(await Be(o))return!0}else if(/\.[cm]?tsx?$/.test(r.name)&&(await e.promises.readFile(o,"utf8")).includes("node:"))return!0}}catch{return!1}return!1}function Re(e,n){const o=t.relative(e,n).replaceAll(t.sep,"/");return o.startsWith(".")?o:`./${o}`}const Je={command:"app [package]",describe:"Build an app",builder:D,handler:async e=>Ve(e,"app")},Le={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:F,async handler(e){if(!e.onlyPackageJson)return Ve(e,"functions");{const n=t.resolve(e.package?.toString()??"."),[o,r]=await O(n);o||(console.error(`Failed to parse package.json (${r}).`),process.exit(1)),await Ke(n,o,e.moduleType)}}},Ue={command:"lib [package]",describe:"Build a Node.js / React library",builder:T,handler:async e=>Ve(e,"lib")};async function Ve(n,o){process.env.NODE_ENV||="production";const r=!n.silent&&n.verbose,s=process.cwd(),i=t.resolve(n.package?.toString()??"."),[f,y]=await O(i);f||(console.error(`Failed to parse package.json (${y}).`),process.exit(1)),S(n,i);const h=function(n,o,r){if(n.input&&n.input.length>0)return n.input.map(e=>t.resolve(o,e.toString()));const s=t.join(r,"src");for(const n of["ts","tsx","cts","mts"]){const o=t.join(s,`index.${n}`);if(e.existsSync(o))return[o]}console.error("Failed to detect input file."),process.exit(1)}(n,s,i),j=function(e,n,o){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return n.some(e=>e.endsWith(".tsx"))||function(e){return Ge(t.join(e,"src"))}(o)?"lib-react":"lib";default:console.error("target option must be one of: "+_.join(", ")),process.exit(1)}}(o,h,i);r&&(console.info("argv:",n),console.info("packageJsonPath:",y),console.info("Target (Category):",`${j} (${o})`));const[g]=function(e){const t=e.name?.toString()??"",[,n,o]=/@([^/]+)\/(.+)/.exec(t)??[];return[n,o]}(f),b="module"===f.type;n["core-js"]?process.env.BUILD_TS_COREJS="1":n["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),r&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=o,process.env.BUILD_TS_TARGET_DETAIL=j;const w=function(e,n,o,r){const s=t.join(o,"dist");if("app-node"===n||"functions"===n){const t=Qe(r,e.moduleType);return[{dir:s,format:t?"module":"commonjs",minify:!1,sourcemap:e.sourcemap&&"inline",strict:!t}]}const i=[],c=e.moduleType||"both",a=e.jsExtension||"either";("cjs"===c||"both"===c||"either"===c&&!r)&&i.push({dir:s,entryFileNames:"both"===a||"either"===a&&!r?"[name].js":"[name].cjs",format:"commonjs",minify:e.minify,preserveModules:!0,preserveModulesRoot:t.join(o,"src"),sourcemap:e.sourcemap,strict:!0});("esm"===c||"both"===c||"either"===c&&r)&&i.push({dir:s,entryFileNames:"both"===a||"either"===a&&r?"[name].js":"[name].mjs",format:"module",minify:e.minify,preserveModules:!0,preserveModulesRoot:t.join(o,"src"),sourcemap:e.sourcemap});return i}(n,j,i,b);r&&console.info("OutputOptions:",w),0===w.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(i),await e.promises.rm(t.join(i,"dist"),{recursive:!0,force:!0}),"functions"===j&&await Ke(i,f,n.moduleType);const v={checks:{preferBuiltinFeature:!1},external:I(n,j,f,g),input:"functions"===j?Object.fromEntries(h.map((e,n)=>[0===n?"index":t.basename(e,t.extname(e)),e])):h,plugins:P(n,w,i),resolve:{extensionAlias:{".cjs":[".cjs",".cts"],".js":[".js",".ts",".tsx"],".mjs":[".mjs",".mts"]},extensions:[".cts",".mts",".ts",".tsx",".cjs",".mjs",".js",".jsx",".json"]},treeshake:!n["core-js"]&&!n["core-js-proposals"]&&void 0,transform:qe(n,i),watch:n.watch?{clearScreen:!1}:void 0},x=e=>(Array.isArray(e)?e:[e]).map(e=>t.relative(i,e));if(n.watch)!function(e,t,n,o,r,s){const i=d({...o,output:r}),p=async e=>{process.removeListener("uncaughtException",p),process.stdin.removeListener("end",p),i&&await i.close(),e&&process.exit(e)};l(p),process.on("uncaughtException",p),process.stdin.isTTY||(process.stdin.on("end",p),process.stdin.resume());i.on("event",async i=>{switch(i.code){case"ERROR":!function(e,t=!1){const n=e.name||e.cause?.name,o=n?`${n}: `:"",r=`${e.plugin?`(plugin ${e.plugin}) `:""}${o}${e.message}`,s=[c.bold(c.red(`[!] ${c.bold(r.toString())}`))];e.url&&s.push(c.cyan(e.url)),e.loc?s.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&s.push(e.id),e.frame&&s.push(c.dim(e.frame)),e.stack&&s.push(c.dim(e.stack?.replace(`${o}${e.message}\n`,""))),s.push("",""),console.error(s.join("\n")),t||m.exit(1)}(i.error,!0);break;case"BUNDLE_START":if(e.silent)break;console.info(c.cyan(`Bundles ${c.bold(s((p=o.input,p?"string"==typeof p?[p]:Array.isArray(p)?p:Object.values(p):[])).join(", "))} → ${c.bold(s(r.map(e=>e.file||e.dir||"")).join(", "))}\non ${n} ...`));break;case"BUNDLE_END":if(e.silent)break;console.info(c.green(`Created ${c.bold(s(i.output).join(", "))} in ${c.bold(u(i.duration))}`)),"app-node"!==t&&"functions"!==t&&await Ce(e,n);break;case"END":if(e.silent)break;console.info(`\n[${a()}] waiting for changes...`)}var p;"result"in i&&i.result&&i.result.close()})}(n,j,i,v,w,x);else{let e;n.silent||console.info(c.cyan(`Bundles ${c.bold(x(h).join(", "))} → ${c.bold(x(w.map(e=>e.file||e.dir||"")).join(", "))}\non ${i} ...`));let t=!1;try{const t=Date.now(),o=await p(v);e=o,await Promise.all(w.map(e=>o.write(e))),n.silent||console.info(c.green(`Created ${x(w.map(e=>e.file||e.dir||"")).join(", ")} in ${c.bold(u(Date.now()-t))}`))}catch(e){t=!0,console.error("Failed to build due to:",e)}await(e?.close()),t&&process.exit(1),"app-node"===j||"functions"===j||await Ce(n,i)||process.exit(1)}}function qe(e,t){return{define:k(e,t),jsx:"react-jsx",target:"es2022"}}function Ge(n){try{return e.readdirSync(n,{withFileTypes:!0}).some(e=>{const o=t.join(n,e.name);return e.isDirectory()?Ge(o):e.isFile()&&e.name.endsWith(".tsx")})}catch{return!1}}async function Ke(n,o,r){o.name+="-dist";const s="module"===o.type,i=Qe(s,r);o.main=s===i?"index.js":i?"index.mjs":"index.cjs",delete o.scripts,delete o.devDependencies,await e.promises.mkdir(t.join(n,"dist"),{recursive:!0}),await e.promises.writeFile(t.join(n,"dist","package.json"),JSON.stringify(o))}function Qe(e,t){return"esm"===t||(!t||"either"===t)&&e}const Ye={command:"run <file>",describe:"Run script",builder:{...E,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){S(e,process.cwd());const t=e.file?.toString()??"",n=process.versions.bun,o=n?"bun":"node",r=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&r.push("--watch"),r.push(t);const[,...s]=e._,i=[...r,...s.map(e=>e.toString())];e.verbose&&console.info(`Running '${o} ${i.join(" ")}'`);const c=v.spawnSync(o,i,{stdio:"inherit",env:{...process.env}});process.exit(c.status??1)}};o(process.env),await s(i(process.argv)).scriptName("build-ts").options(E).command(Je).command(Le).command(Ue).command(Ye).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJidWlsZGVyIl0sInNvdXJjZXMiOlsiLi4vc3JjL2Vudi50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1bmRsZXJMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvcGx1Z2luLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL3R5cGVTY3JpcHQudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgZW52VmFyTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi4oYXJndi5hdXRvSW5saW5lID8gT2JqZWN0LmtleXMobG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIGN3ZCkpIDogW10pLFxuICBdKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgZW52VmFyc0RlZltgcHJvY2Vzcy5lbnYuJHtuYW1lfWBdID0gSlNPTi5zdHJpbmdpZnkocHJvY2Vzcy5lbnZbbmFtZV0pO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0lubGluZSBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzRGVmKSk7XG4gIH1cbiAgcmV0dXJuIGVudlZhcnNEZWY7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcywgT3B0aW9ucyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldENhdGVnb3JpZXMgPSBbJ2FwcCcsICdmdW5jdGlvbnMnLCAnbGliJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldENhdGVnb3J5ID0gKHR5cGVvZiBhbGxUYXJnZXRDYXRlZ29yaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0RGV0YWlscyA9IFsnYXBwLW5vZGUnLCAnZnVuY3Rpb25zJywgJ2xpYicsICdsaWItcmVhY3QnXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0RGV0YWlsID0gKHR5cGVvZiBhbGxUYXJnZXREZXRhaWxzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBBcmd1bWVudHNUeXBlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBPcHRpb25zPj4gPSBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczxUPj47XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8W1BhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBzdHJpbmddPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIHJldHVybiBbSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHBhY2thZ2VKc29uUGF0aF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWlsZFRzUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHVybC5maWxlVVJMVG9QYXRoKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoaW1wb3J0Lm1ldGEudXJsKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lPy50b1N0cmluZygpID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggPz8gW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAncycsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgaW5wdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRocyBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4fVwiIGZyb20gcGFja2FnZSBkaXJlY3RvcnkgaXMgdGFyZ2V0ZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnaScsXG4gIH0sXG4gICdjb3JlLWpzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgJ2NvcmUtanMtcHJvcG9zYWxzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyB3aXRoIHByb3Bvc2FscyBzdXBwb3J0IGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3I6IEJ1aWxkRXJyb3IsIHJlY292ZXIgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZSB8fCAoZXJyb3IuY2F1c2UgYXMgRXJyb3IpPy5uYW1lO1xuICBjb25zdCBuYW1lU2VjdGlvbiA9IG5hbWUgPyBgJHtuYW1lfTogYCA6ICcnO1xuICBjb25zdCBwbHVnaW5TZWN0aW9uID0gZXJyb3IucGx1Z2luID8gYChwbHVnaW4gJHtlcnJvci5wbHVnaW59KSBgIDogJyc7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtwbHVnaW5TZWN0aW9ufSR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfWA7XG5cbiAgY29uc3Qgb3V0cHV0TGluZXMgPSBbY2hhbGsuYm9sZChjaGFsay5yZWQoYFshXSAke2NoYWxrLmJvbGQobWVzc2FnZS50b1N0cmluZygpKX1gKSldO1xuXG4gIGlmIChlcnJvci51cmwpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmN5YW4oZXJyb3IudXJsKSk7XG4gIH1cblxuICBpZiAoZXJyb3IubG9jKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChgJHtlcnJvci5sb2MuZmlsZSB8fCBlcnJvci5pZH0gKCR7ZXJyb3IubG9jLmxpbmV9OiR7ZXJyb3IubG9jLmNvbHVtbn0pYCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IuaWQpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGVycm9yLmlkKTtcbiAgfVxuXG4gIGlmIChlcnJvci5mcmFtZSkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLmZyYW1lKSk7XG4gIH1cblxuICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmRpbShlcnJvci5zdGFjaz8ucmVwbGFjZShgJHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9XFxuYCwgJycpKSk7XG4gIH1cblxuICBvdXRwdXRMaW5lcy5wdXNoKCcnLCAnJyk7XG4gIGNvbnNvbGUuZXJyb3Iob3V0cHV0TGluZXMuam9pbignXFxuJykpO1xuXG4gIGlmICghcmVjb3ZlcikgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY2F1c2U/OiB1bmtub3duO1xuICBmcmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGxvYz86IHtcbiAgICBjb2x1bW46IG51bWJlcjtcbiAgICBmaWxlPzogc3RyaW5nO1xuICAgIGxpbmU6IG51bWJlcjtcbiAgfTtcbiAgcGx1Z2luPzogc3RyaW5nO1xuICB1cmw/OiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBidWlsdGluTW9kdWxlcyB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybU9wdGlvbnMgfSBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgTWFnaWNTdHJpbmcgZnJvbSAnbWFnaWMtc3RyaW5nJztcbmltcG9ydCB7IHBhcnNlU3luYywgdmlzaXRvcktleXMgfSBmcm9tICdveGMtcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgSW1wb3J0S2luZCwgT3V0cHV0T3B0aW9ucywgUGx1Z2luLCBSb2xsZG93blBsdWdpbk9wdGlvbiwgU291cmNlTWFwSW5wdXQgfSBmcm9tICdyb2xsZG93bic7XG5pbXBvcnQgeyBtaW5pZnkgfSBmcm9tICd0ZXJzZXInO1xuaW1wb3J0IHR5cGUgeyBNaW5pZnlPcHRpb25zLCBTb3VyY2VNYXBPcHRpb25zIH0gZnJvbSAndGVyc2VyJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4dGVybmFsTWF0Y2hlcihcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiAoaWQ6IHN0cmluZykgPT4gYm9vbGVhbiB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IGNvbGxlY3RFeHRlcm5hbERlcGVuZGVuY2llcyhhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VKc29uLCBuYW1lc3BhY2UpO1xuICBjb25zdCBidW5kbGVkQnVpbHRpbk5hbWVzID0gZ2V0QnVuZGxlZEJ1aWx0aW5OYW1lcyhhcmd2KTtcbiAgcmV0dXJuIChpZCkgPT4ge1xuICAgIGlmIChnZXRCdW5kbGVkQnVpbHRpblBhY2thZ2VOYW1lKGlkLCBidW5kbGVkQnVpbHRpbk5hbWVzKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAoXG4gICAgICBpc05vZGVCdWlsdGluKGlkKSB8fCBleHRlcm5hbERlcHMuc29tZSgoZGVwZW5kZW5jeU5hbWUpID0+IGlkID09PSBkZXBlbmRlbmN5TmFtZSB8fCBpZC5zdGFydHNXaXRoKGAke2RlcGVuZGVuY3lOYW1lfS9gKSlcbiAgICApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQbHVnaW5zKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZ1xuKTogUm9sbGRvd25QbHVnaW5PcHRpb25bXSB7XG4gIGNvbnN0IHBsdWdpbnM6IFJvbGxkb3duUGx1Z2luT3B0aW9uW10gPSBbXG4gICAgYnVuZGxlQnVpbHRpbnNQbHVnaW4oYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIGtlZXBJbXBvcnRQbHVnaW4oYXJndi5rZWVwSW1wb3J0Py5tYXAoKGl0ZW0pID0+IGl0ZW0udG9TdHJpbmcoKSkgPz8gW10pLFxuICAgIHJlbW92ZUNvbnNvbGVQbHVnaW4oKSxcbiAgXTtcbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSB8fCBhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcGx1Z2lucy5wdXNoKGJhYmVsQ29yZUpzUGx1Z2luKCkpO1xuICAgIGlmICghb3V0cHV0T3B0aW9uc0xpc3Quc29tZSgob3B0cykgPT4gb3B0cy5wcmVzZXJ2ZU1vZHVsZXMpKSB7XG4gICAgICBwbHVnaW5zLnB1c2goY29tbW9uSnNSdW50aW1lUHJlbHVkZVBsdWdpbigpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGx1Z2lucy5wdXNoKGJhYmVsRGVjb3JhdG9yc1BsdWdpbigpKTtcbiAgfVxuICBwbHVnaW5zLnB1c2godGV4dFBsdWdpbigpKTtcbiAgaWYgKGFyZ3YubWluaWZ5ICYmICFvdXRwdXRPcHRpb25zTGlzdC5zb21lKChvcHRzKSA9PiBvcHRzLnByZXNlcnZlTW9kdWxlcykpIHtcbiAgICBwbHVnaW5zLnB1c2godGVyc2VyUGx1Z2luKCkpO1xuICB9XG4gIHJldHVybiBwbHVnaW5zO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RXh0ZXJuYWxEZXBlbmRlbmNpZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBleHRlcm5hbERlcHMgPSBbLi4uKGFyZ3YuZXh0ZXJuYWwgPz8gW10pXS5tYXAoKGl0ZW0pID0+IGl0ZW0udG9TdHJpbmcoKSk7XG4gIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LlsnQHByaXNtYS9jbGllbnQnXSkge1xuICAgIGV4dGVybmFsRGVwcy5wdXNoKCdwcmlzbWEtY2xpZW50Jyk7XG4gIH1cbiAgLy8gYGRlcHM6IHRydWVgIGRpZCBub3QgaGFuZGxlIGltcG9ydHMgc3VjaCBhcyBgbG9kYXNoLmNodW5rL2luZGV4LmpzYC5cbiAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgKTtcbiAgLy8gQWRkIGV4dGVybmFsIGRlcGVuZGVuY2llcyBmcm9tIHNpYmxpbmcgcGFja2FnZXNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKCcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlycyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguam9pbignLi4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oJy4uJywgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVuZGxlZEJ1aWx0aW5OYW1lcyA9IGdldEJ1bmRsZWRCdWlsdGluTmFtZXMoYXJndik7XG4gIGNvbnN0IGJ1bmRsZWROYW1lc3BhY2VQYXR0ZXJuID1cbiAgICBzaG91bGRCdW5kbGVTYW1lTmFtZXNwYWNlRGVwZW5kZW5jaWVzKHRhcmdldERldGFpbCkgJiYgbmFtZXNwYWNlID8gbmV3IFJlZ0V4cChgXkA/JHtuYW1lc3BhY2V9KD86Ly4rKT9gKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGV4dGVybmFsRGVwcy5maWx0ZXIoKGRlcGVuZGVuY3lOYW1lKSA9PiB7XG4gICAgaWYgKGJ1bmRsZWRCdWlsdGluTmFtZXMuaGFzKG5vcm1hbGl6ZU5vZGVCdWlsdGluTmFtZShkZXBlbmRlbmN5TmFtZSkpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICFidW5kbGVkTmFtZXNwYWNlUGF0dGVybj8udGVzdChkZXBlbmRlbmN5TmFtZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRCdW5kbGVkQnVpbHRpbk5hbWVzKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+KTogU2V0PHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFNldChhcmd2LmJ1bmRsZUJ1aWx0aW5zPy5tYXAoKGl0ZW0pID0+IG5vcm1hbGl6ZU5vZGVCdWlsdGluTmFtZShpdGVtLnRvU3RyaW5nKCkpKSA/PyBbXSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEJ1bmRsZVNhbWVOYW1lc3BhY2VEZXBlbmRlbmNpZXModGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnO1xufVxuXG5mdW5jdGlvbiBidW5kbGVCdWlsdGluc1BsdWdpbihhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IFBsdWdpbiB7XG4gIGNvbnN0IGJ1bmRsZWRCdWlsdGluTmFtZXMgPSBnZXRCdW5kbGVkQnVpbHRpbk5hbWVzKGFyZ3YpO1xuICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2J1bmRsZS1idWlsdGlucycsXG4gICAgcmVzb2x2ZUlkKHNvdXJjZSwgX2ltcG9ydGVyLCBleHRyYU9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZ2V0QnVuZGxlZEJ1aWx0aW5QYWNrYWdlTmFtZShzb3VyY2UsIGJ1bmRsZWRCdWlsdGluTmFtZXMpO1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHJlc29sdmVQYWNrYWdlRW50cnkoXG4gICAgICAgIHJlcXVpcmUsXG4gICAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgICBwYWNrYWdlRGlyUGF0aCxcbiAgICAgICAgZ2V0UGFja2FnZUV4cG9ydENvbmRpdGlvbnMoZXh0cmFPcHRpb25zLmtpbmQpLFxuICAgICAgICBnZXRQYWNrYWdlU3VicGF0aChzb3VyY2UsIHBhY2thZ2VOYW1lKVxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5KFxuICByZXF1aXJlOiBOb2RlSlMuUmVxdWlyZSxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgY29uZGl0aW9uczogU2V0PHN0cmluZz4sXG4gIHN1YnBhdGg6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uUGF0aChyZXF1aXJlLCBwYWNrYWdlTmFtZSwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlUGFja2FnZVdpdGhvdXRFeHBvcnRzKHJlcXVpcmUsIHBhY2thZ2VOYW1lLCBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgc3VicGF0aCk7XG4gICAgaWYgKHJlc29sdmVkUGF0aCAhPT0gcGFja2FnZU5hbWUgJiYgIXJlc29sdmVkUGF0aC5zdGFydHNXaXRoKCdub2RlOicpKSByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICB9XG5cbiAgY29uc3QgZW50cnlQYXRoID0gZ2V0UGFja2FnZUVudHJ5UGF0aChwYWNrYWdlSnNvbiwgY29uZGl0aW9ucywgc3VicGF0aCk7XG4gIGlmICghZW50cnlQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBwYWNrYWdlIGV4cG9ydCBmb3IgJHtwYWNrYWdlTmFtZX1gKTtcbiAgfVxuICByZXR1cm4gcGF0aC5qb2luKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCBlbnRyeVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlRXhwb3J0Q29uZGl0aW9ucyhpbXBvcnRLaW5kOiBJbXBvcnRLaW5kKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBjb25kaXRpb25zID0gbmV3IFNldChbJ25vZGUtYWRkb25zJywgJ25vZGUnLCAnbW9kdWxlLXN5bmMnLCAnZGVmYXVsdCddKTtcbiAgaWYgKGltcG9ydEtpbmQgPT09ICdyZXF1aXJlLWNhbGwnKSB7XG4gICAgY29uZGl0aW9ucy5hZGQoJ3JlcXVpcmUnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLmFkZCgnaW1wb3J0Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlV2l0aG91dEV4cG9ydHMoXG4gIHJlcXVpcmU6IE5vZGVKUy5SZXF1aXJlLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBzdWJwYXRoOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmIChzdWJwYXRoID09PSAnLicpIHJldHVybiByZXF1aXJlLnJlc29sdmUocGFja2FnZU5hbWUpO1xuICBjb25zdCByZXNvbHZlZFBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9LyR7c3VicGF0aC5zbGljZSgnLi8nLmxlbmd0aCl9YCk7XG4gIHJldHVybiBpc05vZGVCdWlsdGluKHJlc29sdmVkUGF0aCkgPyByZXNvbHZlUGFja2FnZVN1YnBhdGhGcm9tRGlyKHBhY2thZ2VEaXJQYXRoLCBzdWJwYXRoKSA6IHJlc29sdmVkUGF0aDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VTdWJwYXRoRnJvbURpcihwYWNrYWdlRGlyUGF0aDogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdWJwYXRoRW50cnlQYXRoID0gbm9ybWFsaXplUGFja2FnZUVudHJ5UGF0aChzdWJwYXRoKTtcbiAgaWYgKCFzdWJwYXRoRW50cnlQYXRoKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIHBhY2thZ2Ugc3VicGF0aCAke3N1YnBhdGh9YCk7XG5cbiAgY29uc3QgZW50cnlQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBzdWJwYXRoRW50cnlQYXRoKTtcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKGVudHJ5UGF0aCkgPz8gcmVzb2x2ZURpcmVjdG9yeVBhdGgoZW50cnlQYXRoKTtcbiAgaWYgKHJlc29sdmVkUGF0aCkgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBwYWNrYWdlIHN1YnBhdGggJHtzdWJwYXRofWApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPyBbZmlsZVBhdGhdIDogW2ZpbGVQYXRoLCBgJHtmaWxlUGF0aH0uanNgLCBgJHtmaWxlUGF0aH0uanNvbmAsIGAke2ZpbGVQYXRofS5ub2RlYF07XG4gIHJldHVybiBmaWxlUGF0aHMuZmluZCgoY2FuZGlkYXRlUGF0aCkgPT4gZnMuZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSAmJiBmcy5zdGF0U3luYyhjYW5kaWRhdGVQYXRoKS5pc0ZpbGUoKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RvcnlQYXRoKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgIGNvbnN0IG1haW5QYXRoID0gcmVzb2x2ZUZpbGVQYXRoKHBhdGguam9pbihkaXJQYXRoLCBwYWNrYWdlSnNvbi5tYWluID8/ICdpbmRleC5qcycpKTtcbiAgICBpZiAobWFpblBhdGgpIHJldHVybiBtYWluUGF0aDtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZUZpbGVQYXRoKHBhdGguam9pbihkaXJQYXRoLCAnaW5kZXgnKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblBhdGgocmVxdWlyZTogTm9kZUpTLlJlcXVpcmUsIHBhY2thZ2VOYW1lOiBzdHJpbmcsIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtb2R1bGVQYXRocyA9IHJlcXVpcmUucmVzb2x2ZS5wYXRocyhwYWNrYWdlTmFtZSkgPz8gcmVxdWlyZS5yZXNvbHZlLnBhdGhzKCdfX2J1aWxkX3RzX3BhY2thZ2VfbG9va3VwX18nKSA/PyBbXTtcbiAgZm9yIChjb25zdCBtb2R1bGVQYXRoIG9mIFtwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdub2RlX21vZHVsZXMnKSwgLi4ubW9kdWxlUGF0aHNdKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKG1vZHVsZVBhdGgsIHBhY2thZ2VOYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgcGFja2FnZS5qc29uIGZvciAke3BhY2thZ2VOYW1lfWApO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlRW50cnlQYXRoKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgY29uZGl0aW9uczogU2V0PHN0cmluZz4sIHN1YnBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwYWNrYWdlSnNvbi5leHBvcnRzKSB7XG4gICAgY29uc3QgZW50cnlQYXRoID0gZ2V0RXhwb3J0RW50cnlQYXRoKHBhY2thZ2VKc29uLmV4cG9ydHMsIGNvbmRpdGlvbnMsIHN1YnBhdGgpO1xuICAgIHJldHVybiBlbnRyeVBhdGggPT09IG51bGwgPyB1bmRlZmluZWQgOiBub3JtYWxpemVQYWNrYWdlRW50cnlQYXRoKGVudHJ5UGF0aCk7XG4gIH1cbiAgaWYgKHN1YnBhdGggPT09ICcuJykgcmV0dXJuIHBhY2thZ2VKc29uLm1haW4gPz8gJ2luZGV4LmpzJztcbiAgcmV0dXJuIG5vcm1hbGl6ZVBhY2thZ2VFbnRyeVBhdGgoc3VicGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydEVudHJ5UGF0aChcbiAgZXhwb3J0c0ZpZWxkOiB1bmtub3duLFxuICBjb25kaXRpb25zOiBTZXQ8c3RyaW5nPixcbiAgc3VicGF0aDogc3RyaW5nLFxuICBwYXR0ZXJuTWF0Y2g/OiBzdHJpbmdcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICBpZiAodHlwZW9mIGV4cG9ydHNGaWVsZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3VicGF0aCA9PT0gJy4nID8gcmVzb2x2ZUV4cG9ydFRhcmdldChleHBvcnRzRmllbGQsIHBhdHRlcm5NYXRjaCkgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGV4cG9ydHNGaWVsZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cG9ydHNGaWVsZCkpIHtcbiAgICBpZiAoc3VicGF0aCAhPT0gJy4nKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBleHBvcnRFbnRyeSBvZiBleHBvcnRzRmllbGQpIHtcbiAgICAgIGxldCBlbnRyeVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBlbnRyeVBhdGggPSBnZXRFeHBvcnRFbnRyeVBhdGgoZXhwb3J0RW50cnksIGNvbmRpdGlvbnMsIHN1YnBhdGgsIHBhdHRlcm5NYXRjaCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnlQYXRoKSByZXR1cm4gZW50cnlQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgZXhwb3J0c0ZpZWxkICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBleHBvcnRSZWNvcmQgPSBleHBvcnRzRmllbGQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChoYXNFeHBvcnRTdWJwYXRocyhleHBvcnRSZWNvcmQpKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oZXhwb3J0UmVjb3JkLCBzdWJwYXRoKSkgcmV0dXJuIGdldEV4cG9ydEVudHJ5UGF0aChleHBvcnRSZWNvcmRbc3VicGF0aF0sIGNvbmRpdGlvbnMsICcuJyk7XG5cbiAgICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gZmluZEV4cG9ydFN1YnBhdGhQYXR0ZXJuKGV4cG9ydFJlY29yZCwgc3VicGF0aCk7XG4gICAgcmV0dXJuIHN1YnBhdGhFeHBvcnQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGdldEV4cG9ydEVudHJ5UGF0aChzdWJwYXRoRXhwb3J0LnZhbHVlLCBjb25kaXRpb25zLCAnLicpO1xuICB9XG4gIGlmIChzdWJwYXRoICE9PSAnLicpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBbY29uZGl0aW9uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwb3J0UmVjb3JkKSkge1xuICAgIGlmICghY29uZGl0aW9ucy5oYXMoY29uZGl0aW9uKSkgY29udGludWU7XG5cbiAgICBjb25zdCBlbnRyeVBhdGggPSBnZXRFeHBvcnRFbnRyeVBhdGgodmFsdWUsIGNvbmRpdGlvbnMsIHN1YnBhdGgsIHBhdHRlcm5NYXRjaCk7XG4gICAgaWYgKGVudHJ5UGF0aCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZW50cnlQYXRoO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc0V4cG9ydFN1YnBhdGhzKGV4cG9ydFJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGV4cG9ydFJlY29yZCkuc29tZSgoa2V5KSA9PiBrZXkgPT09ICcuJyB8fCBrZXkuc3RhcnRzV2l0aCgnLi8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRFeHBvcnRTdWJwYXRoUGF0dGVybihleHBvcnRSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzdWJwYXRoOiBzdHJpbmcpOiB7IHZhbHVlOiB1bmtub3duIH0gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBvcnRSZWNvcmQpLnNvcnQoKFtrZXlBXSwgW2tleUJdKSA9PiBjb21wYXJlRXhwb3J0UGF0dGVybktleXMoa2V5QSwga2V5QikpKSB7XG4gICAgY29uc3QgcGF0dGVybk1hdGNoID0gZ2V0RXhwb3J0UGF0dGVybk1hdGNoKGtleSwgc3VicGF0aCk7XG4gICAgaWYgKHBhdHRlcm5NYXRjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogcmVwbGFjZUV4cG9ydFBhdHRlcm4odmFsdWUsIHBhdHRlcm5NYXRjaCkgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZUV4cG9ydFBhdHRlcm5LZXlzKGtleUE6IHN0cmluZywga2V5Qjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgYmFzZUxlbmd0aEEgPSBrZXlBLmluZGV4T2YoJyonKTtcbiAgY29uc3QgYmFzZUxlbmd0aEIgPSBrZXlCLmluZGV4T2YoJyonKTtcbiAgaWYgKGJhc2VMZW5ndGhBID09PSAtMSAmJiBiYXNlTGVuZ3RoQiA9PT0gLTEpIHJldHVybiAwO1xuICBpZiAoYmFzZUxlbmd0aEEgPT09IC0xKSByZXR1cm4gMTtcbiAgaWYgKGJhc2VMZW5ndGhCID09PSAtMSkgcmV0dXJuIC0xO1xuICByZXR1cm4gYmFzZUxlbmd0aEIgLSBiYXNlTGVuZ3RoQSB8fCBrZXlCLmxlbmd0aCAtIGtleUEubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdHRlcm4uc3RhcnRzV2l0aCgnLi8nKSB8fCAhcGF0dGVybi5pbmNsdWRlcygnKicpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBwYXR0ZXJuLnNwbGl0KCcqJywgMikgYXMgW3N0cmluZywgc3RyaW5nXTtcbiAgaWYgKHN1YnBhdGggPT09IHByZWZpeCB8fCAhc3VicGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHwgIXN1YnBhdGguZW5kc1dpdGgoc3VmZml4KSB8fCBzdWJwYXRoLmxlbmd0aCA8IHBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gc3VicGF0aC5zbGljZShwcmVmaXgubGVuZ3RoLCBzdWJwYXRoLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlRXhwb3J0UGF0dGVybih2YWx1ZTogdW5rbm93biwgcGF0dGVybk1hdGNoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiByZXNvbHZlRXhwb3J0VGFyZ2V0KHZhbHVlLCBwYXR0ZXJuTWF0Y2gpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHJlcGxhY2VFeHBvcnRQYXR0ZXJuKGl0ZW0sIHBhdHRlcm5NYXRjaCkpO1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBba2V5LCByZXBsYWNlRXhwb3J0UGF0dGVybihpdGVtLCBwYXR0ZXJuTWF0Y2gpXSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFRhcmdldCh0YXJnZXQ6IHN0cmluZywgcGF0dGVybk1hdGNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICB2YWxpZGF0ZUV4cG9ydFRhcmdldCh0YXJnZXQpO1xuICBpZiAocGF0dGVybk1hdGNoID09PSB1bmRlZmluZWQpIHJldHVybiB0YXJnZXQ7XG5cbiAgdmFsaWRhdGVFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybk1hdGNoKTtcbiAgcmV0dXJuIHRhcmdldC5yZXBsYWNlQWxsKCcqJywgcGF0dGVybk1hdGNoKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBvcnRUYXJnZXQodGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCF0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhY2thZ2UgZXhwb3J0IHRhcmdldDogJHt0YXJnZXR9YCk7XG5cbiAgdmFsaWRhdGVQYXRoU2VnbWVudHModGFyZ2V0LnNsaWNlKCcuLycubGVuZ3RoKSwgdGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybk1hdGNoOiBzdHJpbmcpOiB2b2lkIHtcbiAgdmFsaWRhdGVQYXRoU2VnbWVudHMocGF0dGVybk1hdGNoLCBwYXR0ZXJuTWF0Y2gpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBhdGhTZWdtZW50cyhwYXRoVmFsdWU6IHN0cmluZywgc291cmNlVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkZWNvZGVkUGF0aCA9IGRlY29kZVBhdGhWYWx1ZShwYXRoVmFsdWUsIHNvdXJjZVZhbHVlKTtcbiAgY29uc3QgaW52YWxpZFNlZ21lbnRzID0gbmV3IFNldChbJycsICcuJywgJy4uJywgJ25vZGVfbW9kdWxlcyddKTtcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIGRlY29kZWRQYXRoLnNwbGl0KC9bXFxcXC9dL3UpKSB7XG4gICAgaWYgKGludmFsaWRTZWdtZW50cy5oYXMoc2VnbWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrYWdlIGV4cG9ydCBwYXRoIHNlZ21lbnQgaW4gJHtzb3VyY2VWYWx1ZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlUGF0aFZhbHVlKHBhdGhWYWx1ZTogc3RyaW5nLCBzb3VyY2VWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhWYWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhY2thZ2UgZXhwb3J0IHBhdGggc2VnbWVudCBpbiAke3NvdXJjZVZhbHVlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VFbnRyeVBhdGgoZW50cnlQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZW50cnlQYXRoPy5yZXBsYWNlKC9eXFwuXFwvLywgJycpO1xufVxuXG5mdW5jdGlvbiBnZXRCdW5kbGVkQnVpbHRpblBhY2thZ2VOYW1lKGlkOiBzdHJpbmcsIGJ1bmRsZWRCdWlsdGluTmFtZXM6IFNldDxzdHJpbmc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9ybWFsaXplZElkID0gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGlkKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlTmFtZSBvZiBidW5kbGVkQnVpbHRpbk5hbWVzKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWRJZCA9PT0gcGFja2FnZU5hbWUgfHwgbm9ybWFsaXplZElkLnN0YXJ0c1dpdGgoYCR7cGFja2FnZU5hbWV9L2ApKSByZXR1cm4gcGFja2FnZU5hbWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2FnZVN1YnBhdGgoaWQ6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IG5vcm1hbGl6ZU5vZGVCdWlsdGluTmFtZShpZCk7XG4gIHJldHVybiBub3JtYWxpemVkSWQgPT09IHBhY2thZ2VOYW1lID8gJy4nIDogYC4vJHtub3JtYWxpemVkSWQuc2xpY2UocGFja2FnZU5hbWUubGVuZ3RoICsgMSl9YDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaWQuc3RhcnRzV2l0aCgnbm9kZTonKSA/IGlkLnNsaWNlKCdub2RlOicubGVuZ3RoKSA6IGlkO1xufVxuXG5mdW5jdGlvbiBpc05vZGVCdWlsdGluKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoJ25vZGU6JykgfHwgYnVpbHRpbk1vZHVsZXMuaW5jbHVkZXMoaWQpO1xufVxuXG5mdW5jdGlvbiBrZWVwSW1wb3J0UGx1Z2luKG1vZHVsZU5hbWVzOiBzdHJpbmdbXSk6IFBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2tlZXAtaW1wb3J0JyxcbiAgICByZXNvbHZlRHluYW1pY0ltcG9ydChzb3VyY2UpIHtcbiAgICAgIHJldHVybiBtb2R1bGVOYW1lcy5pbmNsdWRlcyhzb3VyY2UpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmFiZWxDb3JlSnNQbHVnaW4oKTogUGx1Z2luIHtcbiAgcmV0dXJuIGJhYmVsUGx1Z2luKCdiYWJlbC1jb3JlLWpzJywgKCkgPT4gdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGJhYmVsRGVjb3JhdG9yc1BsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4gYmFiZWxQbHVnaW4oJ2JhYmVsLWRlY29yYXRvcnMnLCBjb250YWluc0RlY29yYXRvcik7XG59XG5cbmZ1bmN0aW9uIGJhYmVsUGx1Z2luKG5hbWU6IHN0cmluZywgc2hvdWxkVHJhbnNmb3JtOiAoY29kZTogc3RyaW5nKSA9PiBib29sZWFuKTogUGx1Z2luIHtcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQpIHtcbiAgICAgIGlmICghc2hvdWxkVHJhbnNmb3JtKGNvZGUpIHx8ICFleHRlbnNpb25zLnNvbWUoKGV4dGVuc2lvbikgPT4gaWQuZW5kc1dpdGgoZXh0ZW5zaW9uKSkgfHwgaXNCYWJlbEV4Y2x1ZGVkUGF0aChpZCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB0cmFuc2Zvcm1Bc3luYyB9ID0gYXdhaXQgaW1wb3J0KCdAYmFiZWwvY29yZScpO1xuICAgICAgY29uc3Qgb3B0aW9uczogVHJhbnNmb3JtT3B0aW9ucyA9IHtcbiAgICAgICAgY2FsbGVyOiB7XG4gICAgICAgICAgbmFtZTogJ2J1aWxkLXRzJyxcbiAgICAgICAgICBzdXBwb3J0c0R5bmFtaWNJbXBvcnQ6IHRydWUsXG4gICAgICAgICAgc3VwcG9ydHNFeHBvcnROYW1lc3BhY2VGcm9tOiB0cnVlLFxuICAgICAgICAgIHN1cHBvcnRzU3RhdGljRVNNOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBjb25maWdGaWxlOiBiYWJlbENvbmZpZ1BhdGgsXG4gICAgICAgIGZpbGVuYW1lOiBpZCxcbiAgICAgICAgc291cmNlTWFwczogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1Bc3luYyhjb2RlLCBvcHRpb25zKTtcbiAgICAgIGlmICghcmVzdWx0Py5jb2RlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiByZXN1bHQuY29kZSxcbiAgICAgICAgbWFwOiByZXN1bHQubWFwIGFzIFNvdXJjZU1hcElucHV0LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JhYmVsRXhjbHVkZWRQYXRoKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoJ1xcMCcpIHx8IGlzTm9kZU1vZHVsZXNQYXRoKGlkKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ29uc29sZVBsdWdpbigpOiBQbHVnaW4ge1xuICBjb25zdCBleHRlbnNpb25zID0gWycuY2pzJywgJy5tanMnLCAnLmpzJywgJy5qc3gnLCAnLmN0cycsICcubXRzJywgJy50cycsICcudHN4J107XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3JlbW92ZS1jb25zb2xlJyxcbiAgICB0cmFuc2Zvcm0oY29kZSwgaWQpIHtcbiAgICAgIGlmICghZXh0ZW5zaW9ucy5zb21lKChleHRlbnNpb24pID0+IGlkLmVuZHNXaXRoKGV4dGVuc2lvbikpIHx8IGlzQmFiZWxFeGNsdWRlZFBhdGgoaWQpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZW1vdmVDb25zb2xlKGNvZGUsIGlkKTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiByZW1vdmVDb25zb2xlKGNvZGU6IHN0cmluZywgaWQ6IHN0cmluZyk6IHsgY29kZTogc3RyaW5nOyBtYXA6IFNvdXJjZU1hcElucHV0IH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBleGNsdWRlZE1ldGhvZHMgPSBnZXRDb25zb2xlUmVtb3ZhbEV4Y2x1ZGVkTWV0aG9kcygpO1xuICBpZiAoIWV4Y2x1ZGVkTWV0aG9kcykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBFc2NhcGVkIGlkZW50aWZpZXJzIHN1Y2ggYXMgYFxcdTAwNjNvbnNvbGVgIG11c3Qgc3RpbGwgYmUgaGFuZGxlZCwgc28gZG8gbm90IGd1YXJkIHBhcnNpbmcgd2l0aCBhIHJhdyBgY29uc29sZWAgc3Vic3RyaW5nIGNoZWNrLlxuICBjb25zdCBhc3QgPSBwYXJzZUNvbnNvbGVSZW1vdmFsQXN0KGNvZGUsIGlkKTtcbiAgaWYgKCFhc3QpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbWFnaWNTdHJpbmcgPSBuZXcgTWFnaWNTdHJpbmcoY29kZSk7XG4gIGNvbnN0IHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10gPSBbXTtcbiAgY29uc3Qgc2NvcGVzOiBDb25zb2xlU2NvcGVbXSA9IFtdO1xuICBjb2xsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhhc3QucHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbnNvbGVOb2RlLCBbXSwgc2NvcGVzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2Ygc2VsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhyZXBsYWNlbWVudHMpKSB7XG4gICAgbWFnaWNTdHJpbmcub3ZlcndyaXRlKHJlcGxhY2VtZW50LnN0YXJ0LCByZXBsYWNlbWVudC5lbmQsIHJlcGxhY2VtZW50LnZhbHVlKTtcbiAgfVxuXG4gIGlmICghbWFnaWNTdHJpbmcuaGFzQ2hhbmdlZCgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGNvZGU6IG1hZ2ljU3RyaW5nLnRvU3RyaW5nKCksXG4gICAgbWFwOiBtYWdpY1N0cmluZy5nZW5lcmF0ZU1hcCh7IGhpcmVzOiB0cnVlIH0pIGFzIFNvdXJjZU1hcElucHV0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDb25zb2xlUmVtb3ZhbEV4Y2x1ZGVkTWV0aG9kcygpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgZW52IH0gPSBwcm9jZXNzO1xuICBpZiAoZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHJldHVybiBuZXcgU2V0KFsnZXJyb3InLCAnaW5mbycsICd3YXJuJ10pO1xuICBpZiAoZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHJldHVybiBuZXcgU2V0KFsnZGVidWcnLCAnZXJyb3InLCAnaW5mbycsICd3YXJuJ10pO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvbnNvbGVSZW1vdmFsQXN0KGNvZGU6IHN0cmluZywgaWQ6IHN0cmluZyk6IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlU3luYz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBsYW5nID0gZ2V0UGFyc2VyTGFuZyhpZCk7XG4gIGNvbnN0IHNvdXJjZVR5cGUgPSBnZXRQYXJzZXJTb3VyY2VUeXBlKGlkKTtcbiAgY29uc3QgYXN0ID0gcGFyc2VTeW5jKGlkLCBjb2RlLCB7IGxhbmcsIHNvdXJjZVR5cGUgfSk7XG4gIGlmICghaGFzUGFyc2VFcnJvcihhc3QpKSByZXR1cm4gYXN0O1xuICBpZiAoaWQuZW5kc1dpdGgoJy5qcycpICYmIHNvdXJjZVR5cGUgPT09ICd1bmFtYmlndW91cycpIHtcbiAgICBjb25zdCBjb21tb25Kc0FzdCA9IHBhcnNlU3luYyhpZCwgY29kZSwgeyBsYW5nLCBzb3VyY2VUeXBlOiAnY29tbW9uanMnIH0pO1xuICAgIGlmICghaGFzUGFyc2VFcnJvcihjb21tb25Kc0FzdCkpIHJldHVybiBjb21tb25Kc0FzdDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNQYXJzZUVycm9yKGFzdDogUmV0dXJuVHlwZTx0eXBlb2YgcGFyc2VTeW5jPik6IGJvb2xlYW4ge1xuICByZXR1cm4gYXN0LmVycm9ycy5zb21lKChlcnJvcikgPT4gZXJyb3Iuc2V2ZXJpdHkgPT09ICdFcnJvcicpO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZXJMYW5nKGlkOiBzdHJpbmcpOiAnanMnIHwgJ2pzeCcgfCAndHMnIHwgJ3RzeCcge1xuICBpZiAoaWQuZW5kc1dpdGgoJy50c3gnKSkgcmV0dXJuICd0c3gnO1xuICBpZiAoaWQuZW5kc1dpdGgoJy50cycpIHx8IGlkLmVuZHNXaXRoKCcuY3RzJykgfHwgaWQuZW5kc1dpdGgoJy5tdHMnKSkgcmV0dXJuICd0cyc7XG4gIGlmIChpZC5lbmRzV2l0aCgnLmpzeCcpKSByZXR1cm4gJ2pzeCc7XG4gIHJldHVybiAnanMnO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZXJTb3VyY2VUeXBlKGlkOiBzdHJpbmcpOiAnY29tbW9uanMnIHwgJ3VuYW1iaWd1b3VzJyB7XG4gIHJldHVybiBpZC5lbmRzV2l0aCgnLmNqcycpIHx8IGlkLmVuZHNXaXRoKCcuY3RzJykgPyAnY29tbW9uanMnIDogJ3VuYW1iaWd1b3VzJztcbn1cblxudHlwZSBDb25zb2xlTm9kZSA9IHtcbiAgdHlwZTogc3RyaW5nO1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbnR5cGUgQ29uc29sZVJlcGxhY2VtZW50ID0ge1xuICBraW5kOiAncmVwbGFjZSc7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICB2YWx1ZTogc3RyaW5nO1xufTtcblxudHlwZSBDb25zb2xlU2NvcGUgPSB7XG4gIGVuZDogbnVtYmVyO1xuICBzaGFkb3dzQ29uc29sZTogYm9vbGVhbjtcbiAgc3RhcnQ6IG51bWJlcjtcbn07XG5cbmNvbnN0IG5vb3BGdW5jdGlvbkV4cHJlc3Npb24gPSAnKGZ1bmN0aW9uICgpIHt9KSc7XG5jb25zdCB1bmRlZmluZWRFeHByZXNzaW9uID0gJyh2b2lkIDApJztcblxuZnVuY3Rpb24gY29sbGVjdENvbnNvbGVSZXBsYWNlbWVudHMoXG4gIG5vZGU6IENvbnNvbGVOb2RlLFxuICBhbmNlc3RvcnM6IENvbnNvbGVOb2RlW10sXG4gIHNjb3BlczogQ29uc29sZVNjb3BlW10sXG4gIHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10sXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBjb25zdCBwYXJlbnQgPSBhbmNlc3RvcnMuYXQoLTEpO1xuICBjb25zdCBzY29wZSA9IGdldENvbnNvbGVTY29wZShub2RlLCBwYXJlbnQpO1xuICBpZiAoc2NvcGUpIHNjb3Blcy5wdXNoKHNjb3BlKTtcblxuICBpZiAoIWlzQ29uc29sZVNoYWRvd2VkKHNjb3Blcywgbm9kZSkgJiYgbm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nKSB7XG4gICAgY29sbGVjdENvbnNvbGVDYWxsUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIH1cbiAgaWYgKCFpc0NvbnNvbGVTaGFkb3dlZChzY29wZXMsIG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgY29sbGVjdENvbnNvbGVNZW1iZXJSZXBsYWNlbWVudChub2RlLCBhbmNlc3RvcnMsIHJlcGxhY2VtZW50cywgZXhjbHVkZWRNZXRob2RzKTtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkQW5jZXN0b3JzID0gWy4uLmFuY2VzdG9ycywgbm9kZV07XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZ2V0Q29uc29sZU5vZGVDaGlsZHJlbihub2RlKSkge1xuICAgIGNvbGxlY3RDb25zb2xlUmVwbGFjZW1lbnRzKGNoaWxkLCBjaGlsZEFuY2VzdG9ycywgc2NvcGVzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIH1cblxuICBpZiAoc2NvcGUpIHNjb3Blcy5wb3AoKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uc29sZVNjb3BlKG5vZGU6IENvbnNvbGVOb2RlLCBwYXJlbnQ6IENvbnNvbGVOb2RlIHwgdW5kZWZpbmVkKTogQ29uc29sZVNjb3BlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1Byb2dyYW0nKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc1Byb2dyYW1Db25zb2xlQmluZGluZyhub2RlKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAoaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUobm9kZSkpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzRnVuY3Rpb25Db25zb2xlQmluZGluZyhub2RlKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnKSB7XG4gICAgY29uc3QgaXNGdW5jdGlvbkJvZHkgPSBwYXJlbnQgPyBpc0NvbnNvbGVGdW5jdGlvblNjb3BlTm9kZShwYXJlbnQpIDogZmFsc2U7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0Jsb2NrQ29uc29sZUJpbmRpbmcobm9kZSwgZmFsc2UpIHx8IChpc0Z1bmN0aW9uQm9keSAmJiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcobm9kZSkpLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdDYXRjaENsYXVzZScpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKG5vZGUucGFyYW0pLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdDbGFzc0V4cHJlc3Npb24nKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihub2RlLmlkKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnU3RhdGljQmxvY2snIHx8IG5vZGUudHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuZDogbm9kZS5lbmQsXG4gICAgICBzaGFkb3dzQ29uc29sZTpcbiAgICAgICAgaGFzQmxvY2tDb25zb2xlQmluZGluZyhub2RlLCBmYWxzZSkgfHxcbiAgICAgICAgaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKG5vZGUpIHx8XG4gICAgICAgIChub2RlLnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJyAmJiBoYXNOYW1lc3BhY2VDb25zb2xlQmluZGluZyhwYXJlbnQpKSxcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0LFxuICAgIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N3aXRjaFN0YXRlbWVudCcpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzU3dpdGNoQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBnZXRTd2l0Y2hTY29wZVN0YXJ0KG5vZGUpIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N3aXRjaENhc2UnKSB7XG4gICAgY29uc3Qgc3dpdGNoU2hhZG93c0NvbnNvbGUgPSBwYXJlbnQ/LnR5cGUgPT09ICdTd2l0Y2hTdGF0ZW1lbnQnICYmIGhhc1N3aXRjaENvbnNvbGVCaW5kaW5nKHBhcmVudCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuZDogbm9kZS5lbmQsXG4gICAgICBzaGFkb3dzQ29uc29sZTogc3dpdGNoU2hhZG93c0NvbnNvbGUgfHwgaGFzU3dpdGNoQ2FzZUNvbnNvbGVCaW5kaW5nKG5vZGUpLFxuICAgICAgc3RhcnQ6IGdldFN3aXRjaENhc2VTY29wZVN0YXJ0KG5vZGUpLFxuICAgIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0ZvclN0YXRlbWVudCcgfHwgbm9kZS50eXBlID09PSAnRm9ySW5TdGF0ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ0Zvck9mU3RhdGVtZW50Jykge1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNMb29wQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzUHJvZ3JhbUNvbnNvbGVCaW5kaW5nKG5vZGU6IENvbnNvbGVOb2RlKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldENvbnNvbGVBcnJheVByb3BlcnR5KG5vZGUsICdib2R5JykpIHtcbiAgICBpZiAoaGFzRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhzdGF0ZW1lbnQsIHRydWUpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBoYXNGdW5jdGlvbkNvbnNvbGVCaW5kaW5nKG5vZGU6IENvbnNvbGVOb2RlKTogYm9vbGVhbiB7XG4gIGlmIChoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4obm9kZS5pZCkpIHJldHVybiB0cnVlO1xuICBmb3IgKGNvbnN0IHBhcmFtIG9mIGdldENvbnNvbGVBcnJheVByb3BlcnR5KG5vZGUsICdwYXJhbXMnKSkge1xuICAgIGlmIChoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4ocGFyYW0pKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0Jsb2NrQ29uc29sZUJpbmRpbmcobm9kZTogQ29uc29sZU5vZGUsIGluY2x1ZGVWYXI6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2V0Q29uc29sZUFycmF5UHJvcGVydHkobm9kZSwgJ2JvZHknKSkge1xuICAgIGlmIChoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKHN0YXRlbWVudCwgaW5jbHVkZVZhcikpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzU3dpdGNoQ29uc29sZUJpbmRpbmcobm9kZTogQ29uc29sZU5vZGUpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzd2l0Y2hDYXNlIG9mIGdldENvbnNvbGVBcnJheVByb3BlcnR5KG5vZGUsICdjYXNlcycpKSB7XG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2V0Q29uc29sZUFycmF5UHJvcGVydHkoc3dpdGNoQ2FzZSwgJ2NvbnNlcXVlbnQnKSkge1xuICAgICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCBmYWxzZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFN3aXRjaFNjb3BlU3RhcnQobm9kZTogQ29uc29sZU5vZGUpOiBudW1iZXIge1xuICBmb3IgKGNvbnN0IHN3aXRjaENhc2Ugb2YgZ2V0Q29uc29sZUFycmF5UHJvcGVydHkobm9kZSwgJ2Nhc2VzJykpIHtcbiAgICBjb25zdCBzdGFydCA9IGdldFN3aXRjaENhc2VTY29wZVN0YXJ0KHN3aXRjaENhc2UpO1xuICAgIGlmIChzdGFydCA8IHN3aXRjaENhc2UuZW5kKSByZXR1cm4gc3RhcnQ7XG4gIH1cbiAgcmV0dXJuIG5vZGUuZW5kO1xufVxuXG5mdW5jdGlvbiBoYXNTd2l0Y2hDYXNlQ29uc29sZUJpbmRpbmcobm9kZTogQ29uc29sZU5vZGUpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2V0Q29uc29sZUFycmF5UHJvcGVydHkobm9kZSwgJ2NvbnNlcXVlbnQnKSkge1xuICAgIGlmIChoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKHN0YXRlbWVudCwgZmFsc2UpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFN3aXRjaENhc2VTY29wZVN0YXJ0KG5vZGU6IENvbnNvbGVOb2RlKTogbnVtYmVyIHtcbiAgY29uc3QgdGVzdCA9IGdldENvbnNvbGVOb2RlUHJvcGVydHkobm9kZSwgJ3Rlc3QnKTtcbiAgaWYgKHRlc3QpIHJldHVybiB0ZXN0LnN0YXJ0O1xuICByZXR1cm4gZ2V0Q29uc29sZUFycmF5UHJvcGVydHkobm9kZSwgJ2NvbnNlcXVlbnQnKVswXT8uc3RhcnQgPz8gbm9kZS5lbmQ7XG59XG5cbmZ1bmN0aW9uIGhhc0xvb3BDb25zb2xlQmluZGluZyhub2RlOiBDb25zb2xlTm9kZSk6IGJvb2xlYW4ge1xuICBjb25zdCBkZWNsYXJhdGlvbiA9IGdldENvbnNvbGVOb2RlUHJvcGVydHkobm9kZSwgbm9kZS50eXBlID09PSAnRm9yU3RhdGVtZW50JyA/ICdpbml0JyA6ICdsZWZ0Jyk7XG4gIHJldHVybiAhIWRlY2xhcmF0aW9uICYmIGRlY2xhcmF0aW9uLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJiBkZWNsYXJhdGlvbi5raW5kICE9PSAndmFyJyAmJiBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoZGVjbGFyYXRpb24pO1xufVxuXG5mdW5jdGlvbiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcocm9vdDogQ29uc29sZU5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFyb290KSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBnZXRDb25zb2xlTm9kZUNoaWxkcmVuKHJvb3QpKSB7XG4gICAgaWYgKGNoaWxkICE9PSByb290ICYmIChpc0NvbnNvbGVGdW5jdGlvblNjb3BlTm9kZShjaGlsZCkgfHwgY2hpbGQudHlwZSA9PT0gJ1N0YXRpY0Jsb2NrJyB8fCBjaGlsZC50eXBlID09PSAnVFNNb2R1bGVCbG9jaycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hpbGQudHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRpb24nICYmXG4gICAgICBjaGlsZC5raW5kID09PSAndmFyJyAmJlxuICAgICAgaGFzVmFyaWFibGVEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKGNoaWxkKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcoY2hpbGQpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0ltcG9ydENvbnNvbGVCaW5kaW5nKG5vZGU6IENvbnNvbGVOb2RlKTogYm9vbGVhbiB7XG4gIGlmIChub2RlLmltcG9ydEtpbmQgPT09ICd0eXBlJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZ2V0Q29uc29sZUFycmF5UHJvcGVydHkobm9kZSwgJ3NwZWNpZmllcnMnKS5zb21lKFxuICAgIChzcGVjaWZpZXIpID0+IHNwZWNpZmllci5pbXBvcnRLaW5kICE9PSAndHlwZScgJiYgaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHNwZWNpZmllci5sb2NhbClcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhub2RlOiBDb25zb2xlTm9kZSwgaW5jbHVkZVZhcjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBkZWNsYXJhdGlvbiA9IGdldEV4cG9ydERlY2xhcmF0aW9uKG5vZGUpID8/IG5vZGU7XG4gIGlmIChkZWNsYXJhdGlvbi5kZWNsYXJlID09PSB0cnVlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSAnSW1wb3J0RGVjbGFyYXRpb24nKSByZXR1cm4gaGFzSW1wb3J0Q29uc29sZUJpbmRpbmcoZGVjbGFyYXRpb24pO1xuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09ICdDbGFzc0RlY2xhcmF0aW9uJykge1xuICAgIHJldHVybiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4oZGVjbGFyYXRpb24uaWQpO1xuICB9XG4gIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSAnVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbicpIHtcbiAgICByZXR1cm4gZGVjbGFyYXRpb24uaW1wb3J0S2luZCAhPT0gJ3R5cGUnICYmIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihkZWNsYXJhdGlvbi5pZCk7XG4gIH1cbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT09ICdUU0VudW1EZWNsYXJhdGlvbicgfHwgZGVjbGFyYXRpb24udHlwZSA9PT0gJ1RTTW9kdWxlRGVjbGFyYXRpb24nKSB7XG4gICAgcmV0dXJuIGhhc0xlZnRtb3N0TW9kdWxlSWRDb25zb2xlQmluZGluZyhnZXRDb25zb2xlTm9kZVByb3BlcnR5KGRlY2xhcmF0aW9uLCAnaWQnKSk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBkZWNsYXJhdGlvbi50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdGlvbicgJiZcbiAgICAoaW5jbHVkZVZhciB8fCBkZWNsYXJhdGlvbi5raW5kICE9PSAndmFyJykgJiZcbiAgICBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoZGVjbGFyYXRpb24pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc05hbWVzcGFjZUNvbnNvbGVCaW5kaW5nKG5vZGU6IENvbnNvbGVOb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBub2RlPy50eXBlID09PSAnVFNNb2R1bGVEZWNsYXJhdGlvbicgJiYgbm9kZS5kZWNsYXJlICE9PSB0cnVlICYmIGhhc01vZHVsZUlkQ29uc29sZUJpbmRpbmcoZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShub2RlLCAnaWQnKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0xlZnRtb3N0TW9kdWxlSWRDb25zb2xlQmluZGluZyhpZDogQ29uc29sZU5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFpZCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInKSByZXR1cm4gaWQubmFtZSA9PT0gJ2NvbnNvbGUnO1xuICByZXR1cm4gaWQudHlwZSA9PT0gJ1RTUXVhbGlmaWVkTmFtZScgJiYgaGFzTGVmdG1vc3RNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldENvbnNvbGVOb2RlUHJvcGVydHkoaWQsICdsZWZ0JykpO1xufVxuXG5mdW5jdGlvbiBoYXNNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGlkOiBDb25zb2xlTm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIWlkKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpZC50eXBlID09PSAnSWRlbnRpZmllcicpIHJldHVybiBpZC5uYW1lID09PSAnY29uc29sZSc7XG4gIHJldHVybiAoXG4gICAgaWQudHlwZSA9PT0gJ1RTUXVhbGlmaWVkTmFtZScgJiZcbiAgICAoaGFzTW9kdWxlSWRDb25zb2xlQmluZGluZyhnZXRDb25zb2xlTm9kZVByb3BlcnR5KGlkLCAnbGVmdCcpKSB8fCBoYXNNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldENvbnNvbGVOb2RlUHJvcGVydHkoaWQsICdyaWdodCcpKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzVmFyaWFibGVEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKG5vZGU6IENvbnNvbGVOb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRDb25zb2xlQXJyYXlQcm9wZXJ0eShub2RlLCAnZGVjbGFyYXRpb25zJykuc29tZSgoZGVjbGFyYXRpb24pID0+XG4gICAgaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGdldENvbnNvbGVOb2RlUHJvcGVydHkoZGVjbGFyYXRpb24sICdpZCcpKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFpc0NvbnNvbGVOb2RlKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh2YWx1ZS50eXBlID09PSAnSWRlbnRpZmllcicgJiYgdmFsdWUubmFtZSA9PT0gJ2NvbnNvbGUnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdBc3NpZ25tZW50UGF0dGVybicgfHwgdmFsdWUudHlwZSA9PT0gJ1Jlc3RFbGVtZW50Jykge1xuICAgIHJldHVybiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4odmFsdWUubGVmdCA/PyB2YWx1ZS5hcmd1bWVudCk7XG4gIH1cbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdUU1BhcmFtZXRlclByb3BlcnR5Jykge1xuICAgIHJldHVybiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4odmFsdWUucGFyYW1ldGVyKTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ1RTUXVhbGlmaWVkTmFtZScpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHZhbHVlLmxlZnQpO1xuICB9XG4gIGlmICh2YWx1ZS50eXBlID09PSAnQXJyYXlQYXR0ZXJuJykge1xuICAgIHJldHVybiBnZXRDb25zb2xlQXJyYXlQcm9wZXJ0eSh2YWx1ZSwgJ2VsZW1lbnRzJykuc29tZSgoZWxlbWVudCkgPT4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGVsZW1lbnQpKTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nKSB7XG4gICAgcmV0dXJuIGdldENvbnNvbGVBcnJheVByb3BlcnR5KHZhbHVlLCAncHJvcGVydGllcycpLnNvbWUoKHByb3BlcnR5KSA9PlxuICAgICAgaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHByb3BlcnR5LnZhbHVlID8/IHByb3BlcnR5LmFyZ3VtZW50KVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0NvbnNvbGVGdW5jdGlvblNjb3BlTm9kZShub2RlOiBDb25zb2xlTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbm9kZS50eXBlID09PSAnRnVuY3Rpb25EZWNsYXJhdGlvbicgfHwgbm9kZS50eXBlID09PSAnRnVuY3Rpb25FeHByZXNzaW9uJyB8fCBub2RlLnR5cGUgPT09ICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbic7XG59XG5cbmZ1bmN0aW9uIGlzQ29uc29sZVNoYWRvd2VkKHNjb3BlczogQ29uc29sZVNjb3BlW10sIG5vZGU6IENvbnNvbGVOb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY29wZXMuc29tZSgoc2NvcGUpID0+IHNjb3BlLnNoYWRvd3NDb25zb2xlICYmIHNjb3BlLnN0YXJ0IDw9IG5vZGUuc3RhcnQgJiYgbm9kZS5lbmQgPD0gc2NvcGUuZW5kKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdENvbnNvbGVDYWxsUmVwbGFjZW1lbnQoXG4gIG5vZGU6IENvbnNvbGVOb2RlLFxuICBhbmNlc3RvcnM6IENvbnNvbGVOb2RlW10sXG4gIHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10sXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBjb25zdCBwYXJlbnQgPSBhbmNlc3RvcnMuYXQoLTEpO1xuICBjb25zdCBjYWxsZWUgPSBnZXRDb25zb2xlTm9kZVByb3BlcnR5KG5vZGUsICdjYWxsZWUnKTtcbiAgaWYgKG5vZGUub3B0aW9uYWwgPT09IHRydWUpIHJldHVybjtcbiAgaWYgKCFjYWxsZWUgfHwgIWlzSW5jbHVkZWRDb25zb2xlTWVtYmVyKGNhbGxlZSwgZXhjbHVkZWRNZXRob2RzKSkge1xuICAgIGlmIChjYWxsZWUgJiYgaXNJbmNsdWRlZENvbnNvbGVCaW5kTWVtYmVyKGNhbGxlZSwgZXhjbHVkZWRNZXRob2RzKSkge1xuICAgICAgcmVwbGFjZW1lbnRzLnB1c2goeyBraW5kOiAncmVwbGFjZScsIHN0YXJ0OiBub2RlLnN0YXJ0LCBlbmQ6IG5vZGUuZW5kLCB2YWx1ZTogZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnKSB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyBraW5kOiAncmVwbGFjZScsIHN0YXJ0OiBwYXJlbnQuc3RhcnQsIGVuZDogcGFyZW50LmVuZCwgdmFsdWU6ICc7JyB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXBsYWNlbWVudHMucHVzaCh7IGtpbmQ6ICdyZXBsYWNlJywgc3RhcnQ6IG5vZGUuc3RhcnQsIGVuZDogbm9kZS5lbmQsIHZhbHVlOiBnZXRVbmRlZmluZWRFeHByZXNzaW9uUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzKSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0Q29uc29sZU1lbWJlclJlcGxhY2VtZW50KFxuICBub2RlOiBDb25zb2xlTm9kZSxcbiAgYW5jZXN0b3JzOiBDb25zb2xlTm9kZVtdLFxuICByZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdLFxuICBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0xKTtcbiAgY29uc3QgZ3JhbmRwYXJlbnQgPSBhbmNlc3RvcnMuYXQoLTIpO1xuICBpZiAoIWlzSW5jbHVkZWRDb25zb2xlTWVtYmVyKG5vZGUsIGV4Y2x1ZGVkTWV0aG9kcykgfHwgcGFyZW50Py50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybjtcbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyAmJiBwYXJlbnQuY2FsbGVlID09PSBub2RlICYmIHBhcmVudC5vcHRpb25hbCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICBpZiAoaXNDb25zb2xlQXNzaWdubWVudFRhcmdldChub2RlLCBwYXJlbnQsIGdyYW5kcGFyZW50KSkgcmV0dXJuO1xuXG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdBc3NpZ25tZW50RXhwcmVzc2lvbicgJiYgcGFyZW50LmxlZnQgPT09IG5vZGUpIHtcbiAgICBjb25zdCByaWdodCA9IGdldENvbnNvbGVOb2RlUHJvcGVydHkocGFyZW50LCAncmlnaHQnKTtcbiAgICBpZiAocmlnaHQpIHtcbiAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogcmlnaHQuc3RhcnQsIGVuZDogcmlnaHQuZW5kLCB2YWx1ZTogZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQocmlnaHQsIGFuY2VzdG9ycykgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogbm9kZS5zdGFydCwgZW5kOiBub2RlLmVuZCwgdmFsdWU6IGdldE5vb3BGdW5jdGlvblJlcGxhY2VtZW50KG5vZGUsIGFuY2VzdG9ycykgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZEV4cHJlc3Npb25SZXBsYWNlbWVudChub2RlOiBDb25zb2xlTm9kZSwgYW5jZXN0b3JzOiBDb25zb2xlTm9kZVtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5lZWRzTGVhZGluZ1N0YXRlbWVudFNlbWljb2xvbihub2RlLCBhbmNlc3RvcnMpID8gYDske3VuZGVmaW5lZEV4cHJlc3Npb259YCA6IHVuZGVmaW5lZEV4cHJlc3Npb247XG59XG5cbmZ1bmN0aW9uIGdldE5vb3BGdW5jdGlvblJlcGxhY2VtZW50KG5vZGU6IENvbnNvbGVOb2RlLCBhbmNlc3RvcnM6IENvbnNvbGVOb2RlW10pOiBzdHJpbmcge1xuICByZXR1cm4gbmVlZHNMZWFkaW5nU3RhdGVtZW50U2VtaWNvbG9uKG5vZGUsIGFuY2VzdG9ycykgPyBgOyR7bm9vcEZ1bmN0aW9uRXhwcmVzc2lvbn1gIDogbm9vcEZ1bmN0aW9uRXhwcmVzc2lvbjtcbn1cblxuZnVuY3Rpb24gbmVlZHNMZWFkaW5nU3RhdGVtZW50U2VtaWNvbG9uKG5vZGU6IENvbnNvbGVOb2RlLCBhbmNlc3RvcnM6IENvbnNvbGVOb2RlW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc3RhdGVtZW50SW5kZXggPSBhbmNlc3RvcnMuZmluZExhc3RJbmRleCgoYW5jZXN0b3IpID0+IGFuY2VzdG9yLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50Jyk7XG4gIGlmIChzdGF0ZW1lbnRJbmRleCA8IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdGVtZW50ID0gYW5jZXN0b3JzW3N0YXRlbWVudEluZGV4XTtcbiAgaWYgKCFzdGF0ZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdGVtZW50UGFyZW50ID0gYW5jZXN0b3JzW3N0YXRlbWVudEluZGV4IC0gMV07XG4gIHJldHVybiBzdGF0ZW1lbnQuc3RhcnQgPT09IG5vZGUuc3RhcnQgJiYgaXNTdGF0ZW1lbnRMaXN0Tm9kZShzdGF0ZW1lbnRQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiBpc1N0YXRlbWVudExpc3ROb2RlKG5vZGU6IENvbnNvbGVOb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgbm9kZT8udHlwZSA9PT0gJ1Byb2dyYW0nIHx8XG4gICAgbm9kZT8udHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50JyB8fFxuICAgIG5vZGU/LnR5cGUgPT09ICdTdGF0aWNCbG9jaycgfHxcbiAgICBub2RlPy50eXBlID09PSAnVFNNb2R1bGVCbG9jaycgfHxcbiAgICBub2RlPy50eXBlID09PSAnU3dpdGNoQ2FzZSdcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNDb25zb2xlQXNzaWdubWVudFRhcmdldChcbiAgbm9kZTogQ29uc29sZU5vZGUsXG4gIHBhcmVudDogQ29uc29sZU5vZGUgfCB1bmRlZmluZWQsXG4gIGdyYW5kcGFyZW50OiBDb25zb2xlTm9kZSB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdVcGRhdGVFeHByZXNzaW9uJyAmJiBwYXJlbnQuYXJndW1lbnQgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICBpZiAoKHBhcmVudD8udHlwZSA9PT0gJ0ZvckluU3RhdGVtZW50JyB8fCBwYXJlbnQ/LnR5cGUgPT09ICdGb3JPZlN0YXRlbWVudCcpICYmIHBhcmVudC5sZWZ0ID09PSBub2RlKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0FycmF5UGF0dGVybicpIHJldHVybiB0cnVlO1xuICBpZiAocGFyZW50Py50eXBlID09PSAnQXNzaWdubWVudFBhdHRlcm4nICYmIHBhcmVudC5sZWZ0ID09PSBub2RlKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHBhcmVudD8udHlwZSA9PT0gJ1Byb3BlcnR5JyAmJiBwYXJlbnQudmFsdWUgPT09IG5vZGUgJiYgZ3JhbmRwYXJlbnQ/LnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJztcbn1cblxuZnVuY3Rpb24gaXNJbmNsdWRlZENvbnNvbGVNZW1iZXIobm9kZTogQ29uc29sZU5vZGUsIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgaWYgKG5vZGUudHlwZSAhPT0gJ01lbWJlckV4cHJlc3Npb24nKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgb2JqZWN0ID0gZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShub2RlLCAnb2JqZWN0Jyk7XG4gIGNvbnN0IHByb3BlcnR5ID0gZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShub2RlLCAncHJvcGVydHknKTtcbiAgaWYgKG5vZGUub3B0aW9uYWwgPT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFvYmplY3QgfHwgIXByb3BlcnR5IHx8IGlzRXhjbHVkZWRDb25zb2xlUHJvcGVydHkobm9kZSwgcHJvcGVydHksIGV4Y2x1ZGVkTWV0aG9kcykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIob2JqZWN0KSkgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIChcbiAgICBvYmplY3QudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nICYmXG4gICAgaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihnZXRDb25zb2xlTm9kZVByb3BlcnR5KG9iamVjdCwgJ29iamVjdCcpKSAmJlxuICAgIC8vIE1hdGNoZXMgYmFiZWwtcGx1Z2luLXRyYW5zZm9ybS1yZW1vdmUtY29uc29sZTogY2FsbC9hcHBseSBleGNsdXNpb25zIGFyZSBjaGVja2VkIG9uIHRoZSBvdXRlciBwcm9wZXJ0eSBvbmx5LlxuICAgIG5vZGUuY29tcHV0ZWQgIT09IHRydWUgJiZcbiAgICBwcm9wZXJ0eS50eXBlID09PSAnSWRlbnRpZmllcicgJiZcbiAgICAocHJvcGVydHkubmFtZSA9PT0gJ2NhbGwnIHx8IHByb3BlcnR5Lm5hbWUgPT09ICdhcHBseScpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzSW5jbHVkZWRDb25zb2xlQmluZE1lbWJlcihub2RlOiBDb25zb2xlTm9kZSwgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBvYmplY3QgPSBnZXRDb25zb2xlTm9kZVByb3BlcnR5KG5vZGUsICdvYmplY3QnKTtcbiAgY29uc3QgcHJvcGVydHkgPSBnZXRDb25zb2xlTm9kZVByb3BlcnR5KG5vZGUsICdwcm9wZXJ0eScpO1xuICBpZiAoIW9iamVjdCB8fCAhcHJvcGVydHkgfHwgb2JqZWN0LnR5cGUgIT09ICdNZW1iZXJFeHByZXNzaW9uJykgcmV0dXJuIGZhbHNlO1xuICBpZiAobm9kZS5jb21wdXRlZCA9PT0gdHJ1ZSB8fCBwcm9wZXJ0eS50eXBlICE9PSAnSWRlbnRpZmllcicgfHwgcHJvcGVydHkubmFtZSAhPT0gJ2JpbmQnKSByZXR1cm4gZmFsc2U7XG4gIGlmICghaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihnZXRDb25zb2xlTm9kZVByb3BlcnR5KG9iamVjdCwgJ29iamVjdCcpKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjb25zb2xlTWV0aG9kID0gZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShvYmplY3QsICdwcm9wZXJ0eScpO1xuICByZXR1cm4gISFjb25zb2xlTWV0aG9kICYmICFpc0V4Y2x1ZGVkQ29uc29sZVByb3BlcnR5KG9iamVjdCwgY29uc29sZU1ldGhvZCwgZXhjbHVkZWRNZXRob2RzKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZENvbnNvbGVQcm9wZXJ0eShcbiAgbWVtYmVyRXhwcmVzc2lvbjogQ29uc29sZU5vZGUsXG4gIHByb3BlcnR5OiBDb25zb2xlTm9kZSxcbiAgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPlxuKTogYm9vbGVhbiB7XG4gIC8vIFRoZSByZXN0b3JlZCBiZWhhdmlvciBtYXRjaGVzIGJhYmVsLXBsdWdpbi10cmFuc2Zvcm0tcmVtb3ZlLWNvbnNvbGUsIHdob3NlIGV4Y2x1c2lvbnMgb25seSBhcHBseSB0byBpZGVudGlmaWVyIHByb3BlcnRpZXMuXG4gIHJldHVybiBtZW1iZXJFeHByZXNzaW9uLmNvbXB1dGVkICE9PSB0cnVlICYmIHByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJiBleGNsdWRlZE1ldGhvZHMuaGFzKHByb3BlcnR5Lm5hbWUgYXMgc3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihub2RlOiBDb25zb2xlTm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbm9kZT8udHlwZSA9PT0gJ0lkZW50aWZpZXInICYmIG5vZGUubmFtZSA9PT0gJ2NvbnNvbGUnO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RDb25zb2xlUmVwbGFjZW1lbnRzKHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10pOiBDb25zb2xlUmVwbGFjZW1lbnRbXSB7XG4gIGNvbnN0IHNlbGVjdGVkOiBDb25zb2xlUmVwbGFjZW1lbnRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlcGxhY2VtZW50IG9mIHJlcGxhY2VtZW50cy50b1NvcnRlZCgoYSwgYikgPT4gYS5zdGFydCAtIGIuc3RhcnQgfHwgYi5lbmQgLSBhLmVuZCkpIHtcbiAgICBpZiAoc2VsZWN0ZWQuc29tZSgoaXRlbSkgPT4gaXRlbS5zdGFydCA8PSByZXBsYWNlbWVudC5zdGFydCAmJiByZXBsYWNlbWVudC5lbmQgPD0gaXRlbS5lbmQpKSBjb250aW51ZTtcbiAgICBzZWxlY3RlZC5wdXNoKHJlcGxhY2VtZW50KTtcbiAgfVxuICByZXR1cm4gc2VsZWN0ZWQudG9Tb3J0ZWQoKGEsIGIpID0+IGIuc3RhcnQgLSBhLnN0YXJ0KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uc29sZU5vZGVDaGlsZHJlbihub2RlOiBDb25zb2xlTm9kZSk6IENvbnNvbGVOb2RlW10ge1xuICByZXR1cm4gKHZpc2l0b3JLZXlzW25vZGUudHlwZV0gPz8gW10pXG4gICAgLmZsYXRNYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBub2RlW2tleV07XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfSlcbiAgICAuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIENvbnNvbGVOb2RlID0+IGlzQ29uc29sZU5vZGUodmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShub2RlOiBDb25zb2xlTm9kZSwga2V5OiBzdHJpbmcpOiBDb25zb2xlTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gbm9kZVtrZXldO1xuICByZXR1cm4gaXNDb25zb2xlTm9kZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwb3J0RGVjbGFyYXRpb24obm9kZTogQ29uc29sZU5vZGUpOiBDb25zb2xlTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJyAmJiBub2RlLnR5cGUgIT09ICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShub2RlLCAnZGVjbGFyYXRpb24nKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uc29sZUFycmF5UHJvcGVydHkobm9kZTogQ29uc29sZU5vZGUsIGtleTogc3RyaW5nKTogQ29uc29sZU5vZGVbXSB7XG4gIGNvbnN0IHZhbHVlID0gbm9kZVtrZXldO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIENvbnNvbGVOb2RlID0+IGlzQ29uc29sZU5vZGUoaXRlbSkpIDogW107XG59XG5cbmZ1bmN0aW9uIGlzQ29uc29sZU5vZGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb25zb2xlTm9kZSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mICh2YWx1ZSBhcyBDb25zb2xlTm9kZSkudHlwZSA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZU1vZHVsZXNQYXRoKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlkLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpIHx8IGlkLmluY2x1ZGVzKCdcXFxcbm9kZV9tb2R1bGVzXFxcXCcpO1xufVxuXG5mdW5jdGlvbiBjb21tb25Kc1J1bnRpbWVQcmVsdWRlUGx1Z2luKCk6IFBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2NvbW1vbmpzLXJ1bnRpbWUtcHJlbHVkZScsXG4gICAgcmVuZGVyQ2h1bmsoY29kZSwgX2NodW5rLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBwcmVsdWRlID0gZ2V0Q29tbW9uSnNSdW50aW1lUHJlbHVkZShjb2RlLCBvcHRpb25zLmZvcm1hdCk7XG4gICAgICBpZiAoIXByZWx1ZGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IG1hZ2ljU3RyaW5nID0gbmV3IE1hZ2ljU3RyaW5nKGNvZGUpO1xuICAgICAgaW5zZXJ0UHJlbHVkZShtYWdpY1N0cmluZywgY29kZSwgcHJlbHVkZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBtYWdpY1N0cmluZy50b1N0cmluZygpLFxuICAgICAgICBtYXA6IG1hZ2ljU3RyaW5nLmdlbmVyYXRlTWFwKHsgaGlyZXM6IHRydWUgfSkgYXMgU291cmNlTWFwSW5wdXQsXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IGNvbW1vbkpzUnVudGltZVByZWx1ZGUgPSBgdmFyIF9fY3JlYXRlPU9iamVjdC5jcmVhdGUsX19kZWZQcm9wPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxfX2dldE93blByb3BEZXNjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsX19nZXRPd25Qcm9wTmFtZXM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMsX19nZXRQcm90b09mPU9iamVjdC5nZXRQcm90b3R5cGVPZixfX2hhc093blByb3A9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxfX2NvbW1vbkpTTWluPShtb2R1bGVGYWN0b3J5LG1vZHVsZSk9PigpPT4obW9kdWxlfHwobW9kdWxlPXtleHBvcnRzOnt9fSxtb2R1bGVGYWN0b3J5KG1vZHVsZS5leHBvcnRzLG1vZHVsZSkpLG1vZHVsZS5leHBvcnRzKSxfX2NvcHlQcm9wcz0odG8sZnJvbSxleGNlcHQsZGVzY3JpcHRvcik9PntpZihmcm9tJiZcIm9iamVjdFwiPT10eXBlb2YgZnJvbXx8XCJmdW5jdGlvblwiPT10eXBlb2YgZnJvbSlmb3IodmFyIGtleSxuYW1lcz1fX2dldE93blByb3BOYW1lcyhmcm9tKSxpbmRleD0wLGxlbmd0aD1uYW1lcy5sZW5ndGg7aW5kZXg8bGVuZ3RoO2luZGV4Kyspa2V5PW5hbWVzW2luZGV4XSxfX2hhc093blByb3AuY2FsbCh0byxrZXkpfHxrZXk9PT1leGNlcHR8fF9fZGVmUHJvcCh0byxrZXkse2dldDooa2V5PT5mcm9tW2tleV0pLmJpbmQobnVsbCxrZXkpLGVudW1lcmFibGU6IShkZXNjcmlwdG9yPV9fZ2V0T3duUHJvcERlc2MoZnJvbSxrZXkpKXx8ZGVzY3JpcHRvci5lbnVtZXJhYmxlfSk7cmV0dXJuIHRvfSxfX3RvRVNNPShtb2QsaXNOb2RlTW9kZSx0YXJnZXQpPT4odGFyZ2V0PW51bGwhPW1vZD9fX2NyZWF0ZShfX2dldFByb3RvT2YobW9kKSk6e30sX19jb3B5UHJvcHMoIWlzTm9kZU1vZGUmJm1vZCYmbW9kLl9fZXNNb2R1bGU/dGFyZ2V0Ol9fZGVmUHJvcCh0YXJnZXQsXCJkZWZhdWx0XCIse3ZhbHVlOm1vZCxlbnVtZXJhYmxlOiEwfSksbW9kKSk7YDtcblxuZnVuY3Rpb24gZ2V0Q29tbW9uSnNSdW50aW1lUHJlbHVkZShjb2RlOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb2RlLmluY2x1ZGVzKCdfX2NvbW1vbkpTTWluJykpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gUm9sbGRvd24gMS4xLjIgY2FuIGVtaXQgaGVscGVycyBhZnRlciBjb3JlLWpzIHdyYXBwZXJzIHRoYXQgYWxyZWFkeSBjYWxsIHRoZW0uXG4gIC8vIFNlZWRpbmcgdGhlIGhlbHBlcnMgYmVmb3JlIFRlcnNlciBwcmV2ZW50cyBtaW5pZmllZCBvdXRwdXQgZnJvbSBjYWxsaW5nIHVuaW5pdGlhbGl6ZWQgYWxpYXNlcy5cbiAgaWYgKGlzQ29tbW9uSnNGb3JtYXQoZm9ybWF0KSkgcmV0dXJuIGNvZGUuaW5jbHVkZXMoJ19fdG9FU00nKSA/IGNvbW1vbkpzUnVudGltZVByZWx1ZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBgdmFyIF9fY29tbW9uSlNNaW49KG1vZHVsZUZhY3RvcnksbW9kdWxlKT0+KCk9Pihtb2R1bGV8fChtb2R1bGU9e2V4cG9ydHM6e319LG1vZHVsZUZhY3RvcnkobW9kdWxlLmV4cG9ydHMsbW9kdWxlKSksbW9kdWxlLmV4cG9ydHMpO2A7XG59XG5cbmZ1bmN0aW9uIGlzQ29tbW9uSnNGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZvcm1hdCA9PT0gJ2NqcycgfHwgZm9ybWF0ID09PSAnY29tbW9uanMnO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRQcmVsdWRlKG1hZ2ljU3RyaW5nOiBNYWdpY1N0cmluZywgY29kZTogc3RyaW5nLCBwcmVsdWRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgbWFnaWNTdHJpbmcuYXBwZW5kTGVmdChnZXRQcmVsdWRlSW5zZXJ0aW9uSW5kZXgoY29kZSksIGAke3ByZWx1ZGV9XFxuYCk7XG59XG5cbmZ1bmN0aW9uIGdldFByZWx1ZGVJbnNlcnRpb25JbmRleChjb2RlOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBpZiAoY29kZS5zdGFydHNXaXRoKCcjIScpKSB7XG4gICAgY29uc3QgZmlyc3RMaW5lRW5kID0gY29kZS5pbmRleE9mKCdcXG4nKTtcbiAgICBpZiAoZmlyc3RMaW5lRW5kID09PSAtMSkgcmV0dXJuIGNvZGUubGVuZ3RoO1xuICAgIGluZGV4ID0gZmlyc3RMaW5lRW5kICsgMTtcbiAgfVxuXG4gIGNvbnN0IGRpcmVjdGl2ZVBhdHRlcm4gPSAvKD86KD86XCJbXlwiXFxuXSpcInwnW14nXFxuXSonKTs/XFxzKikveTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBkaXJlY3RpdmVQYXR0ZXJuLmxhc3RJbmRleCA9IGluZGV4O1xuICAgIGNvbnN0IG1hdGNoID0gZGlyZWN0aXZlUGF0dGVybi5leGVjKGNvZGUpO1xuICAgIGlmICghbWF0Y2g/LlswXSkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4ID0gZGlyZWN0aXZlUGF0dGVybi5sYXN0SW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zRGVjb3JhdG9yKGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gLyhefFteXFxwe0lEX0NvbnRpbnVlfSpdKUBcXHMqWyhcXHB7SURfU3RhcnR9JF9dL3UudGVzdChzdHJpcENvbW1lbnRzKGNvZGUpKTtcbn1cblxuY29uc3QgcmVnZXhMaXRlcmFsUHJlZml4Q2hhcmFjdGVycyA9IG5ldyBTZXQoW1xuICAnKCcsXG4gICdbJyxcbiAgJ3snLFxuICAnOicsXG4gICcsJyxcbiAgJzsnLFxuICAnPScsXG4gICchJyxcbiAgJz8nLFxuICAnJicsXG4gICd8JyxcbiAgJ14nLFxuICAnficsXG4gICcrJyxcbiAgJy0nLFxuICAnKicsXG4gICclJyxcbiAgJzwnLFxuICAnPicsXG5dKTtcbmNvbnN0IHJlZ2V4TGl0ZXJhbFByZWZpeEtleXdvcmRzID0gbmV3IFNldChbXG4gICdhd2FpdCcsXG4gICdjYXNlJyxcbiAgJ2RlZmF1bHQnLFxuICAnZGVsZXRlJyxcbiAgJ2RvJyxcbiAgJ2Vsc2UnLFxuICAnaW4nLFxuICAnaW5zdGFuY2VvZicsXG4gICduZXcnLFxuICAnb2YnLFxuICAncmV0dXJuJyxcbiAgJ3Rocm93JyxcbiAgJ3R5cGVvZicsXG4gICd2b2lkJyxcbiAgJ3lpZWxkJyxcbl0pO1xuXG5mdW5jdGlvbiBzdHJpcENvbW1lbnRzKGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBzdHJpcHBlZENvZGUgPSAnJztcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IHF1b3RlOiAnXCInIHwgXCInXCIgfCAnYCcgfCB1bmRlZmluZWQ7XG5cbiAgd2hpbGUgKGluZGV4IDwgY29kZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gY29kZVtpbmRleF07XG4gICAgY29uc3QgbmV4dCA9IGNvZGVbaW5kZXggKyAxXTtcblxuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGN1cnJlbnQgPT09ICdcXFxcJykge1xuICAgICAgICBzdHJpcHBlZENvZGUgKz0gJyAnO1xuICAgICAgICBpZiAobmV4dCkgc3RyaXBwZWRDb2RlICs9IG5leHQgPT09ICdcXG4nID8gJ1xcbicgOiAnICc7XG4gICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnQgPT09IHF1b3RlKSBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHN0cmlwcGVkQ29kZSArPSBjdXJyZW50ID09PSAnXFxuJyA/ICdcXG4nIDogJyAnO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50ID09PSAnXCInIHx8IGN1cnJlbnQgPT09IFwiJ1wiIHx8IGN1cnJlbnQgPT09ICdgJykge1xuICAgICAgcXVvdGUgPSBjdXJyZW50O1xuICAgICAgc3RyaXBwZWRDb2RlICs9ICcgJztcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCA9PT0gJy8nICYmIG5leHQgIT09ICcvJyAmJiBuZXh0ICE9PSAnKicgJiYgaXNSZWdleExpdGVyYWxTdGFydChzdHJpcHBlZENvZGUpKSB7XG4gICAgICBjb25zdCByZWdleEVuZEluZGV4ID0gZ2V0UmVnZXhMaXRlcmFsRW5kSW5kZXgoY29kZSwgaW5kZXgpO1xuICAgICAgc3RyaXBwZWRDb2RlICs9IHJlcGxhY2VXaXRoV2hpdGVzcGFjZShjb2RlLnNsaWNlKGluZGV4LCByZWdleEVuZEluZGV4KSk7XG4gICAgICBpbmRleCA9IHJlZ2V4RW5kSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCA9PT0gJy8nICYmIG5leHQgPT09ICcvJykge1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvZGUubGVuZ3RoICYmIGNvZGVbaW5kZXhdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIHN0cmlwcGVkQ29kZSArPSAnXFxuJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50ID09PSAnLycgJiYgbmV4dCA9PT0gJyonKSB7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgd2hpbGUgKGluZGV4IDwgY29kZS5sZW5ndGggJiYgIShjb2RlW2luZGV4XSA9PT0gJyonICYmIGNvZGVbaW5kZXggKyAxXSA9PT0gJy8nKSkge1xuICAgICAgICBzdHJpcHBlZENvZGUgKz0gY29kZVtpbmRleF0gPT09ICdcXG4nID8gJ1xcbicgOiAnICc7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc3RyaXBwZWRDb2RlICs9IGN1cnJlbnQ7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gc3RyaXBwZWRDb2RlO1xufVxuXG5mdW5jdGlvbiBpc1JlZ2V4TGl0ZXJhbFN0YXJ0KHN0cmlwcGVkQ29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByZXZpb3VzSW5kZXggPSBmaW5kUHJldmlvdXNTaWduaWZpY2FudEluZGV4KHN0cmlwcGVkQ29kZSk7XG4gIGlmIChwcmV2aW91c0luZGV4ID09PSAtMSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHByZXZpb3VzID0gc3RyaXBwZWRDb2RlW3ByZXZpb3VzSW5kZXhdID8/ICcnO1xuICBpZiAocHJldmlvdXMgPT09ICcpJykgcmV0dXJuIGlzQWZ0ZXJDb250cm9sU3RhdGVtZW50Q29uZGl0aW9uKHN0cmlwcGVkQ29kZSwgcHJldmlvdXNJbmRleCk7XG4gIGlmICgocHJldmlvdXMgPT09ICcrJyB8fCBwcmV2aW91cyA9PT0gJy0nKSAmJiBzdHJpcHBlZENvZGVbZmluZFByZXZpb3VzU2lnbmlmaWNhbnRJbmRleChzdHJpcHBlZENvZGUsIHByZXZpb3VzSW5kZXggLSAxKV0gPT09IHByZXZpb3VzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChyZWdleExpdGVyYWxQcmVmaXhDaGFyYWN0ZXJzLmhhcyhwcmV2aW91cykpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IHByZXZpb3VzS2V5d29yZCA9IHN0cmlwcGVkQ29kZS5zbGljZSgwLCBwcmV2aW91c0luZGV4ICsgMSkubWF0Y2goL1tcXHB7SURfU3RhcnR9JF9dW1xccHtJRF9Db250aW51ZX0kXFx1MjAwY1xcdTIwMGRdKiQvdSk/LlswXTtcbiAgcmV0dXJuIHByZXZpb3VzS2V5d29yZCA/IHJlZ2V4TGl0ZXJhbFByZWZpeEtleXdvcmRzLmhhcyhwcmV2aW91c0tleXdvcmQpIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRQcmV2aW91c1NpZ25pZmljYW50SW5kZXgoY29kZTogc3RyaW5nLCBzdGFydEluZGV4ID0gY29kZS5sZW5ndGggLSAxKTogbnVtYmVyIHtcbiAgZm9yIChsZXQgaW5kZXggPSBzdGFydEluZGV4OyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgaWYgKCEvXFxzL3UudGVzdChjb2RlW2luZGV4XSA/PyAnJykpIHJldHVybiBpbmRleDtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzQWZ0ZXJDb250cm9sU3RhdGVtZW50Q29uZGl0aW9uKGNvZGU6IHN0cmluZywgY2xvc2VQYXJlbkluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3Qgb3BlblBhcmVuSW5kZXggPSBmaW5kTWF0Y2hpbmdPcGVuUGFyZW5JbmRleChjb2RlLCBjbG9zZVBhcmVuSW5kZXgpO1xuICBpZiAob3BlblBhcmVuSW5kZXggPT09IC0xKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qga2V5d29yZEVuZEluZGV4ID0gZmluZFByZXZpb3VzU2lnbmlmaWNhbnRJbmRleChjb2RlLCBvcGVuUGFyZW5JbmRleCAtIDEpO1xuICBpZiAoa2V5d29yZEVuZEluZGV4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGtleXdvcmQgPSBjb2RlLnNsaWNlKDAsIGtleXdvcmRFbmRJbmRleCArIDEpLm1hdGNoKC9bXFxwe0lEX1N0YXJ0fSRfXVtcXHB7SURfQ29udGludWV9JFxcdTIwMGNcXHUyMDBkXSokL3UpPy5bMF07XG4gIHJldHVybiBrZXl3b3JkID8gWydmb3InLCAnaWYnLCAnd2hpbGUnLCAnd2l0aCddLmluY2x1ZGVzKGtleXdvcmQpIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRNYXRjaGluZ09wZW5QYXJlbkluZGV4KGNvZGU6IHN0cmluZywgY2xvc2VQYXJlbkluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgZGVwdGggPSAwO1xuICBmb3IgKGxldCBpbmRleCA9IGNsb3NlUGFyZW5JbmRleDsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBjb2RlW2luZGV4XTtcbiAgICBpZiAoY3VycmVudCA9PT0gJyknKSB7XG4gICAgICBkZXB0aCsrO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gJygnKSB7XG4gICAgICBkZXB0aC0tO1xuICAgICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnZXhMaXRlcmFsRW5kSW5kZXgoY29kZTogc3RyaW5nLCBzdGFydEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBzdGFydEluZGV4ICsgMTtcbiAgbGV0IGluQ2hhcmFjdGVyQ2xhc3MgPSBmYWxzZTtcblxuICB3aGlsZSAoaW5kZXggPCBjb2RlLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBjb2RlW2luZGV4XTtcbiAgICBpZiAoY3VycmVudCA9PT0gJ1xcXFwnKSB7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50ID09PSAnWycpIGluQ2hhcmFjdGVyQ2xhc3MgPSB0cnVlO1xuICAgIGlmIChjdXJyZW50ID09PSAnXScpIGluQ2hhcmFjdGVyQ2xhc3MgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudCA9PT0gJy8nICYmICFpbkNoYXJhY3RlckNsYXNzKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgd2hpbGUgKC9bXFxwe0lEX0NvbnRpbnVlfSRcXHUyMDBjXFx1MjAwZF0vdS50ZXN0KGNvZGVbaW5kZXhdID8/ICcnKSkgaW5kZXgrKztcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQgPT09ICdcXG4nKSByZXR1cm4gaW5kZXg7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoV2hpdGVzcGFjZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1teXFxuXS9ndSwgJyAnKTtcbn1cblxuZnVuY3Rpb24gdGV4dFBsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd0ZXh0JyxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLmVuZHNXaXRoKCcuY3N2JykgJiYgIWlkLmVuZHNXaXRoKCcudHh0JykpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShpZCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IGBleHBvcnQgZGVmYXVsdCAke0pTT04uc3RyaW5naWZ5KGNvbnRlbnQpfTtgLFxuICAgICAgICBtb2R1bGVUeXBlOiAnanMnLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXJzZXJQbHVnaW4oKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAndGVyc2VyJyxcbiAgICBhc3luYyByZW5kZXJDaHVuayhjb2RlLCBfY2h1bmssIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZU1hcE9wdGlvbnM6IFNvdXJjZU1hcE9wdGlvbnMgfCB1bmRlZmluZWQgPSBvcHRpb25zLnNvdXJjZW1hcFxuICAgICAgICA/IHsgYXNPYmplY3Q6IHRydWUgfVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pbmlmeShjb2RlLCB7XG4gICAgICAgIGNvbXByZXNzOiB7IGRpcmVjdGl2ZXM6IGZhbHNlIH0sXG4gICAgICAgIGVjbWE6IDIwMjIsXG4gICAgICAgIGZvcm1hdDogeyBjb21tZW50czogZmFsc2UgfSxcbiAgICAgICAgbW9kdWxlOiBvcHRpb25zLmZvcm1hdCA9PT0gJ2VzJyxcbiAgICAgICAgc291cmNlTWFwOiBzb3VyY2VNYXBPcHRpb25zLFxuICAgICAgfSBzYXRpc2ZpZXMgTWluaWZ5T3B0aW9ucyk7XG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiByZXN1bHQuY29kZSxcbiAgICAgICAgbWFwOiByZXN1bHQubWFwIGFzIFNvdXJjZU1hcElucHV0LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBjb3JlUHJvamVjdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvcmVDb25maWdGaWxlID0gZmluZENvbmZpZ0ZpbGUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgbGV0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhcmVudERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb3JlUHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKHByb2plY3REaXJQYXRoID09PSBjb3JlUHJvamVjdERpclBhdGgpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjb25maWdGaWxlID0gZmluZENvbmZpZ0ZpbGUocHJvamVjdERpclBhdGgpO1xuICAgICAgY29uc3Qgb3V0RGlyID0gcGF0aC5qb2luKCdkaXN0JywgZGlyZW50Lm5hbWUsICdzcmMnKTtcbiAgICAgIGlmIChjb25maWdGaWxlICYmIGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgICAgICBwcm9qZWN0cy5wdXNoKFtwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyXSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dERpciA9ICdkaXN0JztcbiAgfVxuICBwcm9qZWN0cy5wdXNoKFtjb3JlUHJvamVjdERpclBhdGgsIGNvcmVDb25maWdGaWxlLCBvdXREaXJdKTtcblxuICBsZXQgYWxsU3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0gb2YgcHJvamVjdHMpIHtcbiAgICBhbGxTdWNjZWVkZWQgJiY9IGF3YWl0IHJ1blRzZ28oYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIHBhdGguam9pbihjb3JlUHJvamVjdERpclBhdGgsIG91dERpcikpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRzZ28oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygncnVuVHNnbygpJywgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcik7XG4gIH1cblxuICBjb25zdCBjb25maWdGaWxlRGlyUGF0aCA9IHBhdGguZGlybmFtZShjb25maWdGaWxlKTtcbiAgY29uc3QgdGVtcENvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oY29uZmlnRmlsZURpclBhdGgsIGAuYnVpbGQtdHMtdHNnby4ke3Byb2Nlc3MucGlkfS4ke0RhdGUubm93KCl9Lmpzb25gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICB0ZW1wQ29uZmlnRmlsZSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KGF3YWl0IGNyZWF0ZVR5cGVTY3JpcHROYXRpdmVDb25maWcocHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpciksIHVuZGVmaW5lZCwgMilcbiAgICApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHByb2Nlc3MuZXhlY1BhdGgsIFtnZXRUc2dvUGF0aCgpLCAnLXAnLCB0ZW1wQ29uZmlnRmlsZV0sIHtcbiAgICAgIGN3ZDogcHJvamVjdERpclBhdGgsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuZXJyb3IpIHRocm93IHJldC5lcnJvcjtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA9PT0gMDtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0ZW1wQ29uZmlnRmlsZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUeXBlU2NyaXB0TmF0aXZlQ29uZmlnKFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgZW1pdERlY2xhcmF0aW9uT25seTogdHJ1ZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG5vRW1pdE9uRXJyb3I6IHRydWUsXG4gICAgb3V0RGlyLFxuICAgIHJvb3REaXI6ICdzcmMnLFxuICB9O1xuICBpZiAoYXdhaXQgdXNlc05vZGVQcm90b2NvbEltcG9ydChwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsICdzcmMnKSkpIHtcbiAgICBjb25zdCB0eXBlc0RpclBhdGggPSBmaW5kVHlwZXNEaXJQYXRoKHByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCB0eXBlcyA9IHR5cGVzRGlyUGF0aCA/IGF3YWl0IGNvbGxlY3RUeXBlUGFja2FnZXModHlwZXNEaXJQYXRoKSA6IFtdO1xuICAgIGlmICh0eXBlcy5pbmNsdWRlcygnbm9kZScpKSB7XG4gICAgICBjb21waWxlck9wdGlvbnMudHlwZXMgPSB0eXBlcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb21waWxlck9wdGlvbnMsXG4gICAgZXh0ZW5kczogdG9SZWxhdGl2ZUNvbmZpZ1BhdGgocGF0aC5kaXJuYW1lKGNvbmZpZ0ZpbGUpLCBjb25maWdGaWxlKSxcbiAgICBpbmNsdWRlOiBbJ3NyYy8qKi8qJ10sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRDb25maWdGaWxlKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSByZXR1cm4gY29uZmlnRmlsZTtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50RGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHNnb1BhdGgoKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKCdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy9wYWNrYWdlLmpzb24nKTtcbiAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgJ2JpbicsICd0c2dvLmpzJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaWYgKGF3YWl0IHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQoY2hpbGRQYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKC9cXC5bY21dP3RzeD8kLy50ZXN0KGRpcmVudC5uYW1lKSAmJiAoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY2hpbGRQYXRoLCAndXRmOCcpKS5pbmNsdWRlcygnbm9kZTonKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRUeXBlc0RpclBhdGgoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVzRGlyUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICdAdHlwZXMnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0eXBlc0RpclBhdGgpKSByZXR1cm4gdHlwZXNEaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0VHlwZVBhY2thZ2VzKHR5cGVSb290c0RpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0eXBlUm9vdHNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRpcmVudHMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9SZWxhdGl2ZUNvbmZpZ1BhdGgoZnJvbURpclBhdGg6IHN0cmluZywgdG9GaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShmcm9tRGlyUGF0aCwgdG9GaWxlUGF0aCkucmVwbGFjZUFsbChwYXRoLnNlcCwgJy8nKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBkYXRlVGltZSBmcm9tICdkYXRlLXRpbWUnO1xuaW1wb3J0IG1zIGZyb20gJ3ByZXR0eS1tcyc7XG5pbXBvcnQgeyByb2xsZG93biwgd2F0Y2ggfSBmcm9tICdyb2xsZG93bic7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFJvbGxkb3duQnVpbGQsIFJvbGxkb3duT3B0aW9ucyB9IGZyb20gJ3JvbGxkb3duJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlciB9IGZyb20gJ3NpZ25hbC1leGl0JztcbmltcG9ydCB7IG9uRXhpdCB9IGZyb20gJ3NpZ25hbC1leGl0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24sIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldENhdGVnb3J5LCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbGxUYXJnZXRDYXRlZ29yaWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmFtZXNwYWNlQW5kTmFtZSwgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlLCBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGFwcEJ1aWxkZXIsIGZ1bmN0aW9uc0J1aWxkZXIsIGxpYkJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaGFuZGxlRXJyb3IgfSBmcm9tICcuL2J1bmRsZXJMb2dnZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlRXh0ZXJuYWxNYXRjaGVyLCBzZXR1cFBsdWdpbnMgfSBmcm9tICcuL3BsdWdpbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMgfSBmcm9tICcuL3R5cGVTY3JpcHQuanMnO1xuXG5leHBvcnQgY29uc3QgYXBwOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGFwcEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2FwcCBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGFuIGFwcCcsXG4gIGJ1aWxkZXI6IGFwcEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnYXBwJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2Z1bmN0aW9ucyBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgR0NQL0ZpcmViYXNlIGZ1bmN0aW9ucyBhcHAnLFxuICBidWlsZGVyOiBmdW5jdGlvbnNCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5vbmx5UGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICAgICAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgIGlmICghcGFja2FnZUpzb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWlsZChhcmd2LCAnZnVuY3Rpb25zJyk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGxpYjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBsaWJCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaWIgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIE5vZGUuanMgLyBSZWFjdCBsaWJyYXJ5JyxcbiAgYnVpbGRlcjogbGliQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdsaWInKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgdGFyZ2V0Q2F0ZWdvcnk6IFRhcmdldENhdGVnb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8PSAncHJvZHVjdGlvbic7XG5cbiAgLy8gYHNpbGVudGAgaXMgc3Ryb25nZXIgdGhhbiBgdmVyYm9zZWAuXG4gIGNvbnN0IHZlcmJvc2UgPSAhYXJndi5zaWxlbnQgJiYgYXJndi52ZXJib3NlO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcGFja2FnZURpclBhdGgpO1xuXG4gIGNvbnN0IGlucHV0cyA9IHZlcmlmeUlucHV0KGFyZ3YsIGN3ZCwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCB0YXJnZXREZXRhaWwgPSBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnksIGlucHV0cywgcGFja2FnZURpclBhdGgpO1xuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdhcmd2OicsIGFyZ3YpO1xuICAgIGNvbnNvbGUuaW5mbygncGFja2FnZUpzb25QYXRoOicsIHBhY2thZ2VKc29uUGF0aCk7XG4gICAgY29uc29sZS5pbmZvKCdUYXJnZXQgKENhdGVnb3J5KTonLCBgJHt0YXJnZXREZXRhaWx9ICgke3RhcmdldENhdGVnb3J5fSlgKTtcbiAgfVxuXG4gIGNvbnN0IFtuYW1lc3BhY2VdID0gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbik7XG4gIGNvbnN0IGlzRXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuXG4gIGlmIChhcmd2Wydjb3JlLWpzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlMgPSAnMSc7XG4gIH0gZWxzZSBpZiAoYXJndlsnY29yZS1qcy1wcm9wb3NhbHMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyA9ICcxJztcbiAgfVxuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVkVSQk9TRSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkgPSB0YXJnZXRDYXRlZ29yeTtcbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0RFVEFJTCA9IHRhcmdldERldGFpbDtcblxuICBjb25zdCBvdXRwdXRPcHRpb25zTGlzdCA9IGdldE91dHB1dE9wdGlvbnNMaXN0KGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZURpclBhdGgsIGlzRXNtUGFja2FnZSk7XG4gIGlmICh2ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdPdXRwdXRPcHRpb25zOicsIG91dHB1dE9wdGlvbnNMaXN0KTtcbiAgfVxuICBpZiAob3V0cHV0T3B0aW9uc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRldGVjdCBvdXRwdXQgZmlsZXMuJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5jaGRpcihwYWNrYWdlRGlyUGF0aCk7XG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMocGFja2FnZURpclBhdGgsIHBhY2thZ2VKc29uLCBhcmd2Lm1vZHVsZVR5cGUpO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9uczogUm9sbGRvd25PcHRpb25zID0ge1xuICAgIGNoZWNrczogeyBwcmVmZXJCdWlsdGluRmVhdHVyZTogZmFsc2UgfSxcbiAgICBleHRlcm5hbDogY3JlYXRlRXh0ZXJuYWxNYXRjaGVyKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZUpzb24sIG5hbWVzcGFjZSksXG4gICAgaW5wdXQ6XG4gICAgICB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnXG4gICAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaW5wdXRzLm1hcCgoaW5wdXQsIGluZGV4KSA9PiBbaW5kZXggPT09IDAgPyAnaW5kZXgnIDogcGF0aC5iYXNlbmFtZShpbnB1dCwgcGF0aC5leHRuYW1lKGlucHV0KSksIGlucHV0XSlcbiAgICAgICAgICApXG4gICAgICAgIDogaW5wdXRzLFxuICAgIHBsdWdpbnM6IHNldHVwUGx1Z2lucyhhcmd2LCBvdXRwdXRPcHRpb25zTGlzdCwgcGFja2FnZURpclBhdGgpLFxuICAgIHJlc29sdmU6IHtcbiAgICAgIGV4dGVuc2lvbkFsaWFzOiB7XG4gICAgICAgICcuY2pzJzogWycuY2pzJywgJy5jdHMnXSxcbiAgICAgICAgJy5qcyc6IFsnLmpzJywgJy50cycsICcudHN4J10sXG4gICAgICAgICcubWpzJzogWycubWpzJywgJy5tdHMnXSxcbiAgICAgIH0sXG4gICAgICBleHRlbnNpb25zOiBbJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCcsICcuY2pzJywgJy5tanMnLCAnLmpzJywgJy5qc3gnLCAnLmpzb24nXSxcbiAgICB9LFxuICAgIHRyZWVzaGFrZTogYXJndlsnY29yZS1qcyddIHx8IGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10gPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICB0cmFuc2Zvcm06IGdldFRyYW5zZm9ybU9wdGlvbnMoYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIHdhdGNoOiBhcmd2LndhdGNoID8geyBjbGVhclNjcmVlbjogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgfTtcblxuICBjb25zdCBwYXRoVG9SZWxhdGl2ZVBhdGggPSAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHN0cmluZ1tdID0+XG4gICAgKEFycmF5LmlzQXJyYXkocGF0aHMpID8gcGF0aHMgOiBbcGF0aHNdKS5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHApKTtcbiAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICB3YXRjaFJvbGxkb3duKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZURpclBhdGgsIG9wdGlvbnMsIG91dHB1dE9wdGlvbnNMaXN0LCBwYXRoVG9SZWxhdGl2ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0cykuam9pbignLCAnKSl9IOKGkiAke2NoYWxrLmJvbGQoXG4gICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKCcsICcpXG4gICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbGRvd25CdWlsZCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnVpbGRGYWlsZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IF9idW5kbGUgPSBhd2FpdCByb2xsZG93bihvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke3BhdGhUb1JlbGF0aXZlUGF0aChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IG9wdHMuZmlsZSB8fCBvcHRzLmRpciB8fCAnJykpLmpvaW4oXG4gICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICl9IGluICR7Y2hhbGsuYm9sZChtcyhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJlxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJyAmJlxuICAgICAgIShhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgpKVxuICAgICkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2Zvcm1PcHRpb25zKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogUm9sbGRvd25PcHRpb25zWyd0cmFuc2Zvcm0nXSB7XG4gIHJldHVybiB7XG4gICAgZGVmaW5lOiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2F0Y2hSb2xsZG93bihcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHRhcmdldERldGFpbDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSb2xsZG93bk9wdGlvbnMsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10sXG4gIHBhdGhUb1JlbGF0aXZlUGF0aDogKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pID0+IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHsgLi4ub3B0aW9ucywgb3V0cHV0OiBvdXRwdXRPcHRpb25zTGlzdCB9KTtcblxuICBjb25zdCBjbG9zZSA9IGFzeW5jIChjb2RlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xvc2UpO1xuICAgIGlmICh3YXRjaGVyKSBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgaWYgKGNvZGUpIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfTtcbiAgb25FeGl0KGNsb3NlIGFzIHVua25vd24gYXMgSGFuZGxlcik7XG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgfVxuXG4gIHdhdGNoZXIub24oJ2V2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXZlbnQuZXJyb3IsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9TVEFSVCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICAgIGBCdW5kbGVzICR7Y2hhbGsuYm9sZChwYXRoVG9SZWxhdGl2ZVBhdGgoZ2V0SW5wdXRGaWxlcyhvcHRpb25zLmlucHV0KSkuam9pbignLCAnKSl9IOKGkiAke2NoYWxrLmJvbGQoXG4gICAgICAgICAgICAgIHBhdGhUb1JlbGF0aXZlUGF0aChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IG9wdHMuZmlsZSB8fCBvcHRzLmRpciB8fCAnJykpLmpvaW4oJywgJylcbiAgICAgICAgICAgICl9XFxub24gJHtwYWNrYWdlRGlyUGF0aH0gLi4uYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCVU5ETEVfRU5EJzoge1xuICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBDcmVhdGVkICR7Y2hhbGsuYm9sZChwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpKX0gaW4gJHtjaGFsay5ib2xkKG1zKGV2ZW50LmR1cmF0aW9uKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmIHRhcmdldERldGFpbCAhPT0gJ2Z1bmN0aW9ucycpIHtcbiAgICAgICAgICBhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRU5EJzoge1xuICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuWyR7ZGF0ZVRpbWUoKX1dIHdhaXRpbmcgZm9yIGNoYW5nZXMuLi5gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdyZXN1bHQnIGluIGV2ZW50ICYmIGV2ZW50LnJlc3VsdCkge1xuICAgICAgdm9pZCBldmVudC5yZXN1bHQuY2xvc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRJbnB1dEZpbGVzKGlucHV0OiBSb2xsZG93bk9wdGlvbnNbJ2lucHV0J10pOiBzdHJpbmdbXSB7XG4gIGlmICghaW5wdXQpIHJldHVybiBbXTtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHJldHVybiBbaW5wdXRdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IE9iamVjdC52YWx1ZXMoaW5wdXQpO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlJbnB1dChhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPiwgY3dkOiBzdHJpbmcsIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmIChhcmd2LmlucHV0ICYmIGFyZ3YuaW5wdXQubGVuZ3RoID4gMCkgcmV0dXJuIGFyZ3YuaW5wdXQubWFwKChwKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBwLnRvU3RyaW5nKCkpKTtcblxuICBjb25zdCBzcmNEaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyk7XG4gIGZvciAoY29uc3QgZXh0IG9mIFsndHMnLCAndHN4JywgJ2N0cycsICdtdHMnXSkge1xuICAgIGNvbnN0IGlucHV0ID0gcGF0aC5qb2luKHNyY0RpclBhdGgsIGBpbmRleC4ke2V4dH1gKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhpbnB1dCkpIHJldHVybiBbaW5wdXRdO1xuICB9XG5cbiAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRldGVjdCBpbnB1dCBmaWxlLicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeTogc3RyaW5nLCBpbnB1dHM6IHN0cmluZ1tdLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogVGFyZ2V0RGV0YWlsIHtcbiAgc3dpdGNoICh0YXJnZXRDYXRlZ29yeSkge1xuICAgIGNhc2UgJ2FwcCc6IHtcbiAgICAgIHJldHVybiAnYXBwLW5vZGUnO1xuICAgIH1cbiAgICBjYXNlICdmdW5jdGlvbnMnOiB7XG4gICAgICByZXR1cm4gJ2Z1bmN0aW9ucyc7XG4gICAgfVxuICAgIGNhc2UgJ2xpYic6IHtcbiAgICAgIGlmIChpbnB1dHMuc29tZSgoaW5wdXQpID0+IGlucHV0LmVuZHNXaXRoKCcudHN4JykpIHx8IGRvZXNTcmNDb250YWluVHN4KHBhY2thZ2VEaXJQYXRoKSkge1xuICAgICAgICByZXR1cm4gJ2xpYi1yZWFjdCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2xpYic7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RhcmdldCBvcHRpb24gbXVzdCBiZSBvbmUgb2Y6ICcgKyBhbGxUYXJnZXRDYXRlZ29yaWVzLmpvaW4oJywgJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkb2VzU3JjQ29udGFpblRzeChwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNyY0RpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKTtcbiAgcmV0dXJuIGRvZXNEaXJlY3RvcnlDb250YWluVHN4KHNyY0RpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBkb2VzRGlyZWN0b3J5Q29udGFpblRzeChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBlbnRyeVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIGRvZXNEaXJlY3RvcnlDb250YWluVHN4KGVudHJ5UGF0aCk7XG4gICAgICByZXR1cm4gZW50cnkuaXNGaWxlKCkgJiYgZW50cnkubmFtZS5lbmRzV2l0aCgnLnRzeCcpO1xuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBwYWNrYWdlSnNvbi5uYW1lICs9ICctZGlzdCc7XG4gIGNvbnN0IGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgY29uc3QgZXNtT3V0cHV0ID0gaXNFc21PdXRwdXQoZXNtUGFja2FnZSwgbW9kdWxlVHlwZSk7XG4gIHBhY2thZ2VKc29uLm1haW4gPSBlc21QYWNrYWdlID09PSBlc21PdXRwdXQgPyAnaW5kZXguanMnIDogZXNtT3V0cHV0ID8gJ2luZGV4Lm1qcycgOiAnaW5kZXguY2pzJztcblxuICAvLyBQcmV2ZW50IEZpcmViYXNlIEZ1bmN0aW9ucyBmcm9tIHJ1bm5pbmcgYGJ1aWxkYCBzY3JpcHQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIC8vIGRldkRlcGVuZGVuY2llcyBhcmUgbm90IHJlcXVpcmVkIHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSk7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dE9wdGlvbnNMaXN0KFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIGlzRXNtUGFja2FnZTogYm9vbGVhblxuKTogT3V0cHV0T3B0aW9uc1tdIHtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgY29uc3QgZXNtT3V0cHV0ID0gaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlLCBhcmd2Lm1vZHVsZVR5cGUpO1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgICAgZm9ybWF0OiBlc21PdXRwdXQgPyAnbW9kdWxlJyA6ICdjb21tb25qcycsXG4gICAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAgJiYgJ2lubGluZScsXG4gICAgICAgIHN0cmljdDogIWVzbU91dHB1dCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoZSBmb2xsb3dpbmcgaW1wb3J0IHN0YXRlbWVudCBpbiBhbiBlc20gbW9kdWxlIGNhdXNlcyB0aGUgZm9sbG93aW5nIGVycm9yOlxuICAvLyBTdGF0ZW1lbnQ6XG4gIC8vICAgaW1wb3J0IHsgdXNlUHJldmlvdXMgfSBmcm9tICdyZWFjdC11c2UnO1xuICAvLyBFcnJvcjpcbiAgLy8gICBOYW1lZCBleHBvcnQgJ3VzZVByZXZpb3VzJyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICdyZWFjdC11c2UnIGlzIGEgQ29tbW9uSlMgbW9kdWxlLFxuICAvLyAgIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbiAgLy8gV2UgbmVlZCBjanMgbW9kdWxlcyBmb3Igd2ViIGFwcHMgdG8gYXZvaWQgdGhlIGVycm9yLlxuICAvLyBBbHNvLCBzcGxpdHRpbmcgYSBsaWJyYXJ5IGlzIHVzZWZ1bCBpbiBib3RoIG1vZHVsZXMsIHNvIHByZXNlcnZlTW9kdWxlcyBzaG91bGQgYmUgdHJ1ZS5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSA9IFtdO1xuICBjb25zdCBtb2R1bGVUeXBlID0gYXJndi5tb2R1bGVUeXBlIHx8ICdib3RoJztcbiAgY29uc3QganNFeHQgPSBhcmd2LmpzRXh0ZW5zaW9uIHx8ICdlaXRoZXInO1xuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2NqcycgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5janMnLFxuICAgICAgZm9ybWF0OiAnY29tbW9uanMnLFxuICAgICAgbWluaWZ5OiBhcmd2Lm1pbmlmeSxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHByZXNlcnZlTW9kdWxlc1Jvb3Q6IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0ubWpzJyxcbiAgICAgIGZvcm1hdDogJ21vZHVsZScsXG4gICAgICBtaW5pZnk6IGFyZ3YubWluaWZ5LFxuICAgICAgcHJlc2VydmVNb2R1bGVzOiB0cnVlLFxuICAgICAgcHJlc2VydmVNb2R1bGVzUm9vdDogcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyksXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvdXRwdXRPcHRpb25zTGlzdDtcbn1cblxuZnVuY3Rpb24gaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlOiBib29sZWFuLCBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1vZHVsZVR5cGUgPT09ICdlc20nIHx8ICgoIW1vZHVsZVR5cGUgfHwgbW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicpICYmIGlzRXNtUGFja2FnZSk7XG59XG4iLCJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vZW52LmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgbW9kdWxlOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1vZHVsZSB0eXBlOiBjanMgb3IgZXNtJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBydW46IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncnVuIDxmaWxlPicsXG4gIGRlc2NyaWJlOiAnUnVuIHNjcmlwdCcsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwcm9jZXNzLmN3ZCgpKTtcblxuICAgIGNvbnN0IGZpbGUgPSBhcmd2LmZpbGU/LnRvU3RyaW5nKCkgPz8gJyc7XG5cbiAgICAvLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICAgIGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW47XG4gICAgY29uc3QgcnVudGltZSA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAnbm9kZSc7XG4gICAgY29uc3QgYXJncyA9IGlzUnVubmluZ09uQnVuID8gWyctLWJ1biddIDogWyctLW5vLXdhcm5pbmdzJywgJy0taW1wb3J0JywgJ3RzeCddO1xuICAgIGlmIChhcmd2LndhdGNoKSB7XG4gICAgICBhcmdzLnB1c2goJy0td2F0Y2gnKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKGZpbGUpO1xuICAgIGNvbnN0IFssIC4uLmFkZGl0aW9uYWxBcmd1bWVudHNdID0gYXJndi5fO1xuICAgIGNvbnN0IHJ1bnRpbWVBcmdzID0gWy4uLmFyZ3MsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHMubWFwKChhcmcpID0+IGFyZy50b1N0cmluZygpKV07XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nICcke3J1bnRpbWV9ICR7cnVudGltZUFyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocnVudGltZSwgcnVudGltZUFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYgfSxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGFwcCwgZnVuY3Rpb25zLCBsaWIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkLmpzJztcbmltcG9ydCB7IHJ1biB9IGZyb20gJy4vY29tbWFuZHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbnJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ2J1aWxkLXRzJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5jb21tYW5kKGFwcClcbiAgLmNvbW1hbmQoZnVuY3Rpb25zKVxuICAuY29tbWFuZChsaWIpXG4gIC5jb21tYW5kKHJ1bilcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG4iXSwibWFwcGluZ3MiOiI4cUJBTUEsSUFBSSxFQUtK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
1
+ import e from"node:fs";import t from"node:path";import{readAndApplyEnvironmentVariables as n,removeNpmAndYarnEnvironmentVariables as r,yargsOptionsBuilderForEnv as i}from"@willbooster/shared-lib-node";import a from"yargs";import{hideBin as o}from"yargs/helpers";import{styleText as s}from"node:util";import{rolldown as c,watch as l}from"rolldown";import{onExit as u}from"signal-exit";import d from"node:url";import f from"node:process";import{builtinModules as p,createRequire as m}from"node:module";import h from"magic-string";import{parseSync as g,visitorKeys as _}from"oxc-parser";import*as v from"node:child_process";let y;function b(e,t){return y||(y=n(e,t),e.verbose&&console.info(`Loaded env vars:`,Object.keys(y))),y}function ee(e,t){let n={},r=new Set([...(e.inline??[]).flatMap(e=>e.toString().split(`,`)),...e.autoInline?Object.keys(b(e,t)):[]]);for(let e of r)process.env[e]!==void 0&&(n[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info(`Inline env vars:`,Object.keys(n)),n}const te=[`app`,`functions`,`lib`];async function x(n){let r=t.join(n,`package.json`);try{let t=await e.promises.readFile(r,`utf8`);return[JSON.parse(t),r]}catch{}return[void 0,r]}function S(){return t.dirname(t.dirname(d.fileURLToPath(import.meta.url)))}function ne(e){let t=e.name?.toString()??``,[,n,r]=/@([^/]+)\/(.+)/.exec(t)??[];return[n,r]}function re(e){return`${e.getFullYear()}-${C(e.getMonth()+1)}-${C(e.getDate())} ${C(e.getHours())}:${C(e.getMinutes())}:${C(e.getSeconds())}`}function C(e){return String(e).padStart(2,`0`)}function w(e){if(e<1e3)return`${Math.round(e)}ms`;let t=e/1e3;if(t<60)return`${Number(t.toFixed(1))}s`;let n=Math.floor(t/60);return`${n}m ${Number((t-n*60).toFixed(1))}s`}const T={...i,silent:{description:`Whether to suppress non-error output or not`,type:`boolean`,alias:`s`}},E={...T,input:{description:`Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx,cts,mts}" 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`}},D={...E,moduleType:{description:`esm, cjs, or either (default).`,type:`string`,alias:`m`}},ie={...D,onlyPackageJson:{description:`Whether to generate only package.json.`,type:`boolean`}},ae={...E,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 oe(e,t=!1){let n=e.name||e.cause?.name,r=n?`${n}: `:``,i=[s([`bold`,`red`],`[!] ${`${e.plugin?`(plugin ${e.plugin}) `:``}${r}${e.message}`}`)];e.url&&i.push(s(`cyan`,e.url)),e.loc?i.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&i.push(e.id),e.frame&&i.push(s(`dim`,e.frame)),e.stack&&i.push(s(`dim`,e.stack.replace(`${r}${e.message}\n`,``))),i.push(``,``),console.error(i.join(`
2
+ `)),t||f.exit(1)}const se=new Set(p);function ce(e,t,n,r,i){let a=de(e),o=new Set(ue(e,t,n,i,r,a));return e=>pe(e,a)?!1:k(e)||le(e,o)}function le(e,t){if(t.has(e))return!0;for(let n=e.indexOf(`/`);n!==-1;n=e.indexOf(`/`,n+1))if(t.has(e.slice(0,n)))return!0;return!1}function ue(n,r,i,a,o,s){let c=[...n.external??[]].map(e=>e.toString());i.dependencies?.[`@prisma/client`]&&c.push(`prisma-client`),c.push(...Object.keys(i.dependencies??{}),...Object.keys(i.peerDependencies??{}),...Object.keys(i.optionalDependencies??{}));let l=t.dirname(a);if(e.existsSync(t.join(t.dirname(l),`package.json`))){let n=e.readdirSync(l,{withFileTypes:!0});for(let r of n){if(!r.isDirectory())continue;let n=t.join(l,r.name,`package.json`);if(!e.existsSync(n))continue;let a=JSON.parse(e.readFileSync(n,`utf8`));i.dependencies?.[a.name??``]&&c.push(...Object.keys(a.dependencies??{}),...Object.keys(a.peerDependencies??{}),...Object.keys(a.optionalDependencies??{}))}}let u=fe(r)&&o?RegExp(`^@?${o}(?:/.+)?`):void 0;return c.filter(e=>s.has(O(e))?!1:!u?.test(e))}function de(e){return new Set(e.bundleBuiltins?.map(e=>O(e.toString()))??[])}function fe(e){return e===`app-node`||e===`functions`}function pe(e,t){let n=O(e);for(let e of t)if(n===e||n.startsWith(`${e}/`))return e}function me(e,t){let n=O(e);return n===t?`.`:`./${n.slice(t.length+1)}`}function O(e){return e.startsWith(`node:`)?e.slice(5):e}function k(e){return e.startsWith(`node:`)||se.has(e)}function he(e,n){let r=de(e),i=m(t.join(n,`package.json`));return{name:`bundle-builtins`,resolveId(e,t,a){let o=pe(e,r);if(o)return ge(i,o,n,_e(a.kind),me(e,o))}}}function ge(n,r,i,a,o){let s=xe(n,r,i),c=JSON.parse(e.readFileSync(s,`utf8`));if(!c.exports){let e=ve(n,r,t.dirname(s),o);if(e!==r&&!e.startsWith(`node:`))return e}let l=Se(c,a,o);if(!l)throw Error(`Failed to resolve package export for ${r}`);return t.join(t.dirname(s),l)}function _e(e){let t=new Set([`node-addons`,`node`,`module-sync`,`default`]);return e===`require-call`?t.add(`require`):t.add(`import`),t}function ve(e,t,n,r){if(r===`.`)return e.resolve(t);let i=e.resolve(`${t}/${r.slice(2)}`);return k(i)?ye(n,r):i}function ye(e,n){let r=F(n);if(!r)throw Error(`Failed to resolve package subpath ${n}`);let i=t.join(e,r),a=A(i)??be(i);if(a)return a;throw Error(`Failed to resolve package subpath ${n}`)}function A(n){return(t.extname(n)?[n]:[n,`${n}.js`,`${n}.json`,`${n}.node`]).find(t=>e.existsSync(t)&&e.statSync(t).isFile())}function be(n){let r=t.join(n,`package.json`);if(e.existsSync(r)){let i=JSON.parse(e.readFileSync(r,`utf8`)),a=A(t.join(n,i.main??`index.js`));if(a)return a}return A(t.join(n,`index`))}function xe(n,r,i){let a=n.resolve.paths(r)??n.resolve.paths(`__build_ts_package_lookup__`)??[];for(let n of[t.join(i,`node_modules`),...a]){let i=t.join(n,r,`package.json`);if(e.existsSync(i))return e.realpathSync(i)}throw Error(`Failed to resolve package.json for ${r}`)}function Se(e,t,n){if(e.exports){let r=j(e.exports,t,n);return r===null?void 0:F(r)}return n===`.`?e.main??`index.js`:F(n)}function j(e,t,n,r){if(typeof e==`string`)return n===`.`?N(e,r):void 0;if(e===null)return null;if(Array.isArray(e)){if(n!==`.`)return;for(let i of e){let e;try{e=j(i,t,n,r)}catch{continue}if(e)return e}return}if(typeof e!=`object`)return;let i=e;if(Ce(i)){if(Object.hasOwn(i,n))return j(i[n],t,`.`);let e=we(i,n);return e===void 0?void 0:j(e.value,t,`.`)}if(n===`.`)for(let[e,a]of Object.entries(i)){if(!t.has(e))continue;let i=j(a,t,n,r);if(i!==void 0)return i}}function Ce(e){return Object.keys(e).some(e=>e===`.`||e.startsWith(`./`))}function we(e,t){for(let[n,r]of Object.entries(e).sort(([e],[t])=>Te(e,t))){let e=Ee(n,t);if(e!==void 0)return{value:M(r,e)}}}function Te(e,t){let n=e.indexOf(`*`),r=t.indexOf(`*`);return n===-1&&r===-1?0:n===-1?1:r===-1?-1:r-n||t.length-e.length}function Ee(e,t){if(!e.startsWith(`./`)||!e.includes(`*`))return;let[n,r]=e.split(`*`,2);if(!(t===n||!t.startsWith(n)||!t.endsWith(r)||t.length<e.length))return t.slice(n.length,t.length-r.length)}function M(e,t){return typeof e==`string`?N(e,t):Array.isArray(e)?e.map(e=>M(e,t)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,M(n,t)]))}function N(e,t){return De(e),t===void 0?e:(Oe(t),e.replaceAll(`*`,t))}function De(e){if(!e.startsWith(`./`))throw Error(`Invalid package export target: ${e}`);P(e.slice(2),e)}function Oe(e){P(e,e)}function P(e,t){let n=ke(e,t),r=new Set([``,`.`,`..`,`node_modules`]);for(let e of n.split(/[\\/]/u))if(r.has(e))throw Error(`Invalid package export path segment in ${t}`)}function ke(e,t){try{return decodeURIComponent(e).toLowerCase()}catch{throw Error(`Invalid package export path segment in ${t}`)}}function F(e){return e?.replace(/^\.\//,``)}const Ae=[`.cjs`,`.mjs`,`.js`,`.jsx`,`.cts`,`.mts`,`.ts`,`.tsx`];function I(e){return Ae.some(t=>e.endsWith(t))&&!e.startsWith(`\0`)&&!je(e)}function je(e){return e.includes(`/node_modules/`)||e.includes(`\\node_modules\\`)}function L(e,t){let n=Me(e),r=Ne(e),i=g(e,t,{lang:n,sourceType:r});if(!R(i))return i;if(e.endsWith(`.js`)&&r===`unambiguous`){let r=g(e,t,{lang:n,sourceType:`commonjs`});if(!R(r))return r}}function R(e){return e.errors.some(e=>e.severity===`Error`)}function Me(e){return e.endsWith(`.tsx`)?`tsx`:e.endsWith(`.ts`)||e.endsWith(`.cts`)||e.endsWith(`.mts`)?`ts`:e.endsWith(`.jsx`)?`jsx`:`js`}function Ne(e){return e.endsWith(`.cjs`)||e.endsWith(`.cts`)?`commonjs`:`unambiguous`}function z(e){return(_[e.type]??[]).flatMap(t=>{let n=e[t];return Array.isArray(n)?n:[n]}).filter(e=>H(e))}function B(e,t){let n=e[t];return H(n)?n:void 0}function V(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>H(e)):[]}function H(e){return!!e&&typeof e==`object`&&typeof e.type==`string`}function Pe(e,t=`file.ts`){if(!e.includes(`@`))return!1;let n=L(t,e);return n?H(n.program)&&U(n.program):!0}function U(e){return e.type===`Decorator`?!0:z(e).some(e=>U(e))}function Fe(){let{env:e}=process;if(e.NODE_ENV===`production`)return new Set([`error`,`info`,`warn`]);if(e.NODE_ENV===`test`)return new Set([`debug`,`error`,`info`,`warn`])}function Ie(e){return{name:`remove-console`,transform(t,n){if(I(n)&&/console|\\u/.test(t))return Le(t,n,e)}}}function Le(e,t,n){let r=L(t,e);if(!r||!H(r.program))return;let i=new h(e),a=[];Be(r.program,[],[],a,n);for(let e of lt(a))i.overwrite(e.start,e.end,e.value);if(i.hasChanged())return{code:i.toString(),map:i.generateMap({hires:!0})}}const Re=`(function () {})`,ze=`(void 0)`;function Be(e,t,n,r,i){let a=Ve(e,t.at(-1));a&&n.push(a),!$e(n,e)&&e.type===`CallExpression`&&et(e,t,r,i),!$e(n,e)&&e.type===`MemberExpression`&&tt(e,t,r,i);let o=[...t,e];for(let t of z(e))Be(t,o,n,r,i);a&&n.pop()}function Ve(e,t){if(e.type===`Program`)return{end:e.end,shadowsConsole:He(e),start:e.start};if(Y(e))return{end:e.end,shadowsConsole:Ue(e),start:e.start};if(e.type===`BlockStatement`){let n=t?Y(t):!1;return{end:e.end,shadowsConsole:We(e,!1)||n&&W(e),start:e.start}}if(e.type===`CatchClause`)return{end:e.end,shadowsConsole:J(e.param),start:e.start};if(e.type===`ClassExpression`)return{end:e.end,shadowsConsole:J(e.id),start:e.start};if(e.type===`StaticBlock`||e.type===`TSModuleBlock`)return{end:e.end,shadowsConsole:We(e,!1)||W(e)||e.type===`TSModuleBlock`&&Ze(t),start:e.start};if(e.type===`SwitchStatement`)return{end:e.end,shadowsConsole:Ge(e),start:Ke(e)};if(e.type===`SwitchCase`){let n=t?.type===`SwitchStatement`&&Ge(t);return{end:e.end,shadowsConsole:n||qe(e),start:Je(e)}}if(e.type===`ForStatement`||e.type===`ForInStatement`||e.type===`ForOfStatement`)return{end:e.end,shadowsConsole:Ye(e),start:e.start}}function He(e){for(let t of V(e,`body`))if(G(t,!0))return!0;return W(e)}function Ue(e){if(J(e.id))return!0;for(let t of V(e,`params`))if(J(t))return!0;return!1}function We(e,t){for(let n of V(e,`body`))if(G(n,t))return!0;return!1}function Ge(e){for(let t of V(e,`cases`))for(let e of V(t,`consequent`))if(G(e,!1))return!0;return!1}function Ke(e){for(let t of V(e,`cases`)){let e=Je(t);if(e<t.end)return e}return e.end}function qe(e){for(let t of V(e,`consequent`))if(G(t,!1))return!0;return!1}function Je(e){let t=B(e,`test`);return t?t.start:V(e,`consequent`)[0]?.start??e.end}function Ye(e){let t=B(e,e.type===`ForStatement`?`init`:`left`);return!!t&&t.type===`VariableDeclaration`&&t.kind!==`var`&&q(t)}function W(e){if(!e)return!1;for(let t of z(e))if(!(t!==e&&(Y(t)||t.type===`StaticBlock`||t.type===`TSModuleBlock`))&&(t.type===`VariableDeclaration`&&t.kind===`var`&&q(t)||W(t)))return!0;return!1}function Xe(e){return e.importKind===`type`?!1:V(e,`specifiers`).some(e=>e.importKind!==`type`&&J(e.local))}function G(e,t){let n=ut(e)??e;return n.declare===!0?!1:n.type===`ImportDeclaration`?Xe(n):n.type===`FunctionDeclaration`||n.type===`ClassDeclaration`?J(n.id):n.type===`TSImportEqualsDeclaration`?n.importKind!==`type`&&J(n.id):n.type===`TSEnumDeclaration`||n.type===`TSModuleDeclaration`?Qe(B(n,`id`)):n.type===`VariableDeclaration`&&(t||n.kind!==`var`)&&q(n)}function Ze(e){return e?.type===`TSModuleDeclaration`&&e.declare!==!0&&K(B(e,`id`))}function Qe(e){return e?e.type===`Identifier`?e.name===`console`:e.type===`TSQualifiedName`&&Qe(B(e,`left`)):!1}function K(e){return e?e.type===`Identifier`?e.name===`console`:e.type===`TSQualifiedName`&&(K(B(e,`left`))||K(B(e,`right`))):!1}function q(e){return V(e,`declarations`).some(e=>J(B(e,`id`)))}function J(e){return H(e)?e.type===`Identifier`&&e.name===`console`?!0:e.type===`AssignmentPattern`||e.type===`RestElement`?J(e.left??e.argument):e.type===`TSParameterProperty`?J(e.parameter):e.type===`TSQualifiedName`?J(e.left):e.type===`ArrayPattern`?V(e,`elements`).some(e=>J(e)):e.type===`ObjectPattern`?V(e,`properties`).some(e=>J(e.value??e.argument)):!1:!1}function Y(e){return e.type===`FunctionDeclaration`||e.type===`FunctionExpression`||e.type===`ArrowFunctionExpression`}function $e(e,t){return e.some(e=>e.shadowsConsole&&e.start<=t.start&&t.end<=e.end)}function et(e,t,n,r){let i=t.at(-1),a=B(e,`callee`);if(e.optional!==!0){if(!a||!ot(a,r)){a&&st(a,r)&&n.push({kind:`replace`,start:e.start,end:e.end,value:X(e,t)});return}i?.type===`ExpressionStatement`?n.push({kind:`replace`,start:i.start,end:i.end,value:`;`}):n.push({kind:`replace`,start:e.start,end:e.end,value:nt(e,t)})}}function tt(e,t,n,r){let i=t.at(-1),a=t.at(-2);if(!(!ot(e,r)||i?.type===`MemberExpression`)&&!(i?.type===`CallExpression`&&i.callee===e&&i.optional!==!0)&&!at(e,i,a)){if(i?.type===`AssignmentExpression`&&i.left===e){let e=B(i,`right`);e&&n.push({kind:`replace`,start:e.start,end:e.end,value:X(e,t)});return}n.push({kind:`replace`,start:e.start,end:e.end,value:X(e,t)})}}function nt(e,t){return rt(e,t)?`;${ze}`:ze}function X(e,t){return rt(e,t)?`;${Re}`:Re}function rt(e,t){let n=t.findLastIndex(e=>e.type===`ExpressionStatement`);if(n<0)return!1;let r=t[n];if(!r)return!1;let i=t[n-1];return r.start===e.start&&it(i)}function it(e){return e?.type===`Program`||e?.type===`BlockStatement`||e?.type===`StaticBlock`||e?.type===`TSModuleBlock`||e?.type===`SwitchCase`}function at(e,t,n){return t?.type===`UpdateExpression`&&t.argument===e||(t?.type===`ForInStatement`||t?.type===`ForOfStatement`)&&t.left===e||t?.type===`ArrayPattern`||t?.type===`AssignmentPattern`&&t.left===e?!0:t?.type===`Property`&&t.value===e&&n?.type===`ObjectPattern`}function ot(e,t){if(e.type!==`MemberExpression`)return!1;let n=B(e,`object`),r=B(e,`property`);return e.optional===!0||!n||!r||ct(e,r,t)?!1:Z(n)?!0:n.type===`MemberExpression`&&Z(B(n,`object`))&&e.computed!==!0&&r.type===`Identifier`&&(r.name===`call`||r.name===`apply`)}function st(e,t){if(e.type!==`MemberExpression`)return!1;let n=B(e,`object`),r=B(e,`property`);if(!n||!r||n.type!==`MemberExpression`||e.computed===!0||r.type!==`Identifier`||r.name!==`bind`||!Z(B(n,`object`)))return!1;let i=B(n,`property`);return!!i&&!ct(n,i,t)}function ct(e,t,n){return e.computed!==!0&&t.type===`Identifier`&&n.has(t.name)}function Z(e){return e?.type===`Identifier`&&e.name===`console`}function lt(e){let t=[];for(let n of e.toSorted((e,t)=>e.start-t.start||t.end-e.end))t.some(e=>e.start<=n.start&&n.end<=e.end)||t.push(n);return t.toSorted((e,t)=>t.start-e.start)}function ut(e){if(!(e.type!==`ExportNamedDeclaration`&&e.type!==`ExportDefaultDeclaration`))return B(e,`declaration`)}function dt(e,t,n){let r=[he(e,n),ft(e.keepImport?.map(e=>e.toString())??[])],i=Fe();return i&&r.push(Ie(i)),e[`core-js`]||e[`core-js-proposals`]?(r.push(pt()),t.some(e=>e.preserveModules)||r.push(gt())):r.push(mt()),r.push(bt()),r}function ft(e){return{name:`keep-import`,resolveDynamicImport(t){return e.includes(t)?!1:void 0}}}function pt(){return ht(`babel-core-js`,()=>!0)}function mt(){return ht(`babel-decorators`,Pe)}function ht(e,n){let r=t.join(S(),`babel.config.mjs`);return{name:e,async transform(e,t){if(!I(t)||!n(e,t))return;let{transformAsync:i}=await import(`@babel/core`),a=await i(e,{caller:{name:`build-ts`,supportsDynamicImport:!0,supportsExportNamespaceFrom:!0,supportsStaticESM:!0},configFile:r,filename:t,sourceMaps:!0});if(a?.code)return{code:a.code,map:a.map}}}}function gt(){return{name:`commonjs-runtime-prelude`,renderChunk(e,t,n){let r=_t(e,n.format);if(!r)return;let i=new h(e);return i.appendLeft(yt(e),`${r}\n`),{code:i.toString(),map:i.generateMap({hires:!0})}}}}function _t(e,t){if(e.includes(`__commonJSMin`))return vt(t)?e.includes(`__toESM`)?`var __create=Object.create,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__commonJSMin=(moduleFactory,module)=>()=>(module||(module={exports:{}},moduleFactory(module.exports,module)),module.exports),__copyProps=(to,from,except,descriptor)=>{if(from&&"object"==typeof from||"function"==typeof from)for(var key,names=__getOwnPropNames(from),index=0,length=names.length;index<length;index++)key=names[index],__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:(key=>from[key]).bind(null,key),enumerable:!(descriptor=__getOwnPropDesc(from,key))||descriptor.enumerable});return to},__toESM=(mod,isNodeMode,target)=>(target=null!=mod?__create(__getProtoOf(mod)):{},__copyProps(!isNodeMode&&mod&&mod.__esModule?target:__defProp(target,"default",{value:mod,enumerable:!0}),mod));`:void 0:`var __commonJSMin=(moduleFactory,module)=>()=>(module||(module={exports:{}},moduleFactory(module.exports,module)),module.exports);`}function vt(e){return e===`cjs`||e===`commonjs`}function yt(e){let t=0;if(e.startsWith(`#!`)){let n=e.indexOf(`
3
+ `);if(n===-1)return e.length;t=n+1}let n=/(?:(?:"[^"\n]*"|'[^'\n]*');?\s*)/y;for(;;){if(n.lastIndex=t,!n.exec(e)?.[0])return t;t=n.lastIndex}}function bt(){return{name:`text`,async load(t){if(!t.endsWith(`.csv`)&&!t.endsWith(`.txt`))return;let n=await e.promises.readFile(t,`utf8`);return{code:`export default ${JSON.stringify(n)};`,moduleType:`js`}}}}const xt=m(import.meta.url);async function St(n,r){let i=Tt(r);if(!i)throw Error(`Failed to find tsconfig.json in ${r}.`);n.verbose&&console.info(`Found tsconfig.json:`,i);let a=[],o=t.join(`dist`,t.basename(r),`src`);if(e.existsSync(o)){let n=t.dirname(r),i=await e.promises.readdir(n,{withFileTypes:!0});r=t.resolve(r);for(let o of i){if(!o.isDirectory())continue;let i=t.resolve(n,o.name);if(i===r)continue;let s=Tt(i),c=t.join(`dist`,o.name,`src`);s&&e.existsSync(c)&&a.push([i,s,c])}}else o=`dist`;a.push([r,i,o]);let s=!0;for(let[e,i,o]of a)s&&=await Ct(n,e,i,t.join(r,o));return s}async function Ct(n,r,i,a){n.verbose&&console.info(`runTsgo()`,r,i,a);let o=t.dirname(i),s=t.join(o,`.build-ts-tsgo.${process.pid}.${Date.now()}.json`);try{await e.promises.writeFile(s,JSON.stringify(await wt(r,i,a),void 0,2));let t=v.spawnSync(process.execPath,[Et(),`-p`,s],{cwd:r,stdio:`inherit`});if(t.error)throw t.error;return t.status===0}finally{await e.promises.rm(s,{force:!0})}}async function wt(e,n,r){let i={declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:r,rootDir:`src`};if(await Q(t.join(e,`src`))){let t=Dt(e),n=t?await Ot(t):[];n.includes(`node`)&&(i.types=n)}return{compilerOptions:i,extends:kt(t.dirname(n),n),include:[`src/**/*`]}}function Tt(n){let r=t.resolve(n);for(;;){let n=t.join(r,`tsconfig.json`);if(e.existsSync(n))return n;let i=t.dirname(r);if(i===r)return;r=i}}function Et(){let e=xt.resolve(`@typescript/native-preview/package.json`);return t.join(t.dirname(e),`bin`,`tsgo.js`)}async function Q(n){try{let r=await e.promises.readdir(n,{withFileTypes:!0});for(let i of r){let r=t.join(n,i.name);if(i.isDirectory()){if(await Q(r))return!0}else if(/\.[cm]?tsx?$/.test(i.name)&&(await e.promises.readFile(r,`utf8`)).includes(`node:`))return!0}}catch{return!1}return!1}function Dt(n){let r=t.resolve(n);for(;;){let n=t.join(r,`node_modules`,`@types`);if(e.existsSync(n))return n;let i=t.dirname(r);if(i===r)return;r=i}}async function Ot(t){try{return(await e.promises.readdir(t,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}function kt(e,n){let r=t.relative(e,n).replaceAll(t.sep,`/`);return r.startsWith(`.`)?r:`./${r}`}const At={command:`app [package]`,describe:`Build an app`,builder:D,async handler(e){return $(e,`app`)}},jt={command:`functions [package]`,describe:`Build a GCP/Firebase functions app`,builder:ie,async handler(e){if(e.onlyPackageJson){let n=t.resolve(e.package?.toString()??`.`),[r,i]=await x(n);r||(console.error(`Failed to parse package.json (${i}).`),process.exit(1)),await Bt(n,r,e.moduleType)}else return $(e,`functions`)}},Mt={command:`lib [package]`,describe:`Build a Node.js / React library`,builder:ae,async handler(e){return $(e,`lib`)}};async function $(n,r){process.env.NODE_ENV||=`production`;let i=!n.silent&&n.verbose,a=process.cwd(),o=t.resolve(n.package?.toString()??`.`),[l,u]=await x(o);l||(console.error(`Failed to parse package.json (${u}).`),process.exit(1)),b(n,o);let d=It(n,a,o),f=Lt(r,d,o);i&&(console.info(`argv:`,n),console.info(`packageJsonPath:`,u),console.info(`Target (Category):`,`${f} (${r})`));let[p]=ne(l),m=l.type===`module`;n[`core-js`]?process.env.BUILD_TS_COREJS=`1`:n[`core-js-proposals`]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS=`1`),i&&(process.env.BUILD_TS_VERBOSE=`1`),process.env.BUILD_TS_TARGET_CATEGORY=r,process.env.BUILD_TS_TARGET_DETAIL=f;let h=Vt(n,f,o,m);i&&console.info(`OutputOptions:`,h),h.length===0&&(console.error(`Failed to detect output files.`),process.exit(1)),process.chdir(o),await e.promises.rm(t.join(o,`dist`),{recursive:!0,force:!0}),f===`functions`&&await Bt(o,l,n.moduleType);let g={checks:{preferBuiltinFeature:!1},external:ce(n,f,l,p,o),input:f===`functions`?Object.fromEntries(d.map((e,n)=>[n===0?`index`:t.basename(e,t.extname(e)),e])):d,plugins:dt(n,h,o),resolve:{extensionAlias:{".cjs":[`.cjs`,`.cts`],".js":[`.js`,`.ts`,`.tsx`],".mjs":[`.mjs`,`.mts`]},extensions:[`.cts`,`.mts`,`.ts`,`.tsx`,`.cjs`,`.mjs`,`.js`,`.jsx`,`.json`]},treeshake:n[`core-js`]||n[`core-js-proposals`]?!1:void 0,transform:Nt(n,o),watch:n.watch?{clearScreen:!1}:void 0},_=e=>(Array.isArray(e)?e:[e]).map(e=>t.relative(o,e)),v=e=>{let t=_(h.map(e=>e.file||e.dir||``));console.info(s(`cyan`,`Bundles ${s(`bold`,_(e).join(`, `))} → ${s(`bold`,t.join(`, `))}\non ${o} ...`))};if(n.watch)Pt(n,f,o,g,h,_,v);else{n.silent||v(d);let e,t=!1;try{let t=Date.now(),r=await c(g);e=r,await Promise.all(h.map(e=>r.write(e))),n.silent||console.info(s(`green`,`Created ${_(h.map(e=>e.file||e.dir||``)).join(`, `)} in ${s(`bold`,w(Date.now()-t))}`))}catch(e){t=!0,console.error(`Failed to build due to:`,e)}await e?.close(),t&&process.exit(1),f!==`app-node`&&f!==`functions`&&!await St(n,o)&&process.exit(1)}}function Nt(e,t){return{define:ee(e,t),jsx:`react-jsx`,target:`es2022`}}function Pt(e,t,n,r,i,a,o){let c=l({...r,output:i}),d=async e=>{process.removeListener(`uncaughtException`,f),process.stdin.removeListener(`end`,p),await c.close(),e&&process.exit(e)},f=e=>{console.error(e),d(1)},p=()=>{d()};u(e=>void d(e)),process.on(`uncaughtException`,f),process.stdin.isTTY||(process.stdin.on(`end`,p),process.stdin.resume()),c.on(`event`,async i=>{try{switch(i.code){case`ERROR`:oe(i.error,!0);break;case`BUNDLE_START`:if(e.silent)break;o(Ft(r.input));break;case`BUNDLE_END`:if(e.silent)break;console.info(s(`green`,`Created ${s(`bold`,a(i.output).join(`, `))} in ${s(`bold`,w(i.duration))}`)),t!==`app-node`&&t!==`functions`&&await St(e,n);break;case`END`:if(e.silent)break;console.info(`\n[${re(new Date)}] waiting for changes...`);break}}catch(e){console.error(`Failed to handle watch event due to:`,e)}finally{`result`in i&&i.result&&i.result.close()}})}function Ft(e){return e?typeof e==`string`?[e]:Array.isArray(e)?e:Object.values(e):[]}function It(n,r,i){if(n.input&&n.input.length>0)return n.input.map(e=>t.resolve(r,e.toString()));let a=t.join(i,`src`);for(let n of[`ts`,`tsx`,`cts`,`mts`]){let r=t.join(a,`index.${n}`);if(e.existsSync(r))return[r]}console.error(`Failed to detect input file.`),process.exit(1)}function Lt(e,t,n){switch(e){case`app`:return`app-node`;case`functions`:return`functions`;case`lib`:return t.some(e=>e.endsWith(`.tsx`))||Rt(n)?`lib-react`:`lib`;default:console.error(`target option must be one of: `+te.join(`, `)),process.exit(1)}}function Rt(e){return zt(t.join(e,`src`))}function zt(n){try{return e.readdirSync(n,{withFileTypes:!0}).some(e=>{let r=t.join(n,e.name);return e.isDirectory()?zt(r):e.isFile()&&e.name.endsWith(`.tsx`)})}catch{return!1}}async function Bt(n,r,i){r.name+=`-dist`;let a=r.type===`module`,o=Ht(a,i);r.main=a===o?`index.js`:o?`index.mjs`:`index.cjs`,delete r.scripts,delete r.devDependencies,await e.promises.mkdir(t.join(n,`dist`),{recursive:!0}),await e.promises.writeFile(t.join(n,`dist`,`package.json`),JSON.stringify(r))}function Vt(e,n,r,i){let a=t.join(r,`dist`);if(n===`app-node`||n===`functions`){let t=Ht(i,e.moduleType);return[{dir:a,format:t?`module`:`commonjs`,minify:e.minify,sourcemap:e.sourcemap&&`inline`,strict:!t}]}let o=[],s=e.moduleType||`both`,c=e.jsExtension||`either`;return(s===`cjs`||s===`both`||s===`either`&&!i)&&o.push({dir:a,entryFileNames:c===`both`||c===`either`&&!i?`[name].js`:`[name].cjs`,format:`commonjs`,minify:e.minify,preserveModules:!0,preserveModulesRoot:t.join(r,`src`),sourcemap:e.sourcemap,strict:!0}),(s===`esm`||s===`both`||s===`either`&&i)&&o.push({dir:a,entryFileNames:c===`both`||c===`either`&&i?`[name].js`:`[name].mjs`,format:`module`,minify:e.minify,preserveModules:!0,preserveModulesRoot:t.join(r,`src`),sourcemap:e.sourcemap}),o}function Ht(e,t){return t===`esm`||(!t||t===`either`)&&e}const Ut={command:`run <file>`,describe:`Run script`,builder:{...T,watch:{description:`Whether watch mode is enabled or not`,type:`boolean`,alias:`w`}},handler(e){b(e,process.cwd());let t=e.file?.toString()??``,n=process.versions.bun,r=n?`bun`:`node`,i=n?[`--bun`]:[`--no-warnings`,`--import`,`tsx`];e.watch&&i.push(`--watch`),i.push(t);let[,...a]=e._,o=[...i,...a.map(e=>e.toString())];e.verbose&&console.info(`Running '${r} ${o.join(` `)}'`);let s=v.spawnSync(r,o,{stdio:`inherit`,env:{...process.env}});process.exit(s.status??1)}};r(process.env),await a(o(process.argv)).scriptName(`build-ts`).options(T).command(At).command(jt).command(Mt).command(Ut).demandCommand().strict().version(Wt()).help().argv;function Wt(){return JSON.parse(e.readFileSync(t.join(S(),`package.json`),`utf8`)).version}
4
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJidWlsZGVyIl0sInNvdXJjZXMiOlsiLi4vc3JjL2Vudi50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1bmRsZXJMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvZXh0ZXJuYWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1bmRsZUJ1aWx0aW5zUGx1Z2luLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL3RyYW5zZm9ybVV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2RlY29yYXRvckRldGVjdGlvbi50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yZW1vdmVDb25zb2xlUGx1Z2luLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL3BsdWdpbi50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC90eXBlU2NyaXB0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1aWxkLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3J1bi50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmxldCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbG9hZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPixcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIWVudlZhcnMpIHtcbiAgICBlbnZWYXJzID0gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ0xvYWRlZCBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGRlZmluaXRpb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSBidWlsZC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBlbnZWYXJzRGVmOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGVudlZhck5hbWVzID0gbmV3IFNldChbXG4gICAgLi4uKGFyZ3YuaW5saW5lID8/IFtdKS5mbGF0TWFwKChlKSA9PiBlLnRvU3RyaW5nKCkuc3BsaXQoJywnKSksXG4gICAgLi4uKGFyZ3YuYXV0b0lubGluZSA/IE9iamVjdC5rZXlzKGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBjd2QpKSA6IFtdKSxcbiAgXSk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBlbnZWYXJOYW1lcykge1xuICAgIGlmIChwcm9jZXNzLmVudltuYW1lXSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGVudlZhcnNEZWZbYHByb2Nlc3MuZW52LiR7bmFtZX1gXSA9IEpTT04uc3RyaW5naWZ5KHByb2Nlc3MuZW52W25hbWVdKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdJbmxpbmUgZW52IHZhcnM6JywgT2JqZWN0LmtleXMoZW52VmFyc0RlZikpO1xuICB9XG4gIHJldHVybiBlbnZWYXJzRGVmO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMsIE9wdGlvbnMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBhbGxUYXJnZXRDYXRlZ29yaWVzID0gWydhcHAnLCAnZnVuY3Rpb25zJywgJ2xpYiddIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUYXJnZXRDYXRlZ29yeSA9ICh0eXBlb2YgYWxsVGFyZ2V0Q2F0ZWdvcmllcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldERldGFpbHMgPSBbJ2FwcC1ub2RlJywgJ2Z1bmN0aW9ucycsICdsaWInLCAnbGliLXJlYWN0J10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldERldGFpbCA9ICh0eXBlb2YgYWxsVGFyZ2V0RGV0YWlscylbbnVtYmVyXTtcblxuZXhwb3J0IHR5cGUgQXJndW1lbnRzVHlwZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgT3B0aW9ucz4+ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8VD4+O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFtQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgc3RyaW5nXT4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICByZXR1cm4gW0pTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCBwYWNrYWdlSnNvblBhdGhdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVpbGRUc1Jvb3RQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmRpcm5hbWUocGF0aC5kaXJuYW1lKHVybC5maWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVzcGFjZUFuZE5hbWUocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogW3N0cmluZyB8IHVuZGVmaW5lZCwgc3RyaW5nIHwgdW5kZWZpbmVkXSB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gcGFja2FnZUpzb24ubmFtZT8udG9TdHJpbmcoKSA/PyAnJztcbiAgY29uc3QgbWF0Y2ggPSAvQChbXi9dKylcXC8oLispLy5leGVjKHBhY2thZ2VOYW1lKTtcbiAgY29uc3QgWywgbmFtZXNwYWNlLCBuYW1lXSA9IG1hdGNoID8/IFtdO1xuICByZXR1cm4gW25hbWVzcGFjZSwgbmFtZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlVGltZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtwYWQoZGF0ZS5nZXRNb250aCgpICsgMSl9LSR7cGFkKGRhdGUuZ2V0RGF0ZSgpKX0gJHtwYWQoZGF0ZS5nZXRIb3VycygpKX06JHtwYWQoXG4gICAgZGF0ZS5nZXRNaW51dGVzKClcbiAgKX06JHtwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpfWA7XG59XG5cbmZ1bmN0aW9uIHBhZCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG1pbGxpc2Vjb25kcyA8IDEwMDApIHJldHVybiBgJHtNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyl9bXNgO1xuXG4gIGNvbnN0IHNlY29uZHMgPSBtaWxsaXNlY29uZHMgLyAxMDAwO1xuICBpZiAoc2Vjb25kcyA8IDYwKSByZXR1cm4gYCR7TnVtYmVyKHNlY29uZHMudG9GaXhlZCgxKSl9c2A7XG5cbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgcmV0dXJuIGAke21pbnV0ZXN9bSAke051bWJlcigoc2Vjb25kcyAtIG1pbnV0ZXMgKiA2MCkudG9GaXhlZCgxKSl9c2A7XG59XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHN1cHByZXNzIG5vbi1lcnJvciBvdXRwdXQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdzJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICBpbnB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGhzIG9mIHNvdXJjZSBjb2RlIGZpbGVzIHRvIGJlIGJ1aWx0LiBUaGUgZmlyc3QgZmlsZSBpcyBtYWluLiBJZiBubyBvcHRpb24gaXMgZ2l2ZW4sIFwic3JjL2luZGV4Lnt0cyx0c3gsY3RzLG10c31cIiBmcm9tIHBhY2thZ2UgZGlyZWN0b3J5IGlzIHRhcmdldGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2knLFxuICB9LFxuICAnY29yZS1qcyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IGNvcmUtanMgaXMgZW1wbG95ZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gICdjb3JlLWpzLXByb3Bvc2Fscyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IGNvcmUtanMgd2l0aCBwcm9wb3NhbHMgc3VwcG9ydCBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgbWluaWZ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBtaW5pZmljYXRpb24gaXMgZW5hYmxlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBzb3VyY2VtYXA6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHNvdXJjZW1hcCBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIGV4dGVybmFsOiB7XG4gICAgZGVzY3JpcHRpb246ICdBZGRpdGlvbmFsIGV4dGVybmFsIGRlcGVuZGVuY2llcy4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gIGlubGluZToge1xuICAgIGRlc2NyaXB0aW9uOiAnRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGJlIGlubGluZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnYXV0by1pbmxpbmUnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmxpbmUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGRlZmluZWQgYXQgZW52IGZpbGVzLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAga2VlcEltcG9ydDoge1xuICAgIGRlc2NyaXB0aW9uOiAnSWRlbnRpZmllcnMgdG8gYmUga2VwdCBhcyBpbXBvcnQgc3RhdGVtZW50cy4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gIGJ1bmRsZUJ1aWx0aW5zOiB7XG4gICAgZGVzY3JpcHRpb246ICdNb2R1bGUgbmFtZXMgc2FtZSB3aXRoIGJ1aWx0aW5zIChlLmcuLCB1bmRpY2kpIHRvIGJlIGJ1bmRsZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGFwcEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG1vZHVsZVR5cGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ2VzbSwgY2pzLCBvciBlaXRoZXIgKGRlZmF1bHQpLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnNCdWlsZGVyID0ge1xuICAuLi5hcHBCdWlsZGVyLFxuICBvbmx5UGFja2FnZUpzb246IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gZ2VuZXJhdGUgb25seSBwYWNrYWdlLmpzb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgbGliQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIGVpdGhlciwgb3IgYm90aCAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxuICAvLyAuanMgZmlsZXMgaW4gYSBwYWNrYWdlIHdpdGggYFwidHlwZVwiOiBcIm1vZHVsZVwiYCBhcmUgdHJlYXRlZCBhcyBlc20uXG4gIC8vIEhvd2V2ZXIsIHdlIHdhbnQgdG8gdHJlYXQgdGhlbSBhcyBjanMgaW4gdGhlIGNhc2Ugd2hlcmUgYSBjanMgcHJvamVjdCBpbXBvcnRzIGFuIGVzbSBwYWNrYWdlLlxuICAvLyBUbyBkZWFsIHdpdGggdGhlIGNhc2UsIHdlIHVzZSAuY2pzIGFuZCAubWpzIGV4dGVuc2lvbnMgaW5zdGVhZCBvZiAuanMgZXh0ZW5zaW9uLlxuICBqc0V4dGVuc2lvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB1c2UgLmpzIGluIGNqcyBhbmQvb3IgZXNtOiBlaXRoZXIgKGRlZmF1bHQpLCBib3RoLCBvciBub25lLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdqJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEFueUJ1aWxkZXJUeXBlID0gdHlwZW9mIGFwcEJ1aWxkZXIgfCB0eXBlb2YgZnVuY3Rpb25zQnVpbGRlciB8IHR5cGVvZiBsaWJCdWlsZGVyO1xuIiwiaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHN0eWxlVGV4dCB9IGZyb20gJ25vZGU6dXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcjogQnVpbGRFcnJvciwgcmVjb3ZlciA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBlcnJvci5uYW1lIHx8IChlcnJvci5jYXVzZSBhcyBFcnJvcik/Lm5hbWU7XG4gIGNvbnN0IG5hbWVTZWN0aW9uID0gbmFtZSA/IGAke25hbWV9OiBgIDogJyc7XG4gIGNvbnN0IHBsdWdpblNlY3Rpb24gPSBlcnJvci5wbHVnaW4gPyBgKHBsdWdpbiAke2Vycm9yLnBsdWdpbn0pIGAgOiAnJztcbiAgY29uc3QgbWVzc2FnZSA9IGAke3BsdWdpblNlY3Rpb259JHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9YDtcblxuICBjb25zdCBvdXRwdXRMaW5lcyA9IFtzdHlsZVRleHQoWydib2xkJywgJ3JlZCddLCBgWyFdICR7bWVzc2FnZX1gKV07XG5cbiAgaWYgKGVycm9yLnVybCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goc3R5bGVUZXh0KCdjeWFuJywgZXJyb3IudXJsKSk7XG4gIH1cblxuICBpZiAoZXJyb3IubG9jKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChgJHtlcnJvci5sb2MuZmlsZSB8fCBlcnJvci5pZH0gKCR7ZXJyb3IubG9jLmxpbmV9OiR7ZXJyb3IubG9jLmNvbHVtbn0pYCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IuaWQpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGVycm9yLmlkKTtcbiAgfVxuXG4gIGlmIChlcnJvci5mcmFtZSkge1xuICAgIG91dHB1dExpbmVzLnB1c2goc3R5bGVUZXh0KCdkaW0nLCBlcnJvci5mcmFtZSkpO1xuICB9XG5cbiAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChzdHlsZVRleHQoJ2RpbScsIGVycm9yLnN0YWNrLnJlcGxhY2UoYCR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfVxcbmAsICcnKSkpO1xuICB9XG5cbiAgb3V0cHV0TGluZXMucHVzaCgnJywgJycpO1xuICBjb25zb2xlLmVycm9yKG91dHB1dExpbmVzLmpvaW4oJ1xcbicpKTtcblxuICBpZiAoIXJlY292ZXIpIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNhdXNlPzogdW5rbm93bjtcbiAgZnJhbWU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBsb2M/OiB7XG4gICAgY29sdW1uOiBudW1iZXI7XG4gICAgZmlsZT86IHN0cmluZztcbiAgICBsaW5lOiBudW1iZXI7XG4gIH07XG4gIHBsdWdpbj86IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgYnVpbHRpbk1vZHVsZXMgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlLCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmNvbnN0IG5vZGVCdWlsdGluTW9kdWxlcyA9IG5ldyBTZXQoYnVpbHRpbk1vZHVsZXMpO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXh0ZXJuYWxNYXRjaGVyKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmdcbik6IChpZDogc3RyaW5nKSA9PiBib29sZWFuIHtcbiAgY29uc3QgYnVuZGxlZEJ1aWx0aW5OYW1lcyA9IGdldEJ1bmRsZWRCdWlsdGluTmFtZXMoYXJndik7XG4gIGNvbnN0IGV4dGVybmFsRGVwZW5kZW5jeU5hbWVzID0gbmV3IFNldChcbiAgICBjb2xsZWN0RXh0ZXJuYWxEZXBlbmRlbmNpZXMoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlSnNvbiwgcGFja2FnZURpclBhdGgsIG5hbWVzcGFjZSwgYnVuZGxlZEJ1aWx0aW5OYW1lcylcbiAgKTtcbiAgcmV0dXJuIChpZCkgPT4ge1xuICAgIGlmIChnZXRCdW5kbGVkQnVpbHRpblBhY2thZ2VOYW1lKGlkLCBidW5kbGVkQnVpbHRpbk5hbWVzKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBpc05vZGVCdWlsdGluKGlkKSB8fCBtYXRjaGVzTW9kdWxlT3JTdWJwYXRoKGlkLCBleHRlcm5hbERlcGVuZGVuY3lOYW1lcyk7XG4gIH07XG59XG5cbi8qKiBDaGVja3Mgd2hldGhlciBgaWRgIGVxdWFscyBhIG5hbWUgaW4gYG5hbWVzYCBvciBpcyBhIHN1YnBhdGggb2YgaXQgKGUuZy4gYGxvZGFzaC5jaHVuay9pbmRleC5qc2ApLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc01vZHVsZU9yU3VicGF0aChpZDogc3RyaW5nLCBuYW1lczogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgaWYgKG5hbWVzLmhhcyhpZCkpIHJldHVybiB0cnVlO1xuICBmb3IgKGxldCBzbGFzaEluZGV4ID0gaWQuaW5kZXhPZignLycpOyBzbGFzaEluZGV4ICE9PSAtMTsgc2xhc2hJbmRleCA9IGlkLmluZGV4T2YoJy8nLCBzbGFzaEluZGV4ICsgMSkpIHtcbiAgICBpZiAobmFtZXMuaGFzKGlkLnNsaWNlKDAsIHNsYXNoSW5kZXgpKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RXh0ZXJuYWxEZXBlbmRlbmNpZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgYnVuZGxlZEJ1aWx0aW5OYW1lczogU2V0PHN0cmluZz5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXh0ZXJuYWxEZXBzID0gWy4uLihhcmd2LmV4dGVybmFsID8/IFtdKV0ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpO1xuICBpZiAocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ0BwcmlzbWEvY2xpZW50J10pIHtcbiAgICBleHRlcm5hbERlcHMucHVzaCgncHJpc21hLWNsaWVudCcpO1xuICB9XG4gIC8vIGBkZXBzOiB0cnVlYCBkaWQgbm90IGhhbmRsZSBpbXBvcnRzIHN1Y2ggYXMgYGxvZGFzaC5jaHVuay9pbmRleC5qc2AuXG4gIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICk7XG4gIC8vIEFkZCBleHRlcm5hbCBkZXBlbmRlbmNpZXMgZnJvbSBzaWJsaW5nIHBhY2thZ2VzXG4gIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUocGFja2FnZURpclBhdGgpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHBhcmVudERpclBhdGgpLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFja2FnZURpcnMgPSBmcy5yZWFkZGlyU3luYyhwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlRGlyIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgICBpZiAoIXBhY2thZ2VEaXIuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYXJlbnREaXJQYXRoLCBwYWNrYWdlRGlyLm5hbWUsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgb3RoZXJQYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW290aGVyUGFja2FnZUpzb24ubmFtZSA/PyAnJ10pIHtcbiAgICAgICAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBidW5kbGVkTmFtZXNwYWNlUGF0dGVybiA9XG4gICAgc2hvdWxkQnVuZGxlU2FtZU5hbWVzcGFjZURlcGVuZGVuY2llcyh0YXJnZXREZXRhaWwpICYmIG5hbWVzcGFjZSA/IG5ldyBSZWdFeHAoYF5APyR7bmFtZXNwYWNlfSg/Oi8uKyk/YCkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBleHRlcm5hbERlcHMuZmlsdGVyKChkZXBlbmRlbmN5TmFtZSkgPT4ge1xuICAgIGlmIChidW5kbGVkQnVpbHRpbk5hbWVzLmhhcyhub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoZGVwZW5kZW5jeU5hbWUpKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhYnVuZGxlZE5hbWVzcGFjZVBhdHRlcm4/LnRlc3QoZGVwZW5kZW5jeU5hbWUpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1bmRsZWRCdWlsdGluTmFtZXMoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4pOiBTZXQ8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgU2V0KGFyZ3YuYnVuZGxlQnVpbHRpbnM/Lm1hcCgoaXRlbSkgPT4gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGl0ZW0udG9TdHJpbmcoKSkpID8/IFtdKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQnVuZGxlU2FtZU5hbWVzcGFjZURlcGVuZGVuY2llcyh0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdW5kbGVkQnVpbHRpblBhY2thZ2VOYW1lKGlkOiBzdHJpbmcsIGJ1bmRsZWRCdWlsdGluTmFtZXM6IFNldDxzdHJpbmc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9ybWFsaXplZElkID0gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGlkKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlTmFtZSBvZiBidW5kbGVkQnVpbHRpbk5hbWVzKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWRJZCA9PT0gcGFja2FnZU5hbWUgfHwgbm9ybWFsaXplZElkLnN0YXJ0c1dpdGgoYCR7cGFja2FnZU5hbWV9L2ApKSByZXR1cm4gcGFja2FnZU5hbWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VTdWJwYXRoKGlkOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkSWQgPSBub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoaWQpO1xuICByZXR1cm4gbm9ybWFsaXplZElkID09PSBwYWNrYWdlTmFtZSA/ICcuJyA6IGAuLyR7bm9ybWFsaXplZElkLnNsaWNlKHBhY2thZ2VOYW1lLmxlbmd0aCArIDEpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBpZC5zdGFydHNXaXRoKCdub2RlOicpID8gaWQuc2xpY2UoJ25vZGU6Jy5sZW5ndGgpIDogaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVCdWlsdGluKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoJ25vZGU6JykgfHwgbm9kZUJ1aWx0aW5Nb2R1bGVzLmhhcyhpZCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbXBvcnRLaW5kLCBQbHVnaW4gfSBmcm9tICdyb2xsZG93bic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZ2V0QnVuZGxlZEJ1aWx0aW5OYW1lcywgZ2V0QnVuZGxlZEJ1aWx0aW5QYWNrYWdlTmFtZSwgZ2V0UGFja2FnZVN1YnBhdGgsIGlzTm9kZUJ1aWx0aW4gfSBmcm9tICcuL2V4dGVybmFscy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBidW5kbGVCdWlsdGluc1BsdWdpbihhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IFBsdWdpbiB7XG4gIGNvbnN0IGJ1bmRsZWRCdWlsdGluTmFtZXMgPSBnZXRCdW5kbGVkQnVpbHRpbk5hbWVzKGFyZ3YpO1xuICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2J1bmRsZS1idWlsdGlucycsXG4gICAgcmVzb2x2ZUlkKHNvdXJjZSwgX2ltcG9ydGVyLCBleHRyYU9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZ2V0QnVuZGxlZEJ1aWx0aW5QYWNrYWdlTmFtZShzb3VyY2UsIGJ1bmRsZWRCdWlsdGluTmFtZXMpO1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHJlc29sdmVQYWNrYWdlRW50cnkoXG4gICAgICAgIHJlcXVpcmUsXG4gICAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgICBwYWNrYWdlRGlyUGF0aCxcbiAgICAgICAgZ2V0UGFja2FnZUV4cG9ydENvbmRpdGlvbnMoZXh0cmFPcHRpb25zLmtpbmQpLFxuICAgICAgICBnZXRQYWNrYWdlU3VicGF0aChzb3VyY2UsIHBhY2thZ2VOYW1lKVxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5KFxuICByZXF1aXJlOiBOb2RlSlMuUmVxdWlyZSxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgY29uZGl0aW9uczogU2V0PHN0cmluZz4sXG4gIHN1YnBhdGg6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uUGF0aChyZXF1aXJlLCBwYWNrYWdlTmFtZSwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlUGFja2FnZVdpdGhvdXRFeHBvcnRzKHJlcXVpcmUsIHBhY2thZ2VOYW1lLCBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgc3VicGF0aCk7XG4gICAgaWYgKHJlc29sdmVkUGF0aCAhPT0gcGFja2FnZU5hbWUgJiYgIXJlc29sdmVkUGF0aC5zdGFydHNXaXRoKCdub2RlOicpKSByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICB9XG5cbiAgY29uc3QgZW50cnlQYXRoID0gZ2V0UGFja2FnZUVudHJ5UGF0aChwYWNrYWdlSnNvbiwgY29uZGl0aW9ucywgc3VicGF0aCk7XG4gIGlmICghZW50cnlQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBwYWNrYWdlIGV4cG9ydCBmb3IgJHtwYWNrYWdlTmFtZX1gKTtcbiAgfVxuICByZXR1cm4gcGF0aC5qb2luKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCBlbnRyeVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlRXhwb3J0Q29uZGl0aW9ucyhpbXBvcnRLaW5kOiBJbXBvcnRLaW5kKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBjb25kaXRpb25zID0gbmV3IFNldChbJ25vZGUtYWRkb25zJywgJ25vZGUnLCAnbW9kdWxlLXN5bmMnLCAnZGVmYXVsdCddKTtcbiAgaWYgKGltcG9ydEtpbmQgPT09ICdyZXF1aXJlLWNhbGwnKSB7XG4gICAgY29uZGl0aW9ucy5hZGQoJ3JlcXVpcmUnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLmFkZCgnaW1wb3J0Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlV2l0aG91dEV4cG9ydHMoXG4gIHJlcXVpcmU6IE5vZGVKUy5SZXF1aXJlLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBzdWJwYXRoOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmIChzdWJwYXRoID09PSAnLicpIHJldHVybiByZXF1aXJlLnJlc29sdmUocGFja2FnZU5hbWUpO1xuICBjb25zdCByZXNvbHZlZFBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9LyR7c3VicGF0aC5zbGljZSgnLi8nLmxlbmd0aCl9YCk7XG4gIHJldHVybiBpc05vZGVCdWlsdGluKHJlc29sdmVkUGF0aCkgPyByZXNvbHZlUGFja2FnZVN1YnBhdGhGcm9tRGlyKHBhY2thZ2VEaXJQYXRoLCBzdWJwYXRoKSA6IHJlc29sdmVkUGF0aDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VTdWJwYXRoRnJvbURpcihwYWNrYWdlRGlyUGF0aDogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdWJwYXRoRW50cnlQYXRoID0gbm9ybWFsaXplUGFja2FnZUVudHJ5UGF0aChzdWJwYXRoKTtcbiAgaWYgKCFzdWJwYXRoRW50cnlQYXRoKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIHBhY2thZ2Ugc3VicGF0aCAke3N1YnBhdGh9YCk7XG5cbiAgY29uc3QgZW50cnlQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBzdWJwYXRoRW50cnlQYXRoKTtcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKGVudHJ5UGF0aCkgPz8gcmVzb2x2ZURpcmVjdG9yeVBhdGgoZW50cnlQYXRoKTtcbiAgaWYgKHJlc29sdmVkUGF0aCkgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBwYWNrYWdlIHN1YnBhdGggJHtzdWJwYXRofWApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPyBbZmlsZVBhdGhdIDogW2ZpbGVQYXRoLCBgJHtmaWxlUGF0aH0uanNgLCBgJHtmaWxlUGF0aH0uanNvbmAsIGAke2ZpbGVQYXRofS5ub2RlYF07XG4gIHJldHVybiBmaWxlUGF0aHMuZmluZCgoY2FuZGlkYXRlUGF0aCkgPT4gZnMuZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSAmJiBmcy5zdGF0U3luYyhjYW5kaWRhdGVQYXRoKS5pc0ZpbGUoKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RvcnlQYXRoKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgIGNvbnN0IG1haW5QYXRoID0gcmVzb2x2ZUZpbGVQYXRoKHBhdGguam9pbihkaXJQYXRoLCBwYWNrYWdlSnNvbi5tYWluID8/ICdpbmRleC5qcycpKTtcbiAgICBpZiAobWFpblBhdGgpIHJldHVybiBtYWluUGF0aDtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZUZpbGVQYXRoKHBhdGguam9pbihkaXJQYXRoLCAnaW5kZXgnKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblBhdGgocmVxdWlyZTogTm9kZUpTLlJlcXVpcmUsIHBhY2thZ2VOYW1lOiBzdHJpbmcsIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtb2R1bGVQYXRocyA9IHJlcXVpcmUucmVzb2x2ZS5wYXRocyhwYWNrYWdlTmFtZSkgPz8gcmVxdWlyZS5yZXNvbHZlLnBhdGhzKCdfX2J1aWxkX3RzX3BhY2thZ2VfbG9va3VwX18nKSA/PyBbXTtcbiAgZm9yIChjb25zdCBtb2R1bGVQYXRoIG9mIFtwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdub2RlX21vZHVsZXMnKSwgLi4ubW9kdWxlUGF0aHNdKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKG1vZHVsZVBhdGgsIHBhY2thZ2VOYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgcGFja2FnZS5qc29uIGZvciAke3BhY2thZ2VOYW1lfWApO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlRW50cnlQYXRoKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgY29uZGl0aW9uczogU2V0PHN0cmluZz4sIHN1YnBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwYWNrYWdlSnNvbi5leHBvcnRzKSB7XG4gICAgY29uc3QgZW50cnlQYXRoID0gZ2V0RXhwb3J0RW50cnlQYXRoKHBhY2thZ2VKc29uLmV4cG9ydHMsIGNvbmRpdGlvbnMsIHN1YnBhdGgpO1xuICAgIHJldHVybiBlbnRyeVBhdGggPT09IG51bGwgPyB1bmRlZmluZWQgOiBub3JtYWxpemVQYWNrYWdlRW50cnlQYXRoKGVudHJ5UGF0aCk7XG4gIH1cbiAgaWYgKHN1YnBhdGggPT09ICcuJykgcmV0dXJuIHBhY2thZ2VKc29uLm1haW4gPz8gJ2luZGV4LmpzJztcbiAgcmV0dXJuIG5vcm1hbGl6ZVBhY2thZ2VFbnRyeVBhdGgoc3VicGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydEVudHJ5UGF0aChcbiAgZXhwb3J0c0ZpZWxkOiB1bmtub3duLFxuICBjb25kaXRpb25zOiBTZXQ8c3RyaW5nPixcbiAgc3VicGF0aDogc3RyaW5nLFxuICBwYXR0ZXJuTWF0Y2g/OiBzdHJpbmdcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICBpZiAodHlwZW9mIGV4cG9ydHNGaWVsZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3VicGF0aCA9PT0gJy4nID8gcmVzb2x2ZUV4cG9ydFRhcmdldChleHBvcnRzRmllbGQsIHBhdHRlcm5NYXRjaCkgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGV4cG9ydHNGaWVsZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cG9ydHNGaWVsZCkpIHtcbiAgICBpZiAoc3VicGF0aCAhPT0gJy4nKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBleHBvcnRFbnRyeSBvZiBleHBvcnRzRmllbGQpIHtcbiAgICAgIGxldCBlbnRyeVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBlbnRyeVBhdGggPSBnZXRFeHBvcnRFbnRyeVBhdGgoZXhwb3J0RW50cnksIGNvbmRpdGlvbnMsIHN1YnBhdGgsIHBhdHRlcm5NYXRjaCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnlQYXRoKSByZXR1cm4gZW50cnlQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgZXhwb3J0c0ZpZWxkICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBleHBvcnRSZWNvcmQgPSBleHBvcnRzRmllbGQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChoYXNFeHBvcnRTdWJwYXRocyhleHBvcnRSZWNvcmQpKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oZXhwb3J0UmVjb3JkLCBzdWJwYXRoKSkgcmV0dXJuIGdldEV4cG9ydEVudHJ5UGF0aChleHBvcnRSZWNvcmRbc3VicGF0aF0sIGNvbmRpdGlvbnMsICcuJyk7XG5cbiAgICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gZmluZEV4cG9ydFN1YnBhdGhQYXR0ZXJuKGV4cG9ydFJlY29yZCwgc3VicGF0aCk7XG4gICAgcmV0dXJuIHN1YnBhdGhFeHBvcnQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGdldEV4cG9ydEVudHJ5UGF0aChzdWJwYXRoRXhwb3J0LnZhbHVlLCBjb25kaXRpb25zLCAnLicpO1xuICB9XG4gIGlmIChzdWJwYXRoICE9PSAnLicpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBbY29uZGl0aW9uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwb3J0UmVjb3JkKSkge1xuICAgIGlmICghY29uZGl0aW9ucy5oYXMoY29uZGl0aW9uKSkgY29udGludWU7XG5cbiAgICBjb25zdCBlbnRyeVBhdGggPSBnZXRFeHBvcnRFbnRyeVBhdGgodmFsdWUsIGNvbmRpdGlvbnMsIHN1YnBhdGgsIHBhdHRlcm5NYXRjaCk7XG4gICAgaWYgKGVudHJ5UGF0aCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZW50cnlQYXRoO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc0V4cG9ydFN1YnBhdGhzKGV4cG9ydFJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGV4cG9ydFJlY29yZCkuc29tZSgoa2V5KSA9PiBrZXkgPT09ICcuJyB8fCBrZXkuc3RhcnRzV2l0aCgnLi8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRFeHBvcnRTdWJwYXRoUGF0dGVybihleHBvcnRSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzdWJwYXRoOiBzdHJpbmcpOiB7IHZhbHVlOiB1bmtub3duIH0gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBvcnRSZWNvcmQpLnNvcnQoKFtrZXlBXSwgW2tleUJdKSA9PiBjb21wYXJlRXhwb3J0UGF0dGVybktleXMoa2V5QSwga2V5QikpKSB7XG4gICAgY29uc3QgcGF0dGVybk1hdGNoID0gZ2V0RXhwb3J0UGF0dGVybk1hdGNoKGtleSwgc3VicGF0aCk7XG4gICAgaWYgKHBhdHRlcm5NYXRjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogcmVwbGFjZUV4cG9ydFBhdHRlcm4odmFsdWUsIHBhdHRlcm5NYXRjaCkgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZUV4cG9ydFBhdHRlcm5LZXlzKGtleUE6IHN0cmluZywga2V5Qjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgYmFzZUxlbmd0aEEgPSBrZXlBLmluZGV4T2YoJyonKTtcbiAgY29uc3QgYmFzZUxlbmd0aEIgPSBrZXlCLmluZGV4T2YoJyonKTtcbiAgaWYgKGJhc2VMZW5ndGhBID09PSAtMSAmJiBiYXNlTGVuZ3RoQiA9PT0gLTEpIHJldHVybiAwO1xuICBpZiAoYmFzZUxlbmd0aEEgPT09IC0xKSByZXR1cm4gMTtcbiAgaWYgKGJhc2VMZW5ndGhCID09PSAtMSkgcmV0dXJuIC0xO1xuICByZXR1cm4gYmFzZUxlbmd0aEIgLSBiYXNlTGVuZ3RoQSB8fCBrZXlCLmxlbmd0aCAtIGtleUEubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdHRlcm4uc3RhcnRzV2l0aCgnLi8nKSB8fCAhcGF0dGVybi5pbmNsdWRlcygnKicpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBwYXR0ZXJuLnNwbGl0KCcqJywgMikgYXMgW3N0cmluZywgc3RyaW5nXTtcbiAgaWYgKHN1YnBhdGggPT09IHByZWZpeCB8fCAhc3VicGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHwgIXN1YnBhdGguZW5kc1dpdGgoc3VmZml4KSB8fCBzdWJwYXRoLmxlbmd0aCA8IHBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gc3VicGF0aC5zbGljZShwcmVmaXgubGVuZ3RoLCBzdWJwYXRoLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlRXhwb3J0UGF0dGVybih2YWx1ZTogdW5rbm93biwgcGF0dGVybk1hdGNoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiByZXNvbHZlRXhwb3J0VGFyZ2V0KHZhbHVlLCBwYXR0ZXJuTWF0Y2gpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHJlcGxhY2VFeHBvcnRQYXR0ZXJuKGl0ZW0sIHBhdHRlcm5NYXRjaCkpO1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBba2V5LCByZXBsYWNlRXhwb3J0UGF0dGVybihpdGVtLCBwYXR0ZXJuTWF0Y2gpXSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFRhcmdldCh0YXJnZXQ6IHN0cmluZywgcGF0dGVybk1hdGNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICB2YWxpZGF0ZUV4cG9ydFRhcmdldCh0YXJnZXQpO1xuICBpZiAocGF0dGVybk1hdGNoID09PSB1bmRlZmluZWQpIHJldHVybiB0YXJnZXQ7XG5cbiAgdmFsaWRhdGVFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybk1hdGNoKTtcbiAgcmV0dXJuIHRhcmdldC5yZXBsYWNlQWxsKCcqJywgcGF0dGVybk1hdGNoKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBvcnRUYXJnZXQodGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCF0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhY2thZ2UgZXhwb3J0IHRhcmdldDogJHt0YXJnZXR9YCk7XG5cbiAgdmFsaWRhdGVQYXRoU2VnbWVudHModGFyZ2V0LnNsaWNlKCcuLycubGVuZ3RoKSwgdGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybk1hdGNoOiBzdHJpbmcpOiB2b2lkIHtcbiAgdmFsaWRhdGVQYXRoU2VnbWVudHMocGF0dGVybk1hdGNoLCBwYXR0ZXJuTWF0Y2gpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBhdGhTZWdtZW50cyhwYXRoVmFsdWU6IHN0cmluZywgc291cmNlVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkZWNvZGVkUGF0aCA9IGRlY29kZVBhdGhWYWx1ZShwYXRoVmFsdWUsIHNvdXJjZVZhbHVlKTtcbiAgY29uc3QgaW52YWxpZFNlZ21lbnRzID0gbmV3IFNldChbJycsICcuJywgJy4uJywgJ25vZGVfbW9kdWxlcyddKTtcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIGRlY29kZWRQYXRoLnNwbGl0KC9bXFxcXC9dL3UpKSB7XG4gICAgaWYgKGludmFsaWRTZWdtZW50cy5oYXMoc2VnbWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrYWdlIGV4cG9ydCBwYXRoIHNlZ21lbnQgaW4gJHtzb3VyY2VWYWx1ZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlUGF0aFZhbHVlKHBhdGhWYWx1ZTogc3RyaW5nLCBzb3VyY2VWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhWYWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhY2thZ2UgZXhwb3J0IHBhdGggc2VnbWVudCBpbiAke3NvdXJjZVZhbHVlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VFbnRyeVBhdGgoZW50cnlQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZW50cnlQYXRoPy5yZXBsYWNlKC9eXFwuXFwvLywgJycpO1xufVxuIiwiaW1wb3J0IHsgcGFyc2VTeW5jLCB2aXNpdG9yS2V5cyB9IGZyb20gJ294Yy1wYXJzZXInO1xuXG5jb25zdCBzb3VyY2VGaWxlRXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2Zvcm1UYXJnZXRGaWxlKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBzb3VyY2VGaWxlRXh0ZW5zaW9ucy5zb21lKChleHRlbnNpb24pID0+IGlkLmVuZHNXaXRoKGV4dGVuc2lvbikpICYmICFpZC5zdGFydHNXaXRoKCdcXDAnKSAmJiAhaXNOb2RlTW9kdWxlc1BhdGgoaWQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZU1vZHVsZXNQYXRoKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlkLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpIHx8IGlkLmluY2x1ZGVzKCdcXFxcbm9kZV9tb2R1bGVzXFxcXCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTb3VyY2VGaWxlKGlkOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlU3luYz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBsYW5nID0gZ2V0UGFyc2VyTGFuZyhpZCk7XG4gIGNvbnN0IHNvdXJjZVR5cGUgPSBnZXRQYXJzZXJTb3VyY2VUeXBlKGlkKTtcbiAgY29uc3QgYXN0ID0gcGFyc2VTeW5jKGlkLCBjb2RlLCB7IGxhbmcsIHNvdXJjZVR5cGUgfSk7XG4gIGlmICghaGFzUGFyc2VFcnJvcihhc3QpKSByZXR1cm4gYXN0O1xuICBpZiAoaWQuZW5kc1dpdGgoJy5qcycpICYmIHNvdXJjZVR5cGUgPT09ICd1bmFtYmlndW91cycpIHtcbiAgICBjb25zdCBjb21tb25Kc0FzdCA9IHBhcnNlU3luYyhpZCwgY29kZSwgeyBsYW5nLCBzb3VyY2VUeXBlOiAnY29tbW9uanMnIH0pO1xuICAgIGlmICghaGFzUGFyc2VFcnJvcihjb21tb25Kc0FzdCkpIHJldHVybiBjb21tb25Kc0FzdDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNQYXJzZUVycm9yKGFzdDogUmV0dXJuVHlwZTx0eXBlb2YgcGFyc2VTeW5jPik6IGJvb2xlYW4ge1xuICByZXR1cm4gYXN0LmVycm9ycy5zb21lKChlcnJvcikgPT4gZXJyb3Iuc2V2ZXJpdHkgPT09ICdFcnJvcicpO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZXJMYW5nKGlkOiBzdHJpbmcpOiAnanMnIHwgJ2pzeCcgfCAndHMnIHwgJ3RzeCcge1xuICBpZiAoaWQuZW5kc1dpdGgoJy50c3gnKSkgcmV0dXJuICd0c3gnO1xuICBpZiAoaWQuZW5kc1dpdGgoJy50cycpIHx8IGlkLmVuZHNXaXRoKCcuY3RzJykgfHwgaWQuZW5kc1dpdGgoJy5tdHMnKSkgcmV0dXJuICd0cyc7XG4gIGlmIChpZC5lbmRzV2l0aCgnLmpzeCcpKSByZXR1cm4gJ2pzeCc7XG4gIHJldHVybiAnanMnO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZXJTb3VyY2VUeXBlKGlkOiBzdHJpbmcpOiAnY29tbW9uanMnIHwgJ3VuYW1iaWd1b3VzJyB7XG4gIHJldHVybiBpZC5lbmRzV2l0aCgnLmNqcycpIHx8IGlkLmVuZHNXaXRoKCcuY3RzJykgPyAnY29tbW9uanMnIDogJ3VuYW1iaWd1b3VzJztcbn1cblxuZXhwb3J0IHR5cGUgQXN0Tm9kZSA9IHtcbiAgdHlwZTogc3RyaW5nO1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBc3ROb2RlQ2hpbGRyZW4obm9kZTogQXN0Tm9kZSk6IEFzdE5vZGVbXSB7XG4gIHJldHVybiAodmlzaXRvcktleXNbbm9kZS50eXBlXSA/PyBbXSlcbiAgICAuZmxhdE1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgQXN0Tm9kZSA9PiBpc0FzdE5vZGUodmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFzdE5vZGVQcm9wZXJ0eShub2RlOiBBc3ROb2RlLCBrZXk6IHN0cmluZyk6IEFzdE5vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgcmV0dXJuIGlzQXN0Tm9kZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFzdEFycmF5UHJvcGVydHkobm9kZTogQXN0Tm9kZSwga2V5OiBzdHJpbmcpOiBBc3ROb2RlW10ge1xuICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBBc3ROb2RlID0+IGlzQXN0Tm9kZShpdGVtKSkgOiBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXN0Tm9kZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEFzdE5vZGUge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiAodmFsdWUgYXMgQXN0Tm9kZSkudHlwZSA9PT0gJ3N0cmluZyc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFzdE5vZGUgfSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcbmltcG9ydCB7IGdldEFzdE5vZGVDaGlsZHJlbiwgaXNBc3ROb2RlLCBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gY29kZSBjb250YWlucyBhIGRlY29yYXRvciwgaWdub3JpbmcgYEBgIGluIGNvbW1lbnRzLCBzdHJpbmdzLCBhbmQgcmVnZXhlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zRGVjb3JhdG9yKGNvZGU6IHN0cmluZywgaWQgPSAnZmlsZS50cycpOiBib29sZWFuIHtcbiAgLy8gQSBkZWNvcmF0b3IgcmVxdWlyZXMgYSBsaXRlcmFsIGBAYCBldmVuIHdoZW4gaXRzIGlkZW50aWZpZXIgdXNlcyBlc2NhcGVzIHN1Y2ggYXMgYFxcdTAwNjN1c3RvbWAuXG4gIGlmICghY29kZS5pbmNsdWRlcygnQCcpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgYXN0ID0gcGFyc2VTb3VyY2VGaWxlKGlkLCBjb2RlKTtcbiAgLy8gSWYgdGhlIGNvZGUgZmFpbHMgdG8gcGFyc2UsIGxldCBCYWJlbCB0cmFuc2Zvcm0gaXQgYW5kIHJlcG9ydCBhIHByb3BlciBzeW50YXggZXJyb3IuXG4gIGlmICghYXN0KSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGlzQXN0Tm9kZShhc3QucHJvZ3JhbSkgJiYgaGFzRGVjb3JhdG9yTm9kZShhc3QucHJvZ3JhbSk7XG59XG5cbmZ1bmN0aW9uIGhhc0RlY29yYXRvck5vZGUobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlID09PSAnRGVjb3JhdG9yJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBnZXRBc3ROb2RlQ2hpbGRyZW4obm9kZSkuc29tZSgoY2hpbGQpID0+IGhhc0RlY29yYXRvck5vZGUoY2hpbGQpKTtcbn1cbiIsImltcG9ydCBNYWdpY1N0cmluZyBmcm9tICdtYWdpYy1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4sIFNvdXJjZU1hcElucHV0IH0gZnJvbSAncm9sbGRvd24nO1xuXG5pbXBvcnQgdHlwZSB7IEFzdE5vZGUgfSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcbmltcG9ydCB7XG4gIGdldEFzdEFycmF5UHJvcGVydHksXG4gIGdldEFzdE5vZGVDaGlsZHJlbixcbiAgZ2V0QXN0Tm9kZVByb3BlcnR5LFxuICBpc0FzdE5vZGUsXG4gIGlzVHJhbnNmb3JtVGFyZ2V0RmlsZSxcbiAgcGFyc2VTb3VyY2VGaWxlLFxufSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnNvbGVSZW1vdmFsRXhjbHVkZWRNZXRob2RzKCk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBlbnYgfSA9IHByb2Nlc3M7XG4gIGlmIChlbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykgcmV0dXJuIG5ldyBTZXQoWydlcnJvcicsICdpbmZvJywgJ3dhcm4nXSk7XG4gIGlmIChlbnYuTk9ERV9FTlYgPT09ICd0ZXN0JykgcmV0dXJuIG5ldyBTZXQoWydkZWJ1ZycsICdlcnJvcicsICdpbmZvJywgJ3dhcm4nXSk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDb25zb2xlUGx1Z2luKGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz4pOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdyZW1vdmUtY29uc29sZScsXG4gICAgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICBpZiAoIWlzVHJhbnNmb3JtVGFyZ2V0RmlsZShpZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAvLyBFc2NhcGVkIGlkZW50aWZpZXJzIHN1Y2ggYXMgYFxcdTAwNjNvbnNvbGVgIG11c3Qgc3RpbGwgYmUgaGFuZGxlZCwgc28gYWxzbyBtYXRjaCBgXFx1YCBlc2NhcGVzLlxuICAgICAgaWYgKCEvY29uc29sZXxcXFxcdS8udGVzdChjb2RlKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHJlbW92ZUNvbnNvbGUoY29kZSwgaWQsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ29uc29sZShjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz4pOiB7IGNvZGU6IHN0cmluZzsgbWFwOiBTb3VyY2VNYXBJbnB1dCB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYXN0ID0gcGFyc2VTb3VyY2VGaWxlKGlkLCBjb2RlKTtcbiAgaWYgKCFhc3QgfHwgIWlzQXN0Tm9kZShhc3QucHJvZ3JhbSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbWFnaWNTdHJpbmcgPSBuZXcgTWFnaWNTdHJpbmcoY29kZSk7XG4gIGNvbnN0IHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10gPSBbXTtcbiAgY29uc3Qgc2NvcGVzOiBDb25zb2xlU2NvcGVbXSA9IFtdO1xuICBjb2xsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhhc3QucHJvZ3JhbSwgW10sIHNjb3BlcywgcmVwbGFjZW1lbnRzLCBleGNsdWRlZE1ldGhvZHMpO1xuICBmb3IgKGNvbnN0IHJlcGxhY2VtZW50IG9mIHNlbGVjdENvbnNvbGVSZXBsYWNlbWVudHMocmVwbGFjZW1lbnRzKSkge1xuICAgIG1hZ2ljU3RyaW5nLm92ZXJ3cml0ZShyZXBsYWNlbWVudC5zdGFydCwgcmVwbGFjZW1lbnQuZW5kLCByZXBsYWNlbWVudC52YWx1ZSk7XG4gIH1cblxuICBpZiAoIW1hZ2ljU3RyaW5nLmhhc0NoYW5nZWQoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBtYWdpY1N0cmluZy50b1N0cmluZygpLFxuICAgIG1hcDogbWFnaWNTdHJpbmcuZ2VuZXJhdGVNYXAoeyBoaXJlczogdHJ1ZSB9KSBhcyBTb3VyY2VNYXBJbnB1dCxcbiAgfTtcbn1cblxudHlwZSBDb25zb2xlUmVwbGFjZW1lbnQgPSB7XG4gIGtpbmQ6ICdyZXBsYWNlJztcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHZhbHVlOiBzdHJpbmc7XG59O1xuXG50eXBlIENvbnNvbGVTY29wZSA9IHtcbiAgZW5kOiBudW1iZXI7XG4gIHNoYWRvd3NDb25zb2xlOiBib29sZWFuO1xuICBzdGFydDogbnVtYmVyO1xufTtcblxuY29uc3Qgbm9vcEZ1bmN0aW9uRXhwcmVzc2lvbiA9ICcoZnVuY3Rpb24gKCkge30pJztcbmNvbnN0IHVuZGVmaW5lZEV4cHJlc3Npb24gPSAnKHZvaWQgMCknO1xuXG5mdW5jdGlvbiBjb2xsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhcbiAgbm9kZTogQXN0Tm9kZSxcbiAgYW5jZXN0b3JzOiBBc3ROb2RlW10sXG4gIHNjb3BlczogQ29uc29sZVNjb3BlW10sXG4gIHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10sXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBjb25zdCBwYXJlbnQgPSBhbmNlc3RvcnMuYXQoLTEpO1xuICBjb25zdCBzY29wZSA9IGdldENvbnNvbGVTY29wZShub2RlLCBwYXJlbnQpO1xuICBpZiAoc2NvcGUpIHNjb3Blcy5wdXNoKHNjb3BlKTtcblxuICBpZiAoIWlzQ29uc29sZVNoYWRvd2VkKHNjb3Blcywgbm9kZSkgJiYgbm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nKSB7XG4gICAgY29sbGVjdENvbnNvbGVDYWxsUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIH1cbiAgaWYgKCFpc0NvbnNvbGVTaGFkb3dlZChzY29wZXMsIG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgY29sbGVjdENvbnNvbGVNZW1iZXJSZXBsYWNlbWVudChub2RlLCBhbmNlc3RvcnMsIHJlcGxhY2VtZW50cywgZXhjbHVkZWRNZXRob2RzKTtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkQW5jZXN0b3JzID0gWy4uLmFuY2VzdG9ycywgbm9kZV07XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZ2V0QXN0Tm9kZUNoaWxkcmVuKG5vZGUpKSB7XG4gICAgY29sbGVjdENvbnNvbGVSZXBsYWNlbWVudHMoY2hpbGQsIGNoaWxkQW5jZXN0b3JzLCBzY29wZXMsIHJlcGxhY2VtZW50cywgZXhjbHVkZWRNZXRob2RzKTtcbiAgfVxuXG4gIGlmIChzY29wZSkgc2NvcGVzLnBvcCgpO1xufVxuXG5mdW5jdGlvbiBnZXRDb25zb2xlU2NvcGUobm9kZTogQXN0Tm9kZSwgcGFyZW50OiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogQ29uc29sZVNjb3BlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1Byb2dyYW0nKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc1Byb2dyYW1Db25zb2xlQmluZGluZyhub2RlKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAoaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUobm9kZSkpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzRnVuY3Rpb25Db25zb2xlQmluZGluZyhub2RlKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnKSB7XG4gICAgY29uc3QgaXNGdW5jdGlvbkJvZHkgPSBwYXJlbnQgPyBpc0NvbnNvbGVGdW5jdGlvblNjb3BlTm9kZShwYXJlbnQpIDogZmFsc2U7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0Jsb2NrQ29uc29sZUJpbmRpbmcobm9kZSwgZmFsc2UpIHx8IChpc0Z1bmN0aW9uQm9keSAmJiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcobm9kZSkpLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdDYXRjaENsYXVzZScpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKG5vZGUucGFyYW0pLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdDbGFzc0V4cHJlc3Npb24nKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihub2RlLmlkKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnU3RhdGljQmxvY2snIHx8IG5vZGUudHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuZDogbm9kZS5lbmQsXG4gICAgICBzaGFkb3dzQ29uc29sZTpcbiAgICAgICAgaGFzQmxvY2tDb25zb2xlQmluZGluZyhub2RlLCBmYWxzZSkgfHxcbiAgICAgICAgaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKG5vZGUpIHx8XG4gICAgICAgIChub2RlLnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJyAmJiBoYXNOYW1lc3BhY2VDb25zb2xlQmluZGluZyhwYXJlbnQpKSxcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0LFxuICAgIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N3aXRjaFN0YXRlbWVudCcpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzU3dpdGNoQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBnZXRTd2l0Y2hTY29wZVN0YXJ0KG5vZGUpIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N3aXRjaENhc2UnKSB7XG4gICAgY29uc3Qgc3dpdGNoU2hhZG93c0NvbnNvbGUgPSBwYXJlbnQ/LnR5cGUgPT09ICdTd2l0Y2hTdGF0ZW1lbnQnICYmIGhhc1N3aXRjaENvbnNvbGVCaW5kaW5nKHBhcmVudCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuZDogbm9kZS5lbmQsXG4gICAgICBzaGFkb3dzQ29uc29sZTogc3dpdGNoU2hhZG93c0NvbnNvbGUgfHwgaGFzU3dpdGNoQ2FzZUNvbnNvbGVCaW5kaW5nKG5vZGUpLFxuICAgICAgc3RhcnQ6IGdldFN3aXRjaENhc2VTY29wZVN0YXJ0KG5vZGUpLFxuICAgIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0ZvclN0YXRlbWVudCcgfHwgbm9kZS50eXBlID09PSAnRm9ySW5TdGF0ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ0Zvck9mU3RhdGVtZW50Jykge1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNMb29wQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzUHJvZ3JhbUNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnYm9keScpKSB7XG4gICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCB0cnVlKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGhhc0hvaXN0ZWRWYXJDb25zb2xlQmluZGluZyhub2RlKTtcbn1cblxuZnVuY3Rpb24gaGFzRnVuY3Rpb25Db25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGlmIChoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4obm9kZS5pZCkpIHJldHVybiB0cnVlO1xuICBmb3IgKGNvbnN0IHBhcmFtIG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ3BhcmFtcycpKSB7XG4gICAgaWYgKGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihwYXJhbSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzQmxvY2tDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlLCBpbmNsdWRlVmFyOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ2JvZHknKSkge1xuICAgIGlmIChoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKHN0YXRlbWVudCwgaW5jbHVkZVZhcikpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzU3dpdGNoQ29uc29sZUJpbmRpbmcobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IHN3aXRjaENhc2Ugb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnY2FzZXMnKSkge1xuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldEFzdEFycmF5UHJvcGVydHkoc3dpdGNoQ2FzZSwgJ2NvbnNlcXVlbnQnKSkge1xuICAgICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCBmYWxzZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFN3aXRjaFNjb3BlU3RhcnQobm9kZTogQXN0Tm9kZSk6IG51bWJlciB7XG4gIGZvciAoY29uc3Qgc3dpdGNoQ2FzZSBvZiBnZXRBc3RBcnJheVByb3BlcnR5KG5vZGUsICdjYXNlcycpKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBnZXRTd2l0Y2hDYXNlU2NvcGVTdGFydChzd2l0Y2hDYXNlKTtcbiAgICBpZiAoc3RhcnQgPCBzd2l0Y2hDYXNlLmVuZCkgcmV0dXJuIHN0YXJ0O1xuICB9XG4gIHJldHVybiBub2RlLmVuZDtcbn1cblxuZnVuY3Rpb24gaGFzU3dpdGNoQ2FzZUNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnY29uc2VxdWVudCcpKSB7XG4gICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCBmYWxzZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3dpdGNoQ2FzZVNjb3BlU3RhcnQobm9kZTogQXN0Tm9kZSk6IG51bWJlciB7XG4gIGNvbnN0IHRlc3QgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ3Rlc3QnKTtcbiAgaWYgKHRlc3QpIHJldHVybiB0ZXN0LnN0YXJ0O1xuICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnY29uc2VxdWVudCcpWzBdPy5zdGFydCA/PyBub2RlLmVuZDtcbn1cblxuZnVuY3Rpb24gaGFzTG9vcENvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgbm9kZS50eXBlID09PSAnRm9yU3RhdGVtZW50JyA/ICdpbml0JyA6ICdsZWZ0Jyk7XG4gIHJldHVybiAhIWRlY2xhcmF0aW9uICYmIGRlY2xhcmF0aW9uLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJiBkZWNsYXJhdGlvbi5raW5kICE9PSAndmFyJyAmJiBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoZGVjbGFyYXRpb24pO1xufVxuXG5mdW5jdGlvbiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcocm9vdDogQXN0Tm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXJvb3QpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGdldEFzdE5vZGVDaGlsZHJlbihyb290KSkge1xuICAgIGlmIChjaGlsZCAhPT0gcm9vdCAmJiAoaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09ICdTdGF0aWNCbG9jaycgfHwgY2hpbGQudHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoaWxkLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJlxuICAgICAgY2hpbGQua2luZCA9PT0gJ3ZhcicgJiZcbiAgICAgIGhhc1ZhcmlhYmxlRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhjaGlsZClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNJbXBvcnRDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGlmIChub2RlLmltcG9ydEtpbmQgPT09ICd0eXBlJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnc3BlY2lmaWVycycpLnNvbWUoXG4gICAgKHNwZWNpZmllcikgPT4gc3BlY2lmaWVyLmltcG9ydEtpbmQgIT09ICd0eXBlJyAmJiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4oc3BlY2lmaWVyLmxvY2FsKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUsIGluY2x1ZGVWYXI6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBnZXRFeHBvcnREZWNsYXJhdGlvbihub2RlKSA/PyBub2RlO1xuICBpZiAoZGVjbGFyYXRpb24uZGVjbGFyZSA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ0ltcG9ydERlY2xhcmF0aW9uJykgcmV0dXJuIGhhc0ltcG9ydENvbnNvbGVCaW5kaW5nKGRlY2xhcmF0aW9uKTtcbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT09ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyB8fCBkZWNsYXJhdGlvbi50eXBlID09PSAnQ2xhc3NEZWNsYXJhdGlvbicpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGRlY2xhcmF0aW9uLmlkKTtcbiAgfVxuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ1RTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24nKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmltcG9ydEtpbmQgIT09ICd0eXBlJyAmJiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4oZGVjbGFyYXRpb24uaWQpO1xuICB9XG4gIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSAnVFNFbnVtRGVjbGFyYXRpb24nIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09ICdUU01vZHVsZURlY2xhcmF0aW9uJykge1xuICAgIHJldHVybiBoYXNMZWZ0bW9zdE1vZHVsZUlkQ29uc29sZUJpbmRpbmcoZ2V0QXN0Tm9kZVByb3BlcnR5KGRlY2xhcmF0aW9uLCAnaWQnKSk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBkZWNsYXJhdGlvbi50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdGlvbicgJiZcbiAgICAoaW5jbHVkZVZhciB8fCBkZWNsYXJhdGlvbi5raW5kICE9PSAndmFyJykgJiZcbiAgICBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoZGVjbGFyYXRpb24pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc05hbWVzcGFjZUNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGU/LnR5cGUgPT09ICdUU01vZHVsZURlY2xhcmF0aW9uJyAmJiBub2RlLmRlY2xhcmUgIT09IHRydWUgJiYgaGFzTW9kdWxlSWRDb25zb2xlQmluZGluZyhnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ2lkJykpO1xufVxuXG5mdW5jdGlvbiBoYXNMZWZ0bW9zdE1vZHVsZUlkQ29uc29sZUJpbmRpbmcoaWQ6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFpZCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInKSByZXR1cm4gaWQubmFtZSA9PT0gJ2NvbnNvbGUnO1xuICByZXR1cm4gaWQudHlwZSA9PT0gJ1RTUXVhbGlmaWVkTmFtZScgJiYgaGFzTGVmdG1vc3RNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldEFzdE5vZGVQcm9wZXJ0eShpZCwgJ2xlZnQnKSk7XG59XG5cbmZ1bmN0aW9uIGhhc01vZHVsZUlkQ29uc29sZUJpbmRpbmcoaWQ6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFpZCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInKSByZXR1cm4gaWQubmFtZSA9PT0gJ2NvbnNvbGUnO1xuICByZXR1cm4gKFxuICAgIGlkLnR5cGUgPT09ICdUU1F1YWxpZmllZE5hbWUnICYmXG4gICAgKGhhc01vZHVsZUlkQ29uc29sZUJpbmRpbmcoZ2V0QXN0Tm9kZVByb3BlcnR5KGlkLCAnbGVmdCcpKSB8fCBoYXNNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldEFzdE5vZGVQcm9wZXJ0eShpZCwgJ3JpZ2h0JykpKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnZGVjbGFyYXRpb25zJykuc29tZSgoZGVjbGFyYXRpb24pID0+XG4gICAgaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGdldEFzdE5vZGVQcm9wZXJ0eShkZWNsYXJhdGlvbiwgJ2lkJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWlzQXN0Tm9kZSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBpZiAodmFsdWUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmIHZhbHVlLm5hbWUgPT09ICdjb25zb2xlJykgcmV0dXJuIHRydWU7XG4gIGlmICh2YWx1ZS50eXBlID09PSAnQXNzaWdubWVudFBhdHRlcm4nIHx8IHZhbHVlLnR5cGUgPT09ICdSZXN0RWxlbWVudCcpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHZhbHVlLmxlZnQgPz8gdmFsdWUuYXJndW1lbnQpO1xuICB9XG4gIGlmICh2YWx1ZS50eXBlID09PSAnVFNQYXJhbWV0ZXJQcm9wZXJ0eScpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHZhbHVlLnBhcmFtZXRlcik7XG4gIH1cbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdUU1F1YWxpZmllZE5hbWUnKSB7XG4gICAgcmV0dXJuIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZS5sZWZ0KTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ0FycmF5UGF0dGVybicpIHtcbiAgICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eSh2YWx1ZSwgJ2VsZW1lbnRzJykuc29tZSgoZWxlbWVudCkgPT4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGVsZW1lbnQpKTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nKSB7XG4gICAgcmV0dXJuIGdldEFzdEFycmF5UHJvcGVydHkodmFsdWUsICdwcm9wZXJ0aWVzJykuc29tZSgocHJvcGVydHkpID0+XG4gICAgICBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4ocHJvcGVydHkudmFsdWUgPz8gcHJvcGVydHkuYXJndW1lbnQpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzQ29uc29sZUZ1bmN0aW9uU2NvcGVOb2RlKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nIHx8IG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicgfHwgbm9kZS50eXBlID09PSAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24nO1xufVxuXG5mdW5jdGlvbiBpc0NvbnNvbGVTaGFkb3dlZChzY29wZXM6IENvbnNvbGVTY29wZVtdLCBub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY29wZXMuc29tZSgoc2NvcGUpID0+IHNjb3BlLnNoYWRvd3NDb25zb2xlICYmIHNjb3BlLnN0YXJ0IDw9IG5vZGUuc3RhcnQgJiYgbm9kZS5lbmQgPD0gc2NvcGUuZW5kKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdENvbnNvbGVDYWxsUmVwbGFjZW1lbnQoXG4gIG5vZGU6IEFzdE5vZGUsXG4gIGFuY2VzdG9yczogQXN0Tm9kZVtdLFxuICByZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdLFxuICBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0xKTtcbiAgY29uc3QgY2FsbGVlID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdjYWxsZWUnKTtcbiAgaWYgKG5vZGUub3B0aW9uYWwgPT09IHRydWUpIHJldHVybjtcbiAgaWYgKCFjYWxsZWUgfHwgIWlzSW5jbHVkZWRDb25zb2xlTWVtYmVyKGNhbGxlZSwgZXhjbHVkZWRNZXRob2RzKSkge1xuICAgIGlmIChjYWxsZWUgJiYgaXNJbmNsdWRlZENvbnNvbGVCaW5kTWVtYmVyKGNhbGxlZSwgZXhjbHVkZWRNZXRob2RzKSkge1xuICAgICAgcmVwbGFjZW1lbnRzLnB1c2goeyBraW5kOiAncmVwbGFjZScsIHN0YXJ0OiBub2RlLnN0YXJ0LCBlbmQ6IG5vZGUuZW5kLCB2YWx1ZTogZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnKSB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyBraW5kOiAncmVwbGFjZScsIHN0YXJ0OiBwYXJlbnQuc3RhcnQsIGVuZDogcGFyZW50LmVuZCwgdmFsdWU6ICc7JyB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXBsYWNlbWVudHMucHVzaCh7IGtpbmQ6ICdyZXBsYWNlJywgc3RhcnQ6IG5vZGUuc3RhcnQsIGVuZDogbm9kZS5lbmQsIHZhbHVlOiBnZXRVbmRlZmluZWRFeHByZXNzaW9uUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzKSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0Q29uc29sZU1lbWJlclJlcGxhY2VtZW50KFxuICBub2RlOiBBc3ROb2RlLFxuICBhbmNlc3RvcnM6IEFzdE5vZGVbXSxcbiAgcmVwbGFjZW1lbnRzOiBDb25zb2xlUmVwbGFjZW1lbnRbXSxcbiAgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGNvbnN0IHBhcmVudCA9IGFuY2VzdG9ycy5hdCgtMSk7XG4gIGNvbnN0IGdyYW5kcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0yKTtcbiAgaWYgKCFpc0luY2x1ZGVkQ29uc29sZU1lbWJlcihub2RlLCBleGNsdWRlZE1ldGhvZHMpIHx8IHBhcmVudD8udHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSByZXR1cm47XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbicgJiYgcGFyZW50LmNhbGxlZSA9PT0gbm9kZSAmJiBwYXJlbnQub3B0aW9uYWwgIT09IHRydWUpIHJldHVybjtcbiAgaWYgKGlzQ29uc29sZUFzc2lnbm1lbnRUYXJnZXQobm9kZSwgcGFyZW50LCBncmFuZHBhcmVudCkpIHJldHVybjtcblxuICBpZiAocGFyZW50Py50eXBlID09PSAnQXNzaWdubWVudEV4cHJlc3Npb24nICYmIHBhcmVudC5sZWZ0ID09PSBub2RlKSB7XG4gICAgY29uc3QgcmlnaHQgPSBnZXRBc3ROb2RlUHJvcGVydHkocGFyZW50LCAncmlnaHQnKTtcbiAgICBpZiAocmlnaHQpIHtcbiAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogcmlnaHQuc3RhcnQsIGVuZDogcmlnaHQuZW5kLCB2YWx1ZTogZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQocmlnaHQsIGFuY2VzdG9ycykgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogbm9kZS5zdGFydCwgZW5kOiBub2RlLmVuZCwgdmFsdWU6IGdldE5vb3BGdW5jdGlvblJlcGxhY2VtZW50KG5vZGUsIGFuY2VzdG9ycykgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZEV4cHJlc3Npb25SZXBsYWNlbWVudChub2RlOiBBc3ROb2RlLCBhbmNlc3RvcnM6IEFzdE5vZGVbXSk6IHN0cmluZyB7XG4gIHJldHVybiBuZWVkc0xlYWRpbmdTdGF0ZW1lbnRTZW1pY29sb24obm9kZSwgYW5jZXN0b3JzKSA/IGA7JHt1bmRlZmluZWRFeHByZXNzaW9ufWAgOiB1bmRlZmluZWRFeHByZXNzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXROb29wRnVuY3Rpb25SZXBsYWNlbWVudChub2RlOiBBc3ROb2RlLCBhbmNlc3RvcnM6IEFzdE5vZGVbXSk6IHN0cmluZyB7XG4gIHJldHVybiBuZWVkc0xlYWRpbmdTdGF0ZW1lbnRTZW1pY29sb24obm9kZSwgYW5jZXN0b3JzKSA/IGA7JHtub29wRnVuY3Rpb25FeHByZXNzaW9ufWAgOiBub29wRnVuY3Rpb25FeHByZXNzaW9uO1xufVxuXG5mdW5jdGlvbiBuZWVkc0xlYWRpbmdTdGF0ZW1lbnRTZW1pY29sb24obm9kZTogQXN0Tm9kZSwgYW5jZXN0b3JzOiBBc3ROb2RlW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc3RhdGVtZW50SW5kZXggPSBhbmNlc3RvcnMuZmluZExhc3RJbmRleCgoYW5jZXN0b3IpID0+IGFuY2VzdG9yLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50Jyk7XG4gIGlmIChzdGF0ZW1lbnRJbmRleCA8IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdGVtZW50ID0gYW5jZXN0b3JzW3N0YXRlbWVudEluZGV4XTtcbiAgaWYgKCFzdGF0ZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdGVtZW50UGFyZW50ID0gYW5jZXN0b3JzW3N0YXRlbWVudEluZGV4IC0gMV07XG4gIHJldHVybiBzdGF0ZW1lbnQuc3RhcnQgPT09IG5vZGUuc3RhcnQgJiYgaXNTdGF0ZW1lbnRMaXN0Tm9kZShzdGF0ZW1lbnRQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiBpc1N0YXRlbWVudExpc3ROb2RlKG5vZGU6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBub2RlPy50eXBlID09PSAnUHJvZ3JhbScgfHxcbiAgICBub2RlPy50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnIHx8XG4gICAgbm9kZT8udHlwZSA9PT0gJ1N0YXRpY0Jsb2NrJyB8fFxuICAgIG5vZGU/LnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJyB8fFxuICAgIG5vZGU/LnR5cGUgPT09ICdTd2l0Y2hDYXNlJ1xuICApO1xufVxuXG5mdW5jdGlvbiBpc0NvbnNvbGVBc3NpZ25tZW50VGFyZ2V0KFxuICBub2RlOiBBc3ROb2RlLFxuICBwYXJlbnQ6IEFzdE5vZGUgfCB1bmRlZmluZWQsXG4gIGdyYW5kcGFyZW50OiBBc3ROb2RlIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ1VwZGF0ZUV4cHJlc3Npb24nICYmIHBhcmVudC5hcmd1bWVudCA9PT0gbm9kZSkgcmV0dXJuIHRydWU7XG4gIGlmICgocGFyZW50Py50eXBlID09PSAnRm9ySW5TdGF0ZW1lbnQnIHx8IHBhcmVudD8udHlwZSA9PT0gJ0Zvck9mU3RhdGVtZW50JykgJiYgcGFyZW50LmxlZnQgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICBpZiAocGFyZW50Py50eXBlID09PSAnQXJyYXlQYXR0ZXJuJykgcmV0dXJuIHRydWU7XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdBc3NpZ25tZW50UGF0dGVybicgJiYgcGFyZW50LmxlZnQgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcGFyZW50Py50eXBlID09PSAnUHJvcGVydHknICYmIHBhcmVudC52YWx1ZSA9PT0gbm9kZSAmJiBncmFuZHBhcmVudD8udHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nO1xufVxuXG5mdW5jdGlvbiBpc0luY2x1ZGVkQ29uc29sZU1lbWJlcihub2RlOiBBc3ROb2RlLCBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdNZW1iZXJFeHByZXNzaW9uJykgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IG9iamVjdCA9IGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAnb2JqZWN0Jyk7XG4gIGNvbnN0IHByb3BlcnR5ID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdwcm9wZXJ0eScpO1xuICBpZiAobm9kZS5vcHRpb25hbCA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIW9iamVjdCB8fCAhcHJvcGVydHkgfHwgaXNFeGNsdWRlZENvbnNvbGVQcm9wZXJ0eShub2RlLCBwcm9wZXJ0eSwgZXhjbHVkZWRNZXRob2RzKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihvYmplY3QpKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gKFxuICAgIG9iamVjdC50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicgJiZcbiAgICBpc0dsb2JhbENvbnNvbGVJZGVudGlmaWVyKGdldEFzdE5vZGVQcm9wZXJ0eShvYmplY3QsICdvYmplY3QnKSkgJiZcbiAgICAvLyBNYXRjaGVzIGJhYmVsLXBsdWdpbi10cmFuc2Zvcm0tcmVtb3ZlLWNvbnNvbGU6IGNhbGwvYXBwbHkgZXhjbHVzaW9ucyBhcmUgY2hlY2tlZCBvbiB0aGUgb3V0ZXIgcHJvcGVydHkgb25seS5cbiAgICBub2RlLmNvbXB1dGVkICE9PSB0cnVlICYmXG4gICAgcHJvcGVydHkudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmXG4gICAgKHByb3BlcnR5Lm5hbWUgPT09ICdjYWxsJyB8fCBwcm9wZXJ0eS5uYW1lID09PSAnYXBwbHknKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0luY2x1ZGVkQ29uc29sZUJpbmRNZW1iZXIobm9kZTogQXN0Tm9kZSwgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBvYmplY3QgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ29iamVjdCcpO1xuICBjb25zdCBwcm9wZXJ0eSA9IGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAncHJvcGVydHknKTtcbiAgaWYgKCFvYmplY3QgfHwgIXByb3BlcnR5IHx8IG9iamVjdC50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUuY29tcHV0ZWQgPT09IHRydWUgfHwgcHJvcGVydHkudHlwZSAhPT0gJ0lkZW50aWZpZXInIHx8IHByb3BlcnR5Lm5hbWUgIT09ICdiaW5kJykgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIoZ2V0QXN0Tm9kZVByb3BlcnR5KG9iamVjdCwgJ29iamVjdCcpKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjb25zb2xlTWV0aG9kID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG9iamVjdCwgJ3Byb3BlcnR5Jyk7XG4gIHJldHVybiAhIWNvbnNvbGVNZXRob2QgJiYgIWlzRXhjbHVkZWRDb25zb2xlUHJvcGVydHkob2JqZWN0LCBjb25zb2xlTWV0aG9kLCBleGNsdWRlZE1ldGhvZHMpO1xufVxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkQ29uc29sZVByb3BlcnR5KFxuICBtZW1iZXJFeHByZXNzaW9uOiBBc3ROb2RlLFxuICBwcm9wZXJ0eTogQXN0Tm9kZSxcbiAgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPlxuKTogYm9vbGVhbiB7XG4gIC8vIFRoZSByZXN0b3JlZCBiZWhhdmlvciBtYXRjaGVzIGJhYmVsLXBsdWdpbi10cmFuc2Zvcm0tcmVtb3ZlLWNvbnNvbGUsIHdob3NlIGV4Y2x1c2lvbnMgb25seSBhcHBseSB0byBpZGVudGlmaWVyIHByb3BlcnRpZXMuXG4gIHJldHVybiBtZW1iZXJFeHByZXNzaW9uLmNvbXB1dGVkICE9PSB0cnVlICYmIHByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJiBleGNsdWRlZE1ldGhvZHMuaGFzKHByb3BlcnR5Lm5hbWUgYXMgc3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihub2RlOiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBub2RlPy50eXBlID09PSAnSWRlbnRpZmllcicgJiYgbm9kZS5uYW1lID09PSAnY29uc29sZSc7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdENvbnNvbGVSZXBsYWNlbWVudHMocmVwbGFjZW1lbnRzOiBDb25zb2xlUmVwbGFjZW1lbnRbXSk6IENvbnNvbGVSZXBsYWNlbWVudFtdIHtcbiAgY29uc3Qgc2VsZWN0ZWQ6IENvbnNvbGVSZXBsYWNlbWVudFtdID0gW107XG4gIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2YgcmVwbGFjZW1lbnRzLnRvU29ydGVkKChhLCBiKSA9PiBhLnN0YXJ0IC0gYi5zdGFydCB8fCBiLmVuZCAtIGEuZW5kKSkge1xuICAgIGlmIChzZWxlY3RlZC5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXJ0IDw9IHJlcGxhY2VtZW50LnN0YXJ0ICYmIHJlcGxhY2VtZW50LmVuZCA8PSBpdGVtLmVuZCkpIGNvbnRpbnVlO1xuICAgIHNlbGVjdGVkLnB1c2gocmVwbGFjZW1lbnQpO1xuICB9XG4gIHJldHVybiBzZWxlY3RlZC50b1NvcnRlZCgoYSwgYikgPT4gYi5zdGFydCAtIGEuc3RhcnQpO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnREZWNsYXJhdGlvbihub2RlOiBBc3ROb2RlKTogQXN0Tm9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJyAmJiBub2RlLnR5cGUgIT09ICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdkZWNsYXJhdGlvbicpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbnB1dE9wdGlvbnMgfSBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgTWFnaWNTdHJpbmcgZnJvbSAnbWFnaWMtc3RyaW5nJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUGx1Z2luLCBSb2xsZG93blBsdWdpbk9wdGlvbiwgU291cmNlTWFwSW5wdXQgfSBmcm9tICdyb2xsZG93bic7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1bmRsZUJ1aWx0aW5zUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVCdWlsdGluc1BsdWdpbi5qcyc7XG5pbXBvcnQgeyBjb250YWluc0RlY29yYXRvciB9IGZyb20gJy4vZGVjb3JhdG9yRGV0ZWN0aW9uLmpzJztcbmltcG9ydCB7IGdldENvbnNvbGVSZW1vdmFsRXhjbHVkZWRNZXRob2RzLCByZW1vdmVDb25zb2xlUGx1Z2luIH0gZnJvbSAnLi9yZW1vdmVDb25zb2xlUGx1Z2luLmpzJztcbmltcG9ydCB7IGlzVHJhbnNmb3JtVGFyZ2V0RmlsZSB9IGZyb20gJy4vdHJhbnNmb3JtVXRpbHMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQbHVnaW5zKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZ1xuKTogUm9sbGRvd25QbHVnaW5PcHRpb25bXSB7XG4gIGNvbnN0IHBsdWdpbnM6IFJvbGxkb3duUGx1Z2luT3B0aW9uW10gPSBbXG4gICAgYnVuZGxlQnVpbHRpbnNQbHVnaW4oYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIGtlZXBJbXBvcnRQbHVnaW4oYXJndi5rZWVwSW1wb3J0Py5tYXAoKGl0ZW0pID0+IGl0ZW0udG9TdHJpbmcoKSkgPz8gW10pLFxuICBdO1xuICBjb25zdCBleGNsdWRlZENvbnNvbGVNZXRob2RzID0gZ2V0Q29uc29sZVJlbW92YWxFeGNsdWRlZE1ldGhvZHMoKTtcbiAgaWYgKGV4Y2x1ZGVkQ29uc29sZU1ldGhvZHMpIHtcbiAgICBwbHVnaW5zLnB1c2gocmVtb3ZlQ29uc29sZVBsdWdpbihleGNsdWRlZENvbnNvbGVNZXRob2RzKSk7XG4gIH1cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSB8fCBhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcGx1Z2lucy5wdXNoKGJhYmVsQ29yZUpzUGx1Z2luKCkpO1xuICAgIGlmICghb3V0cHV0T3B0aW9uc0xpc3Quc29tZSgob3B0cykgPT4gb3B0cy5wcmVzZXJ2ZU1vZHVsZXMpKSB7XG4gICAgICBwbHVnaW5zLnB1c2goY29tbW9uSnNSdW50aW1lUHJlbHVkZVBsdWdpbigpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGx1Z2lucy5wdXNoKGJhYmVsRGVjb3JhdG9yc1BsdWdpbigpKTtcbiAgfVxuICBwbHVnaW5zLnB1c2godGV4dFBsdWdpbigpKTtcbiAgcmV0dXJuIHBsdWdpbnM7XG59XG5cbmZ1bmN0aW9uIGtlZXBJbXBvcnRQbHVnaW4obW9kdWxlTmFtZXM6IHN0cmluZ1tdKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAna2VlcC1pbXBvcnQnLFxuICAgIHJlc29sdmVEeW5hbWljSW1wb3J0KHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG1vZHVsZU5hbWVzLmluY2x1ZGVzKHNvdXJjZSkgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYWJlbENvcmVKc1BsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4gYmFiZWxQbHVnaW4oJ2JhYmVsLWNvcmUtanMnLCAoKSA9PiB0cnVlKTtcbn1cblxuZnVuY3Rpb24gYmFiZWxEZWNvcmF0b3JzUGx1Z2luKCk6IFBsdWdpbiB7XG4gIHJldHVybiBiYWJlbFBsdWdpbignYmFiZWwtZGVjb3JhdG9ycycsIGNvbnRhaW5zRGVjb3JhdG9yKTtcbn1cblxuZnVuY3Rpb24gYmFiZWxQbHVnaW4obmFtZTogc3RyaW5nLCBzaG91bGRUcmFuc2Zvcm06IChjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcpID0+IGJvb2xlYW4pOiBQbHVnaW4ge1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQpIHtcbiAgICAgIGlmICghaXNUcmFuc2Zvcm1UYXJnZXRGaWxlKGlkKSB8fCAhc2hvdWxkVHJhbnNmb3JtKGNvZGUsIGlkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHRyYW5zZm9ybUFzeW5jIH0gPSBhd2FpdCBpbXBvcnQoJ0BiYWJlbC9jb3JlJyk7XG4gICAgICBjb25zdCBvcHRpb25zOiBJbnB1dE9wdGlvbnMgPSB7XG4gICAgICAgIGNhbGxlcjoge1xuICAgICAgICAgIG5hbWU6ICdidWlsZC10cycsXG4gICAgICAgICAgc3VwcG9ydHNEeW5hbWljSW1wb3J0OiB0cnVlLFxuICAgICAgICAgIHN1cHBvcnRzRXhwb3J0TmFtZXNwYWNlRnJvbTogdHJ1ZSxcbiAgICAgICAgICBzdXBwb3J0c1N0YXRpY0VTTTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlnRmlsZTogYmFiZWxDb25maWdQYXRoLFxuICAgICAgICBmaWxlbmFtZTogaWQsXG4gICAgICAgIHNvdXJjZU1hcHM6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3JtQXN5bmMoY29kZSwgb3B0aW9ucyk7XG4gICAgICBpZiAoIXJlc3VsdD8uY29kZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcmVzdWx0LmNvZGUsXG4gICAgICAgIG1hcDogcmVzdWx0Lm1hcCBhcyBTb3VyY2VNYXBJbnB1dCxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tbW9uSnNSdW50aW1lUHJlbHVkZVBsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdjb21tb25qcy1ydW50aW1lLXByZWx1ZGUnLFxuICAgIHJlbmRlckNodW5rKGNvZGUsIF9jaHVuaywgb3B0aW9ucykge1xuICAgICAgY29uc3QgcHJlbHVkZSA9IGdldENvbW1vbkpzUnVudGltZVByZWx1ZGUoY29kZSwgb3B0aW9ucy5mb3JtYXQpO1xuICAgICAgaWYgKCFwcmVsdWRlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBtYWdpY1N0cmluZyA9IG5ldyBNYWdpY1N0cmluZyhjb2RlKTtcbiAgICAgIG1hZ2ljU3RyaW5nLmFwcGVuZExlZnQoZ2V0UHJlbHVkZUluc2VydGlvbkluZGV4KGNvZGUpLCBgJHtwcmVsdWRlfVxcbmApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogbWFnaWNTdHJpbmcudG9TdHJpbmcoKSxcbiAgICAgICAgbWFwOiBtYWdpY1N0cmluZy5nZW5lcmF0ZU1hcCh7IGhpcmVzOiB0cnVlIH0pIGFzIFNvdXJjZU1hcElucHV0LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBjb21tb25Kc1J1bnRpbWVQcmVsdWRlID0gYHZhciBfX2NyZWF0ZT1PYmplY3QuY3JlYXRlLF9fZGVmUHJvcD1PYmplY3QuZGVmaW5lUHJvcGVydHksX19nZXRPd25Qcm9wRGVzYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLF9fZ2V0T3duUHJvcE5hbWVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLF9fZ2V0UHJvdG9PZj1PYmplY3QuZ2V0UHJvdG90eXBlT2YsX19oYXNPd25Qcm9wPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksX19jb21tb25KU01pbj0obW9kdWxlRmFjdG9yeSxtb2R1bGUpPT4oKT0+KG1vZHVsZXx8KG1vZHVsZT17ZXhwb3J0czp7fX0sbW9kdWxlRmFjdG9yeShtb2R1bGUuZXhwb3J0cyxtb2R1bGUpKSxtb2R1bGUuZXhwb3J0cyksX19jb3B5UHJvcHM9KHRvLGZyb20sZXhjZXB0LGRlc2NyaXB0b3IpPT57aWYoZnJvbSYmXCJvYmplY3RcIj09dHlwZW9mIGZyb218fFwiZnVuY3Rpb25cIj09dHlwZW9mIGZyb20pZm9yKHZhciBrZXksbmFtZXM9X19nZXRPd25Qcm9wTmFtZXMoZnJvbSksaW5kZXg9MCxsZW5ndGg9bmFtZXMubGVuZ3RoO2luZGV4PGxlbmd0aDtpbmRleCsrKWtleT1uYW1lc1tpbmRleF0sX19oYXNPd25Qcm9wLmNhbGwodG8sa2V5KXx8a2V5PT09ZXhjZXB0fHxfX2RlZlByb3AodG8sa2V5LHtnZXQ6KGtleT0+ZnJvbVtrZXldKS5iaW5kKG51bGwsa2V5KSxlbnVtZXJhYmxlOiEoZGVzY3JpcHRvcj1fX2dldE93blByb3BEZXNjKGZyb20sa2V5KSl8fGRlc2NyaXB0b3IuZW51bWVyYWJsZX0pO3JldHVybiB0b30sX190b0VTTT0obW9kLGlzTm9kZU1vZGUsdGFyZ2V0KT0+KHRhcmdldD1udWxsIT1tb2Q/X19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpOnt9LF9fY29weVByb3BzKCFpc05vZGVNb2RlJiZtb2QmJm1vZC5fX2VzTW9kdWxlP3RhcmdldDpfX2RlZlByb3AodGFyZ2V0LFwiZGVmYXVsdFwiLHt2YWx1ZTptb2QsZW51bWVyYWJsZTohMH0pLG1vZCkpO2A7XG5cbmZ1bmN0aW9uIGdldENvbW1vbkpzUnVudGltZVByZWx1ZGUoY29kZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29kZS5pbmNsdWRlcygnX19jb21tb25KU01pbicpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFJvbGxkb3duIDEuMS4yIGNhbiBlbWl0IGhlbHBlcnMgYWZ0ZXIgY29yZS1qcyB3cmFwcGVycyB0aGF0IGFscmVhZHkgY2FsbCB0aGVtLlxuICAvLyBTZWVkaW5nIHRoZSBoZWxwZXJzIGZpcnN0IHByZXZlbnRzIG1pbmlmaWVkIG91dHB1dCBmcm9tIGNhbGxpbmcgdW5pbml0aWFsaXplZCBhbGlhc2VzLlxuICBpZiAoaXNDb21tb25Kc0Zvcm1hdChmb3JtYXQpKSByZXR1cm4gY29kZS5pbmNsdWRlcygnX190b0VTTScpID8gY29tbW9uSnNSdW50aW1lUHJlbHVkZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGB2YXIgX19jb21tb25KU01pbj0obW9kdWxlRmFjdG9yeSxtb2R1bGUpPT4oKT0+KG1vZHVsZXx8KG1vZHVsZT17ZXhwb3J0czp7fX0sbW9kdWxlRmFjdG9yeShtb2R1bGUuZXhwb3J0cyxtb2R1bGUpKSxtb2R1bGUuZXhwb3J0cyk7YDtcbn1cblxuZnVuY3Rpb24gaXNDb21tb25Kc0Zvcm1hdChmb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZm9ybWF0ID09PSAnY2pzJyB8fCBmb3JtYXQgPT09ICdjb21tb25qcyc7XG59XG5cbmZ1bmN0aW9uIGdldFByZWx1ZGVJbnNlcnRpb25JbmRleChjb2RlOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBpZiAoY29kZS5zdGFydHNXaXRoKCcjIScpKSB7XG4gICAgY29uc3QgZmlyc3RMaW5lRW5kID0gY29kZS5pbmRleE9mKCdcXG4nKTtcbiAgICBpZiAoZmlyc3RMaW5lRW5kID09PSAtMSkgcmV0dXJuIGNvZGUubGVuZ3RoO1xuICAgIGluZGV4ID0gZmlyc3RMaW5lRW5kICsgMTtcbiAgfVxuXG4gIGNvbnN0IGRpcmVjdGl2ZVBhdHRlcm4gPSAvKD86KD86XCJbXlwiXFxuXSpcInwnW14nXFxuXSonKTs/XFxzKikveTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBkaXJlY3RpdmVQYXR0ZXJuLmxhc3RJbmRleCA9IGluZGV4O1xuICAgIGNvbnN0IG1hdGNoID0gZGlyZWN0aXZlUGF0dGVybi5leGVjKGNvZGUpO1xuICAgIGlmICghbWF0Y2g/LlswXSkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4ID0gZGlyZWN0aXZlUGF0dGVybi5sYXN0SW5kZXg7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGV4dFBsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd0ZXh0JyxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLmVuZHNXaXRoKCcuY3N2JykgJiYgIWlkLmVuZHNXaXRoKCcudHh0JykpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShpZCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IGBleHBvcnQgZGVmYXVsdCAke0pTT04uc3RyaW5naWZ5KGNvbnRlbnQpfTtgLFxuICAgICAgICBtb2R1bGVUeXBlOiAnanMnLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBjb3JlUHJvamVjdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvcmVDb25maWdGaWxlID0gZmluZENvbmZpZ0ZpbGUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgbGV0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhcmVudERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb3JlUHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKHByb2plY3REaXJQYXRoID09PSBjb3JlUHJvamVjdERpclBhdGgpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjb25maWdGaWxlID0gZmluZENvbmZpZ0ZpbGUocHJvamVjdERpclBhdGgpO1xuICAgICAgY29uc3Qgb3V0RGlyID0gcGF0aC5qb2luKCdkaXN0JywgZGlyZW50Lm5hbWUsICdzcmMnKTtcbiAgICAgIGlmIChjb25maWdGaWxlICYmIGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgICAgICBwcm9qZWN0cy5wdXNoKFtwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyXSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dERpciA9ICdkaXN0JztcbiAgfVxuICBwcm9qZWN0cy5wdXNoKFtjb3JlUHJvamVjdERpclBhdGgsIGNvcmVDb25maWdGaWxlLCBvdXREaXJdKTtcblxuICBsZXQgYWxsU3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0gb2YgcHJvamVjdHMpIHtcbiAgICBhbGxTdWNjZWVkZWQgJiY9IGF3YWl0IHJ1blRzZ28oYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIHBhdGguam9pbihjb3JlUHJvamVjdERpclBhdGgsIG91dERpcikpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRzZ28oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygncnVuVHNnbygpJywgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcik7XG4gIH1cblxuICBjb25zdCBjb25maWdGaWxlRGlyUGF0aCA9IHBhdGguZGlybmFtZShjb25maWdGaWxlKTtcbiAgY29uc3QgdGVtcENvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oY29uZmlnRmlsZURpclBhdGgsIGAuYnVpbGQtdHMtdHNnby4ke3Byb2Nlc3MucGlkfS4ke0RhdGUubm93KCl9Lmpzb25gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICB0ZW1wQ29uZmlnRmlsZSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KGF3YWl0IGNyZWF0ZVR5cGVTY3JpcHROYXRpdmVDb25maWcocHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpciksIHVuZGVmaW5lZCwgMilcbiAgICApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHByb2Nlc3MuZXhlY1BhdGgsIFtnZXRUc2dvUGF0aCgpLCAnLXAnLCB0ZW1wQ29uZmlnRmlsZV0sIHtcbiAgICAgIGN3ZDogcHJvamVjdERpclBhdGgsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuZXJyb3IpIHRocm93IHJldC5lcnJvcjtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA9PT0gMDtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0ZW1wQ29uZmlnRmlsZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUeXBlU2NyaXB0TmF0aXZlQ29uZmlnKFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgZW1pdERlY2xhcmF0aW9uT25seTogdHJ1ZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG5vRW1pdE9uRXJyb3I6IHRydWUsXG4gICAgb3V0RGlyLFxuICAgIHJvb3REaXI6ICdzcmMnLFxuICB9O1xuICBpZiAoYXdhaXQgdXNlc05vZGVQcm90b2NvbEltcG9ydChwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsICdzcmMnKSkpIHtcbiAgICBjb25zdCB0eXBlc0RpclBhdGggPSBmaW5kVHlwZXNEaXJQYXRoKHByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCB0eXBlcyA9IHR5cGVzRGlyUGF0aCA/IGF3YWl0IGNvbGxlY3RUeXBlUGFja2FnZXModHlwZXNEaXJQYXRoKSA6IFtdO1xuICAgIGlmICh0eXBlcy5pbmNsdWRlcygnbm9kZScpKSB7XG4gICAgICBjb21waWxlck9wdGlvbnMudHlwZXMgPSB0eXBlcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb21waWxlck9wdGlvbnMsXG4gICAgZXh0ZW5kczogdG9SZWxhdGl2ZUNvbmZpZ1BhdGgocGF0aC5kaXJuYW1lKGNvbmZpZ0ZpbGUpLCBjb25maWdGaWxlKSxcbiAgICBpbmNsdWRlOiBbJ3NyYy8qKi8qJ10sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRDb25maWdGaWxlKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSByZXR1cm4gY29uZmlnRmlsZTtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50RGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHNnb1BhdGgoKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKCdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy9wYWNrYWdlLmpzb24nKTtcbiAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgJ2JpbicsICd0c2dvLmpzJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaWYgKGF3YWl0IHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQoY2hpbGRQYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKC9cXC5bY21dP3RzeD8kLy50ZXN0KGRpcmVudC5uYW1lKSAmJiAoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY2hpbGRQYXRoLCAndXRmOCcpKS5pbmNsdWRlcygnbm9kZTonKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRUeXBlc0RpclBhdGgoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVzRGlyUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICdAdHlwZXMnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0eXBlc0RpclBhdGgpKSByZXR1cm4gdHlwZXNEaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0VHlwZVBhY2thZ2VzKHR5cGVSb290c0RpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0eXBlUm9vdHNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRpcmVudHMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9SZWxhdGl2ZUNvbmZpZ1BhdGgoZnJvbURpclBhdGg6IHN0cmluZywgdG9GaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShmcm9tRGlyUGF0aCwgdG9GaWxlUGF0aCkucmVwbGFjZUFsbChwYXRoLnNlcCwgJy8nKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHN0eWxlVGV4dCB9IGZyb20gJ25vZGU6dXRpbCc7XG5cbmltcG9ydCB7IHJvbGxkb3duLCB3YXRjaCB9IGZyb20gJ3JvbGxkb3duJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUm9sbGRvd25CdWlsZCwgUm9sbGRvd25PcHRpb25zIH0gZnJvbSAncm9sbGRvd24nO1xuaW1wb3J0IHsgb25FeGl0IH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiwgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0Q2F0ZWdvcnksIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGFsbFRhcmdldENhdGVnb3JpZXMgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBmb3JtYXREYXRlVGltZSwgZm9ybWF0RHVyYXRpb24sIGdldE5hbWVzcGFjZUFuZE5hbWUsIHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSwgYnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBhcHBCdWlsZGVyLCBmdW5jdGlvbnNCdWlsZGVyLCBsaWJCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGhhbmRsZUVycm9yIH0gZnJvbSAnLi9idW5kbGVyTG9nZ2VyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUV4dGVybmFsTWF0Y2hlciB9IGZyb20gJy4vZXh0ZXJuYWxzLmpzJztcbmltcG9ydCB7IHNldHVwUGx1Z2lucyB9IGZyb20gJy4vcGx1Z2luLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyB9IGZyb20gJy4vdHlwZVNjcmlwdC5qcyc7XG5cbmV4cG9ydCBjb25zdCBhcHA6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgYXBwQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYXBwIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYW4gYXBwJyxcbiAgYnVpbGRlcjogYXBwQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdhcHAnKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgZnVuY3Rpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZnVuY3Rpb25zIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBHQ1AvRmlyZWJhc2UgZnVuY3Rpb25zIGFwcCcsXG4gIGJ1aWxkZXI6IGZ1bmN0aW9uc0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2Lm9ubHlQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gICAgICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdmdW5jdGlvbnMnKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbGliOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGxpYkJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpYiBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgTm9kZS5qcyAvIFJlYWN0IGxpYnJhcnknLFxuICBidWlsZGVyOiBsaWJCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2xpYicpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LCB0YXJnZXRDYXRlZ29yeTogVGFyZ2V0Q2F0ZWdvcnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHw9ICdwcm9kdWN0aW9uJztcblxuICAvLyBgc2lsZW50YCBpcyBzdHJvbmdlciB0aGFuIGB2ZXJib3NlYC5cbiAgY29uc3QgdmVyYm9zZSA9ICFhcmd2LnNpbGVudCAmJiBhcmd2LnZlcmJvc2U7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gIGlmICghcGFja2FnZUpzb24pIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG5cbiAgY29uc3QgaW5wdXRzID0gdmVyaWZ5SW5wdXQoYXJndiwgY3dkLCBwYWNrYWdlRGlyUGF0aCk7XG4gIGNvbnN0IHRhcmdldERldGFpbCA9IGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeSwgaW5wdXRzLCBwYWNrYWdlRGlyUGF0aCk7XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ2FyZ3Y6JywgYXJndik7XG4gICAgY29uc29sZS5pbmZvKCdwYWNrYWdlSnNvblBhdGg6JywgcGFja2FnZUpzb25QYXRoKTtcbiAgICBjb25zb2xlLmluZm8oJ1RhcmdldCAoQ2F0ZWdvcnkpOicsIGAke3RhcmdldERldGFpbH0gKCR7dGFyZ2V0Q2F0ZWdvcnl9KWApO1xuICB9XG5cbiAgY29uc3QgW25hbWVzcGFjZV0gPSBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uKTtcbiAgY29uc3QgaXNFc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG5cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKUyA9ICcxJztcbiAgfSBlbHNlIGlmIChhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTID0gJzEnO1xuICB9XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19WRVJCT1NFID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSA9IHRhcmdldENhdGVnb3J5O1xuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfREVUQUlMID0gdGFyZ2V0RGV0YWlsO1xuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0ID0gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlRGlyUGF0aCwgaXNFc21QYWNrYWdlKTtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ091dHB1dE9wdGlvbnM6Jywgb3V0cHV0T3B0aW9uc0xpc3QpO1xuICB9XG4gIGlmIChvdXRwdXRPcHRpb25zTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IG91dHB1dCBmaWxlcy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmNoZGlyKHBhY2thZ2VEaXJQYXRoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBSb2xsZG93bk9wdGlvbnMgPSB7XG4gICAgY2hlY2tzOiB7IHByZWZlckJ1aWx0aW5GZWF0dXJlOiBmYWxzZSB9LFxuICAgIGV4dGVybmFsOiBjcmVhdGVFeHRlcm5hbE1hdGNoZXIoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlSnNvbiwgbmFtZXNwYWNlLCBwYWNrYWdlRGlyUGF0aCksXG4gICAgaW5wdXQ6XG4gICAgICB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnXG4gICAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaW5wdXRzLm1hcCgoaW5wdXQsIGluZGV4KSA9PiBbaW5kZXggPT09IDAgPyAnaW5kZXgnIDogcGF0aC5iYXNlbmFtZShpbnB1dCwgcGF0aC5leHRuYW1lKGlucHV0KSksIGlucHV0XSlcbiAgICAgICAgICApXG4gICAgICAgIDogaW5wdXRzLFxuICAgIHBsdWdpbnM6IHNldHVwUGx1Z2lucyhhcmd2LCBvdXRwdXRPcHRpb25zTGlzdCwgcGFja2FnZURpclBhdGgpLFxuICAgIHJlc29sdmU6IHtcbiAgICAgIGV4dGVuc2lvbkFsaWFzOiB7XG4gICAgICAgICcuY2pzJzogWycuY2pzJywgJy5jdHMnXSxcbiAgICAgICAgJy5qcyc6IFsnLmpzJywgJy50cycsICcudHN4J10sXG4gICAgICAgICcubWpzJzogWycubWpzJywgJy5tdHMnXSxcbiAgICAgIH0sXG4gICAgICBleHRlbnNpb25zOiBbJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCcsICcuY2pzJywgJy5tanMnLCAnLmpzJywgJy5qc3gnLCAnLmpzb24nXSxcbiAgICB9LFxuICAgIHRyZWVzaGFrZTogYXJndlsnY29yZS1qcyddIHx8IGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10gPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICB0cmFuc2Zvcm06IGdldFRyYW5zZm9ybU9wdGlvbnMoYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIHdhdGNoOiBhcmd2LndhdGNoID8geyBjbGVhclNjcmVlbjogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgfTtcblxuICBjb25zdCBwYXRoVG9SZWxhdGl2ZVBhdGggPSAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHN0cmluZ1tdID0+XG4gICAgKEFycmF5LmlzQXJyYXkocGF0aHMpID8gcGF0aHMgOiBbcGF0aHNdKS5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHApKTtcbiAgY29uc3QgcHJpbnRCdW5kbGluZ01lc3NhZ2UgPSAoaW5wdXRQYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KTogdm9pZCA9PiB7XG4gICAgY29uc3Qgb3V0cHV0UGF0aHMgPSBwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKTtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBzdHlsZVRleHQoXG4gICAgICAgICdjeWFuJyxcbiAgICAgICAgYEJ1bmRsZXMgJHtzdHlsZVRleHQoJ2JvbGQnLCBwYXRoVG9SZWxhdGl2ZVBhdGgoaW5wdXRQYXRocykuam9pbignLCAnKSl9IOKGkiAke3N0eWxlVGV4dChcbiAgICAgICAgICAnYm9sZCcsXG4gICAgICAgICAgb3V0cHV0UGF0aHMuam9pbignLCAnKVxuICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgIClcbiAgICApO1xuICB9O1xuICBpZiAoYXJndi53YXRjaCkge1xuICAgIHdhdGNoUm9sbGRvd24oYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlRGlyUGF0aCwgb3B0aW9ucywgb3V0cHV0T3B0aW9uc0xpc3QsIHBhdGhUb1JlbGF0aXZlUGF0aCwgcHJpbnRCdW5kbGluZ01lc3NhZ2UpO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIHByaW50QnVuZGxpbmdNZXNzYWdlKGlucHV0cyk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbGRvd25CdWlsZCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnVpbGRGYWlsZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IF9idW5kbGUgPSBhd2FpdCByb2xsZG93bihvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAgICAgJ2dyZWVuJyxcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtzdHlsZVRleHQoJ2JvbGQnLCBmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJlxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJyAmJlxuICAgICAgIShhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgpKVxuICAgICkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2Zvcm1PcHRpb25zKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogUm9sbGRvd25PcHRpb25zWyd0cmFuc2Zvcm0nXSB7XG4gIHJldHVybiB7XG4gICAgZGVmaW5lOiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2F0Y2hSb2xsZG93bihcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHRhcmdldERldGFpbDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSb2xsZG93bk9wdGlvbnMsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10sXG4gIHBhdGhUb1JlbGF0aXZlUGF0aDogKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pID0+IHN0cmluZ1tdLFxuICBwcmludEJ1bmRsaW5nTWVzc2FnZTogKGlucHV0UGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPikgPT4gdm9pZFxuKTogdm9pZCB7XG4gIGNvbnN0IHdhdGNoZXIgPSB3YXRjaCh7IC4uLm9wdGlvbnMsIG91dHB1dDogb3V0cHV0T3B0aW9uc0xpc3QgfSk7XG5cbiAgY29uc3QgY2xvc2UgPSBhc3luYyAoY29kZT86IG51bWJlciB8IG51bGwpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlT25VbmNhdWdodEV4Y2VwdGlvbik7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xvc2VPblN0ZGluRW5kKTtcbiAgICBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgaWYgKGNvZGUpIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfTtcbiAgY29uc3QgY2xvc2VPblVuY2F1Z2h0RXhjZXB0aW9uID0gKGVycm9yOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgdm9pZCBjbG9zZSgxKTtcbiAgfTtcbiAgY29uc3QgY2xvc2VPblN0ZGluRW5kID0gKCk6IHZvaWQgPT4ge1xuICAgIHZvaWQgY2xvc2UoKTtcbiAgfTtcbiAgb25FeGl0KChjb2RlKSA9PiB2b2lkIGNsb3NlKGNvZGUpKTtcbiAgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZU9uVW5jYXVnaHRFeGNlcHRpb24pO1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBjbG9zZU9uU3RkaW5FbmQpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG4gIH1cblxuICB3YXRjaGVyLm9uKCdldmVudCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmNvZGUpIHtcbiAgICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IoZXZlbnQuZXJyb3IsIHRydWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0JVTkRMRV9TVEFSVCc6IHtcbiAgICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgICAgcHJpbnRCdW5kbGluZ01lc3NhZ2UoZ2V0SW5wdXRGaWxlcyhvcHRpb25zLmlucHV0KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQlVORExFX0VORCc6IHtcbiAgICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAgICAgICAnZ3JlZW4nLFxuICAgICAgICAgICAgICBgQ3JlYXRlZCAke3N0eWxlVGV4dCgnYm9sZCcsIHBhdGhUb1JlbGF0aXZlUGF0aChldmVudC5vdXRwdXQpLmpvaW4oJywgJykpfSBpbiAke3N0eWxlVGV4dChcbiAgICAgICAgICAgICAgICAnYm9sZCcsXG4gICAgICAgICAgICAgICAgZm9ybWF0RHVyYXRpb24oZXZlbnQuZHVyYXRpb24pXG4gICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmIHRhcmdldERldGFpbCAhPT0gJ2Z1bmN0aW9ucycpIHtcbiAgICAgICAgICAgIGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0VORCc6IHtcbiAgICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgICAgY29uc29sZS5pbmZvKGBcXG5bJHtmb3JtYXREYXRlVGltZShuZXcgRGF0ZSgpKX1dIHdhaXRpbmcgZm9yIGNoYW5nZXMuLi5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBLZWVwIHRoZSB3YXRjaGVyIGFsaXZlIGV2ZW4gaWYgaGFuZGxpbmcgYW4gZXZlbnQgKGUuZy4gZGVjbGFyYXRpb24gZmlsZSBnZW5lcmF0aW9uKSBmYWlscy5cbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBoYW5kbGUgd2F0Y2ggZXZlbnQgZHVlIHRvOicsIGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCdyZXN1bHQnIGluIGV2ZW50ICYmIGV2ZW50LnJlc3VsdCkge1xuICAgICAgICB2b2lkIGV2ZW50LnJlc3VsdC5jbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldElucHV0RmlsZXMoaW5wdXQ6IFJvbGxkb3duT3B0aW9uc1snaW5wdXQnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIFtdO1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgcmV0dXJuIFtpbnB1dF07XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IGlucHV0IDogT2JqZWN0LnZhbHVlcyhpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUlucHV0KGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LCBjd2Q6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3YuaW5wdXQgJiYgYXJndi5pbnB1dC5sZW5ndGggPiAwKSByZXR1cm4gYXJndi5pbnB1dC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZShjd2QsIHAudG9TdHJpbmcoKSkpO1xuXG4gIGNvbnN0IHNyY0RpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKTtcbiAgZm9yIChjb25zdCBleHQgb2YgWyd0cycsICd0c3gnLCAnY3RzJywgJ210cyddKSB7XG4gICAgY29uc3QgaW5wdXQgPSBwYXRoLmpvaW4oc3JjRGlyUGF0aCwgYGluZGV4LiR7ZXh0fWApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGlucHV0KSkgcmV0dXJuIFtpbnB1dF07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IGlucHV0IGZpbGUuJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5OiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10sIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBUYXJnZXREZXRhaWwge1xuICBzd2l0Y2ggKHRhcmdldENhdGVnb3J5KSB7XG4gICAgY2FzZSAnYXBwJzoge1xuICAgICAgcmV0dXJuICdhcHAtbm9kZSc7XG4gICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9ucyc6IHtcbiAgICAgIHJldHVybiAnZnVuY3Rpb25zJztcbiAgICB9XG4gICAgY2FzZSAnbGliJzoge1xuICAgICAgaWYgKGlucHV0cy5zb21lKChpbnB1dCkgPT4gaW5wdXQuZW5kc1dpdGgoJy50c3gnKSkgfHwgZG9lc1NyY0NvbnRhaW5Uc3gocGFja2FnZURpclBhdGgpKSB7XG4gICAgICAgIHJldHVybiAnbGliLXJlYWN0JztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnbGliJztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc29sZS5lcnJvcigndGFyZ2V0IG9wdGlvbiBtdXN0IGJlIG9uZSBvZjogJyArIGFsbFRhcmdldENhdGVnb3JpZXMuam9pbignLCAnKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRvZXNTcmNDb250YWluVHN4KHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICByZXR1cm4gZG9lc0RpcmVjdG9yeUNvbnRhaW5Uc3goc3JjRGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNEaXJlY3RvcnlDb250YWluVHN4KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGVudHJpZXMuc29tZSgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSByZXR1cm4gZG9lc0RpcmVjdG9yeUNvbnRhaW5Uc3goZW50cnlQYXRoKTtcbiAgICAgIHJldHVybiBlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKCcudHN4Jyk7XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHBhY2thZ2VKc29uLm5hbWUgKz0gJy1kaXN0JztcbiAgY29uc3QgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICBjb25zdCBlc21PdXRwdXQgPSBpc0VzbU91dHB1dChlc21QYWNrYWdlLCBtb2R1bGVUeXBlKTtcbiAgcGFja2FnZUpzb24ubWFpbiA9IGVzbVBhY2thZ2UgPT09IGVzbU91dHB1dCA/ICdpbmRleC5qcycgOiBlc21PdXRwdXQgPyAnaW5kZXgubWpzJyA6ICdpbmRleC5janMnO1xuXG4gIC8vIFByZXZlbnQgRmlyZWJhc2UgRnVuY3Rpb25zIGZyb20gcnVubmluZyBgYnVpbGRgIHNjcmlwdCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cztcbiAgLy8gZGV2RGVwZW5kZW5jaWVzIGFyZSBub3QgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcblxuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuXG4pOiBPdXRwdXRPcHRpb25zW10ge1xuICBjb25zdCBvdXREaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICBjb25zdCBlc21PdXRwdXQgPSBpc0VzbU91dHB1dChpc0VzbVBhY2thZ2UsIGFyZ3YubW9kdWxlVHlwZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgICBmb3JtYXQ6IGVzbU91dHB1dCA/ICdtb2R1bGUnIDogJ2NvbW1vbmpzJyxcbiAgICAgICAgbWluaWZ5OiBhcmd2Lm1pbmlmeSxcbiAgICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCAmJiAnaW5saW5lJyxcbiAgICAgICAgc3RyaWN0OiAhZXNtT3V0cHV0LFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBpbXBvcnQgc3RhdGVtZW50IGluIGFuIGVzbSBtb2R1bGUgY2F1c2VzIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gIC8vIFN0YXRlbWVudDpcbiAgLy8gICBpbXBvcnQgeyB1c2VQcmV2aW91cyB9IGZyb20gJ3JlYWN0LXVzZSc7XG4gIC8vIEVycm9yOlxuICAvLyAgIE5hbWVkIGV4cG9ydCAndXNlUHJldmlvdXMnIG5vdCBmb3VuZC4gVGhlIHJlcXVlc3RlZCBtb2R1bGUgJ3JlYWN0LXVzZScgaXMgYSBDb21tb25KUyBtb2R1bGUsXG4gIC8vICAgd2hpY2ggbWF5IG5vdCBzdXBwb3J0IGFsbCBtb2R1bGUuZXhwb3J0cyBhcyBuYW1lZCBleHBvcnRzLlxuICAvLyBXZSBuZWVkIGNqcyBtb2R1bGVzIGZvciB3ZWIgYXBwcyB0byBhdm9pZCB0aGUgZXJyb3IuXG4gIC8vIEFsc28sIHNwbGl0dGluZyBhIGxpYnJhcnkgaXMgdXNlZnVsIGluIGJvdGggbW9kdWxlcywgc28gcHJlc2VydmVNb2R1bGVzIHNob3VsZCBiZSB0cnVlLlxuICBjb25zdCBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdID0gW107XG4gIGNvbnN0IG1vZHVsZVR5cGUgPSBhcmd2Lm1vZHVsZVR5cGUgfHwgJ2JvdGgnO1xuICBjb25zdCBqc0V4dCA9IGFyZ3YuanNFeHRlbnNpb24gfHwgJ2VpdGhlcic7XG4gIGlmIChtb2R1bGVUeXBlID09PSAnY2pzJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLmNqcycsXG4gICAgICBmb3JtYXQ6ICdjb21tb25qcycsXG4gICAgICBtaW5pZnk6IGFyZ3YubWluaWZ5LFxuICAgICAgcHJlc2VydmVNb2R1bGVzOiB0cnVlLFxuICAgICAgcHJlc2VydmVNb2R1bGVzUm9vdDogcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyksXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgICAgc3RyaWN0OiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIGlmIChtb2R1bGVUeXBlID09PSAnZXNtJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5tanMnLFxuICAgICAgZm9ybWF0OiAnbW9kdWxlJyxcbiAgICAgIG1pbmlmeTogYXJndi5taW5pZnksXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXNSb290OiBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dE9wdGlvbnNMaXN0O1xufVxuXG5mdW5jdGlvbiBpc0VzbU91dHB1dChpc0VzbVBhY2thZ2U6IGJvb2xlYW4sIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgKCghbW9kdWxlVHlwZSB8fCBtb2R1bGVUeXBlID09PSAnZWl0aGVyJykgJiYgaXNFc21QYWNrYWdlKTtcbn1cbiIsImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUgfSBmcm9tICcuLi9lbnYuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBydW46IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncnVuIDxmaWxlPicsXG4gIGRlc2NyaWJlOiAnUnVuIHNjcmlwdCcsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwcm9jZXNzLmN3ZCgpKTtcblxuICAgIGNvbnN0IGZpbGUgPSBhcmd2LmZpbGU/LnRvU3RyaW5nKCkgPz8gJyc7XG5cbiAgICAvLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICAgIGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW47XG4gICAgY29uc3QgcnVudGltZSA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAnbm9kZSc7XG4gICAgY29uc3QgYXJncyA9IGlzUnVubmluZ09uQnVuID8gWyctLWJ1biddIDogWyctLW5vLXdhcm5pbmdzJywgJy0taW1wb3J0JywgJ3RzeCddO1xuICAgIGlmIChhcmd2LndhdGNoKSB7XG4gICAgICBhcmdzLnB1c2goJy0td2F0Y2gnKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKGZpbGUpO1xuICAgIGNvbnN0IFssIC4uLmFkZGl0aW9uYWxBcmd1bWVudHNdID0gYXJndi5fO1xuICAgIGNvbnN0IHJ1bnRpbWVBcmdzID0gWy4uLmFyZ3MsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHMubWFwKChhcmcpID0+IGFyZy50b1N0cmluZygpKV07XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nICcke3J1bnRpbWV9ICR7cnVudGltZUFyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocnVudGltZSwgcnVudGltZUFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYgfSxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGFwcCwgZnVuY3Rpb25zLCBsaWIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkLmpzJztcbmltcG9ydCB7IHJ1biB9IGZyb20gJy4vY29tbWFuZHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBnZXRCdWlsZFRzUm9vdFBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxucmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnYnVpbGQtdHMnKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLmNvbW1hbmQoYXBwKVxuICAuY29tbWFuZChmdW5jdGlvbnMpXG4gIC5jb21tYW5kKGxpYilcbiAgLmNvbW1hbmQocnVuKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihnZXRCdWlsZFRzUm9vdFBhdGgoKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cbiJdLCJtYXBwaW5ncyI6IjZtQkFNQSxJQUFJLEVBS0osU0FBZ0IsRUFDZCxFQUNBLEVBQ29DLENBT3BDLE9BTkssSUFDSCxFQUFVLEVBQWlDLEVBQU0sQ0FBRyxFQUNoRCxFQUFLLFNBQ1AsUUFBUSxLQUFLLG1CQUFvQixPQUFPLEtBQUssQ0FBTyxDQUFDLEdBR2xELENBQ1QsQ0FLQSxTQUFnQixHQUNkLEVBQ0EsRUFDd0IsQ0FDeEIsSUFBTSxFQUFxQyxDQUFDLEVBQ3RDLEVBQWMsSUFBSSxJQUFJLENBQzFCLElBQUksRUFBSyxRQUFVLENBQUMsRUFBQSxDQUFHLFFBQVMsR0FBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzdELEdBQUksRUFBSyxXQUFhLE9BQU8sS0FBSyxFQUFrQyxFQUFNLENBQUcsQ0FBQyxFQUFJLENBQUMsQ0FDckYsQ0FBQyxFQUNELElBQUssSUFBTSxLQUFRLEVBQ2IsUUFBUSxJ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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "build-ts",
3
- "version": "17.1.29",
3
+ "version": "17.1.31",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/WillBooster/build-ts.git"
@@ -30,45 +30,38 @@
30
30
  "verify-full": "wb verify --full"
31
31
  },
32
32
  "dependencies": {
33
- "@babel/core": "7.29.7",
34
- "@babel/plugin-proposal-decorators": "7.29.7",
35
- "@babel/plugin-proposal-explicit-resource-management": "7.27.4",
36
- "@babel/plugin-syntax-import-attributes": "7.29.7",
37
- "@babel/preset-env": "7.29.7",
38
- "@babel/preset-react": "7.29.7",
39
- "@babel/preset-typescript": "7.29.7",
33
+ "@babel/core": "8.0.1",
34
+ "@babel/plugin-proposal-decorators": "8.0.2",
35
+ "@babel/plugin-transform-explicit-resource-management": "8.0.1",
36
+ "@babel/preset-env": "8.0.2",
37
+ "@babel/preset-react": "8.0.1",
38
+ "@babel/preset-typescript": "8.0.1",
40
39
  "@typescript/native-preview": "7.0.0-dev.20260620.1",
41
40
  "@willbooster/shared-lib-node": "8.5.23",
42
- "babel-plugin-polyfill-corejs3": "0.14.2",
43
- "chalk": "5.6.2",
41
+ "babel-plugin-polyfill-corejs3": "1.0.0",
44
42
  "core-js": "3.49.0",
45
43
  "core-js-pure": "3.49.0",
46
- "date-time": "4.0.0",
47
44
  "magic-string": "0.30.21",
48
45
  "oxc-parser": "0.137.0",
49
- "pretty-ms": "9.3.0",
50
46
  "rolldown": "1.1.2",
51
47
  "signal-exit": "4.1.0",
52
- "terser": "5.48.0",
53
48
  "tsx": "4.22.4",
54
49
  "yargs": "18.0.0"
55
50
  },
56
51
  "devDependencies": {
57
52
  "@tsconfig/node-lts": "24.0.0",
58
53
  "@tsconfig/node-ts": "23.6.4",
59
- "@types/babel__core": "7.20.5",
60
54
  "@types/node": "26.0.1",
61
- "@types/signal-exit": "4.0.0",
62
55
  "@types/yargs": "17.0.35",
63
56
  "@willbooster/oxfmt-config": "1.2.2",
64
57
  "@willbooster/oxlint-config": "1.4.8",
65
- "@willbooster/wb": "13.22.18",
66
- "build-ts": "17.1.28",
58
+ "@willbooster/wb": "13.22.19",
59
+ "build-ts": "17.1.30",
67
60
  "conventional-changelog-conventionalcommits": "9.3.1",
68
61
  "lefthook": "2.1.9",
69
- "oxfmt": "0.56.0",
70
- "oxlint": "1.71.0",
71
- "oxlint-tsgolint": "0.23.0",
62
+ "oxfmt": "0.57.0",
63
+ "oxlint": "1.72.0",
64
+ "oxlint-tsgolint": "0.24.0",
72
65
  "semantic-release": "25.0.5",
73
66
  "sort-package-json": "4.0.0",
74
67
  "type-fest": "5.7.0",