@pipeline-builder/pipeline-manager 4.1.15 → 4.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/config.yml +16 -37
  2. package/dist/boilerplate.js +10 -2
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +97 -79
  5. package/dist/commands/audit-stacks.js +3 -3
  6. package/dist/commands/create-pat.d.ts +2 -3
  7. package/dist/commands/create-pat.d.ts.map +1 -1
  8. package/dist/commands/create-pat.js +3 -4
  9. package/dist/commands/create-pipeline.d.ts.map +1 -1
  10. package/dist/commands/create-pipeline.js +198 -190
  11. package/dist/commands/list-pipelines.js +2 -2
  12. package/dist/commands/list-plugins.js +2 -2
  13. package/dist/commands/login.d.ts +2 -2
  14. package/dist/commands/login.js +3 -3
  15. package/dist/commands/new-plugin.d.ts +48 -5
  16. package/dist/commands/new-plugin.d.ts.map +1 -1
  17. package/dist/commands/new-plugin.js +261 -95
  18. package/dist/commands/plugin-lifecycle.d.ts +29 -0
  19. package/dist/commands/plugin-lifecycle.d.ts.map +1 -0
  20. package/dist/commands/plugin-lifecycle.js +147 -0
  21. package/dist/commands/provision.d.ts +42 -2
  22. package/dist/commands/provision.d.ts.map +1 -1
  23. package/dist/commands/provision.js +184 -147
  24. package/dist/commands/publish-plugin.d.ts +62 -0
  25. package/dist/commands/publish-plugin.d.ts.map +1 -0
  26. package/dist/commands/publish-plugin.js +224 -0
  27. package/dist/commands/redrive-events.d.ts +1 -1
  28. package/dist/commands/redrive-events.js +2 -2
  29. package/dist/commands/store-token.d.ts +46 -1
  30. package/dist/commands/store-token.d.ts.map +1 -1
  31. package/dist/commands/store-token.js +127 -102
  32. package/dist/commands/test-plugin.d.ts +72 -0
  33. package/dist/commands/test-plugin.d.ts.map +1 -0
  34. package/dist/commands/test-plugin.js +285 -0
  35. package/dist/commands/upload-plugin.d.ts +6 -7
  36. package/dist/commands/upload-plugin.d.ts.map +1 -1
  37. package/dist/commands/upload-plugin.js +127 -189
  38. package/dist/commands/validate-plugin.d.ts +37 -4
  39. package/dist/commands/validate-plugin.d.ts.map +1 -1
  40. package/dist/commands/validate-plugin.js +129 -144
  41. package/dist/commands/validate-templates.d.ts.map +1 -1
  42. package/dist/commands/validate-templates.js +8 -9
  43. package/dist/config/plugin-catalog-assets.d.ts +13 -0
  44. package/dist/config/plugin-catalog-assets.d.ts.map +1 -0
  45. package/dist/config/plugin-catalog-assets.js +21 -0
  46. package/dist/config.yml +16 -37
  47. package/dist/lambda/token-renew-handler.d.ts.map +1 -1
  48. package/dist/lambda/token-renew-handler.js +109 -154
  49. package/dist/types/config.d.ts +2 -6
  50. package/dist/types/config.d.ts.map +1 -1
  51. package/dist/types/config.js +1 -1
  52. package/dist/types/plugin.d.ts +21 -0
  53. package/dist/types/plugin.d.ts.map +1 -1
  54. package/dist/types/plugin.js +1 -1
  55. package/dist/utils/aws-env.d.ts +1 -2
  56. package/dist/utils/aws-env.d.ts.map +1 -1
  57. package/dist/utils/aws-env.js +2 -3
  58. package/dist/utils/catalog-prompt.d.ts +26 -0
  59. package/dist/utils/catalog-prompt.d.ts.map +1 -0
  60. package/dist/utils/catalog-prompt.js +113 -0
  61. package/dist/utils/command-utils.d.ts.map +1 -1
  62. package/dist/utils/command-utils.js +14 -3
  63. package/dist/utils/config-loader.d.ts.map +1 -1
  64. package/dist/utils/config-loader.js +4 -6
  65. package/dist/utils/credential-store.d.ts +16 -0
  66. package/dist/utils/credential-store.d.ts.map +1 -1
  67. package/dist/utils/credential-store.js +57 -2
  68. package/dist/utils/deploy-runner.d.ts.map +1 -1
  69. package/dist/utils/deploy-runner.js +7 -2
  70. package/dist/utils/pipeline-config.d.ts +1 -2
  71. package/dist/utils/pipeline-config.d.ts.map +1 -1
  72. package/dist/utils/pipeline-config.js +1 -1
  73. package/dist/utils/plugin-docker.d.ts +44 -0
  74. package/dist/utils/plugin-docker.d.ts.map +1 -0
  75. package/dist/utils/plugin-docker.js +71 -0
  76. package/dist/utils/plugin-package.d.ts +40 -0
  77. package/dist/utils/plugin-package.d.ts.map +1 -0
  78. package/dist/utils/plugin-package.js +159 -0
  79. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  80. package/dist/utils/plugin-resolver.js +43 -29
  81. package/dist/utils/plugin-scan.d.ts +22 -0
  82. package/dist/utils/plugin-scan.d.ts.map +1 -0
  83. package/dist/utils/plugin-scan.js +52 -0
  84. package/dist/utils/plugin-zip.d.ts +15 -0
  85. package/dist/utils/plugin-zip.d.ts.map +1 -0
  86. package/dist/utils/plugin-zip.js +96 -0
  87. package/dist/utils/registry.d.ts +15 -0
  88. package/dist/utils/registry.d.ts.map +1 -1
  89. package/dist/utils/registry.js +17 -2
  90. package/dist/utils/service-account.d.ts.map +1 -1
  91. package/dist/utils/service-account.js +9 -10
  92. package/package.json +45 -8
@@ -2,164 +2,149 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import fs from 'fs';
4
4
  import path from 'path';
5
+ import { HEURISTICS_MAX_FILE_BYTES, lintPluginDockerfile, lintPluginSpec, scanPluginSourceHeuristics, } from '@pipeline-builder/api-core';
5
6
  import { Command } from 'commander';
6
- import YAML from 'yaml';
7
+ import pico from 'picocolors';
7
8
  import { printCommandHeader } from '../utils/command-utils.js';
8
9
  import { ERROR_CODES, handleError, ValidationError } from '../utils/error-handler.js';
