@mnaoumov/obsidian-dev-toolkit 3.2.0 → 3.3.0
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 +139 -118
- package/dist/lib/cjs/demo-vault-coverage.d.cts +100 -5
- 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 -81
- package/dist/lib/cjs/index.d.cts +0 -2
- 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 -78
- package/dist/lib/cjs/test-runners/index.d.cts +0 -1
- 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/demo-vault-coverage.d.mts +100 -5
- package/dist/lib/esm/demo-vault-coverage.mjs +139 -44
- package/dist/lib/esm/index.d.mts +0 -2
- package/dist/lib/esm/index.mjs +1 -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/index.d.mts +0 -1
- package/dist/lib/esm/test-runners/index.mjs +1 -3
- 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 +3 -2
|
@@ -29,80 +29,6 @@ function ensureBrowserProcess() {
|
|
|
29
29
|
|
|
30
30
|
ensureBrowserProcess();
|
|
31
31
|
})();
|
|
32
|
-
(function patchObsidianRequire() {
|
|
33
|
-
const originalRequire = require;
|
|
34
|
-
if (!originalRequire || originalRequire.__isPatched) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
require = Object.assign(
|
|
39
|
-
(id) => requirePatched(id),
|
|
40
|
-
originalRequire,
|
|
41
|
-
{
|
|
42
|
-
__isPatched: true
|
|
43
|
-
}
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
function extractDefault(module) {
|
|
47
|
-
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
51
|
-
'@codemirror/autocomplete',
|
|
52
|
-
'@codemirror/collab',
|
|
53
|
-
'@codemirror/commands',
|
|
54
|
-
'@codemirror/language',
|
|
55
|
-
'@codemirror/lint',
|
|
56
|
-
'@codemirror/search',
|
|
57
|
-
'@codemirror/state',
|
|
58
|
-
'@codemirror/text',
|
|
59
|
-
'@codemirror/view',
|
|
60
|
-
'@lezer/common',
|
|
61
|
-
'@lezer/highlight',
|
|
62
|
-
'@lezer/lr',
|
|
63
|
-
'obsidian']
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
67
|
-
'@codemirror/closebrackets',
|
|
68
|
-
'@codemirror/comment',
|
|
69
|
-
'@codemirror/fold',
|
|
70
|
-
'@codemirror/gutter',
|
|
71
|
-
'@codemirror/highlight',
|
|
72
|
-
'@codemirror/history',
|
|
73
|
-
'@codemirror/matchbrackets',
|
|
74
|
-
'@codemirror/panel',
|
|
75
|
-
'@codemirror/rangeset',
|
|
76
|
-
'@codemirror/rectangular-selection',
|
|
77
|
-
'@codemirror/stream-parser',
|
|
78
|
-
'@codemirror/tooltip']
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
function requirePatched(id) {
|
|
82
|
-
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
83
|
-
return originalRequire?.(id);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
87
|
-
if (globalThis.app.isMobile) {
|
|
88
|
-
if (id === 'process' || id === 'node:process') {
|
|
89
|
-
// eslint-disable-next-line no-console -- Valid usage.
|
|
90
|
-
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
91
|
-
|
|
92
|
-
return process;
|
|
93
|
-
}
|
|
94
|
-
} else {
|
|
95
|
-
const module = originalRequire?.(id);
|
|
96
|
-
if (module) {
|
|
97
|
-
return extractDefault(module);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// eslint-disable-next-line no-console -- Valid usage.
|
|
102
|
-
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
103
|
-
return {};
|
|
104
|
-
}
|
|
105
|
-
})();
|
|
106
32
|
|
|
107
33
|
"use strict";
|
|
108
34
|
var __create = Object.create;
|
|
@@ -151,7 +77,7 @@ var import_obsidian_plugin_repo_paths = require('../obsidian-plugin-repo-paths.c
|
|
|
151
77
|
var import_obsidian_plugin_build = require('./obsidian-plugin-build.cjs');
|
|
152
78
|
var import_obsidian_plugin_features = require('./obsidian-plugin-features.cjs');
|
|
153
79
|
var import_obsidian_plugins_folder_deployment = require('./obsidian-plugins-folder-deployment.cjs');
|
|
154
|
-
var __import_meta_url = globalThis["import.meta.url"] ?? (function
|
|
80
|
+
var __import_meta_url = globalThis["import.meta.url"] ?? (function getCjsImportMetaUrl() {
|
|
155
81
|
if (typeof __filename === "string") {
|
|
156
82
|
const localRequire = require;
|
|
157
83
|
const url = localRequire("node:url");
|
|
@@ -159,7 +85,7 @@ var __import_meta_url = globalThis["import.meta.url"] ?? (function getObsidianCj
|
|
|
159
85
|
return url.pathToFileURL(__filename).href;
|
|
160
86
|
}
|
|
161
87
|
}
|
|
162
|
-
return
|
|
88
|
+
return globalThis.location?.href ?? "";
|
|
163
89
|
})();
|
|
164
90
|
const PARCEL_CACHE_FOLDER = ".parcel-cache";
|
|
165
91
|
const GENERATED_PARCEL_CONFIG_FOLDER = `${PARCEL_CACHE_FOLDER}/obsidian-dev-toolkit`;
|
|
@@ -168,6 +94,7 @@ const RESOLVER_FILE_NAME = "obsidian-plugin-resolver.cjs";
|
|
|
168
94
|
const NAMER_FILE_NAME = "obsidian-plugin-namer.cjs";
|
|
169
95
|
const INLINE_IMPORTS_FILE_NAME = "obsidian-plugin-inline-imports.cjs";
|
|
170
96
|
const OPTIMIZER_FILE_NAME = "obsidian-plugin-optimizer.cjs";
|
|
97
|
+
const PRE_MINIFY_FILE_NAME = "obsidian-plugin-pre-minify.cjs";
|
|
171
98
|
const FEATURES_FILE_NAME = "obsidian-plugin-features.cjs";
|
|
172
99
|
const JSON_INDENT = 2;
|
|
173
100
|
async function build(options) {
|
|
@@ -244,7 +171,7 @@ function getParcelConfigFiles(params) {
|
|
|
244
171
|
extends: consumerParcelrcPath ?? "@parcel/config-default",
|
|
245
172
|
namers: [`./${NAMER_FILE_NAME}`, "..."],
|
|
246
173
|
optimizers: {
|
|
247
|
-
"*.js": ["...", `./${OPTIMIZER_FILE_NAME}`]
|
|
174
|
+
"*.js": [`./${PRE_MINIFY_FILE_NAME}`, "...", `./${OPTIMIZER_FILE_NAME}`]
|
|
248
175
|
},
|
|
249
176
|
resolvers: [`./${RESOLVER_FILE_NAME}`, "..."],
|
|
250
177
|
transformers
|
|
@@ -384,20 +311,123 @@ module.exports = new Optimizer({
|
|
|
384
311
|
`,
|
|
385
312
|
[PARCELRC]: `${JSON.stringify(parcelrc, null, JSON_INDENT)}
|
|
386
313
|
`,
|
|
387
|
-
|
|
314
|
+
// `String.raw`, so the line breaks below reach the file as escapes.
|
|
315
|
+
[PRE_MINIFY_FILE_NAME]: String.raw`/*
|
|
316
|
+
* Generated by @mnaoumov/obsidian-dev-toolkit. Runs before parcel's own optimizers, on the JavaScript bundle.
|
|
317
|
+
*
|
|
318
|
+
* A scope-hoisted library bundle require()s every bundle it references, the stylesheet included, and Obsidian
|
|
319
|
+
* loads styles.css itself, beside main.js, where a require() cannot reach it. The line is blanked rather than
|
|
320
|
+
* removed, so a source map still lines up.
|
|
321
|
+
*
|
|
322
|
+
* A scope-hoisted CommonJS bundle also declares every module's bindings at its top level, under long names such
|
|
323
|
+
* as $c5899aeb4caadf27$var$taskIdCounter, and parcel minifies it as a script, where the minifier may not rename
|
|
324
|
+
* a top-level binding, since in a script it is a global. Obsidian evaluates main.js as the body of a function, so
|
|
325
|
+
* wrapping the bundle in an arrow function changes nothing at runtime (an arrow keeps this and arguments) and
|
|
326
|
+
* lets the minifier rename all of them: Solid's fixture build is 70 KB without this and 10 KB with it.
|
|
327
|
+
*/
|
|
328
|
+
const { Optimizer } = require('@parcel/plugin');
|
|
329
|
+
|
|
330
|
+
const STYLESHEET_REQUIRE = ${JSON.stringify(`require('./${import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.StylesCss}');
|
|
331
|
+
`)};
|
|
332
|
+
|
|
333
|
+
async function readContents(contents) {
|
|
334
|
+
if (typeof contents === 'string') {
|
|
335
|
+
return contents;
|
|
336
|
+
}
|
|
337
|
+
if (Buffer.isBuffer(contents)) {
|
|
338
|
+
return contents.toString('utf-8');
|
|
339
|
+
}
|
|
340
|
+
const chunks = [];
|
|
341
|
+
for await (const chunk of contents) {
|
|
342
|
+
chunks.push(Buffer.from(chunk));
|
|
343
|
+
}
|
|
344
|
+
return Buffer.concat(chunks).toString('utf-8');
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
module.exports = new Optimizer({
|
|
348
|
+
async optimize({ bundle, contents, map }) {
|
|
349
|
+
const code = (await readContents(contents)).replace(STYLESHEET_REQUIRE, '\n');
|
|
350
|
+
if (!bundle.env.shouldOptimize) {
|
|
351
|
+
return { contents: code, map };
|
|
352
|
+
}
|
|
353
|
+
if (map) {
|
|
354
|
+
map.offsetLines(1, 1);
|
|
355
|
+
}
|
|
356
|
+
return { contents: '(() => {\n' + code + '\n})();\n', map };
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
`,
|
|
360
|
+
[RESOLVER_FILE_NAME]: `/*
|
|
361
|
+
* Generated by @mnaoumov/obsidian-dev-toolkit. Leaves the modules Obsidian supplies at runtime to require(), and
|
|
362
|
+
* resolves everything else the way @parcel/resolver-default does, with the browser's export conditions.
|
|
363
|
+
*
|
|
364
|
+
* Parcel resolves an electron-renderer target with the node and electron conditions beside browser, and an exports
|
|
365
|
+
* map is matched in the package's own key order, so a package listing node first (Vue, Svelte, Solid, fflate) would
|
|
366
|
+
* hand over its Node build: several times the code, and one that may not load on mobile. The Node builtins need no
|
|
367
|
+
* node condition to stay external, since they are in the externals below.
|
|
368
|
+
*/
|
|
388
369
|
const { Resolver } = require('@parcel/plugin');
|
|
370
|
+
const { dirname } = require('node:path');
|
|
389
371
|
|
|
390
372
|
const EXTERNALS = new Set(${JSON.stringify(import_obsidian_plugin_build.OBSIDIAN_PLUGIN_EXTERNALS)});
|
|
391
373
|
|
|
374
|
+
function getBrowserEnvironment(env) {
|
|
375
|
+
return {
|
|
376
|
+
context: env.context,
|
|
377
|
+
id: env.id + ':obsidian-dev-toolkit-browser-conditions',
|
|
378
|
+
includeNodeModules: env.includeNodeModules,
|
|
379
|
+
isBrowser: () => true,
|
|
380
|
+
isElectron: () => false,
|
|
381
|
+
isLibrary: env.isLibrary,
|
|
382
|
+
isNode: () => false,
|
|
383
|
+
isWorker: () => env.isWorker(),
|
|
384
|
+
isWorklet: () => env.isWorklet()
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
|
|
392
388
|
function getPackageName(specifier) {
|
|
393
389
|
const segments = specifier.split('/');
|
|
394
390
|
return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : segments[0];
|
|
395
391
|
}
|
|
396
392
|
|
|
393
|
+
// @parcel/node-resolver-core is what @parcel/resolver-default runs, reached through the packages that install it.
|
|
394
|
+
function loadNodeResolver() {
|
|
395
|
+
let folder = __dirname;
|
|
396
|
+
for (const packageName of ['@parcel/config-default', '@parcel/resolver-default']) {
|
|
397
|
+
folder = dirname(require.resolve(packageName + '/package.json', { paths: [folder] }));
|
|
398
|
+
}
|
|
399
|
+
return require(require.resolve('@parcel/node-resolver-core', { paths: [folder] })).default;
|
|
400
|
+
}
|
|
401
|
+
|
|
397
402
|
module.exports = new Resolver({
|
|
398
|
-
|
|
403
|
+
async loadConfig({ config, logger, options }) {
|
|
404
|
+
const packageConfig = await config.getConfig([], { packageKey: '@parcel/resolver-default' });
|
|
405
|
+
const NodeResolver = loadNodeResolver();
|
|
406
|
+
return new NodeResolver({
|
|
407
|
+
fs: options.inputFS,
|
|
408
|
+
logger,
|
|
409
|
+
mode: options.mode,
|
|
410
|
+
packageExports: packageConfig?.contents?.packageExports ?? false,
|
|
411
|
+
packageManager: options.packageManager,
|
|
412
|
+
projectRoot: options.projectRoot,
|
|
413
|
+
shouldAutoInstall: options.shouldAutoInstall
|
|
414
|
+
});
|
|
415
|
+
},
|
|
416
|
+
resolve({ config: nodeResolver, dependency, specifier }) {
|
|
399
417
|
const isExternal = specifier.startsWith('node:') || EXTERNALS.has(specifier) || EXTERNALS.has(getPackageName(specifier));
|
|
400
|
-
|
|
418
|
+
if (isExternal) {
|
|
419
|
+
return { isExcluded: true };
|
|
420
|
+
}
|
|
421
|
+
return nodeResolver.resolve({
|
|
422
|
+
env: getBrowserEnvironment(dependency.env),
|
|
423
|
+
filename: specifier,
|
|
424
|
+
loc: dependency.loc,
|
|
425
|
+
packageConditions: dependency.packageConditions,
|
|
426
|
+
parent: dependency.resolveFrom,
|
|
427
|
+
range: dependency.range,
|
|
428
|
+
sourcePath: dependency.sourcePath,
|
|
429
|
+
specifierType: dependency.specifierType
|
|
430
|
+
});
|
|
401
431
|
}
|
|
402
432
|
});
|
|
403
433
|
`
|
|
@@ -423,6 +453,7 @@ function getParcelOptions(params) {
|
|
|
423
453
|
// eslint-disable-next-line unicorn/name-replacements -- `distDir` is the name parcel's API reads.
|
|
424
454
|
distDir: buildContext.distFolder,
|
|
425
455
|
shouldOptimize: buildContext.isProductionBuild,
|
|
456
|
+
shouldScopeHoist: true,
|
|
426
457
|
sourceMaps: !buildContext.isProductionBuild
|
|
427
458
|
},
|
|
428
459
|
entries: buildContext.entryPoint,
|
|
@@ -459,4 +490,4 @@ function handleWatchEvent(event, buildContext) {
|
|
|
459
490
|
getParcelConfigFiles,
|
|
460
491
|
getParcelOptions
|
|
461
492
|
});
|
|
462
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9wYXJjZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1snaW1wb3J0Lm1ldGEudXJsJ10gPz8gKGZ1bmN0aW9uIGdldE9ic2lkaWFuQ2pzSW1wb3J0TWV0YVVybCgpIHtcbiAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGxvY2FsUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgY29uc3QgdXJsID0gbG9jYWxSZXF1aXJlKCdub2RlOnVybCcpO1xuICAgIGlmICh0eXBlb2YgdXJsLnBhdGhUb0ZpbGVVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB1cmwucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKS5ocmVmO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgdW5rbm93blxuICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6IGFjdGl2ZVdpbmRvdy5sb2NhdGlvbi5ocmVmO1xufSkoKTtcbi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luIHdpdGggcGFyY2VsOiBgYnVpbGQoKWAgYW5kIGBkZXYoKWAsIHRoZSBzYW1lIHR3byBlbnRyeSBwb2ludHMgdGhlIGVzYnVpbGRcbiAqIGJ1aWxkZXIgaGFzLCBwcm9kdWNpbmcgdGhlIHNhbWUgYG1haW4uanNgICsgYHN0eWxlcy5jc3NgICsgYG1hbmlmZXN0Lmpzb25gIGxheW91dC5cbiAqXG4gKiBQYXJjZWwgdGFrZXMgbm8gYGV4dGVybmFsYCBsaXN0IGFuZCBubyBvdXRwdXQgZmlsZSBuYW1lLCBvbmx5IHBsdWdpbnMgbmFtZWQgaW4gYSBgLnBhcmNlbHJjYC4gU28gdGhlXG4gKiBidWlsZCB3cml0ZXMgYSBgLnBhcmNlbHJjYCBvZiBpdHMgb3duIGludG8gYC5wYXJjZWwtY2FjaGVgLCBiZXNpZGUgYSByZXNvbHZlciB0aGF0IGxlYXZlc1xuICogT2JzaWRpYW4ncyBtb2R1bGVzIGV4dGVybmFsLCBhIG5hbWVyIHRoYXQgbmFtZXMgdGhlIHN0eWxlc2hlZXQgYHN0eWxlcy5jc3NgIGFuZCBhIHRyYW5zZm9ybWVyIHRoYXQga2VlcHNcbiAqIGR5bmFtaWMgaW1wb3J0cyBpbnNpZGUgYG1haW4uanNgLCBhbmQgZXh0ZW5kcyB0aGVcbiAqIGNvbnN1bWVyJ3Mgb3duIGAucGFyY2VscmNgIHdoZW4gdGhlcmUgaXMgb25lIChvciBgQHBhcmNlbC9jb25maWctZGVmYXVsdGAgd2hlbiB0aGVyZSBpcyBub25lKSwgc28gZXZlcnlcbiAqIHRyYW5zZm9ybWVyIHRoZSBjb25zdW1lciBjb25maWd1cmVkIHN0aWxsIGFwcGxpZXMuXG4gKlxuICogYEBwYXJjZWwvY29yZWAsIGBAcGFyY2VsL3BsdWdpbmAgYW5kIGBAcGFyY2VsL2NvbmZpZy1kZWZhdWx0YCBhcmUgb3B0aW9uYWwgcGVlciBkZXBlbmRlbmNpZXMsIGxvYWRlZFxuICogb25seSB3aGVuIGEgcGFyY2VsIGJ1aWxkIHJ1bnMsIHNvIGEgcGx1Z2luIGJ1aWx0IHdpdGggZXNidWlsZCBpbnN0YWxscyBub3RoaW5nIGV4dHJhLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQnVpbGRFdmVudCxcbiAgSW5pdGlhbFBhcmNlbE9wdGlvbnMsXG4gIFRhcmdldERlc2NyaXB0b3Jcbn0gZnJvbSAnQHBhcmNlbC90eXBlcyc7XG5cbmltcG9ydCB7IENsaVRhc2tSZXN1bHQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9jbGktdXRpbHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9ucG0tcnVuJztcbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlLFxuICB0b1Bvc2l4UGF0aFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBta2RpcixcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCxcbiAgT2JzaWRpYW5QbHVnaW5EZXBsb3ltZW50T3B0aW9uc1xufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgQnVpbGRNb2RlLFxuICBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGdldE9ic2lkaWFuUGx1Z2luQmFubmVyLFxuICBPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTLFxuICByZXNvbHZlRnJvbVJvb3QsXG4gIHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQge1xuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBnZXRKc3hJbXBvcnRTb3VyY2UsXG4gIGlzUG9zdGNzc05lZWRlZFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbFBhcmFtcyBleHRlbmRzIEJ1aWxkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGJ1aWxkIG1vZGUsIGVpdGhlciBgRGV2ZWxvcG1lbnRgIG9yIGBQcm9kdWN0aW9uYC5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU6IEJ1aWxkTW9kZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGR9IGFuZCB7QGxpbmsgZGV2fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMgZXh0ZW5kcyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zLCBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEN1c3RvbWl6ZXMgdGhlIG9wdGlvbnMgaGFuZGVkIHRvIHBhcmNlbCdzIGBQYXJjZWxgIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9taXplUGFyY2VsT3B0aW9ucz86IChvcHRpb25zOiBJbml0aWFsUGFyY2VsT3B0aW9ucykgPT4gSW5pdGlhbFBhcmNlbE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldFBhcmNlbENvbmZpZ0ZpbGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uc3VtZXIncyBvd24gYC5wYXJjZWxyY2AsIHJlbGF0aXZlIHRvIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbidzIGZvbGRlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcHJvamVjdFxuICAgKiBoYXMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnN1bWVyUGFyY2VscmNQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzPzogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0UGFyY2VsT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGFyY2VsT3B0aW9uc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFBhcmNlbCdzIGNhY2hlIGZvbGRlci4gTmFtZWQgZXhwbGljaXRseSBiZWNhdXNlIHBhcmNlbCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBvZiB0aGUgbmVhcmVzdFxuICAgKiBsb2NrZmlsZSBmb3IgdGhlIHByb2plY3Qgcm9vdCwgd2hpY2ggaW4gYSB3b3Jrc3BhY2UgaXMgbm90IHRoZSBwbHVnaW4ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBnZW5lcmF0ZWQgYC5wYXJjZWxyY2AuXG4gICAqL1xuICByZWFkb25seSBjb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGZpbGVzIG9mIHRoZSBnZW5lcmF0ZWQgcGFyY2VsIGNvbmZpZ3VyYXRpb24sIGJ5IGZpbGUgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyY2VsQ29uZmlnRmlsZXMgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuLy8gSW5zaWRlIHBhcmNlbCdzIG93biBjYWNoZSBmb2xkZXI6IHBhcmNlbCByZWZ1c2VzIHJlbGF0aXZlIHBsdWdpbnMgaW4gYSBjb25maWcgdW5kZXIgYG5vZGVfbW9kdWxlc2AgKGl0XG4vLyB0YWtlcyBzdWNoIGEgY29uZmlnIGZvciBhIHB1Ymxpc2hlZCBwYWNrYWdlKSwgYW5kIGl0IG5ldmVyIHdhdGNoZXMgaXRzIGNhY2hlIGZvbGRlciwgc28gcmVnZW5lcmF0aW5nXG4vLyB0aGVzZSBmaWxlcyBvbiBldmVyeSBidWlsZCBjYW5ub3QgdHJpZ2dlciBhIHJlYnVpbGQuXG5jb25zdCBQQVJDRUxfQ0FDSEVfRk9MREVSID0gJy5wYXJjZWwtY2FjaGUnO1xuY29uc3QgR0VORVJBVEVEX1BBUkNFTF9DT05GSUdfRk9MREVSID0gYCR7UEFSQ0VMX0NBQ0hFX0ZPTERFUn0vb2JzaWRpYW4tZGV2LXRvb2xraXRgO1xuY29uc3QgUEFSQ0VMUkMgPSAnLnBhcmNlbHJjJztcblxuLyoqXG4gKiBPbmUgZGlhZ25vc3RpYyBvZiBhIHtAbGluayBQYXJjZWxFcnJvckxpa2V9LlxuICovXG5pbnRlcmZhY2UgUGFyY2VsRXJyb3JEaWFnbm9zdGljIHtcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgcGFyY2VsIHRocm93cyB3aGVuIGEgYnVpbGQgZmFpbHM6IGFuIGVycm9yIGNhcnJ5aW5nIGl0cyBkaWFnbm9zdGljcy5cbiAqL1xuaW50ZXJmYWNlIFBhcmNlbEVycm9yTGlrZSB7XG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzPzogcmVhZG9ubHkgUGFyY2VsRXJyb3JEaWFnbm9zdGljW107XG59XG5jb25zdCBSRVNPTFZFUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLXJlc29sdmVyLmNqcyc7XG5jb25zdCBOQU1FUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLW5hbWVyLmNqcyc7XG5jb25zdCBJTkxJTkVfSU1QT1JUU19GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLWlubGluZS1pbXBvcnRzLmNqcyc7XG5jb25zdCBPUFRJTUlaRVJfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1vcHRpbWl6ZXIuY2pzJztcbmNvbnN0IEZFQVRVUkVTX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMuY2pzJztcbmNvbnN0IEpTT05fSU5ERU5UID0gMjtcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFJ1bnMgYSByZWFsIHBhcmNlbCBidWlsZDsgZXhlcmNpc2VkIGJ5IHRoZSBidW5kbGVyIGludGVncmF0aW9uIHRlc3QuICovXG4vKipcbiAqIEJ1aWxkcyB0aGUgT2JzaWRpYW4gcGx1Z2luIGluIHByb2R1Y3Rpb24gbW9kZSB1c2luZyBwYXJjZWwuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidWlsZCBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKG9wdGlvbnM/OiBCdWlsZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWwoeyAuLi5vcHRpb25zLCBtb2RlOiBCdWlsZE1vZGUuUHJvZHVjdGlvbiB9KTtcbiAgcmVzdWx0LnRocm93T25GYWlsdXJlKCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gd2l0aCBwYXJjZWwsIG9uY2UgZm9yIGEgcHJvZHVjdGlvbiBidWlsZCwgb3Igd2F0Y2hpbmcgZm9yIGEgZGV2ZWxvcG1lbnQgb25lLlxuICpcbiAqIFJ1bnMgdGhlIHByb2plY3QncyBgYnVpbGQ6Y29tcGlsZWAgc2NyaXB0IGZpcnN0IHdoZW4gaXQgaGFzIG9uZSwgYXMgdGhlIGVzYnVpbGQgYnVpbGRlciBkb2VzLCBzaW5jZVxuICogcGFyY2VsIHN0cmlwcyBUeXBlU2NyaXB0IHR5cGVzIHdpdGhvdXQgY2hlY2tpbmcgdGhlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbFBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IGluZGljYXRpbmcgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgYnVpbGQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbChwYXJhbXM6IEJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsUGFyYW1zKTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCdidWlsZDpjb21waWxlJyk7XG4gIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dChwYXJhbXMpO1xuICBhd2FpdCBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihidWlsZENvbnRleHQuZGlzdEZvbGRlcik7XG4gIGF3YWl0IGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dCk7XG5cbiAgY29uc3QgY29uZmlnRm9sZGVyID0gcmVzb2x2ZUZyb21Sb290KEdFTkVSQVRFRF9QQVJDRUxfQ09ORklHX0ZPTERFUik7XG4gIGNvbnN0IGNvbnN1bWVyUGFyY2VscmNQYXRoID0gcmVzb2x2ZUZyb21Sb290KFBBUkNFTFJDKTtcbiAgYXdhaXQgbWtkaXIoY29uZmlnRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY29uZmlnRmlsZXMgPSBnZXRQYXJjZWxDb25maWdGaWxlcyh7XG4gICAgY29uc3VtZXJQYXJjZWxyY1BhdGg6IGV4aXN0c1N5bmMoY29uc3VtZXJQYXJjZWxyY1BhdGgpID8gdG9Qb3NpeFBhdGgocmVsYXRpdmUoY29uZmlnRm9sZGVyLCBjb25zdW1lclBhcmNlbHJjUGF0aCkpIDogdW5kZWZpbmVkLFxuICAgIGZlYXR1cmVzOiBwYXJhbXNcbiAgfSk7XG4gIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBjb250ZW50c10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnRmlsZXMpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGNvbmZpZ0ZvbGRlciwgZmlsZU5hbWUpO1xuICAgIC8vIFJld3JpdHRlbiBvbmx5IHdoZW4gaXQgY2hhbmdlZDogcGFyY2VsIGludmFsaWRhdGVzIGl0cyBjYWNoZSBvbiBhIGNvbmZpZyBmaWxlJ3MgbW9kaWZpY2F0aW9uIHRpbWUuXG4gICAgaWYgKCFleGlzdHNTeW5jKGZpbGVQYXRoKSB8fCBhd2FpdCByZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JykgIT09IGNvbnRlbnRzKSB7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnRzLCAndXRmLTgnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IFBhcmNlbCB9ID0gYXdhaXQgaW1wb3J0KCdAcGFyY2VsL2NvcmUnKTtcbiAgY29uc3QgcGFyY2VsT3B0aW9ucyA9IGdldFBhcmNlbE9wdGlvbnMoeyBidWlsZENvbnRleHQsIGNhY2hlRm9sZGVyOiByZXNvbHZlRnJvbVJvb3QoUEFSQ0VMX0NBQ0hFX0ZPTERFUiksIGNvbmZpZ1BhdGg6IGpvaW4oY29uZmlnRm9sZGVyLCBQQVJDRUxSQykgfSk7XG4gIGNvbnN0IGJ1bmRsZXIgPSBuZXcgUGFyY2VsKHBhcmFtcy5jdXN0b21pemVQYXJjZWxPcHRpb25zPy4ocGFyY2VsT3B0aW9ucykgPz8gcGFyY2VsT3B0aW9ucyk7XG5cbiAgaWYgKGJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGJ1aWxkVGltZSwgYnVuZGxlR3JhcGggfSA9IGF3YWl0IGJ1bmRsZXIucnVuKCk7XG4gICAgICBjb25zb2xlLndhcm4oYEJ1aWx0ICR7U3RyaW5nKGJ1bmRsZUdyYXBoLmdldEJ1bmRsZXMoKS5sZW5ndGgpfSBidW5kbGUocykgd2l0aCBwYXJjZWwgaW4gJHtTdHJpbmcoYnVpbGRUaW1lKX0gbXMuYCk7XG4gICAgICByZXR1cm4gQ2xpVGFza1Jlc3VsdC5TdWNjZXNzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0UGFyY2VsRXJyb3IoZXJyb3IpKTtcbiAgICAgIHJldHVybiBDbGlUYXNrUmVzdWx0LkZhaWx1cmUoKTtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBidW5kbGVyLndhdGNoKChlcnJvciwgZXZlbnQpID0+IHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0UGFyY2VsRXJyb3IoZXJyb3IpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaGFuZGxlV2F0Y2hFdmVudChldmVudCwgYnVpbGRDb250ZXh0KTtcbiAgfSk7XG4gIHJldHVybiBDbGlUYXNrUmVzdWx0LkRvTm90RXhpdCgpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgT2JzaWRpYW4gcGx1Z2luIGluIGRldmVsb3BtZW50IG1vZGUgdXNpbmcgcGFyY2VsLCB3YXRjaGluZyBmb3IgY2hhbmdlcyBhbmQgZGVwbG95aW5nIGV2ZXJ5XG4gKiBzdWNjZXNzZnVsIHJlYnVpbGQgaW50byB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBDbGlUYXNrUmVzdWx0fSBpbmRpY2F0aW5nIHRoZSBidWlsZCByZXN1bHQuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gSW50ZW50aW9uYWxseSBzaGFyZXMgQnVpbGRPcHRpb25zIHdpdGggYnVpbGQoKS5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXYob3B0aW9ucz86IEJ1aWxkT3B0aW9ucyk6IFByb21pc2U8Q2xpVGFza1Jlc3VsdD4ge1xuICByZXR1cm4gYXdhaXQgYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWwoeyAuLi5vcHRpb25zLCBtb2RlOiBCdWlsZE1vZGUuRGV2ZWxvcG1lbnQgfSk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgZmlsZXMgb2YgdGhlIHBhcmNlbCBjb25maWd1cmF0aW9uIHRoZSBidWlsZCBydW5zIHdpdGguXG4gKlxuICogVGhlIGJ1aWxkIGZlYXR1cmVzIGFkZCBwaXBlbGluZXMgdGhhdCBydW4gdGhlIHRvb2xraXQncyBzaGFyZWQgdHJhbnNmb3JtcywgdGhyb3VnaCBvbmUgZ2VuZXJhdGVkIHRyYW5zZm9ybWVyIHRoYXRcbiAqIGxvYWRzIHRoZW0gZnJvbSB0aGUgdG9vbGtpdDogU29saWQncyBgLmpzeGAgLyBgLnRzeGAsIFN2ZWx0ZSdzIGAuc3ZlbHRlYCAvIGAuc3ZlbHRlLnRzYCAvIGAuc3ZlbHRlLmpzYCwgYC53YXNtYCxcbiAqIGFuZCB3aXRoIGBzdHlsZXMucG9zdGNzc2Agb3IgYHN0eWxlcy50YWlsd2luZGAgZXZlcnkgc3R5bGVzaGVldCwgaW4gcGxhY2Ugb2YgcGFyY2VsJ3Mgb3duIFBvc3RDU1Mgc3RlcC4gUmVhY3QgYW5kXG4gKiBQcmVhY3QgSlNYIGlzIGNvbXBpbGVkIGhlcmUgdG9vLCBzaW5jZSBwYXJjZWwgcmVhZHMgdGhlIEpTWCBydW50aW1lIGZyb20gYSB0c2NvbmZpZyB3aXRob3V0IGZvbGxvd2luZyBpdHMgYGV4dGVuZHNgLFxuICogYW5kIHdpdGggYW55IGZyYW1ld29yayBldmVyeSBzY3JpcHQgaGFzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzIHJlcGxhY2VkLiBQYXJjZWwgY29tcGlsZXMgVnVlIHdpdGhcbiAqIGBAcGFyY2VsL3RyYW5zZm9ybWVyLXZ1ZWAgYW5kIHNjb3BlcyBgKi5tb2R1bGUuY3NzYCBpdHNlbGYsIHNvIHRob3NlIG5lZWQgbm8gcGlwZWxpbmUgaGVyZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgZmlsZXMsIGJ5IGZpbGUgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmNlbENvbmZpZ0ZpbGVzKHBhcmFtczogR2V0UGFyY2VsQ29uZmlnRmlsZXNQYXJhbXMpOiBQYXJjZWxDb25maWdGaWxlcyB7XG4gIGNvbnN0IHsgY29uc3VtZXJQYXJjZWxyY1BhdGgsIGZlYXR1cmVzID0ge30gfSA9IHBhcmFtcztcbiAgY29uc3QgZmVhdHVyZVRyYW5zZm9ybWVyID0gYC4vJHtGRUFUVVJFU19GSUxFX05BTUV9YDtcbiAgY29uc3QgdHJhbnNmb3JtZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgaWYgKGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3N2ZWx0ZScpIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyouc3ZlbHRlJ10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyXTtcbiAgICB0cmFuc2Zvcm1lcnNbJyouc3ZlbHRlLntqcyx0c30nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXIsIGAuLyR7SU5MSU5FX0lNUE9SVFNfRklMRV9OQU1FfWAsICcuLi4nXTtcbiAgfVxuICBpZiAoZmVhdHVyZXMuZnJhbWV3b3JrID09PSAnc29saWQnIHx8IGdldEpzeEltcG9ydFNvdXJjZShmZWF0dXJlcy5mcmFtZXdvcmspICE9PSB1bmRlZmluZWQpIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyoue2pzeCx0c3h9J10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyXTtcbiAgfVxuICBpZiAoZmVhdHVyZXMud2FzbSkge1xuICAgIHRyYW5zZm9ybWVyc1snKi53YXNtJ10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyXTtcbiAgfVxuICBpZiAoaXNQb3N0Y3NzTmVlZGVkKGZlYXR1cmVzLnN0eWxlcykpIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyoue2NzcyxwY3NzfSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lciwgJ0BwYXJjZWwvdHJhbnNmb3JtZXItY3NzJ107XG4gIH1cbiAgY29uc3QgZGVmaW5lcyA9IGdldEZyYW1ld29ya0RlZmluZXMoeyBmcmFtZXdvcms6IGZlYXR1cmVzLmZyYW1ld29yaywgaXNQcm9kdWN0aW9uQnVpbGQ6IHRydWUgfSk7XG4gIHRyYW5zZm9ybWVyc1snKi57anMsbWpzLGNqcyxqc3gsdHMsbXRzLGN0cyx0c3h9J10gPSBbXG4gICAgLi4uT2JqZWN0LmtleXMoZGVmaW5lcykubGVuZ3RoID4gMCA/IFtmZWF0dXJlVHJhbnNmb3JtZXJdIDogW10sXG4gICAgYC4vJHtJTkxJTkVfSU1QT1JUU19GSUxFX05BTUV9YCxcbiAgICAnLi4uJ1xuICBdO1xuXG4gIGNvbnN0IHBhcmNlbHJjID0ge1xuICAgIGV4dGVuZHM6IGNvbnN1bWVyUGFyY2VscmNQYXRoID8/ICdAcGFyY2VsL2NvbmZpZy1kZWZhdWx0JyxcbiAgICBuYW1lcnM6IFtgLi8ke05BTUVSX0ZJTEVfTkFNRX1gLCAnLi4uJ10sXG4gICAgb3B0aW1pemVyczoge1xuICAgICAgJyouanMnOiBbJy4uLicsIGAuLyR7T1BUSU1JWkVSX0ZJTEVfTkFNRX1gXVxuICAgIH0sXG4gICAgcmVzb2x2ZXJzOiBbYC4vJHtSRVNPTFZFUl9GSUxFX05BTUV9YCwgJy4uLiddLFxuICAgIHRyYW5zZm9ybWVyc1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgW0ZFQVRVUkVTX0ZJTEVfTkFNRV06IGAvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zIGZvciB0aGUgYnVpbGQgZmVhdHVyZXMsIGxvYWRlZFxuICogZnJvbSB0aGUgdG9vbGtpdCBpdHNlbGYsIHNvIHBhcmNlbCBjb21waWxlcyBlYWNoIGZlYXR1cmUgdGhlIHdheSBldmVyeSBvdGhlciBidW5kbGVyIGFkYXB0ZXIgZG9lcy5cbiAqL1xuY29uc3QgeyBUcmFuc2Zvcm1lciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgRkVBVFVSRVNfTU9EVUxFX1VSTCA9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U2libGluZ01vZHVsZVVybCgnb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzJykpfTtcbmNvbnN0IFRSQU5TRk9STVNfTU9EVUxFX1VSTCA9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U2libGluZ01vZHVsZVVybCgnb2JzaWRpYW4tcGx1Z2luLXRyYW5zZm9ybXMnKSl9O1xuY29uc3QgRlJBTUVXT1JLID0gJHtKU09OLnN0cmluZ2lmeShmZWF0dXJlcy5mcmFtZXdvcmsgPz8gbnVsbCl9O1xuY29uc3QgU1RZTEVTID0gJHtKU09OLnN0cmluZ2lmeShmZWF0dXJlcy5zdHlsZXMgPz8ge30pfTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHJhbnNmb3JtZXIoe1xuICBhc3luYyB0cmFuc2Zvcm0oeyBhc3NldCwgb3B0aW9ucyB9KSB7XG4gICAgY29uc3QgeyBnZXRGZWF0dXJlRmlsZUtpbmQsIGdldEZyYW1ld29ya0RlZmluZXMsIGdldEpzeEltcG9ydFNvdXJjZSwgcmVwbGFjZURlZmluZXMgfSA9IGF3YWl0IGltcG9ydChGRUFUVVJFU19NT0RVTEVfVVJMKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1zID0gYXdhaXQgaW1wb3J0KFRSQU5TRk9STVNfTU9EVUxFX1VSTCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBhc3NldC5maWxlUGF0aDtcbiAgICBjb25zdCBpc1Byb2R1Y3Rpb25CdWlsZCA9IG9wdGlvbnMubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nO1xuICAgIGNvbnN0IGRlZmluZXMgPSBnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBGUkFNRVdPUksgPz8gdW5kZWZpbmVkLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICBzd2l0Y2ggKGdldEZlYXR1cmVGaWxlS2luZChmaWxlUGF0aCkpIHtcbiAgICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgICAgY29uc3QgY29kZSA9IGF3YWl0IGFzc2V0LmdldENvZGUoKTtcbiAgICAgICAgY29uc3QganN4SW1wb3J0U291cmNlID0gZ2V0SnN4SW1wb3J0U291cmNlKEZSQU1FV09SSyA/PyB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBGUkFNRVdPUksgPT09ICdzb2xpZCdcbiAgICAgICAgICA/IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtU29saWQoeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSlcbiAgICAgICAgICA6IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtSnN4KHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkLCBqc3hJbXBvcnRTb3VyY2UgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZURlZmluZXMocmVzdWx0LmNvZGUsIGRlZmluZXMpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3R5bGVzaGVldCc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Dc3MoeyBmaWxlUGF0aCwgaXNDc3NNb2R1bGVTY29wZWQ6IGZhbHNlLCBpc1Byb2R1Y3Rpb25CdWlsZCwgc291cmNlOiBhd2FpdCBhc3NldC5nZXRDb2RlKCksIHN0eWxlczogU1RZTEVTIH0pO1xuICAgICAgICBhc3NldC5zZXRDb2RlKHJlc3VsdC5jc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgcmVzdWx0LmRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGFzc2V0LmludmFsaWRhdGVPbkZpbGVDaGFuZ2UoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdmVsdGUnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtU3ZlbHRlKHsgY29kZTogYXdhaXQgYXNzZXQuZ2V0Q29kZSgpLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZURlZmluZXMocmVzdWx0LmNvZGUsIGRlZmluZXMpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnd2FzbSc6XG4gICAgICAgIGFzc2V0LnNldENvZGUodHJhbnNmb3Jtcy5nZXRXYXNtTW9kdWxlQ29kZShhd2FpdCBhc3NldC5nZXRCdWZmZXIoKSkpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEEgZnJhbWV3b3JrJ3MgcnVudGltZSByZWFkcyBwcm9jZXNzLmVudi5OT0RFX0VOViwgd2hpY2ggcGFyY2VsIGxlYXZlcyBhbG9uZSBpbiBhbiBlbGVjdHJvbi1yZW5kZXJlciBsaWJyYXJ5LlxuICAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHJlcGxhY2VEZWZpbmVzKGNvZGUsIGRlZmluZXMpO1xuICAgICAgICBpZiAocmVwbGFjZWQgIT09IGNvZGUpIHtcbiAgICAgICAgICBhc3NldC5zZXRDb2RlKHJlcGxhY2VkKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFthc3NldF07XG4gIH1cbn0pO1xuYCxcbiAgICAvLyBgU3RyaW5nLnJhd2AsIHNvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYmVsb3cgcmVhY2hlcyB0aGUgZmlsZSB3aXRoIGl0cyBiYWNrc2xhc2hlcyBpbnRhY3QuXG4gICAgW0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRV06IFN0cmluZy5yYXdgLypcbiAqIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIEtlZXBzIGV2ZXJ5IGR5bmFtaWMgaW1wb3J0KCkgaW5zaWRlIG1haW4uanMuXG4gKlxuICogT2JzaWRpYW4gbG9hZHMgYSBwbHVnaW4ncyBtYWluLmpzIGFuZCBub3RoaW5nIGJlc2lkZSBpdCwgYW5kIHBhcmNlbCBtYWtlcyBldmVyeSBpbXBvcnQoKSBhIGJ1bmRsZSBvZiBpdHNcbiAqIG93biB3aXRoIG5vIG9wdGlvbiB0byBpbmxpbmUgb25lLiBUaGlzIHJld3JpdGVzIGltcG9ydCgnPGxpdGVyYWw+JykgaW50byBhIHJlcXVpcmUoKSBpbnNpZGUgYW4gYXN5bmNcbiAqIGFycm93LCBiZWZvcmUgcGFyY2VsJ3Mgb3duIEphdmFTY3JpcHQgdHJhbnNmb3JtZXIgcnVuczogdGhlIG1vZHVsZSBzdGlsbCBldmFsdWF0ZXMgb25seSB3aGVuIHRoYXQgY29kZVxuICogcnVucywgYW5kIHRoZSBwcm9taXNlIHN0aWxsIHJlamVjdHMgd2hlbiBldmFsdWF0aW9uIHRocm93cy4gT25seSBhIHBsYWluIHN0cmluZyBzcGVjaWZpZXIgaXMgcmV3cml0dGVuLFxuICogc2luY2UgYSBjb21wdXRlZCBvbmUgY2Fubm90IGJlIGJ1bmRsZWQgYnkgYW55IGJ1bmRsZXIuXG4gKi9cbmNvbnN0IHsgVHJhbnNmb3JtZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IERZTkFNSUNfSU1QT1JUID0gL1xcYmltcG9ydFxcKFxccyooW1wiJ10pKFteXCInXFx4NjBcXG5cXFxcXSspXFwxXFxzKlxcKS9ndTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHJhbnNmb3JtZXIoe1xuICBhc3luYyB0cmFuc2Zvcm0oeyBhc3NldCB9KSB7XG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgIGlmIChzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydCgnKSkge1xuICAgICAgYXNzZXQuc2V0Q29kZShzb3VyY2UucmVwbGFjZShEWU5BTUlDX0lNUE9SVCwgKF9tYXRjaCwgcXVvdGUsIHNwZWNpZmllcikgPT4gJyhhc3luYyAoKSA9PiByZXF1aXJlKCcgKyBxdW90ZSArIHNwZWNpZmllciArIHF1b3RlICsgJykpKCknKSk7XG4gICAgfVxuICAgIHJldHVybiBbYXNzZXRdO1xuICB9XG59KTtcbmAsXG4gICAgW05BTUVSX0ZJTEVfTkFNRV06IGAvKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBPYnNpZGlhbiBsb2FkcyBhIHBsdWdpbidzIHN0eWxlc2hlZXQgZnJvbSBzdHlsZXMuY3NzIGFuZCBub3RoaW5nIGVsc2UuICovXG5jb25zdCB7IE5hbWVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBOYW1lcih7XG4gIG5hbWUoeyBidW5kbGUgfSkge1xuICAgIHJldHVybiBidW5kbGUudHlwZSA9PT0gJ2NzcycgPyAnJHtPYnNpZGlhblBsdWdpblJlcG9QYXRocy5TdHlsZXNDc3N9JyA6IG51bGw7XG4gIH1cbn0pO1xuYCxcbiAgICBbT1BUSU1JWkVSX0ZJTEVfTkFNRV06IGAvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyBhZnRlciBwYXJjZWwncyBvd24gb3B0aW1pemVycywgb24gdGhlIEphdmFTY3JpcHQgYnVuZGxlLlxuICpcbiAqIE9ic2lkaWFuIGV2YWx1YXRlcyBtYWluLmpzIGFzIHRoZSBib2R5IG9mIGZ1bmN0aW9uIChyZXF1aXJlLCBtb2R1bGUsIGV4cG9ydHMpLCB3aXRoIGEgbW9kdWxlIG9iamVjdCB0aGF0XG4gKiBoYXMgbm8gcmVxdWlyZSBvZiBpdHMgb3duLCBhbmQgcGFyY2VsJ3MgcnVudGltZSByZWFjaGVzIGV2ZXJ5IGV4dGVybmFsIG1vZHVsZSB0aHJvdWdoIG1vZHVsZS5yZXF1aXJlLlxuICogV2l0aG91dCB0aGUgZmlyc3QgbGluZSBiZWxvdywgdGhlIHZlcnkgZmlyc3QgcmVxdWlyZSgnb2JzaWRpYW4nKSB0aHJvd3MgXCJDYW5ub3QgZmluZCBtb2R1bGVcIi4gVGhlIGJhbm5lclxuICogZ29lcyBpbiBoZXJlIHRvbywgYWZ0ZXIgbWluaWZpY2F0aW9uLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3RyaXAgaXQgYXMgYW4gb3JkaW5hcnkgY29tbWVudC5cbiAqL1xuY29uc3QgeyBPcHRpbWl6ZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IFBSRUFNQkxFID0gJHtKU09OLnN0cmluZ2lmeShgJHtnZXRPYnNpZGlhblBsdWdpbkJhbm5lcigncGFyY2VsJyl9aWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUucmVxdWlyZSAhPT0gJ2Z1bmN0aW9uJykgeyBtb2R1bGUucmVxdWlyZSA9IHJlcXVpcmU7IH1cXG5gKX07XG5jb25zdCBQUkVBTUJMRV9MSU5FX0NPVU5UID0gJHtTdHJpbmcoZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3BhcmNlbCcpLnNwbGl0KCdcXG4nKS5sZW5ndGgpfTtcblxuYXN5bmMgZnVuY3Rpb24gcmVhZENvbnRlbnRzKGNvbnRlbnRzKSB7XG4gIGlmICh0eXBlb2YgY29udGVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNvbnRlbnRzO1xuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udGVudHMpKSB7XG4gICAgcmV0dXJuIGNvbnRlbnRzLnRvU3RyaW5nKCd1dGYtOCcpO1xuICB9XG4gIGNvbnN0IGNodW5rcyA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGNvbnRlbnRzKSB7XG4gICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCd1dGYtOCcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBPcHRpbWl6ZXIoe1xuICBhc3luYyBvcHRpbWl6ZSh7IGNvbnRlbnRzLCBtYXAgfSkge1xuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCByZWFkQ29udGVudHMoY29udGVudHMpO1xuICAgIGlmIChtYXApIHtcbiAgICAgIG1hcC5vZmZzZXRMaW5lcygxLCBQUkVBTUJMRV9MSU5FX0NPVU5UKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudHM6IFBSRUFNQkxFICsgY29kZSwgbWFwIH07XG4gIH1cbn0pO1xuYCxcbiAgICBbUEFSQ0VMUkNdOiBgJHtKU09OLnN0cmluZ2lmeShwYXJjZWxyYywgbnVsbCwgSlNPTl9JTkRFTlQpfVxcbmAsXG4gICAgW1JFU09MVkVSX0ZJTEVfTkFNRV06IGAvKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBMZWF2ZXMgdGhlIG1vZHVsZXMgT2JzaWRpYW4gc3VwcGxpZXMgYXQgcnVudGltZSB0byByZXF1aXJlKCkuICovXG5jb25zdCB7IFJlc29sdmVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5jb25zdCBFWFRFUk5BTFMgPSBuZXcgU2V0KCR7SlNPTi5zdHJpbmdpZnkoT0JTSURJQU5fUExVR0lOX0VYVEVSTkFMUyl9KTtcblxuZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gc3BlY2lmaWVyLnNwbGl0KCcvJyk7XG4gIHJldHVybiBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnQCcpID8gc2VnbWVudHMuc2xpY2UoMCwgMikuam9pbignLycpIDogc2VnbWVudHNbMF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFJlc29sdmVyKHtcbiAgcmVzb2x2ZSh7IHNwZWNpZmllciB9KSB7XG4gICAgY29uc3QgaXNFeHRlcm5hbCA9IHNwZWNpZmllci5zdGFydHNXaXRoKCdub2RlOicpIHx8IEVYVEVSTkFMUy5oYXMoc3BlY2lmaWVyKSB8fCBFWFRFUk5BTFMuaGFzKGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcikpO1xuICAgIHJldHVybiBpc0V4dGVybmFsID8geyBpc0V4Y2x1ZGVkOiB0cnVlIH0gOiBudWxsO1xuICB9XG59KTtcbmBcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG9wdGlvbnMgaGFuZGVkIHRvIHBhcmNlbCdzIGBQYXJjZWxgIGNsYXNzLlxuICpcbiAqIFRoZSBvbmUgdGFyZ2V0IGlzIGBlbGVjdHJvbi1yZW5kZXJlcmAsIHdoZXJlIE9ic2lkaWFuIHJ1bnMgYSBwbHVnaW4sIGFuZCBDb21tb25KUy4gUGFyY2VsIGNvdW50cyB0aGF0XG4gKiBjb250ZXh0IGFzIGJvdGggYSBicm93c2VyIGFuZCBhIG5vZGUgb25lLCBhbmQgZWFjaCBoYWxmIG1hdHRlcnM6IG5vZGUga2VlcHMgdGhlIGJ1aWx0aW5zIGV4dGVybmFsLCBhbmRcbiAqIGJyb3dzZXIgcmVzb2x2ZXMgdGhlIGBicm93c2VyYCBleHBvcnQgY29uZGl0aW9uLiBgaW5jbHVkZU5vZGVNb2R1bGVzYCBidW5kbGVzIHRoZSBkZXBlbmRlbmNpZXMsIHdoaWNoIGFcbiAqIG5vZGUtZmxhdm91cmVkIGNvbnRleHQgd291bGQgb3RoZXJ3aXNlIGxlYXZlIGFzIGByZXF1aXJlKClgIGNhbGxzIG5vdGhpbmcgaW5zdGFsbHMgYmVzaWRlIGEgcGx1Z2luLCBhbmRcbiAqIGBpc0xpYnJhcnlgIGtlZXBzIHRoZSBlbnRyeSdzIGRlZmF1bHQgZXhwb3J0LCB3aGljaCBpcyBob3cgT2JzaWRpYW4gZmluZHMgdGhlIHBsdWdpbiBjbGFzcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRQYXJjZWxPcHRpb25zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwYXJjZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmNlbE9wdGlvbnMocGFyYW1zOiBHZXRQYXJjZWxPcHRpb25zUGFyYW1zKTogSW5pdGlhbFBhcmNlbE9wdGlvbnMge1xuICBjb25zdCB7IGJ1aWxkQ29udGV4dCwgY2FjaGVGb2xkZXIsIGNvbmZpZ1BhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0OiBUYXJnZXREZXNjcmlwdG9yID0ge1xuICAgIGNvbnRleHQ6ICdlbGVjdHJvbi1yZW5kZXJlcicsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRpc3REaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICBkaXN0RGlyOiBidWlsZENvbnRleHQuZGlzdEZvbGRlcixcbiAgICBpbmNsdWRlTm9kZU1vZHVsZXM6IHRydWUsXG4gICAgaXNMaWJyYXJ5OiB0cnVlLFxuICAgIG9wdGltaXplOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgb3V0cHV0Rm9ybWF0OiAnY29tbW9uanMnLFxuICAgIHNvdXJjZU1hcDogIWJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCAmJiB7IGlubGluZTogdHJ1ZSB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgY2FjaGVEaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICBjYWNoZURpcjogY2FjaGVGb2xkZXIsXG4gICAgY29uZmlnOiBjb25maWdQYXRoLFxuICAgIGRlZmF1bHRUYXJnZXRPcHRpb25zOiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlzdERpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgICAgZGlzdERpcjogYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIsXG4gICAgICBzaG91bGRPcHRpbWl6ZTogYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgICAgc291cmNlTWFwczogIWJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZFxuICAgIH0sXG4gICAgZW50cmllczogYnVpbGRDb250ZXh0LmVudHJ5UG9pbnQsXG4gICAgbW9kZTogYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkID8gJ3Byb2R1Y3Rpb24nIDogJ2RldmVsb3BtZW50JyxcbiAgICB0YXJnZXRzOiB7IG9ic2lkaWFuUGx1Z2luOiB0YXJnZXQgfVxuICB9O1xufVxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFBhcnQgb2YgdGhlIHBhcmNlbCBidWlsZCBhYm92ZS4gKi9cbmZ1bmN0aW9uIGZvcm1hdFBhcmNlbEVycm9yKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgZGlhZ25vc3RpY3MgPSAoZXJyb3IgYXMgUGFyY2VsRXJyb3JMaWtlIHwgdW5kZWZpbmVkKT8uZGlhZ25vc3RpY3M7XG4gIGlmIChkaWFnbm9zdGljcyAmJiBkaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGRpYWdub3N0aWNzLm1hcCgoZGlhZ25vc3RpYykgPT4gZGlhZ25vc3RpYy5tZXNzYWdlKS5qb2luKCdcXG4nKTtcbiAgfVxuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrID8/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgVVJMIG9mIGEgbW9kdWxlIG9mIHRoaXMgZm9sZGVyLCBpbiB0aGUgc2FtZSBmb3JtIGFzIHRoaXMgb25lIChgLnRzYCBmcm9tIHNvdXJjZSwgYC5tanNgIG9yIGAuY2pzYCBvbmNlXG4gKiBidWlsdCksIHdoaWNoIHRoZSBnZW5lcmF0ZWQgdHJhbnNmb3JtZXIgaW1wb3J0cy5cbiAqXG4gKiBAcGFyYW0gYmFzZU5hbWUgLSBUaGUgbW9kdWxlJ3MgZmlsZSBuYW1lIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBtb2R1bGUncyBgZmlsZTpgIFVSTC5cbiAqL1xuZnVuY3Rpb24gZ2V0U2libGluZ01vZHVsZVVybChiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBVUkwoYCR7YmFzZU5hbWV9JHtleHRuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSl9YCwgaW1wb3J0Lm1ldGEudXJsKS5ocmVmO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVXYXRjaEV2ZW50KGV2ZW50OiBCdWlsZEV2ZW50IHwgdW5kZWZpbmVkLCBidWlsZENvbnRleHQ6IE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0KTogdm9pZCB7XG4gIGlmIChldmVudD8udHlwZSA9PT0gJ2J1aWxkRmFpbHVyZScpIHtcbiAgICBjb25zb2xlLmVycm9yKGV2ZW50LmRpYWdub3N0aWNzLm1hcCgoZGlhZ25vc3RpYykgPT4gZGlhZ25vc3RpYy5tZXNzYWdlKS5qb2luKCdcXG4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChldmVudD8udHlwZSAhPT0gJ2J1aWxkU3VjY2VzcycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlLndhcm4oYFJlYnVpbHQgd2l0aCBwYXJjZWwgaW4gJHtTdHJpbmcoZXZlbnQuYnVpbGRUaW1lKX0gbXMuYCk7XG4gIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyKGJ1aWxkQ29udGV4dCkpO1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQ0EsdUJBQThCO0FBQzlCLHFCQUErQjtBQUMvQixtQkFBa0M7QUFDbEMsa0JBS087QUFDUCxx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
|
|
493
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9wYXJjZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1snaW1wb3J0Lm1ldGEudXJsJ10gPz8gKGZ1bmN0aW9uIGdldENqc0ltcG9ydE1ldGFVcmwoKSB7XG4gIGlmICh0eXBlb2YgX19maWxlbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGxvY2FsUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgY29uc3QgdXJsID0gbG9jYWxSZXF1aXJlKFwibm9kZTp1cmxcIik7XG4gICAgaWYgKHR5cGVvZiB1cmwucGF0aFRvRmlsZVVSTCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdXJsLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdsb2JhbFRoaXMubG9jYXRpb24/LmhyZWYgPz8gXCJcIjtcbn0pKCk7XG4vKipcbiAqIEBmaWxlXG4gKlxuICogQnVpbGRzIGFuIE9ic2lkaWFuIHBsdWdpbiB3aXRoIHBhcmNlbDogYGJ1aWxkKClgIGFuZCBgZGV2KClgLCB0aGUgc2FtZSB0d28gZW50cnkgcG9pbnRzIHRoZSBlc2J1aWxkXG4gKiBidWlsZGVyIGhhcywgcHJvZHVjaW5nIHRoZSBzYW1lIGBtYWluLmpzYCArIGBzdHlsZXMuY3NzYCArIGBtYW5pZmVzdC5qc29uYCBsYXlvdXQuXG4gKlxuICogUGFyY2VsIHRha2VzIG5vIGBleHRlcm5hbGAgbGlzdCBhbmQgbm8gb3V0cHV0IGZpbGUgbmFtZSwgb25seSBwbHVnaW5zIG5hbWVkIGluIGEgYC5wYXJjZWxyY2AuIFNvIHRoZVxuICogYnVpbGQgd3JpdGVzIGEgYC5wYXJjZWxyY2Agb2YgaXRzIG93biBpbnRvIGAucGFyY2VsLWNhY2hlYCwgYmVzaWRlIGEgcmVzb2x2ZXIgdGhhdCBsZWF2ZXNcbiAqIE9ic2lkaWFuJ3MgbW9kdWxlcyBleHRlcm5hbCBhbmQgcmVzb2x2ZXMgcGFja2FnZXMgd2l0aCB0aGUgYnJvd3NlcidzIGV4cG9ydCBjb25kaXRpb25zLCBhIG5hbWVyIHRoYXQgbmFtZXNcbiAqIHRoZSBzdHlsZXNoZWV0IGBzdHlsZXMuY3NzYCwgYSB0cmFuc2Zvcm1lciB0aGF0IGtlZXBzIGR5bmFtaWMgaW1wb3J0cyBpbnNpZGUgYG1haW4uanNgLCBhbmQgYW4gb3B0aW1pemVyIHRoYXRcbiAqIGxldHMgdGhlIG1pbmlmaWVyIHJlbmFtZSB0aGUgYnVuZGxlJ3MgdG9wLWxldmVsIGJpbmRpbmdzLCBhbmQgZXh0ZW5kcyB0aGVcbiAqIGNvbnN1bWVyJ3Mgb3duIGAucGFyY2VscmNgIHdoZW4gdGhlcmUgaXMgb25lIChvciBgQHBhcmNlbC9jb25maWctZGVmYXVsdGAgd2hlbiB0aGVyZSBpcyBub25lKSwgc28gZXZlcnlcbiAqIHRyYW5zZm9ybWVyIHRoZSBjb25zdW1lciBjb25maWd1cmVkIHN0aWxsIGFwcGxpZXMuXG4gKlxuICogYEBwYXJjZWwvY29yZWAsIGBAcGFyY2VsL3BsdWdpbmAgYW5kIGBAcGFyY2VsL2NvbmZpZy1kZWZhdWx0YCBhcmUgb3B0aW9uYWwgcGVlciBkZXBlbmRlbmNpZXMsIGxvYWRlZFxuICogb25seSB3aGVuIGEgcGFyY2VsIGJ1aWxkIHJ1bnMsIHNvIGEgcGx1Z2luIGJ1aWx0IHdpdGggZXNidWlsZCBpbnN0YWxscyBub3RoaW5nIGV4dHJhLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQnVpbGRFdmVudCxcbiAgSW5pdGlhbFBhcmNlbE9wdGlvbnMsXG4gIFRhcmdldERlc2NyaXB0b3Jcbn0gZnJvbSAnQHBhcmNlbC90eXBlcyc7XG5cbmltcG9ydCB7IENsaVRhc2tSZXN1bHQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9jbGktdXRpbHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9ucG0tcnVuJztcbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlLFxuICB0b1Bvc2l4UGF0aFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBta2RpcixcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCxcbiAgT2JzaWRpYW5QbHVnaW5EZXBsb3ltZW50T3B0aW9uc1xufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgQnVpbGRNb2RlLFxuICBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGdldE9ic2lkaWFuUGx1Z2luQmFubmVyLFxuICBPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTLFxuICByZXNvbHZlRnJvbVJvb3QsXG4gIHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQge1xuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBnZXRKc3hJbXBvcnRTb3VyY2UsXG4gIGlzUG9zdGNzc05lZWRlZFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbFBhcmFtcyBleHRlbmRzIEJ1aWxkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGJ1aWxkIG1vZGUsIGVpdGhlciBgRGV2ZWxvcG1lbnRgIG9yIGBQcm9kdWN0aW9uYC5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU6IEJ1aWxkTW9kZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGR9IGFuZCB7QGxpbmsgZGV2fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMgZXh0ZW5kcyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zLCBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEN1c3RvbWl6ZXMgdGhlIG9wdGlvbnMgaGFuZGVkIHRvIHBhcmNlbCdzIGBQYXJjZWxgIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9taXplUGFyY2VsT3B0aW9ucz86IChvcHRpb25zOiBJbml0aWFsUGFyY2VsT3B0aW9ucykgPT4gSW5pdGlhbFBhcmNlbE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldFBhcmNlbENvbmZpZ0ZpbGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uc3VtZXIncyBvd24gYC5wYXJjZWxyY2AsIHJlbGF0aXZlIHRvIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbidzIGZvbGRlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcHJvamVjdFxuICAgKiBoYXMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnN1bWVyUGFyY2VscmNQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzPzogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0UGFyY2VsT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGFyY2VsT3B0aW9uc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFBhcmNlbCdzIGNhY2hlIGZvbGRlci4gTmFtZWQgZXhwbGljaXRseSBiZWNhdXNlIHBhcmNlbCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBvZiB0aGUgbmVhcmVzdFxuICAgKiBsb2NrZmlsZSBmb3IgdGhlIHByb2plY3Qgcm9vdCwgd2hpY2ggaW4gYSB3b3Jrc3BhY2UgaXMgbm90IHRoZSBwbHVnaW4ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBnZW5lcmF0ZWQgYC5wYXJjZWxyY2AuXG4gICAqL1xuICByZWFkb25seSBjb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGZpbGVzIG9mIHRoZSBnZW5lcmF0ZWQgcGFyY2VsIGNvbmZpZ3VyYXRpb24sIGJ5IGZpbGUgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyY2VsQ29uZmlnRmlsZXMgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuLy8gSW5zaWRlIHBhcmNlbCdzIG93biBjYWNoZSBmb2xkZXI6IHBhcmNlbCByZWZ1c2VzIHJlbGF0aXZlIHBsdWdpbnMgaW4gYSBjb25maWcgdW5kZXIgYG5vZGVfbW9kdWxlc2AgKGl0XG4vLyB0YWtlcyBzdWNoIGEgY29uZmlnIGZvciBhIHB1Ymxpc2hlZCBwYWNrYWdlKSwgYW5kIGl0IG5ldmVyIHdhdGNoZXMgaXRzIGNhY2hlIGZvbGRlciwgc28gcmVnZW5lcmF0aW5nXG4vLyB0aGVzZSBmaWxlcyBvbiBldmVyeSBidWlsZCBjYW5ub3QgdHJpZ2dlciBhIHJlYnVpbGQuXG5jb25zdCBQQVJDRUxfQ0FDSEVfRk9MREVSID0gJy5wYXJjZWwtY2FjaGUnO1xuY29uc3QgR0VORVJBVEVEX1BBUkNFTF9DT05GSUdfRk9MREVSID0gYCR7UEFSQ0VMX0NBQ0hFX0ZPTERFUn0vb2JzaWRpYW4tZGV2LXRvb2xraXRgO1xuY29uc3QgUEFSQ0VMUkMgPSAnLnBhcmNlbHJjJztcblxuLyoqXG4gKiBPbmUgZGlhZ25vc3RpYyBvZiBhIHtAbGluayBQYXJjZWxFcnJvckxpa2V9LlxuICovXG5pbnRlcmZhY2UgUGFyY2VsRXJyb3JEaWFnbm9zdGljIHtcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgcGFyY2VsIHRocm93cyB3aGVuIGEgYnVpbGQgZmFpbHM6IGFuIGVycm9yIGNhcnJ5aW5nIGl0cyBkaWFnbm9zdGljcy5cbiAqL1xuaW50ZXJmYWNlIFBhcmNlbEVycm9yTGlrZSB7XG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzPzogcmVhZG9ubHkgUGFyY2VsRXJyb3JEaWFnbm9zdGljW107XG59XG5jb25zdCBSRVNPTFZFUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLXJlc29sdmVyLmNqcyc7XG5jb25zdCBOQU1FUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLW5hbWVyLmNqcyc7XG5jb25zdCBJTkxJTkVfSU1QT1JUU19GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLWlubGluZS1pbXBvcnRzLmNqcyc7XG5jb25zdCBPUFRJTUlaRVJfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1vcHRpbWl6ZXIuY2pzJztcbmNvbnN0IFBSRV9NSU5JRllfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1wcmUtbWluaWZ5LmNqcyc7XG5jb25zdCBGRUFUVVJFU19GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLmNqcyc7XG5jb25zdCBKU09OX0lOREVOVCA9IDI7XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBSdW5zIGEgcmVhbCBwYXJjZWwgYnVpbGQ7IGV4ZXJjaXNlZCBieSB0aGUgYnVuZGxlciBpbnRlZ3JhdGlvbiB0ZXN0LiAqL1xuLyoqXG4gKiBCdWlsZHMgdGhlIE9ic2lkaWFuIHBsdWdpbiBpbiBwcm9kdWN0aW9uIG1vZGUgdXNpbmcgcGFyY2VsLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYnVpbGQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYnVpbGQgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChvcHRpb25zPzogQnVpbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsKHsgLi4ub3B0aW9ucywgbW9kZTogQnVpbGRNb2RlLlByb2R1Y3Rpb24gfSk7XG4gIHJlc3VsdC50aHJvd09uRmFpbHVyZSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgT2JzaWRpYW4gcGx1Z2luIHdpdGggcGFyY2VsLCBvbmNlIGZvciBhIHByb2R1Y3Rpb24gYnVpbGQsIG9yIHdhdGNoaW5nIGZvciBhIGRldmVsb3BtZW50IG9uZS5cbiAqXG4gKiBSdW5zIHRoZSBwcm9qZWN0J3MgYGJ1aWxkOmNvbXBpbGVgIHNjcmlwdCBmaXJzdCB3aGVuIGl0IGhhcyBvbmUsIGFzIHRoZSBlc2J1aWxkIGJ1aWxkZXIgZG9lcywgc2luY2VcbiAqIHBhcmNlbCBzdHJpcHMgVHlwZVNjcmlwdCB0eXBlcyB3aXRob3V0IGNoZWNraW5nIHRoZW0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWxQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBDbGlUYXNrUmVzdWx0fSBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIGJ1aWxkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWwocGFyYW1zOiBCdWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbFBhcmFtcyk6IFByb21pc2U8Q2xpVGFza1Jlc3VsdD4ge1xuICBhd2FpdCBucG1SdW5PcHRpb25hbCgnYnVpbGQ6Y29tcGlsZScpO1xuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQocGFyYW1zKTtcbiAgYXdhaXQgY2xlYW5PYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIpO1xuICBhd2FpdCBjb21wbGV0ZU9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihidWlsZENvbnRleHQpO1xuXG4gIGNvbnN0IGNvbmZpZ0ZvbGRlciA9IHJlc29sdmVGcm9tUm9vdChHRU5FUkFURURfUEFSQ0VMX0NPTkZJR19GT0xERVIpO1xuICBjb25zdCBjb25zdW1lclBhcmNlbHJjUGF0aCA9IHJlc29sdmVGcm9tUm9vdChQQVJDRUxSQyk7XG4gIGF3YWl0IG1rZGlyKGNvbmZpZ0ZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGNvbmZpZ0ZpbGVzID0gZ2V0UGFyY2VsQ29uZmlnRmlsZXMoe1xuICAgIGNvbnN1bWVyUGFyY2VscmNQYXRoOiBleGlzdHNTeW5jKGNvbnN1bWVyUGFyY2VscmNQYXRoKSA/IHRvUG9zaXhQYXRoKHJlbGF0aXZlKGNvbmZpZ0ZvbGRlciwgY29uc3VtZXJQYXJjZWxyY1BhdGgpKSA6IHVuZGVmaW5lZCxcbiAgICBmZWF0dXJlczogcGFyYW1zXG4gIH0pO1xuICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgY29udGVudHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ0ZpbGVzKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihjb25maWdGb2xkZXIsIGZpbGVOYW1lKTtcbiAgICAvLyBSZXdyaXR0ZW4gb25seSB3aGVuIGl0IGNoYW5nZWQ6IHBhcmNlbCBpbnZhbGlkYXRlcyBpdHMgY2FjaGUgb24gYSBjb25maWcgZmlsZSdzIG1vZGlmaWNhdGlvbiB0aW1lLlxuICAgIGlmICghZXhpc3RzU3luYyhmaWxlUGF0aCkgfHwgYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpICE9PSBjb250ZW50cykge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50cywgJ3V0Zi04Jyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyBQYXJjZWwgfSA9IGF3YWl0IGltcG9ydCgnQHBhcmNlbC9jb3JlJyk7XG4gIGNvbnN0IHBhcmNlbE9wdGlvbnMgPSBnZXRQYXJjZWxPcHRpb25zKHsgYnVpbGRDb250ZXh0LCBjYWNoZUZvbGRlcjogcmVzb2x2ZUZyb21Sb290KFBBUkNFTF9DQUNIRV9GT0xERVIpLCBjb25maWdQYXRoOiBqb2luKGNvbmZpZ0ZvbGRlciwgUEFSQ0VMUkMpIH0pO1xuICBjb25zdCBidW5kbGVyID0gbmV3IFBhcmNlbChwYXJhbXMuY3VzdG9taXplUGFyY2VsT3B0aW9ucz8uKHBhcmNlbE9wdGlvbnMpID8/IHBhcmNlbE9wdGlvbnMpO1xuXG4gIGlmIChidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBidWlsZFRpbWUsIGJ1bmRsZUdyYXBoIH0gPSBhd2FpdCBidW5kbGVyLnJ1bigpO1xuICAgICAgY29uc29sZS53YXJuKGBCdWlsdCAke1N0cmluZyhidW5kbGVHcmFwaC5nZXRCdW5kbGVzKCkubGVuZ3RoKX0gYnVuZGxlKHMpIHdpdGggcGFyY2VsIGluICR7U3RyaW5nKGJ1aWxkVGltZSl9IG1zLmApO1xuICAgICAgcmV0dXJuIENsaVRhc2tSZXN1bHQuU3VjY2VzcygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdFBhcmNlbEVycm9yKGVycm9yKSk7XG4gICAgICByZXR1cm4gQ2xpVGFza1Jlc3VsdC5GYWlsdXJlKCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgYnVuZGxlci53YXRjaCgoZXJyb3IsIGV2ZW50KSA9PiB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdFBhcmNlbEVycm9yKGVycm9yKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhhbmRsZVdhdGNoRXZlbnQoZXZlbnQsIGJ1aWxkQ29udGV4dCk7XG4gIH0pO1xuICByZXR1cm4gQ2xpVGFza1Jlc3VsdC5Eb05vdEV4aXQoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIE9ic2lkaWFuIHBsdWdpbiBpbiBkZXZlbG9wbWVudCBtb2RlIHVzaW5nIHBhcmNlbCwgd2F0Y2hpbmcgZm9yIGNoYW5nZXMgYW5kIGRlcGxveWluZyBldmVyeVxuICogc3VjY2Vzc2Z1bCByZWJ1aWxkIGludG8gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYnVpbGQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gaW5kaWNhdGluZyB0aGUgYnVpbGQgcmVzdWx0LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIEludGVudGlvbmFsbHkgc2hhcmVzIEJ1aWxkT3B0aW9ucyB3aXRoIGJ1aWxkKCkuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV2KG9wdGlvbnM/OiBCdWlsZE9wdGlvbnMpOiBQcm9taXNlPENsaVRhc2tSZXN1bHQ+IHtcbiAgcmV0dXJuIGF3YWl0IGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsKHsgLi4ub3B0aW9ucywgbW9kZTogQnVpbGRNb2RlLkRldmVsb3BtZW50IH0pO1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGZpbGVzIG9mIHRoZSBwYXJjZWwgY29uZmlndXJhdGlvbiB0aGUgYnVpbGQgcnVucyB3aXRoLlxuICpcbiAqIFRoZSBidWlsZCBmZWF0dXJlcyBhZGQgcGlwZWxpbmVzIHRoYXQgcnVuIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMsIHRocm91Z2ggb25lIGdlbmVyYXRlZCB0cmFuc2Zvcm1lciB0aGF0XG4gKiBsb2FkcyB0aGVtIGZyb20gdGhlIHRvb2xraXQ6IFNvbGlkJ3MgYC5qc3hgIC8gYC50c3hgLCBTdmVsdGUncyBgLnN2ZWx0ZWAgLyBgLnN2ZWx0ZS50c2AgLyBgLnN2ZWx0ZS5qc2AsIGAud2FzbWAsXG4gKiBhbmQgd2l0aCBgc3R5bGVzLnBvc3Rjc3NgIG9yIGBzdHlsZXMudGFpbHdpbmRgIGV2ZXJ5IHN0eWxlc2hlZXQsIGluIHBsYWNlIG9mIHBhcmNlbCdzIG93biBQb3N0Q1NTIHN0ZXAuIFJlYWN0IGFuZFxuICogUHJlYWN0IEpTWCBpcyBjb21waWxlZCBoZXJlIHRvbywgc2luY2UgcGFyY2VsIHJlYWRzIHRoZSBKU1ggcnVudGltZSBmcm9tIGEgdHNjb25maWcgd2l0aG91dCBmb2xsb3dpbmcgaXRzIGBleHRlbmRzYCxcbiAqIGFuZCB3aXRoIGFueSBmcmFtZXdvcmsgZXZlcnkgc2NyaXB0IGhhcyB0aGUgZnJhbWV3b3JrJ3MgY29tcGlsZS10aW1lIGNvbnN0YW50cyByZXBsYWNlZC4gUGFyY2VsIGNvbXBpbGVzIFZ1ZSB3aXRoXG4gKiBgQHBhcmNlbC90cmFuc2Zvcm1lci12dWVgIGFuZCBzY29wZXMgYCoubW9kdWxlLmNzc2AgaXRzZWxmLCBzbyB0aG9zZSBuZWVkIG5vIHBpcGVsaW5lIGhlcmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0UGFyY2VsQ29uZmlnRmlsZXNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGZpbGVzLCBieSBmaWxlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJjZWxDb25maWdGaWxlcyhwYXJhbXM6IEdldFBhcmNlbENvbmZpZ0ZpbGVzUGFyYW1zKTogUGFyY2VsQ29uZmlnRmlsZXMge1xuICBjb25zdCB7IGNvbnN1bWVyUGFyY2VscmNQYXRoLCBmZWF0dXJlcyA9IHt9IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZlYXR1cmVUcmFuc2Zvcm1lciA9IGAuLyR7RkVBVFVSRVNfRklMRV9OQU1FfWA7XG4gIGNvbnN0IHRyYW5zZm9ybWVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgPT09ICdzdmVsdGUnKSB7XG4gICAgdHJhbnNmb3JtZXJzWycqLnN2ZWx0ZSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lcl07XG4gICAgdHJhbnNmb3JtZXJzWycqLnN2ZWx0ZS57anMsdHN9J10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyLCBgLi8ke0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRX1gLCAnLi4uJ107XG4gIH1cbiAgaWYgKGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3NvbGlkJyB8fCBnZXRKc3hJbXBvcnRTb3VyY2UoZmVhdHVyZXMuZnJhbWV3b3JrKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdHJhbnNmb3JtZXJzWycqLntqc3gsdHN4fSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lcl07XG4gIH1cbiAgaWYgKGZlYXR1cmVzLndhc20pIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyoud2FzbSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lcl07XG4gIH1cbiAgaWYgKGlzUG9zdGNzc05lZWRlZChmZWF0dXJlcy5zdHlsZXMpKSB7XG4gICAgdHJhbnNmb3JtZXJzWycqLntjc3MscGNzc30nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXIsICdAcGFyY2VsL3RyYW5zZm9ybWVyLWNzcyddO1xuICB9XG4gIGNvbnN0IGRlZmluZXMgPSBnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBmZWF0dXJlcy5mcmFtZXdvcmssIGlzUHJvZHVjdGlvbkJ1aWxkOiB0cnVlIH0pO1xuICB0cmFuc2Zvcm1lcnNbJyoue2pzLG1qcyxjanMsanN4LHRzLG10cyxjdHMsdHN4fSddID0gW1xuICAgIC4uLk9iamVjdC5rZXlzKGRlZmluZXMpLmxlbmd0aCA+IDAgPyBbZmVhdHVyZVRyYW5zZm9ybWVyXSA6IFtdLFxuICAgIGAuLyR7SU5MSU5FX0lNUE9SVFNfRklMRV9OQU1FfWAsXG4gICAgJy4uLidcbiAgXTtcblxuICBjb25zdCBwYXJjZWxyYyA9IHtcbiAgICBleHRlbmRzOiBjb25zdW1lclBhcmNlbHJjUGF0aCA/PyAnQHBhcmNlbC9jb25maWctZGVmYXVsdCcsXG4gICAgbmFtZXJzOiBbYC4vJHtOQU1FUl9GSUxFX05BTUV9YCwgJy4uLiddLFxuICAgIG9wdGltaXplcnM6IHtcbiAgICAgICcqLmpzJzogW2AuLyR7UFJFX01JTklGWV9GSUxFX05BTUV9YCwgJy4uLicsIGAuLyR7T1BUSU1JWkVSX0ZJTEVfTkFNRX1gXVxuICAgIH0sXG4gICAgcmVzb2x2ZXJzOiBbYC4vJHtSRVNPTFZFUl9GSUxFX05BTUV9YCwgJy4uLiddLFxuICAgIHRyYW5zZm9ybWVyc1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgW0ZFQVRVUkVTX0ZJTEVfTkFNRV06IGAvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zIGZvciB0aGUgYnVpbGQgZmVhdHVyZXMsIGxvYWRlZFxuICogZnJvbSB0aGUgdG9vbGtpdCBpdHNlbGYsIHNvIHBhcmNlbCBjb21waWxlcyBlYWNoIGZlYXR1cmUgdGhlIHdheSBldmVyeSBvdGhlciBidW5kbGVyIGFkYXB0ZXIgZG9lcy5cbiAqL1xuY29uc3QgeyBUcmFuc2Zvcm1lciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgRkVBVFVSRVNfTU9EVUxFX1VSTCA9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U2libGluZ01vZHVsZVVybCgnb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzJykpfTtcbmNvbnN0IFRSQU5TRk9STVNfTU9EVUxFX1VSTCA9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U2libGluZ01vZHVsZVVybCgnb2JzaWRpYW4tcGx1Z2luLXRyYW5zZm9ybXMnKSl9O1xuY29uc3QgRlJBTUVXT1JLID0gJHtKU09OLnN0cmluZ2lmeShmZWF0dXJlcy5mcmFtZXdvcmsgPz8gbnVsbCl9O1xuY29uc3QgU1RZTEVTID0gJHtKU09OLnN0cmluZ2lmeShmZWF0dXJlcy5zdHlsZXMgPz8ge30pfTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHJhbnNmb3JtZXIoe1xuICBhc3luYyB0cmFuc2Zvcm0oeyBhc3NldCwgb3B0aW9ucyB9KSB7XG4gICAgY29uc3QgeyBnZXRGZWF0dXJlRmlsZUtpbmQsIGdldEZyYW1ld29ya0RlZmluZXMsIGdldEpzeEltcG9ydFNvdXJjZSwgcmVwbGFjZURlZmluZXMgfSA9IGF3YWl0IGltcG9ydChGRUFUVVJFU19NT0RVTEVfVVJMKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1zID0gYXdhaXQgaW1wb3J0KFRSQU5TRk9STVNfTU9EVUxFX1VSTCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBhc3NldC5maWxlUGF0aDtcbiAgICBjb25zdCBpc1Byb2R1Y3Rpb25CdWlsZCA9IG9wdGlvbnMubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nO1xuICAgIGNvbnN0IGRlZmluZXMgPSBnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBGUkFNRVdPUksgPz8gdW5kZWZpbmVkLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICBzd2l0Y2ggKGdldEZlYXR1cmVGaWxlS2luZChmaWxlUGF0aCkpIHtcbiAgICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgICAgY29uc3QgY29kZSA9IGF3YWl0IGFzc2V0LmdldENvZGUoKTtcbiAgICAgICAgY29uc3QganN4SW1wb3J0U291cmNlID0gZ2V0SnN4SW1wb3J0U291cmNlKEZSQU1FV09SSyA/PyB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBGUkFNRVdPUksgPT09ICdzb2xpZCdcbiAgICAgICAgICA/IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtU29saWQoeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSlcbiAgICAgICAgICA6IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtSnN4KHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkLCBqc3hJbXBvcnRTb3VyY2UgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZURlZmluZXMocmVzdWx0LmNvZGUsIGRlZmluZXMpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3R5bGVzaGVldCc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Dc3MoeyBmaWxlUGF0aCwgaXNDc3NNb2R1bGVTY29wZWQ6IGZhbHNlLCBpc1Byb2R1Y3Rpb25CdWlsZCwgc291cmNlOiBhd2FpdCBhc3NldC5nZXRDb2RlKCksIHN0eWxlczogU1RZTEVTIH0pO1xuICAgICAgICBhc3NldC5zZXRDb2RlKHJlc3VsdC5jc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgcmVzdWx0LmRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGFzc2V0LmludmFsaWRhdGVPbkZpbGVDaGFuZ2UoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdmVsdGUnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtU3ZlbHRlKHsgY29kZTogYXdhaXQgYXNzZXQuZ2V0Q29kZSgpLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZURlZmluZXMocmVzdWx0LmNvZGUsIGRlZmluZXMpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnd2FzbSc6XG4gICAgICAgIGFzc2V0LnNldENvZGUodHJhbnNmb3Jtcy5nZXRXYXNtTW9kdWxlQ29kZShhd2FpdCBhc3NldC5nZXRCdWZmZXIoKSkpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEEgZnJhbWV3b3JrJ3MgcnVudGltZSByZWFkcyBwcm9jZXNzLmVudi5OT0RFX0VOViwgd2hpY2ggcGFyY2VsIGxlYXZlcyBhbG9uZSBpbiBhbiBlbGVjdHJvbi1yZW5kZXJlciBsaWJyYXJ5LlxuICAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHJlcGxhY2VEZWZpbmVzKGNvZGUsIGRlZmluZXMpO1xuICAgICAgICBpZiAocmVwbGFjZWQgIT09IGNvZGUpIHtcbiAgICAgICAgICBhc3NldC5zZXRDb2RlKHJlcGxhY2VkKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFthc3NldF07XG4gIH1cbn0pO1xuYCxcbiAgICAvLyBgU3RyaW5nLnJhd2AsIHNvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYmVsb3cgcmVhY2hlcyB0aGUgZmlsZSB3aXRoIGl0cyBiYWNrc2xhc2hlcyBpbnRhY3QuXG4gICAgW0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRV06IFN0cmluZy5yYXdgLypcbiAqIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIEtlZXBzIGV2ZXJ5IGR5bmFtaWMgaW1wb3J0KCkgaW5zaWRlIG1haW4uanMuXG4gKlxuICogT2JzaWRpYW4gbG9hZHMgYSBwbHVnaW4ncyBtYWluLmpzIGFuZCBub3RoaW5nIGJlc2lkZSBpdCwgYW5kIHBhcmNlbCBtYWtlcyBldmVyeSBpbXBvcnQoKSBhIGJ1bmRsZSBvZiBpdHNcbiAqIG93biB3aXRoIG5vIG9wdGlvbiB0byBpbmxpbmUgb25lLiBUaGlzIHJld3JpdGVzIGltcG9ydCgnPGxpdGVyYWw+JykgaW50byBhIHJlcXVpcmUoKSBpbnNpZGUgYW4gYXN5bmNcbiAqIGFycm93LCBiZWZvcmUgcGFyY2VsJ3Mgb3duIEphdmFTY3JpcHQgdHJhbnNmb3JtZXIgcnVuczogdGhlIG1vZHVsZSBzdGlsbCBldmFsdWF0ZXMgb25seSB3aGVuIHRoYXQgY29kZVxuICogcnVucywgYW5kIHRoZSBwcm9taXNlIHN0aWxsIHJlamVjdHMgd2hlbiBldmFsdWF0aW9uIHRocm93cy4gT25seSBhIHBsYWluIHN0cmluZyBzcGVjaWZpZXIgaXMgcmV3cml0dGVuLFxuICogc2luY2UgYSBjb21wdXRlZCBvbmUgY2Fubm90IGJlIGJ1bmRsZWQgYnkgYW55IGJ1bmRsZXIuXG4gKi9cbmNvbnN0IHsgVHJhbnNmb3JtZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IERZTkFNSUNfSU1QT1JUID0gL1xcYmltcG9ydFxcKFxccyooW1wiJ10pKFteXCInXFx4NjBcXG5cXFxcXSspXFwxXFxzKlxcKS9ndTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHJhbnNmb3JtZXIoe1xuICBhc3luYyB0cmFuc2Zvcm0oeyBhc3NldCB9KSB7XG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgIGlmIChzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydCgnKSkge1xuICAgICAgYXNzZXQuc2V0Q29kZShzb3VyY2UucmVwbGFjZShEWU5BTUlDX0lNUE9SVCwgKF9tYXRjaCwgcXVvdGUsIHNwZWNpZmllcikgPT4gJyhhc3luYyAoKSA9PiByZXF1aXJlKCcgKyBxdW90ZSArIHNwZWNpZmllciArIHF1b3RlICsgJykpKCknKSk7XG4gICAgfVxuICAgIHJldHVybiBbYXNzZXRdO1xuICB9XG59KTtcbmAsXG4gICAgW05BTUVSX0ZJTEVfTkFNRV06IGAvKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBPYnNpZGlhbiBsb2FkcyBhIHBsdWdpbidzIHN0eWxlc2hlZXQgZnJvbSBzdHlsZXMuY3NzIGFuZCBub3RoaW5nIGVsc2UuICovXG5jb25zdCB7IE5hbWVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBOYW1lcih7XG4gIG5hbWUoeyBidW5kbGUgfSkge1xuICAgIHJldHVybiBidW5kbGUudHlwZSA9PT0gJ2NzcycgPyAnJHtPYnNpZGlhblBsdWdpblJlcG9QYXRocy5TdHlsZXNDc3N9JyA6IG51bGw7XG4gIH1cbn0pO1xuYCxcbiAgICBbT1BUSU1JWkVSX0ZJTEVfTkFNRV06IGAvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyBhZnRlciBwYXJjZWwncyBvd24gb3B0aW1pemVycywgb24gdGhlIEphdmFTY3JpcHQgYnVuZGxlLlxuICpcbiAqIE9ic2lkaWFuIGV2YWx1YXRlcyBtYWluLmpzIGFzIHRoZSBib2R5IG9mIGZ1bmN0aW9uIChyZXF1aXJlLCBtb2R1bGUsIGV4cG9ydHMpLCB3aXRoIGEgbW9kdWxlIG9iamVjdCB0aGF0XG4gKiBoYXMgbm8gcmVxdWlyZSBvZiBpdHMgb3duLCBhbmQgcGFyY2VsJ3MgcnVudGltZSByZWFjaGVzIGV2ZXJ5IGV4dGVybmFsIG1vZHVsZSB0aHJvdWdoIG1vZHVsZS5yZXF1aXJlLlxuICogV2l0aG91dCB0aGUgZmlyc3QgbGluZSBiZWxvdywgdGhlIHZlcnkgZmlyc3QgcmVxdWlyZSgnb2JzaWRpYW4nKSB0aHJvd3MgXCJDYW5ub3QgZmluZCBtb2R1bGVcIi4gVGhlIGJhbm5lclxuICogZ29lcyBpbiBoZXJlIHRvbywgYWZ0ZXIgbWluaWZpY2F0aW9uLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3RyaXAgaXQgYXMgYW4gb3JkaW5hcnkgY29tbWVudC5cbiAqL1xuY29uc3QgeyBPcHRpbWl6ZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IFBSRUFNQkxFID0gJHtKU09OLnN0cmluZ2lmeShgJHtnZXRPYnNpZGlhblBsdWdpbkJhbm5lcigncGFyY2VsJyl9aWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUucmVxdWlyZSAhPT0gJ2Z1bmN0aW9uJykgeyBtb2R1bGUucmVxdWlyZSA9IHJlcXVpcmU7IH1cXG5gKX07XG5jb25zdCBQUkVBTUJMRV9MSU5FX0NPVU5UID0gJHtTdHJpbmcoZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3BhcmNlbCcpLnNwbGl0KCdcXG4nKS5sZW5ndGgpfTtcblxuYXN5bmMgZnVuY3Rpb24gcmVhZENvbnRlbnRzKGNvbnRlbnRzKSB7XG4gIGlmICh0eXBlb2YgY29udGVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNvbnRlbnRzO1xuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udGVudHMpKSB7XG4gICAgcmV0dXJuIGNvbnRlbnRzLnRvU3RyaW5nKCd1dGYtOCcpO1xuICB9XG4gIGNvbnN0IGNodW5rcyA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGNvbnRlbnRzKSB7XG4gICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCd1dGYtOCcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBPcHRpbWl6ZXIoe1xuICBhc3luYyBvcHRpbWl6ZSh7IGNvbnRlbnRzLCBtYXAgfSkge1xuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCByZWFkQ29udGVudHMoY29udGVudHMpO1xuICAgIGlmIChtYXApIHtcbiAgICAgIG1hcC5vZmZzZXRMaW5lcygxLCBQUkVBTUJMRV9MSU5FX0NPVU5UKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudHM6IFBSRUFNQkxFICsgY29kZSwgbWFwIH07XG4gIH1cbn0pO1xuYCxcbiAgICBbUEFSQ0VMUkNdOiBgJHtKU09OLnN0cmluZ2lmeShwYXJjZWxyYywgbnVsbCwgSlNPTl9JTkRFTlQpfVxcbmAsXG4gICAgLy8gYFN0cmluZy5yYXdgLCBzbyB0aGUgbGluZSBicmVha3MgYmVsb3cgcmVhY2ggdGhlIGZpbGUgYXMgZXNjYXBlcy5cbiAgICBbUFJFX01JTklGWV9GSUxFX05BTUVdOiBTdHJpbmcucmF3YC8qXG4gKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBSdW5zIGJlZm9yZSBwYXJjZWwncyBvd24gb3B0aW1pemVycywgb24gdGhlIEphdmFTY3JpcHQgYnVuZGxlLlxuICpcbiAqIEEgc2NvcGUtaG9pc3RlZCBsaWJyYXJ5IGJ1bmRsZSByZXF1aXJlKClzIGV2ZXJ5IGJ1bmRsZSBpdCByZWZlcmVuY2VzLCB0aGUgc3R5bGVzaGVldCBpbmNsdWRlZCwgYW5kIE9ic2lkaWFuXG4gKiBsb2FkcyBzdHlsZXMuY3NzIGl0c2VsZiwgYmVzaWRlIG1haW4uanMsIHdoZXJlIGEgcmVxdWlyZSgpIGNhbm5vdCByZWFjaCBpdC4gVGhlIGxpbmUgaXMgYmxhbmtlZCByYXRoZXIgdGhhblxuICogcmVtb3ZlZCwgc28gYSBzb3VyY2UgbWFwIHN0aWxsIGxpbmVzIHVwLlxuICpcbiAqIEEgc2NvcGUtaG9pc3RlZCBDb21tb25KUyBidW5kbGUgYWxzbyBkZWNsYXJlcyBldmVyeSBtb2R1bGUncyBiaW5kaW5ncyBhdCBpdHMgdG9wIGxldmVsLCB1bmRlciBsb25nIG5hbWVzIHN1Y2hcbiAqIGFzICRjNTg5OWFlYjRjYWFkZjI3JHZhciR0YXNrSWRDb3VudGVyLCBhbmQgcGFyY2VsIG1pbmlmaWVzIGl0IGFzIGEgc2NyaXB0LCB3aGVyZSB0aGUgbWluaWZpZXIgbWF5IG5vdCByZW5hbWVcbiAqIGEgdG9wLWxldmVsIGJpbmRpbmcsIHNpbmNlIGluIGEgc2NyaXB0IGl0IGlzIGEgZ2xvYmFsLiBPYnNpZGlhbiBldmFsdWF0ZXMgbWFpbi5qcyBhcyB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uLCBzb1xuICogd3JhcHBpbmcgdGhlIGJ1bmRsZSBpbiBhbiBhcnJvdyBmdW5jdGlvbiBjaGFuZ2VzIG5vdGhpbmcgYXQgcnVudGltZSAoYW4gYXJyb3cga2VlcHMgdGhpcyBhbmQgYXJndW1lbnRzKSBhbmRcbiAqIGxldHMgdGhlIG1pbmlmaWVyIHJlbmFtZSBhbGwgb2YgdGhlbTogU29saWQncyBmaXh0dXJlIGJ1aWxkIGlzIDcwIEtCIHdpdGhvdXQgdGhpcyBhbmQgMTAgS0Igd2l0aCBpdC5cbiAqL1xuY29uc3QgeyBPcHRpbWl6ZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IFNUWUxFU0hFRVRfUkVRVUlSRSA9ICR7SlNPTi5zdHJpbmdpZnkoYHJlcXVpcmUoXCIuLyR7T2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuU3R5bGVzQ3NzfVwiKTtcXG5gKX07XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDb250ZW50cyhjb250ZW50cykge1xuICBpZiAodHlwZW9mIGNvbnRlbnRzID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBjb250ZW50cztcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRlbnRzKSkge1xuICAgIHJldHVybiBjb250ZW50cy50b1N0cmluZygndXRmLTgnKTtcbiAgfVxuICBjb25zdCBjaHVua3MgPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb250ZW50cykge1xuICAgIGNodW5rcy5wdXNoKEJ1ZmZlci5mcm9tKGNodW5rKSk7XG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygndXRmLTgnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgT3B0aW1pemVyKHtcbiAgYXN5bmMgb3B0aW1pemUoeyBidW5kbGUsIGNvbnRlbnRzLCBtYXAgfSkge1xuICAgIGNvbnN0IGNvZGUgPSAoYXdhaXQgcmVhZENvbnRlbnRzKGNvbnRlbnRzKSkucmVwbGFjZShTVFlMRVNIRUVUX1JFUVVJUkUsICdcXG4nKTtcbiAgICBpZiAoIWJ1bmRsZS5lbnYuc2hvdWxkT3B0aW1pemUpIHtcbiAgICAgIHJldHVybiB7IGNvbnRlbnRzOiBjb2RlLCBtYXAgfTtcbiAgICB9XG4gICAgaWYgKG1hcCkge1xuICAgICAgbWFwLm9mZnNldExpbmVzKDEsIDEpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50czogJygoKSA9PiB7XFxuJyArIGNvZGUgKyAnXFxufSkoKTtcXG4nLCBtYXAgfTtcbiAgfVxufSk7XG5gLFxuICAgIFtSRVNPTFZFUl9GSUxFX05BTUVdOiBgLypcbiAqIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIExlYXZlcyB0aGUgbW9kdWxlcyBPYnNpZGlhbiBzdXBwbGllcyBhdCBydW50aW1lIHRvIHJlcXVpcmUoKSwgYW5kXG4gKiByZXNvbHZlcyBldmVyeXRoaW5nIGVsc2UgdGhlIHdheSBAcGFyY2VsL3Jlc29sdmVyLWRlZmF1bHQgZG9lcywgd2l0aCB0aGUgYnJvd3NlcidzIGV4cG9ydCBjb25kaXRpb25zLlxuICpcbiAqIFBhcmNlbCByZXNvbHZlcyBhbiBlbGVjdHJvbi1yZW5kZXJlciB0YXJnZXQgd2l0aCB0aGUgbm9kZSBhbmQgZWxlY3Ryb24gY29uZGl0aW9ucyBiZXNpZGUgYnJvd3NlciwgYW5kIGFuIGV4cG9ydHNcbiAqIG1hcCBpcyBtYXRjaGVkIGluIHRoZSBwYWNrYWdlJ3Mgb3duIGtleSBvcmRlciwgc28gYSBwYWNrYWdlIGxpc3Rpbmcgbm9kZSBmaXJzdCAoVnVlLCBTdmVsdGUsIFNvbGlkLCBmZmxhdGUpIHdvdWxkXG4gKiBoYW5kIG92ZXIgaXRzIE5vZGUgYnVpbGQ6IHNldmVyYWwgdGltZXMgdGhlIGNvZGUsIGFuZCBvbmUgdGhhdCBtYXkgbm90IGxvYWQgb24gbW9iaWxlLiBUaGUgTm9kZSBidWlsdGlucyBuZWVkIG5vXG4gKiBub2RlIGNvbmRpdGlvbiB0byBzdGF5IGV4dGVybmFsLCBzaW5jZSB0aGV5IGFyZSBpbiB0aGUgZXh0ZXJuYWxzIGJlbG93LlxuICovXG5jb25zdCB7IFJlc29sdmVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuY29uc3QgeyBkaXJuYW1lIH0gPSByZXF1aXJlKCdub2RlOnBhdGgnKTtcblxuY29uc3QgRVhURVJOQUxTID0gbmV3IFNldCgke0pTT04uc3RyaW5naWZ5KE9CU0lESUFOX1BMVUdJTl9FWFRFUk5BTFMpfSk7XG5cbmZ1bmN0aW9uIGdldEJyb3dzZXJFbnZpcm9ubWVudChlbnYpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZXh0OiBlbnYuY29udGV4dCxcbiAgICBpZDogZW52LmlkICsgJzpvYnNpZGlhbi1kZXYtdG9vbGtpdC1icm93c2VyLWNvbmRpdGlvbnMnLFxuICAgIGluY2x1ZGVOb2RlTW9kdWxlczogZW52LmluY2x1ZGVOb2RlTW9kdWxlcyxcbiAgICBpc0Jyb3dzZXI6ICgpID0+IHRydWUsXG4gICAgaXNFbGVjdHJvbjogKCkgPT4gZmFsc2UsXG4gICAgaXNMaWJyYXJ5OiBlbnYuaXNMaWJyYXJ5LFxuICAgIGlzTm9kZTogKCkgPT4gZmFsc2UsXG4gICAgaXNXb3JrZXI6ICgpID0+IGVudi5pc1dvcmtlcigpLFxuICAgIGlzV29ya2xldDogKCkgPT4gZW52LmlzV29ya2xldCgpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcikge1xuICBjb25zdCBzZWdtZW50cyA9IHNwZWNpZmllci5zcGxpdCgnLycpO1xuICByZXR1cm4gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ0AnKSA/IHNlZ21lbnRzLnNsaWNlKDAsIDIpLmpvaW4oJy8nKSA6IHNlZ21lbnRzWzBdO1xufVxuXG4vLyBAcGFyY2VsL25vZGUtcmVzb2x2ZXItY29yZSBpcyB3aGF0IEBwYXJjZWwvcmVzb2x2ZXItZGVmYXVsdCBydW5zLCByZWFjaGVkIHRocm91Z2ggdGhlIHBhY2thZ2VzIHRoYXQgaW5zdGFsbCBpdC5cbmZ1bmN0aW9uIGxvYWROb2RlUmVzb2x2ZXIoKSB7XG4gIGxldCBmb2xkZXIgPSBfX2Rpcm5hbWU7XG4gIGZvciAoY29uc3QgcGFja2FnZU5hbWUgb2YgWydAcGFyY2VsL2NvbmZpZy1kZWZhdWx0JywgJ0BwYXJjZWwvcmVzb2x2ZXItZGVmYXVsdCddKSB7XG4gICAgZm9sZGVyID0gZGlybmFtZShyZXF1aXJlLnJlc29sdmUocGFja2FnZU5hbWUgKyAnL3BhY2thZ2UuanNvbicsIHsgcGF0aHM6IFtmb2xkZXJdIH0pKTtcbiAgfVxuICByZXR1cm4gcmVxdWlyZShyZXF1aXJlLnJlc29sdmUoJ0BwYXJjZWwvbm9kZS1yZXNvbHZlci1jb3JlJywgeyBwYXRoczogW2ZvbGRlcl0gfSkpLmRlZmF1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFJlc29sdmVyKHtcbiAgYXN5bmMgbG9hZENvbmZpZyh7IGNvbmZpZywgbG9nZ2VyLCBvcHRpb25zIH0pIHtcbiAgICBjb25zdCBwYWNrYWdlQ29uZmlnID0gYXdhaXQgY29uZmlnLmdldENvbmZpZyhbXSwgeyBwYWNrYWdlS2V5OiAnQHBhcmNlbC9yZXNvbHZlci1kZWZhdWx0JyB9KTtcbiAgICBjb25zdCBOb2RlUmVzb2x2ZXIgPSBsb2FkTm9kZVJlc29sdmVyKCk7XG4gICAgcmV0dXJuIG5ldyBOb2RlUmVzb2x2ZXIoe1xuICAgICAgZnM6IG9wdGlvbnMuaW5wdXRGUyxcbiAgICAgIGxvZ2dlcixcbiAgICAgIG1vZGU6IG9wdGlvbnMubW9kZSxcbiAgICAgIHBhY2thZ2VFeHBvcnRzOiBwYWNrYWdlQ29uZmlnPy5jb250ZW50cz8ucGFja2FnZUV4cG9ydHMgPz8gZmFsc2UsXG4gICAgICBwYWNrYWdlTWFuYWdlcjogb3B0aW9ucy5wYWNrYWdlTWFuYWdlcixcbiAgICAgIHByb2plY3RSb290OiBvcHRpb25zLnByb2plY3RSb290LFxuICAgICAgc2hvdWxkQXV0b0luc3RhbGw6IG9wdGlvbnMuc2hvdWxkQXV0b0luc3RhbGxcbiAgICB9KTtcbiAgfSxcbiAgcmVzb2x2ZSh7IGNvbmZpZzogbm9kZVJlc29sdmVyLCBkZXBlbmRlbmN5LCBzcGVjaWZpZXIgfSkge1xuICAgIGNvbnN0IGlzRXh0ZXJuYWwgPSBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnbm9kZTonKSB8fCBFWFRFUk5BTFMuaGFzKHNwZWNpZmllcikgfHwgRVhURVJOQUxTLmhhcyhnZXRQYWNrYWdlTmFtZShzcGVjaWZpZXIpKTtcbiAgICBpZiAoaXNFeHRlcm5hbCkge1xuICAgICAgcmV0dXJuIHsgaXNFeGNsdWRlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbm9kZVJlc29sdmVyLnJlc29sdmUoe1xuICAgICAgZW52OiBnZXRCcm93c2VyRW52aXJvbm1lbnQoZGVwZW5kZW5jeS5lbnYpLFxuICAgICAgZmlsZW5hbWU6IHNwZWNpZmllcixcbiAgICAgIGxvYzogZGVwZW5kZW5jeS5sb2MsXG4gICAgICBwYWNrYWdlQ29uZGl0aW9uczogZGVwZW5kZW5jeS5wYWNrYWdlQ29uZGl0aW9ucyxcbiAgICAgIHBhcmVudDogZGVwZW5kZW5jeS5yZXNvbHZlRnJvbSxcbiAgICAgIHJhbmdlOiBkZXBlbmRlbmN5LnJhbmdlLFxuICAgICAgc291cmNlUGF0aDogZGVwZW5kZW5jeS5zb3VyY2VQYXRoLFxuICAgICAgc3BlY2lmaWVyVHlwZTogZGVwZW5kZW5jeS5zcGVjaWZpZXJUeXBlXG4gICAgfSk7XG4gIH1cbn0pO1xuYFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgb3B0aW9ucyBoYW5kZWQgdG8gcGFyY2VsJ3MgYFBhcmNlbGAgY2xhc3MuXG4gKlxuICogVGhlIG9uZSB0YXJnZXQgaXMgYGVsZWN0cm9uLXJlbmRlcmVyYCwgd2hlcmUgT2JzaWRpYW4gcnVucyBhIHBsdWdpbiwgYW5kIENvbW1vbkpTLiBQYXJjZWwgY291bnRzIHRoYXRcbiAqIGNvbnRleHQgYXMgYm90aCBhIGJyb3dzZXIgYW5kIGEgbm9kZSBvbmU6IG5vZGUga2VlcHMgYHByb2Nlc3NgLCBgQnVmZmVyYCBhbmQgYHByb2Nlc3MuZW52YCBhcyBPYnNpZGlhbidzXG4gKiByZW5kZXJlciBoYXMgdGhlbSwgcmF0aGVyIHRoYW4gcG9seWZpbGxlZCBvciBpbmxpbmVkIGZyb20gdGhlIGJ1aWxkIG1hY2hpbmUsIGFuZCBicm93c2VyIHRha2VzIGEgcGFja2FnZSdzXG4gKiBgYnJvd3NlcmAgZmllbGQuIEl0cyBleHBvcnQgY29uZGl0aW9ucyB3b3VsZCBpbmNsdWRlIGBub2RlYCB0b28sIHdoaWNoIHRoZSBnZW5lcmF0ZWQgcmVzb2x2ZXIgZHJvcHMuXG4gKiBgaW5jbHVkZU5vZGVNb2R1bGVzYCBidW5kbGVzIHRoZSBkZXBlbmRlbmNpZXMsIHdoaWNoIGEgbm9kZS1mbGF2b3VyZWQgY29udGV4dCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgYXNcbiAqIGByZXF1aXJlKClgIGNhbGxzIG5vdGhpbmcgaW5zdGFsbHMgYmVzaWRlIGEgcGx1Z2luLCBhbmQgYGlzTGlicmFyeWAga2VlcHMgdGhlIGVudHJ5J3MgZGVmYXVsdCBleHBvcnQsIHdoaWNoXG4gKiBpcyBob3cgT2JzaWRpYW4gZmluZHMgdGhlIHBsdWdpbiBjbGFzcy5cbiAqXG4gKiBgc2hvdWxkU2NvcGVIb2lzdGAgaXMgc2V0IGV4cGxpY2l0bHkgYmVjYXVzZSBwYXJjZWwgcmVhZHMgaXQgb25seSBmcm9tIGBkZWZhdWx0VGFyZ2V0T3B0aW9uc2AgZm9yIGEgdGFyZ2V0XG4gKiBwYXNzZWQgaW4gdGhlIG9wdGlvbnMsIG5ldmVyIGZyb20gYGlzTGlicmFyeWAgYXMgaXQgZG9lcyBmb3Igb25lIGluIGBwYWNrYWdlLmpzb25gLiBXaXRob3V0IGl0IHRoZSBidW5kbGVcbiAqIGlzIG5vdCB0cmVlLXNoYWtlbiBhdCBhbGw6IFN2ZWx0ZSdzIGZpeHR1cmUgYnVpbGQgd2FzIDIyNCBLQiB3aXRoIHBhcmNlbCBhZ2FpbnN0IDI1IEtCIHdpdGggdml0ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRQYXJjZWxPcHRpb25zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwYXJjZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmNlbE9wdGlvbnMocGFyYW1zOiBHZXRQYXJjZWxPcHRpb25zUGFyYW1zKTogSW5pdGlhbFBhcmNlbE9wdGlvbnMge1xuICBjb25zdCB7IGJ1aWxkQ29udGV4dCwgY2FjaGVGb2xkZXIsIGNvbmZpZ1BhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0OiBUYXJnZXREZXNjcmlwdG9yID0ge1xuICAgIGNvbnRleHQ6ICdlbGVjdHJvbi1yZW5kZXJlcicsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRpc3REaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICBkaXN0RGlyOiBidWlsZENvbnRleHQuZGlzdEZvbGRlcixcbiAgICBpbmNsdWRlTm9kZU1vZHVsZXM6IHRydWUsXG4gICAgaXNMaWJyYXJ5OiB0cnVlLFxuICAgIG9wdGltaXplOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgb3V0cHV0Rm9ybWF0OiAnY29tbW9uanMnLFxuICAgIHNvdXJjZU1hcDogIWJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCAmJiB7IGlubGluZTogdHJ1ZSB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgY2FjaGVEaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICBjYWNoZURpcjogY2FjaGVGb2xkZXIsXG4gICAgY29uZmlnOiBjb25maWdQYXRoLFxuICAgIGRlZmF1bHRUYXJnZXRPcHRpb25zOiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlzdERpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgICAgZGlzdERpcjogYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIsXG4gICAgICBzaG91bGRPcHRpbWl6ZTogYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgICAgc2hvdWxkU2NvcGVIb2lzdDogdHJ1ZSxcbiAgICAgIHNvdXJjZU1hcHM6ICFidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGRcbiAgICB9LFxuICAgIGVudHJpZXM6IGJ1aWxkQ29udGV4dC5lbnRyeVBvaW50LFxuICAgIG1vZGU6IGJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcsXG4gICAgdGFyZ2V0czogeyBvYnNpZGlhblBsdWdpbjogdGFyZ2V0IH1cbiAgfTtcbn1cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBQYXJ0IG9mIHRoZSBwYXJjZWwgYnVpbGQgYWJvdmUuICovXG5mdW5jdGlvbiBmb3JtYXRQYXJjZWxFcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IGRpYWdub3N0aWNzID0gKGVycm9yIGFzIFBhcmNlbEVycm9yTGlrZSB8IHVuZGVmaW5lZCk/LmRpYWdub3N0aWNzO1xuICBpZiAoZGlhZ25vc3RpY3MgJiYgZGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBkaWFnbm9zdGljcy5tYXAoKGRpYWdub3N0aWMpID0+IGRpYWdub3N0aWMubWVzc2FnZSkuam9pbignXFxuJyk7XG4gIH1cbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA/PyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIFVSTCBvZiBhIG1vZHVsZSBvZiB0aGlzIGZvbGRlciwgaW4gdGhlIHNhbWUgZm9ybSBhcyB0aGlzIG9uZSAoYC50c2AgZnJvbSBzb3VyY2UsIGAubWpzYCBvciBgLmNqc2Agb25jZVxuICogYnVpbHQpLCB3aGljaCB0aGUgZ2VuZXJhdGVkIHRyYW5zZm9ybWVyIGltcG9ydHMuXG4gKlxuICogQHBhcmFtIGJhc2VOYW1lIC0gVGhlIG1vZHVsZSdzIGZpbGUgbmFtZSB3aXRob3V0IGl0cyBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlJ3MgYGZpbGU6YCBVUkwuXG4gKi9cbmZ1bmN0aW9uIGdldFNpYmxpbmdNb2R1bGVVcmwoYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgVVJMKGAke2Jhc2VOYW1lfSR7ZXh0bmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpfWAsIGltcG9ydC5tZXRhLnVybCkuaHJlZjtcbn1cblxuZnVuY3Rpb24gaGFuZGxlV2F0Y2hFdmVudChldmVudDogQnVpbGRFdmVudCB8IHVuZGVmaW5lZCwgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCk6IHZvaWQge1xuICBpZiAoZXZlbnQ/LnR5cGUgPT09ICdidWlsZEZhaWx1cmUnKSB7XG4gICAgY29uc29sZS5lcnJvcihldmVudC5kaWFnbm9zdGljcy5tYXAoKGRpYWdub3N0aWMpID0+IGRpYWdub3N0aWMubWVzc2FnZSkuam9pbignXFxuJykpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXZlbnQ/LnR5cGUgIT09ICdidWlsZFN1Y2Nlc3MnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc29sZS53YXJuKGBSZWJ1aWx0IHdpdGggcGFyY2VsIGluICR7U3RyaW5nKGV2ZW50LmJ1aWxkVGltZSl9IG1zLmApO1xuICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlcihidWlsZENvbnRleHQpKTtcbn1cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtDQSx1QkFBOEI7QUFDOUIscUJBQStCO0FBQy9CLG1CQUFrQztBQUNsQyxrQkFLTztBQUNQLHFCQUEyQjtBQUMzQixzQkFJTztBQVFQLHdDQUF3QztBQUN4QyxtQ0FRTztBQUNQLHNDQUlPO0FBQ1AsZ0RBQThDO0FBdkU5QyxJQUFJLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLFNBQVMsc0JBQXNCO0FBQ3ZGLE1BQUksT0FBTyxlQUFlLFVBQVU7QUFDbEMsVUFBTSxlQUFlO0FBQ3JCLFVBQU0sTUFBTSxhQUFhLFVBQVU7QUFDbkMsUUFBSSxPQUFPLElBQUksa0JBQWtCLFlBQVk7QUFDM0MsYUFBTyxJQUFJLGNBQWMsVUFBVSxFQUFFO0FBQUEsSUFDdkM7QUFBQSxFQUNGO0FBQ0EsU0FBTyxXQUFXLFVBQVUsUUFBUTtBQUN0QyxHQUFHO0FBaUlILE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0saUNBQWlDLEdBQUcsbUJBQW1CO0FBQzdELE1BQU0sV0FBVztBQWVqQixNQUFNLHFCQUFxQjtBQUMzQixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLHVCQUF1QjtBQUM3QixNQUFN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
|
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Parcel takes no `external` list and no output file name, only plugins named in a `.parcelrc`. So the
|
|
9
9
|
* build writes a `.parcelrc` of its own into `.parcel-cache`, beside a resolver that leaves
|
|
10
|
-
* Obsidian's modules external
|
|
11
|
-
* dynamic imports inside `main.js`, and
|
|
10
|
+
* Obsidian's modules external and resolves packages with the browser's export conditions, a namer that names
|
|
11
|
+
* the stylesheet `styles.css`, a transformer that keeps dynamic imports inside `main.js`, and an optimizer that
|
|
12
|
+
* lets the minifier rename the bundle's top-level bindings, and extends the
|
|
12
13
|
* consumer's own `.parcelrc` when there is one (or `@parcel/config-default` when there is none), so every
|
|
13
14
|
* transformer the consumer configured still applies.
|
|
14
15
|
*
|
|
@@ -117,10 +118,16 @@ export declare function getParcelConfigFiles(params: GetParcelConfigFilesParams)
|
|
|
117
118
|
* Builds the options handed to parcel's `Parcel` class.
|
|
118
119
|
*
|
|
119
120
|
* The one target is `electron-renderer`, where Obsidian runs a plugin, and CommonJS. Parcel counts that
|
|
120
|
-
* context as both a browser and a node one
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
* `
|
|
121
|
+
* context as both a browser and a node one: node keeps `process`, `Buffer` and `process.env` as Obsidian's
|
|
122
|
+
* renderer has them, rather than polyfilled or inlined from the build machine, and browser takes a package's
|
|
123
|
+
* `browser` field. Its export conditions would include `node` too, which the generated resolver drops.
|
|
124
|
+
* `includeNodeModules` bundles the dependencies, which a node-flavoured context would otherwise leave as
|
|
125
|
+
* `require()` calls nothing installs beside a plugin, and `isLibrary` keeps the entry's default export, which
|
|
126
|
+
* is how Obsidian finds the plugin class.
|
|
127
|
+
*
|
|
128
|
+
* `shouldScopeHoist` is set explicitly because parcel reads it only from `defaultTargetOptions` for a target
|
|
129
|
+
* passed in the options, never from `isLibrary` as it does for one in `package.json`. Without it the bundle
|
|
130
|
+
* is not tree-shaken at all: Svelte's fixture build was 224 KB with parcel against 25 KB with vite.
|
|
124
131
|
*
|
|
125
132
|
* @param params - The {@link GetParcelOptionsParams}.
|
|
126
133
|
* @returns The parcel options.
|
|
@@ -2,80 +2,6 @@
|
|
|
2
2
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
3
|
if you want to view the source, please visit the github repository of this plugin
|
|
4
4
|
*/
|
|
5
|
-
(function patchObsidianRequire() {
|
|
6
|
-
const originalRequire = require;
|
|
7
|
-
if (!originalRequire || originalRequire.__isPatched) {
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
require = Object.assign(
|
|
12
|
-
(id) => requirePatched(id),
|
|
13
|
-
originalRequire,
|
|
14
|
-
{
|
|
15
|
-
__isPatched: true
|
|
16
|
-
}
|
|
17
|
-
);
|
|
18
|
-
|
|
19
|
-
function extractDefault(module) {
|
|
20
|
-
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
24
|
-
'@codemirror/autocomplete',
|
|
25
|
-
'@codemirror/collab',
|
|
26
|
-
'@codemirror/commands',
|
|
27
|
-
'@codemirror/language',
|
|
28
|
-
'@codemirror/lint',
|
|
29
|
-
'@codemirror/search',
|
|
30
|
-
'@codemirror/state',
|
|
31
|
-
'@codemirror/text',
|
|
32
|
-
'@codemirror/view',
|
|
33
|
-
'@lezer/common',
|
|
34
|
-
'@lezer/highlight',
|
|
35
|
-
'@lezer/lr',
|
|
36
|
-
'obsidian']
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
40
|
-
'@codemirror/closebrackets',
|
|
41
|
-
'@codemirror/comment',
|
|
42
|
-
'@codemirror/fold',
|
|
43
|
-
'@codemirror/gutter',
|
|
44
|
-
'@codemirror/highlight',
|
|
45
|
-
'@codemirror/history',
|
|
46
|
-
'@codemirror/matchbrackets',
|
|
47
|
-
'@codemirror/panel',
|
|
48
|
-
'@codemirror/rangeset',
|
|
49
|
-
'@codemirror/rectangular-selection',
|
|
50
|
-
'@codemirror/stream-parser',
|
|
51
|
-
'@codemirror/tooltip']
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
function requirePatched(id) {
|
|
55
|
-
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
56
|
-
return originalRequire?.(id);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
60
|
-
if (globalThis.app.isMobile) {
|
|
61
|
-
if (id === 'process' || id === 'node:process') {
|
|
62
|
-
// eslint-disable-next-line no-console -- Valid usage.
|
|
63
|
-
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
64
|
-
|
|
65
|
-
return process;
|
|
66
|
-
}
|
|
67
|
-
} else {
|
|
68
|
-
const module = originalRequire?.(id);
|
|
69
|
-
if (module) {
|
|
70
|
-
return extractDefault(module);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// eslint-disable-next-line no-console -- Valid usage.
|
|
75
|
-
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
76
|
-
return {};
|
|
77
|
-
}
|
|
78
|
-
})();
|
|
79
5
|
|
|
80
6
|
"use strict";
|
|
81
7
|
var __defProp = Object.defineProperty;
|
|
@@ -178,4 +104,4 @@ async function createUnpluginVuePlugin(params) {
|
|
|
178
104
|
createRollupCompatibleFeaturePlugin,
|
|
179
105
|
createUnpluginVuePlugin
|
|
180
106
|
});
|
|
181
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9yb2xsdXAtY29tcGF0aWJsZS1mZWF0dXJlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGJ1aWxkIGZlYXR1cmVzIG9mIHRoZSByb2xsdXAgYW5kIHZpdGUgYWRhcHRlcnM6IG9uZSBwbHVnaW4sIHR5cGVkIGJ5IHRoZSBzaGFwZSBib3RoIGJ1bmRsZXJzIGFjY2VwdCwgdGhhdCBydW5zXG4gKiB0aGUgc2hhcmVkIHRyYW5zZm9ybXMgKFNvbGlkLCBTdmVsdGUsIHN0eWxlc2hlZXRzLCBXZWJBc3NlbWJseSkgYW5kIHJlcGxhY2VzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzLFxuICogcGx1cyB0aGUgYHVucGx1Z2luLXZ1ZWAgcGx1Z2luIGZvciBWdWUuXG4gKi9cblxuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VNYXBMaWtlIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmVhdHVyZUZpbGVLaW5kLFxuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBpbXBvcnRPcHRpb25hbFBlZXIsXG4gIHJlcGxhY2VEZWZpbmVzXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7XG4gIGdldENzc01vZHVsZUNvZGUsXG4gIGdldFdhc21Nb2R1bGVDb2RlLFxuICB0cmFuc2Zvcm1Dc3MsXG4gIHRyYW5zZm9ybVNvbGlkLFxuICB0cmFuc2Zvcm1TdmVsdGVcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2lufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgZmVhdHVyZXMuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlczogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucztcblxuICAvKipcbiAgICogVGVsbHMgd2hldGhlciB0aGUgYnVpbGQgaXMgYSBwcm9kdWN0aW9uIG9uZS4gQ2FsbGVkIGZyb20gdGhlIGhvb2tzLCBhZnRlciB0aGUgYWRhcHRlciByZXNvbHZlZCBpdHMgYnVpbGQgbW9kZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzUHJvZHVjdGlvbkJ1aWxkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcGx1Z2luIGNvbXBpbGVzIHN0eWxlc2hlZXRzLiBWaXRlIGNvbXBpbGVzIHRoZW0gaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcGx1Z2luIHJlcGxhY2VzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzIGluIHRoZSBjb2RlLiBWaXRlIGRvZXMgaXQgdGhyb3VnaCBpdHMgb3duXG4gICAqIGBkZWZpbmVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVwbGFjZURlZmluZXM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVVucGx1Z2luVnVlUGx1Z2lufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVVbnBsdWdpblZ1ZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVuZGxlciwgd2hpY2ggbmFtZXMgdGhlIGB1bnBsdWdpbi12dWVgIGVudHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVuZGxlcjogJ3JvbGx1cCcgfCAndml0ZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIGEgcm9sbHVwIG9yIHJvbGxkb3duIHBsdWdpbiBjb250ZXh0IHRoZSBmZWF0dXJlIHBsdWdpbiB1c2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVQbHVnaW5Db250ZXh0IHtcbiAgLyoqXG4gICAqIEFkZHMgYSBmaWxlIHRvIHdhdGNoIGluIGEgd2F0Y2ggYnVpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBmaWxlJ3MgcGF0aC5cbiAgICovXG4gIGFkZFdhdGNoRmlsZTogKGlkOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGFzc2V0IGludG8gdGhlIGJ1bmRsZS5cbiAgICpcbiAgICogQHBhcmFtIGVtaXR0ZWRGaWxlIC0gVGhlIGFzc2V0IHRvIGVtaXQuXG4gICAqIEByZXR1cm5zIFRoZSByZWZlcmVuY2UgaWQgb2YgdGhlIGVtaXR0ZWQgZmlsZS5cbiAgICovXG4gIGVtaXRGaWxlOiAoZW1pdHRlZEZpbGU6IEVtaXR0ZWRBc3NldCkgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4ge0BsaW5rIGNyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2lufSBjcmVhdGVzLCBpbiB0aGUgc2hhcGUgcm9sbHVwIGFuZCB2aXRlIGJvdGggYWNjZXB0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luIHtcbiAgLyoqXG4gICAqIExvYWRzIGEgYC53YXNtYCBtb2R1bGUgYXMgaXRzIGJ5dGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZDogRmVhdHVyZVBsdWdpbkhvb2s8KHRoaXM6IEZlYXR1cmVQbHVnaW5Db250ZXh0LCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbXBpbGVzIGEgbW9kdWxlIHRoZSBmZWF0dXJlcyB0cmFuc2Zvcm0sIHRoZW4gcmVwbGFjZXMgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudHMuXG4gICAqL1xuICByZWFkb25seSB0cmFuc2Zvcm06IEZlYXR1cmVQbHVnaW5Ib29rPCh0aGlzOiBGZWF0dXJlUGx1Z2luQ29udGV4dCwgY29kZTogc3RyaW5nLCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPG51bGwgfCBUcmFuc2Zvcm1SZXN1bHRMaWtlPj47XG59XG5cbi8qKlxuICogVGhlIGFzc2V0IHRoZSBmZWF0dXJlIHBsdWdpbiBlbWl0cyBmb3IgYSBzdHlsZXNoZWV0LlxuICovXG5pbnRlcmZhY2UgRW1pdHRlZEFzc2V0IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZTogJ2Fzc2V0Jztcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBob29rIHdpdGggaXRzIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gSGFuZGxlciAtIFRoZSBob29rJ3MgaGFuZGxlci5cbiAqL1xuaW50ZXJmYWNlIEZlYXR1cmVQbHVnaW5Ib29rPEhhbmRsZXI+IHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogSGFuZGxlcjtcbiAgcmVhZG9ubHkgb3JkZXI6ICdwcmUnO1xufVxuXG4vKipcbiAqIEEgdHJhbnNmb3JtIGhvb2sncyByZXN1bHQuXG4gKi9cbmludGVyZmFjZSBUcmFuc2Zvcm1SZXN1bHRMaWtlIHtcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtYXA/OiBTb3VyY2VNYXBMaWtlIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgVW5wbHVnaW5WdWVNb2R1bGUge1xuICByZWFkb25seSBkZWZhdWx0OiAob3B0aW9ucz86IG9iamVjdCkgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBwbHVnaW4gdGhhdCBydW5zIHRoZSBzaGFyZWQgdHJhbnNmb3JtcyBpbiBhIHJvbGx1cCBvciB2aXRlIGJ1aWxkLlxuICpcbiAqIC0gYGZyYW1ld29yazogJ3NvbGlkJ2AgY29tcGlsZXMgYC5qc3hgIC8gYC50c3hgIHdpdGggYGJhYmVsLXByZXNldC1zb2xpZGAsIGJlZm9yZSB0aGUgcHJvamVjdCdzIFR5cGVTY3JpcHQgcGx1Z2luLlxuICogLSBgZnJhbWV3b3JrOiAnc3ZlbHRlJ2AgY29tcGlsZXMgYC5zdmVsdGVgIGNvbXBvbmVudHMgYW5kIGAuc3ZlbHRlLnRzYCAvIGAuc3ZlbHRlLmpzYCBtb2R1bGVzLlxuICogLSBgc3R5bGVzYCwgd2hlcmUge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zLnNob3VsZENvbXBpbGVTdHlsZXNoZWV0c30gc2F5cyBzbywgcnVucyBldmVyeVxuICogICBzdHlsZXNoZWV0IHRocm91Z2ggUG9zdENTUywgVGFpbHdpbmQgYW5kIENTUy1tb2R1bGUgc2NvcGluZyBhbmQgZW1pdHMgaXQgYXMgYW4gYXNzZXQsIHdoaWNoIGVuZHMgdXAgaW5cbiAqICAgYHN0eWxlcy5jc3NgLlxuICogLSBgd2FzbWAgbG9hZHMgYSBgLndhc21gIG1vZHVsZSBhcyBpdHMgYnl0ZXMuXG4gKiAtIEEgZnJhbWV3b3JrJ3MgY29tcGlsZS10aW1lIGNvbnN0YW50cyBhcmUgcmVwbGFjZWQgd2hlcmVcbiAqICAge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zLnNob3VsZFJlcGxhY2VEZWZpbmVzfSBzYXlzIHNvLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbihwYXJhbXM6IENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zKTogUm9sbHVwQ29tcGF0aWJsZUZlYXR1cmVQbHVnaW4ge1xuICBjb25zdCB7IGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzLCBzaG91bGRSZXBsYWNlRGVmaW5lcyB9ID0gcGFyYW1zO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybUZlYXR1cmVGaWxlKGNvbnRleHQ6IEZlYXR1cmVQbHVnaW5Db250ZXh0LCBjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBUcmFuc2Zvcm1SZXN1bHRMaWtlPiB7XG4gICAgY29uc3QgW2ZpbGVQYXRoID0gaWRdID0gaWQuc3BsaXQoJz8nLCAxKTtcbiAgICBzd2l0Y2ggKGdldEZlYXR1cmVGaWxlS2luZChpZCkpIHtcbiAgICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3NvbGlkJyA/IGF3YWl0IHRyYW5zZm9ybVNvbGlkKHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkOiBpc1Byb2R1Y3Rpb25CdWlsZCgpIH0pIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0eWxlc2hlZXQnOiB7XG4gICAgICAgIGlmICghc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzIHx8ICFmZWF0dXJlcy5zdHlsZXMpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1Dc3Moe1xuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGlzQ3NzTW9kdWxlU2NvcGVkOiB0cnVlLFxuICAgICAgICAgIGlzUHJvZHVjdGlvbkJ1aWxkOiBpc1Byb2R1Y3Rpb25CdWlsZCgpLFxuICAgICAgICAgIHNvdXJjZTogY29kZSxcbiAgICAgICAgICBzdHlsZXM6IGZlYXR1cmVzLnN0eWxlc1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlc3VsdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmFkZFdhdGNoRmlsZShkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmVtaXRGaWxlKHsgbmFtZTogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuU3R5bGVzQ3NzLCBzb3VyY2U6IHJlc3VsdC5jc3MsIHR5cGU6ICdhc3NldCcgfSk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IHJlc3VsdC5tb2R1bGVFeHBvcnRzID8gZ2V0Q3NzTW9kdWxlQ29kZShyZXN1bHQubW9kdWxlRXhwb3J0cykgOiAnZXhwb3J0IGRlZmF1bHQgdW5kZWZpbmVkO1xcbicgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N2ZWx0ZSc6IHtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3N2ZWx0ZScgPyBhd2FpdCB0cmFuc2Zvcm1TdmVsdGUoeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQ6IGlzUHJvZHVjdGlvbkJ1aWxkKCkgfSkgOiBudWxsO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxvYWQ6IHtcbiAgICAgIGFzeW5jIGhhbmRsZXIoaWQpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuICFmZWF0dXJlcy53YXNtIHx8IGdldEZlYXR1cmVGaWxlS2luZChpZCkgIT09ICd3YXNtJyA/IG51bGwgOiBnZXRXYXNtTW9kdWxlQ29kZShhd2FpdCByZWFkRmlsZShpZCkpO1xuICAgICAgfSxcbiAgICAgIG9yZGVyOiAncHJlJ1xuICAgIH0sXG4gICAgbmFtZTogJ29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcycsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBhc3luYyBoYW5kbGVyKGNvZGUsIGlkKTogUHJvbWlzZTxudWxsIHwgVHJhbnNmb3JtUmVzdWx0TGlrZT4ge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IGF3YWl0IHRyYW5zZm9ybUZlYXR1cmVGaWxlKHRoaXMsIGNvZGUsIGlkKTtcbiAgICAgICAgaWYgKCFzaG91bGRSZXBsYWNlRGVmaW5lcykge1xuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZpbmVzID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogZmVhdHVyZXMuZnJhbWV3b3JrLCBpc1Byb2R1Y3Rpb25CdWlsZDogaXNQcm9kdWN0aW9uQnVpbGQoKSB9KTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdHJhbnNmb3JtZWQ/LmNvZGUgPz8gY29kZTtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSByZXBsYWNlRGVmaW5lcyhzb3VyY2UsIGRlZmluZXMpO1xuICAgICAgICByZXR1cm4gcmVwbGFjZWQgPT09IHNvdXJjZSA/IHRyYW5zZm9ybWVkIDogeyBjb2RlOiByZXBsYWNlZCwgbWFwOiB0cmFuc2Zvcm1lZD8ubWFwIH07XG4gICAgICB9LFxuICAgICAgb3JkZXI6ICdwcmUnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGB1bnBsdWdpbi12dWVgIHBsdWdpbiBvZiBvbmUgYnVuZGxlciB3aGVuIHRoZSBmcmFtZXdvcmsgaXMgVnVlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVVucGx1Z2luVnVlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHBsdWdpbiwgb3IgYG51bGxgIHdoZW4gdGhlIGZyYW1ld29yayBpcyBub3QgVnVlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVW5wbHVnaW5WdWVQbHVnaW4ocGFyYW1zOiBDcmVhdGVVbnBsdWdpblZ1ZVBsdWdpblBhcmFtcyk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB7IGJ1bmRsZXIsIGZlYXR1cmVzIH0gPSBwYXJhbXM7XG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgIT09ICd2dWUnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgdW5wbHVnaW5WdWUgPSBhd2FpdCBpbXBvcnRPcHRpb25hbFBlZXI8VW5wbHVnaW5WdWVNb2R1bGU+KHtcbiAgICBmZWF0dXJlOiAnZnJhbWV3b3JrOiBcXCd2dWVcXCcnLFxuICAgIHBhY2thZ2VOYW1lOiAndW5wbHVnaW4tdnVlJyxcbiAgICBzcGVjaWZpZXI6IGB1bnBsdWdpbi12dWUvJHtidW5kbGVyfWBcbiAgfSk7XG4gIHJldHVybiB1bnBsdWdpblZ1ZS5kZWZhdWx0KCk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQSxzQkFBeUI7QUFLekIsd0NBQXdDO0FBQ3hDLHNDQUtPO0FBQ1Asd0NBTU87QUFpSUEsU0FBUyxvQ0FBb0MsUUFBa0Y7QUFDcEksUUFBTSxFQUFFLFVBQVUsbUJBQW1CLDBCQUEwQixxQkFBcUIsSUFBSTtBQUV4RixpQkFBZSxxQkFBcUIsU0FBK0IsTUFBYyxJQUFpRDtBQUNoSSxVQUFN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
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL3JvbGx1cC1jb21wYXRpYmxlLWZlYXR1cmVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGJ1aWxkIGZlYXR1cmVzIG9mIHRoZSByb2xsdXAgYW5kIHZpdGUgYWRhcHRlcnM6IG9uZSBwbHVnaW4sIHR5cGVkIGJ5IHRoZSBzaGFwZSBib3RoIGJ1bmRsZXJzIGFjY2VwdCwgdGhhdCBydW5zXG4gKiB0aGUgc2hhcmVkIHRyYW5zZm9ybXMgKFNvbGlkLCBTdmVsdGUsIHN0eWxlc2hlZXRzLCBXZWJBc3NlbWJseSkgYW5kIHJlcGxhY2VzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzLFxuICogcGx1cyB0aGUgYHVucGx1Z2luLXZ1ZWAgcGx1Z2luIGZvciBWdWUuXG4gKi9cblxuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VNYXBMaWtlIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmVhdHVyZUZpbGVLaW5kLFxuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBpbXBvcnRPcHRpb25hbFBlZXIsXG4gIHJlcGxhY2VEZWZpbmVzXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7XG4gIGdldENzc01vZHVsZUNvZGUsXG4gIGdldFdhc21Nb2R1bGVDb2RlLFxuICB0cmFuc2Zvcm1Dc3MsXG4gIHRyYW5zZm9ybVNvbGlkLFxuICB0cmFuc2Zvcm1TdmVsdGVcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2lufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgZmVhdHVyZXMuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlczogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucztcblxuICAvKipcbiAgICogVGVsbHMgd2hldGhlciB0aGUgYnVpbGQgaXMgYSBwcm9kdWN0aW9uIG9uZS4gQ2FsbGVkIGZyb20gdGhlIGhvb2tzLCBhZnRlciB0aGUgYWRhcHRlciByZXNvbHZlZCBpdHMgYnVpbGQgbW9kZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzUHJvZHVjdGlvbkJ1aWxkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcGx1Z2luIGNvbXBpbGVzIHN0eWxlc2hlZXRzLiBWaXRlIGNvbXBpbGVzIHRoZW0gaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcGx1Z2luIHJlcGxhY2VzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzIGluIHRoZSBjb2RlLiBWaXRlIGRvZXMgaXQgdGhyb3VnaCBpdHMgb3duXG4gICAqIGBkZWZpbmVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVwbGFjZURlZmluZXM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVVucGx1Z2luVnVlUGx1Z2lufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVVbnBsdWdpblZ1ZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVuZGxlciwgd2hpY2ggbmFtZXMgdGhlIGB1bnBsdWdpbi12dWVgIGVudHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVuZGxlcjogJ3JvbGx1cCcgfCAndml0ZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIGEgcm9sbHVwIG9yIHJvbGxkb3duIHBsdWdpbiBjb250ZXh0IHRoZSBmZWF0dXJlIHBsdWdpbiB1c2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVQbHVnaW5Db250ZXh0IHtcbiAgLyoqXG4gICAqIEFkZHMgYSBmaWxlIHRvIHdhdGNoIGluIGEgd2F0Y2ggYnVpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBmaWxlJ3MgcGF0aC5cbiAgICovXG4gIGFkZFdhdGNoRmlsZTogKGlkOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGFzc2V0IGludG8gdGhlIGJ1bmRsZS5cbiAgICpcbiAgICogQHBhcmFtIGVtaXR0ZWRGaWxlIC0gVGhlIGFzc2V0IHRvIGVtaXQuXG4gICAqIEByZXR1cm5zIFRoZSByZWZlcmVuY2UgaWQgb2YgdGhlIGVtaXR0ZWQgZmlsZS5cbiAgICovXG4gIGVtaXRGaWxlOiAoZW1pdHRlZEZpbGU6IEVtaXR0ZWRBc3NldCkgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4ge0BsaW5rIGNyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2lufSBjcmVhdGVzLCBpbiB0aGUgc2hhcGUgcm9sbHVwIGFuZCB2aXRlIGJvdGggYWNjZXB0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luIHtcbiAgLyoqXG4gICAqIExvYWRzIGEgYC53YXNtYCBtb2R1bGUgYXMgaXRzIGJ5dGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZDogRmVhdHVyZVBsdWdpbkhvb2s8KHRoaXM6IEZlYXR1cmVQbHVnaW5Db250ZXh0LCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbXBpbGVzIGEgbW9kdWxlIHRoZSBmZWF0dXJlcyB0cmFuc2Zvcm0sIHRoZW4gcmVwbGFjZXMgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudHMuXG4gICAqL1xuICByZWFkb25seSB0cmFuc2Zvcm06IEZlYXR1cmVQbHVnaW5Ib29rPCh0aGlzOiBGZWF0dXJlUGx1Z2luQ29udGV4dCwgY29kZTogc3RyaW5nLCBpZDogc3RyaW5nKSA9PiBQcm9taXNlPG51bGwgfCBUcmFuc2Zvcm1SZXN1bHRMaWtlPj47XG59XG5cbi8qKlxuICogVGhlIGFzc2V0IHRoZSBmZWF0dXJlIHBsdWdpbiBlbWl0cyBmb3IgYSBzdHlsZXNoZWV0LlxuICovXG5pbnRlcmZhY2UgRW1pdHRlZEFzc2V0IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZTogJ2Fzc2V0Jztcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBob29rIHdpdGggaXRzIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gSGFuZGxlciAtIFRoZSBob29rJ3MgaGFuZGxlci5cbiAqL1xuaW50ZXJmYWNlIEZlYXR1cmVQbHVnaW5Ib29rPEhhbmRsZXI+IHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogSGFuZGxlcjtcbiAgcmVhZG9ubHkgb3JkZXI6ICdwcmUnO1xufVxuXG4vKipcbiAqIEEgdHJhbnNmb3JtIGhvb2sncyByZXN1bHQuXG4gKi9cbmludGVyZmFjZSBUcmFuc2Zvcm1SZXN1bHRMaWtlIHtcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtYXA/OiBTb3VyY2VNYXBMaWtlIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgVW5wbHVnaW5WdWVNb2R1bGUge1xuICByZWFkb25seSBkZWZhdWx0OiAob3B0aW9ucz86IG9iamVjdCkgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBwbHVnaW4gdGhhdCBydW5zIHRoZSBzaGFyZWQgdHJhbnNmb3JtcyBpbiBhIHJvbGx1cCBvciB2aXRlIGJ1aWxkLlxuICpcbiAqIC0gYGZyYW1ld29yazogJ3NvbGlkJ2AgY29tcGlsZXMgYC5qc3hgIC8gYC50c3hgIHdpdGggYGJhYmVsLXByZXNldC1zb2xpZGAsIGJlZm9yZSB0aGUgcHJvamVjdCdzIFR5cGVTY3JpcHQgcGx1Z2luLlxuICogLSBgZnJhbWV3b3JrOiAnc3ZlbHRlJ2AgY29tcGlsZXMgYC5zdmVsdGVgIGNvbXBvbmVudHMgYW5kIGAuc3ZlbHRlLnRzYCAvIGAuc3ZlbHRlLmpzYCBtb2R1bGVzLlxuICogLSBgc3R5bGVzYCwgd2hlcmUge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zLnNob3VsZENvbXBpbGVTdHlsZXNoZWV0c30gc2F5cyBzbywgcnVucyBldmVyeVxuICogICBzdHlsZXNoZWV0IHRocm91Z2ggUG9zdENTUywgVGFpbHdpbmQgYW5kIENTUy1tb2R1bGUgc2NvcGluZyBhbmQgZW1pdHMgaXQgYXMgYW4gYXNzZXQsIHdoaWNoIGVuZHMgdXAgaW5cbiAqICAgYHN0eWxlcy5jc3NgLlxuICogLSBgd2FzbWAgbG9hZHMgYSBgLndhc21gIG1vZHVsZSBhcyBpdHMgYnl0ZXMuXG4gKiAtIEEgZnJhbWV3b3JrJ3MgY29tcGlsZS10aW1lIGNvbnN0YW50cyBhcmUgcmVwbGFjZWQgd2hlcmVcbiAqICAge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zLnNob3VsZFJlcGxhY2VEZWZpbmVzfSBzYXlzIHNvLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbihwYXJhbXM6IENyZWF0ZVJvbGx1cENvbXBhdGlibGVGZWF0dXJlUGx1Z2luUGFyYW1zKTogUm9sbHVwQ29tcGF0aWJsZUZlYXR1cmVQbHVnaW4ge1xuICBjb25zdCB7IGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzLCBzaG91bGRSZXBsYWNlRGVmaW5lcyB9ID0gcGFyYW1zO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybUZlYXR1cmVGaWxlKGNvbnRleHQ6IEZlYXR1cmVQbHVnaW5Db250ZXh0LCBjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBUcmFuc2Zvcm1SZXN1bHRMaWtlPiB7XG4gICAgY29uc3QgW2ZpbGVQYXRoID0gaWRdID0gaWQuc3BsaXQoJz8nLCAxKTtcbiAgICBzd2l0Y2ggKGdldEZlYXR1cmVGaWxlS2luZChpZCkpIHtcbiAgICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3NvbGlkJyA/IGF3YWl0IHRyYW5zZm9ybVNvbGlkKHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkOiBpc1Byb2R1Y3Rpb25CdWlsZCgpIH0pIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0eWxlc2hlZXQnOiB7XG4gICAgICAgIGlmICghc2hvdWxkQ29tcGlsZVN0eWxlc2hlZXRzIHx8ICFmZWF0dXJlcy5zdHlsZXMpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1Dc3Moe1xuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGlzQ3NzTW9kdWxlU2NvcGVkOiB0cnVlLFxuICAgICAgICAgIGlzUHJvZHVjdGlvbkJ1aWxkOiBpc1Byb2R1Y3Rpb25CdWlsZCgpLFxuICAgICAgICAgIHNvdXJjZTogY29kZSxcbiAgICAgICAgICBzdHlsZXM6IGZlYXR1cmVzLnN0eWxlc1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlc3VsdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmFkZFdhdGNoRmlsZShkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmVtaXRGaWxlKHsgbmFtZTogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuU3R5bGVzQ3NzLCBzb3VyY2U6IHJlc3VsdC5jc3MsIHR5cGU6ICdhc3NldCcgfSk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IHJlc3VsdC5tb2R1bGVFeHBvcnRzID8gZ2V0Q3NzTW9kdWxlQ29kZShyZXN1bHQubW9kdWxlRXhwb3J0cykgOiAnZXhwb3J0IGRlZmF1bHQgdW5kZWZpbmVkO1xcbicgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N2ZWx0ZSc6IHtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3N2ZWx0ZScgPyBhd2FpdCB0cmFuc2Zvcm1TdmVsdGUoeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQ6IGlzUHJvZHVjdGlvbkJ1aWxkKCkgfSkgOiBudWxsO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxvYWQ6IHtcbiAgICAgIGFzeW5jIGhhbmRsZXIoaWQpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuICFmZWF0dXJlcy53YXNtIHx8IGdldEZlYXR1cmVGaWxlS2luZChpZCkgIT09ICd3YXNtJyA/IG51bGwgOiBnZXRXYXNtTW9kdWxlQ29kZShhd2FpdCByZWFkRmlsZShpZCkpO1xuICAgICAgfSxcbiAgICAgIG9yZGVyOiAncHJlJ1xuICAgIH0sXG4gICAgbmFtZTogJ29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcycsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBhc3luYyBoYW5kbGVyKGNvZGUsIGlkKTogUHJvbWlzZTxudWxsIHwgVHJhbnNmb3JtUmVzdWx0TGlrZT4ge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IGF3YWl0IHRyYW5zZm9ybUZlYXR1cmVGaWxlKHRoaXMsIGNvZGUsIGlkKTtcbiAgICAgICAgaWYgKCFzaG91bGRSZXBsYWNlRGVmaW5lcykge1xuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZpbmVzID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogZmVhdHVyZXMuZnJhbWV3b3JrLCBpc1Byb2R1Y3Rpb25CdWlsZDogaXNQcm9kdWN0aW9uQnVpbGQoKSB9KTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdHJhbnNmb3JtZWQ/LmNvZGUgPz8gY29kZTtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSByZXBsYWNlRGVmaW5lcyhzb3VyY2UsIGRlZmluZXMpO1xuICAgICAgICByZXR1cm4gcmVwbGFjZWQgPT09IHNvdXJjZSA/IHRyYW5zZm9ybWVkIDogeyBjb2RlOiByZXBsYWNlZCwgbWFwOiB0cmFuc2Zvcm1lZD8ubWFwIH07XG4gICAgICB9LFxuICAgICAgb3JkZXI6ICdwcmUnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGB1bnBsdWdpbi12dWVgIHBsdWdpbiBvZiBvbmUgYnVuZGxlciB3aGVuIHRoZSBmcmFtZXdvcmsgaXMgVnVlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVVucGx1Z2luVnVlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHBsdWdpbiwgb3IgYG51bGxgIHdoZW4gdGhlIGZyYW1ld29yayBpcyBub3QgVnVlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVW5wbHVnaW5WdWVQbHVnaW4ocGFyYW1zOiBDcmVhdGVVbnBsdWdpblZ1ZVBsdWdpblBhcmFtcyk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB7IGJ1bmRsZXIsIGZlYXR1cmVzIH0gPSBwYXJhbXM7XG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgIT09ICd2dWUnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgdW5wbHVnaW5WdWUgPSBhd2FpdCBpbXBvcnRPcHRpb25hbFBlZXI8VW5wbHVnaW5WdWVNb2R1bGU+KHtcbiAgICBmZWF0dXJlOiAnZnJhbWV3b3JrOiBcXCd2dWVcXCcnLFxuICAgIHBhY2thZ2VOYW1lOiAndW5wbHVnaW4tdnVlJyxcbiAgICBzcGVjaWZpZXI6IGB1bnBsdWdpbi12dWUvJHtidW5kbGVyfWBcbiAgfSk7XG4gIHJldHVybiB1bnBsdWdpblZ1ZS5kZWZhdWx0KCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLHNCQUF5QjtBQUt6Qix3Q0FBd0M7QUFDeEMsc0NBS087QUFDUCx3Q0FNTztBQWlJQSxTQUFTLG9DQUFvQyxRQUFrRjtBQUNwSSxRQUFNLEVBQUUsVUFBVSxtQkFBbUIsMEJBQTBCLHFCQUFxQixJQUFJO0FBRXhGLGlCQUFlLHFCQUFxQixTQUErQixNQUFjLElBQWlEO0FBQ2hJLFVBQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQ3ZDLGdCQUFRLG9EQUFt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
|