@pipeline-builder/pipeline-manager 4.1.14 → 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
@@ -0,0 +1,62 @@
1
+ import { type PluginCatalogEdits } from '@pipeline-builder/api-core';
2
+ import { Command } from 'commander';
3
+ import { type ApiClient } from '../utils/api-client.js';
4
+ import { type Ask } from '../utils/catalog-prompt.js';
5
+ import { type Exec } from '../utils/plugin-docker.js';
6
+ import { type ScanPreview } from '../utils/plugin-scan.js';
7
+ export interface PublishPluginOptions {
8
+ dir: string;
9
+ yes?: boolean;
10
+ metadata?: string;
11
+ image?: string;
12
+ skipScan?: boolean;
13
+ dryRun?: boolean;
14
+ verifySsl?: boolean;
15
+ }
16
+ /** A publish refused before anything is uploaded. */
17
+ export declare class PublishPreflightError extends Error {
18
+ constructor(message: string);
19
+ }
20
+ /** The server-side prerequisites a publish request needs: checked up front. */
21
+ export declare function assertCanPublish(client: ApiClient): Promise<string>;
22
+ /**
23
+ * The scan preview: build (or take) the image, SBOM it with syft and scan it
24
+ * with grype. Missing tools are a clear notice, never a silent pass; a
25
+ * critical finding refuses the publish (the platform's gate would).
26
+ */
27
+ export declare function runScanPreview(exec: Exec, opts: {
28
+ dir: string;
29
+ dockerfile: string;
30
+ buildType: string;
31
+ name: string;
32
+ version: string;
33
+ image?: string;
34
+ buildArgs?: Record<string, string>;
35
+ }): ScanPreview;
36
+ /**
37
+ * The whole publish flow, minus the terminal: pre-flight (server checks, lint,
38
+ * catalog), scan preview, the accept-or-edit step, then one upload with
39
+ * `visibility=public` + `publishRequest=true` (+ the edits as `metadata`).
40
+ * Returns the server's response, or null for a dry run.
41
+ */
42
+ export declare function runPublish(options: PublishPluginOptions, deps?: {
43
+ exec?: Exec;
44
+ ask?: Ask;
45
+ client?: () => ApiClient;
46
+ }): Promise<{
47
+ edits: PluginCatalogEdits;
48
+ response: unknown;
49
+ }>;
50
+ /**
51
+ * Register `plugin publish` — pre-flight (the server's schemas, the catalog's
52
+ * Dockerfile rules, publish-required metadata), a local scan preview, the
53
+ * catalog accept-or-edit step, then the upload that submits a publish request
54
+ * once the version is built.
55
+ *
56
+ * Usage:
57
+ * pipeline-manager plugin publish --dir ./my-linter
58
+ * pipeline-manager plugin publish --dir ./my-linter --yes
59
+ * pipeline-manager plugin publish --dir ./my-linter --metadata catalog.yaml
60
+ */
61
+ export declare function publishPlugin(program: Command): void;
62
+ //# sourceMappingURL=publish-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-plugin.d.ts","sourceRoot":"","sources":["../../src/commands/publish-plugin.ts"],"names":[],"mappings":"AAKA,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAuB,KAAK,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAI3E,OAAO,EAAoE,KAAK,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAExH,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGxE,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qDAAqD;AACrD,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAYD,+EAA+E;AAC/E,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAOzE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,WAAW,CAqBvM;AAYD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,oBAAoB,EAC7B,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,SAAS,CAAA;CAAO,GAC9D,OAAO,CAAC;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAkF3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkCpD"}
@@ -0,0 +1,224 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import path from 'path';
4
+ import readline from 'readline/promises';
5
+ import { resolveCatalogMetadata } from '@pipeline-builder/api-core';
6
+ import { Command } from 'commander';
7
+ import FormData from 'form-data';
8
+ import { PUBLISH_REQUIRED_FIELDS, catalogIssues, formatHeuristic, printCatalogReport, validatePluginDir } from './validate-plugin.js';
9
+ import { FILE_SIZE_LIMITS, formatFileSize } from '../config/cli.constants.js';
10
+ import {} from '../utils/api-client.js';
11
+ import { collectCatalogEdits } from '../utils/catalog-prompt.js';
12
+ import { createAuthenticatedClient, printCommandHeader, printSslWarning, withSslOptions } from '../utils/command-utils.js';
13
+ import { ERROR_CODES, handleError, ValidationError } from '../utils/error-handler.js';
14
+ import { printError, printInfo, printKeyValue, printSection, printSuccess, printWarning } from '../utils/output-utils.js';
15
+ import { buildPluginImage, hasTool, localImageTag, removeImage, spawnExec } from '../utils/plugin-docker.js';
16
+ import { SOURCE_LABELS, formatCatalogValue } from '../utils/plugin-package.js';
17
+ import { scanPreview } from '../utils/plugin-scan.js';
18
+ import { collectPluginFiles, writeZip } from '../utils/plugin-zip.js';
19
+ /** A publish refused before anything is uploaded. */
20
+ export class PublishPreflightError extends Error {
21
+ constructor(message) {
22
+ super(message);
23
+ this.name = 'PublishPreflightError';
24
+ }
25
+ }
26
+ /** Unwrap the platform's `{ success, data }` envelope. */
27
+ const dataOf = (body) => (body?.data ?? body);
28
+ /** The server-side prerequisites a publish request needs: checked up front. */
29
+ export async function assertCanPublish(client) {
30
+ const state = dataOf(await client.get(`${client.getConfig().api.pluginUrl}/publisher`));
31
+ if (!state.publishingEnabled)
32
+ throw new PublishPreflightError('Publishing is turned off on this instance (PLUGIN_PUBLISHING_DISABLED)');
33
+ if (!state.isRootOrg)
34
+ throw new PublishPreflightError('Teams publish through their root organization: switch to it (PUBLISHER_ROOT_ORG_REQUIRED)');
35
+ if (!state.publisher)
36
+ throw new PublishPreflightError('Create your publisher profile first: dashboard → Build → Publisher (PUBLISHER_REQUIRED)');
37
+ if (!state.terms.accepted)
38
+ throw new PublishPreflightError('Accept the current publisher terms on the Publisher page (PUBLISHER_TERMS_REQUIRED)');
39
+ return state.publisher.handle;
40
+ }
41
+ /**
42
+ * The scan preview: build (or take) the image, SBOM it with syft and scan it
43
+ * with grype. Missing tools are a clear notice, never a silent pass; a
44
+ * critical finding refuses the publish (the platform's gate would).
45
+ */
46
+ export function runScanPreview(exec, opts) {
47
+ if (!opts.image && opts.buildType !== 'build_image') {
48
+ return { status: 'unavailable', reason: `a ${opts.buildType} plugin has no Dockerfile to build; pass --image to scan the image it runs` };
49
+ }
50
+ if (!hasTool(exec, 'docker'))
51
+ return { status: 'unavailable', reason: 'docker is not available to build the image' };
52
+ if (!hasTool(exec, 'syft', ['version']) || !hasTool(exec, 'grype', ['version'])) {
53
+ return { status: 'unavailable', reason: 'syft and grype are not both installed (https://github.com/anchore/syft, https://github.com/anchore/grype)' };
54
+ }
55
+ let image = opts.image;
56
+ let built = null;
57
+ try {
58
+ if (!image) {
59
+ built = localImageTag(opts.name, opts.version);
60
+ const error = buildPluginImage(exec, { dir: opts.dir, dockerfile: opts.dockerfile, tag: built, buildArgs: opts.buildArgs });
61
+ if (error)
62
+ return { status: 'failed', reason: error };
63
+ image = built;
64
+ }
65
+ return scanPreview(exec, image);
66
+ }
67
+ finally {
68
+ if (built)
69
+ removeImage(exec, built);
70
+ }
71
+ }
72
+ /** Print the resolved metadata with its provenance (the card the directory will render). */
73
+ function printResolved(resolved) {
74
+ printSection('Catalog metadata to submit');
75
+ for (const [field, value] of Object.entries(resolved.values)) {
76
+ const source = resolved.sources[field];
77
+ console.log(` ${field.padEnd(16)} ${formatCatalogValue(value)}${source ? ` [${SOURCE_LABELS[source]}]` : ''}`);
78
+ }
79
+ console.log('');
80
+ }
81
+ /**
82
+ * The whole publish flow, minus the terminal: pre-flight (server checks, lint,
83
+ * catalog), scan preview, the accept-or-edit step, then one upload with
84
+ * `visibility=public` + `publishRequest=true` (+ the edits as `metadata`).
85
+ * Returns the server's response, or null for a dry run.
86
+ */
87
+ export async function runPublish(options, deps = {}) {
88
+ const exec = deps.exec ?? spawnExec;
89
+ printSection('Pre-flight', 'server checks + catalog lint + heuristics');
90
+ const report = await validatePluginDir(options.dir, { lint: true });
91
+ const { invalid } = catalogIssues(report.fields);
92
+ const lintErrors = report.lint.filter(l => l.level === 'error');
93
+ for (const w of report.lint.filter(l => l.level === 'warning'))
94
+ printWarning(w.message);
95
+ for (const h of report.heuristics.filter(x => x.severity === 'medium'))
96
+ printWarning(formatHeuristic(h));
97
+ const blocking = [
98
+ ...report.problems,
99
+ ...lintErrors.map(l => l.message),
100
+ ...report.heuristics.filter(x => x.severity === 'high').map(formatHeuristic),
101
+ ];
102
+ printCatalogReport(report.fields);
103
+ if (blocking.length) {
104
+ for (const p of blocking)
105
+ printError(` • ${p}`);
106
+ throw new PublishPreflightError(`Pre-flight failed with ${blocking.length} problem(s)`);
107
+ }
108
+ printSuccess('Pre-flight passed');
109
+ const spec = report.pkg.spec;
110
+ printSection('Scan preview', 'syft SBOM + grype');
111
+ if (options.skipScan) {
112
+ printWarning('Scan preview skipped (--skip-scan). The platform scans the image after the build; a critical vulnerability fails the publish gate.');
113
+ }
114
+ else {
115
+ const scan = runScanPreview(exec, {
116
+ dir: report.pkg.dir,
117
+ dockerfile: path.join(report.pkg.dir, report.pkg.dockerfileName),
118
+ buildType: report.pkg.buildType,
119
+ name: String(spec.name),
120
+ version: String(spec.version),
121
+ image: options.image,
122
+ buildArgs: spec.buildArgs,
123
+ });
124
+ if (scan.status === 'unavailable') {
125
+ printWarning(`Scan preview NOT run: ${scan.reason}. The platform still scans the image after the build, and a critical vulnerability fails the publish gate.`);
126
+ }
127
+ else if (scan.status === 'failed') {
128
+ throw new PublishPreflightError(`Scan preview failed: ${scan.reason}`);
129
+ }
130
+ else {
131
+ printKeyValue(Object.fromEntries(Object.entries(scan.counts).map(([k, v]) => [k, String(v)])));
132
+ if (scan.critical.length) {
133
+ for (const c of scan.critical)
134
+ printError(` • ${c}`);
135
+ throw new PublishPreflightError(`${scan.critical.length} critical vulnerabilit${scan.critical.length === 1 ? 'y' : 'ies'}: the publish gate would refuse this version`);
136
+ }
137
+ printSuccess('No critical vulnerabilities');
138
+ }
139
+ }
140
+ if (invalid.length) {
141
+ printWarning(`Detected values that are invalid and would be blank: ${invalid.map(f => f.field).join(', ')} — edit them below or fix the package`);
142
+ }
143
+ printSection('Catalog details', 'accept or edit each detected value');
144
+ const edits = await collectCatalogEdits(report.fields, { yes: options.yes, metadataFile: options.metadata, ask: deps.ask });
145
+ const resolved = resolveCatalogMetadata(report.fields, edits);
146
+ printResolved(resolved);
147
+ const missing = [...PUBLISH_REQUIRED_FIELDS].filter(f => resolved.values[f] === null || resolved.values[f] === undefined);
148
+ if (missing.length)
149
+ throw new PublishPreflightError(`A publish request needs: ${missing.join(', ')} (add them to the package or supply them with --metadata)`);
150
+ const zip = writeZip(collectPluginFiles(report.pkg.dir, { includeImageTar: report.pkg.buildType === 'prebuilt' }));
151
+ if (zip.length > FILE_SIZE_LIMITS.PLUGIN)
152
+ throw new ValidationError(`Plugin package exceeds ${formatFileSize(FILE_SIZE_LIMITS.PLUGIN)}`);
153
+ printInfo('Package', { size: formatFileSize(zip.length), metadataEdits: Object.keys(edits) });
154
+ if (options.dryRun) {
155
+ printSuccess('Dry run: nothing uploaded');
156
+ return { edits, response: null };
157
+ }
158
+ if (!options.yes && deps.ask) {
159
+ const answer = (await deps.ask(`Upload ${String(spec.name)}@${String(spec.version)} as public and request publishing? [y/N] `)).trim().toLowerCase();
160
+ if (answer !== 'y' && answer !== 'yes')
161
+ throw new PublishPreflightError('Cancelled — nothing uploaded');
162
+ }
163
+ const client = (deps.client ?? (() => createAuthenticatedClient(options)))();
164
+ const handle = await assertCanPublish(client);
165
+ const form = new FormData();
166
+ form.append('plugin', zip, { filename: `${String(spec.name)}-${String(spec.version)}.zip`, contentType: 'application/zip' });
167
+ form.append('visibility', 'public');
168
+ form.append('publishRequest', 'true');
169
+ if (Object.keys(edits).length)
170
+ form.append('metadata', JSON.stringify(edits));
171
+ printSection('Uploading', `as @${handle}`);
172
+ const response = dataOf(await client.postForm(client.getConfig().api.pluginUploadUrl, form));
173
+ return { edits, response };
174
+ }
175
+ /**
176
+ * Register `plugin publish` — pre-flight (the server's schemas, the catalog's
177
+ * Dockerfile rules, publish-required metadata), a local scan preview, the
178
+ * catalog accept-or-edit step, then the upload that submits a publish request
179
+ * once the version is built.
180
+ *
181
+ * Usage:
182
+ * pipeline-manager plugin publish --dir ./my-linter
183
+ * pipeline-manager plugin publish --dir ./my-linter --yes
184
+ * pipeline-manager plugin publish --dir ./my-linter --metadata catalog.yaml
185
+ */
186
+ export function publishPlugin(program) {
187
+ withSslOptions(program
188
+ .command('publish')
189
+ .description('Pre-flight, scan-preview and upload a plugin, then request its listing in the plugin ecosystem')
190
+ .option('--dir <path>', 'Plugin directory', '.')
191
+ .option('-y, --yes', 'Accept every detected catalog value and skip the confirmation', false)
192
+ .option('--metadata <file>', 'Catalog edits (YAML/JSON: summary, description, links, icon, …); no prompt')
193
+ .option('--image <ref>', 'Scan this image instead of building the plugin\'s Dockerfile')
194
+ .option('--skip-scan', 'Skip the local scan preview (the platform still scans)', false)
195
+ .option('--dry-run', 'Run every local step, upload nothing', false))
196
+ .action(async (options) => {
197
+ const executionId = printCommandHeader('Publish Plugin');
198
+ printSslWarning(options.verifySsl);
199
+ const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
200
+ const rl = interactive ? readline.createInterface({ input: process.stdin, output: process.stdout }) : null;
201
+ try {
202
+ const { response } = await runPublish(options, { ask: rl ? (q) => rl.question(q) : undefined });
203
+ if (!response)
204
+ return;
205
+ const r = response;
206
+ printSection('Submitted');
207
+ printKeyValue({
208
+ Plugin: `${r.pluginName ?? '?'}@${r.version ?? '?'}`,
209
+ ...(r.publishRequest?.requestId
210
+ ? { 'Publish request': `${r.publishRequest.requestId} (${r.publishRequest.status ?? 'submitted'})` }
211
+ : { 'Publish request': 'submitted automatically when the build completes' }),
212
+ });
213
+ printSuccess('Track the request on the Publisher page → Requests (or GET /api/plugins/publish-requests)', { executionId });
214
+ }
215
+ catch (err) {
216
+ const code = err instanceof ValidationError || err instanceof PublishPreflightError ? ERROR_CODES.VALIDATION : ERROR_CODES.API_REQUEST;
217
+ handleError(err, code, { debug: program.opts().debug, exit: true, context: { command: 'plugin publish', executionId } });
218
+ }
219
+ finally {
220
+ rl?.close();
221
+ }
222
+ });
223
+ }
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaC1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvcHVibGlzaC1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDekMsT0FBTyxFQUFFLHNCQUFzQixFQUEyQixNQUFNLDRCQUE0QixDQUFDO0FBQzdGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlFLE9BQU8sRUFBa0IsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsbUJBQW1CLEVBQVksTUFBTSw0QkFBNEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNILE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUN4SCxPQUFPLEVBQUUsYUFBYSxF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QUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzdILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEdBQUcsR0FBRyxZQUFZLGVBQWUsSUFBSSxHQUFHLFlBQVkscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7WUFDdkksV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0gsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCByZWFkbGluZSBmcm9tICdyZWFkbGluZS9wcm9taXNlcyc7XG5pbXBvcnQgeyByZXNvbHZlQ2F0YWxvZ01ldGFkYXRhLCB0eXBlIFBsdWdpbkNhdGFsb2dFZGl0cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XG5pbXBvcnQgeyBQVUJMSVNIX1JFUVVJUkVEX0ZJRUxEUywgY2F0YWxvZ0lzc3VlcywgZm9ybWF0SGV1cmlzdGljLCBwcmludENhdGFsb2dSZXBvcnQsIHZhbGlkYXRlUGx1Z2luRGlyIH0gZnJvbSAnLi92YWxpZGF0ZS1wbHVnaW4uanMnO1xuaW1wb3J0IHsgRklMRV9TSVpFX0xJTUlUUywgZm9ybWF0RmlsZVNpemUgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyB0eXBlIEFwaUNsaWVudCB9IGZyb20gJy4uL3V0aWxzL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgY29sbGVjdENhdGFsb2dFZGl0cywgdHlwZSBBc2sgfSBmcm9tICcuLi91dGlscy9jYXRhbG9nLXByb21wdC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50LCBwcmludENvbW1hbmRIZWFkZXIsIHByaW50U3NsV2FybmluZywgd2l0aFNzbE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludEVycm9yLCBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgYnVpbGRQbHVnaW5JbWFnZSwgaGFzVG9vbCwgbG9jYWxJbWFnZVRhZywgcmVtb3ZlSW1hZ2UsIHNwYXduRXhlYywgdHlwZSBFeGVjIH0gZnJvbSAnLi4vdXRpbHMvcGx1Z2luLWRvY2tlci5qcyc7XG5pbXBvcnQgeyBTT1VSQ0VfTEFCRUxTLCBmb3JtYXRDYXRhbG9nVmFsdWUgfSBmcm9tICcuLi91dGlscy9wbHVnaW4tcGFja2FnZS5qcyc7XG5pbXBvcnQgeyBzY2FuUHJldmlldywgdHlwZSBTY2FuUHJldmlldyB9IGZyb20gJy4uL3V0aWxzL3BsdWdpbi1zY2FuLmpzJztcbmltcG9ydCB7IGNvbGxlY3RQbHVnaW5GaWxlcywgd3JpdGVaaXAgfSBmcm9tICcuLi91dGlscy9wbHVnaW4temlwLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQdWJsaXNoUGx1Z2luT3B0aW9ucyB7XG4gIGRpcjogc3RyaW5nO1xuICB5ZXM/OiBib29sZWFuO1xuICBtZXRhZGF0YT86IHN0cmluZztcbiAgaW1hZ2U/OiBzdHJpbmc7XG4gIHNraXBTY2FuPzogYm9vbGVhbjtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgdmVyaWZ5U3NsPzogYm9vbGVhbjtcbn1cblxuLyoqIEEgcHVibGlzaCByZWZ1c2VkIGJlZm9yZSBhbnl0aGluZyBpcyB1cGxvYWRlZC4gKi9cbmV4cG9ydCBjbGFzcyBQdWJsaXNoUHJlZmxpZ2h0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdQdWJsaXNoUHJlZmxpZ2h0RXJyb3InO1xuICB9XG59XG5cbi8qKiBVbndyYXAgdGhlIHBsYXRmb3JtJ3MgYHsgc3VjY2VzcywgZGF0YSB9YCBlbnZlbG9wZS4gKi9cbmNvbnN0IGRhdGFPZiA9IDxUPihib2R5OiB1bmtub3duKTogVCA9PiAoKGJvZHkgYXMgeyBkYXRhPzogVCB9KT8uZGF0YSA/PyBib2R5KSBhcyBUO1xuXG5pbnRlcmZhY2UgUHVibGlzaGVyU3RhdGUge1xuICBwdWJsaXNoZXI6IHsgaGFuZGxlOiBzdHJpbmcgfSB8IG51bGw7XG4gIGlzUm9vdE9yZzogYm9vbGVhbjtcbiAgdGVybXM6IHsgYWNjZXB0ZWQ6IGJvb2xlYW4gfTtcbiAgcHVibGlzaGluZ0VuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKiBUaGUgc2VydmVyLXNpZGUgcHJlcmVxdWlzaXRlcyBhIHB1Ymxpc2ggcmVxdWVzdCBuZWVkczogY2hlY2tlZCB1cCBmcm9udC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRDYW5QdWJsaXNoKGNsaWVudDogQXBpQ2xpZW50KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3RhdGUgPSBkYXRhT2Y8UHVibGlzaGVyU3RhdGU+KGF3YWl0IGNsaWVudC5nZXQoYCR7Y2xpZW50LmdldENvbmZpZygpLmFwaS5wbHVnaW5Vcmx9L3B1Ymxpc2hlcmApKTtcbiAgaWYgKCFzdGF0ZS5wdWJsaXNoaW5nRW5hYmxlZCkgdGhyb3cgbmV3IFB1Ymxpc2hQcmVmbGlnaHRFcnJvcignUHVibGlzaGluZyBpcyB0dXJuZWQgb2ZmIG9uIHRoaXMgaW5zdGFuY2UgKFBMVUdJTl9QVUJMSVNISU5HX0RJU0FCTEVEKScpO1xuICBpZiAoIXN0YXRlLmlzUm9vdE9yZykgdGhyb3cgbmV3IFB1Ymxpc2hQcmVmbGlnaHRFcnJvcignVGVhbXMgcHVibGlzaCB0aHJvdWdoIHRoZWlyIHJvb3Qgb3JnYW5pemF0aW9uOiBzd2l0Y2ggdG8gaXQgKFBVQkxJU0hFUl9ST09UX09SR19SRVFVSVJFRCknKTtcbiAgaWYgKCFzdGF0ZS5wdWJsaXNoZXIpIHRocm93IG5ldyBQdWJsaXNoUHJlZmxpZ2h0RXJyb3IoJ0NyZWF0ZSB5b3VyIHB1Ymxpc2hlciBwcm9maWxlIGZpcnN0OiBkYXNoYm9hcmQg4oaSIEJ1aWxkIOKGkiBQdWJsaXNoZXIgKFBVQkxJU0hFUl9SRVFVSVJFRCknKTtcbiAgaWYgKCFzdGF0ZS50ZXJtcy5hY2NlcHRlZCkgdGhyb3cgbmV3IFB1Ymxpc2hQcmVmbGlnaHRFcnJvcignQWNjZXB0IHRoZSBjdXJyZW50IHB1Ymxpc2hlciB0ZXJtcyBvbiB0aGUgUHVibGlzaGVyIHBhZ2UgKFBVQkxJU0hFUl9URVJNU19SRVFVSVJFRCknKTtcbiAgcmV0dXJuIHN0YXRlLnB1Ymxpc2hlci5oYW5kbGU7XG59XG5cbi8qKlxuICogVGhlIHNjYW4gcHJldmlldzogYnVpbGQgKG9yIHRha2UpIHRoZSBpbWFnZSwgU0JPTSBpdCB3aXRoIHN5ZnQgYW5kIHNjYW4gaXRcbiAqIHdpdGggZ3J5cGUuIE1pc3NpbmcgdG9vbHMgYXJlIGEgY2xlYXIgbm90aWNlLCBuZXZlciBhIHNpbGVudCBwYXNzOyBhXG4gKiBjcml0aWNhbCBmaW5kaW5nIHJlZnVzZXMgdGhlIHB1Ymxpc2ggKHRoZSBwbGF0Zm9ybSdzIGdhdGUgd291bGQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuU2NhblByZXZpZXcoZXhlYzogRXhlYywgb3B0czogeyBkaXI6IHN0cmluZzsgZG9ja2VyZmlsZTogc3RyaW5nOyBidWlsZFR5cGU6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGltYWdlPzogc3RyaW5nOyBidWlsZEFyZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0pOiBTY2FuUHJldmlldyB7XG4gIGlmICghb3B0cy5pbWFnZSAmJiBvcHRzLmJ1aWxkVHlwZSAhPT0gJ2J1aWxkX2ltYWdlJykge1xuICAgIHJldHVybiB7IHN0YXR1czogJ3VuYXZhaWxhYmxlJywgcmVhc29uOiBgYSAke29wdHMuYnVpbGRUeXBlfSBwbHVnaW4gaGFzIG5vIERvY2tlcmZpbGUgdG8gYnVpbGQ7IHBhc3MgLS1pbWFnZSB0byBzY2FuIHRoZSBpbWFnZSBpdCBydW5zYCB9O1xuICB9XG4gIGlmICghaGFzVG9vbChleGVjLCAnZG9ja2VyJykpIHJldHVybiB7IHN0YXR1czogJ3VuYXZhaWxhYmxlJywgcmVhc29uOiAnZG9ja2VyIGlzIG5vdCBhdmFpbGFibGUgdG8gYnVpbGQgdGhlIGltYWdlJyB9O1xuICBpZiAoIWhhc1Rvb2woZXhlYywgJ3N5ZnQnLCBbJ3ZlcnNpb24nXSkgfHwgIWhhc1Rvb2woZXhlYywgJ2dyeXBlJywgWyd2ZXJzaW9uJ10pKSB7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiAndW5hdmFpbGFibGUnLCByZWFzb246ICdzeWZ0IGFuZCBncnlwZSBhcmUgbm90IGJvdGggaW5zdGFsbGVkIChodHRwczovL2dpdGh1Yi5jb20vYW5jaG9yZS9zeWZ0LCBodHRwczovL2dpdGh1Yi5jb20vYW5jaG9yZS9ncnlwZSknIH07XG4gIH1cbiAgbGV0IGltYWdlID0gb3B0cy5pbWFnZTtcbiAgbGV0IGJ1aWx0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoIWltYWdlKSB7XG4gICAgICBidWlsdCA9IGxvY2FsSW1hZ2VUYWcob3B0cy5uYW1lLCBvcHRzLnZlcnNpb24pO1xuICAgICAgY29uc3QgZXJyb3IgPSBidWlsZFBsdWdpbkltYWdlKGV4ZWMsIHsgZGlyOiBvcHRzLmRpciwgZG9ja2VyZmlsZTogb3B0cy5kb2NrZXJmaWxlLCB0YWc6IGJ1aWx0LCBidWlsZEFyZ3M6IG9wdHMuYnVpbGRBcmdzIH0pO1xuICAgICAgaWYgKGVycm9yKSByZXR1cm4geyBzdGF0dXM6ICdmYWlsZWQnLCByZWFzb246IGVycm9yIH07XG4gICAgICBpbWFnZSA9IGJ1aWx0O1xuICAgIH1cbiAgICByZXR1cm4gc2NhblByZXZpZXcoZXhlYywgaW1hZ2UpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChidWlsdCkgcmVtb3ZlSW1hZ2UoZXhlYywgYnVpbHQpO1xuICB9XG59XG5cbi8qKiBQcmludCB0aGUgcmVzb2x2ZWQgbWV0YWRhdGEgd2l0aCBpdHMgcHJvdmVuYW5jZSAodGhlIGNhcmQgdGhlIGRpcmVjdG9yeSB3aWxsIHJlbmRlcikuICovXG5mdW5jdGlvbiBwcmludFJlc29sdmVkKHJlc29sdmVkOiBSZXR1cm5UeXBlPHR5cGVvZiByZXNvbHZlQ2F0YWxvZ01ldGFkYXRhPik6IHZvaWQge1xuICBwcmludFNlY3Rpb24oJ0NhdGFsb2cgbWV0YWRhdGEgdG8gc3VibWl0Jyk7XG4gIGZvciAoY29uc3QgW2ZpZWxkLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzb2x2ZWQudmFsdWVzKSkge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlc29sdmVkLnNvdXJjZXNbZmllbGQgYXMga2V5b2YgdHlwZW9mIHJlc29sdmVkLnNvdXJjZXNdO1xuICAgIGNvbnNvbGUubG9nKGAgICR7ZmllbGQucGFkRW5kKDE2KX0gJHtmb3JtYXRDYXRhbG9nVmFsdWUodmFsdWUpfSR7c291cmNlID8gYCAgWyR7U09VUkNFX0xBQkVMU1tzb3VyY2VdfV1gIDogJyd9YCk7XG4gIH1cbiAgY29uc29sZS5sb2coJycpO1xufVxuXG4vKipcbiAqIFRoZSB3aG9sZSBwdWJsaXNoIGZsb3csIG1pbnVzIHRoZSB0ZXJtaW5hbDogcHJlLWZsaWdodCAoc2VydmVyIGNoZWNrcywgbGludCxcbiAqIGNhdGFsb2cpLCBzY2FuIHByZXZpZXcsIHRoZSBhY2NlcHQtb3ItZWRpdCBzdGVwLCB0aGVuIG9uZSB1cGxvYWQgd2l0aFxuICogYHZpc2liaWxpdHk9cHVibGljYCArIGBwdWJsaXNoUmVxdWVzdD10cnVlYCAoKyB0aGUgZWRpdHMgYXMgYG1ldGFkYXRhYCkuXG4gKiBSZXR1cm5zIHRoZSBzZXJ2ZXIncyByZXNwb25zZSwgb3IgbnVsbCBmb3IgYSBkcnkgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuUHVibGlzaChcbiAgb3B0aW9uczogUHVibGlzaFBsdWdpbk9wdGlvbnMsXG4gIGRlcHM6IHsgZXhlYz86IEV4ZWM7IGFzaz86IEFzazsgY2xpZW50PzogKCkgPT4gQXBpQ2xpZW50IH0gPSB7fSxcbik6IFByb21pc2U8eyBlZGl0czogUGx1Z2luQ2F0YWxvZ0VkaXRzOyByZXNwb25zZTogdW5rbm93biB9PiB7XG4gIGNvbnN0IGV4ZWMgPSBkZXBzLmV4ZWMgPz8gc3Bhd25FeGVjO1xuXG4gIHByaW50U2VjdGlvbignUHJlLWZsaWdodCcsICdzZXJ2ZXIgY2hlY2tzICsgY2F0YWxvZyBsaW50ICsgaGV1cmlzdGljcycpO1xuICBjb25zdCByZXBvcnQgPSBhd2FpdCB2YWxpZGF0ZVBsdWdpbkRpcihvcHRpb25zLmRpciwgeyBsaW50OiB0cnVlIH0pO1xuICBjb25zdCB7IGludmFsaWQgfSA9IGNhdGFsb2dJc3N1ZXMocmVwb3J0LmZpZWxkcyk7XG4gIGNvbnN0IGxpbnRFcnJvcnMgPSByZXBvcnQubGludC5maWx0ZXIobCA9PiBsLmxldmVsID09PSAnZXJyb3InKTtcbiAgZm9yIChjb25zdCB3IG9mIHJlcG9ydC5saW50LmZpbHRlcihsID0+IGwubGV2ZWwgPT09ICd3YXJuaW5nJykpIHByaW50V2FybmluZyh3Lm1lc3NhZ2UpO1xuICBmb3IgKGNvbnN0IGggb2YgcmVwb3J0LmhldXJpc3RpY3MuZmlsdGVyKHggPT4geC5zZXZlcml0eSA9PT0gJ21lZGl1bScpKSBwcmludFdhcm5pbmcoZm9ybWF0SGV1cmlzdGljKGgpKTtcbiAgY29uc3QgYmxvY2tpbmcgPSBbXG4gICAgLi4ucmVwb3J0LnByb2JsZW1zLFxuICAgIC4uLmxpbnRFcnJvcnMubWFwKGwgPT4gbC5tZXNzYWdlKSxcbiAgICAuLi5yZXBvcnQuaGV1cmlzdGljcy5maWx0ZXIoeCA9PiB4LnNldmVyaXR5ID09PSAnaGlnaCcpLm1hcChmb3JtYXRIZXVyaXN0aWMpLFxuICBdO1xuICBwcmludENhdGFsb2dSZXBvcnQocmVwb3J0LmZpZWxkcyk7XG4gIGlmIChibG9ja2luZy5sZW5ndGgpIHtcbiAgICBmb3IgKGNvbnN0IHAgb2YgYmxvY2tpbmcpIHByaW50RXJyb3IoYCAg4oCiICR7cH1gKTtcbiAgICB0aHJvdyBuZXcgUHVibGlzaFByZWZsaWdodEVycm9yKGBQcmUtZmxpZ2h0IGZhaWxlZCB3aXRoICR7YmxvY2tpbmcubGVuZ3RofSBwcm9ibGVtKHMpYCk7XG4gIH1cbiAgcHJpbnRTdWNjZXNzKCdQcmUtZmxpZ2h0IHBhc3NlZCcpO1xuXG4gIGNvbnN0IHNwZWMgPSByZXBvcnQucGtnLnNwZWMhO1xuICBwcmludFNlY3Rpb24oJ1NjYW4gcHJldmlldycsICdzeWZ0IFNCT00gKyBncnlwZScpO1xuICBpZiAob3B0aW9ucy5za2lwU2Nhbikge1xuICAgIHByaW50V2FybmluZygnU2NhbiBwcmV2aWV3IHNraXBwZWQgKC0tc2tpcC1zY2FuKS4gVGhlIHBsYXRmb3JtIHNjYW5zIHRoZSBpbWFnZSBhZnRlciB0aGUgYnVpbGQ7IGEgY3JpdGljYWwgdnVsbmVyYWJpbGl0eSBmYWlscyB0aGUgcHVibGlzaCBnYXRlLicpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNjYW4gPSBydW5TY2FuUHJldmlldyhleGVjLCB7XG4gICAgICBkaXI6IHJlcG9ydC5wa2cuZGlyLFxuICAgICAgZG9ja2VyZmlsZTogcGF0aC5qb2luKHJlcG9ydC5wa2cuZGlyLCByZXBvcnQucGtnLmRvY2tlcmZpbGVOYW1lKSxcbiAgICAgIGJ1aWxkVHlwZTogcmVwb3J0LnBrZy5idWlsZFR5cGUsXG4gICAgICBuYW1lOiBTdHJpbmcoc3BlYy5uYW1lKSxcbiAgICAgIHZlcnNpb246IFN0cmluZyhzcGVjLnZlcnNpb24pLFxuICAgICAgaW1hZ2U6IG9wdGlvbnMuaW1hZ2UsXG4gICAgICBidWlsZEFyZ3M6IHNwZWMuYnVpbGRBcmdzLFxuICAgIH0pO1xuICAgIGlmIChzY2FuLnN0YXR1cyA9PT0gJ3VuYXZhaWxhYmxlJykge1xuICAgICAgcHJpbnRXYXJuaW5nKGBTY2FuIHByZXZpZXcgTk9UIHJ1bjogJHtzY2FuLnJlYXNvbn0uIFRoZSBwbGF0Zm9ybSBzdGlsbCBzY2FucyB0aGUgaW1hZ2UgYWZ0ZXIgdGhlIGJ1aWxkLCBhbmQgYSBjcml0aWNhbCB2dWxuZXJhYmlsaXR5IGZhaWxzIHRoZSBwdWJsaXNoIGdhdGUuYCk7XG4gICAgfSBlbHNlIGlmIChzY2FuLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgIHRocm93IG5ldyBQdWJsaXNoUHJlZmxpZ2h0RXJyb3IoYFNjYW4gcHJldmlldyBmYWlsZWQ6ICR7c2Nhbi5yZWFzb259YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByaW50S2V5VmFsdWUoT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNjYW4uY291bnRzKS5tYXAoKFtrLCB2XSkgPT4gW2ssIFN0cmluZyh2KV0pKSk7XG4gICAgICBpZiAoc2Nhbi5jcml0aWNhbC5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHNjYW4uY3JpdGljYWwpIHByaW50RXJyb3IoYCAg4oCiICR7Y31gKTtcbiAgICAgICAgdGhyb3cgbmV3IFB1Ymxpc2hQcmVmbGlnaHRFcnJvcihgJHtzY2FuLmNyaXRpY2FsLmxlbmd0aH0gY3JpdGljYWwgdnVsbmVyYWJpbGl0JHtzY2FuLmNyaXRpY2FsLmxlbmd0aCA9PT0gMSA/ICd5JyA6ICdpZXMnfTogdGhlIHB1Ymxpc2ggZ2F0ZSB3b3VsZCByZWZ1c2UgdGhpcyB2ZXJzaW9uYCk7XG4gICAgICB9XG4gICAgICBwcmludFN1Y2Nlc3MoJ05vIGNyaXRpY2FsIHZ1bG5lcmFiaWxpdGllcycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpbnZhbGlkLmxlbmd0aCkge1xuICAgIHByaW50V2FybmluZyhgRGV0ZWN0ZWQgdmFsdWVzIHRoYXQgYXJlIGludmFsaWQgYW5kIHdvdWxkIGJlIGJsYW5rOiAke2ludmFsaWQubWFwKGYgPT4gZi5maWVsZCkuam9pbignLCAnKX0g4oCUIGVkaXQgdGhlbSBiZWxvdyBvciBmaXggdGhlIHBhY2thZ2VgKTtcbiAgfVxuICBwcmludFNlY3Rpb24oJ0NhdGFsb2cgZGV0YWlscycsICdhY2NlcHQgb3IgZWRpdCBlYWNoIGRldGVjdGVkIHZhbHVlJyk7XG4gIGNvbnN0IGVkaXRzID0gYXdhaXQgY29sbGVjdENhdGFsb2dFZGl0cyhyZXBvcnQuZmllbGRzLCB7IHllczogb3B0aW9ucy55ZXMsIG1ldGFkYXRhRmlsZTogb3B0aW9ucy5tZXRhZGF0YSwgYXNrOiBkZXBzLmFzayB9KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlQ2F0YWxvZ01ldGFkYXRhKHJlcG9ydC5maWVsZHMsIGVkaXRzKTtcbiAgcHJpbnRSZXNvbHZlZChyZXNvbHZlZCk7XG4gIGNvbnN0IG1pc3NpbmcgPSBbLi4uUFVCTElTSF9SRVFVSVJFRF9GSUVMRFNdLmZpbHRlcihmID0+IHJlc29sdmVkLnZhbHVlc1tmXSA9PT0gbnVsbCB8fCByZXNvbHZlZC52YWx1ZXNbZl0gPT09IHVuZGVmaW5lZCk7XG4gIGlmIChtaXNzaW5nLmxlbmd0aCkgdGhyb3cgbmV3IFB1Ymxpc2hQcmVmbGlnaHRFcnJvcihgQSBwdWJsaXNoIHJlcXVlc3QgbmVlZHM6ICR7bWlzc2luZy5qb2luKCcsICcpfSAoYWRkIHRoZW0gdG8gdGhlIHBhY2thZ2Ugb3Igc3VwcGx5IHRoZW0gd2l0aCAtLW1ldGFkYXRhKWApO1xuXG4gIGNvbnN0IHppcCA9IHdyaXRlWmlwKGNvbGxlY3RQbHVnaW5GaWxlcyhyZXBvcnQucGtnLmRpciwgeyBpbmNsdWRlSW1hZ2VUYXI6IHJlcG9ydC5wa2cuYnVpbGRUeXBlID09PSAncHJlYnVpbHQnIH0pKTtcbiAgaWYgKHppcC5sZW5ndGggPiBGSUxFX1NJWkVfTElNSVRTLlBMVUdJTikgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgUGx1Z2luIHBhY2thZ2UgZXhjZWVkcyAke2Zvcm1hdEZpbGVTaXplKEZJTEVfU0laRV9MSU1JVFMuUExVR0lOKX1gKTtcbiAgcHJpbnRJbmZvKCdQYWNrYWdlJywgeyBzaXplOiBmb3JtYXRGaWxlU2l6ZSh6aXAubGVuZ3RoKSwgbWV0YWRhdGFFZGl0czogT2JqZWN0LmtleXMoZWRpdHMpIH0pO1xuXG4gIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgIHByaW50U3VjY2VzcygnRHJ5IHJ1bjogbm90aGluZyB1cGxvYWRlZCcpO1xuICAgIHJldHVybiB7IGVkaXRzLCByZXNwb25zZTogbnVsbCB9O1xuICB9XG4gIGlmICghb3B0aW9ucy55ZXMgJiYgZGVwcy5hc2spIHtcbiAgICBjb25zdCBhbnN3ZXIgPSAoYXdhaXQgZGVwcy5hc2soYFVwbG9hZCAke1N0cmluZyhzcGVjLm5hbWUpfUAke1N0cmluZyhzcGVjLnZlcnNpb24pfSBhcyBwdWJsaWMgYW5kIHJlcXVlc3QgcHVibGlzaGluZz8gW3kvTl0gYCkpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChhbnN3ZXIgIT09ICd5JyAmJiBhbnN3ZXIgIT09ICd5ZXMnKSB0aHJvdyBuZXcgUHVibGlzaFByZWZsaWdodEVycm9yKCdDYW5jZWxsZWQg4oCUIG5vdGhpbmcgdXBsb2FkZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGNsaWVudCA9IChkZXBzLmNsaWVudCA/PyAoKCkgPT4gY3JlYXRlQXV0aGVudGljYXRlZENsaWVudChvcHRpb25zKSkpKCk7XG4gIGNvbnN0IGhhbmRsZSA9IGF3YWl0IGFzc2VydENhblB1Ymxpc2goY2xpZW50KTtcbiAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICBmb3JtLmFwcGVuZCgncGx1Z2luJywgemlwLCB7IGZpbGVuYW1lOiBgJHtTdHJpbmcoc3BlYy5uYW1lKX0tJHtTdHJpbmcoc3BlYy52ZXJzaW9uKX0uemlwYCwgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi96aXAnIH0pO1xuICBmb3JtLmFwcGVuZCgndmlzaWJpbGl0eScsICdwdWJsaWMnKTtcbiAgZm9ybS5hcHBlbmQoJ3B1Ymxpc2hSZXF1ZXN0JywgJ3RydWUnKTtcbiAgaWYgKE9iamVjdC5rZXlzKGVkaXRzKS5sZW5ndGgpIGZvcm0uYXBwZW5kKCdtZXRhZGF0YScsIEpTT04uc3RyaW5naWZ5KGVkaXRzKSk7XG4gIHByaW50U2VjdGlvbignVXBsb2FkaW5nJywgYGFzIEAke2hhbmRsZX1gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBkYXRhT2Y8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGF3YWl0IGNsaWVudC5wb3N0Rm9ybShjbGllbnQuZ2V0Q29uZmlnKCkuYXBpLnBsdWdpblVwbG9hZFVybCwgZm9ybSkpO1xuICByZXR1cm4geyBlZGl0cywgcmVzcG9uc2UgfTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBgcGx1Z2luIHB1Ymxpc2hgIOKAlCBwcmUtZmxpZ2h0ICh0aGUgc2VydmVyJ3Mgc2NoZW1hcywgdGhlIGNhdGFsb2cnc1xuICogRG9ja2VyZmlsZSBydWxlcywgcHVibGlzaC1yZXF1aXJlZCBtZXRhZGF0YSksIGEgbG9jYWwgc2NhbiBwcmV2aWV3LCB0aGVcbiAqIGNhdGFsb2cgYWNjZXB0LW9yLWVkaXQgc3RlcCwgdGhlbiB0aGUgdXBsb2FkIHRoYXQgc3VibWl0cyBhIHB1Ymxpc2ggcmVxdWVzdFxuICogb25jZSB0aGUgdmVyc2lvbiBpcyBidWlsdC5cbiAqXG4gKiBVc2FnZTpcbiAqICAgcGlwZWxpbmUtbWFuYWdlciBwbHVnaW4gcHVibGlzaCAtLWRpciAuL215LWxpbnRlclxuICogICBwaXBlbGluZS1tYW5hZ2VyIHBsdWdpbiBwdWJsaXNoIC0tZGlyIC4vbXktbGludGVyIC0teWVzXG4gKiAgIHBpcGVsaW5lLW1hbmFnZXIgcGx1Z2luIHB1Ymxpc2ggLS1kaXIgLi9teS1saW50ZXIgLS1tZXRhZGF0YSBjYXRhbG9nLnlhbWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hQbHVnaW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ3B1Ymxpc2gnKVxuICAgIC5kZXNjcmlwdGlvbignUHJlLWZsaWdodCwgc2Nhbi1wcmV2aWV3IGFuZCB1cGxvYWQgYSBwbHVnaW4sIHRoZW4gcmVxdWVzdCBpdHMgbGlzdGluZyBpbiB0aGUgcGx1Z2luIGVjb3N5c3RlbScpXG4gICAgLm9wdGlvbignLS1kaXIgPHBhdGg+JywgJ1BsdWdpbiBkaXJlY3RvcnknLCAnLicpXG4gICAgLm9wdGlvbignLXksIC0teWVzJywgJ0FjY2VwdCBldmVyeSBkZXRlY3RlZCBjYXRhbG9nIHZhbHVlIGFuZCBza2lwIHRoZSBjb25maXJtYXRpb24nLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLW1ldGFkYXRhIDxmaWxlPicsICdDYXRhbG9nIGVkaXRzIChZQU1ML0pTT046IHN1bW1hcnksIGRlc2NyaXB0aW9uLCBsaW5rcywgaWNvbiwg4oCmKTsgbm8gcHJvbXB0JylcbiAgICAub3B0aW9uKCctLWltYWdlIDxyZWY+JywgJ1NjYW4gdGhpcyBpbWFnZSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIHRoZSBwbHVnaW5cXCdzIERvY2tlcmZpbGUnKVxuICAgIC5vcHRpb24oJy0tc2tpcC1zY2FuJywgJ1NraXAgdGhlIGxvY2FsIHNjYW4gcHJldmlldyAodGhlIHBsYXRmb3JtIHN0aWxsIHNjYW5zKScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdSdW4gZXZlcnkgbG9jYWwgc3RlcCwgdXBsb2FkIG5vdGhpbmcnLCBmYWxzZSkpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9uczogUHVibGlzaFBsdWdpbk9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdQdWJsaXNoIFBsdWdpbicpO1xuICAgICAgcHJpbnRTc2xXYXJuaW5nKG9wdGlvbnMudmVyaWZ5U3NsKTtcbiAgICAgIGNvbnN0IGludGVyYWN0aXZlID0gQm9vbGVhbihwcm9jZXNzLnN0ZGluLmlzVFRZICYmIHByb2Nlc3Muc3Rkb3V0LmlzVFRZKTtcbiAgICAgIGNvbnN0IHJsID0gaW50ZXJhY3RpdmUgPyByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogcHJvY2Vzcy5zdGRpbiwgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCB9KSA6IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHJlc3BvbnNlIH0gPSBhd2FpdCBydW5QdWJsaXNoKG9wdGlvbnMsIHsgYXNrOiBybCA/IChxOiBzdHJpbmcpID0+IHJsLnF1ZXN0aW9uKHEpIDogdW5kZWZpbmVkIH0pO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHIgPSByZXNwb25zZSBhcyB7IHBsdWdpbk5hbWU/OiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmc7IHBsdWdpbklkPzogc3RyaW5nOyBwdWJsaXNoUmVxdWVzdD86IHsgcmVxdWVzdElkPzogc3RyaW5nOyBzdGF0dXM/OiBzdHJpbmcgfSB9O1xuICAgICAgICBwcmludFNlY3Rpb24oJ1N1Ym1pdHRlZCcpO1xuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICBQbHVnaW46IGAke3IucGx1Z2luTmFtZSA/PyAnPyd9QCR7ci52ZXJzaW9uID8/ICc/J31gLFxuICAgICAgICAgIC4uLihyLnB1Ymxpc2hSZXF1ZXN0Py5yZXF1ZXN0SWRcbiAgICAgICAgICAgID8geyAnUHVibGlzaCByZXF1ZXN0JzogYCR7ci5wdWJsaXNoUmVxdWVzdC5yZXF1ZXN0SWR9ICgke3IucHVibGlzaFJlcXVlc3Quc3RhdHVzID8/ICdzdWJtaXR0ZWQnfSlgIH1cbiAgICAgICAgICAgIDogeyAnUHVibGlzaCByZXF1ZXN0JzogJ3N1Ym1pdHRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGJ1aWxkIGNvbXBsZXRlcycgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBwcmludFN1Y2Nlc3MoJ1RyYWNrIHRoZSByZXF1ZXN0IG9uIHRoZSBQdWJsaXNoZXIgcGFnZSDihpIgUmVxdWVzdHMgKG9yIEdFVCAvYXBpL3BsdWdpbnMvcHVibGlzaC1yZXF1ZXN0cyknLCB7IGV4ZWN1dGlvbklkIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBlcnIgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IgfHwgZXJyIGluc3RhbmNlb2YgUHVibGlzaFByZWZsaWdodEVycm9yID8gRVJST1JfQ09ERVMuVkFMSURBVElPTiA6IEVSUk9SX0NPREVTLkFQSV9SRVFVRVNUO1xuICAgICAgICBoYW5kbGVFcnJvcihlcnIsIGNvZGUsIHsgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLCBleGl0OiB0cnVlLCBjb250ZXh0OiB7IGNvbW1hbmQ6ICdwbHVnaW4gcHVibGlzaCcsIGV4ZWN1dGlvbklkIH0gfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBybD8uY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
@@ -2,7 +2,7 @@ import { Command } from 'commander';
2
2
  /**
3
3
  * Registers the `redrive-events` command with the CLI program.
4
4
  *
5
- * Manual fallback for the events Lambda's self-healing redrive (Phase 3): calls
5
+ * Manual fallback for the events Lambda's self-healing redrive: calls
6
6
  * SQS `StartMessageMoveTask(DLQ → main queue)` for the `pipeline-builder-events`
7
7
  * stack, moving messages that exhausted their receive count in the dead-letter
8
8
  * queue back onto `pipeline-builder-events` so the ingestion Lambda re-processes
@@ -13,7 +13,7 @@ const STACK_NAME = EVENTS_STACK_NAME;
13
13
  /**
14
14
  * Registers the `redrive-events` command with the CLI program.
15
15
  *
16
- * Manual fallback for the events Lambda's self-healing redrive (Phase 3): calls
16
+ * Manual fallback for the events Lambda's self-healing redrive: calls
17
17
  * SQS `StartMessageMoveTask(DLQ → main queue)` for the `pipeline-builder-events`
18
18
  * stack, moving messages that exhausted their receive count in the dead-letter
19
19
  * queue back onto `pipeline-builder-events` so the ingestion Lambda re-processes
@@ -124,4 +124,4 @@ export function redriveEvents(program) {
124
124
  }
125
125
  });
126
126
  }
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkcml2ZS1ldmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvcmVkcml2ZS1ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RixPQUFPLEVBQ0wsU0FBUyxFQUNULHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0IsMkJBQTJCLEdBQzVCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUxSCw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFnQjtJQUM1QyxpQkFBaUIsQ0FDZixnQkFBZ0IsQ0FBQyxPQUFPO1NBQ3JCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztTQUN6QixXQUFXLENBQUMsK0hBQStILENBQUMsQ0FBQyxDQUNqSjtTQUNFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7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QywwRkFBMEYsQ0FBQyxDQUFDO1FBRXhHLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVyxFQUFFO2dCQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTthQUN2RSxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uQ2xpZW50LCBEZXNjcmliZVN0YWNrc0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHtcbiAgU1FTQ2xpZW50LFxuICBHZXRRdWV1ZUF0dHJpYnV0ZXNDb21tYW5kLFxuICBMaXN0TWVzc2FnZU1vdmVUYXNrc0NvbW1hbmQsXG4gIFN0YXJ0TWVzc2FnZU1vdmVUYXNrQ29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNxcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IEVWRU5UU19TVEFDS19OQU1FIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgYXBwbHlBd3NQcm9maWxlLCByZXNvbHZlQXdzUmVnaW9uIH0gZnJvbSAnLi4vdXRpbHMvYXdzLWVudi5qcyc7XG5pbXBvcnQgeyBwcmludENvbW1hbmRIZWFkZXIsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgaGFuZGxlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbi8vIENGTiBzdGFjayB0aGF0IHNldHVwLWV2ZW50cyBkZXBsb3lzIOKAlCB0aGUgcXVldWVzIGxpdmUgaGVyZS5cbmNvbnN0IFNUQUNLX05BTUUgPSBFVkVOVFNfU1RBQ0tfTkFNRTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGByZWRyaXZlLWV2ZW50c2AgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBNYW51YWwgZmFsbGJhY2sgZm9yIHRoZSBldmVudHMgTGFtYmRhJ3Mgc2VsZi1oZWFsaW5nIHJlZHJpdmUgKFBoYXNlIDMpOiBjYWxsc1xuICogU1FTIGBTdGFydE1lc3NhZ2VNb3ZlVGFzayhETFEg4oaSIG1haW4gcXVldWUpYCBmb3IgdGhlIGBwaXBlbGluZS1idWlsZGVyLWV2ZW50c2BcbiAqIHN0YWNrLCBtb3ZpbmcgbWVzc2FnZXMgdGhhdCBleGhhdXN0ZWQgdGhlaXIgcmVjZWl2ZSBjb3VudCBpbiB0aGUgZGVhZC1sZXR0ZXJcbiAqIHF1ZXVlIGJhY2sgb250byBgcGlwZWxpbmUtYnVpbGRlci1ldmVudHNgIHNvIHRoZSBpbmdlc3Rpb24gTGFtYmRhIHJlLXByb2Nlc3Nlc1xuICogdGhlbS4gSWRlbXBvdGVudCBpbmdlc3QgKGRlZHVwZSBvbiBgaWRlbXBvdGVuY3lLZXlgKSBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcuXG4gKlxuICogVGhlIExhbWJkYSBhbHJlYWR5IGRvZXMgdGhpcyBhdXRvbWF0aWNhbGx5IGFmdGVyIGEgc3VjY2Vzc2Z1bCBiYXRjaDsgdGhpc1xuICogY29tbWFuZCBpcyB0aGUgb3BlcmF0b3IgZXNjYXBlIGhhdGNoIHdoZW4gdGhlIExhbWJkYSBpcyBkb3duIG9yIHRoZSBETFEgbmVlZHNcbiAqIHRvIGJlIGRyYWluZWQgb24gZGVtYW5kLiBMaWtlIHRoZSBMYW1iZGEsIGl0IHJlZnVzZXMgdG8gc3RhcnQgYSBzZWNvbmQgbW92ZVxuICogdGFzayB3aGlsZSBvbmUgaXMgYWxyZWFkeSBhY3RpdmUgKFNRUyBhbGxvd3Mgb25seSBvbmUgaW4tZmxpZ2h0IHRhc2sgcGVyXG4gKiBzb3VyY2UgcXVldWUgYW55d2F5KS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgYmFzaFxuICogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSByZWRyaXZlLWV2ZW50cyAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgcmVkcml2ZS1ldmVudHMgLS1yZWdpb24gdXMtZWFzdC0xIC0tcHJvZmlsZSBwcm9kXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZHJpdmVFdmVudHMocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoUHJvZmlsZU9wdGlvbihcbiAgICB3aXRoUmVnaW9uT3B0aW9uKHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdyZWRyaXZlLWV2ZW50cycpXG4gICAgICAuZGVzY3JpcHRpb24oJ1JlZHJpdmUgZGVhZC1sZXR0ZXJlZCBDb2RlUGlwZWxpbmUgZXZlbnRzIGJhY2sgb250byB0aGUgaW5nZXN0aW9uIHF1ZXVlIChtYW51YWwgZmFsbGJhY2sgZm9yIHRoZSBMYW1iZGEgc2VsZi1oZWFsaW5nIHJlZHJpdmUpJykpLFxuICApXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1JlZHJpdmUgRXZlbnRzJyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlc29sdmVBd3NSZWdpb24ob3B0aW9ucy5yZWdpb24pO1xuICAgICAgICAvLyBIb25vciAtLXByb2ZpbGUgZm9yIHRoZSBTREsgY2xpZW50cyBiZWxvdyAobWlycm9ycyBzZXR1cC1ldmVudHMpIOKAlCB3aXRob3V0XG4gICAgICAgIC8vIHRoaXMgdGhlIFNESyBoaXRzIHRoZSBERUZBVUxUIGFjY291bnQgd2hpbGUgYW55IGFjY29tcGFueWluZyBDTEkgY2FsbFxuICAgICAgICAvLyBob25vcmVkIC0tcHJvZmlsZSAoc2lsZW50IHNwbGl0LWJyYWluKS5cbiAgICAgICAgYXBwbHlBd3NQcm9maWxlKG9wdGlvbnMucHJvZmlsZSk7XG5cbiAgICAgICAgcHJpbnRJbmZvKCdQYXJhbWV0ZXJzJywgeyBzdGFjazogU1RBQ0tfTkFNRSwgcmVnaW9uIH0pO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogcmVzb2x2ZSB0aGUgcXVldWUgVVJMcyBmcm9tIHRoZSBzdGFjayBvdXRwdXRzIChzb3VyY2Ugb2YgdHJ1dGgg4oCUXG4gICAgICAgIC8vIG5vIGhhcmRjb2RlZCBxdWV1ZSBuYW1lcykuIHNldHVwLWV2ZW50cyBtdXN0IGhhdmUgcnVuIGZpcnN0LlxuICAgICAgICBwcmludFNlY3Rpb24oJ1Jlc29sdmUgUXVldWVzJyk7XG5cbiAgICAgICAgY29uc3QgY2ZuQ2xpZW50ID0gbmV3IENsb3VkRm9ybWF0aW9uQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgICAgICBjb25zdCBkZXNjcmliZVJlc3VsdCA9IGF3YWl0IGNmbkNsaWVudC5zZW5kKG5ldyBEZXNjcmliZVN0YWNrc0NvbW1hbmQoeyBTdGFja05hbWU6IFNUQUNLX05BTUUgfSkpO1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gZGVzY3JpYmVSZXN1bHQuU3RhY2tzPy5bMF0/Lk91dHB1dHMgPz8gW107XG4gICAgICAgIGNvbnN0IG91dHB1dE1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhvdXRwdXRzLm1hcChvID0+IFtvLk91dHB1dEtleSA/PyAnJywgby5PdXRwdXRWYWx1ZSA/PyAnJ10pKTtcblxuICAgICAgICBjb25zdCBldmVudFF1ZXVlQXJuID0gb3V0cHV0TWFwLkV2ZW50UXVldWVBcm47XG4gICAgICAgIGNvbnN0IGV2ZW50UXVldWVVcmwgPSBvdXRwdXRNYXAuRXZlbnRRdWV1ZVVybDtcbiAgICAgICAgY29uc3QgZGxxVXJsID0gb3V0cHV0TWFwLkRlYWRMZXR0ZXJRdWV1ZVVybDtcblxuICAgICAgICBpZiAoIWV2ZW50UXVldWVBcm4gfHwgIWRscVVybCkge1xuICAgICAgICAgIHByaW50RXJyb3IoYFN0YWNrICR7U1RBQ0tfTkFNRX0gaXMgbWlzc2luZyBleHBlY3RlZCBvdXRwdXRzYCwge1xuICAgICAgICAgICAgaGludDogJ1J1biBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzZXR1cC1ldmVudHNgIGZpcnN0LicsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFjayBvdXRwdXRzIEV2ZW50UXVldWVBcm4gLyBEZWFkTGV0dGVyUXVldWVVcmwgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcXMgPSBuZXcgU1FTQ2xpZW50KHsgcmVnaW9uIH0pO1xuXG4gICAgICAgIC8vIFRoZSBzdGFjayBleHBvc2VzIHRoZSBETFEgVVJMIGJ1dCBub3QgaXRzIEFSTiDigJQgU3RhcnRNZXNzYWdlTW92ZVRhc2sgbmVlZHNcbiAgICAgICAgLy8gdGhlIHNvdXJjZSBBUk4sIHNvIHJlc29sdmUgaXQgZnJvbSB0aGUgcXVldWUncyBhdHRyaWJ1dGVzLlxuICAgICAgICBjb25zdCBkbHFBdHRycyA9IGF3YWl0IHNxcy5zZW5kKG5ldyBHZXRRdWV1ZUF0dHJpYnV0ZXNDb21tYW5kKHtcbiAgICAgICAgICBRdWV1ZVVybDogZGxxVXJsLFxuICAgICAgICAgIEF0dHJpYnV0ZU5hbWVzOiBbJ1F1ZXVlQXJuJywgJ0FwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlcyddLFxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGRscUFybiA9IGRscUF0dHJzLkF0dHJpYnV0ZXM/LlF1ZXVlQXJuO1xuICAgICAgICBjb25zdCBkbHFEZXB0aCA9IE51bWJlcihkbHFBdHRycy5BdHRyaWJ1dGVzPy5BcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXMgPz8gJzAnKTtcblxuICAgICAgICBpZiAoIWRscUFybikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHJlc29sdmUgdGhlIERMUSBBUk4gZnJvbSAke2RscVVybH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICdTb3VyY2UgKERMUSknOiBkbHFBcm4sXG4gICAgICAgICAgJ0Rlc3RpbmF0aW9uIChxdWV1ZSknOiBldmVudFF1ZXVlQXJuLFxuICAgICAgICAgICdETFEgZGVwdGggKGFwcHJveCknOiBTdHJpbmcoZGxxRGVwdGgpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOb3RoaW5nIHRvIG1vdmUg4oCUIGJhaWwgZWFybHkgc28gdGhlIG9wZXJhdG9yIGdldHMgYSBjbGVhciBzaWduYWwgaW5zdGVhZFxuICAgICAgICAvLyBvZiBhIG5vLW9wIHRhc2suXG4gICAgICAgIGlmIChkbHFEZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHByaW50U3VjY2VzcygnRGVhZC1sZXR0ZXIgcXVldWUgaXMgZW1wdHkg4oCUIG5vdGhpbmcgdG8gcmVkcml2ZS4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDI6IHJlZnVzZSB0byBzdGFjayBtb3ZlIHRhc2tzLiBTUVMgcGVybWl0cyBvbmx5IG9uZSBpbi1mbGlnaHQgbW92ZVxuICAgICAgICAvLyB0YXNrIHBlciBzb3VyY2UgcXVldWU7IHN1cmZhY2UgYW55IGFjdGl2ZSBvbmUgaW5zdGVhZCBvZiBlcnJvcmluZyBvdXQuXG4gICAgICAgIHByaW50U2VjdGlvbignUmVkcml2ZScpO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IGF3YWl0IHNxcy5zZW5kKG5ldyBMaXN0TWVzc2FnZU1vdmVUYXNrc0NvbW1hbmQoeyBTb3VyY2VBcm46IGRscUFybiB9KSk7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmcgPSAoYWN0aXZlLlJlc3VsdHMgPz8gW10pLmZpbmQodCA9PiB0LlN0YXR1cyA9PT0gJ1JVTk5JTkcnKTtcbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ0EgbWVzc2FnZSBtb3ZlIHRhc2sgaXMgYWxyZWFkeSBydW5uaW5nIGZvciB0aGlzIERMUSDigJQgbm90IHN0YXJ0aW5nIGFub3RoZXIuJywge1xuICAgICAgICAgICAgdGFza0hhbmRsZTogcnVubmluZy5UYXNrSGFuZGxlLFxuICAgICAgICAgICAgYXBwcm94TW92ZWRTb0ZhcjogcnVubmluZy5BcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXNNb3ZlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDM6IHN0YXJ0IHRoZSBtb3ZlIChETFEg4oaSIG1haW4gcXVldWUpLiBEZXN0aW5hdGlvbkFybiBpcyBzZXQgZXhwbGljaXRseVxuICAgICAgICAvLyBldmVuIHRob3VnaCBTUVMgd291bGQgZGVmYXVsdCB0byB0aGUgb3JpZ2luYWwgc291cmNlIHF1ZXVlIOKAlCB0aGUgbWFpblxuICAgICAgICAvLyBpbmdlc3Rpb24gcXVldWUgaXMgZXhhY3RseSB0aGF0IHRhcmdldC5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhd2FpdCBzcXMuc2VuZChuZXcgU3RhcnRNZXNzYWdlTW92ZVRhc2tDb21tYW5kKHtcbiAgICAgICAgICBTb3VyY2VBcm46IGRscUFybixcbiAgICAgICAgICBEZXN0aW5hdGlvbkFybjogZXZlbnRRdWV1ZUFybixcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRTZWN0aW9uKCdSZWRyaXZlIFN0YXJ0ZWQnKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ1Rhc2sgSGFuZGxlJzogc3RhcnQuVGFza0hhbmRsZSA/PyAnKG5vbmUgcmV0dXJuZWQpJyxcbiAgICAgICAgICAnU291cmNlIChETFEpJzogZGxxQXJuLFxuICAgICAgICAgICdEZXN0aW5hdGlvbiAocXVldWUpJzogZXZlbnRRdWV1ZVVybCB8fCBldmVudFF1ZXVlQXJuLFxuICAgICAgICAgICdNZXNzYWdlcyBxdWV1ZWQnOiBTdHJpbmcoZGxxRGVwdGgpLFxuICAgICAgICAgICdTdGF0dXMnOiAn4pyTIFN0YXJ0ZWQnLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50U3VjY2VzcygnUmVkcml2ZSB0YXNrIHN0YXJ0ZWQuIE1lc3NhZ2VzIHdpbGwgcmUtZmxvdyB0aHJvdWdoIHRoZSBpbmdlc3Rpb24gTGFtYmRhLicpO1xuICAgICAgICBwcmludEluZm8oJ0lkZW1wb3RlbnQgaW5nZXN0IGRlZHVwZXMgb24gaWRlbXBvdGVuY3lLZXksIHNvIHJlLWRyaXZlbiBldmVudHMgYXJlIG5vdCBkb3VibGUtY291bnRlZC4nKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAncmVkcml2ZS1ldmVudHMnLCBleGVjdXRpb25JZCwgc3RhY2s6IFNUQUNLX05BTUUgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59XG4iXX0=
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkcml2ZS1ldmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvcmVkcml2ZS1ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RixPQUFPLEVBQ0wsU0FBUyxFQUNULHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0IsMkJBQTJCLEdBQzVCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUxSCw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFnQjtJQUM1QyxpQkFBaUIsQ0FDZixnQkFBZ0IsQ0FBQyxPQUFPO1NBQ3JCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztTQUN6QixXQUFXLENBQUMsK0hBQStILENBQUMsQ0FBQyxDQUNqSjtTQUNFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7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QywwRkFBMEYsQ0FBQyxDQUFDO1FBRXhHLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVyxFQUFFO2dCQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTthQUN2RSxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uQ2xpZW50LCBEZXNjcmliZVN0YWNrc0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHtcbiAgU1FTQ2xpZW50LFxuICBHZXRRdWV1ZUF0dHJpYnV0ZXNDb21tYW5kLFxuICBMaXN0TWVzc2FnZU1vdmVUYXNrc0NvbW1hbmQsXG4gIFN0YXJ0TWVzc2FnZU1vdmVUYXNrQ29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNxcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IEVWRU5UU19TVEFDS19OQU1FIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgYXBwbHlBd3NQcm9maWxlLCByZXNvbHZlQXdzUmVnaW9uIH0gZnJvbSAnLi4vdXRpbHMvYXdzLWVudi5qcyc7XG5pbXBvcnQgeyBwcmludENvbW1hbmRIZWFkZXIsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgaGFuZGxlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbi8vIENGTiBzdGFjayB0aGF0IHNldHVwLWV2ZW50cyBkZXBsb3lzIOKAlCB0aGUgcXVldWVzIGxpdmUgaGVyZS5cbmNvbnN0IFNUQUNLX05BTUUgPSBFVkVOVFNfU1RBQ0tfTkFNRTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGByZWRyaXZlLWV2ZW50c2AgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBNYW51YWwgZmFsbGJhY2sgZm9yIHRoZSBldmVudHMgTGFtYmRhJ3Mgc2VsZi1oZWFsaW5nIHJlZHJpdmU6IGNhbGxzXG4gKiBTUVMgYFN0YXJ0TWVzc2FnZU1vdmVUYXNrKERMUSDihpIgbWFpbiBxdWV1ZSlgIGZvciB0aGUgYHBpcGVsaW5lLWJ1aWxkZXItZXZlbnRzYFxuICogc3RhY2ssIG1vdmluZyBtZXNzYWdlcyB0aGF0IGV4aGF1c3RlZCB0aGVpciByZWNlaXZlIGNvdW50IGluIHRoZSBkZWFkLWxldHRlclxuICogcXVldWUgYmFjayBvbnRvIGBwaXBlbGluZS1idWlsZGVyLWV2ZW50c2Agc28gdGhlIGluZ2VzdGlvbiBMYW1iZGEgcmUtcHJvY2Vzc2VzXG4gKiB0aGVtLiBJZGVtcG90ZW50IGluZ2VzdCAoZGVkdXBlIG9uIGBpZGVtcG90ZW5jeUtleWApIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZy5cbiAqXG4gKiBUaGUgTGFtYmRhIGFscmVhZHkgZG9lcyB0aGlzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGJhdGNoOyB0aGlzXG4gKiBjb21tYW5kIGlzIHRoZSBvcGVyYXRvciBlc2NhcGUgaGF0Y2ggd2hlbiB0aGUgTGFtYmRhIGlzIGRvd24gb3IgdGhlIERMUSBuZWVkc1xuICogdG8gYmUgZHJhaW5lZCBvbiBkZW1hbmQuIExpa2UgdGhlIExhbWJkYSwgaXQgcmVmdXNlcyB0byBzdGFydCBhIHNlY29uZCBtb3ZlXG4gKiB0YXNrIHdoaWxlIG9uZSBpcyBhbHJlYWR5IGFjdGl2ZSAoU1FTIGFsbG93cyBvbmx5IG9uZSBpbi1mbGlnaHQgdGFzayBwZXJcbiAqIHNvdXJjZSBxdWV1ZSBhbnl3YXkpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHJlZHJpdmUtZXZlbnRzIC0tcmVnaW9uIHVzLWVhc3QtMVxuICogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSByZWRyaXZlLWV2ZW50cyAtLXJlZ2lvbiB1cy1lYXN0LTEgLS1wcm9maWxlIHByb2RcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkcml2ZUV2ZW50cyhwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHdpdGhQcm9maWxlT3B0aW9uKFxuICAgIHdpdGhSZWdpb25PcHRpb24ocHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoJ3JlZHJpdmUtZXZlbnRzJylcbiAgICAgIC5kZXNjcmlwdGlvbignUmVkcml2ZSBkZWFkLWxldHRlcmVkIENvZGVQaXBlbGluZSBldmVudHMgYmFjayBvbnRvIHRoZSBpbmdlc3Rpb24gcXVldWUgKG1hbnVhbCBmYWxsYmFjayBmb3IgdGhlIExhbWJkYSBzZWxmLWhlYWxpbmcgcmVkcml2ZSknKSksXG4gIClcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignUmVkcml2ZSBFdmVudHMnKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVnaW9uID0gcmVzb2x2ZUF3c1JlZ2lvbihvcHRpb25zLnJlZ2lvbik7XG4gICAgICAgIC8vIEhvbm9yIC0tcHJvZmlsZSBmb3IgdGhlIFNESyBjbGllbnRzIGJlbG93IChtaXJyb3JzIHNldHVwLWV2ZW50cykg4oCUIHdpdGhvdXRcbiAgICAgICAgLy8gdGhpcyB0aGUgU0RLIGhpdHMgdGhlIERFRkFVTFQgYWNjb3VudCB3aGlsZSBhbnkgYWNjb21wYW55aW5nIENMSSBjYWxsXG4gICAgICAgIC8vIGhvbm9yZWQgLS1wcm9maWxlIChzaWxlbnQgc3BsaXQtYnJhaW4pLlxuICAgICAgICBhcHBseUF3c1Byb2ZpbGUob3B0aW9ucy5wcm9maWxlKTtcblxuICAgICAgICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7IHN0YWNrOiBTVEFDS19OQU1FLCByZWdpb24gfSk7XG5cbiAgICAgICAgLy8gU3RlcCAxOiByZXNvbHZlIHRoZSBxdWV1ZSBVUkxzIGZyb20gdGhlIHN0YWNrIG91dHB1dHMgKHNvdXJjZSBvZiB0cnV0aCDigJRcbiAgICAgICAgLy8gbm8gaGFyZGNvZGVkIHF1ZXVlIG5hbWVzKS4gc2V0dXAtZXZlbnRzIG11c3QgaGF2ZSBydW4gZmlyc3QuXG4gICAgICAgIHByaW50U2VjdGlvbignUmVzb2x2ZSBRdWV1ZXMnKTtcblxuICAgICAgICBjb25zdCBjZm5DbGllbnQgPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoeyByZWdpb24gfSk7XG4gICAgICAgIGNvbnN0IGRlc2NyaWJlUmVzdWx0ID0gYXdhaXQgY2ZuQ2xpZW50LnNlbmQobmV3IERlc2NyaWJlU3RhY2tzQ29tbWFuZCh7IFN0YWNrTmFtZTogU1RBQ0tfTkFNRSB9KSk7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBkZXNjcmliZVJlc3VsdC5TdGFja3M/LlswXT8uT3V0cHV0cyA/PyBbXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0TWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKG91dHB1dHMubWFwKG8gPT4gW28uT3V0cHV0S2V5ID8/ICcnLCBvLk91dHB1dFZhbHVlID8/ICcnXSkpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50UXVldWVBcm4gPSBvdXRwdXRNYXAuRXZlbnRRdWV1ZUFybjtcbiAgICAgICAgY29uc3QgZXZlbnRRdWV1ZVVybCA9IG91dHB1dE1hcC5FdmVudFF1ZXVlVXJsO1xuICAgICAgICBjb25zdCBkbHFVcmwgPSBvdXRwdXRNYXAuRGVhZExldHRlclF1ZXVlVXJsO1xuXG4gICAgICAgIGlmICghZXZlbnRRdWV1ZUFybiB8fCAhZGxxVXJsKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcihgU3RhY2sgJHtTVEFDS19OQU1FfSBpcyBtaXNzaW5nIGV4cGVjdGVkIG91dHB1dHNgLCB7XG4gICAgICAgICAgICBoaW50OiAnUnVuIGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHNldHVwLWV2ZW50c2AgZmlyc3QuJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrIG91dHB1dHMgRXZlbnRRdWV1ZUFybiAvIERlYWRMZXR0ZXJRdWV1ZVVybCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNxcyA9IG5ldyBTUVNDbGllbnQoeyByZWdpb24gfSk7XG5cbiAgICAgICAgLy8gVGhlIHN0YWNrIGV4cG9zZXMgdGhlIERMUSBVUkwgYnV0IG5vdCBpdHMgQVJOIOKAlCBTdGFydE1lc3NhZ2VNb3ZlVGFzayBuZWVkc1xuICAgICAgICAvLyB0aGUgc291cmNlIEFSTiwgc28gcmVzb2x2ZSBpdCBmcm9tIHRoZSBxdWV1ZSdzIGF0dHJpYnV0ZXMuXG4gICAgICAgIGNvbnN0IGRscUF0dHJzID0gYXdhaXQgc3FzLnNlbmQobmV3IEdldFF1ZXVlQXR0cmlidXRlc0NvbW1hbmQoe1xuICAgICAgICAgIFF1ZXVlVXJsOiBkbHFVcmwsXG4gICAgICAgICAgQXR0cmlidXRlTmFtZXM6IFsnUXVldWVBcm4nLCAnQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzJ10sXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgZGxxQXJuID0gZGxxQXR0cnMuQXR0cmlidXRlcz8uUXVldWVBcm47XG4gICAgICAgIGNvbnN0IGRscURlcHRoID0gTnVtYmVyKGRscUF0dHJzLkF0dHJpYnV0ZXM/LkFwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlcyA/PyAnMCcpO1xuXG4gICAgICAgIGlmICghZGxxQXJuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVzb2x2ZSB0aGUgRExRIEFSTiBmcm9tICR7ZGxxVXJsfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ1NvdXJjZSAoRExRKSc6IGRscUFybixcbiAgICAgICAgICAnRGVzdGluYXRpb24gKHF1ZXVlKSc6IGV2ZW50UXVldWVBcm4sXG4gICAgICAgICAgJ0RMUSBkZXB0aCAoYXBwcm94KSc6IFN0cmluZyhkbHFEZXB0aCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE5vdGhpbmcgdG8gbW92ZSDigJQgYmFpbCBlYXJseSBzbyB0aGUgb3BlcmF0b3IgZ2V0cyBhIGNsZWFyIHNpZ25hbCBpbnN0ZWFkXG4gICAgICAgIC8vIG9mIGEgbm8tb3AgdGFzay5cbiAgICAgICAgaWYgKGRscURlcHRoID09PSAwKSB7XG4gICAgICAgICAgcHJpbnRTdWNjZXNzKCdEZWFkLWxldHRlciBxdWV1ZSBpcyBlbXB0eSDigJQgbm90aGluZyB0byByZWRyaXZlLicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMjogcmVmdXNlIHRvIHN0YWNrIG1vdmUgdGFza3MuIFNRUyBwZXJtaXRzIG9ubHkgb25lIGluLWZsaWdodCBtb3ZlXG4gICAgICAgIC8vIHRhc2sgcGVyIHNvdXJjZSBxdWV1ZTsgc3VyZmFjZSBhbnkgYWN0aXZlIG9uZSBpbnN0ZWFkIG9mIGVycm9yaW5nIG91dC5cbiAgICAgICAgcHJpbnRTZWN0aW9uKCdSZWRyaXZlJyk7XG5cbiAgICAgICAgY29uc3QgYWN0aXZlID0gYXdhaXQgc3FzLnNlbmQobmV3IExpc3RNZXNzYWdlTW92ZVRhc2tzQ29tbWFuZCh7IFNvdXJjZUFybjogZGxxQXJuIH0pKTtcbiAgICAgICAgY29uc3QgcnVubmluZyA9IChhY3RpdmUuUmVzdWx0cyA/PyBbXSkuZmluZCh0ID0+IHQuU3RhdHVzID09PSAnUlVOTklORycpO1xuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgIHByaW50V2FybmluZygnQSBtZXNzYWdlIG1vdmUgdGFzayBpcyBhbHJlYWR5IHJ1bm5pbmcgZm9yIHRoaXMgRExRIOKAlCBub3Qgc3RhcnRpbmcgYW5vdGhlci4nLCB7XG4gICAgICAgICAgICB0YXNrSGFuZGxlOiBydW5uaW5nLlRhc2tIYW5kbGUsXG4gICAgICAgICAgICBhcHByb3hNb3ZlZFNvRmFyOiBydW5uaW5nLkFwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlc01vdmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMzogc3RhcnQgdGhlIG1vdmUgKERMUSDihpIgbWFpbiBxdWV1ZSkuIERlc3RpbmF0aW9uQXJuIGlzIHNldCBleHBsaWNpdGx5XG4gICAgICAgIC8vIGV2ZW4gdGhvdWdoIFNRUyB3b3VsZCBkZWZhdWx0IHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgcXVldWUg4oCUIHRoZSBtYWluXG4gICAgICAgIC8vIGluZ2VzdGlvbiBxdWV1ZSBpcyBleGFjdGx5IHRoYXQgdGFyZ2V0LlxuICAgICAgICBjb25zdCBzdGFydCA9IGF3YWl0IHNxcy5zZW5kKG5ldyBTdGFydE1lc3NhZ2VNb3ZlVGFza0NvbW1hbmQoe1xuICAgICAgICAgIFNvdXJjZUFybjogZGxxQXJuLFxuICAgICAgICAgIERlc3RpbmF0aW9uQXJuOiBldmVudFF1ZXVlQXJuLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24oJ1JlZHJpdmUgU3RhcnRlZCcpO1xuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAnVGFzayBIYW5kbGUnOiBzdGFydC5UYXNrSGFuZGxlID8/ICcobm9uZSByZXR1cm5lZCknLFxuICAgICAgICAgICdTb3VyY2UgKERMUSknOiBkbHFBcm4sXG4gICAgICAgICAgJ0Rlc3RpbmF0aW9uIChxdWV1ZSknOiBldmVudFF1ZXVlVXJsIHx8IGV2ZW50UXVldWVBcm4sXG4gICAgICAgICAgJ01lc3NhZ2VzIHF1ZXVlZCc6IFN0cmluZyhkbHFEZXB0aCksXG4gICAgICAgICAgJ1N0YXR1cyc6ICfinJMgU3RhcnRlZCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRTdWNjZXNzKCdSZWRyaXZlIHRhc2sgc3RhcnRlZC4gTWVzc2FnZXMgd2lsbCByZS1mbG93IHRocm91Z2ggdGhlIGluZ2VzdGlvbiBMYW1iZGEuJyk7XG4gICAgICAgIHByaW50SW5mbygnSWRlbXBvdGVudCBpbmdlc3QgZGVkdXBlcyBvbiBpZGVtcG90ZW5jeUtleSwgc28gcmUtZHJpdmVuIGV2ZW50cyBhcmUgbm90IGRvdWJsZS1jb3VudGVkLicpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICdyZWRyaXZlLWV2ZW50cycsIGV4ZWN1dGlvbklkLCBzdGFjazogU1RBQ0tfTkFNRSB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
@@ -1,11 +1,56 @@
1
1
  import { Command } from 'commander';
2
+ import type { ApiClient } from '../utils/api-client.js';
3
+ import { type ProvisionedKey } from '../utils/service-account.js';
4
+ /** What a dry run reports it WOULD provision. */
5
+ export interface StoreTokenPlan {
6
+ serviceAccount: string;
7
+ roles: string;
8
+ scope: string;
9
+ secretName: string;
10
+ region: string;
11
+ expiresInDays: number;
12
+ }
13
+ /** Print the dry-run plan (JSON or human). Stays entirely offline. */
14
+ export declare function printDryRunPlan(plan: StoreTokenPlan, json: boolean): void;
15
+ /**
16
+ * The Secrets Manager payload: `{ username: orgId, password: <pb_sa_ key>, ...metadata }`.
17
+ * - username/password satisfy CodeBuild's `secretsManagerCredentials` (HTTP
18
+ * Basic, sent to pipeline-image-registry's /token endpoint, which exchanges
19
+ * the opaque key like every other service does).
20
+ * - `password` is the canonical field: the plugin-lookup Lambda, the events
21
+ * Lambda and `--store-tokens` all read it.
22
+ * - keyId / serviceAccountId are what the rotation Lambda needs to retire the
23
+ * key it replaces.
24
+ */
25
+ export declare function buildSecretValue(provisioned: ProvisionedKey, platformUrl: string, expiresInSeconds: number): string;
26
+ /**
27
+ * Retire the credential this run replaced — AFTER the new one is stored, never
28
+ * before. A failure here leaves a superfluous key that expires on its own;
29
+ * doing it in the other order would leave the secret naming a revoked key if
30
+ * the write failed.
31
+ */
32
+ export declare function retirePreviousKey(client: ApiClient, password: string, provisioned: ProvisionedKey, previous: {
33
+ keyId?: string;
34
+ serviceAccountId?: string;
35
+ }): Promise<void>;
36
+ /** Print the stored key's summary (JSON or human) plus the next steps. */
37
+ export declare function printStoredKey(r: {
38
+ json: boolean;
39
+ secretName: string;
40
+ arn: string | undefined;
41
+ region: string;
42
+ accountName: string;
43
+ provisioned: ProvisionedKey;
44
+ days: number;
45
+ scheduleExpression: string | undefined;
46
+ }): void;
2
47
  /**
3
48
  * Registers the `store-token` command with the CLI program.
4
49
  *
5
50
  * Provisions the org's machine identity — a SERVICE ACCOUNT and one `pb_sa_…`
6
51
  * key — and stores the key in AWS Secrets Manager for CDK deployments,
7
52
  * CodeBuild's registry credentials, the plugin-lookup Lambda and the event
8
- * ingestion Lambda (#12 / #N2). Nothing stored is tied to a person's session any
53
+ * ingestion Lambda. Nothing stored is tied to a person's session any
9
54
  * more: the account outlives its creator, takes no seat, and every audit row it
10
55
  * produces names the account.
11
56
  *
@@ -1 +1 @@
1
- {"version":3,"file":"store-token.d.ts","sourceRoot":"","sources":["../../src/commands/store-token.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiJpC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2PjD"}
1
+ {"version":3,"file":"store-token.d.ts","sourceRoot":"","sources":["../../src/commands/store-token.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AASxD,OAAO,EAAuD,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAuIvH,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAgBzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAcnH;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,cAAc,EAC3B,QAAQ,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,GAAG,IAAI,CA6CP;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqKjD"}