9
- import { printError, printSuccess, printWarning, fileExists } from '../utils/output-utils.js';
10
- const PLUGIN_TYPES = ['CodeBuildStep', 'ShellStep', 'ManualApprovalStep'];
11
- const COMPUTE_TYPES = ['SMALL', 'MEDIUM', 'LARGE', 'X2_LARGE'];
12
- const FAILURE_BEHAVIORS = ['fail', 'warn', 'ignore'];
13
- const BUILD_TYPES = ['build_image', 'prebuilt', 'metadata_only'];
10
+ import { printError, printSection, printSuccess, printWarning } from '../utils/output-utils.js';
11
+ import { SOURCE_LABELS, detectPackageCatalog, formatCatalogValue, packageProblems, readPluginPackage, } from '../utils/plugin-package.js';
12
+ const { dim, green, red, yellow } = pico;
13
+ /** Fields a version needs before a publish request is accepted (the publish gates). */
14
+ export const PUBLISH_REQUIRED_FIELDS = new Set(['license', 'readme']);
15
+ /** Every regular file under the plugin dir (what the zip would carry), bounded like the server's read. */
16
+ export function readPackageFilesForHeuristics(dir, max = 2_000) {
17
+ const out = [];
18
+ const walk = (d) => {
19
+ for (const entry of fs.readdirSync(d, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
20
+ if (out.length >= max)
21
+ return;
22
+ if (entry.name === '.git' || entry.name === 'node_modules')
23
+ continue;
24
+ const full = path.join(d, entry.name);
25
+ if (entry.isDirectory()) {
26
+ walk(full);
27
+ }
28
+ else if (entry.isFile()) {
29
+ const fd = fs.openSync(full, 'r');
30
+ try {
31
+ const buf = Buffer.alloc(HEURISTICS_MAX_FILE_BYTES + 1);
32
+ const n = fs.readSync(fd, buf, 0, buf.length, 0);
33
+ out.push({ path: path.relative(dir, full).split(path.sep).join('/'), content: buf.subarray(0, n) });
34
+ }
35
+ finally {
36
+ fs.closeSync(fd);
37
+ }
38
+ }
39
+ }
40
+ };
41
+ walk(dir);
42
+ return out;
43
+ }
44
+ /** A heuristic finding as one line of CLI output. */
45
+ export function formatHeuristic(f) {
46
+ return `heuristics: ${f.message} (${f.path}:${f.line}) — ${f.excerpt}`;
47
+ }
48
+ /** Validate a plugin directory: server checks, optional catalog lint, catalog detection. */
49
+ export async function validatePluginDir(dir, opts) {
50
+ const pkg = readPluginPackage(dir);
51
+ const problems = await packageProblems(pkg);
52
+ const lint = [];
53
+ if (opts.lint) {
54
+ const specText = fs.readFileSync(path.join(pkg.dir, pkg.specFile), 'utf-8');
55
+ lint.push(...lintPluginSpec(pkg.rawSpec, specText));
56
+ if (pkg.dockerfileContent !== null)
57
+ lint.push(...lintPluginDockerfile(pkg.dockerfileContent));
58
+ }
59
+ const heuristics = scanPluginSourceHeuristics(readPackageFilesForHeuristics(pkg.dir)).findings;
60
+ return { pkg, problems, lint, fields: detectPackageCatalog(pkg), heuristics };
61
+ }
62
+ /** Invalid detected values (blanked by the server) and publish-required fields left empty. */
63
+ export function catalogIssues(fields) {
64
+ return {
65
+ invalid: fields.filter(f => f.error),
66
+ missingForPublish: fields.filter(f => !f.error && f.value === null && PUBLISH_REQUIRED_FIELDS.has(f.field)),
67
+ };
68
+ }
69
+ /** Print each catalog field with its value (or why it's blank) and where it came from. */
70
+ export function printCatalogReport(fields) {
71
+ printSection('Catalog metadata', 'as the server will detect it (spec → README → Dockerfile label → generated)');
72
+ const width = Math.max(...fields.map(f => f.field.length));
73
+ for (const f of fields) {
74
+ const label = f.field.padEnd(width);
75
+ const source = f.source ? dim(`[${SOURCE_LABELS[f.source] ?? f.source}]`) : '';
76
+ if (f.error) {
77
+ console.log(` ${red('✗')} ${label} ${red(`invalid — ${f.error}`)} ${source}`);
78
+ }
79
+ else if (f.value === null) {
80
+ const required = PUBLISH_REQUIRED_FIELDS.has(f.field);
81
+ console.log(` ${required ? yellow('!') : dim('·')} ${label} ${dim('(empty)')}${required ? yellow(' required to publish') : ''}`);
82
+ }
83
+ else {
84
+ console.log(` ${green('✓')} ${label} ${formatCatalogValue(f.value)} ${source}`);
85
+ }
86
+ }
87
+ console.log('');
88
+ }
14
89
  /**
15
- * Register the `validate-plugin` command — run the same structural + `{{ }}`
16
- * template checks the server's upload path enforces, against a LOCAL plugin
17
- * directory, so authors catch problems before packaging/uploading. Exits
18
- * non-zero on any problem (CI-friendly), mirroring `validate-templates`.
90
+ * Register `plugin validate` — the upload's own checks against a LOCAL plugin
91
+ * directory (the server's Zod spec/config schemas and template contract, shared
92
+ * from api-core), plus a report of every catalog field: its detected value, its
93
+ * source, and whether it would be empty or invalid. `--lint` adds the
94
+ * catalog's Dockerfile rules (test-plugins.sh). Exits non-zero on any problem,
95
+ * any invalid detected catalog value or any lint error (CI-friendly).
19
96
  *
20
97
  * Usage:
21
98
  * pipeline-manager plugin validate --dir ./my-linter
99
+ * pipeline-manager plugin validate --dir ./my-linter --lint --json
22
100
  */
23
101
  export function validatePlugin(program) {
24
102
  program
25
103
  .command('validate')
26
- .description('Validate a local plugin directory (config.yaml + plugin-spec.yaml) before upload')
27
- .requiredOption('--dir <path>', 'Path to the plugin directory')
104
+ .description('Validate a local plugin with the server\'s schemas and report its catalog metadata')
105
+ .option('--dir <path>', 'Path to the plugin directory', '.')
106
+ .option('--lint', 'Also apply the catalog\'s Dockerfile and spec rules (test-plugins.sh)', false)
107
+ .option('--json', 'Print the report as JSON', false)
28
108
  .action(async (options) => {
29
- const executionId = printCommandHeader('Validate Plugin');
109
+ const executionId = printCommandHeader('Validate Plugin', undefined, { quiet: options.json });
30
110
  try {
31
- const dir = path.resolve(options.dir ?? '');
32
- if (!fileExists(dir) || !fs.statSync(dir).isDirectory()) {
33
- throw new ValidationError(`Not a directory: ${dir}`);
34
- }
35
- const problems = [];
36
- // config.yaml (optional build manifest).
37
- const configPath = ['config.yaml', 'config.yml'].map(f => path.join(dir, f)).find(fileExists);
38
- let buildType = 'build_image';
39
- let specFile = 'plugin-spec.yaml';
40
- let dockerfileName = 'Dockerfile';
41
- if (configPath) {
42
- const config = (YAML.parse(fs.readFileSync(configPath, 'utf-8')) ?? {});
43
- if (config.buildType !== undefined) {
44
- if (typeof config.buildType !== 'string' || !BUILD_TYPES.includes(config.buildType)) {
45
- problems.push(`config.yaml: buildType must be one of ${BUILD_TYPES.join(', ')}`);
46
- }
47
- else {
48
- buildType = config.buildType;
49
- }
50
- }
51
- if (typeof config.pluginSpec === 'string')
52
- specFile = config.pluginSpec;
53
- if (typeof config.dockerfile === 'string')
54
- dockerfileName = config.dockerfile;
55
- if ((buildType === 'prebuilt' || buildType === 'metadata_only') && config.dockerfile) {
56
- problems.push(`config.yaml: dockerfile is not allowed when buildType is ${buildType}`);
57
- }
58
- }
59
- // plugin-spec.yaml (required).
60
- const specPath = path.join(dir, specFile);
61
- if (!fileExists(specPath))
62
- throw new ValidationError(`Missing plugin spec: ${specPath}`);
63
- const spec = (YAML.parse(fs.readFileSync(specPath, 'utf-8')) ?? {});
64
- // Required fields.
65
- if (typeof spec.name !== 'string' || !spec.name)
66
- problems.push('plugin-spec.yaml: name is required');
67
- else if (!/^[a-z0-9-]+$/.test(spec.name))
68
- problems.push('plugin-spec.yaml: name must match /^[a-z0-9-]+$/');
69
- if (typeof spec.version !== 'string' || !spec.version)
70
- problems.push('plugin-spec.yaml: version is required');
71
- // Match the server/DB semver check (allows -prerelease and +build metadata).
72
- else if (!/^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/.test(spec.version))
73
- problems.push('plugin-spec.yaml: version must be semver (x.y.z)');
74
- const pluginType = (typeof spec.pluginType === 'string' ? spec.pluginType : 'CodeBuildStep');
75
- if (!PLUGIN_TYPES.includes(pluginType))
76
- problems.push(`plugin-spec.yaml: pluginType must be one of ${PLUGIN_TYPES.join(', ')}`);
77
- if (spec.computeType !== undefined && !COMPUTE_TYPES.includes(String(spec.computeType))) {
78
- problems.push(`plugin-spec.yaml: computeType must be one of ${COMPUTE_TYPES.join(', ')}`);
79
- }
80
- if (spec.failureBehavior !== undefined && !FAILURE_BEHAVIORS.includes(String(spec.failureBehavior))) {
81
- problems.push(`plugin-spec.yaml: failureBehavior must be one of ${FAILURE_BEHAVIORS.join(', ')}`);
82
- }
83
- const isApproval = pluginType === 'ManualApprovalStep';
84
- if (!isApproval && (!Array.isArray(spec.commands) || spec.commands.length === 0)) {
85
- problems.push('plugin-spec.yaml: commands[] is required (except for ManualApprovalStep)');
86
- }
87
- // Build-type prerequisites.
88
- if (buildType === 'build_image' && !isApproval && !fileExists(path.join(dir, dockerfileName))) {
89
- problems.push(`Dockerfile not found for buildType build_image: ${path.join(dir, dockerfileName)}`);
90
- }
91
- if (buildType === 'prebuilt' && !fileExists(path.join(dir, 'image.tar'))) {
92
- problems.push('image.tar not found for buildType prebuilt');
93
- }
94
- // `{{ }}` template validation — same scope roots + templatable fields the
95
- // server enforces at upload (pipeline-core primitives; no server dep).
96
- const core = await import('@pipeline-builder/pipeline-core');
97
- const isTpl = (f) => f === 'description' ||
98
- f.startsWith('commands') ||
99
- f.startsWith('installCommands') ||
100
- f.startsWith('env.') || f.startsWith('env[') ||
101
- f.startsWith('buildArgs.') || f.startsWith('buildArgs[');
102
- const isKnown = core.allowedScopeRoots(['pipeline', 'plugin', 'env']);
103
- const { errors } = core.validateTemplates(spec, isTpl, isKnown);
104
- for (const e of errors)
105
- problems.push(`template [${e.field ?? '?'}]: ${e.message}`);
106
- // Plugin CONTRACT check — mirrors the server's upload validation
107
- // (api/plugin/src/helpers/plugin-spec.ts) so a spec rejected at upload also
108
- // fails here (no false-green). Two independent rules per `{{ pipeline.vars.X }}`
109
- // / `{{ pipeline.metadata.X }}` reference:
110
- // (a) declaration: unless the token has a `| default:`, X must be declared
111
- // in requiredVars / requiredMetadata;
112
- // (b) coercion type: if the token has a `| number|bool|json` filter, the
113
- // declared type in varsTypes/metadataTypes (default 'string') must match.
114
- const requiredVars = new Set(Array.isArray(spec.requiredVars) ? spec.requiredVars.map(String) : []);
115
- const requiredMetadata = new Set(Array.isArray(spec.requiredMetadata) ? spec.requiredMetadata.map(String) : []);
116
- const varsTypes = spec.varsTypes ?? {};
117
- const metadataTypes = spec.metadataTypes ?? {};
118
- const coerceToType = { number: 'number', bool: 'bool', json: 'json' };
119
- const templatableStrings = [
120
- ...(typeof spec.description === 'string' ? [spec.description] : []),
121
- ...(Array.isArray(spec.commands) ? spec.commands.filter((c) => typeof c === 'string') : []),
122
- ...(Array.isArray(spec.installCommands) ? spec.installCommands.filter((c) => typeof c === 'string') : []),
123
- ...Object.values(spec.env ?? {}).filter((v) => typeof v === 'string'),
124
- ...Object.values(spec.buildArgs ?? {}).filter((v) => typeof v === 'string'),
125
- ];
126
- for (const source of templatableStrings) {
127
- let tokens;
128
- try {
129
- tokens = core.tokenize(source);
130
- }
131
- catch {
132
- continue;
133
- }
134
- for (const t of tokens) {
135
- if (t.kind !== 'expr')
136
- continue;
137
- const [root, sub, key] = t.path;
138
- if (root !== 'pipeline' || (sub !== 'vars' && sub !== 'metadata') || !key)
139
- continue;
140
- const isVars = sub === 'vars';
141
- // (a) declaration — waived by a `| default:`.
142
- if (t.defaultValue === undefined) {
143
- const declared = isVars ? requiredVars.has(key) : requiredMetadata.has(key);
144
- if (!declared)
145
- problems.push(`contract: template references {{ pipeline.${sub}.${key} }} but '${key}' is not declared in ${isVars ? 'requiredVars' : 'requiredMetadata'}`);
146
- }
147
- // (b) coercion type — independent of default.
148
- if (t.coerce) {
149
- const declaredType = (isVars ? varsTypes : metadataTypes)[key] ?? 'string';
150
- const expectedType = coerceToType[t.coerce];
151
- if (expectedType && declaredType !== expectedType) {
152
- problems.push(`contract: {{ pipeline.${sub}.${key} | ${t.coerce} }} but declared type is '${declaredType}' (add '${key}: ${expectedType}' to ${isVars ? 'varsTypes' : 'metadataTypes'})`);
153
- }
154
- }
155
- }
111
+ const report = await validatePluginDir(options.dir, { lint: !!options.lint });
112
+ const { invalid, missingForPublish } = catalogIssues(report.fields);
113
+ const lintErrors = report.lint.filter(l => l.level === 'error');
114
+ const highHeuristics = report.heuristics.filter(h => h.severity === 'high');
115
+ const failed = report.problems.length > 0 || invalid.length > 0 || lintErrors.length > 0 || highHeuristics.length > 0;
116
+ if (options.json) {
117
+ console.log(JSON.stringify({
118
+ valid: !failed,
119
+ problems: report.problems,
120
+ lint: report.lint,
121
+ heuristics: report.heuristics,
122
+ catalog: report.fields,
123
+ missingForPublish: missingForPublish.map(f => f.field),
124
+ }, null, 2));
125
+ if (failed)
126
+ process.exit(1);
127
+ return;
156
128
  }
157
- if (problems.length === 0) {
158
- printSuccess(`Plugin '${String(spec.name)}' is valid`, { executionId, buildType, pluginType });
129
+ printCatalogReport(report.fields);
130
+ for (const w of report.lint.filter(l => l.level === 'warning'))
131
+ printWarning(w.message);
132
+ for (const h of report.heuristics.filter(x => x.severity === 'medium'))
133
+ printWarning(formatHeuristic(h));
134
+ if (missingForPublish.length)
135
+ printWarning(`Needed before a publish request: ${missingForPublish.map(f => f.field).join(', ')}`);
136
+ if (!failed) {
137
+ printSuccess(`Plugin '${String(report.pkg.rawSpec.name)}' is valid`, { executionId, buildType: report.pkg.buildType });
159
138
  return;
160
139
  }
161
- printWarning(`Found ${problems.length} problem(s):`);
162
- for (const p of problems)
140
+ const all = [
141
+ ...report.problems,
142
+ ...invalid.map(f => `catalog: ${f.field} would be blank — ${f.error}`),
143
+ ...lintErrors.map(l => l.message),
144
+ ...highHeuristics.map(formatHeuristic),
145
+ ];
146
+ printWarning(`Found ${all.length} problem(s):`);
147
+ for (const p of all)
163
148
  printError(` • ${p}`);
164
149
  process.exit(1);
165
150
  }
@@ -167,9 +152,9 @@ export function validatePlugin(program) {
167
152
  handleError(err, err instanceof ValidationError ? ERROR_CODES.VALIDATION : ERROR_CODES.GENERAL, {
168
153
  debug: program.opts().debug,
169
154
  exit: true,
170
- context: { command: 'validate-plugin', executionId },
155
+ context: { command: 'plugin validate', executionId },
171
156
  });
172
157
  }
173
158
  });
174
159
  }
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3ZhbGlkYXRlLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBTTlGLE1BQU0sWUFBWSxHQUFHLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQzFFLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDL0QsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDckQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBRWpFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxPQUFnQjtJQUM3QyxPQUFPO1NBQ0osT0FBTyxDQUFDLFVBQVUsQ0FBQztTQUNuQixXQUFXLENBQUMsa0ZBQWtGLENBQUM7U0FDL0YsY0FBYyxDQUFDLGNBQWMsRUFBRSw4QkFBOEIsQ0FBQztTQUM5RCxNQUFNLENBQUMsS0FB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Z0JBQzlGLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSztnQkFDM0IsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRTthQUNyRCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IFlBTUwgZnJvbSAneWFtbCc7XG5pbXBvcnQgeyBwcmludENvbW1hbmRIZWFkZXIgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludEVycm9yLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZywgZmlsZUV4aXN0cyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbmludGVyZmFjZSBWYWxpZGF0ZVBsdWdpbk9wdGlvbnMge1xuICBkaXI/OiBzdHJpbmc7XG59XG5cbmNvbnN0IFBMVUdJTl9UWVBFUyA9IFsnQ29kZUJ1aWxkU3RlcCcsICdTaGVsbFN0ZXAnLCAnTWFudWFsQXBwcm92YWxTdGVwJ107XG5jb25zdCBDT01QVVRFX1RZUEVTID0gWydTTUFMTCcsICdNRURJVU0nLCAnTEFSR0UnLCAnWDJfTEFSR0UnXTtcbmNvbnN0IEZBSUxVUkVfQkVIQVZJT1JTID0gWydmYWlsJywgJ3dhcm4nLCAnaWdub3JlJ107XG5jb25zdCBCVUlMRF9UWVBFUyA9IFsnYnVpbGRfaW1hZ2UnLCAncHJlYnVpbHQnLCAnbWV0YWRhdGFfb25seSddO1xuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBgdmFsaWRhdGUtcGx1Z2luYCBjb21tYW5kIOKAlCBydW4gdGhlIHNhbWUgc3RydWN0dXJhbCArIGB7eyB9fWBcbiAqIHRlbXBsYXRlIGNoZWNrcyB0aGUgc2VydmVyJ3MgdXBsb2FkIHBhdGggZW5mb3JjZXMsIGFnYWluc3QgYSBMT0NBTCBwbHVnaW5cbiAqIGRpcmVjdG9yeSwgc28gYXV0aG9ycyBjYXRjaCBwcm9ibGVtcyBiZWZvcmUgcGFja2FnaW5nL3VwbG9hZGluZy4gRXhpdHNcbiAqIG5vbi16ZXJvIG9uIGFueSBwcm9ibGVtIChDSS1mcmllbmRseSksIG1pcnJvcmluZyBgdmFsaWRhdGUtdGVtcGxhdGVzYC5cbiAqXG4gKiBVc2FnZTpcbiAqICAgcGlwZWxpbmUtbWFuYWdlciBwbHVnaW4gdmFsaWRhdGUgLS1kaXIgLi9teS1saW50ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUGx1Z2luKHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKCd2YWxpZGF0ZScpXG4gICAgLmRlc2NyaXB0aW9uKCdWYWxpZGF0ZSBhIGxvY2FsIHBsdWdpbiBkaXJlY3RvcnkgKGNvbmZpZy55YW1sICsgcGx1Z2luLXNwZWMueWFtbCkgYmVmb3JlIHVwbG9hZCcpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctLWRpciA8cGF0aD4nLCAnUGF0aCB0byB0aGUgcGx1Z2luIGRpcmVjdG9yeScpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9uczogVmFsaWRhdGVQbHVnaW5PcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignVmFsaWRhdGUgUGx1Z2luJyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUob3B0aW9ucy5kaXIgPz8gJycpO1xuICAgICAgICBpZiAoIWZpbGVFeGlzdHMoZGlyKSB8fCAhZnMuc3RhdFN5bmMoZGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm90IGEgZGlyZWN0b3J5OiAke2Rpcn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb2JsZW1zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIC8vIGNvbmZpZy55YW1sIChvcHRpb25hbCBidWlsZCBtYW5pZmVzdCkuXG4gICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBbJ2NvbmZpZy55YW1sJywgJ2NvbmZpZy55bWwnXS5tYXAoZiA9PiBwYXRoLmpvaW4oZGlyLCBmKSkuZmluZChmaWxlRXhpc3RzKTtcbiAgICAgICAgbGV0IGJ1aWxkVHlwZSA9ICdidWlsZF9pbWFnZSc7XG4gICAgICAgIGxldCBzcGVjRmlsZSA9ICdwbHVnaW4tc3BlYy55YW1sJztcbiAgICAgICAgbGV0IGRvY2tlcmZpbGVOYW1lID0gJ0RvY2tlcmZpbGUnO1xuICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IChZQU1MLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKSkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChjb25maWcuYnVpbGRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnLmJ1aWxkVHlwZSAhPT0gJ3N0cmluZycgfHwgIUJVSUxEX1RZUEVTLmluY2x1ZGVzKGNvbmZpZy5idWlsZFR5cGUpKSB7XG4gICAgICAgICAgICAgIHByb2JsZW1zLnB1c2goYGNvbmZpZy55YW1sOiBidWlsZFR5cGUgbXVzdCBiZSBvbmUgb2YgJHtCVUlMRF9UWVBFUy5qb2luKCcsICcpfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnVpbGRUeXBlID0gY29uZmlnLmJ1aWxkVHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcucGx1Z2luU3BlYyA9PT0gJ3N0cmluZycpIHNwZWNGaWxlID0gY29uZmlnLnBsdWdpblNwZWM7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcuZG9ja2VyZmlsZSA9PT0gJ3N0cmluZycpIGRvY2tlcmZpbGVOYW1lID0gY29uZmlnLmRvY2tlcmZpbGU7XG4gICAgICAgICAgaWYgKChidWlsZFR5cGUgPT09ICdwcmVidWlsdCcgfHwgYnVpbGRUeXBlID09PSAnbWV0YWRhdGFfb25seScpICYmIGNvbmZpZy5kb2NrZXJmaWxlKSB7XG4gICAgICAgICAgICBwcm9ibGVtcy5wdXNoKGBjb25maWcueWFtbDogZG9ja2VyZmlsZSBpcyBub3QgYWxsb3dlZCB3aGVuIGJ1aWxkVHlwZSBpcyAke2J1aWxkVHlwZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwbHVnaW4tc3BlYy55YW1sIChyZXF1aXJlZCkuXG4gICAgICAgIGNvbnN0IHNwZWNQYXRoID0gcGF0aC5qb2luKGRpciwgc3BlY0ZpbGUpO1xuICAgICAgICBpZiAoIWZpbGVFeGlzdHMoc3BlY1BhdGgpKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBNaXNzaW5nIHBsdWdpbiBzcGVjOiAke3NwZWNQYXRofWApO1xuICAgICAgICBjb25zdCBzcGVjID0gKFlBTUwucGFyc2UoZnMucmVhZEZpbGVTeW5jKHNwZWNQYXRoLCAndXRmLTgnKSkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICAgIC8vIFJlcXVpcmVkIGZpZWxkcy5cbiAgICAgICAgaWYgKHR5cGVvZiBzcGVjLm5hbWUgIT09ICdzdHJpbmcnIHx8ICFzcGVjLm5hbWUpIHByb2JsZW1zLnB1c2goJ3BsdWdpbi1zcGVjLnlhbWw6IG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgZWxzZSBpZiAoIS9eW2EtejAtOS1dKyQvLnRlc3Qoc3BlYy5uYW1lKSkgcHJvYmxlbXMucHVzaCgncGx1Z2luLXNwZWMueWFtbDogbmFtZSBtdXN0IG1hdGNoIC9eW2EtejAtOS1dKyQvJyk7XG4gICAgICAgIGlmICh0eXBlb2Ygc3BlYy52ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCAhc3BlYy52ZXJzaW9uKSBwcm9ibGVtcy5wdXNoKCdwbHVnaW4tc3BlYy55YW1sOiB2ZXJzaW9uIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIC8vIE1hdGNoIHRoZSBzZXJ2ZXIvREIgc2VtdmVyIGNoZWNrIChhbGxvd3MgLXByZXJlbGVhc2UgYW5kICtidWlsZCBtZXRhZGF0YSkuXG4gICAgICAgIGVsc2UgaWYgKCEvXlxcZCtcXC5cXGQrXFwuXFxkKygtW2EtekEtWjAtOS4tXSspPyhcXCtbYS16QS1aMC05Li1dKyk/JC8udGVzdChzcGVjLnZlcnNpb24pKSBwcm9ibGVtcy5wdXNoKCdwbHVnaW4tc3BlYy55YW1sOiB2ZXJzaW9uIG11c3QgYmUgc2VtdmVyICh4LnkueiknKTtcblxuICAgICAgICBjb25zdCBwbHVnaW5UeXBlID0gKHR5cGVvZiBzcGVjLnBsdWdpblR5cGUgPT09ICdzdHJpbmcnID8gc3BlYy5wbHVnaW5UeXBlIDogJ0NvZGVCdWlsZFN0ZXAnKTtcbiAgICAgICAgaWYgKCFQTFVHSU5fVFlQRVMuaW5jbHVkZXMocGx1Z2luVHlwZSkpIHByb2JsZW1zLnB1c2goYHBsdWdpbi1zcGVjLnlhbWw6IHBsdWdpblR5cGUgbXVzdCBiZSBvbmUgb2YgJHtQTFVHSU5fVFlQRVMuam9pbignLCAnKX1gKTtcbiAgICAgICAgaWYgKHNwZWMuY29tcHV0ZVR5cGUgIT09IHVuZGVmaW5lZCAmJiAhQ09NUFVURV9UWVBFUy5pbmNsdWRlcyhTdHJpbmcoc3BlYy5jb21wdXRlVHlwZSkpKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaChgcGx1Z2luLXNwZWMueWFtbDogY29tcHV0ZVR5cGUgbXVzdCBiZSBvbmUgb2YgJHtDT01QVVRFX1RZUEVTLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWMuZmFpbHVyZUJlaGF2aW9yICE9PSB1bmRlZmluZWQgJiYgIUZBSUxVUkVfQkVIQVZJT1JTLmluY2x1ZGVzKFN0cmluZyhzcGVjLmZhaWx1cmVCZWhhdmlvcikpKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaChgcGx1Z2luLXNwZWMueWFtbDogZmFpbHVyZUJlaGF2aW9yIG11c3QgYmUgb25lIG9mICR7RkFJTFVSRV9CRUhBVklPUlMuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQXBwcm92YWwgPSBwbHVnaW5UeXBlID09PSAnTWFudWFsQXBwcm92YWxTdGVwJztcbiAgICAgICAgaWYgKCFpc0FwcHJvdmFsICYmICghQXJyYXkuaXNBcnJheShzcGVjLmNvbW1hbmRzKSB8fCBzcGVjLmNvbW1hbmRzLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdwbHVnaW4tc3BlYy55YW1sOiBjb21tYW5kc1tdIGlzIHJlcXVpcmVkIChleGNlcHQgZm9yIE1hbnVhbEFwcHJvdmFsU3RlcCknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkLXR5cGUgcHJlcmVxdWlzaXRlcy5cbiAgICAgICAgaWYgKGJ1aWxkVHlwZSA9PT0gJ2J1aWxkX2ltYWdlJyAmJiAhaXNBcHByb3ZhbCAmJiAhZmlsZUV4aXN0cyhwYXRoLmpvaW4oZGlyLCBkb2NrZXJmaWxlTmFtZSkpKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaChgRG9ja2VyZmlsZSBub3QgZm91bmQgZm9yIGJ1aWxkVHlwZSBidWlsZF9pbWFnZTogJHtwYXRoLmpvaW4oZGlyLCBkb2NrZXJmaWxlTmFtZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1aWxkVHlwZSA9PT0gJ3ByZWJ1aWx0JyAmJiAhZmlsZUV4aXN0cyhwYXRoLmpvaW4oZGlyLCAnaW1hZ2UudGFyJykpKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnaW1hZ2UudGFyIG5vdCBmb3VuZCBmb3IgYnVpbGRUeXBlIHByZWJ1aWx0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBge3sgfX1gIHRlbXBsYXRlIHZhbGlkYXRpb24g4oCUIHNhbWUgc2NvcGUgcm9vdHMgKyB0ZW1wbGF0YWJsZSBmaWVsZHMgdGhlXG4gICAgICAgIC8vIHNlcnZlciBlbmZvcmNlcyBhdCB1cGxvYWQgKHBpcGVsaW5lLWNvcmUgcHJpbWl0aXZlczsgbm8gc2VydmVyIGRlcCkuXG4gICAgICAgIGNvbnN0IGNvcmUgPSBhd2FpdCBpbXBvcnQoJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnKTtcbiAgICAgICAgY29uc3QgaXNUcGwgPSAoZjogc3RyaW5nKSA9PlxuICAgICAgICAgIGYgPT09ICdkZXNjcmlwdGlvbicgfHxcbiAgICAgICAgICBmLnN0YXJ0c1dpdGgoJ2NvbW1hbmRzJykgfHxcbiAgICAgICAgICBmLnN0YXJ0c1dpdGgoJ2luc3RhbGxDb21tYW5kcycpIHx8XG4gICAgICAgICAgZi5zdGFydHNXaXRoKCdlbnYuJykgfHwgZi5zdGFydHNXaXRoKCdlbnZbJykgfHxcbiAgICAgICAgICBmLnN0YXJ0c1dpdGgoJ2J1aWxkQXJncy4nKSB8fCBmLnN0YXJ0c1dpdGgoJ2J1aWxkQXJnc1snKTtcbiAgICAgICAgY29uc3QgaXNLbm93biA9IGNvcmUuYWxsb3dlZFNjb3BlUm9vdHMoWydwaXBlbGluZScsICdwbHVnaW4nLCAnZW52J10pO1xuICAgICAgICBjb25zdCB7IGVycm9ycyB9ID0gY29yZS52YWxpZGF0ZVRlbXBsYXRlcyhzcGVjLCBpc1RwbCwgaXNLbm93bik7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBlcnJvcnMpIHByb2JsZW1zLnB1c2goYHRlbXBsYXRlIFske2UuZmllbGQgPz8gJz8nfV06ICR7ZS5tZXNzYWdlfWApO1xuXG4gICAgICAgIC8vIFBsdWdpbiBDT05UUkFDVCBjaGVjayDigJQgbWlycm9ycyB0aGUgc2VydmVyJ3MgdXBsb2FkIHZhbGlkYXRpb25cbiAgICAgICAgLy8gKGFwaS9wbHVnaW4vc3JjL2hlbHBlcnMvcGx1Z2luLXNwZWMudHMpIHNvIGEgc3BlYyByZWplY3RlZCBhdCB1cGxvYWQgYWxzb1xuICAgICAgICAvLyBmYWlscyBoZXJlIChubyBmYWxzZS1ncmVlbikuIFR3byBpbmRlcGVuZGVudCBydWxlcyBwZXIgYHt7IHBpcGVsaW5lLnZhcnMuWCB9fWBcbiAgICAgICAgLy8gLyBge3sgcGlwZWxpbmUubWV0YWRhdGEuWCB9fWAgcmVmZXJlbmNlOlxuICAgICAgICAvLyAgIChhKSBkZWNsYXJhdGlvbjogdW5sZXNzIHRoZSB0b2tlbiBoYXMgYSBgfCBkZWZhdWx0OmAsIFggbXVzdCBiZSBkZWNsYXJlZFxuICAgICAgICAvLyAgICAgICBpbiByZXF1aXJlZFZhcnMgLyByZXF1aXJlZE1ldGFkYXRhO1xuICAgICAgICAvLyAgIChiKSBjb2VyY2lvbiB0eXBlOiBpZiB0aGUgdG9rZW4gaGFzIGEgYHwgbnVtYmVyfGJvb2x8anNvbmAgZmlsdGVyLCB0aGVcbiAgICAgICAgLy8gICAgICAgZGVjbGFyZWQgdHlwZSBpbiB2YXJzVHlwZXMvbWV0YWRhdGFUeXBlcyAoZGVmYXVsdCAnc3RyaW5nJykgbXVzdCBtYXRjaC5cbiAgICAgICAgY29uc3QgcmVxdWlyZWRWYXJzID0gbmV3IFNldChBcnJheS5pc0FycmF5KHNwZWMucmVxdWlyZWRWYXJzKSA/IChzcGVjLnJlcXVpcmVkVmFycyBhcyB1bmtub3duW10pLm1hcChTdHJpbmcpIDogW10pO1xuICAgICAgICBjb25zdCByZXF1aXJlZE1ldGFkYXRhID0gbmV3IFNldChBcnJheS5pc0FycmF5KHNwZWMucmVxdWlyZWRNZXRhZGF0YSkgPyAoc3BlYy5yZXF1aXJlZE1ldGFkYXRhIGFzIHVua25vd25bXSkubWFwKFN0cmluZykgOiBbXSk7XG4gICAgICAgIGNvbnN0IHZhcnNUeXBlcyA9IChzcGVjLnZhcnNUeXBlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA/PyB7fTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFUeXBlcyA9IChzcGVjLm1ldGFkYXRhVHlwZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPz8ge307XG4gICAgICAgIGNvbnN0IGNvZXJjZVRvVHlwZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgbnVtYmVyOiAnbnVtYmVyJywgYm9vbDogJ2Jvb2wnLCBqc29uOiAnanNvbicgfTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGFibGVTdHJpbmdzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAuLi4odHlwZW9mIHNwZWMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnID8gW3NwZWMuZGVzY3JpcHRpb25dIDogW10pLFxuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KHNwZWMuY29tbWFuZHMpID8gc3BlYy5jb21tYW5kcy5maWx0ZXIoKGMpOiBjIGlzIHN0cmluZyA9PiB0eXBlb2YgYyA9PT0gJ3N0cmluZycpIDogW10pLFxuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KHNwZWMuaW5zdGFsbENvbW1hbmRzKSA/IHNwZWMuaW5zdGFsbENvbW1hbmRzLmZpbHRlcigoYyk6IGMgaXMgc3RyaW5nID0+IHR5cGVvZiBjID09PSAnc3RyaW5nJykgOiBbXSksXG4gICAgICAgICAgLi4uT2JqZWN0LnZhbHVlcygoc3BlYy5lbnYgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID8/IHt9KS5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycpLFxuICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoKHNwZWMuYnVpbGRBcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA/PyB7fSkuZmlsdGVyKCh2KTogdiBpcyBzdHJpbmcgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnKSxcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgdGVtcGxhdGFibGVTdHJpbmdzKSB7XG4gICAgICAgICAgbGV0IHRva2VucztcbiAgICAgICAgICB0cnkgeyB0b2tlbnMgPSBjb3JlLnRva2VuaXplKHNvdXJjZSk7IH0gY2F0Y2ggeyBjb250aW51ZTsgfVxuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICh0LmtpbmQgIT09ICdleHByJykgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBbcm9vdCwgc3ViLCBrZXldID0gdC5wYXRoO1xuICAgICAgICAgICAgaWYgKHJvb3QgIT09ICdwaXBlbGluZScgfHwgKHN1YiAhPT0gJ3ZhcnMnICYmIHN1YiAhPT0gJ21ldGFkYXRhJykgfHwgIWtleSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBpc1ZhcnMgPSBzdWIgPT09ICd2YXJzJztcbiAgICAgICAgICAgIC8vIChhKSBkZWNsYXJhdGlvbiDigJQgd2FpdmVkIGJ5IGEgYHwgZGVmYXVsdDpgLlxuICAgICAgICAgICAgaWYgKHQuZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGVjbGFyZWQgPSBpc1ZhcnMgPyByZXF1aXJlZFZhcnMuaGFzKGtleSkgOiByZXF1aXJlZE1ldGFkYXRhLmhhcyhrZXkpO1xuICAgICAgICAgICAgICBpZiAoIWRlY2xhcmVkKSBwcm9ibGVtcy5wdXNoKGBjb250cmFjdDogdGVtcGxhdGUgcmVmZXJlbmNlcyB7eyBwaXBlbGluZS4ke3N1Yn0uJHtrZXl9IH19IGJ1dCAnJHtrZXl9JyBpcyBub3QgZGVjbGFyZWQgaW4gJHtpc1ZhcnMgPyAncmVxdWlyZWRWYXJzJyA6ICdyZXF1aXJlZE1ldGFkYXRhJ31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIChiKSBjb2VyY2lvbiB0eXBlIOKAlCBpbmRlcGVuZGVudCBvZiBkZWZhdWx0LlxuICAgICAgICAgICAgaWYgKHQuY29lcmNlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRlY2xhcmVkVHlwZSA9IChpc1ZhcnMgPyB2YXJzVHlwZXMgOiBtZXRhZGF0YVR5cGVzKVtrZXldID8/ICdzdHJpbmcnO1xuICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZFR5cGUgPSBjb2VyY2VUb1R5cGVbdC5jb2VyY2VdO1xuICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRUeXBlICYmIGRlY2xhcmVkVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgcHJvYmxlbXMucHVzaChgY29udHJhY3Q6IHt7IHBpcGVsaW5lLiR7c3VifS4ke2tleX0gfCAke3QuY29lcmNlfSB9fSBidXQgZGVjbGFyZWQgdHlwZSBpcyAnJHtkZWNsYXJlZFR5cGV9JyAoYWRkICcke2tleX06ICR7ZXhwZWN0ZWRUeXBlfScgdG8gJHtpc1ZhcnMgPyAndmFyc1R5cGVzJyA6ICdtZXRhZGF0YVR5cGVzJ30pYCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvYmxlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcHJpbnRTdWNjZXNzKGBQbHVnaW4gJyR7U3RyaW5nKHNwZWMubmFtZSl9JyBpcyB2YWxpZGAsIHsgZXhlY3V0aW9uSWQsIGJ1aWxkVHlwZSwgcGx1Z2luVHlwZSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwcmludFdhcm5pbmcoYEZvdW5kICR7cHJvYmxlbXMubGVuZ3RofSBwcm9ibGVtKHMpOmApO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJvYmxlbXMpIHByaW50RXJyb3IoYCAg4oCiICR7cH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgZXJyIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yID8gRVJST1JfQ09ERVMuVkFMSURBVElPTiA6IEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICd2YWxpZGF0ZS1wbHVnaW4nLCBleGVjdXRpb25JZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3ZhbGlkYXRlLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUNMLHlCQUF5QixFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSwwQkFBMEIsR0FFNUYsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sSUFBSSxNQUFNLFlBQVksQ0FBQztBQUM5QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RixPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEcsT0FBTyxFQUNMLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEdBQzVGLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztBQUV6Qyx1RkFBdUY7QUFDdkYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQW9DLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFjdkcsMEdBQTBHO0FBQzFHLE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxHQUFXLEVBQUUsR0FBRyxHQUFHLEtBQUs7SUFDcEUsTUFBTSxHQUFHLEdBQTBCLEVB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LENBQUMsT0FBTyxFQUFFO2dCQUM5RixLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUU7YUFDckQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBIRVVSSVNUSUNTX01BWF9GSUxFX0JZVEVTLCBsaW50UGx1Z2luRG9ja2VyZmlsZSwgbGludFBsdWdpblNwZWMsIHNjYW5QbHVnaW5Tb3VyY2VIZXVyaXN0aWNzLFxuICB0eXBlIERldGVjdGVkRmllbGQsIHR5cGUgSGV1cmlzdGljRmluZGluZywgdHlwZSBIZXVyaXN0aWNzSW5wdXRGaWxlLCB0eXBlIFBsdWdpbkNhdGFsb2dGaWVsZCwgdHlwZSBQbHVnaW5MaW50RmluZGluZyxcbn0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IHByaW50Q29tbWFuZEhlYWRlciB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50RXJyb3IsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHtcbiAgU09VUkNFX0xBQkVMUywgZGV0ZWN0UGFja2FnZUNhdGFsb2csIGZvcm1hdENhdGFsb2dWYWx1ZSwgcGFja2FnZVByb2JsZW1zLCByZWFkUGx1Z2luUGFja2FnZSwgdHlwZSBQbHVnaW5QYWNrYWdlLFxufSBmcm9tICcuLi91dGlscy9wbHVnaW4tcGFja2FnZS5qcyc7XG5cbmNvbnN0IHsgZGltLCBncmVlbiwgcmVkLCB5ZWxsb3cgfSA9IHBpY287XG5cbi8qKiBGaWVsZHMgYSB2ZXJzaW9uIG5lZWRzIGJlZm9yZSBhIHB1Ymxpc2ggcmVxdWVzdCBpcyBhY2NlcHRlZCAodGhlIHB1Ymxpc2ggZ2F0ZXMpLiAqL1xuZXhwb3J0IGNvbnN0IFBVQkxJU0hfUkVRVUlSRURfRklFTERTOiBSZWFkb25seVNldDxQbHVnaW5DYXRhbG9nRmllbGQ+ID0gbmV3IFNldChbJ2xpY2Vuc2UnLCAncmVhZG1lJ10pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXBvcnQge1xuICBwa2c6IFBsdWdpblBhY2thZ2U7XG4gIC8qKiBXaGF0IHRoZSB1cGxvYWQgd291bGQgcmVmdXNlLiAqL1xuICBwcm9ibGVtczogc3RyaW5nW107XG4gIC8qKiB0ZXN0LXBsdWdpbnMuc2gtZXF1aXZhbGVudCBmaW5kaW5ncyAob25seSB3aGVuIGxpbnRlZCkuICovXG4gIGxpbnQ6IFBsdWdpbkxpbnRGaW5kaW5nW107XG4gIC8qKiBUaGUgY2F0YWxvZyBmaWVsZHMgYXMgdGhlIHNlcnZlciB3aWxsIGRldGVjdCB0aGVtLiAqL1xuICBmaWVsZHM6IERldGVjdGVkRmllbGRbXTtcbiAgLyoqIFRoZSBtYWx3YXJlIGhldXJpc3RpY3MgdGhlIGFub255bW91cy1zdWJtaXNzaW9uIGdhdGUgcnVuczogYGhpZ2hgIGZhaWxzLCBgbWVkaXVtYCB3YXJucy4gKi9cbiAgaGV1cmlzdGljczogSGV1cmlzdGljRmluZGluZ1tdO1xufVxuXG4vKiogRXZlcnkgcmVndWxhciBmaWxlIHVuZGVyIHRoZSBwbHVnaW4gZGlyICh3aGF0IHRoZSB6aXAgd291bGQgY2FycnkpLCBib3VuZGVkIGxpa2UgdGhlIHNlcnZlcidzIHJlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFBhY2thZ2VGaWxlc0ZvckhldXJpc3RpY3MoZGlyOiBzdHJpbmcsIG1heCA9IDJfMDAwKTogSGV1cmlzdGljc0lucHV0RmlsZVtdIHtcbiAgY29uc3Qgb3V0OiBIZXVyaXN0aWNzSW5wdXRGaWxlW10gPSBbXTtcbiAgY29uc3Qgd2FsayA9IChkOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKGQsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKSkge1xuICAgICAgaWYgKG91dC5sZW5ndGggPj0gbWF4KSByZXR1cm47XG4gICAgICBpZiAoZW50cnkubmFtZSA9PT0gJy5naXQnIHx8IGVudHJ5Lm5hbWUgPT09ICdub2RlX21vZHVsZXMnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGwgPSBwYXRoLmpvaW4oZCwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge3dhbGsoZnVsbCk7fSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSkge1xuICAgICAgICBjb25zdCBmZCA9IGZzLm9wZW5TeW5jKGZ1bGwsICdyJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKEhFVVJJU1RJQ1NfTUFYX0ZJTEVfQllURVMgKyAxKTtcbiAgICAgICAgICBjb25zdCBuID0gZnMucmVhZFN5bmMoZmQsIGJ1ZiwgMCwgYnVmLmxlbmd0aCwgMCk7XG4gICAgICAgICAgb3V0LnB1c2goeyBwYXRoOiBwYXRoLnJlbGF0aXZlKGRpciwgZnVsbCkuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKSwgY29udGVudDogYnVmLnN1YmFycmF5KDAsIG4pIH0pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGZzLmNsb3NlU3luYyhmZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHdhbGsoZGlyKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIEEgaGV1cmlzdGljIGZpbmRpbmcgYXMgb25lIGxpbmUgb2YgQ0xJIG91dHB1dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRIZXVyaXN0aWMoZjogSGV1cmlzdGljRmluZGluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaGV1cmlzdGljczogJHtmLm1lc3NhZ2V9ICgke2YucGF0aH06JHtmLmxpbmV9KSDigJQgJHtmLmV4Y2VycHR9YDtcbn1cblxuLyoqIFZhbGlkYXRlIGEgcGx1Z2luIGRpcmVjdG9yeTogc2VydmVyIGNoZWNrcywgb3B0aW9uYWwgY2F0YWxvZyBsaW50LCBjYXRhbG9nIGRldGVjdGlvbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVBsdWdpbkRpcihkaXI6IHN0cmluZywgb3B0czogeyBsaW50OiBib29sZWFuIH0pOiBQcm9taXNlPFZhbGlkYXRpb25SZXBvcnQ+IHtcbiAgY29uc3QgcGtnID0gcmVhZFBsdWdpblBhY2thZ2UoZGlyKTtcbiAgY29uc3QgcHJvYmxlbXMgPSBhd2FpdCBwYWNrYWdlUHJvYmxlbXMocGtnKTtcbiAgY29uc3QgbGludDogUGx1Z2luTGludEZpbmRpbmdbXSA9IFtdO1xuICBpZiAob3B0cy5saW50KSB7XG4gICAgY29uc3Qgc3BlY1RleHQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBrZy5kaXIsIHBrZy5zcGVjRmlsZSksICd1dGYtOCcpO1xuICAgIGxpbnQucHVzaCguLi5saW50UGx1Z2luU3BlYyhwa2cucmF3U3BlYywgc3BlY1RleHQpKTtcbiAgICBpZiAocGtnLmRvY2tlcmZpbGVDb250ZW50ICE9PSBudWxsKSBsaW50LnB1c2goLi4ubGludFBsdWdpbkRvY2tlcmZpbGUocGtnLmRvY2tlcmZpbGVDb250ZW50KSk7XG4gIH1cbiAgY29uc3QgaGV1cmlzdGljcyA9IHNjYW5QbHVnaW5Tb3VyY2VIZXVyaXN0aWNzKHJlYWRQYWNrYWdlRmlsZXNGb3JIZXVyaXN0aWNzKHBrZy5kaXIpKS5maW5kaW5ncztcbiAgcmV0dXJuIHsgcGtnLCBwcm9ibGVtcywgbGludCwgZmllbGRzOiBkZXRlY3RQYWNrYWdlQ2F0YWxvZyhwa2cpLCBoZXVyaXN0aWNzIH07XG59XG5cbi8qKiBJbnZhbGlkIGRldGVjdGVkIHZhbHVlcyAoYmxhbmtlZCBieSB0aGUgc2VydmVyKSBhbmQgcHVibGlzaC1yZXF1aXJlZCBmaWVsZHMgbGVmdCBlbXB0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRhbG9nSXNzdWVzKGZpZWxkczogRGV0ZWN0ZWRGaWVsZFtdKTogeyBpbnZhbGlkOiBEZXRlY3RlZEZpZWxkW107IG1pc3NpbmdGb3JQdWJsaXNoOiBEZXRlY3RlZEZpZWxkW10gfSB7XG4gIHJldHVybiB7XG4gICAgaW52YWxpZDogZmllbGRzLmZpbHRlcihmID0+IGYuZXJyb3IpLFxuICAgIG1pc3NpbmdGb3JQdWJsaXNoOiBmaWVsZHMuZmlsdGVyKGYgPT4gIWYuZXJyb3IgJiYgZi52YWx1ZSA9PT0gbnVsbCAmJiBQVUJMSVNIX1JFUVVJUkVEX0ZJRUxEUy5oYXMoZi5maWVsZCkpLFxuICB9O1xufVxuXG4vKiogUHJpbnQgZWFjaCBjYXRhbG9nIGZpZWxkIHdpdGggaXRzIHZhbHVlIChvciB3aHkgaXQncyBibGFuaykgYW5kIHdoZXJlIGl0IGNhbWUgZnJvbS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludENhdGFsb2dSZXBvcnQoZmllbGRzOiBEZXRlY3RlZEZpZWxkW10pOiB2b2lkIHtcbiAgcHJpbnRTZWN0aW9uKCdDYXRhbG9nIG1ldGFkYXRhJywgJ2FzIHRoZSBzZXJ2ZXIgd2lsbCBkZXRlY3QgaXQgKHNwZWMg4oaSIFJFQURNRSDihpIgRG9ja2VyZmlsZSBsYWJlbCDihpIgZ2VuZXJhdGVkKScpO1xuICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KC4uLmZpZWxkcy5tYXAoZiA9PiBmLmZpZWxkLmxlbmd0aCkpO1xuICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzKSB7XG4gICAgY29uc3QgbGFiZWwgPSBmLmZpZWxkLnBhZEVuZCh3aWR0aCk7XG4gICAgY29uc3Qgc291cmNlID0gZi5zb3VyY2UgPyBkaW0oYFske1NPVVJDRV9MQUJFTFNbZi5zb3VyY2VdID8/IGYuc291cmNlfV1gKSA6ICcnO1xuICAgIGlmIChmLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke3JlZCgn4pyXJyl9ICR7bGFiZWx9ICAke3JlZChgaW52YWxpZCDigJQgJHtmLmVycm9yfWApfSAke3NvdXJjZX1gKTtcbiAgICB9IGVsc2UgaWYgKGYudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gUFVCTElTSF9SRVFVSVJFRF9GSUVMRFMuaGFzKGYuZmllbGQpO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtyZXF1aXJlZCA/IHllbGxvdygnIScpIDogZGltKCfCtycpfSAke2xhYmVsfSAgJHtkaW0oJyhlbXB0eSknKX0ke3JlcXVpcmVkID8geWVsbG93KCcgIHJlcXVpcmVkIHRvIHB1Ymxpc2gnKSA6ICcnfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVuKCfinJMnKX0gJHtsYWJlbH0gICR7Zm9ybWF0Q2F0YWxvZ1ZhbHVlKGYudmFsdWUpfSAke3NvdXJjZX1gKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5sb2coJycpO1xufVxuXG5pbnRlcmZhY2UgVmFsaWRhdGVQbHVnaW5PcHRpb25zIHtcbiAgZGlyOiBzdHJpbmc7XG4gIGxpbnQ/OiBib29sZWFuO1xuICBqc29uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBgcGx1Z2luIHZhbGlkYXRlYCDigJQgdGhlIHVwbG9hZCdzIG93biBjaGVja3MgYWdhaW5zdCBhIExPQ0FMIHBsdWdpblxuICogZGlyZWN0b3J5ICh0aGUgc2VydmVyJ3MgWm9kIHNwZWMvY29uZmlnIHNjaGVtYXMgYW5kIHRlbXBsYXRlIGNvbnRyYWN0LCBzaGFyZWRcbiAqIGZyb20gYXBpLWNvcmUpLCBwbHVzIGEgcmVwb3J0IG9mIGV2ZXJ5IGNhdGFsb2cgZmllbGQ6IGl0cyBkZXRlY3RlZCB2YWx1ZSwgaXRzXG4gKiBzb3VyY2UsIGFuZCB3aGV0aGVyIGl0IHdvdWxkIGJlIGVtcHR5IG9yIGludmFsaWQuIGAtLWxpbnRgIGFkZHMgdGhlXG4gKiBjYXRhbG9nJ3MgRG9ja2VyZmlsZSBydWxlcyAodGVzdC1wbHVnaW5zLnNoKS4gRXhpdHMgbm9uLXplcm8gb24gYW55IHByb2JsZW0sXG4gKiBhbnkgaW52YWxpZCBkZXRlY3RlZCBjYXRhbG9nIHZhbHVlIG9yIGFueSBsaW50IGVycm9yIChDSS1mcmllbmRseSkuXG4gKlxuICogVXNhZ2U6XG4gKiAgIHBpcGVsaW5lLW1hbmFnZXIgcGx1Z2luIHZhbGlkYXRlIC0tZGlyIC4vbXktbGludGVyXG4gKiAgIHBpcGVsaW5lLW1hbmFnZXIgcGx1Z2luIHZhbGlkYXRlIC0tZGlyIC4vbXktbGludGVyIC0tbGludCAtLWpzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUGx1Z2luKHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKCd2YWxpZGF0ZScpXG4gICAgLmRlc2NyaXB0aW9uKCdWYWxpZGF0ZSBhIGxvY2FsIHBsdWdpbiB3aXRoIHRoZSBzZXJ2ZXJcXCdzIHNjaGVtYXMgYW5kIHJlcG9ydCBpdHMgY2F0YWxvZyBtZXRhZGF0YScpXG4gICAgLm9wdGlvbignLS1kaXIgPHBhdGg+JywgJ1BhdGggdG8gdGhlIHBsdWdpbiBkaXJlY3RvcnknLCAnLicpXG4gICAgLm9wdGlvbignLS1saW50JywgJ0Fsc28gYXBwbHkgdGhlIGNhdGFsb2dcXCdzIERvY2tlcmZpbGUgYW5kIHNwZWMgcnVsZXMgKHRlc3QtcGx1Z2lucy5zaCknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLWpzb24nLCAnUHJpbnQgdGhlIHJlcG9ydCBhcyBKU09OJywgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9uczogVmFsaWRhdGVQbHVnaW5PcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignVmFsaWRhdGUgUGx1Z2luJywgdW5kZWZpbmVkLCB7IHF1aWV0OiBvcHRpb25zLmpzb24gfSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZVBsdWdpbkRpcihvcHRpb25zLmRpciwgeyBsaW50OiAhIW9wdGlvbnMubGludCB9KTtcbiAgICAgICAgY29uc3QgeyBpbnZhbGlkLCBtaXNzaW5nRm9yUHVibGlzaCB9ID0gY2F0YWxvZ0lzc3VlcyhyZXBvcnQuZmllbGRzKTtcbiAgICAgICAgY29uc3QgbGludEVycm9ycyA9IHJlcG9ydC5saW50LmZpbHRlcihsID0+IGwubGV2ZWwgPT09ICdlcnJvcicpO1xuICAgICAgICBjb25zdCBoaWdoSGV1cmlzdGljcyA9IHJlcG9ydC5oZXVyaXN0aWNzLmZpbHRlcihoID0+IGguc2V2ZXJpdHkgPT09ICdoaWdoJyk7XG4gICAgICAgIGNvbnN0IGZhaWxlZCA9IHJlcG9ydC5wcm9ibGVtcy5sZW5ndGggPiAwIHx8IGludmFsaWQubGVuZ3RoID4gMCB8fCBsaW50RXJyb3JzLmxlbmd0aCA+IDAgfHwgaGlnaEhldXJpc3RpY3MubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgdmFsaWQ6ICFmYWlsZWQsXG4gICAgICAgICAgICBwcm9ibGVtczogcmVwb3J0LnByb2JsZW1zLFxuICAgICAgICAgICAgbGludDogcmVwb3J0LmxpbnQsXG4gICAgICAgICAgICBoZXVyaXN0aWNzOiByZXBvcnQuaGV1cmlzdGljcyxcbiAgICAgICAgICAgIGNhdGFsb2c6IHJlcG9ydC5maWVsZHMsXG4gICAgICAgICAgICBtaXNzaW5nRm9yUHVibGlzaDogbWlzc2luZ0ZvclB1Ymxpc2gubWFwKGYgPT4gZi5maWVsZCksXG4gICAgICAgICAgfSwgbnVsbCwgMikpO1xuICAgICAgICAgIGlmIChmYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwcmludENhdGFsb2dSZXBvcnQocmVwb3J0LmZpZWxkcyk7XG4gICAgICAgIGZvciAoY29uc3QgdyBvZiByZXBvcnQubGludC5maWx0ZXIobCA9PiBsLmxldmVsID09PSAnd2FybmluZycpKSBwcmludFdhcm5pbmcody5tZXNzYWdlKTtcbiAgICAgICAgZm9yIChjb25zdCBoIG9mIHJlcG9ydC5oZXVyaXN0aWNzLmZpbHRlcih4ID0+IHguc2V2ZXJpdHkgPT09ICdtZWRpdW0nKSkgcHJpbnRXYXJuaW5nKGZvcm1hdEhldXJpc3RpYyhoKSk7XG4gICAgICAgIGlmIChtaXNzaW5nRm9yUHVibGlzaC5sZW5ndGgpIHByaW50V2FybmluZyhgTmVlZGVkIGJlZm9yZSBhIHB1Ymxpc2ggcmVxdWVzdDogJHttaXNzaW5nRm9yUHVibGlzaC5tYXAoZiA9PiBmLmZpZWxkKS5qb2luKCcsICcpfWApO1xuICAgICAgICBpZiAoIWZhaWxlZCkge1xuICAgICAgICAgIHByaW50U3VjY2VzcyhgUGx1Z2luICcke1N0cmluZyhyZXBvcnQucGtnLnJhd1NwZWMubmFtZSl9JyBpcyB2YWxpZGAsIHsgZXhlY3V0aW9uSWQsIGJ1aWxkVHlwZTogcmVwb3J0LnBrZy5idWlsZFR5cGUgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbCA9IFtcbiAgICAgICAgICAuLi5yZXBvcnQucHJvYmxlbXMsXG4gICAgICAgICAgLi4uaW52YWxpZC5tYXAoZiA9PiBgY2F0YWxvZzogJHtmLmZpZWxkfSB3b3VsZCBiZSBibGFuayDigJQgJHtmLmVycm9yfWApLFxuICAgICAgICAgIC4uLmxpbnRFcnJvcnMubWFwKGwgPT4gbC5tZXNzYWdlKSxcbiAgICAgICAgICAuLi5oaWdoSGV1cmlzdGljcy5tYXAoZm9ybWF0SGV1cmlzdGljKSxcbiAgICAgICAgXTtcbiAgICAgICAgcHJpbnRXYXJuaW5nKGBGb3VuZCAke2FsbC5sZW5ndGh9IHByb2JsZW0ocyk6YCk7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBhbGwpIHByaW50RXJyb3IoYCAg4oCiICR7cH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgZXJyIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yID8gRVJST1JfQ09ERVMuVkFMSURBVElPTiA6IEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICdwbHVnaW4gdmFsaWRhdGUnLCBleGVjdXRpb25JZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"validate-templates.d.ts","sourceRoot":"","sources":["../../src/commands/validate-templates.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkF/D"}
1
+ {"version":3,"file":"validate-templates.d.ts","sourceRoot":"","sources":["../../src/commands/validate-templates.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkF/D"}
@@ -2,6 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import fs from 'fs';
4
4
  import path from 'path';
5
+ import { checkPluginTemplates } from '@pipeline-builder/api-core';
5
6
  import { Command } from 'commander';
6
7
  import YAML from 'yaml';
7
8
  import { printCommandHeader, printSslWarning, createAuthenticatedClientAsync, withSslOptions } from '../utils/command-utils.js';
@@ -94,15 +95,13 @@ export function validateTemplatesCommand(program) {
94
95
  }
95
96
  });
96
97
  }
98
+ /** The plugin template contract the upload applies (api-core's shared check). */
97
99
  function validatePluginDoc(core, doc) {
98
- const isTpl = (f) => f === 'description' ||
99
- f.startsWith('commands') ||
100
- f.startsWith('installCommands') ||
101
- f.startsWith('env.') || f.startsWith('env[') ||
102
- f.startsWith('buildArgs.') || f.startsWith('buildArgs[');
103
- const isKnown = core.allowedScopeRoots(['pipeline', 'plugin', 'env']);
104
- const { errors } = core.validateTemplates(doc, isTpl, isKnown);
105
- return errors;
100
+ return checkPluginTemplates(doc, core).map((issue) => ({
101
+ field: issue.line !== undefined ? `${issue.field}:${issue.line}:${issue.col}` : issue.field,
102
+ message: issue.message,
103
+ code: issue.kind,
104
+ }));
106
105
  }
107
106
  function validatePipelineDoc(core, doc) {
108
107
  const isTpl = (f) => f === 'projectName' ||
@@ -113,4 +112,4 @@ function validatePipelineDoc(core, doc) {
113
112
  const cycles = core.detectCycles(doc, isTpl, (f) => isTpl(f) ? f : null);
114
113
  return [...errors, ...cycles];
115
114
  }
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtdGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3ZhbGlkYXRlLXRlbXBsYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSw4QkFBOEIsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoSSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQVM3Rjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE9BQWdCO0lBQ3ZELGNBQWMsQ0FBQyxPQUFPO1NBQ25CLE9BQU8sQ0FBQyxVQUFVLENBQUM7U0FDbkIsV0FBVyxDQUFDLHFFQUFxRSxDQUFDO1NBQ2xGLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxvQ0FBb0MsQ0FBQztTQUMvRCxNQUFNLENBQUMseUJBQXlCLEVBQUUsZ0RBQWdELENBQUM7U0FDbkYsTUFBTSxDQUFDLGVBQWUsRUFBRSx5REFBeUQsQ0FBQyxDQUFDO1NBQ25GLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBd0IsRUFBRSxFQUFFO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDO1lBQ0gsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVu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bmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IFlBTUwgZnJvbSAneWFtbCc7XG5pbXBvcnQgeyBwcmludENvbW1hbmRIZWFkZXIsIHByaW50U3NsV2FybmluZywgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jLCB3aXRoU3NsT3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludEVycm9yLCBwcmludEluZm8sIHByaW50U3VjY2VzcywgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcblxuaW50ZXJmYWNlIFZhbGlkYXRlT3B0aW9ucyB7XG4gIHBpcGVsaW5lPzogc3RyaW5nO1xuICBwbHVnaW4/OiBzdHJpbmc7XG4gIGZpbGU/OiBzdHJpbmc7XG4gIHZlcmlmeVNzbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIGB2YWxpZGF0ZS10ZW1wbGF0ZXNgIGNvbW1hbmQuXG4gKlxuICogVXNhZ2U6XG4gKiAgIHBpcGVsaW5lLW1hbmFnZXIgdGVtcGxhdGUgdmFsaWRhdGUgLS1waXBlbGluZSA8dXVpZD5cbiAqICAgcGlwZWxpbmUtbWFuYWdlciB0ZW1wbGF0ZSB2YWxpZGF0ZSAtLXBsdWdpbiA8bmFtZTp2ZXJzaW9uPlxuICogICBwaXBlbGluZS1tYW5hZ2VyIHRlbXBsYXRlIHZhbGlkYXRlIC0tZmlsZSAuL3BsdWdpbi1zcGVjLnlhbWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVGVtcGxhdGVzQ29tbWFuZChwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHdpdGhTc2xPcHRpb25zKHByb2dyYW1cbiAgICAuY29tbWFuZCgndmFsaWRhdGUnKVxuICAgIC5kZXNjcmlwdGlvbignUGFyc2UgYW5kIHZhbGlkYXRlIHt7IC4uLiB9fSB0ZW1wbGF0ZXMgaW4gYSBwaXBlbGluZSBvciBwbHVnaW4gc3BlYycpXG4gICAgLm9wdGlvbignLS1waXBlbGluZSA8aWQ+JywgJ1ZhbGlkYXRlIHRoZSBwaXBlbGluZSB3aXRoIHRoaXMgSUQnKVxuICAgIC5vcHRpb24oJy0tcGx1Z2luIDxuYW1lOnZlcnNpb24+JywgJ1ZhbGlkYXRlIHRoZSBwbHVnaW4gd2l0aCB0aGlzIG5hbWUgYW5kIHZlcnNpb24nKVxuICAgIC5vcHRpb24oJy0tZmlsZSA8cGF0aD4nLCAnVmFsaWRhdGUgYSBsb2NhbCBwbHVnaW4tc3BlYy55YW1sIG9yIHBpcGVsaW5lLmpzb24gZmlsZScpKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IFZhbGlkYXRlT3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1ZhbGlkYXRlIFRlbXBsYXRlcycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcHJpbnRTc2xXYXJuaW5nKG9wdGlvbnMudmVyaWZ5U3NsKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMucGlwZWxpbmUgJiYgIW9wdGlvbnMucGx1Z2luICYmICFvcHRpb25zLmZpbGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09uZSBvZiAtLXBpcGVsaW5lLCAtLXBsdWdpbiwgb3IgLS1maWxlIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3JlID0gYXdhaXQgaW1wb3J0KCdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJyk7XG5cbiAgICAgICAgY29uc3QgcHJvYmxlbXM6IEFycmF5PHsgc291cmNlOiBzdHJpbmc7IGVycm9yczogeyBmaWVsZD86IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nOyBjb2RlPzogc3RyaW5nIH1bXSB9PiA9IFtdO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZpbGUpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShvcHRpb25zLmZpbGUpO1xuICAgICAgICAgIGNvbnN0IHRleHQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IGRvYyA9IGZpbGVQYXRoLmVuZHNXaXRoKCcuanNvbicpID8gSlNPTi5wYXJzZSh0ZXh0KSA6IFlBTUwucGFyc2UodGV4dCk7XG5cbiAgICAgICAgICAvLyBHdWVzczogaWYgYHBsdWdpblR5cGVgIGlzIHByZXNlbnQsIHRyZWF0IGFzIHBsdWdpbiBzcGVjOyBlbHNlIHBpcGVsaW5lXG4gICAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlb2YgKGRvYyBhcyB7IHBsdWdpblR5cGU/OiB1bmtub3duIH0pLnBsdWdpblR5cGUgPT09ICdzdHJpbmcnO1xuICAgICAgICAgIGNvbnN0IGVycm9ycyA9IGlzUGx1Z2luXG4gICAgICAgICAgICA/IHZhbGlkYXRlUGx1Z2luRG9jKGNvcmUsIGRvYylcbiAgICAgICAgICAgIDogdmFsaWRhdGVQaXBlbGluZURvYyhjb3JlLCBkb2MpO1xuICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSBwcm9ibGVtcy5wdXNoKHsgc291cmNlOiBmaWxlUGF0aCwgZXJyb3JzIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucGlwZWxpbmUpIHtcbiAgICAgICAgICBwcmludEluZm8oJ0ZldGNoaW5nIHBpcGVsaW5lJywgeyBpZDogb3B0aW9ucy5waXBlbGluZSB9KTtcbiAgICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9ucyk7XG4gICAgICAgICAgY29uc3QgY2ZnID0gY2xpZW50LmdldENvbmZpZygpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5nZXQ8eyBwaXBlbGluZT86IHsgcHJvcHM6IHVua25vd24gfSB9PihgJHtjZmcuYXBpLnBpcGVsaW5lVXJsfS8ke29wdGlvbnMucGlwZWxpbmV9YCk7XG4gICAgICAgICAgY29uc3QgZG9jID0gKHJlcyBhcyB7IHBpcGVsaW5lPzogeyBwcm9wczogdW5rbm93biB9IH0pLnBpcGVsaW5lPy5wcm9wc1xuICAgICAgICAgICAgPz8gKHJlcyBhcyB7IGRhdGE/OiB7IHBpcGVsaW5lPzogeyBwcm9wczogdW5rbm93biB9IH0gfSkuZGF0YT8ucGlwZWxpbmU/LnByb3BzO1xuICAgICAgICAgIGlmICghZG9jKSB0aHJvdyBuZXcgRXJyb3IoYFBpcGVsaW5lICR7b3B0aW9ucy5waXBlbGluZX0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVQaXBlbGluZURvYyhjb3JlLCBkb2MpO1xuICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSBwcm9ibGVtcy5wdXNoKHsgc291cmNlOiBgcGlwZWxpbmUvJHtvcHRpb25zLnBpcGVsaW5lfWAsIGVycm9ycyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBsdWdpbikge1xuICAgICAgICAgIGNvbnN0IFtuYW1lLCB2ZXJzaW9uXSA9IG9wdGlvbnMucGx1Z2luLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgaWYgKCFuYW1lIHx8ICF2ZXJzaW9uKSB0aHJvdyBuZXcgRXJyb3IoJy0tcGx1Z2luIHJlcXVpcmVzIDxuYW1lOnZlcnNpb24+IGZvcm1hdCcpO1xuICAgICAgICAgIHByaW50SW5mbygnRmV0Y2hpbmcgcGx1Z2luJywgeyBuYW1lLCB2ZXJzaW9uIH0pO1xuICAgICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYyhvcHRpb25zKTtcbiAgICAgICAgICBjb25zdCBjZmcgPSBjbGllbnQuZ2V0Q29uZmlnKCk7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LmdldDx7IHBsdWdpbjogdW5rbm93biB9PihcbiAgICAgICAgICAgIGAke2NmZy5hcGkucGx1Z2luVXJsfS9maW5kP25hbWU9JHtlbmNvZGVVUklDb21wb25lbnQobmFtZSl9JnZlcnNpb249JHtlbmNvZGVVUklDb21wb25lbnQodmVyc2lvbil9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGRvYyA9IChyZXMgYXMgeyBwbHVnaW4/OiB1bmtub3duIH0pLnBsdWdpblxuICAgICAgICAgICAgPz8gKHJlcyBhcyB7IGRhdGE/OiB7IHBsdWdpbj86IHVua25vd24gfSB9KS5kYXRhPy5wbHVnaW47XG4gICAgICAgICAgaWYgKCFkb2MpIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICR7bmFtZX06JHt2ZXJzaW9ufSBub3QgZm91bmRgKTtcbiAgICAgICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZVBsdWdpbkRvYyhjb3JlLCBkb2MpO1xuICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSBwcm9ibGVtcy5wdXNoKHsgc291cmNlOiBgcGx1Z2luLyR7bmFtZX06JHt2ZXJzaW9ufWAsIGVycm9ycyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ibGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBwcmludFN1Y2Nlc3MoJ0FsbCB0ZW1wbGF0ZXMgdmFsaWQnLCB7IGV4ZWN1dGlvbklkIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50V2FybmluZyhgRm91bmQgJHtwcm9ibGVtcy5yZWR1Y2UoKGEsIHApID0+IGEgKyBwLmVycm9ycy5sZW5ndGgsIDApfSB0ZW1wbGF0ZSBlcnJvcihzKTpgKTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHByb2JsZW1zKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcihwLnNvdXJjZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIHAuZXJyb3JzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgIFske2UuZmllbGQgPz8gJz8nfV0gJHtlLm1lc3NhZ2V9JHtlLmNvZGUgPyBgICgke2UuY29kZX0pYCA6ICcnfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHsgY29tbWFuZDogJ3ZhbGlkYXRlLXRlbXBsYXRlcycsIGV4ZWN1dGlvbklkIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBsdWdpbkRvYyhjb3JlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBkb2M6IHVua25vd24pOiBBcnJheTx7IGZpZWxkPzogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IGNvZGU/OiBzdHJpbmcgfT4ge1xuICBjb25zdCBpc1RwbCA9IChmOiBzdHJpbmcpID0+XG4gICAgZiA9PT0gJ2Rlc2NyaXB0aW9uJyB8fFxuICAgIGYuc3RhcnRzV2l0aCgnY29tbWFuZHMnKSB8fFxuICAgIGYuc3RhcnRzV2l0aCgnaW5zdGFsbENvbW1hbmRzJykgfHxcbiAgICBmLnN0YXJ0c1dpdGgoJ2Vudi4nKSB8fCBmLnN0YXJ0c1dpdGgoJ2VudlsnKSB8fFxuICAgIGYuc3RhcnRzV2l0aCgnYnVpbGRBcmdzLicpIHx8IGYuc3RhcnRzV2l0aCgnYnVpbGRBcmdzWycpO1xuICBjb25zdCBpc0tub3duID0gY29yZS5hbGxvd2VkU2NvcGVSb290cyhbJ3BpcGVsaW5lJywgJ3BsdWdpbicsICdlbnYnXSk7XG4gIGNvbnN0IHsgZXJyb3JzIH0gPSBjb3JlLnZhbGlkYXRlVGVtcGxhdGVzKGRvYywgaXNUcGwsIGlzS25vd24pO1xuICByZXR1cm4gZXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBpcGVsaW5lRG9jKGNvcmU6IFJlY29yZDxzdHJpbmcsIGFueT4sIGRvYzogdW5rbm93bik6IEFycmF5PHsgZmllbGQ/OiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZzsgY29kZT86IHN0cmluZyB9PiB7XG4gIGNvbnN0IGlzVHBsID0gKGY6IHN0cmluZykgPT5cbiAgICBmID09PSAncHJvamVjdE5hbWUnIHx8XG4gICAgZi5zdGFydHNXaXRoKCdtZXRhZGF0YS4nKSB8fCBmLnN0YXJ0c1dpdGgoJ21ldGFkYXRhWycpIHx8XG4gICAgZi5zdGFydHNXaXRoKCd2YXJzLicpIHx8IGYuc3RhcnRzV2l0aCgndmFyc1snKTtcbiAgY29uc3QgaXNLbm93biA9IGNvcmUuYWxsb3dlZFNjb3BlUm9vdHMoWydtZXRhZGF0YScsICd2YXJzJ10pO1xuICBjb25zdCB7IGVycm9ycyB9ID0gY29yZS52YWxpZGF0ZVRlbXBsYXRlcyhkb2MsIGlzVHBsLCBpc0tub3duKTtcbiAgY29uc3QgY3ljbGVzID0gY29yZS5kZXRlY3RDeWNsZXMoZG9jLCBpc1RwbCwgKGY6IHN0cmluZykgPT4gaXNUcGwoZikgPyBmIDogbnVsbCk7XG4gIHJldHVybiBbLi4uZXJyb3JzLCAuLi5jeWNsZXNdO1xufVxuIl19
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtdGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3ZhbGlkYXRlLXRlbXBsYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLG9CQUFvQixFQUE2QixNQUFNLDRCQUE0QixDQUFDO0FBQzdGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsOEJBQThCLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEksT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFTN0Y7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxPQUFnQjtJQUN2RCxjQUFjLENBQUMsT0FBTztTQUNuQixPQUFPLENBQUMsVUFBVSxDQUFDO1NBQ25CLFdBQVcsQ0FBQyxxRUFBcUUsQ0FBQztTQUNsRixNQUFNLENBQUMsaUJBQWlCLEVBQUUsb0NBQW9DLENBQUM7U0FDL0QsTUFBTSxDQUFDLHlCQUF5QixFQUFFLGdEQUFnRCxDQUFDO1NBQ25GLE1BQU0sQ0FBQyxlQUFlLEVBQUUseURBQXlELENBQUMsQ0FBQztTQUNuRixNQUFNLENBQUMsS0FBSyxFQUFFLE9BQXdCLEVBQUUsRUFBRTtRQUN6QyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FB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RSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSztRQUMzRixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87UUFDdEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO0tBQ2pCLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsSUFBeUIsRUFBRSxHQUFZO0lBQ2xFLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FDMUIsQ0FBQyxLQUFLLGFBQWE7UUFDbkIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUN0RCxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDN0QsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pGLE9BQU8sQ0FBQyxHQUFHLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY2hlY2tQbHVnaW5UZW1wbGF0ZXMsIHR5cGUgUGx1Z2luVGVtcGxhdGVFbmdpbmUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCBZQU1MIGZyb20gJ3lhbWwnO1xuaW1wb3J0IHsgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcsIGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYywgd2l0aFNzbE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRFcnJvciwgcHJpbnRJbmZvLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbmludGVyZmFjZSBWYWxpZGF0ZU9wdGlvbnMge1xuICBwaXBlbGluZT86IHN0cmluZztcbiAgcGx1Z2luPzogc3RyaW5nO1xuICBmaWxlPzogc3RyaW5nO1xuICB2ZXJpZnlTc2w/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBgdmFsaWRhdGUtdGVtcGxhdGVzYCBjb21tYW5kLlxuICpcbiAqIFVzYWdlOlxuICogICBwaXBlbGluZS1tYW5hZ2VyIHRlbXBsYXRlIHZhbGlkYXRlIC0tcGlwZWxpbmUgPHV1aWQ+XG4gKiAgIHBpcGVsaW5lLW1hbmFnZXIgdGVtcGxhdGUgdmFsaWRhdGUgLS1wbHVnaW4gPG5hbWU6dmVyc2lvbj5cbiAqICAgcGlwZWxpbmUtbWFuYWdlciB0ZW1wbGF0ZSB2YWxpZGF0ZSAtLWZpbGUgLi9wbHVnaW4tc3BlYy55YW1sXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRlbXBsYXRlc0NvbW1hbmQocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ3ZhbGlkYXRlJylcbiAgICAuZGVzY3JpcHRpb24oJ1BhcnNlIGFuZCB2YWxpZGF0ZSB7eyAuLi4gfX0gdGVtcGxhdGVzIGluIGEgcGlwZWxpbmUgb3IgcGx1Z2luIHNwZWMnKVxuICAgIC5vcHRpb24oJy0tcGlwZWxpbmUgPGlkPicsICdWYWxpZGF0ZSB0aGUgcGlwZWxpbmUgd2l0aCB0aGlzIElEJylcbiAgICAub3B0aW9uKCctLXBsdWdpbiA8bmFtZTp2ZXJzaW9uPicsICdWYWxpZGF0ZSB0aGUgcGx1Z2luIHdpdGggdGhpcyBuYW1lIGFuZCB2ZXJzaW9uJylcbiAgICAub3B0aW9uKCctLWZpbGUgPHBhdGg+JywgJ1ZhbGlkYXRlIGEgbG9jYWwgcGx1Z2luLXNwZWMueWFtbCBvciBwaXBlbGluZS5qc29uIGZpbGUnKSlcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiBWYWxpZGF0ZU9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdWYWxpZGF0ZSBUZW1wbGF0ZXMnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByaW50U3NsV2FybmluZyhvcHRpb25zLnZlcmlmeVNzbCk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLnBpcGVsaW5lICYmICFvcHRpb25zLnBsdWdpbiAmJiAhb3B0aW9ucy5maWxlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmUgb2YgLS1waXBlbGluZSwgLS1wbHVnaW4sIG9yIC0tZmlsZSBpcyByZXF1aXJlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29yZSA9IGF3YWl0IGltcG9ydCgnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZScpO1xuXG4gICAgICAgIGNvbnN0IHByb2JsZW1zOiBBcnJheTx7IHNvdXJjZTogc3RyaW5nOyBlcnJvcnM6IHsgZmllbGQ/OiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZzsgY29kZT86IHN0cmluZyB9W10gfT4gPSBbXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5maWxlKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUob3B0aW9ucy5maWxlKTtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCBkb2MgPSBmaWxlUGF0aC5lbmRzV2l0aCgnLmpzb24nKSA/IEpTT04ucGFyc2UodGV4dCkgOiBZQU1MLnBhcnNlKHRleHQpO1xuXG4gICAgICAgICAgLy8gR3Vlc3M6IGlmIGBwbHVnaW5UeXBlYCBpcyBwcmVzZW50LCB0cmVhdCBhcyBwbHVnaW4gc3BlYzsgZWxzZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZW9mIChkb2MgYXMgeyBwbHVnaW5UeXBlPzogdW5rbm93biB9KS5wbHVnaW5UeXBlID09PSAnc3RyaW5nJztcbiAgICAgICAgICBjb25zdCBlcnJvcnMgPSBpc1BsdWdpblxuICAgICAgICAgICAgPyB2YWxpZGF0ZVBsdWdpbkRvYyhjb3JlLCBkb2MpXG4gICAgICAgICAgICA6IHZhbGlkYXRlUGlwZWxpbmVEb2MoY29yZSwgZG9jKTtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgcHJvYmxlbXMucHVzaCh7IHNvdXJjZTogZmlsZVBhdGgsIGVycm9ycyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBpcGVsaW5lKSB7XG4gICAgICAgICAgcHJpbnRJbmZvKCdGZXRjaGluZyBwaXBlbGluZScsIHsgaWQ6IG9wdGlvbnMucGlwZWxpbmUgfSk7XG4gICAgICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jKG9wdGlvbnMpO1xuICAgICAgICAgIGNvbnN0IGNmZyA9IGNsaWVudC5nZXRDb25maWcoKTtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQuZ2V0PHsgcGlwZWxpbmU/OiB7IHByb3BzOiB1bmtub3duIH0gfT4oYCR7Y2ZnLmFwaS5waXBlbGluZVVybH0vJHtvcHRpb25zLnBpcGVsaW5lfWApO1xuICAgICAgICAgIGNvbnN0IGRvYyA9IChyZXMgYXMgeyBwaXBlbGluZT86IHsgcHJvcHM6IHVua25vd24gfSB9KS5waXBlbGluZT8ucHJvcHNcbiAgICAgICAgICAgID8/IChyZXMgYXMgeyBkYXRhPzogeyBwaXBlbGluZT86IHsgcHJvcHM6IHVua25vd24gfSB9IH0pLmRhdGE/LnBpcGVsaW5lPy5wcm9wcztcbiAgICAgICAgICBpZiAoIWRvYykgdGhyb3cgbmV3IEVycm9yKGBQaXBlbGluZSAke29wdGlvbnMucGlwZWxpbmV9IG5vdCBmb3VuZGApO1xuICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlUGlwZWxpbmVEb2MoY29yZSwgZG9jKTtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgcHJvYmxlbXMucHVzaCh7IHNvdXJjZTogYHBpcGVsaW5lLyR7b3B0aW9ucy5waXBlbGluZX1gLCBlcnJvcnMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5wbHVnaW4pIHtcbiAgICAgICAgICBjb25zdCBbbmFtZSwgdmVyc2lvbl0gPSBvcHRpb25zLnBsdWdpbi5zcGxpdCgnOicpO1xuICAgICAgICAgIGlmICghbmFtZSB8fCAhdmVyc2lvbikgdGhyb3cgbmV3IEVycm9yKCctLXBsdWdpbiByZXF1aXJlcyA8bmFtZTp2ZXJzaW9uPiBmb3JtYXQnKTtcbiAgICAgICAgICBwcmludEluZm8oJ0ZldGNoaW5nIHBsdWdpbicsIHsgbmFtZSwgdmVyc2lvbiB9KTtcbiAgICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9ucyk7XG4gICAgICAgICAgY29uc3QgY2ZnID0gY2xpZW50LmdldENvbmZpZygpO1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5nZXQ8eyBwbHVnaW46IHVua25vd24gfT4oXG4gICAgICAgICAgICBgJHtjZmcuYXBpLnBsdWdpblVybH0vZmluZD9uYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfSZ2ZXJzaW9uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZlcnNpb24pfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBkb2MgPSAocmVzIGFzIHsgcGx1Z2luPzogdW5rbm93biB9KS5wbHVnaW5cbiAgICAgICAgICAgID8/IChyZXMgYXMgeyBkYXRhPzogeyBwbHVnaW4/OiB1bmtub3duIH0gfSkuZGF0YT8ucGx1Z2luO1xuICAgICAgICAgIGlmICghZG9jKSB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAke25hbWV9OiR7dmVyc2lvbn0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVQbHVnaW5Eb2MoY29yZSwgZG9jKTtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgcHJvYmxlbXMucHVzaCh7IHNvdXJjZTogYHBsdWdpbi8ke25hbWV9OiR7dmVyc2lvbn1gLCBlcnJvcnMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvYmxlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcHJpbnRTdWNjZXNzKCdBbGwgdGVtcGxhdGVzIHZhbGlkJywgeyBleGVjdXRpb25JZCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwcmludFdhcm5pbmcoYEZvdW5kICR7cHJvYmxlbXMucmVkdWNlKChhLCBwKSA9PiBhICsgcC5lcnJvcnMubGVuZ3RoLCAwKX0gdGVtcGxhdGUgZXJyb3Iocyk6YCk7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBwcm9ibGVtcykge1xuICAgICAgICAgIHByaW50RXJyb3IocC5zb3VyY2UpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBwLmVycm9ycykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICBbJHtlLmZpZWxkID8/ICc/J31dICR7ZS5tZXNzYWdlfSR7ZS5jb2RlID8gYCAoJHtlLmNvZGV9KWAgOiAnJ31gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICd2YWxpZGF0ZS10ZW1wbGF0ZXMnLCBleGVjdXRpb25JZCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqIFRoZSBwbHVnaW4gdGVtcGxhdGUgY29udHJhY3QgdGhlIHVwbG9hZCBhcHBsaWVzIChhcGktY29yZSdzIHNoYXJlZCBjaGVjaykuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVBsdWdpbkRvYyhjb3JlOiBQbHVnaW5UZW1wbGF0ZUVuZ2luZSwgZG9jOiB1bmtub3duKTogQXJyYXk8eyBmaWVsZD86IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nOyBjb2RlPzogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIGNoZWNrUGx1Z2luVGVtcGxhdGVzKGRvYyBhcyBvYmplY3QsIGNvcmUpLm1hcCgoaXNzdWUpID0+ICh7XG4gICAgZmllbGQ6IGlzc3VlLmxpbmUgIT09IHVuZGVmaW5lZCA/IGAke2lzc3VlLmZpZWxkfToke2lzc3VlLmxpbmV9OiR7aXNzdWUuY29sfWAgOiBpc3N1ZS5maWVsZCxcbiAgICBtZXNzYWdlOiBpc3N1ZS5tZXNzYWdlLFxuICAgIGNvZGU6IGlzc3VlLmtpbmQsXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQaXBlbGluZURvYyhjb3JlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBkb2M6IHVua25vd24pOiBBcnJheTx7IGZpZWxkPzogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IGNvZGU/OiBzdHJpbmcgfT4ge1xuICBjb25zdCBpc1RwbCA9IChmOiBzdHJpbmcpID0+XG4gICAgZiA9PT0gJ3Byb2plY3ROYW1lJyB8fFxuICAgIGYuc3RhcnRzV2l0aCgnbWV0YWRhdGEuJykgfHwgZi5zdGFydHNXaXRoKCdtZXRhZGF0YVsnKSB8fFxuICAgIGYuc3RhcnRzV2l0aCgndmFycy4nKSB8fCBmLnN0YXJ0c1dpdGgoJ3ZhcnNbJyk7XG4gIGNvbnN0IGlzS25vd24gPSBjb3JlLmFsbG93ZWRTY29wZVJvb3RzKFsnbWV0YWRhdGEnLCAndmFycyddKTtcbiAgY29uc3QgeyBlcnJvcnMgfSA9IGNvcmUudmFsaWRhdGVUZW1wbGF0ZXMoZG9jLCBpc1RwbCwgaXNLbm93bik7XG4gIGNvbnN0IGN5Y2xlcyA9IGNvcmUuZGV0ZWN0Q3ljbGVzKGRvYywgaXNUcGwsIChmOiBzdHJpbmcpID0+IGlzVHBsKGYpID8gZiA6IG51bGwpO1xuICByZXR1cm4gWy4uLmVycm9ycywgLi4uY3ljbGVzXTtcbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The curated icon keys `plugin new --icon` accepts (deploy/plugins/_icons).
3
+ * The CLI ships without the repo, so they are listed
4
+ * here; a test fails when the list drifts from the tree. The base images live
5
+ * in api-core (`PLUGIN_BASE_IMAGES`), shared with AI plugin generation.
6
+ */
7
+ /**
8
+ * Curated icon keys (`deploy/plugins/_icons/<key>.svg`). Reserved for Official
9
+ * listings and Verified publishers who own the mark: a Community
10
+ * listing uses an uploaded raster icon or its monogram.
11
+ */
12
+ export declare const CURATED_ICON_KEYS: readonly string[];
13
+ //# sourceMappingURL=plugin-catalog-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-catalog-assets.d.ts","sourceRoot":"","sources":["../../src/config/plugin-catalog-assets.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAM9C,CAAC"}
@@ -0,0 +1,21 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * The curated icon keys `plugin new --icon` accepts (deploy/plugins/_icons).
5
+ * The CLI ships without the repo, so they are listed
6
+ * here; a test fails when the list drifts from the tree. The base images live
7
+ * in api-core (`PLUGIN_BASE_IMAGES`), shared with AI plugin generation.
8
+ */
9
+ /**
10
+ * Curated icon keys (`deploy/plugins/_icons/<key>.svg`). Reserved for Official
11
+ * listings and Verified publishers who own the mark: a Community
12
+ * listing uses an uploaded raster icon or its monogram.
13
+ */
14
+ export const CURATED_ICON_KEYS = [
15
+ 'apachemaven', 'checkmarx', 'codacy', 'codecov', 'cplusplus', 'cypress', 'datadog', 'dependencycheck', 'docker',
16
+ 'dotnet', 'eslint', 'flyway', 'github', 'gnubash', 'go', 'googlecloud', 'helm', 'jest', 'jfrog', 'k6', 'kubernetes',
17
+ 'newrelic', 'nodejs', 'npm', 'nuget', 'openjdk', 'pagerduty', 'paloaltonetworks', 'php', 'postman', 'prettier',
18
+ 'pulumi', 'pypi', 'pytest', 'python', 'ruby', 'rubygems', 'rubyonrails', 'ruff', 'rust', 'sentry', 'serverless',
19
+ 'snyk', 'sonarcloud', 'terraform', 'trivy', 'typescript',
20
+ ];
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWNhdGFsb2ctYXNzZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9wbHVnaW4tY2F0YWxvZy1hc3NldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7R0FLRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBc0I7SUFDbEQsYUFBYSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFFBQVE7SUFDL0csUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZO0lBQ25ILFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVTtJQUM5RyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWTtJQUMvRyxNQUFNLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsWUFBWTtDQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVGhlIGN1cmF0ZWQgaWNvbiBrZXlzIGBwbHVnaW4gbmV3IC0taWNvbmAgYWNjZXB0cyAoZGVwbG95L3BsdWdpbnMvX2ljb25zKS5cbiAqIFRoZSBDTEkgc2hpcHMgd2l0aG91dCB0aGUgcmVwbywgc28gdGhleSBhcmUgbGlzdGVkXG4gKiBoZXJlOyBhIHRlc3QgZmFpbHMgd2hlbiB0aGUgbGlzdCBkcmlmdHMgZnJvbSB0aGUgdHJlZS4gVGhlIGJhc2UgaW1hZ2VzIGxpdmVcbiAqIGluIGFwaS1jb3JlIChgUExVR0lOX0JBU0VfSU1BR0VTYCksIHNoYXJlZCB3aXRoIEFJIHBsdWdpbiBnZW5lcmF0aW9uLlxuICovXG5cbi8qKlxuICogQ3VyYXRlZCBpY29uIGtleXMgKGBkZXBsb3kvcGx1Z2lucy9faWNvbnMvPGtleT4uc3ZnYCkuIFJlc2VydmVkIGZvciBPZmZpY2lhbFxuICogbGlzdGluZ3MgYW5kIFZlcmlmaWVkIHB1Ymxpc2hlcnMgd2hvIG93biB0aGUgbWFyazogYSBDb21tdW5pdHlcbiAqIGxpc3RpbmcgdXNlcyBhbiB1cGxvYWRlZCByYXN0ZXIgaWNvbiBvciBpdHMgbW9ub2dyYW0uXG4gKi9cbmV4cG9ydCBjb25zdCBDVVJBVEVEX0lDT05fS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdhcGFjaGVtYXZlbicsICdjaGVja21hcngnLCAnY29kYWN5JywgJ2NvZGVjb3YnLCAnY3BsdXNwbHVzJywgJ2N5cHJlc3MnLCAnZGF0YWRvZycsICdkZXBlbmRlbmN5Y2hlY2snLCAnZG9ja2VyJyxcbiAgJ2RvdG5ldCcsICdlc2xpbnQnLCAnZmx5d2F5JywgJ2dpdGh1YicsICdnbnViYXNoJywgJ2dvJywgJ2dvb2dsZWNsb3VkJywgJ2hlbG0nLCAnamVzdCcsICdqZnJvZycsICdrNicsICdrdWJlcm5ldGVzJyxcbiAgJ25ld3JlbGljJywgJ25vZGVqcycsICducG0nLCAnbnVnZXQnLCAnb3BlbmpkaycsICdwYWdlcmR1dHknLCAncGFsb2FsdG9uZXR3b3JrcycsICdwaHAnLCAncG9zdG1hbicsICdwcmV0dGllcicsXG4gICdwdWx1bWknLCAncHlwaScsICdweXRlc3QnLCAncHl0aG9uJywgJ3J1YnknLCAncnVieWdlbXMnLCAncnVieW9ucmFpbHMnLCAncnVmZicsICdydXN0JywgJ3NlbnRyeScsICdzZXJ2ZXJsZXNzJyxcbiAgJ3NueWsnLCAnc29uYXJjbG91ZCcsICd0ZXJyYWZvcm0nLCAndHJpdnknLCAndHlwZXNjcmlwdCcsXG5dO1xuIl19