@mnaoumov/obsidian-dev-toolkit 3.2.0 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +3 -77
- package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +3 -76
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild.cjs +1 -75
- package/dist/lib/cjs/bundlers/index.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +32 -85
- package/dist/lib/cjs/bundlers/parcel.cjs +112 -81
- package/dist/lib/cjs/bundlers/parcel.d.cts +13 -6
- package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +1 -75
- package/dist/lib/cjs/bundlers/rollup-compatible.cjs +1 -75
- package/dist/lib/cjs/bundlers/rollup.cjs +1 -75
- package/dist/lib/cjs/bundlers/vite.cjs +1 -75
- package/dist/lib/cjs/bundlers/webpack.cjs +3 -77
- package/dist/lib/cjs/demo-vault-app-json.cjs +1 -75
- package/dist/lib/cjs/demo-vault-buttons.cjs +1 -75
- package/dist/lib/cjs/demo-vault-cli.cjs +1 -75
- package/dist/lib/cjs/demo-vault-coverage.cjs +1 -75
- package/dist/lib/cjs/demo-vault.cjs +3 -77
- package/dist/lib/cjs/docs-site/index.cjs +1 -75
- package/dist/lib/cjs/docs-site/obsidian-external-type-links.cjs +1 -75
- package/dist/lib/cjs/formatters/dprint.cjs +1 -75
- package/dist/lib/cjs/formatters/index.cjs +1 -75
- package/dist/lib/cjs/index.cjs +1 -75
- package/dist/lib/cjs/integration-test-setup.cjs +1 -75
- package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +1 -75
- package/dist/lib/cjs/jest-setup.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-config.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +2 -77
- package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-toolkit-plugin.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +1 -75
- package/dist/lib/cjs/linters/eslint.cjs +1 -75
- package/dist/lib/cjs/linters/index.cjs +1 -75
- package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +1 -75
- package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +1 -75
- package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +1 -75
- package/dist/lib/cjs/linters/markdownlint.cjs +1 -75
- package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +1 -75
- package/dist/lib/cjs/linters/plugin-names.cjs +1 -75
- package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +1 -75
- package/dist/lib/cjs/setup.cjs +1 -75
- package/dist/lib/cjs/templates.cjs +3 -77
- package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +1 -75
- package/dist/lib/cjs/test-runners/coverage-badge.cjs +1 -75
- package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +1 -75
- package/dist/lib/cjs/test-runners/index.cjs +1 -75
- package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +3 -77
- package/dist/lib/cjs/test-runners/jest-config.cjs +1 -75
- package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +1 -75
- package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +4 -75
- package/dist/lib/cjs/test-runners/performance-eval-cap.d.cts +12 -3
- package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +1 -75
- package/dist/lib/cjs/test-runners/vitest-config.cjs +4 -80
- package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +1 -75
- package/dist/lib/cjs/version.cjs +1 -75
- package/dist/lib/cjs/vitest-setup.cjs +1 -75
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +3 -2
- package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +32 -15
- package/dist/lib/esm/bundlers/parcel.d.mts +13 -6
- package/dist/lib/esm/bundlers/parcel.mjs +110 -5
- package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +2 -2
- package/dist/lib/esm/test-runners/performance-eval-cap.d.mts +12 -3
- package/dist/lib/esm/test-runners/performance-eval-cap.mjs +3 -1
- package/dist/lib/esm/test-runners/vitest-config.mjs +4 -5
- package/package.json +2 -1
|
@@ -68,6 +68,7 @@ const RESOLVER_FILE_NAME = "obsidian-plugin-resolver.cjs";
|
|
|
68
68
|
const NAMER_FILE_NAME = "obsidian-plugin-namer.cjs";
|
|
69
69
|
const INLINE_IMPORTS_FILE_NAME = "obsidian-plugin-inline-imports.cjs";
|
|
70
70
|
const OPTIMIZER_FILE_NAME = "obsidian-plugin-optimizer.cjs";
|
|
71
|
+
const PRE_MINIFY_FILE_NAME = "obsidian-plugin-pre-minify.cjs";
|
|
71
72
|
const FEATURES_FILE_NAME = "obsidian-plugin-features.cjs";
|
|
72
73
|
const JSON_INDENT = 2;
|
|
73
74
|
async function build(options) {
|
|
@@ -144,7 +145,7 @@ function getParcelConfigFiles(params) {
|
|
|
144
145
|
extends: consumerParcelrcPath ?? "@parcel/config-default",
|
|
145
146
|
namers: [`./${NAMER_FILE_NAME}`, "..."],
|
|
146
147
|
optimizers: {
|
|
147
|
-
"*.js": ["...", `./${OPTIMIZER_FILE_NAME}`]
|
|
148
|
+
"*.js": [`./${PRE_MINIFY_FILE_NAME}`, "...", `./${OPTIMIZER_FILE_NAME}`]
|
|
148
149
|
},
|
|
149
150
|
resolvers: [`./${RESOLVER_FILE_NAME}`, "..."],
|
|
150
151
|
transformers
|
|
@@ -284,20 +285,123 @@ module.exports = new Optimizer({
|
|
|
284
285
|
`,
|
|
285
286
|
[PARCELRC]: `${JSON.stringify(parcelrc, null, JSON_INDENT)}
|
|
286
287
|
`,
|
|
287
|
-
|
|
288
|
+
// `String.raw`, so the line breaks below reach the file as escapes.
|
|
289
|
+
[PRE_MINIFY_FILE_NAME]: String.raw`/*
|
|
290
|
+
* Generated by @mnaoumov/obsidian-dev-toolkit. Runs before parcel's own optimizers, on the JavaScript bundle.
|
|
291
|
+
*
|
|
292
|
+
* A scope-hoisted library bundle require()s every bundle it references, the stylesheet included, and Obsidian
|
|
293
|
+
* loads styles.css itself, beside main.js, where a require() cannot reach it. The line is blanked rather than
|
|
294
|
+
* removed, so a source map still lines up.
|
|
295
|
+
*
|
|
296
|
+
* A scope-hoisted CommonJS bundle also declares every module's bindings at its top level, under long names such
|
|
297
|
+
* as $c5899aeb4caadf27$var$taskIdCounter, and parcel minifies it as a script, where the minifier may not rename
|
|
298
|
+
* a top-level binding, since in a script it is a global. Obsidian evaluates main.js as the body of a function, so
|
|
299
|
+
* wrapping the bundle in an arrow function changes nothing at runtime (an arrow keeps this and arguments) and
|
|
300
|
+
* lets the minifier rename all of them: Solid's fixture build is 70 KB without this and 10 KB with it.
|
|
301
|
+
*/
|
|
302
|
+
const { Optimizer } = require('@parcel/plugin');
|
|
303
|
+
|
|
304
|
+
const STYLESHEET_REQUIRE = ${JSON.stringify(`require('./${ObsidianPluginRepoPaths.StylesCss}');
|
|
305
|
+
`)};
|
|
306
|
+
|
|
307
|
+
async function readContents(contents) {
|
|
308
|
+
if (typeof contents === 'string') {
|
|
309
|
+
return contents;
|
|
310
|
+
}
|
|
311
|
+
if (Buffer.isBuffer(contents)) {
|
|
312
|
+
return contents.toString('utf-8');
|
|
313
|
+
}
|
|
314
|
+
const chunks = [];
|
|
315
|
+
for await (const chunk of contents) {
|
|
316
|
+
chunks.push(Buffer.from(chunk));
|
|
317
|
+
}
|
|
318
|
+
return Buffer.concat(chunks).toString('utf-8');
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
module.exports = new Optimizer({
|
|
322
|
+
async optimize({ bundle, contents, map }) {
|
|
323
|
+
const code = (await readContents(contents)).replace(STYLESHEET_REQUIRE, '\n');
|
|
324
|
+
if (!bundle.env.shouldOptimize) {
|
|
325
|
+
return { contents: code, map };
|
|
326
|
+
}
|
|
327
|
+
if (map) {
|
|
328
|
+
map.offsetLines(1, 1);
|
|
329
|
+
}
|
|
330
|
+
return { contents: '(() => {\n' + code + '\n})();\n', map };
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
`,
|
|
334
|
+
[RESOLVER_FILE_NAME]: `/*
|
|
335
|
+
* Generated by @mnaoumov/obsidian-dev-toolkit. Leaves the modules Obsidian supplies at runtime to require(), and
|
|
336
|
+
* resolves everything else the way @parcel/resolver-default does, with the browser's export conditions.
|
|
337
|
+
*
|
|
338
|
+
* Parcel resolves an electron-renderer target with the node and electron conditions beside browser, and an exports
|
|
339
|
+
* map is matched in the package's own key order, so a package listing node first (Vue, Svelte, Solid, fflate) would
|
|
340
|
+
* hand over its Node build: several times the code, and one that may not load on mobile. The Node builtins need no
|
|
341
|
+
* node condition to stay external, since they are in the externals below.
|
|
342
|
+
*/
|
|
288
343
|
const { Resolver } = require('@parcel/plugin');
|
|
344
|
+
const { dirname } = require('node:path');
|
|
289
345
|
|
|
290
346
|
const EXTERNALS = new Set(${JSON.stringify(OBSIDIAN_PLUGIN_EXTERNALS)});
|
|
291
347
|
|
|
348
|
+
function getBrowserEnvironment(env) {
|
|
349
|
+
return {
|
|
350
|
+
context: env.context,
|
|
351
|
+
id: env.id + ':obsidian-dev-toolkit-browser-conditions',
|
|
352
|
+
includeNodeModules: env.includeNodeModules,
|
|
353
|
+
isBrowser: () => true,
|
|
354
|
+
isElectron: () => false,
|
|
355
|
+
isLibrary: env.isLibrary,
|
|
356
|
+
isNode: () => false,
|
|
357
|
+
isWorker: () => env.isWorker(),
|
|
358
|
+
isWorklet: () => env.isWorklet()
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
|
|
292
362
|
function getPackageName(specifier) {
|
|
293
363
|
const segments = specifier.split('/');
|
|
294
364
|
return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : segments[0];
|
|
295
365
|
}
|
|
296
366
|
|
|
367
|
+
// @parcel/node-resolver-core is what @parcel/resolver-default runs, reached through the packages that install it.
|
|
368
|
+
function loadNodeResolver() {
|
|
369
|
+
let folder = __dirname;
|
|
370
|
+
for (const packageName of ['@parcel/config-default', '@parcel/resolver-default']) {
|
|
371
|
+
folder = dirname(require.resolve(packageName + '/package.json', { paths: [folder] }));
|
|
372
|
+
}
|
|
373
|
+
return require(require.resolve('@parcel/node-resolver-core', { paths: [folder] })).default;
|
|
374
|
+
}
|
|
375
|
+
|
|
297
376
|
module.exports = new Resolver({
|
|
298
|
-
|
|
377
|
+
async loadConfig({ config, logger, options }) {
|
|
378
|
+
const packageConfig = await config.getConfig([], { packageKey: '@parcel/resolver-default' });
|
|
379
|
+
const NodeResolver = loadNodeResolver();
|
|
380
|
+
return new NodeResolver({
|
|
381
|
+
fs: options.inputFS,
|
|
382
|
+
logger,
|
|
383
|
+
mode: options.mode,
|
|
384
|
+
packageExports: packageConfig?.contents?.packageExports ?? false,
|
|
385
|
+
packageManager: options.packageManager,
|
|
386
|
+
projectRoot: options.projectRoot,
|
|
387
|
+
shouldAutoInstall: options.shouldAutoInstall
|
|
388
|
+
});
|
|
389
|
+
},
|
|
390
|
+
resolve({ config: nodeResolver, dependency, specifier }) {
|
|
299
391
|
const isExternal = specifier.startsWith('node:') || EXTERNALS.has(specifier) || EXTERNALS.has(getPackageName(specifier));
|
|
300
|
-
|
|
392
|
+
if (isExternal) {
|
|
393
|
+
return { isExcluded: true };
|
|
394
|
+
}
|
|
395
|
+
return nodeResolver.resolve({
|
|
396
|
+
env: getBrowserEnvironment(dependency.env),
|
|
397
|
+
filename: specifier,
|
|
398
|
+
loc: dependency.loc,
|
|
399
|
+
packageConditions: dependency.packageConditions,
|
|
400
|
+
parent: dependency.resolveFrom,
|
|
401
|
+
range: dependency.range,
|
|
402
|
+
sourcePath: dependency.sourcePath,
|
|
403
|
+
specifierType: dependency.specifierType
|
|
404
|
+
});
|
|
301
405
|
}
|
|
302
406
|
});
|
|
303
407
|
`
|
|
@@ -323,6 +427,7 @@ function getParcelOptions(params) {
|
|
|
323
427
|
// eslint-disable-next-line unicorn/name-replacements -- `distDir` is the name parcel's API reads.
|
|
324
428
|
distDir: buildContext.distFolder,
|
|
325
429
|
shouldOptimize: buildContext.isProductionBuild,
|
|
430
|
+
shouldScopeHoist: true,
|
|
326
431
|
sourceMaps: !buildContext.isProductionBuild
|
|
327
432
|
},
|
|
328
433
|
entries: buildContext.entryPoint,
|
|
@@ -358,4 +463,4 @@ export {
|
|
|
358
463
|
getParcelConfigFiles,
|
|
359
464
|
getParcelOptions
|
|
360
465
|
};
|
|
361
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9wYXJjZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEJ1aWxkcyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBwYXJjZWw6IGBidWlsZCgpYCBhbmQgYGRldigpYCwgdGhlIHNhbWUgdHdvIGVudHJ5IHBvaW50cyB0aGUgZXNidWlsZFxuICogYnVpbGRlciBoYXMsIHByb2R1Y2luZyB0aGUgc2FtZSBgbWFpbi5qc2AgKyBgc3R5bGVzLmNzc2AgKyBgbWFuaWZlc3QuanNvbmAgbGF5b3V0LlxuICpcbiAqIFBhcmNlbCB0YWtlcyBubyBgZXh0ZXJuYWxgIGxpc3QgYW5kIG5vIG91dHB1dCBmaWxlIG5hbWUsIG9ubHkgcGx1Z2lucyBuYW1lZCBpbiBhIGAucGFyY2VscmNgLiBTbyB0aGVcbiAqIGJ1aWxkIHdyaXRlcyBhIGAucGFyY2VscmNgIG9mIGl0cyBvd24gaW50byBgLnBhcmNlbC1jYWNoZWAsIGJlc2lkZSBhIHJlc29sdmVyIHRoYXQgbGVhdmVzXG4gKiBPYnNpZGlhbidzIG1vZHVsZXMgZXh0ZXJuYWwsIGEgbmFtZXIgdGhhdCBuYW1lcyB0aGUgc3R5bGVzaGVldCBgc3R5bGVzLmNzc2AgYW5kIGEgdHJhbnNmb3JtZXIgdGhhdCBrZWVwc1xuICogZHluYW1pYyBpbXBvcnRzIGluc2lkZSBgbWFpbi5qc2AsIGFuZCBleHRlbmRzIHRoZVxuICogY29uc3VtZXIncyBvd24gYC5wYXJjZWxyY2Agd2hlbiB0aGVyZSBpcyBvbmUgKG9yIGBAcGFyY2VsL2NvbmZpZy1kZWZhdWx0YCB3aGVuIHRoZXJlIGlzIG5vbmUpLCBzbyBldmVyeVxuICogdHJhbnNmb3JtZXIgdGhlIGNvbnN1bWVyIGNvbmZpZ3VyZWQgc3RpbGwgYXBwbGllcy5cbiAqXG4gKiBgQHBhcmNlbC9jb3JlYCwgYEBwYXJjZWwvcGx1Z2luYCBhbmQgYEBwYXJjZWwvY29uZmlnLWRlZmF1bHRgIGFyZSBvcHRpb25hbCBwZWVyIGRlcGVuZGVuY2llcywgbG9hZGVkXG4gKiBvbmx5IHdoZW4gYSBwYXJjZWwgYnVpbGQgcnVucywgc28gYSBwbHVnaW4gYnVpbHQgd2l0aCBlc2J1aWxkIGluc3RhbGxzIG5vdGhpbmcgZXh0cmEuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZEV2ZW50LFxuICBJbml0aWFsUGFyY2VsT3B0aW9ucyxcbiAgVGFyZ2V0RGVzY3JpcHRvclxufSBmcm9tICdAcGFyY2VsL3R5cGVzJztcblxuaW1wb3J0IHsgQ2xpVGFza1Jlc3VsdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2NsaS11dGlscyc7XG5pbXBvcnQgeyBucG1SdW5PcHRpb25hbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L25wbS1ydW4nO1xuaW1wb3J0IHsgaW52b2tlQXN5bmNTYWZlbHkgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHtcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmUsXG4gIHRvUG9zaXhQYXRoXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0LFxuICBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcblxuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBCdWlsZE1vZGUsXG4gIGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBjb21wbGV0ZU9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIsXG4gIE9CU0lESUFOX1BMVUdJTl9FWFRFUk5BTFMsXG4gIHJlc29sdmVGcm9tUm9vdCxcbiAgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0XG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB7XG4gIGdldEZyYW1ld29ya0RlZmluZXMsXG4gIGdldEpzeEltcG9ydFNvdXJjZSxcbiAgaXNQb3N0Y3NzTmVlZGVkXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7IGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1kZXBsb3ltZW50LnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsUGFyYW1zIGV4dGVuZHMgQnVpbGRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYnVpbGQgbW9kZSwgZWl0aGVyIGBEZXZlbG9wbWVudGAgb3IgYFByb2R1Y3Rpb25gLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZTogQnVpbGRNb2RlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBidWlsZH0gYW5kIHtAbGluayBkZXZ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyBleHRlbmRzIE9ic2lkaWFuUGx1Z2luRGVwbG95bWVudE9wdGlvbnMsIE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogQ3VzdG9taXplcyB0aGUgb3B0aW9ucyBoYW5kZWQgdG8gcGFyY2VsJ3MgYFBhcmNlbGAgY2xhc3MuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21pemVQYXJjZWxPcHRpb25zPzogKG9wdGlvbnM6IEluaXRpYWxQYXJjZWxPcHRpb25zKSA9PiBJbml0aWFsUGFyY2VsT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0UGFyY2VsQ29uZmlnRmlsZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFBhcmNlbENvbmZpZ0ZpbGVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb25zdW1lcidzIG93biBgLnBhcmNlbHJjYCwgcmVsYXRpdmUgdG8gdGhlIGdlbmVyYXRlZCBjb25maWd1cmF0aW9uJ3MgZm9sZGVyLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwcm9qZWN0XG4gICAqIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3VtZXJQYXJjZWxyY1BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGJ1aWxkIGZlYXR1cmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM/OiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRQYXJjZWxPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRQYXJjZWxPcHRpb25zUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dDtcblxuICAvKipcbiAgICogUGFyY2VsJ3MgY2FjaGUgZm9sZGVyLiBOYW1lZCBleHBsaWNpdGx5IGJlY2F1c2UgcGFyY2VsIG90aGVyd2lzZSB0YWtlcyB0aGUgZm9sZGVyIG9mIHRoZSBuZWFyZXN0XG4gICAqIGxvY2tmaWxlIGZvciB0aGUgcHJvamVjdCByb290LCB3aGljaCBpbiBhIHdvcmtzcGFjZSBpcyBub3QgdGhlIHBsdWdpbidzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGVGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdlbmVyYXRlZCBgLnBhcmNlbHJjYC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZmlsZXMgb2YgdGhlIGdlbmVyYXRlZCBwYXJjZWwgY29uZmlndXJhdGlvbiwgYnkgZmlsZSBuYW1lLlxuICovXG5leHBvcnQgdHlwZSBQYXJjZWxDb25maWdGaWxlcyA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4vLyBJbnNpZGUgcGFyY2VsJ3Mgb3duIGNhY2hlIGZvbGRlcjogcGFyY2VsIHJlZnVzZXMgcmVsYXRpdmUgcGx1Z2lucyBpbiBhIGNvbmZpZyB1bmRlciBgbm9kZV9tb2R1bGVzYCAoaXRcbi8vIHRha2VzIHN1Y2ggYSBjb25maWcgZm9yIGEgcHVibGlzaGVkIHBhY2thZ2UpLCBhbmQgaXQgbmV2ZXIgd2F0Y2hlcyBpdHMgY2FjaGUgZm9sZGVyLCBzbyByZWdlbmVyYXRpbmdcbi8vIHRoZXNlIGZpbGVzIG9uIGV2ZXJ5IGJ1aWxkIGNhbm5vdCB0cmlnZ2VyIGEgcmVidWlsZC5cbmNvbnN0IFBBUkNFTF9DQUNIRV9GT0xERVIgPSAnLnBhcmNlbC1jYWNoZSc7XG5jb25zdCBHRU5FUkFURURfUEFSQ0VMX0NPTkZJR19GT0xERVIgPSBgJHtQQVJDRUxfQ0FDSEVfRk9MREVSfS9vYnNpZGlhbi1kZXYtdG9vbGtpdGA7XG5jb25zdCBQQVJDRUxSQyA9ICcucGFyY2VscmMnO1xuXG4vKipcbiAqIE9uZSBkaWFnbm9zdGljIG9mIGEge0BsaW5rIFBhcmNlbEVycm9yTGlrZX0uXG4gKi9cbmludGVyZmFjZSBQYXJjZWxFcnJvckRpYWdub3N0aWMge1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBwYXJjZWwgdGhyb3dzIHdoZW4gYSBidWlsZCBmYWlsczogYW4gZXJyb3IgY2FycnlpbmcgaXRzIGRpYWdub3N0aWNzLlxuICovXG5pbnRlcmZhY2UgUGFyY2VsRXJyb3JMaWtlIHtcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3M/OiByZWFkb25seSBQYXJjZWxFcnJvckRpYWdub3N0aWNbXTtcbn1cbmNvbnN0IFJFU09MVkVSX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tcmVzb2x2ZXIuY2pzJztcbmNvbnN0IE5BTUVSX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tbmFtZXIuY2pzJztcbmNvbnN0IElOTElORV9JTVBPUlRTX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4taW5saW5lLWltcG9ydHMuY2pzJztcbmNvbnN0IE9QVElNSVpFUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLW9wdGltaXplci5janMnO1xuY29uc3QgRkVBVFVSRVNfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy5janMnO1xuY29uc3QgSlNPTl9JTkRFTlQgPSAyO1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gUnVucyBhIHJlYWwgcGFyY2VsIGJ1aWxkOyBleGVyY2lzZWQgYnkgdGhlIGJ1bmRsZXIgaW50ZWdyYXRpb24gdGVzdC4gKi9cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gaW4gcHJvZHVjdGlvbiBtb2RlIHVzaW5nIHBhcmNlbC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1aWxkIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGQob3B0aW9ucz86IEJ1aWxkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbCh7IC4uLm9wdGlvbnMsIG1vZGU6IEJ1aWxkTW9kZS5Qcm9kdWN0aW9uIH0pO1xuICByZXN1bHQudGhyb3dPbkZhaWx1cmUoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIE9ic2lkaWFuIHBsdWdpbiB3aXRoIHBhcmNlbCwgb25jZSBmb3IgYSBwcm9kdWN0aW9uIGJ1aWxkLCBvciB3YXRjaGluZyBmb3IgYSBkZXZlbG9wbWVudCBvbmUuXG4gKlxuICogUnVucyB0aGUgcHJvamVjdCdzIGBidWlsZDpjb21waWxlYCBzY3JpcHQgZmlyc3Qgd2hlbiBpdCBoYXMgb25lLCBhcyB0aGUgZXNidWlsZCBidWlsZGVyIGRvZXMsIHNpbmNlXG4gKiBwYXJjZWwgc3RyaXBzIFR5cGVTY3JpcHQgdHlwZXMgd2l0aG91dCBjaGVja2luZyB0aGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gaW5kaWNhdGluZyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBidWlsZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsKHBhcmFtczogQnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWxQYXJhbXMpOiBQcm9taXNlPENsaVRhc2tSZXN1bHQ+IHtcbiAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2J1aWxkOmNvbXBpbGUnKTtcbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0KHBhcmFtcyk7XG4gIGF3YWl0IGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dC5kaXN0Rm9sZGVyKTtcbiAgYXdhaXQgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoYnVpbGRDb250ZXh0KTtcblxuICBjb25zdCBjb25maWdGb2xkZXIgPSByZXNvbHZlRnJvbVJvb3QoR0VORVJBVEVEX1BBUkNFTF9DT05GSUdfRk9MREVSKTtcbiAgY29uc3QgY29uc3VtZXJQYXJjZWxyY1BhdGggPSByZXNvbHZlRnJvbVJvb3QoUEFSQ0VMUkMpO1xuICBhd2FpdCBta2Rpcihjb25maWdGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjb25maWdGaWxlcyA9IGdldFBhcmNlbENvbmZpZ0ZpbGVzKHtcbiAgICBjb25zdW1lclBhcmNlbHJjUGF0aDogZXhpc3RzU3luYyhjb25zdW1lclBhcmNlbHJjUGF0aCkgPyB0b1Bvc2l4UGF0aChyZWxhdGl2ZShjb25maWdGb2xkZXIsIGNvbnN1bWVyUGFyY2VscmNQYXRoKSkgOiB1bmRlZmluZWQsXG4gICAgZmVhdHVyZXM6IHBhcmFtc1xuICB9KTtcbiAgZm9yIChjb25zdCBbZmlsZU5hbWUsIGNvbnRlbnRzXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdGaWxlcykpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oY29uZmlnRm9sZGVyLCBmaWxlTmFtZSk7XG4gICAgLy8gUmV3cml0dGVuIG9ubHkgd2hlbiBpdCBjaGFuZ2VkOiBwYXJjZWwgaW52YWxpZGF0ZXMgaXRzIGNhY2hlIG9uIGEgY29uZmlnIGZpbGUncyBtb2RpZmljYXRpb24gdGltZS5cbiAgICBpZiAoIWV4aXN0c1N5bmMoZmlsZVBhdGgpIHx8IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKSAhPT0gY29udGVudHMpIHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudHMsICd1dGYtOCcpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHsgUGFyY2VsIH0gPSBhd2FpdCBpbXBvcnQoJ0BwYXJjZWwvY29yZScpO1xuICBjb25zdCBwYXJjZWxPcHRpb25zID0gZ2V0UGFyY2VsT3B0aW9ucyh7IGJ1aWxkQ29udGV4dCwgY2FjaGVGb2xkZXI6IHJlc29sdmVGcm9tUm9vdChQQVJDRUxfQ0FDSEVfRk9MREVSKSwgY29uZmlnUGF0aDogam9pbihjb25maWdGb2xkZXIsIFBBUkNFTFJDKSB9KTtcbiAgY29uc3QgYnVuZGxlciA9IG5ldyBQYXJjZWwocGFyYW1zLmN1c3RvbWl6ZVBhcmNlbE9wdGlvbnM/LihwYXJjZWxPcHRpb25zKSA/PyBwYXJjZWxPcHRpb25zKTtcblxuICBpZiAoYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYnVpbGRUaW1lLCBidW5kbGVHcmFwaCB9ID0gYXdhaXQgYnVuZGxlci5ydW4oKTtcbiAgICAgIGNvbnNvbGUud2FybihgQnVpbHQgJHtTdHJpbmcoYnVuZGxlR3JhcGguZ2V0QnVuZGxlcygpLmxlbmd0aCl9IGJ1bmRsZShzKSB3aXRoIHBhcmNlbCBpbiAke1N0cmluZyhidWlsZFRpbWUpfSBtcy5gKTtcbiAgICAgIHJldHVybiBDbGlUYXNrUmVzdWx0LlN1Y2Nlc3MoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXRQYXJjZWxFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuIENsaVRhc2tSZXN1bHQuRmFpbHVyZSgpO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGJ1bmRsZXIud2F0Y2goKGVycm9yLCBldmVudCkgPT4ge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXRQYXJjZWxFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoYW5kbGVXYXRjaEV2ZW50KGV2ZW50LCBidWlsZENvbnRleHQpO1xuICB9KTtcbiAgcmV0dXJuIENsaVRhc2tSZXN1bHQuRG9Ob3RFeGl0KCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gaW4gZGV2ZWxvcG1lbnQgbW9kZSB1c2luZyBwYXJjZWwsIHdhdGNoaW5nIGZvciBjaGFuZ2VzIGFuZCBkZXBsb3lpbmcgZXZlcnlcbiAqIHN1Y2Nlc3NmdWwgcmVidWlsZCBpbnRvIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IGluZGljYXRpbmcgdGhlIGJ1aWxkIHJlc3VsdC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBJbnRlbnRpb25hbGx5IHNoYXJlcyBCdWlsZE9wdGlvbnMgd2l0aCBidWlsZCgpLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldihvcHRpb25zPzogQnVpbGRPcHRpb25zKTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbCh7IC4uLm9wdGlvbnMsIG1vZGU6IEJ1aWxkTW9kZS5EZXZlbG9wbWVudCB9KTtcbn1cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBmaWxlcyBvZiB0aGUgcGFyY2VsIGNvbmZpZ3VyYXRpb24gdGhlIGJ1aWxkIHJ1bnMgd2l0aC5cbiAqXG4gKiBUaGUgYnVpbGQgZmVhdHVyZXMgYWRkIHBpcGVsaW5lcyB0aGF0IHJ1biB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zLCB0aHJvdWdoIG9uZSBnZW5lcmF0ZWQgdHJhbnNmb3JtZXIgdGhhdFxuICogbG9hZHMgdGhlbSBmcm9tIHRoZSB0b29sa2l0OiBTb2xpZCdzIGAuanN4YCAvIGAudHN4YCwgU3ZlbHRlJ3MgYC5zdmVsdGVgIC8gYC5zdmVsdGUudHNgIC8gYC5zdmVsdGUuanNgLCBgLndhc21gLFxuICogYW5kIHdpdGggYHN0eWxlcy5wb3N0Y3NzYCBvciBgc3R5bGVzLnRhaWx3aW5kYCBldmVyeSBzdHlsZXNoZWV0LCBpbiBwbGFjZSBvZiBwYXJjZWwncyBvd24gUG9zdENTUyBzdGVwLiBSZWFjdCBhbmRcbiAqIFByZWFjdCBKU1ggaXMgY29tcGlsZWQgaGVyZSB0b28sIHNpbmNlIHBhcmNlbCByZWFkcyB0aGUgSlNYIHJ1bnRpbWUgZnJvbSBhIHRzY29uZmlnIHdpdGhvdXQgZm9sbG93aW5nIGl0cyBgZXh0ZW5kc2AsXG4gKiBhbmQgd2l0aCBhbnkgZnJhbWV3b3JrIGV2ZXJ5IHNjcmlwdCBoYXMgdGhlIGZyYW1ld29yaydzIGNvbXBpbGUtdGltZSBjb25zdGFudHMgcmVwbGFjZWQuIFBhcmNlbCBjb21waWxlcyBWdWUgd2l0aFxuICogYEBwYXJjZWwvdHJhbnNmb3JtZXItdnVlYCBhbmQgc2NvcGVzIGAqLm1vZHVsZS5jc3NgIGl0c2VsZiwgc28gdGhvc2UgbmVlZCBubyBwaXBlbGluZSBoZXJlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldFBhcmNlbENvbmZpZ0ZpbGVzUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlcywgYnkgZmlsZSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyY2VsQ29uZmlnRmlsZXMocGFyYW1zOiBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtcyk6IFBhcmNlbENvbmZpZ0ZpbGVzIHtcbiAgY29uc3QgeyBjb25zdW1lclBhcmNlbHJjUGF0aCwgZmVhdHVyZXMgPSB7fSB9ID0gcGFyYW1zO1xuICBjb25zdCBmZWF0dXJlVHJhbnNmb3JtZXIgPSBgLi8ke0ZFQVRVUkVTX0ZJTEVfTkFNRX1gO1xuICBjb25zdCB0cmFuc2Zvcm1lcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBpZiAoZmVhdHVyZXMuZnJhbWV3b3JrID09PSAnc3ZlbHRlJykge1xuICAgIHRyYW5zZm9ybWVyc1snKi5zdmVsdGUnXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICAgIHRyYW5zZm9ybWVyc1snKi5zdmVsdGUue2pzLHRzfSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lciwgYC4vJHtJTkxJTkVfSU1QT1JUU19GSUxFX05BTUV9YCwgJy4uLiddO1xuICB9XG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgPT09ICdzb2xpZCcgfHwgZ2V0SnN4SW1wb3J0U291cmNlKGZlYXR1cmVzLmZyYW1ld29yaykgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyYW5zZm9ybWVyc1snKi57anN4LHRzeH0nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICB9XG4gIGlmIChmZWF0dXJlcy53YXNtKSB7XG4gICAgdHJhbnNmb3JtZXJzWycqLndhc20nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICB9XG4gIGlmIChpc1Bvc3Rjc3NOZWVkZWQoZmVhdHVyZXMuc3R5bGVzKSkge1xuICAgIHRyYW5zZm9ybWVyc1snKi57Y3NzLHBjc3N9J10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyLCAnQHBhcmNlbC90cmFuc2Zvcm1lci1jc3MnXTtcbiAgfVxuICBjb25zdCBkZWZpbmVzID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogZmVhdHVyZXMuZnJhbWV3b3JrLCBpc1Byb2R1Y3Rpb25CdWlsZDogdHJ1ZSB9KTtcbiAgdHJhbnNmb3JtZXJzWycqLntqcyxtanMsY2pzLGpzeCx0cyxtdHMsY3RzLHRzeH0nXSA9IFtcbiAgICAuLi5PYmplY3Qua2V5cyhkZWZpbmVzKS5sZW5ndGggPiAwID8gW2ZlYXR1cmVUcmFuc2Zvcm1lcl0gOiBbXSxcbiAgICBgLi8ke0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRX1gLFxuICAgICcuLi4nXG4gIF07XG5cbiAgY29uc3QgcGFyY2VscmMgPSB7XG4gICAgZXh0ZW5kczogY29uc3VtZXJQYXJjZWxyY1BhdGggPz8gJ0BwYXJjZWwvY29uZmlnLWRlZmF1bHQnLFxuICAgIG5hbWVyczogW2AuLyR7TkFNRVJfRklMRV9OQU1FfWAsICcuLi4nXSxcbiAgICBvcHRpbWl6ZXJzOiB7XG4gICAgICAnKi5qcyc6IFsnLi4uJywgYC4vJHtPUFRJTUlaRVJfRklMRV9OQU1FfWBdXG4gICAgfSxcbiAgICByZXNvbHZlcnM6IFtgLi8ke1JFU09MVkVSX0ZJTEVfTkFNRX1gLCAnLi4uJ10sXG4gICAgdHJhbnNmb3JtZXJzXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBbRkVBVFVSRVNfRklMRV9OQU1FXTogYC8qXG4gKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBSdW5zIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMgZm9yIHRoZSBidWlsZCBmZWF0dXJlcywgbG9hZGVkXG4gKiBmcm9tIHRoZSB0b29sa2l0IGl0c2VsZiwgc28gcGFyY2VsIGNvbXBpbGVzIGVhY2ggZmVhdHVyZSB0aGUgd2F5IGV2ZXJ5IG90aGVyIGJ1bmRsZXIgYWRhcHRlciBkb2VzLlxuICovXG5jb25zdCB7IFRyYW5zZm9ybWVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5jb25zdCBGRUFUVVJFU19NT0RVTEVfVVJMID0gJHtKU09OLnN0cmluZ2lmeShnZXRTaWJsaW5nTW9kdWxlVXJsKCdvYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMnKSl9O1xuY29uc3QgVFJBTlNGT1JNU19NT0RVTEVfVVJMID0gJHtKU09OLnN0cmluZ2lmeShnZXRTaWJsaW5nTW9kdWxlVXJsKCdvYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3JtcycpKX07XG5jb25zdCBGUkFNRVdPUksgPSAke0pTT04uc3RyaW5naWZ5KGZlYXR1cmVzLmZyYW1ld29yayA/PyBudWxsKX07XG5jb25zdCBTVFlMRVMgPSAke0pTT04uc3RyaW5naWZ5KGZlYXR1cmVzLnN0eWxlcyA/PyB7fSl9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUcmFuc2Zvcm1lcih7XG4gIGFzeW5jIHRyYW5zZm9ybSh7IGFzc2V0LCBvcHRpb25zIH0pIHtcbiAgICBjb25zdCB7IGdldEZlYXR1cmVGaWxlS2luZCwgZ2V0RnJhbWV3b3JrRGVmaW5lcywgZ2V0SnN4SW1wb3J0U291cmNlLCByZXBsYWNlRGVmaW5lcyB9ID0gYXdhaXQgaW1wb3J0KEZFQVRVUkVTX01PRFVMRV9VUkwpO1xuICAgIGNvbnN0IHRyYW5zZm9ybXMgPSBhd2FpdCBpbXBvcnQoVFJBTlNGT1JNU19NT0RVTEVfVVJMKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGFzc2V0LmZpbGVQYXRoO1xuICAgIGNvbnN0IGlzUHJvZHVjdGlvbkJ1aWxkID0gb3B0aW9ucy5tb2RlID09PSAncHJvZHVjdGlvbic7XG4gICAgY29uc3QgZGVmaW5lcyA9IGdldEZyYW1ld29ya0RlZmluZXMoeyBmcmFtZXdvcms6IEZSQU1FV09SSyA/PyB1bmRlZmluZWQsIGlzUHJvZHVjdGlvbkJ1aWxkIH0pO1xuICAgIHN3aXRjaCAoZ2V0RmVhdHVyZUZpbGVLaW5kKGZpbGVQYXRoKSkge1xuICAgICAgY2FzZSAnanN4Jzoge1xuICAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgICAgICBjb25zdCBqc3hJbXBvcnRTb3VyY2UgPSBnZXRKc3hJbXBvcnRTb3VyY2UoRlJBTUVXT1JLID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEZSQU1FV09SSyA9PT0gJ3NvbGlkJ1xuICAgICAgICAgID8gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Tb2xpZCh7IGNvZGUsIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KVxuICAgICAgICAgIDogYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Kc3goeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQsIGpzeEltcG9ydFNvdXJjZSB9KTtcbiAgICAgICAgYXNzZXQuc2V0Q29kZShyZXBsYWNlRGVmaW5lcyhyZXN1bHQuY29kZSwgZGVmaW5lcykpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHlsZXNoZWV0Jzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1zLnRyYW5zZm9ybUNzcyh7IGZpbGVQYXRoLCBpc0Nzc01vZHVsZVNjb3BlZDogZmFsc2UsIGlzUHJvZHVjdGlvbkJ1aWxkLCBzb3VyY2U6IGF3YWl0IGFzc2V0LmdldENvZGUoKSwgc3R5bGVzOiBTVFlMRVMgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVzdWx0LmNzcyk7XG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiByZXN1bHQuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgYXNzZXQuaW52YWxpZGF0ZU9uRmlsZUNoYW5nZShkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N2ZWx0ZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1TdmVsdGUoeyBjb2RlOiBhd2FpdCBhc3NldC5nZXRDb2RlKCksIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICAgICAgYXNzZXQuc2V0Q29kZShyZXBsYWNlRGVmaW5lcyhyZXN1bHQuY29kZSwgZGVmaW5lcykpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd3YXNtJzpcbiAgICAgICAgYXNzZXQuc2V0Q29kZSh0cmFuc2Zvcm1zLmdldFdhc21Nb2R1bGVDb2RlKGF3YWl0IGFzc2V0LmdldEJ1ZmZlcigpKSk7XG4gICAgICAgIGFzc2V0LnR5cGUgPSAnanMnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gQSBmcmFtZXdvcmsncyBydW50aW1lIHJlYWRzIHByb2Nlc3MuZW52Lk5PREVfRU5WLCB3aGljaCBwYXJjZWwgbGVhdmVzIGFsb25lIGluIGFuIGVsZWN0cm9uLXJlbmRlcmVyIGxpYnJhcnkuXG4gICAgICAgIGNvbnN0IGNvZGUgPSBhd2FpdCBhc3NldC5nZXRDb2RlKCk7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkID0gcmVwbGFjZURlZmluZXMoY29kZSwgZGVmaW5lcyk7XG4gICAgICAgIGlmIChyZXBsYWNlZCAhPT0gY29kZSkge1xuICAgICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZWQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2Fzc2V0XTtcbiAgfVxufSk7XG5gLFxuICAgIC8vIGBTdHJpbmcucmF3YCwgc28gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBiZWxvdyByZWFjaGVzIHRoZSBmaWxlIHdpdGggaXRzIGJhY2tzbGFzaGVzIGludGFjdC5cbiAgICBbSU5MSU5FX0lNUE9SVFNfRklMRV9OQU1FXTogU3RyaW5nLnJhd2AvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gS2VlcHMgZXZlcnkgZHluYW1pYyBpbXBvcnQoKSBpbnNpZGUgbWFpbi5qcy5cbiAqXG4gKiBPYnNpZGlhbiBsb2FkcyBhIHBsdWdpbidzIG1haW4uanMgYW5kIG5vdGhpbmcgYmVzaWRlIGl0LCBhbmQgcGFyY2VsIG1ha2VzIGV2ZXJ5IGltcG9ydCgpIGEgYnVuZGxlIG9mIGl0c1xuICogb3duIHdpdGggbm8gb3B0aW9uIHRvIGlubGluZSBvbmUuIFRoaXMgcmV3cml0ZXMgaW1wb3J0KCc8bGl0ZXJhbD4nKSBpbnRvIGEgcmVxdWlyZSgpIGluc2lkZSBhbiBhc3luY1xuICogYXJyb3csIGJlZm9yZSBwYXJjZWwncyBvd24gSmF2YVNjcmlwdCB0cmFuc2Zvcm1lciBydW5zOiB0aGUgbW9kdWxlIHN0aWxsIGV2YWx1YXRlcyBvbmx5IHdoZW4gdGhhdCBjb2RlXG4gKiBydW5zLCBhbmQgdGhlIHByb21pc2Ugc3RpbGwgcmVqZWN0cyB3aGVuIGV2YWx1YXRpb24gdGhyb3dzLiBPbmx5IGEgcGxhaW4gc3RyaW5nIHNwZWNpZmllciBpcyByZXdyaXR0ZW4sXG4gKiBzaW5jZSBhIGNvbXB1dGVkIG9uZSBjYW5ub3QgYmUgYnVuZGxlZCBieSBhbnkgYnVuZGxlci5cbiAqL1xuY29uc3QgeyBUcmFuc2Zvcm1lciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgRFlOQU1JQ19JTVBPUlQgPSAvXFxiaW1wb3J0XFwoXFxzKihbXCInXSkoW15cIidcXHg2MFxcblxcXFxdKylcXDFcXHMqXFwpL2d1O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUcmFuc2Zvcm1lcih7XG4gIGFzeW5jIHRyYW5zZm9ybSh7IGFzc2V0IH0pIHtcbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBhc3NldC5nZXRDb2RlKCk7XG4gICAgaWYgKHNvdXJjZS5pbmNsdWRlcygnaW1wb3J0KCcpKSB7XG4gICAgICBhc3NldC5zZXRDb2RlKHNvdXJjZS5yZXBsYWNlKERZTkFNSUNfSU1QT1JULCAoX21hdGNoLCBxdW90ZSwgc3BlY2lmaWVyKSA9PiAnKGFzeW5jICgpID0+IHJlcXVpcmUoJyArIHF1b3RlICsgc3BlY2lmaWVyICsgcXVvdGUgKyAnKSkoKScpKTtcbiAgICB9XG4gICAgcmV0dXJuIFthc3NldF07XG4gIH1cbn0pO1xuYCxcbiAgICBbTkFNRVJfRklMRV9OQU1FXTogYC8qIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIE9ic2lkaWFuIGxvYWRzIGEgcGx1Z2luJ3Mgc3R5bGVzaGVldCBmcm9tIHN0eWxlcy5jc3MgYW5kIG5vdGhpbmcgZWxzZS4gKi9cbmNvbnN0IHsgTmFtZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IE5hbWVyKHtcbiAgbmFtZSh7IGJ1bmRsZSB9KSB7XG4gICAgcmV0dXJuIGJ1bmRsZS50eXBlID09PSAnY3NzJyA/ICcke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlN0eWxlc0Nzc30nIDogbnVsbDtcbiAgfVxufSk7XG5gLFxuICAgIFtPUFRJTUlaRVJfRklMRV9OQU1FXTogYC8qXG4gKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBSdW5zIGFmdGVyIHBhcmNlbCdzIG93biBvcHRpbWl6ZXJzLCBvbiB0aGUgSmF2YVNjcmlwdCBidW5kbGUuXG4gKlxuICogT2JzaWRpYW4gZXZhbHVhdGVzIG1haW4uanMgYXMgdGhlIGJvZHkgb2YgZnVuY3Rpb24gKHJlcXVpcmUsIG1vZHVsZSwgZXhwb3J0cyksIHdpdGggYSBtb2R1bGUgb2JqZWN0IHRoYXRcbiAqIGhhcyBubyByZXF1aXJlIG9mIGl0cyBvd24sIGFuZCBwYXJjZWwncyBydW50aW1lIHJlYWNoZXMgZXZlcnkgZXh0ZXJuYWwgbW9kdWxlIHRocm91Z2ggbW9kdWxlLnJlcXVpcmUuXG4gKiBXaXRob3V0IHRoZSBmaXJzdCBsaW5lIGJlbG93LCB0aGUgdmVyeSBmaXJzdCByZXF1aXJlKCdvYnNpZGlhbicpIHRocm93cyBcIkNhbm5vdCBmaW5kIG1vZHVsZVwiLiBUaGUgYmFubmVyXG4gKiBnb2VzIGluIGhlcmUgdG9vLCBhZnRlciBtaW5pZmljYXRpb24sIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBzdHJpcCBpdCBhcyBhbiBvcmRpbmFyeSBjb21tZW50LlxuICovXG5jb25zdCB7IE9wdGltaXplciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgUFJFQU1CTEUgPSAke0pTT04uc3RyaW5naWZ5KGAke2dldE9ic2lkaWFuUGx1Z2luQmFubmVyKCdwYXJjZWwnKX1pZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZS5yZXF1aXJlICE9PSAnZnVuY3Rpb24nKSB7IG1vZHVsZS5yZXF1aXJlID0gcmVxdWlyZTsgfVxcbmApfTtcbmNvbnN0IFBSRUFNQkxFX0xJTkVfQ09VTlQgPSAke1N0cmluZyhnZXRPYnNpZGlhblBsdWdpbkJhbm5lcigncGFyY2VsJykuc3BsaXQoJ1xcbicpLmxlbmd0aCl9O1xuXG5hc3luYyBmdW5jdGlvbiByZWFkQ29udGVudHMoY29udGVudHMpIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gY29udGVudHM7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50cykpIHtcbiAgICByZXR1cm4gY29udGVudHMudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIH1cbiAgY29uc3QgY2h1bmtzID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgY29udGVudHMpIHtcbiAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICB9XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ3V0Zi04Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IE9wdGltaXplcih7XG4gIGFzeW5jIG9wdGltaXplKHsgY29udGVudHMsIG1hcCB9KSB7XG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHJlYWRDb250ZW50cyhjb250ZW50cyk7XG4gICAgaWYgKG1hcCkge1xuICAgICAgbWFwLm9mZnNldExpbmVzKDEsIFBSRUFNQkxFX0xJTkVfQ09VTlQpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50czogUFJFQU1CTEUgKyBjb2RlLCBtYXAgfTtcbiAgfVxufSk7XG5gLFxuICAgIFtQQVJDRUxSQ106IGAke0pTT04uc3RyaW5naWZ5KHBhcmNlbHJjLCBudWxsLCBKU09OX0lOREVOVCl9XFxuYCxcbiAgICBbUkVTT0xWRVJfRklMRV9OQU1FXTogYC8qIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIExlYXZlcyB0aGUgbW9kdWxlcyBPYnNpZGlhbiBzdXBwbGllcyBhdCBydW50aW1lIHRvIHJlcXVpcmUoKS4gKi9cbmNvbnN0IHsgUmVzb2x2ZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IEVYVEVSTkFMUyA9IG5ldyBTZXQoJHtKU09OLnN0cmluZ2lmeShPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTKX0pO1xuXG5mdW5jdGlvbiBnZXRQYWNrYWdlTmFtZShzcGVjaWZpZXIpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGVjaWZpZXIuc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHNwZWNpZmllci5zdGFydHNXaXRoKCdAJykgPyBzZWdtZW50cy5zbGljZSgwLCAyKS5qb2luKCcvJykgOiBzZWdtZW50c1swXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgUmVzb2x2ZXIoe1xuICByZXNvbHZlKHsgc3BlY2lmaWVyIH0pIHtcbiAgICBjb25zdCBpc0V4dGVybmFsID0gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ25vZGU6JykgfHwgRVhURVJOQUxTLmhhcyhzcGVjaWZpZXIpIHx8IEVYVEVSTkFMUy5oYXMoZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyKSk7XG4gICAgcmV0dXJuIGlzRXh0ZXJuYWwgPyB7IGlzRXhjbHVkZWQ6IHRydWUgfSA6IG51bGw7XG4gIH1cbn0pO1xuYFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgb3B0aW9ucyBoYW5kZWQgdG8gcGFyY2VsJ3MgYFBhcmNlbGAgY2xhc3MuXG4gKlxuICogVGhlIG9uZSB0YXJnZXQgaXMgYGVsZWN0cm9uLXJlbmRlcmVyYCwgd2hlcmUgT2JzaWRpYW4gcnVucyBhIHBsdWdpbiwgYW5kIENvbW1vbkpTLiBQYXJjZWwgY291bnRzIHRoYXRcbiAqIGNvbnRleHQgYXMgYm90aCBhIGJyb3dzZXIgYW5kIGEgbm9kZSBvbmUsIGFuZCBlYWNoIGhhbGYgbWF0dGVyczogbm9kZSBrZWVwcyB0aGUgYnVpbHRpbnMgZXh0ZXJuYWwsIGFuZFxuICogYnJvd3NlciByZXNvbHZlcyB0aGUgYGJyb3dzZXJgIGV4cG9ydCBjb25kaXRpb24uIGBpbmNsdWRlTm9kZU1vZHVsZXNgIGJ1bmRsZXMgdGhlIGRlcGVuZGVuY2llcywgd2hpY2ggYVxuICogbm9kZS1mbGF2b3VyZWQgY29udGV4dCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgYXMgYHJlcXVpcmUoKWAgY2FsbHMgbm90aGluZyBpbnN0YWxscyBiZXNpZGUgYSBwbHVnaW4sIGFuZFxuICogYGlzTGlicmFyeWAga2VlcHMgdGhlIGVudHJ5J3MgZGVmYXVsdCBleHBvcnQsIHdoaWNoIGlzIGhvdyBPYnNpZGlhbiBmaW5kcyB0aGUgcGx1Z2luIGNsYXNzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldFBhcmNlbE9wdGlvbnNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHBhcmNlbCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyY2VsT3B0aW9ucyhwYXJhbXM6IEdldFBhcmNlbE9wdGlvbnNQYXJhbXMpOiBJbml0aWFsUGFyY2VsT3B0aW9ucyB7XG4gIGNvbnN0IHsgYnVpbGRDb250ZXh0LCBjYWNoZUZvbGRlciwgY29uZmlnUGF0aCB9ID0gcGFyYW1zO1xuICBjb25zdCB0YXJnZXQ6IFRhcmdldERlc2NyaXB0b3IgPSB7XG4gICAgY29udGV4dDogJ2VsZWN0cm9uLXJlbmRlcmVyJyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlzdERpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgIGRpc3REaXI6IGJ1aWxkQ29udGV4dC5kaXN0Rm9sZGVyLFxuICAgIGluY2x1ZGVOb2RlTW9kdWxlczogdHJ1ZSxcbiAgICBpc0xpYnJhcnk6IHRydWUsXG4gICAgb3B0aW1pemU6IGJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCxcbiAgICBvdXRwdXRGb3JtYXQ6ICdjb21tb25qcycsXG4gICAgc291cmNlTWFwOiAhYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkICYmIHsgaW5saW5lOiB0cnVlIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBjYWNoZURpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgIGNhY2hlRGlyOiBjYWNoZUZvbGRlcixcbiAgICBjb25maWc6IGNvbmZpZ1BhdGgsXG4gICAgZGVmYXVsdFRhcmdldE9wdGlvbnM6IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBkaXN0RGlyYCBpcyB0aGUgbmFtZSBwYXJjZWwncyBBUEkgcmVhZHMuXG4gICAgICBkaXN0RGlyOiBidWlsZENvbnRleHQuZGlzdEZvbGRlcixcbiAgICAgIHNob3VsZE9wdGltaXplOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgICBzb3VyY2VNYXBzOiAhYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkXG4gICAgfSxcbiAgICBlbnRyaWVzOiBidWlsZENvbnRleHQuZW50cnlQb2ludCxcbiAgICBtb2RlOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnLFxuICAgIHRhcmdldHM6IHsgb2JzaWRpYW5QbHVnaW46IHRhcmdldCB9XG4gIH07XG59XG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gUGFydCBvZiB0aGUgcGFyY2VsIGJ1aWxkIGFib3ZlLiAqL1xuZnVuY3Rpb24gZm9ybWF0UGFyY2VsRXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBkaWFnbm9zdGljcyA9IChlcnJvciBhcyBQYXJjZWxFcnJvckxpa2UgfCB1bmRlZmluZWQpPy5kaWFnbm9zdGljcztcbiAgaWYgKGRpYWdub3N0aWNzICYmIGRpYWdub3N0aWNzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLm1lc3NhZ2UpLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgPz8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBVUkwgb2YgYSBtb2R1bGUgb2YgdGhpcyBmb2xkZXIsIGluIHRoZSBzYW1lIGZvcm0gYXMgdGhpcyBvbmUgKGAudHNgIGZyb20gc291cmNlLCBgLm1qc2Agb3IgYC5janNgIG9uY2VcbiAqIGJ1aWx0KSwgd2hpY2ggdGhlIGdlbmVyYXRlZCB0cmFuc2Zvcm1lciBpbXBvcnRzLlxuICpcbiAqIEBwYXJhbSBiYXNlTmFtZSAtIFRoZSBtb2R1bGUncyBmaWxlIG5hbWUgd2l0aG91dCBpdHMgZXh0ZW5zaW9uLlxuICogQHJldHVybnMgVGhlIG1vZHVsZSdzIGBmaWxlOmAgVVJMLlxuICovXG5mdW5jdGlvbiBnZXRTaWJsaW5nTW9kdWxlVXJsKGJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmV3IFVSTChgJHtiYXNlTmFtZX0ke2V4dG5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKX1gLCBpbXBvcnQubWV0YS51cmwpLmhyZWY7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVdhdGNoRXZlbnQoZXZlbnQ6IEJ1aWxkRXZlbnQgfCB1bmRlZmluZWQsIGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQpOiB2b2lkIHtcbiAgaWYgKGV2ZW50Py50eXBlID09PSAnYnVpbGRGYWlsdXJlJykge1xuICAgIGNvbnNvbGUuZXJyb3IoZXZlbnQuZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLm1lc3NhZ2UpLmpvaW4oJ1xcbicpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV2ZW50Py50eXBlICE9PSAnYnVpbGRTdWNjZXNzJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUud2FybihgUmVidWlsdCB3aXRoIHBhcmNlbCBpbiAke1N0cmluZyhldmVudC5idWlsZFRpbWUpfSBtcy5gKTtcbiAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIoYnVpbGRDb250ZXh0KSk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBUVAsU0FBUywrQkFBK0I7QUFDeEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMscUNBQXFDO0FBbUU5QyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGlDQUFpQyxHQUFHLG1CQUFtQjtBQUM3RCxNQUFNLFdBQVc7QUFlakIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSwyQkFBMkI7QUFDakMsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxjQUFjO0FBU3BCLGVBQXNCLE1BQU0sU0FBdUM7QUFDakUsUUFBTSxTQUFTLE1BQU0sOEJBQThCLEVBQUUsR0FBRyxTQUFTLE1BQU0sVUFBVSxXQUFXLENBQUM7QUFDN0YsU0FBTyxlQUFlO0FBQ3hCO0FBV0EsZUFBc0IsOEJBQThCLFFBQXFFO0FBQ3ZILFFBQU0sZUFBZSxlQUFlO0FBQ3BDLFFBQU0sZUFBZSxNQUFNLGtD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
|
|
466
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9wYXJjZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEJ1aWxkcyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBwYXJjZWw6IGBidWlsZCgpYCBhbmQgYGRldigpYCwgdGhlIHNhbWUgdHdvIGVudHJ5IHBvaW50cyB0aGUgZXNidWlsZFxuICogYnVpbGRlciBoYXMsIHByb2R1Y2luZyB0aGUgc2FtZSBgbWFpbi5qc2AgKyBgc3R5bGVzLmNzc2AgKyBgbWFuaWZlc3QuanNvbmAgbGF5b3V0LlxuICpcbiAqIFBhcmNlbCB0YWtlcyBubyBgZXh0ZXJuYWxgIGxpc3QgYW5kIG5vIG91dHB1dCBmaWxlIG5hbWUsIG9ubHkgcGx1Z2lucyBuYW1lZCBpbiBhIGAucGFyY2VscmNgLiBTbyB0aGVcbiAqIGJ1aWxkIHdyaXRlcyBhIGAucGFyY2VscmNgIG9mIGl0cyBvd24gaW50byBgLnBhcmNlbC1jYWNoZWAsIGJlc2lkZSBhIHJlc29sdmVyIHRoYXQgbGVhdmVzXG4gKiBPYnNpZGlhbidzIG1vZHVsZXMgZXh0ZXJuYWwgYW5kIHJlc29sdmVzIHBhY2thZ2VzIHdpdGggdGhlIGJyb3dzZXIncyBleHBvcnQgY29uZGl0aW9ucywgYSBuYW1lciB0aGF0IG5hbWVzXG4gKiB0aGUgc3R5bGVzaGVldCBgc3R5bGVzLmNzc2AsIGEgdHJhbnNmb3JtZXIgdGhhdCBrZWVwcyBkeW5hbWljIGltcG9ydHMgaW5zaWRlIGBtYWluLmpzYCwgYW5kIGFuIG9wdGltaXplciB0aGF0XG4gKiBsZXRzIHRoZSBtaW5pZmllciByZW5hbWUgdGhlIGJ1bmRsZSdzIHRvcC1sZXZlbCBiaW5kaW5ncywgYW5kIGV4dGVuZHMgdGhlXG4gKiBjb25zdW1lcidzIG93biBgLnBhcmNlbHJjYCB3aGVuIHRoZXJlIGlzIG9uZSAob3IgYEBwYXJjZWwvY29uZmlnLWRlZmF1bHRgIHdoZW4gdGhlcmUgaXMgbm9uZSksIHNvIGV2ZXJ5XG4gKiB0cmFuc2Zvcm1lciB0aGUgY29uc3VtZXIgY29uZmlndXJlZCBzdGlsbCBhcHBsaWVzLlxuICpcbiAqIGBAcGFyY2VsL2NvcmVgLCBgQHBhcmNlbC9wbHVnaW5gIGFuZCBgQHBhcmNlbC9jb25maWctZGVmYXVsdGAgYXJlIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jaWVzLCBsb2FkZWRcbiAqIG9ubHkgd2hlbiBhIHBhcmNlbCBidWlsZCBydW5zLCBzbyBhIHBsdWdpbiBidWlsdCB3aXRoIGVzYnVpbGQgaW5zdGFsbHMgbm90aGluZyBleHRyYS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEJ1aWxkRXZlbnQsXG4gIEluaXRpYWxQYXJjZWxPcHRpb25zLFxuICBUYXJnZXREZXNjcmlwdG9yXG59IGZyb20gJ0BwYXJjZWwvdHlwZXMnO1xuXG5pbXBvcnQgeyBDbGlUYXNrUmVzdWx0IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvY2xpLXV0aWxzJztcbmltcG9ydCB7IG5wbVJ1bk9wdGlvbmFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvbnBtLXJ1bic7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQge1xuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZSxcbiAgdG9Qb3NpeFBhdGhcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQsXG4gIE9ic2lkaWFuUGx1Z2luRGVwbG95bWVudE9wdGlvbnNcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tYnVpbGQudHMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuXG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4uL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIEJ1aWxkTW9kZSxcbiAgY2xlYW5PYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcixcbiAgT0JTSURJQU5fUExVR0lOX0VYVEVSTkFMUyxcbiAgcmVzb2x2ZUZyb21Sb290LFxuICByZXNvbHZlT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHRcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tYnVpbGQudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RnJhbWV3b3JrRGVmaW5lcyxcbiAgZ2V0SnN4SW1wb3J0U291cmNlLFxuICBpc1Bvc3Rjc3NOZWVkZWRcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHsgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbnMtZm9sZGVyLWRlcGxveW1lbnQudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWxQYXJhbXMgZXh0ZW5kcyBCdWlsZE9wdGlvbnMge1xuICAvKipcbiAgICogQSBidWlsZCBtb2RlLCBlaXRoZXIgYERldmVsb3BtZW50YCBvciBgUHJvZHVjdGlvbmAuXG4gICAqL1xuICByZWFkb25seSBtb2RlOiBCdWlsZE1vZGU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkfSBhbmQge0BsaW5rIGRldn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPcHRpb25zIGV4dGVuZHMgT2JzaWRpYW5QbHVnaW5EZXBsb3ltZW50T3B0aW9ucywgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDdXN0b21pemVzIHRoZSBvcHRpb25zIGhhbmRlZCB0byBwYXJjZWwncyBgUGFyY2VsYCBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbWl6ZVBhcmNlbE9wdGlvbnM/OiAob3B0aW9uczogSW5pdGlhbFBhcmNlbE9wdGlvbnMpID0+IEluaXRpYWxQYXJjZWxPcHRpb25zO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRQYXJjZWxDb25maWdGaWxlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGFyY2VsQ29uZmlnRmlsZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbnN1bWVyJ3Mgb3duIGAucGFyY2VscmNgLCByZWxhdGl2ZSB0byB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyYXRpb24ncyBmb2xkZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHByb2plY3RcbiAgICogaGFzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBjb25zdW1lclBhcmNlbHJjUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgZmVhdHVyZXMuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlcz86IE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldFBhcmNlbE9wdGlvbnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFBhcmNlbE9wdGlvbnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJ1aWxkIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBidWlsZENvbnRleHQ6IE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBQYXJjZWwncyBjYWNoZSBmb2xkZXIuIE5hbWVkIGV4cGxpY2l0bHkgYmVjYXVzZSBwYXJjZWwgb3RoZXJ3aXNlIHRha2VzIHRoZSBmb2xkZXIgb2YgdGhlIG5lYXJlc3RcbiAgICogbG9ja2ZpbGUgZm9yIHRoZSBwcm9qZWN0IHJvb3QsIHdoaWNoIGluIGEgd29ya3NwYWNlIGlzIG5vdCB0aGUgcGx1Z2luJ3MuXG4gICAqL1xuICByZWFkb25seSBjYWNoZUZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VuZXJhdGVkIGAucGFyY2VscmNgLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBmaWxlcyBvZiB0aGUgZ2VuZXJhdGVkIHBhcmNlbCBjb25maWd1cmF0aW9uLCBieSBmaWxlIG5hbWUuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcmNlbENvbmZpZ0ZpbGVzID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbi8vIEluc2lkZSBwYXJjZWwncyBvd24gY2FjaGUgZm9sZGVyOiBwYXJjZWwgcmVmdXNlcyByZWxhdGl2ZSBwbHVnaW5zIGluIGEgY29uZmlnIHVuZGVyIGBub2RlX21vZHVsZXNgIChpdFxuLy8gdGFrZXMgc3VjaCBhIGNvbmZpZyBmb3IgYSBwdWJsaXNoZWQgcGFja2FnZSksIGFuZCBpdCBuZXZlciB3YXRjaGVzIGl0cyBjYWNoZSBmb2xkZXIsIHNvIHJlZ2VuZXJhdGluZ1xuLy8gdGhlc2UgZmlsZXMgb24gZXZlcnkgYnVpbGQgY2Fubm90IHRyaWdnZXIgYSByZWJ1aWxkLlxuY29uc3QgUEFSQ0VMX0NBQ0hFX0ZPTERFUiA9ICcucGFyY2VsLWNhY2hlJztcbmNvbnN0IEdFTkVSQVRFRF9QQVJDRUxfQ09ORklHX0ZPTERFUiA9IGAke1BBUkNFTF9DQUNIRV9GT0xERVJ9L29ic2lkaWFuLWRldi10b29sa2l0YDtcbmNvbnN0IFBBUkNFTFJDID0gJy5wYXJjZWxyYyc7XG5cbi8qKlxuICogT25lIGRpYWdub3N0aWMgb2YgYSB7QGxpbmsgUGFyY2VsRXJyb3JMaWtlfS5cbiAqL1xuaW50ZXJmYWNlIFBhcmNlbEVycm9yRGlhZ25vc3RpYyB7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IHBhcmNlbCB0aHJvd3Mgd2hlbiBhIGJ1aWxkIGZhaWxzOiBhbiBlcnJvciBjYXJyeWluZyBpdHMgZGlhZ25vc3RpY3MuXG4gKi9cbmludGVyZmFjZSBQYXJjZWxFcnJvckxpa2Uge1xuICByZWFkb25seSBkaWFnbm9zdGljcz86IHJlYWRvbmx5IFBhcmNlbEVycm9yRGlhZ25vc3RpY1tdO1xufVxuY29uc3QgUkVTT0xWRVJfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1yZXNvbHZlci5janMnO1xuY29uc3QgTkFNRVJfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1uYW1lci5janMnO1xuY29uc3QgSU5MSU5FX0lNUE9SVFNfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1pbmxpbmUtaW1wb3J0cy5janMnO1xuY29uc3QgT1BUSU1JWkVSX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tb3B0aW1pemVyLmNqcyc7XG5jb25zdCBQUkVfTUlOSUZZX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tcHJlLW1pbmlmeS5janMnO1xuY29uc3QgRkVBVFVSRVNfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy5janMnO1xuY29uc3QgSlNPTl9JTkRFTlQgPSAyO1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gUnVucyBhIHJlYWwgcGFyY2VsIGJ1aWxkOyBleGVyY2lzZWQgYnkgdGhlIGJ1bmRsZXIgaW50ZWdyYXRpb24gdGVzdC4gKi9cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gaW4gcHJvZHVjdGlvbiBtb2RlIHVzaW5nIHBhcmNlbC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1aWxkIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGQob3B0aW9ucz86IEJ1aWxkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbCh7IC4uLm9wdGlvbnMsIG1vZGU6IEJ1aWxkTW9kZS5Qcm9kdWN0aW9uIH0pO1xuICByZXN1bHQudGhyb3dPbkZhaWx1cmUoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIE9ic2lkaWFuIHBsdWdpbiB3aXRoIHBhcmNlbCwgb25jZSBmb3IgYSBwcm9kdWN0aW9uIGJ1aWxkLCBvciB3YXRjaGluZyBmb3IgYSBkZXZlbG9wbWVudCBvbmUuXG4gKlxuICogUnVucyB0aGUgcHJvamVjdCdzIGBidWlsZDpjb21waWxlYCBzY3JpcHQgZmlyc3Qgd2hlbiBpdCBoYXMgb25lLCBhcyB0aGUgZXNidWlsZCBidWlsZGVyIGRvZXMsIHNpbmNlXG4gKiBwYXJjZWwgc3RyaXBzIFR5cGVTY3JpcHQgdHlwZXMgd2l0aG91dCBjaGVja2luZyB0aGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gaW5kaWNhdGluZyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBidWlsZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsKHBhcmFtczogQnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWxQYXJhbXMpOiBQcm9taXNlPENsaVRhc2tSZXN1bHQ+IHtcbiAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2J1aWxkOmNvbXBpbGUnKTtcbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0KHBhcmFtcyk7XG4gIGF3YWl0IGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dC5kaXN0Rm9sZGVyKTtcbiAgYXdhaXQgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoYnVpbGRDb250ZXh0KTtcblxuICBjb25zdCBjb25maWdGb2xkZXIgPSByZXNvbHZlRnJvbVJvb3QoR0VORVJBVEVEX1BBUkNFTF9DT05GSUdfRk9MREVSKTtcbiAgY29uc3QgY29uc3VtZXJQYXJjZWxyY1BhdGggPSByZXNvbHZlRnJvbVJvb3QoUEFSQ0VMUkMpO1xuICBhd2FpdCBta2Rpcihjb25maWdGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjb25maWdGaWxlcyA9IGdldFBhcmNlbENvbmZpZ0ZpbGVzKHtcbiAgICBjb25zdW1lclBhcmNlbHJjUGF0aDogZXhpc3RzU3luYyhjb25zdW1lclBhcmNlbHJjUGF0aCkgPyB0b1Bvc2l4UGF0aChyZWxhdGl2ZShjb25maWdGb2xkZXIsIGNvbnN1bWVyUGFyY2VscmNQYXRoKSkgOiB1bmRlZmluZWQsXG4gICAgZmVhdHVyZXM6IHBhcmFtc1xuICB9KTtcbiAgZm9yIChjb25zdCBbZmlsZU5hbWUsIGNvbnRlbnRzXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdGaWxlcykpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oY29uZmlnRm9sZGVyLCBmaWxlTmFtZSk7XG4gICAgLy8gUmV3cml0dGVuIG9ubHkgd2hlbiBpdCBjaGFuZ2VkOiBwYXJjZWwgaW52YWxpZGF0ZXMgaXRzIGNhY2hlIG9uIGEgY29uZmlnIGZpbGUncyBtb2RpZmljYXRpb24gdGltZS5cbiAgICBpZiAoIWV4aXN0c1N5bmMoZmlsZVBhdGgpIHx8IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKSAhPT0gY29udGVudHMpIHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudHMsICd1dGYtOCcpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHsgUGFyY2VsIH0gPSBhd2FpdCBpbXBvcnQoJ0BwYXJjZWwvY29yZScpO1xuICBjb25zdCBwYXJjZWxPcHRpb25zID0gZ2V0UGFyY2VsT3B0aW9ucyh7IGJ1aWxkQ29udGV4dCwgY2FjaGVGb2xkZXI6IHJlc29sdmVGcm9tUm9vdChQQVJDRUxfQ0FDSEVfRk9MREVSKSwgY29uZmlnUGF0aDogam9pbihjb25maWdGb2xkZXIsIFBBUkNFTFJDKSB9KTtcbiAgY29uc3QgYnVuZGxlciA9IG5ldyBQYXJjZWwocGFyYW1zLmN1c3RvbWl6ZVBhcmNlbE9wdGlvbnM/LihwYXJjZWxPcHRpb25zKSA/PyBwYXJjZWxPcHRpb25zKTtcblxuICBpZiAoYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYnVpbGRUaW1lLCBidW5kbGVHcmFwaCB9ID0gYXdhaXQgYnVuZGxlci5ydW4oKTtcbiAgICAgIGNvbnNvbGUud2FybihgQnVpbHQgJHtTdHJpbmcoYnVuZGxlR3JhcGguZ2V0QnVuZGxlcygpLmxlbmd0aCl9IGJ1bmRsZShzKSB3aXRoIHBhcmNlbCBpbiAke1N0cmluZyhidWlsZFRpbWUpfSBtcy5gKTtcbiAgICAgIHJldHVybiBDbGlUYXNrUmVzdWx0LlN1Y2Nlc3MoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXRQYXJjZWxFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuIENsaVRhc2tSZXN1bHQuRmFpbHVyZSgpO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGJ1bmRsZXIud2F0Y2goKGVycm9yLCBldmVudCkgPT4ge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXRQYXJjZWxFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoYW5kbGVXYXRjaEV2ZW50KGV2ZW50LCBidWlsZENvbnRleHQpO1xuICB9KTtcbiAgcmV0dXJuIENsaVRhc2tSZXN1bHQuRG9Ob3RFeGl0KCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gaW4gZGV2ZWxvcG1lbnQgbW9kZSB1c2luZyBwYXJjZWwsIHdhdGNoaW5nIGZvciBjaGFuZ2VzIGFuZCBkZXBsb3lpbmcgZXZlcnlcbiAqIHN1Y2Nlc3NmdWwgcmVidWlsZCBpbnRvIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IGluZGljYXRpbmcgdGhlIGJ1aWxkIHJlc3VsdC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBJbnRlbnRpb25hbGx5IHNoYXJlcyBCdWlsZE9wdGlvbnMgd2l0aCBidWlsZCgpLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldihvcHRpb25zPzogQnVpbGRPcHRpb25zKTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbCh7IC4uLm9wdGlvbnMsIG1vZGU6IEJ1aWxkTW9kZS5EZXZlbG9wbWVudCB9KTtcbn1cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBmaWxlcyBvZiB0aGUgcGFyY2VsIGNvbmZpZ3VyYXRpb24gdGhlIGJ1aWxkIHJ1bnMgd2l0aC5cbiAqXG4gKiBUaGUgYnVpbGQgZmVhdHVyZXMgYWRkIHBpcGVsaW5lcyB0aGF0IHJ1biB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zLCB0aHJvdWdoIG9uZSBnZW5lcmF0ZWQgdHJhbnNmb3JtZXIgdGhhdFxuICogbG9hZHMgdGhlbSBmcm9tIHRoZSB0b29sa2l0OiBTb2xpZCdzIGAuanN4YCAvIGAudHN4YCwgU3ZlbHRlJ3MgYC5zdmVsdGVgIC8gYC5zdmVsdGUudHNgIC8gYC5zdmVsdGUuanNgLCBgLndhc21gLFxuICogYW5kIHdpdGggYHN0eWxlcy5wb3N0Y3NzYCBvciBgc3R5bGVzLnRhaWx3aW5kYCBldmVyeSBzdHlsZXNoZWV0LCBpbiBwbGFjZSBvZiBwYXJjZWwncyBvd24gUG9zdENTUyBzdGVwLiBSZWFjdCBhbmRcbiAqIFByZWFjdCBKU1ggaXMgY29tcGlsZWQgaGVyZSB0b28sIHNpbmNlIHBhcmNlbCByZWFkcyB0aGUgSlNYIHJ1bnRpbWUgZnJvbSBhIHRzY29uZmlnIHdpdGhvdXQgZm9sbG93aW5nIGl0cyBgZXh0ZW5kc2AsXG4gKiBhbmQgd2l0aCBhbnkgZnJhbWV3b3JrIGV2ZXJ5IHNjcmlwdCBoYXMgdGhlIGZyYW1ld29yaydzIGNvbXBpbGUtdGltZSBjb25zdGFudHMgcmVwbGFjZWQuIFBhcmNlbCBjb21waWxlcyBWdWUgd2l0aFxuICogYEBwYXJjZWwvdHJhbnNmb3JtZXItdnVlYCBhbmQgc2NvcGVzIGAqLm1vZHVsZS5jc3NgIGl0c2VsZiwgc28gdGhvc2UgbmVlZCBubyBwaXBlbGluZSBoZXJlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldFBhcmNlbENvbmZpZ0ZpbGVzUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlcywgYnkgZmlsZSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyY2VsQ29uZmlnRmlsZXMocGFyYW1zOiBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtcyk6IFBhcmNlbENvbmZpZ0ZpbGVzIHtcbiAgY29uc3QgeyBjb25zdW1lclBhcmNlbHJjUGF0aCwgZmVhdHVyZXMgPSB7fSB9ID0gcGFyYW1zO1xuICBjb25zdCBmZWF0dXJlVHJhbnNmb3JtZXIgPSBgLi8ke0ZFQVRVUkVTX0ZJTEVfTkFNRX1gO1xuICBjb25zdCB0cmFuc2Zvcm1lcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBpZiAoZmVhdHVyZXMuZnJhbWV3b3JrID09PSAnc3ZlbHRlJykge1xuICAgIHRyYW5zZm9ybWVyc1snKi5zdmVsdGUnXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICAgIHRyYW5zZm9ybWVyc1snKi5zdmVsdGUue2pzLHRzfSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lciwgYC4vJHtJTkxJTkVfSU1QT1JUU19GSUxFX05BTUV9YCwgJy4uLiddO1xuICB9XG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgPT09ICdzb2xpZCcgfHwgZ2V0SnN4SW1wb3J0U291cmNlKGZlYXR1cmVzLmZyYW1ld29yaykgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyYW5zZm9ybWVyc1snKi57anN4LHRzeH0nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICB9XG4gIGlmIChmZWF0dXJlcy53YXNtKSB7XG4gICAgdHJhbnNmb3JtZXJzWycqLndhc20nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICB9XG4gIGlmIChpc1Bvc3Rjc3NOZWVkZWQoZmVhdHVyZXMuc3R5bGVzKSkge1xuICAgIHRyYW5zZm9ybWVyc1snKi57Y3NzLHBjc3N9J10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyLCAnQHBhcmNlbC90cmFuc2Zvcm1lci1jc3MnXTtcbiAgfVxuICBjb25zdCBkZWZpbmVzID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogZmVhdHVyZXMuZnJhbWV3b3JrLCBpc1Byb2R1Y3Rpb25CdWlsZDogdHJ1ZSB9KTtcbiAgdHJhbnNmb3JtZXJzWycqLntqcyxtanMsY2pzLGpzeCx0cyxtdHMsY3RzLHRzeH0nXSA9IFtcbiAgICAuLi5PYmplY3Qua2V5cyhkZWZpbmVzKS5sZW5ndGggPiAwID8gW2ZlYXR1cmVUcmFuc2Zvcm1lcl0gOiBbXSxcbiAgICBgLi8ke0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRX1gLFxuICAgICcuLi4nXG4gIF07XG5cbiAgY29uc3QgcGFyY2VscmMgPSB7XG4gICAgZXh0ZW5kczogY29uc3VtZXJQYXJjZWxyY1BhdGggPz8gJ0BwYXJjZWwvY29uZmlnLWRlZmF1bHQnLFxuICAgIG5hbWVyczogW2AuLyR7TkFNRVJfRklMRV9OQU1FfWAsICcuLi4nXSxcbiAgICBvcHRpbWl6ZXJzOiB7XG4gICAgICAnKi5qcyc6IFtgLi8ke1BSRV9NSU5JRllfRklMRV9OQU1FfWAsICcuLi4nLCBgLi8ke09QVElNSVpFUl9GSUxFX05BTUV9YF1cbiAgICB9LFxuICAgIHJlc29sdmVyczogW2AuLyR7UkVTT0xWRVJfRklMRV9OQU1FfWAsICcuLi4nXSxcbiAgICB0cmFuc2Zvcm1lcnNcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIFtGRUFUVVJFU19GSUxFX05BTUVdOiBgLypcbiAqIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIFJ1bnMgdGhlIHRvb2xraXQncyBzaGFyZWQgdHJhbnNmb3JtcyBmb3IgdGhlIGJ1aWxkIGZlYXR1cmVzLCBsb2FkZWRcbiAqIGZyb20gdGhlIHRvb2xraXQgaXRzZWxmLCBzbyBwYXJjZWwgY29tcGlsZXMgZWFjaCBmZWF0dXJlIHRoZSB3YXkgZXZlcnkgb3RoZXIgYnVuZGxlciBhZGFwdGVyIGRvZXMuXG4gKi9cbmNvbnN0IHsgVHJhbnNmb3JtZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IEZFQVRVUkVTX01PRFVMRV9VUkwgPSAke0pTT04uc3RyaW5naWZ5KGdldFNpYmxpbmdNb2R1bGVVcmwoJ29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcycpKX07XG5jb25zdCBUUkFOU0ZPUk1TX01PRFVMRV9VUkwgPSAke0pTT04uc3RyaW5naWZ5KGdldFNpYmxpbmdNb2R1bGVVcmwoJ29ic2lkaWFuLXBsdWdpbi10cmFuc2Zvcm1zJykpfTtcbmNvbnN0IEZSQU1FV09SSyA9ICR7SlNPTi5zdHJpbmdpZnkoZmVhdHVyZXMuZnJhbWV3b3JrID8/IG51bGwpfTtcbmNvbnN0IFNUWUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoZmVhdHVyZXMuc3R5bGVzID8/IHt9KX07XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFRyYW5zZm9ybWVyKHtcbiAgYXN5bmMgdHJhbnNmb3JtKHsgYXNzZXQsIG9wdGlvbnMgfSkge1xuICAgIGNvbnN0IHsgZ2V0RmVhdHVyZUZpbGVLaW5kLCBnZXRGcmFtZXdvcmtEZWZpbmVzLCBnZXRKc3hJbXBvcnRTb3VyY2UsIHJlcGxhY2VEZWZpbmVzIH0gPSBhd2FpdCBpbXBvcnQoRkVBVFVSRVNfTU9EVUxFX1VSTCk7XG4gICAgY29uc3QgdHJhbnNmb3JtcyA9IGF3YWl0IGltcG9ydChUUkFOU0ZPUk1TX01PRFVMRV9VUkwpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gYXNzZXQuZmlsZVBhdGg7XG4gICAgY29uc3QgaXNQcm9kdWN0aW9uQnVpbGQgPSBvcHRpb25zLm1vZGUgPT09ICdwcm9kdWN0aW9uJztcbiAgICBjb25zdCBkZWZpbmVzID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogRlJBTUVXT1JLID8/IHVuZGVmaW5lZCwgaXNQcm9kdWN0aW9uQnVpbGQgfSk7XG4gICAgc3dpdGNoIChnZXRGZWF0dXJlRmlsZUtpbmQoZmlsZVBhdGgpKSB7XG4gICAgICBjYXNlICdqc3gnOiB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBhd2FpdCBhc3NldC5nZXRDb2RlKCk7XG4gICAgICAgIGNvbnN0IGpzeEltcG9ydFNvdXJjZSA9IGdldEpzeEltcG9ydFNvdXJjZShGUkFNRVdPUksgPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gRlJBTUVXT1JLID09PSAnc29saWQnXG4gICAgICAgICAgPyBhd2FpdCB0cmFuc2Zvcm1zLnRyYW5zZm9ybVNvbGlkKHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkIH0pXG4gICAgICAgICAgOiBhd2FpdCB0cmFuc2Zvcm1zLnRyYW5zZm9ybUpzeCh7IGNvZGUsIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCwganN4SW1wb3J0U291cmNlIH0pO1xuICAgICAgICBhc3NldC5zZXRDb2RlKHJlcGxhY2VEZWZpbmVzKHJlc3VsdC5jb2RlLCBkZWZpbmVzKSk7XG4gICAgICAgIGFzc2V0LnR5cGUgPSAnanMnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0eWxlc2hlZXQnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtQ3NzKHsgZmlsZVBhdGgsIGlzQ3NzTW9kdWxlU2NvcGVkOiBmYWxzZSwgaXNQcm9kdWN0aW9uQnVpbGQsIHNvdXJjZTogYXdhaXQgYXNzZXQuZ2V0Q29kZSgpLCBzdHlsZXM6IFNUWUxFUyB9KTtcbiAgICAgICAgYXNzZXQuc2V0Q29kZShyZXN1bHQuY3NzKTtcbiAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlc3VsdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBhc3NldC5pbnZhbGlkYXRlT25GaWxlQ2hhbmdlKGRlcGVuZGVuY3kpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ZlbHRlJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1zLnRyYW5zZm9ybVN2ZWx0ZSh7IGNvZGU6IGF3YWl0IGFzc2V0LmdldENvZGUoKSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkIH0pO1xuICAgICAgICBhc3NldC5zZXRDb2RlKHJlcGxhY2VEZWZpbmVzKHJlc3VsdC5jb2RlLCBkZWZpbmVzKSk7XG4gICAgICAgIGFzc2V0LnR5cGUgPSAnanMnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3dhc20nOlxuICAgICAgICBhc3NldC5zZXRDb2RlKHRyYW5zZm9ybXMuZ2V0V2FzbU1vZHVsZUNvZGUoYXdhaXQgYXNzZXQuZ2V0QnVmZmVyKCkpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBBIGZyYW1ld29yaydzIHJ1bnRpbWUgcmVhZHMgcHJvY2Vzcy5lbnYuTk9ERV9FTlYsIHdoaWNoIHBhcmNlbCBsZWF2ZXMgYWxvbmUgaW4gYW4gZWxlY3Ryb24tcmVuZGVyZXIgbGlicmFyeS5cbiAgICAgICAgY29uc3QgY29kZSA9IGF3YWl0IGFzc2V0LmdldENvZGUoKTtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSByZXBsYWNlRGVmaW5lcyhjb2RlLCBkZWZpbmVzKTtcbiAgICAgICAgaWYgKHJlcGxhY2VkICE9PSBjb2RlKSB7XG4gICAgICAgICAgYXNzZXQuc2V0Q29kZShyZXBsYWNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbYXNzZXRdO1xuICB9XG59KTtcbmAsXG4gICAgLy8gYFN0cmluZy5yYXdgLCBzbyB0aGUgcmVndWxhciBleHByZXNzaW9uIGJlbG93IHJlYWNoZXMgdGhlIGZpbGUgd2l0aCBpdHMgYmFja3NsYXNoZXMgaW50YWN0LlxuICAgIFtJTkxJTkVfSU1QT1JUU19GSUxFX05BTUVdOiBTdHJpbmcucmF3YC8qXG4gKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBLZWVwcyBldmVyeSBkeW5hbWljIGltcG9ydCgpIGluc2lkZSBtYWluLmpzLlxuICpcbiAqIE9ic2lkaWFuIGxvYWRzIGEgcGx1Z2luJ3MgbWFpbi5qcyBhbmQgbm90aGluZyBiZXNpZGUgaXQsIGFuZCBwYXJjZWwgbWFrZXMgZXZlcnkgaW1wb3J0KCkgYSBidW5kbGUgb2YgaXRzXG4gKiBvd24gd2l0aCBubyBvcHRpb24gdG8gaW5saW5lIG9uZS4gVGhpcyByZXdyaXRlcyBpbXBvcnQoJzxsaXRlcmFsPicpIGludG8gYSByZXF1aXJlKCkgaW5zaWRlIGFuIGFzeW5jXG4gKiBhcnJvdywgYmVmb3JlIHBhcmNlbCdzIG93biBKYXZhU2NyaXB0IHRyYW5zZm9ybWVyIHJ1bnM6IHRoZSBtb2R1bGUgc3RpbGwgZXZhbHVhdGVzIG9ubHkgd2hlbiB0aGF0IGNvZGVcbiAqIHJ1bnMsIGFuZCB0aGUgcHJvbWlzZSBzdGlsbCByZWplY3RzIHdoZW4gZXZhbHVhdGlvbiB0aHJvd3MuIE9ubHkgYSBwbGFpbiBzdHJpbmcgc3BlY2lmaWVyIGlzIHJld3JpdHRlbixcbiAqIHNpbmNlIGEgY29tcHV0ZWQgb25lIGNhbm5vdCBiZSBidW5kbGVkIGJ5IGFueSBidW5kbGVyLlxuICovXG5jb25zdCB7IFRyYW5zZm9ybWVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5jb25zdCBEWU5BTUlDX0lNUE9SVCA9IC9cXGJpbXBvcnRcXChcXHMqKFtcIiddKShbXlwiJ1xceDYwXFxuXFxcXF0rKVxcMVxccypcXCkvZ3U7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFRyYW5zZm9ybWVyKHtcbiAgYXN5bmMgdHJhbnNmb3JtKHsgYXNzZXQgfSkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGFzc2V0LmdldENvZGUoKTtcbiAgICBpZiAoc291cmNlLmluY2x1ZGVzKCdpbXBvcnQoJykpIHtcbiAgICAgIGFzc2V0LnNldENvZGUoc291cmNlLnJlcGxhY2UoRFlOQU1JQ19JTVBPUlQsIChfbWF0Y2gsIHF1b3RlLCBzcGVjaWZpZXIpID0+ICcoYXN5bmMgKCkgPT4gcmVxdWlyZSgnICsgcXVvdGUgKyBzcGVjaWZpZXIgKyBxdW90ZSArICcpKSgpJykpO1xuICAgIH1cbiAgICByZXR1cm4gW2Fzc2V0XTtcbiAgfVxufSk7XG5gLFxuICAgIFtOQU1FUl9GSUxFX05BTUVdOiBgLyogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gT2JzaWRpYW4gbG9hZHMgYSBwbHVnaW4ncyBzdHlsZXNoZWV0IGZyb20gc3R5bGVzLmNzcyBhbmQgbm90aGluZyBlbHNlLiAqL1xuY29uc3QgeyBOYW1lciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgTmFtZXIoe1xuICBuYW1lKHsgYnVuZGxlIH0pIHtcbiAgICByZXR1cm4gYnVuZGxlLnR5cGUgPT09ICdjc3MnID8gJyR7T2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuU3R5bGVzQ3NzfScgOiBudWxsO1xuICB9XG59KTtcbmAsXG4gICAgW09QVElNSVpFUl9GSUxFX05BTUVdOiBgLypcbiAqIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIFJ1bnMgYWZ0ZXIgcGFyY2VsJ3Mgb3duIG9wdGltaXplcnMsIG9uIHRoZSBKYXZhU2NyaXB0IGJ1bmRsZS5cbiAqXG4gKiBPYnNpZGlhbiBldmFsdWF0ZXMgbWFpbi5qcyBhcyB0aGUgYm9keSBvZiBmdW5jdGlvbiAocmVxdWlyZSwgbW9kdWxlLCBleHBvcnRzKSwgd2l0aCBhIG1vZHVsZSBvYmplY3QgdGhhdFxuICogaGFzIG5vIHJlcXVpcmUgb2YgaXRzIG93biwgYW5kIHBhcmNlbCdzIHJ1bnRpbWUgcmVhY2hlcyBldmVyeSBleHRlcm5hbCBtb2R1bGUgdGhyb3VnaCBtb2R1bGUucmVxdWlyZS5cbiAqIFdpdGhvdXQgdGhlIGZpcnN0IGxpbmUgYmVsb3csIHRoZSB2ZXJ5IGZpcnN0IHJlcXVpcmUoJ29ic2lkaWFuJykgdGhyb3dzIFwiQ2Fubm90IGZpbmQgbW9kdWxlXCIuIFRoZSBiYW5uZXJcbiAqIGdvZXMgaW4gaGVyZSB0b28sIGFmdGVyIG1pbmlmaWNhdGlvbiwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHN0cmlwIGl0IGFzIGFuIG9yZGluYXJ5IGNvbW1lbnQuXG4gKi9cbmNvbnN0IHsgT3B0aW1pemVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5jb25zdCBQUkVBTUJMRSA9ICR7SlNPTi5zdHJpbmdpZnkoYCR7Z2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3BhcmNlbCcpfWlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLnJlcXVpcmUgIT09ICdmdW5jdGlvbicpIHsgbW9kdWxlLnJlcXVpcmUgPSByZXF1aXJlOyB9XFxuYCl9O1xuY29uc3QgUFJFQU1CTEVfTElORV9DT1VOVCA9ICR7U3RyaW5nKGdldE9ic2lkaWFuUGx1Z2luQmFubmVyKCdwYXJjZWwnKS5zcGxpdCgnXFxuJykubGVuZ3RoKX07XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDb250ZW50cyhjb250ZW50cykge1xuICBpZiAodHlwZW9mIGNvbnRlbnRzID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBjb250ZW50cztcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnRzKSkge1xuICAgIHJldHVybiBjb250ZW50cy50b1N0cmluZygndXRmLTgnKTtcbiAgfVxuICBjb25zdCBjaHVua3MgPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb250ZW50cykge1xuICAgIGNodW5rcy5wdXNoKEJ1ZmZlci5mcm9tKGNodW5rKSk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygndXRmLTgnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgT3B0aW1pemVyKHtcbiAgYXN5bmMgb3B0aW1pemUoeyBjb250ZW50cywgbWFwIH0pIHtcbiAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVhZENvbnRlbnRzKGNvbnRlbnRzKTtcbiAgICBpZiAobWFwKSB7XG4gICAgICBtYXAub2Zmc2V0TGluZXMoMSwgUFJFQU1CTEVfTElORV9DT1VOVCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRzOiBQUkVBTUJMRSArIGNvZGUsIG1hcCB9O1xuICB9XG59KTtcbmAsXG4gICAgW1BBUkNFTFJDXTogYCR7SlNPTi5zdHJpbmdpZnkocGFyY2VscmMsIG51bGwsIEpTT05fSU5ERU5UKX1cXG5gLFxuICAgIC8vIGBTdHJpbmcucmF3YCwgc28gdGhlIGxpbmUgYnJlYWtzIGJlbG93IHJlYWNoIHRoZSBmaWxlIGFzIGVzY2FwZXMuXG4gICAgW1BSRV9NSU5JRllfRklMRV9OQU1FXTogU3RyaW5nLnJhd2AvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyBiZWZvcmUgcGFyY2VsJ3Mgb3duIG9wdGltaXplcnMsIG9uIHRoZSBKYXZhU2NyaXB0IGJ1bmRsZS5cbiAqXG4gKiBBIHNjb3BlLWhvaXN0ZWQgbGlicmFyeSBidW5kbGUgcmVxdWlyZSgpcyBldmVyeSBidW5kbGUgaXQgcmVmZXJlbmNlcywgdGhlIHN0eWxlc2hlZXQgaW5jbHVkZWQsIGFuZCBPYnNpZGlhblxuICogbG9hZHMgc3R5bGVzLmNzcyBpdHNlbGYsIGJlc2lkZSBtYWluLmpzLCB3aGVyZSBhIHJlcXVpcmUoKSBjYW5ub3QgcmVhY2ggaXQuIFRoZSBsaW5lIGlzIGJsYW5rZWQgcmF0aGVyIHRoYW5cbiAqIHJlbW92ZWQsIHNvIGEgc291cmNlIG1hcCBzdGlsbCBsaW5lcyB1cC5cbiAqXG4gKiBBIHNjb3BlLWhvaXN0ZWQgQ29tbW9uSlMgYnVuZGxlIGFsc28gZGVjbGFyZXMgZXZlcnkgbW9kdWxlJ3MgYmluZGluZ3MgYXQgaXRzIHRvcCBsZXZlbCwgdW5kZXIgbG9uZyBuYW1lcyBzdWNoXG4gKiBhcyAkYzU4OTlhZWI0Y2FhZGYyNyR2YXIkdGFza0lkQ291bnRlciwgYW5kIHBhcmNlbCBtaW5pZmllcyBpdCBhcyBhIHNjcmlwdCwgd2hlcmUgdGhlIG1pbmlmaWVyIG1heSBub3QgcmVuYW1lXG4gKiBhIHRvcC1sZXZlbCBiaW5kaW5nLCBzaW5jZSBpbiBhIHNjcmlwdCBpdCBpcyBhIGdsb2JhbC4gT2JzaWRpYW4gZXZhbHVhdGVzIG1haW4uanMgYXMgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiwgc29cbiAqIHdyYXBwaW5nIHRoZSBidW5kbGUgaW4gYW4gYXJyb3cgZnVuY3Rpb24gY2hhbmdlcyBub3RoaW5nIGF0IHJ1bnRpbWUgKGFuIGFycm93IGtlZXBzIHRoaXMgYW5kIGFyZ3VtZW50cykgYW5kXG4gKiBsZXRzIHRoZSBtaW5pZmllciByZW5hbWUgYWxsIG9mIHRoZW06IFNvbGlkJ3MgZml4dHVyZSBidWlsZCBpcyA3MCBLQiB3aXRob3V0IHRoaXMgYW5kIDEwIEtCIHdpdGggaXQuXG4gKi9cbmNvbnN0IHsgT3B0aW1pemVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5jb25zdCBTVFlMRVNIRUVUX1JFUVVJUkUgPSAke0pTT04uc3RyaW5naWZ5KGByZXF1aXJlKFwiLi8ke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlN0eWxlc0Nzc31cIik7XFxuYCl9O1xuXG5hc3luYyBmdW5jdGlvbiByZWFkQ29udGVudHMoY29udGVudHMpIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gY29udGVudHM7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50cykpIHtcbiAgICByZXR1cm4gY29udGVudHMudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIH1cbiAgY29uc3QgY2h1bmtzID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgY29udGVudHMpIHtcbiAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICB9XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ3V0Zi04Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IE9wdGltaXplcih7XG4gIGFzeW5jIG9wdGltaXplKHsgYnVuZGxlLCBjb250ZW50cywgbWFwIH0pIHtcbiAgICBjb25zdCBjb2RlID0gKGF3YWl0IHJlYWRDb250ZW50cyhjb250ZW50cykpLnJlcGxhY2UoU1RZTEVTSEVFVF9SRVFVSVJFLCAnXFxuJyk7XG4gICAgaWYgKCFidW5kbGUuZW52LnNob3VsZE9wdGltaXplKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50czogY29kZSwgbWFwIH07XG4gICAgfVxuICAgIGlmIChtYXApIHtcbiAgICAgIG1hcC5vZmZzZXRMaW5lcygxLCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudHM6ICcoKCkgPT4ge1xcbicgKyBjb2RlICsgJ1xcbn0pKCk7XFxuJywgbWFwIH07XG4gIH1cbn0pO1xuYCxcbiAgICBbUkVTT0xWRVJfRklMRV9OQU1FXTogYC8qXG4gKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBMZWF2ZXMgdGhlIG1vZHVsZXMgT2JzaWRpYW4gc3VwcGxpZXMgYXQgcnVudGltZSB0byByZXF1aXJlKCksIGFuZFxuICogcmVzb2x2ZXMgZXZlcnl0aGluZyBlbHNlIHRoZSB3YXkgQHBhcmNlbC9yZXNvbHZlci1kZWZhdWx0IGRvZXMsIHdpdGggdGhlIGJyb3dzZXIncyBleHBvcnQgY29uZGl0aW9ucy5cbiAqXG4gKiBQYXJjZWwgcmVzb2x2ZXMgYW4gZWxlY3Ryb24tcmVuZGVyZXIgdGFyZ2V0IHdpdGggdGhlIG5vZGUgYW5kIGVsZWN0cm9uIGNvbmRpdGlvbnMgYmVzaWRlIGJyb3dzZXIsIGFuZCBhbiBleHBvcnRzXG4gKiBtYXAgaXMgbWF0Y2hlZCBpbiB0aGUgcGFja2FnZSdzIG93biBrZXkgb3JkZXIsIHNvIGEgcGFja2FnZSBsaXN0aW5nIG5vZGUgZmlyc3QgKFZ1ZSwgU3ZlbHRlLCBTb2xpZCwgZmZsYXRlKSB3b3VsZFxuICogaGFuZCBvdmVyIGl0cyBOb2RlIGJ1aWxkOiBzZXZlcmFsIHRpbWVzIHRoZSBjb2RlLCBhbmQgb25lIHRoYXQgbWF5IG5vdCBsb2FkIG9uIG1vYmlsZS4gVGhlIE5vZGUgYnVpbHRpbnMgbmVlZCBub1xuICogbm9kZSBjb25kaXRpb24gdG8gc3RheSBleHRlcm5hbCwgc2luY2UgdGhleSBhcmUgaW4gdGhlIGV4dGVybmFscyBiZWxvdy5cbiAqL1xuY29uc3QgeyBSZXNvbHZlciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcbmNvbnN0IHsgZGlybmFtZSB9ID0gcmVxdWlyZSgnbm9kZTpwYXRoJyk7XG5cbmNvbnN0IEVYVEVSTkFMUyA9IG5ldyBTZXQoJHtKU09OLnN0cmluZ2lmeShPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTKX0pO1xuXG5mdW5jdGlvbiBnZXRCcm93c2VyRW52aXJvbm1lbnQoZW52KSB7XG4gIHJldHVybiB7XG4gICAgY29udGV4dDogZW52LmNvbnRleHQsXG4gICAgaWQ6IGVudi5pZCArICc6b2JzaWRpYW4tZGV2LXRvb2xraXQtYnJvd3Nlci1jb25kaXRpb25zJyxcbiAgICBpbmNsdWRlTm9kZU1vZHVsZXM6IGVudi5pbmNsdWRlTm9kZU1vZHVsZXMsXG4gICAgaXNCcm93c2VyOiAoKSA9PiB0cnVlLFxuICAgIGlzRWxlY3Ryb246ICgpID0+IGZhbHNlLFxuICAgIGlzTGlicmFyeTogZW52LmlzTGlicmFyeSxcbiAgICBpc05vZGU6ICgpID0+IGZhbHNlLFxuICAgIGlzV29ya2VyOiAoKSA9PiBlbnYuaXNXb3JrZXIoKSxcbiAgICBpc1dvcmtsZXQ6ICgpID0+IGVudi5pc1dvcmtsZXQoKVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlTmFtZShzcGVjaWZpZXIpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGVjaWZpZXIuc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHNwZWNpZmllci5zdGFydHNXaXRoKCdAJykgPyBzZWdtZW50cy5zbGljZSgwLCAyKS5qb2luKCcvJykgOiBzZWdtZW50c1swXTtcbn1cblxuLy8gQHBhcmNlbC9ub2RlLXJlc29sdmVyLWNvcmUgaXMgd2hhdCBAcGFyY2VsL3Jlc29sdmVyLWRlZmF1bHQgcnVucywgcmVhY2hlZCB0aHJvdWdoIHRoZSBwYWNrYWdlcyB0aGF0IGluc3RhbGwgaXQuXG5mdW5jdGlvbiBsb2FkTm9kZVJlc29sdmVyKCkge1xuICBsZXQgZm9sZGVyID0gX19kaXJuYW1lO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VOYW1lIG9mIFsnQHBhcmNlbC9jb25maWctZGVmYXVsdCcsICdAcGFyY2VsL3Jlc29sdmVyLWRlZmF1bHQnXSkge1xuICAgIGZvbGRlciA9IGRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKHBhY2thZ2VOYW1lICsgJy9wYWNrYWdlLmpzb24nLCB7IHBhdGhzOiBbZm9sZGVyXSB9KSk7XG4gIH1cbiAgcmV0dXJuIHJlcXVpcmUocmVxdWlyZS5yZXNvbHZlKCdAcGFyY2VsL25vZGUtcmVzb2x2ZXItY29yZScsIHsgcGF0aHM6IFtmb2xkZXJdIH0pKS5kZWZhdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBSZXNvbHZlcih7XG4gIGFzeW5jIGxvYWRDb25maWcoeyBjb25maWcsIGxvZ2dlciwgb3B0aW9ucyB9KSB7XG4gICAgY29uc3QgcGFja2FnZUNvbmZpZyA9IGF3YWl0IGNvbmZpZy5nZXRDb25maWcoW10sIHsgcGFja2FnZUtleTogJ0BwYXJjZWwvcmVzb2x2ZXItZGVmYXVsdCcgfSk7XG4gICAgY29uc3QgTm9kZVJlc29sdmVyID0gbG9hZE5vZGVSZXNvbHZlcigpO1xuICAgIHJldHVybiBuZXcgTm9kZVJlc29sdmVyKHtcbiAgICAgIGZzOiBvcHRpb25zLmlucHV0RlMsXG4gICAgICBsb2dnZXIsXG4gICAgICBtb2RlOiBvcHRpb25zLm1vZGUsXG4gICAgICBwYWNrYWdlRXhwb3J0czogcGFja2FnZUNvbmZpZz8uY29udGVudHM/LnBhY2thZ2VFeHBvcnRzID8/IGZhbHNlLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IG9wdGlvbnMucGFja2FnZU1hbmFnZXIsXG4gICAgICBwcm9qZWN0Um9vdDogb3B0aW9ucy5wcm9qZWN0Um9vdCxcbiAgICAgIHNob3VsZEF1dG9JbnN0YWxsOiBvcHRpb25zLnNob3VsZEF1dG9JbnN0YWxsXG4gICAgfSk7XG4gIH0sXG4gIHJlc29sdmUoeyBjb25maWc6IG5vZGVSZXNvbHZlciwgZGVwZW5kZW5jeSwgc3BlY2lmaWVyIH0pIHtcbiAgICBjb25zdCBpc0V4dGVybmFsID0gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ25vZGU6JykgfHwgRVhURVJOQUxTLmhhcyhzcGVjaWZpZXIpIHx8IEVYVEVSTkFMUy5oYXMoZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyKSk7XG4gICAgaWYgKGlzRXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiB7IGlzRXhjbHVkZWQ6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVSZXNvbHZlci5yZXNvbHZlKHtcbiAgICAgIGVudjogZ2V0QnJvd3NlckVudmlyb25tZW50KGRlcGVuZGVuY3kuZW52KSxcbiAgICAgIGZpbGVuYW1lOiBzcGVjaWZpZXIsXG4gICAgICBsb2M6IGRlcGVuZGVuY3kubG9jLFxuICAgICAgcGFja2FnZUNvbmRpdGlvbnM6IGRlcGVuZGVuY3kucGFja2FnZUNvbmRpdGlvbnMsXG4gICAgICBwYXJlbnQ6IGRlcGVuZGVuY3kucmVzb2x2ZUZyb20sXG4gICAgICByYW5nZTogZGVwZW5kZW5jeS5yYW5nZSxcbiAgICAgIHNvdXJjZVBhdGg6IGRlcGVuZGVuY3kuc291cmNlUGF0aCxcbiAgICAgIHNwZWNpZmllclR5cGU6IGRlcGVuZGVuY3kuc3BlY2lmaWVyVHlwZVxuICAgIH0pO1xuICB9XG59KTtcbmBcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG9wdGlvbnMgaGFuZGVkIHRvIHBhcmNlbCdzIGBQYXJjZWxgIGNsYXNzLlxuICpcbiAqIFRoZSBvbmUgdGFyZ2V0IGlzIGBlbGVjdHJvbi1yZW5kZXJlcmAsIHdoZXJlIE9ic2lkaWFuIHJ1bnMgYSBwbHVnaW4sIGFuZCBDb21tb25KUy4gUGFyY2VsIGNvdW50cyB0aGF0XG4gKiBjb250ZXh0IGFzIGJvdGggYSBicm93c2VyIGFuZCBhIG5vZGUgb25lOiBub2RlIGtlZXBzIGBwcm9jZXNzYCwgYEJ1ZmZlcmAgYW5kIGBwcm9jZXNzLmVudmAgYXMgT2JzaWRpYW4nc1xuICogcmVuZGVyZXIgaGFzIHRoZW0sIHJhdGhlciB0aGFuIHBvbHlmaWxsZWQgb3IgaW5saW5lZCBmcm9tIHRoZSBidWlsZCBtYWNoaW5lLCBhbmQgYnJvd3NlciB0YWtlcyBhIHBhY2thZ2Unc1xuICogYGJyb3dzZXJgIGZpZWxkLiBJdHMgZXhwb3J0IGNvbmRpdGlvbnMgd291bGQgaW5jbHVkZSBgbm9kZWAgdG9vLCB3aGljaCB0aGUgZ2VuZXJhdGVkIHJlc29sdmVyIGRyb3BzLlxuICogYGluY2x1ZGVOb2RlTW9kdWxlc2AgYnVuZGxlcyB0aGUgZGVwZW5kZW5jaWVzLCB3aGljaCBhIG5vZGUtZmxhdm91cmVkIGNvbnRleHQgd291bGQgb3RoZXJ3aXNlIGxlYXZlIGFzXG4gKiBgcmVxdWlyZSgpYCBjYWxscyBub3RoaW5nIGluc3RhbGxzIGJlc2lkZSBhIHBsdWdpbiwgYW5kIGBpc0xpYnJhcnlgIGtlZXBzIHRoZSBlbnRyeSdzIGRlZmF1bHQgZXhwb3J0LCB3aGljaFxuICogaXMgaG93IE9ic2lkaWFuIGZpbmRzIHRoZSBwbHVnaW4gY2xhc3MuXG4gKlxuICogYHNob3VsZFNjb3BlSG9pc3RgIGlzIHNldCBleHBsaWNpdGx5IGJlY2F1c2UgcGFyY2VsIHJlYWRzIGl0IG9ubHkgZnJvbSBgZGVmYXVsdFRhcmdldE9wdGlvbnNgIGZvciBhIHRhcmdldFxuICogcGFzc2VkIGluIHRoZSBvcHRpb25zLCBuZXZlciBmcm9tIGBpc0xpYnJhcnlgIGFzIGl0IGRvZXMgZm9yIG9uZSBpbiBgcGFja2FnZS5qc29uYC4gV2l0aG91dCBpdCB0aGUgYnVuZGxlXG4gKiBpcyBub3QgdHJlZS1zaGFrZW4gYXQgYWxsOiBTdmVsdGUncyBmaXh0dXJlIGJ1aWxkIHdhcyAyMjQgS0Igd2l0aCBwYXJjZWwgYWdhaW5zdCAyNSBLQiB3aXRoIHZpdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0UGFyY2VsT3B0aW9uc1BhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgcGFyY2VsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJjZWxPcHRpb25zKHBhcmFtczogR2V0UGFyY2VsT3B0aW9uc1BhcmFtcyk6IEluaXRpYWxQYXJjZWxPcHRpb25zIHtcbiAgY29uc3QgeyBidWlsZENvbnRleHQsIGNhY2hlRm9sZGVyLCBjb25maWdQYXRoIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRhcmdldDogVGFyZ2V0RGVzY3JpcHRvciA9IHtcbiAgICBjb250ZXh0OiAnZWxlY3Ryb24tcmVuZGVyZXInLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBkaXN0RGlyYCBpcyB0aGUgbmFtZSBwYXJjZWwncyBBUEkgcmVhZHMuXG4gICAgZGlzdERpcjogYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIsXG4gICAgaW5jbHVkZU5vZGVNb2R1bGVzOiB0cnVlLFxuICAgIGlzTGlicmFyeTogdHJ1ZSxcbiAgICBvcHRpbWl6ZTogYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgIG91dHB1dEZvcm1hdDogJ2NvbW1vbmpzJyxcbiAgICBzb3VyY2VNYXA6ICFidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQgJiYgeyBpbmxpbmU6IHRydWUgfVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGNhY2hlRGlyYCBpcyB0aGUgbmFtZSBwYXJjZWwncyBBUEkgcmVhZHMuXG4gICAgY2FjaGVEaXI6IGNhY2hlRm9sZGVyLFxuICAgIGNvbmZpZzogY29uZmlnUGF0aCxcbiAgICBkZWZhdWx0VGFyZ2V0T3B0aW9uczoge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRpc3REaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICAgIGRpc3REaXI6IGJ1aWxkQ29udGV4dC5kaXN0Rm9sZGVyLFxuICAgICAgc2hvdWxkT3B0aW1pemU6IGJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCxcbiAgICAgIHNob3VsZFNjb3BlSG9pc3Q6IHRydWUsXG4gICAgICBzb3VyY2VNYXBzOiAhYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkXG4gICAgfSxcbiAgICBlbnRyaWVzOiBidWlsZENvbnRleHQuZW50cnlQb2ludCxcbiAgICBtb2RlOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnLFxuICAgIHRhcmdldHM6IHsgb2JzaWRpYW5QbHVnaW46IHRhcmdldCB9XG4gIH07XG59XG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gUGFydCBvZiB0aGUgcGFyY2VsIGJ1aWxkIGFib3ZlLiAqL1xuZnVuY3Rpb24gZm9ybWF0UGFyY2VsRXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBkaWFnbm9zdGljcyA9IChlcnJvciBhcyBQYXJjZWxFcnJvckxpa2UgfCB1bmRlZmluZWQpPy5kaWFnbm9zdGljcztcbiAgaWYgKGRpYWdub3N0aWNzICYmIGRpYWdub3N0aWNzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLm1lc3NhZ2UpLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgPz8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBVUkwgb2YgYSBtb2R1bGUgb2YgdGhpcyBmb2xkZXIsIGluIHRoZSBzYW1lIGZvcm0gYXMgdGhpcyBvbmUgKGAudHNgIGZyb20gc291cmNlLCBgLm1qc2Agb3IgYC5janNgIG9uY2VcbiAqIGJ1aWx0KSwgd2hpY2ggdGhlIGdlbmVyYXRlZCB0cmFuc2Zvcm1lciBpbXBvcnRzLlxuICpcbiAqIEBwYXJhbSBiYXNlTmFtZSAtIFRoZSBtb2R1bGUncyBmaWxlIG5hbWUgd2l0aG91dCBpdHMgZXh0ZW5zaW9uLlxuICogQHJldHVybnMgVGhlIG1vZHVsZSdzIGBmaWxlOmAgVVJMLlxuICovXG5mdW5jdGlvbiBnZXRTaWJsaW5nTW9kdWxlVXJsKGJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmV3IFVSTChgJHtiYXNlTmFtZX0ke2V4dG5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKX1gLCBpbXBvcnQubWV0YS51cmwpLmhyZWY7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVdhdGNoRXZlbnQoZXZlbnQ6IEJ1aWxkRXZlbnQgfCB1bmRlZmluZWQsIGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQpOiB2b2lkIHtcbiAgaWYgKGV2ZW50Py50eXBlID09PSAnYnVpbGRGYWlsdXJlJykge1xuICAgIGNvbnNvbGUuZXJyb3IoZXZlbnQuZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLm1lc3NhZ2UpLmpvaW4oJ1xcbicpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV2ZW50Py50eXBlICE9PSAnYnVpbGRTdWNjZXNzJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUud2FybihgUmVidWlsdCB3aXRoIHBhcmNlbCBpbiAke1N0cmluZyhldmVudC5idWlsZFRpbWUpfSBtcy5gKTtcbiAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIoYnVpbGRDb250ZXh0KSk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNB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
|