@pipeline-builder/pipeline-core 4.4.11 → 4.4.13

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.
@@ -1,13 +1,67 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ // The dependency-free plugin-catalog subpath only: the plugin-lookup Lambda
4
+ // bundles this module, so it must not pull in the api-core root.
5
+ import { TOOLCHAIN_METADATA_PREFIX, TOOLCHAIN_RESOLVED_VIA } from '@pipeline-builder/api-core/plugin-catalog';
3
6
  /** Severities, least to most serious. */
4
7
  export const LOOKUP_WARNING_SEVERITIES = ['info', 'warning', 'error', 'critical'];
8
+ /** Every tool field, keyed so a field added to api-core's `PluginToolchainSchema` fails to compile here until listed. */
9
+ const TOOLCHAIN_VERSION_FIELDS = {
10
+ pipelineManager: true, awsCdk: true, cdkAssets: true, esbuild: true, pnpm: true, node: true,
11
+ };
12
+ const TOOLCHAIN_VERSION_KEYS = Object.keys(TOOLCHAIN_VERSION_FIELDS);
13
+ /** Pick the string tool versions off an object (unknown keys and non-strings ignored). */
14
+ function pickVersions(raw) {
15
+ if (!raw || typeof raw !== 'object')
16
+ return {};
17
+ const out = {};
18
+ for (const key of TOOLCHAIN_VERSION_KEYS) {
19
+ const v = raw[key];
20
+ if (typeof v === 'string' && v.length > 0)
21
+ out[key] = v;
22
+ }
23
+ return out;
24
+ }
25
+ /** The tool versions a plugin row's `metadata` carries as flat `toolchain.<field>` keys. */
26
+ function versionsFromMetadata(metadata) {
27
+ if (!metadata || typeof metadata !== 'object')
28
+ return {};
29
+ const fields = {};
30
+ for (const [k, v] of Object.entries(metadata)) {
31
+ if (k.startsWith(TOOLCHAIN_METADATA_PREFIX))
32
+ fields[k.slice(TOOLCHAIN_METADATA_PREFIX.length)] = v;
33
+ }
34
+ return pickVersions(fields);
35
+ }
36
+ /**
37
+ * Parse a lookup's `toolchain` block. Null unless it carries a release version
38
+ * and a known `resolvedVia`. Tool versions come from, lowest precedence first:
39
+ * the plugin row's `metadata` (`toolchain.<field>` keys, where the platform
40
+ * persists the bootstrap spec's `toolchain`), the record's own `toolchain`,
41
+ * the block's flat fields, then `toolchain.versions`.
42
+ */
43
+ export function parseLookupToolchain(raw, plugin) {
44
+ if (!raw || typeof raw !== 'object')
45
+ return null;
46
+ const { releaseVersion, resolvedVia, versions } = raw;
47
+ if (typeof releaseVersion !== 'string' || releaseVersion.length === 0)
48
+ return null;
49
+ if (!TOOLCHAIN_RESOLVED_VIA.includes(resolvedVia))
50
+ return null;
51
+ const rec = plugin && typeof plugin === 'object' ? plugin : undefined;
52
+ return {
53
+ releaseVersion,
54
+ resolvedVia: resolvedVia,
55
+ versions: { ...versionsFromMetadata(rec?.metadata), ...pickVersions(rec?.toolchain), ...pickVersions(raw), ...pickVersions(versions) },
56
+ };
57
+ }
5
58
  /**
6
59
  * Unwrap a `/plugins/lookup` answer. The platform's success envelope is
7
60
  * `{ success, statusCode, data: { plugin, warnings } }` (note the double
8
61
  * nesting: `data.plugin`); `{ data: Plugin }`, `{ plugin }` and a bare Plugin
9
62
  * are tolerated too. Returns the plugin (null when absent or nameless) and the
10
- * graded warnings (lifecycle, vulnerability, compliance) that ride beside it.
63
+ * graded warnings (lifecycle, vulnerability, compliance) that ride beside it,
64
+ * and — for a managed toolchain name — the release it resolved to (`toolchain`).
11
65
  *
12
66
  * Dependency-free (type-only imports) so the plugin-lookup Lambda can bundle it.
13
67
  */
@@ -36,7 +90,8 @@ export function unwrapLookup(body) {
36
90
  });
37
91
  }
38
92
  }
39
- return { plugin, warnings };
93
+ const toolchain = parseLookupToolchain(container.toolchain, plugin);
94
+ return { plugin, warnings, ...(toolchain && { toolchain }) };
40
95
  }
41
96
  /**
42
97
  * One line summarizing graded warnings, most serious first —
@@ -77,4 +132,4 @@ export function exactPinNotFoundMessage(label, pin, state) {
77
132
  default: return `Plugin "${label}" version ${pin} does not exist (never published, or refused by its build's vulnerability scan)`;
78
133
  }
79
134
  }
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBT3RDLHlDQUF5QztBQUN6QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBcUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQVVwSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBYTtJQUN4QyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDN0UsTUFBTSxLQUFLLEdBQUksSUFBMkIsQ0FBQyxJQUFJLENBQUM7SUFDaEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBNkMsQ0FBQztJQUNsSCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxTQUFTLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQVEsU0FBZ0MsQ0FBQyxJQUFJLEtBQUssUUFBUTtXQUNqSCxTQUE4QixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNsRCxDQUFDLENBQUMsU0FBbUI7UUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNULE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7SUFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3RDLEtBQUssTUFBTSxDQUFDLElBQUksU0FB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QUFFLEtBQWlDO0lBQ25HLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLFNBQVMsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcscUNBQXFDLENBQUM7UUFDN0YsS0FBSyxVQUFVLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLGNBQWMsQ0FBQztRQUN2RSxLQUFLLFFBQVEsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3BFLEtBQUssU0FBUyxFQUFFLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztRQUN6RSxTQUFTLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpRkFBaUYsQ0FBQztJQUNwSSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuXG4vKiogSG93IHNlcmlvdXMgYSBsb29rdXAgd2FybmluZyBpcyAodnVsbmVyYWJpbGl0eSBzdGF0ZSBpcyBncmFkZWQsIG5ldmVyIHJlZnVzZWQpLiAqL1xuZXhwb3J0IHR5cGUgTG9va3VwV2FybmluZ1NldmVyaXR5ID0gJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdjcml0aWNhbCc7XG5cbi8qKiBTZXZlcml0aWVzLCBsZWFzdCB0byBtb3N0IHNlcmlvdXMuICovXG5leHBvcnQgY29uc3QgTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUzogcmVhZG9ubHkgTG9va3VwV2FybmluZ1NldmVyaXR5W10gPSBbJ2luZm8nLCAnd2FybmluZycsICdlcnJvcicsICdjcml0aWNhbCddO1xuXG4vKiogT25lIHdhcm5pbmcgcmlkaW5nIGJlc2lkZSBhIHJlc29sdmVkIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwV2FybmluZyB7XG4gIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIEFic2VudCBvbiB0aGUgd2lyZSDihpIgYHdhcm5pbmdgLiAqL1xuICByZWFkb25seSBzZXZlcml0eTogTG9va3VwV2FybmluZ1NldmVyaXR5O1xufVxuXG4vKipcbiAqIFVud3JhcCBhIGAvcGx1Z2lucy9sb29rdXBgIGFuc3dlci4gVGhlIHBsYXRmb3JtJ3Mgc3VjY2VzcyBlbnZlbG9wZSBpc1xuICogYHsgc3VjY2Vzcywgc3RhdHVzQ29kZSwgZGF0YTogeyBwbHVnaW4sIHdhcm5pbmdzIH0gfWAgKG5vdGUgdGhlIGRvdWJsZVxuICogbmVzdGluZzogYGRhdGEucGx1Z2luYCk7IGB7IGRhdGE6IFBsdWdpbiB9YCwgYHsgcGx1Z2luIH1gIGFuZCBhIGJhcmUgUGx1Z2luXG4gKiBhcmUgdG9sZXJhdGVkIHRvby4gUmV0dXJucyB0aGUgcGx1Z2luIChudWxsIHdoZW4gYWJzZW50IG9yIG5hbWVsZXNzKSBhbmQgdGhlXG4gKiBncmFkZWQgd2FybmluZ3MgKGxpZmVjeWNsZSwgdnVsbmVyYWJpbGl0eSwgY29tcGxpYW5jZSkgdGhhdCByaWRlIGJlc2lkZSBpdC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgKHR5cGUtb25seSBpbXBvcnRzKSBzbyB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEgY2FuIGJ1bmRsZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcExvb2t1cChib2R5OiB1bmtub3duKTogeyBwbHVnaW46IFBsdWdpbiB8IG51bGw7IHdhcm5pbmdzOiBMb29rdXBXYXJuaW5nW10gfSB7XG4gIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gJ29iamVjdCcpIHJldHVybiB7IHBsdWdpbjogbnVsbCwgd2FybmluZ3M6IFtdIH07XG4gIGNvbnN0IGlubmVyID0gKGJvZHkgYXMgeyBkYXRhPzogdW5rbm93biB9KS5kYXRhO1xuICBjb25zdCBjb250YWluZXIgPSAoaW5uZXIgJiYgdHlwZW9mIGlubmVyID09PSAnb2JqZWN0JyA/IGlubmVyIDogYm9keSkgYXMgeyBwbHVnaW4/OiB1bmtub3duOyB3YXJuaW5ncz86IHVua25vd24gfTtcbiAgY29uc3QgY2FuZGlkYXRlID0gY29udGFpbmVyLnBsdWdpbiA/PyBjb250YWluZXI7XG4gIGNvbnN0IHBsdWdpbiA9IGNhbmRpZGF0ZSAmJiB0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGNhbmRpZGF0ZSBhcyB7IG5hbWU/OiB1bmtub3duIH0pLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgJiYgKGNhbmRpZGF0ZSBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lLmxlbmd0aCA+IDBcbiAgICA/IGNhbmRpZGF0ZSBhcyBQbHVnaW5cbiAgICA6IG51bGw7XG4gIGNvbnN0IHdhcm5pbmdzOiBMb29rdXBXYXJuaW5nW10gPSBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyLndhcm5pbmdzKSkge1xuICAgIGZvciAoY29uc3QgdyBvZiBjb250YWluZXIud2FybmluZ3MpIHtcbiAgICAgIGlmICghdyB8fCB0eXBlb2YgdyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyBjb2RlLCBtZXNzYWdlLCBzZXZlcml0eSB9ID0gdyBhcyB7IGNvZGU/OiB1bmtub3duOyBtZXNzYWdlPzogdW5rbm93bjsgc2V2ZXJpdHk/OiB1bmtub3duIH07XG4gICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8IG1lc3NhZ2UubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAuLi4odHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnID8geyBjb2RlIH0gOiB7fSksXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHNldmVyaXR5OiAoTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUyBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHNldmVyaXR5KSA/IHNldmVyaXR5IGFzIExvb2t1cFdhcm5pbmdTZXZlcml0eSA6ICd3YXJuaW5nJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBwbHVnaW4sIHdhcm5pbmdzIH07XG59XG5cbi8qKlxuICogT25lIGxpbmUgc3VtbWFyaXppbmcgZ3JhZGVkIHdhcm5pbmdzLCBtb3N0IHNlcmlvdXMgZmlyc3Qg4oCUXG4gKiBgMyBwbHVnaW4gd2FybmluZ3M6IDEgY3JpdGljYWwsIDIgZXJyb3JgLiBOdWxsIHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyh3YXJuaW5nczogcmVhZG9ubHkgUGljazxMb29rdXBXYXJuaW5nLCAnc2V2ZXJpdHknPltdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCBwYXJ0cyA9IFsuLi5MT09LVVBfV0FSTklOR19TRVZFUklUSUVTXS5yZXZlcnNlKClcbiAgICAubWFwKChzZXYpID0+IFtzZXYsIHdhcm5pbmdzLmZpbHRlcigodykgPT4gdy5zZXZlcml0eSA9PT0gc2V2KS5sZW5ndGhdIGFzIGNvbnN0KVxuICAgIC5maWx0ZXIoKFssIG5dKSA9PiBuID4gMClcbiAgICAubWFwKChbc2V2LCBuXSkgPT4gYCR7bn0gJHtzZXZ9YCk7XG4gIHJldHVybiBgJHt3YXJuaW5ncy5sZW5ndGh9IHBsdWdpbiB3YXJuaW5nJHt3YXJuaW5ncy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ306ICR7cGFydHMuam9pbignLCAnKX1gO1xufVxuXG4vKiogV2h5IGEgbG9va3VwIGZvdW5kIG5vdGhpbmcsIGFzIHRoZSBwbHVnaW4gc2VydmljZSdzIDQwNCBgZGV0YWlscy5zdGF0ZWAgcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCB0eXBlIExvb2t1cE5vdEZvdW5kU3RhdGUgPSAnZGVsZXRlZCcgfCAnaW5hY3RpdmUnIHwgJ3lhbmtlZCcgfCAnbWlzc2luZyc7XG5cbmNvbnN0IE5PVF9GT1VORF9TVEFURVM6IHJlYWRvbmx5IExvb2t1cE5vdEZvdW5kU3RhdGVbXSA9IFsnZGVsZXRlZCcsICdpbmFjdGl2ZScsICd5YW5rZWQnLCAnbWlzc2luZyddO1xuXG4vKipcbiAqIGBkZXRhaWxzLnN0YXRlYCBvZiBhIHJlZnVzZWQgbG9va3VwLCByZWFkIG9mZiBlaXRoZXIgYW4gYXhpb3Mtc3R5bGUgZXJyb3JcbiAqIChgZXJyLnJlc3BvbnNlLmRhdGFgKSBvciB0aGUgcmVzcG9uc2UgYm9keSBpdHNlbGYuIE51bGwgd2hlbiBhYnNlbnQvdW5rbm93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cE5vdEZvdW5kU3RhdGUoZXJyT3JCb2R5OiB1bmtub3duKTogTG9va3VwTm90Rm91bmRTdGF0ZSB8IG51bGwge1xuICBpZiAoIWVyck9yQm9keSB8fCB0eXBlb2YgZXJyT3JCb2R5ICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGRhdGEgPSAoZXJyT3JCb2R5IGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSkucmVzcG9uc2U/LmRhdGEgPz8gZXJyT3JCb2R5O1xuICBjb25zdCBkZXRhaWxzID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IGRldGFpbHM/OiB1bmtub3duIH0pLmRldGFpbHMgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlscyAmJiB0eXBlb2YgZGV0YWlscyA9PT0gJ29iamVjdCcgPyAoZGV0YWlscyBhcyB7IHN0YXRlPzogdW5rbm93biB9KS5zdGF0ZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgJiYgKE5PVF9GT1VORF9TVEFURVMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHN0YXRlKSA/IHN0YXRlIGFzIExvb2t1cE5vdEZvdW5kU3RhdGUgOiBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBtZXNzYWdlIGZvciBhbiBleGFjdCB2ZXJzaW9uIHBpbiB0aGF0IGRpZCBub3QgcmVzb2x2ZS4gU2hhcmVkIGJ5IHRoZVxuICogQ0xJJ3MgcHJlLXJlc29sdXRpb24gYW5kIHRoZSBkZXBsb3ktdGltZSBMYW1iZGEncyBDbG91ZEZvcm1hdGlvbiByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbDogc3RyaW5nLCBwaW46IHN0cmluZywgc3RhdGU6IExvb2t1cE5vdEZvdW5kU3RhdGUgfCBudWxsKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0ZSkge1xuICAgIGNhc2UgJ2RlbGV0ZWQnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gd2FzIGRlbGV0ZWQgZnJvbSB5b3VyIG9yZ2FuaXphdGlvbmA7XG4gICAgY2FzZSAnaW5hY3RpdmUnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gaXMgaW5hY3RpdmVgO1xuICAgIGNhc2UgJ3lhbmtlZCc6IHJldHVybiBgUGx1Z2luIFwiJHtsYWJlbH1cIiB2ZXJzaW9uICR7cGlufSB3YXMgeWFua2VkYDtcbiAgICBjYXNlICdtaXNzaW5nJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGRvZXMgbm90IGV4aXN0YDtcbiAgICBkZWZhdWx0OiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gZG9lcyBub3QgZXhpc3QgKG5ldmVyIHB1Ymxpc2hlZCwgb3IgcmVmdXNlZCBieSBpdHMgYnVpbGQncyB2dWxuZXJhYmlsaXR5IHNjYW4pYDtcbiAgfVxufVxuIl19
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLDRFQUE0RTtBQUM1RSxpRUFBaUU7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUE2QixNQUFNLDJDQUEyQyxDQUFDO0FBT3pJLHlDQUF5QztBQUN6QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBcUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQWFwSCx5SEFBeUg7QUFDekgsTUFBTSx3QkFBd0IsR0FBd0M7SUFDcEUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO0NBQzVGLENBQUM7QUFDRixNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQThCLENBQUM7QUF5QmxHLDBGQUEwRjtBQUMxRixTQUFTLFlBQVksQ0FBQyxHQUFZO0lBQ2hDLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7SUFDdkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFJLEdBQStCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRCxDQUFD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QztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEtBQWlDO0lBQ25HLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLFNBQVMsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcscUNBQXFDLENBQUM7UUFDN0YsS0FBSyxVQUFVLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLGNBQWMsQ0FBQztRQUN2RSxLQUFLLFFBQVEsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3BFLEtBQUssU0FBUyxFQUFFLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztRQUN6RSxTQUFTLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpRkFBaUYsQ0FBQztJQUNwSSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vLyBUaGUgZGVwZW5kZW5jeS1mcmVlIHBsdWdpbi1jYXRhbG9nIHN1YnBhdGggb25seTogdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhXG4vLyBidW5kbGVzIHRoaXMgbW9kdWxlLCBzbyBpdCBtdXN0IG5vdCBwdWxsIGluIHRoZSBhcGktY29yZSByb290LlxuaW1wb3J0IHsgVE9PTENIQUlOX01FVEFEQVRBX1BSRUZJWCwgVE9PTENIQUlOX1JFU09MVkVEX1ZJQSwgdHlwZSBUb29sY2hhaW5SZXNvbHZlZFZpYSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3BsdWdpbi1jYXRhbG9nJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luVG9vbGNoYWluIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhJztcblxuLyoqIEhvdyBzZXJpb3VzIGEgbG9va3VwIHdhcm5pbmcgaXMgKHZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgZ3JhZGVkLCBuZXZlciByZWZ1c2VkKS4gKi9cbmV4cG9ydCB0eXBlIExvb2t1cFdhcm5pbmdTZXZlcml0eSA9ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdlcnJvcicgfCAnY3JpdGljYWwnO1xuXG4vKiogU2V2ZXJpdGllcywgbGVhc3QgdG8gbW9zdCBzZXJpb3VzLiAqL1xuZXhwb3J0IGNvbnN0IExPT0tVUF9XQVJOSU5HX1NFVkVSSVRJRVM6IHJlYWRvbmx5IExvb2t1cFdhcm5pbmdTZXZlcml0eVtdID0gWydpbmZvJywgJ3dhcm5pbmcnLCAnZXJyb3InLCAnY3JpdGljYWwnXTtcblxuLyoqIE9uZSB3YXJuaW5nIHJpZGluZyBiZXNpZGUgYSByZXNvbHZlZCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cFdhcm5pbmcge1xuICByZWFkb25seSBjb2RlPzogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBBYnNlbnQgb24gdGhlIHdpcmUg4oaSIGB3YXJuaW5nYC4gKi9cbiAgcmVhZG9ubHkgc2V2ZXJpdHk6IExvb2t1cFdhcm5pbmdTZXZlcml0eTtcbn1cblxuLyoqIFRoZSBleGFjdCB0b29sIHZlcnNpb25zIGEgdG9vbGNoYWluIHJlbGVhc2UgY2FycmllcyAodGhlIGJvb3RzdHJhcCBzcGVjJ3MgYHRvb2xjaGFpbmApLCBhcyBmYXIgYXMgYW4gYW5zd2VyIGNhcnJpZXMgdGhlbS4gKi9cbmV4cG9ydCB0eXBlIFRvb2xjaGFpblZlcnNpb25zID0gUGFydGlhbDxSZWFkb25seTxQbHVnaW5Ub29sY2hhaW4+PjtcblxuLyoqIEV2ZXJ5IHRvb2wgZmllbGQsIGtleWVkIHNvIGEgZmllbGQgYWRkZWQgdG8gYXBpLWNvcmUncyBgUGx1Z2luVG9vbGNoYWluU2NoZW1hYCBmYWlscyB0byBjb21waWxlIGhlcmUgdW50aWwgbGlzdGVkLiAqL1xuY29uc3QgVE9PTENIQUlOX1ZFUlNJT05fRklFTERTOiBSZWNvcmQ8a2V5b2YgUGx1Z2luVG9vbGNoYWluLCB0cnVlPiA9IHtcbiAgcGlwZWxpbmVNYW5hZ2VyOiB0cnVlLCBhd3NDZGs6IHRydWUsIGNka0Fzc2V0czogdHJ1ZSwgZXNidWlsZDogdHJ1ZSwgcG5wbTogdHJ1ZSwgbm9kZTogdHJ1ZSxcbn07XG5jb25zdCBUT09MQ0hBSU5fVkVSU0lPTl9LRVlTID0gT2JqZWN0LmtleXMoVE9PTENIQUlOX1ZFUlNJT05fRklFTERTKSBhcyAoa2V5b2YgUGx1Z2luVG9vbGNoYWluKVtdO1xuXG4vKipcbiAqIFRoZSByZWxlYXNlIGEgbWFuYWdlZC1uYW1lIGxvb2t1cCAoYHBpcGVsaW5lLWJvb3RzdHJhcGAsIGBjZGstc3ludGhgKVxuICogcmVzb2x2ZWQgdG86IGBkYXRhLnRvb2xjaGFpbmAgb2YgdGhlIGAvcGx1Z2lucy9sb29rdXBgIGFuc3dlci4gYHZlcnNpb25zYFxuICogaG9sZHMgdGhlIHRvb2wgdmVyc2lvbnMgd2hlbiB0aGUgYW5zd2VyIChvciB0aGUgcGx1Z2luIHJlY29yZCkgY2FycmllcyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cFRvb2xjaGFpbiB7XG4gIHJlYWRvbmx5IHJlbGVhc2VWZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc29sdmVkVmlhOiBUb29sY2hhaW5SZXNvbHZlZFZpYTtcbiAgcmVhZG9ubHkgdmVyc2lvbnM6IFRvb2xjaGFpblZlcnNpb25zO1xufVxuXG4vKipcbiAqIFRoZSByZXNvbHZlZCBgcGlwZWxpbmUtYm9vdHN0cmFwYCBoYWxmIG9mIGEgdG9vbGNoYWluIHJlbGVhc2U6IHRoZSBwbHVnaW5cbiAqIHJlY29yZCB0aGUgZGVmYXVsdCBDb2RlQnVpbGQgaW1hZ2UgaXMgcGlubmVkIHRvIChieSBpdHMgc2lnbmVkIGRpZ2VzdCkgYW5kXG4gKiB0aGUgcmVsZWFzZSBpdCBjYW1lIGZyb20uIFByb2R1Y2VkIGJ5IGBwaXBlbGluZS1tYW5hZ2VyYCdzXG4gKiBgcmVzb2x2ZUJvb3RzdHJhcEltYWdlYCAob3IgYSBgLS10b29sY2hhaW4tZmlsZWApIGFuZCBwYXNzZWQgdG9cbiAqIGBQaXBlbGluZUJ1aWxkZXJgIGFzIGByZXNvbHZlZEJvb3RzdHJhcGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRCb290c3RyYXAge1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcbiAgcmVhZG9ubHkgdG9vbGNoYWluOiBMb29rdXBUb29sY2hhaW47XG59XG5cbi8qKiBQaWNrIHRoZSBzdHJpbmcgdG9vbCB2ZXJzaW9ucyBvZmYgYW4gb2JqZWN0ICh1bmtub3duIGtleXMgYW5kIG5vbi1zdHJpbmdzIGlnbm9yZWQpLiAqL1xuZnVuY3Rpb24gcGlja1ZlcnNpb25zKHJhdzogdW5rbm93bik6IFRvb2xjaGFpblZlcnNpb25zIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybiB7fTtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFRPT0xDSEFJTl9WRVJTSU9OX0tFWVMpIHtcbiAgICBjb25zdCB2ID0gKHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCkgb3V0W2tleV0gPSB2O1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgdG9vbCB2ZXJzaW9ucyBhIHBsdWdpbiByb3cncyBgbWV0YWRhdGFgIGNhcnJpZXMgYXMgZmxhdCBgdG9vbGNoYWluLjxmaWVsZD5gIGtleXMuICovXG5mdW5jdGlvbiB2ZXJzaW9uc0Zyb21NZXRhZGF0YShtZXRhZGF0YTogdW5rbm93bik6IFRvb2xjaGFpblZlcnNpb25zIHtcbiAgaWYgKCFtZXRhZGF0YSB8fCB0eXBlb2YgbWV0YWRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4ge307XG4gIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgaWYgKGsuc3RhcnRzV2l0aChUT09MQ0hBSU5fTUVUQURBVEFfUFJFRklYKSkgZmllbGRzW2suc2xpY2UoVE9PTENIQUlOX01FVEFEQVRBX1BSRUZJWC5sZW5ndGgpXSA9IHY7XG4gIH1cbiAgcmV0dXJuIHBpY2tWZXJzaW9ucyhmaWVsZHMpO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgbG9va3VwJ3MgYHRvb2xjaGFpbmAgYmxvY2suIE51bGwgdW5sZXNzIGl0IGNhcnJpZXMgYSByZWxlYXNlIHZlcnNpb25cbiAqIGFuZCBhIGtub3duIGByZXNvbHZlZFZpYWAuIFRvb2wgdmVyc2lvbnMgY29tZSBmcm9tLCBsb3dlc3QgcHJlY2VkZW5jZSBmaXJzdDpcbiAqIHRoZSBwbHVnaW4gcm93J3MgYG1ldGFkYXRhYCAoYHRvb2xjaGFpbi48ZmllbGQ+YCBrZXlzLCB3aGVyZSB0aGUgcGxhdGZvcm1cbiAqIHBlcnNpc3RzIHRoZSBib290c3RyYXAgc3BlYydzIGB0b29sY2hhaW5gKSwgdGhlIHJlY29yZCdzIG93biBgdG9vbGNoYWluYCxcbiAqIHRoZSBibG9jaydzIGZsYXQgZmllbGRzLCB0aGVuIGB0b29sY2hhaW4udmVyc2lvbnNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMb29rdXBUb29sY2hhaW4ocmF3OiB1bmtub3duLCBwbHVnaW4/OiB1bmtub3duKTogTG9va3VwVG9vbGNoYWluIHwgbnVsbCB7XG4gIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgeyByZWxlYXNlVmVyc2lvbiwgcmVzb2x2ZWRWaWEsIHZlcnNpb25zIH0gPSByYXcgYXMgeyByZWxlYXNlVmVyc2lvbj86IHVua25vd247IHJlc29sdmVkVmlhPzogdW5rbm93bjsgdmVyc2lvbnM/OiB1bmtub3duIH07XG4gIGlmICh0eXBlb2YgcmVsZWFzZVZlcnNpb24gIT09ICdzdHJpbmcnIHx8IHJlbGVhc2VWZXJzaW9uLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGlmICghKFRPT0xDSEFJTl9SRVNPTFZFRF9WSUEgYXMgcmVhZG9ubHkgdW5rbm93bltdKS5pbmNsdWRlcyhyZXNvbHZlZFZpYSkpIHJldHVybiBudWxsO1xuICBjb25zdCByZWMgPSBwbHVnaW4gJiYgdHlwZW9mIHBsdWdpbiA9PT0gJ29iamVjdCcgPyBwbHVnaW4gYXMgeyB0b29sY2hhaW4/OiB1bmtub3duOyBtZXRhZGF0YT86IHVua25vd24gfSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICByZWxlYXNlVmVyc2lvbixcbiAgICByZXNvbHZlZFZpYTogcmVzb2x2ZWRWaWEgYXMgVG9vbGNoYWluUmVzb2x2ZWRWaWEsXG4gICAgdmVyc2lvbnM6IHsgLi4udmVyc2lvbnNGcm9tTWV0YWRhdGEocmVjPy5tZXRhZGF0YSksIC4uLnBpY2tWZXJzaW9ucyhyZWM/LnRvb2xjaGFpbiksIC4uLnBpY2tWZXJzaW9ucyhyYXcpLCAuLi5waWNrVmVyc2lvbnModmVyc2lvbnMpIH0sXG4gIH07XG59XG5cbi8qKlxuICogVW53cmFwIGEgYC9wbHVnaW5zL2xvb2t1cGAgYW5zd2VyLiBUaGUgcGxhdGZvcm0ncyBzdWNjZXNzIGVudmVsb3BlIGlzXG4gKiBgeyBzdWNjZXNzLCBzdGF0dXNDb2RlLCBkYXRhOiB7IHBsdWdpbiwgd2FybmluZ3MgfSB9YCAobm90ZSB0aGUgZG91YmxlXG4gKiBuZXN0aW5nOiBgZGF0YS5wbHVnaW5gKTsgYHsgZGF0YTogUGx1Z2luIH1gLCBgeyBwbHVnaW4gfWAgYW5kIGEgYmFyZSBQbHVnaW5cbiAqIGFyZSB0b2xlcmF0ZWQgdG9vLiBSZXR1cm5zIHRoZSBwbHVnaW4gKG51bGwgd2hlbiBhYnNlbnQgb3IgbmFtZWxlc3MpIGFuZCB0aGVcbiAqIGdyYWRlZCB3YXJuaW5ncyAobGlmZWN5Y2xlLCB2dWxuZXJhYmlsaXR5LCBjb21wbGlhbmNlKSB0aGF0IHJpZGUgYmVzaWRlIGl0LFxuICogYW5kIOKAlCBmb3IgYSBtYW5hZ2VkIHRvb2xjaGFpbiBuYW1lIOKAlCB0aGUgcmVsZWFzZSBpdCByZXNvbHZlZCB0byAoYHRvb2xjaGFpbmApLlxuICpcbiAqIERlcGVuZGVuY3ktZnJlZSAodHlwZS1vbmx5IGltcG9ydHMpIHNvIHRoZSBwbHVnaW4tbG9va3VwIExhbWJkYSBjYW4gYnVuZGxlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwTG9va3VwKGJvZHk6IHVua25vd24pOiB7IHBsdWdpbjogUGx1Z2luIHwgbnVsbDsgd2FybmluZ3M6IExvb2t1cFdhcm5pbmdbXTsgdG9vbGNoYWluPzogTG9va3VwVG9vbGNoYWluIH0ge1xuICBpZiAoIWJvZHkgfHwgdHlwZW9mIGJvZHkgIT09ICdvYmplY3QnKSByZXR1cm4geyBwbHVnaW46IG51bGwsIHdhcm5pbmdzOiBbXSB9O1xuICBjb25zdCBpbm5lciA9IChib2R5IGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YTtcbiAgY29uc3QgY29udGFpbmVyID0gKGlubmVyICYmIHR5cGVvZiBpbm5lciA9PT0gJ29iamVjdCcgPyBpbm5lciA6IGJvZHkpIGFzIHsgcGx1Z2luPzogdW5rbm93bjsgd2FybmluZ3M/OiB1bmtub3duOyB0b29sY2hhaW4/OiB1bmtub3duIH07XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGNvbnRhaW5lci5wbHVnaW4gPz8gY29udGFpbmVyO1xuICBjb25zdCBwbHVnaW4gPSBjYW5kaWRhdGUgJiYgdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIChjYW5kaWRhdGUgYXMgeyBuYW1lPzogdW5rbm93biB9KS5uYW1lID09PSAnc3RyaW5nJ1xuICAgICYmIChjYW5kaWRhdGUgYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZS5sZW5ndGggPiAwXG4gICAgPyBjYW5kaWRhdGUgYXMgUGx1Z2luXG4gICAgOiBudWxsO1xuICBjb25zdCB3YXJuaW5nczogTG9va3VwV2FybmluZ1tdID0gW107XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lci53YXJuaW5ncykpIHtcbiAgICBmb3IgKGNvbnN0IHcgb2YgY29udGFpbmVyLndhcm5pbmdzKSB7XG4gICAgICBpZiAoIXcgfHwgdHlwZW9mIHcgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSwgc2V2ZXJpdHkgfSA9IHcgYXMgeyBjb2RlPzogdW5rbm93bjsgbWVzc2FnZT86IHVua25vd247IHNldmVyaXR5PzogdW5rbm93biB9O1xuICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJyB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgLi4uKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyA/IHsgY29kZSB9IDoge30pLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzZXZlcml0eTogKExPT0tVUF9XQVJOSU5HX1NFVkVSSVRJRVMgYXMgcmVhZG9ubHkgdW5rbm93bltdKS5pbmNsdWRlcyhzZXZlcml0eSkgPyBzZXZlcml0eSBhcyBMb29rdXBXYXJuaW5nU2V2ZXJpdHkgOiAnd2FybmluZycsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdG9vbGNoYWluID0gcGFyc2VMb29rdXBUb29sY2hhaW4oY29udGFpbmVyLnRvb2xjaGFpbiwgcGx1Z2luKTtcbiAgcmV0dXJuIHsgcGx1Z2luLCB3YXJuaW5ncywgLi4uKHRvb2xjaGFpbiAmJiB7IHRvb2xjaGFpbiB9KSB9O1xufVxuXG4vKipcbiAqIE9uZSBsaW5lIHN1bW1hcml6aW5nIGdyYWRlZCB3YXJuaW5ncywgbW9zdCBzZXJpb3VzIGZpcnN0IOKAlFxuICogYDMgcGx1Z2luIHdhcm5pbmdzOiAxIGNyaXRpY2FsLCAyIGVycm9yYC4gTnVsbCB3aGVuIHRoZXJlIGFyZSBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplTG9va3VwV2FybmluZ3Mod2FybmluZ3M6IHJlYWRvbmx5IFBpY2s8TG9va3VwV2FybmluZywgJ3NldmVyaXR5Jz5bXSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAod2FybmluZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGFydHMgPSBbLi4uTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFU10ucmV2ZXJzZSgpXG4gICAgLm1hcCgoc2V2KSA9PiBbc2V2LCB3YXJuaW5ncy5maWx0ZXIoKHcpID0+IHcuc2V2ZXJpdHkgPT09IHNldikubGVuZ3RoXSBhcyBjb25zdClcbiAgICAuZmlsdGVyKChbLCBuXSkgPT4gbiA+IDApXG4gICAgLm1hcCgoW3Nldiwgbl0pID0+IGAke259ICR7c2V2fWApO1xuICByZXR1cm4gYCR7d2FybmluZ3MubGVuZ3RofSBwbHVnaW4gd2FybmluZyR7d2FybmluZ3MubGVuZ3RoID09PSAxID8gJycgOiAncyd9OiAke3BhcnRzLmpvaW4oJywgJyl9YDtcbn1cblxuLyoqIFdoeSBhIGxvb2t1cCBmb3VuZCBub3RoaW5nLCBhcyB0aGUgcGx1Z2luIHNlcnZpY2UncyA0MDQgYGRldGFpbHMuc3RhdGVgIHJlcG9ydHMgaXQuICovXG5leHBvcnQgdHlwZSBMb29rdXBOb3RGb3VuZFN0YXRlID0gJ2RlbGV0ZWQnIHwgJ2luYWN0aXZlJyB8ICd5YW5rZWQnIHwgJ21pc3NpbmcnO1xuXG5jb25zdCBOT1RfRk9VTkRfU1RBVEVTOiByZWFkb25seSBMb29rdXBOb3RGb3VuZFN0YXRlW10gPSBbJ2RlbGV0ZWQnLCAnaW5hY3RpdmUnLCAneWFua2VkJywgJ21pc3NpbmcnXTtcblxuLyoqXG4gKiBgZGV0YWlscy5zdGF0ZWAgb2YgYSByZWZ1c2VkIGxvb2t1cCwgcmVhZCBvZmYgZWl0aGVyIGFuIGF4aW9zLXN0eWxlIGVycm9yXG4gKiAoYGVyci5yZXNwb25zZS5kYXRhYCkgb3IgdGhlIHJlc3BvbnNlIGJvZHkgaXRzZWxmLiBOdWxsIHdoZW4gYWJzZW50L3Vua25vd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb29rdXBOb3RGb3VuZFN0YXRlKGVyck9yQm9keTogdW5rbm93bik6IExvb2t1cE5vdEZvdW5kU3RhdGUgfCBudWxsIHtcbiAgaWYgKCFlcnJPckJvZHkgfHwgdHlwZW9mIGVyck9yQm9keSAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICBjb25zdCBkYXRhID0gKGVyck9yQm9keSBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0pLnJlc3BvbnNlPy5kYXRhID8/IGVyck9yQm9keTtcbiAgY29uc3QgZGV0YWlscyA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyBkZXRhaWxzPzogdW5rbm93biB9KS5kZXRhaWxzIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbHMgJiYgdHlwZW9mIGRldGFpbHMgPT09ICdvYmplY3QnID8gKGRldGFpbHMgYXMgeyBzdGF0ZT86IHVua25vd24gfSkuc3RhdGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnICYmIChOT1RfRk9VTkRfU1RBVEVTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhzdGF0ZSkgPyBzdGF0ZSBhcyBMb29rdXBOb3RGb3VuZFN0YXRlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgbWVzc2FnZSBmb3IgYW4gZXhhY3QgdmVyc2lvbiBwaW4gdGhhdCBkaWQgbm90IHJlc29sdmUuIFNoYXJlZCBieSB0aGVcbiAqIENMSSdzIHByZS1yZXNvbHV0aW9uIGFuZCB0aGUgZGVwbG95LXRpbWUgTGFtYmRhJ3MgQ2xvdWRGb3JtYXRpb24gcmVhc29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWw6IHN0cmluZywgcGluOiBzdHJpbmcsIHN0YXRlOiBMb29rdXBOb3RGb3VuZFN0YXRlIHwgbnVsbCk6IHN0cmluZyB7XG4gIHN3aXRjaCAoc3RhdGUpIHtcbiAgICBjYXNlICdkZWxldGVkJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IHdhcyBkZWxldGVkIGZyb20geW91ciBvcmdhbml6YXRpb25gO1xuICAgIGNhc2UgJ2luYWN0aXZlJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGlzIGluYWN0aXZlYDtcbiAgICBjYXNlICd5YW5rZWQnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gd2FzIHlhbmtlZGA7XG4gICAgY2FzZSAnbWlzc2luZyc6IHJldHVybiBgUGx1Z2luIFwiJHtsYWJlbH1cIiB2ZXJzaW9uICR7cGlufSBkb2VzIG5vdCBleGlzdGA7XG4gICAgZGVmYXVsdDogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGRvZXMgbm90IGV4aXN0IChuZXZlciBwdWJsaXNoZWQsIG9yIHJlZnVzZWQgYnkgaXRzIGJ1aWxkJ3MgdnVsbmVyYWJpbGl0eSBzY2FuKWA7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Self-mutation runtime (docs/plans/bootstrap-image-versioning.md §3, D10).
3
+ *
4
+ * Self-mutation runs on an AWS CURATED image, not the toolchain's bootstrap
5
+ * image, so a defective toolchain release can always be rolled back: the step
6
+ * that re-deploys the pipeline does not depend on the release it is replacing.
7
+ * It needs only Node and the CDK CLI. CDK Pipelines' SelfMutate runs
8
+ * `npm install -g aws-cdk@<cliVersion>` then `cdk -a <asm> deploy` (no
9
+ * re-synth), and `cliVersion` is always pinned to the release's `awsCdk`.
10
+ *
11
+ * The Node runtime is PINNED through `partialBuildSpec`
12
+ * `phases.install.runtime-versions.nodejs`, never left to the image default,
13
+ * and a contract test (test/self-mutation-runtime.test.ts) fails when the major
14
+ * falls outside the pinned CLI's `engines.node` or the image's published runtimes.
15
+ *
16
+ * CDK-free (plain data) so the root entry can export it.
17
+ */
18
+ /** The curated CodeBuild image self-mutation runs on. */
19
+ export declare const CURATED_SELF_MUTATION_IMAGE = "aws/codebuild/standard:8.0";
20
+ /**
21
+ * Node.js runtime majors `aws/codebuild/standard:8.0` publishes for
22
+ * `runtime-versions.nodejs`.
23
+ *
24
+ * Source: https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/8.0/runtimes.yml
25
+ * (`runtimes.nodejs.versions`; read 2026-11-13). Re-check when the image changes.
26
+ */
27
+ export declare const CURATED_SELF_MUTATION_NODE_RUNTIMES: readonly number[];
28
+ /** The Node.js major self-mutation pins (`runtime-versions.nodejs`). */
29
+ export declare const SELF_MUTATION_NODE_MAJOR = 24;
30
+ /** The `partialBuildSpec` object that pins self-mutation's Node runtime. */
31
+ export declare function selfMutationPartialBuildSpec(): Record<string, unknown>;
@@ -0,0 +1,36 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Self-mutation runtime (docs/plans/bootstrap-image-versioning.md §3, D10).
5
+ *
6
+ * Self-mutation runs on an AWS CURATED image, not the toolchain's bootstrap
7
+ * image, so a defective toolchain release can always be rolled back: the step
8
+ * that re-deploys the pipeline does not depend on the release it is replacing.
9
+ * It needs only Node and the CDK CLI. CDK Pipelines' SelfMutate runs
10
+ * `npm install -g aws-cdk@<cliVersion>` then `cdk -a <asm> deploy` (no
11
+ * re-synth), and `cliVersion` is always pinned to the release's `awsCdk`.
12
+ *
13
+ * The Node runtime is PINNED through `partialBuildSpec`
14
+ * `phases.install.runtime-versions.nodejs`, never left to the image default,
15
+ * and a contract test (test/self-mutation-runtime.test.ts) fails when the major
16
+ * falls outside the pinned CLI's `engines.node` or the image's published runtimes.
17
+ *
18
+ * CDK-free (plain data) so the root entry can export it.
19
+ */
20
+ /** The curated CodeBuild image self-mutation runs on. */
21
+ export const CURATED_SELF_MUTATION_IMAGE = 'aws/codebuild/standard:8.0';
22
+ /**
23
+ * Node.js runtime majors `aws/codebuild/standard:8.0` publishes for
24
+ * `runtime-versions.nodejs`.
25
+ *
26
+ * Source: https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/8.0/runtimes.yml
27
+ * (`runtimes.nodejs.versions`; read 2026-11-13). Re-check when the image changes.
28
+ */
29
+ export const CURATED_SELF_MUTATION_NODE_RUNTIMES = [22, 24, 26];
30
+ /** The Node.js major self-mutation pins (`runtime-versions.nodejs`). */
31
+ export const SELF_MUTATION_NODE_MAJOR = 24;
32
+ /** The `partialBuildSpec` object that pins self-mutation's Node runtime. */
33
+ export function selfMutationPartialBuildSpec() {
34
+ return { phases: { install: { 'runtime-versions': { nodejs: String(SELF_MUTATION_NODE_MAJOR) } } } };
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZi1tdXRhdGlvbi5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvc2VsZi1tdXRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLDRCQUE0QixDQUFDO0FBRXhFOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFzQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFbkYsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUUzQyw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLDRCQUE0QjtJQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUN2RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2VsZi1tdXRhdGlvbiBydW50aW1lIChkb2NzL3BsYW5zL2Jvb3RzdHJhcC1pbWFnZS12ZXJzaW9uaW5nLm1kIMKnMywgRDEwKS5cbiAqXG4gKiBTZWxmLW11dGF0aW9uIHJ1bnMgb24gYW4gQVdTIENVUkFURUQgaW1hZ2UsIG5vdCB0aGUgdG9vbGNoYWluJ3MgYm9vdHN0cmFwXG4gKiBpbWFnZSwgc28gYSBkZWZlY3RpdmUgdG9vbGNoYWluIHJlbGVhc2UgY2FuIGFsd2F5cyBiZSByb2xsZWQgYmFjazogdGhlIHN0ZXBcbiAqIHRoYXQgcmUtZGVwbG95cyB0aGUgcGlwZWxpbmUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSByZWxlYXNlIGl0IGlzIHJlcGxhY2luZy5cbiAqIEl0IG5lZWRzIG9ubHkgTm9kZSBhbmQgdGhlIENESyBDTEkuIENESyBQaXBlbGluZXMnIFNlbGZNdXRhdGUgcnVuc1xuICogYG5wbSBpbnN0YWxsIC1nIGF3cy1jZGtAPGNsaVZlcnNpb24+YCB0aGVuIGBjZGsgLWEgPGFzbT4gZGVwbG95YCAobm9cbiAqIHJlLXN5bnRoKSwgYW5kIGBjbGlWZXJzaW9uYCBpcyBhbHdheXMgcGlubmVkIHRvIHRoZSByZWxlYXNlJ3MgYGF3c0Nka2AuXG4gKlxuICogVGhlIE5vZGUgcnVudGltZSBpcyBQSU5ORUQgdGhyb3VnaCBgcGFydGlhbEJ1aWxkU3BlY2BcbiAqIGBwaGFzZXMuaW5zdGFsbC5ydW50aW1lLXZlcnNpb25zLm5vZGVqc2AsIG5ldmVyIGxlZnQgdG8gdGhlIGltYWdlIGRlZmF1bHQsXG4gKiBhbmQgYSBjb250cmFjdCB0ZXN0ICh0ZXN0L3NlbGYtbXV0YXRpb24tcnVudGltZS50ZXN0LnRzKSBmYWlscyB3aGVuIHRoZSBtYWpvclxuICogZmFsbHMgb3V0c2lkZSB0aGUgcGlubmVkIENMSSdzIGBlbmdpbmVzLm5vZGVgIG9yIHRoZSBpbWFnZSdzIHB1Ymxpc2hlZCBydW50aW1lcy5cbiAqXG4gKiBDREstZnJlZSAocGxhaW4gZGF0YSkgc28gdGhlIHJvb3QgZW50cnkgY2FuIGV4cG9ydCBpdC5cbiAqL1xuXG4vKiogVGhlIGN1cmF0ZWQgQ29kZUJ1aWxkIGltYWdlIHNlbGYtbXV0YXRpb24gcnVucyBvbi4gKi9cbmV4cG9ydCBjb25zdCBDVVJBVEVEX1NFTEZfTVVUQVRJT05fSU1BR0UgPSAnYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo4LjAnO1xuXG4vKipcbiAqIE5vZGUuanMgcnVudGltZSBtYWpvcnMgYGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6OC4wYCBwdWJsaXNoZXMgZm9yXG4gKiBgcnVudGltZS12ZXJzaW9ucy5ub2RlanNgLlxuICpcbiAqIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY29kZWJ1aWxkLWRvY2tlci1pbWFnZXMvYmxvYi9tYXN0ZXIvdWJ1bnR1L3N0YW5kYXJkLzguMC9ydW50aW1lcy55bWxcbiAqIChgcnVudGltZXMubm9kZWpzLnZlcnNpb25zYDsgcmVhZCAyMDI2LTExLTEzKS4gUmUtY2hlY2sgd2hlbiB0aGUgaW1hZ2UgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IENVUkFURURfU0VMRl9NVVRBVElPTl9OT0RFX1JVTlRJTUVTOiByZWFkb25seSBudW1iZXJbXSA9IFsyMiwgMjQsIDI2XTtcblxuLyoqIFRoZSBOb2RlLmpzIG1ham9yIHNlbGYtbXV0YXRpb24gcGlucyAoYHJ1bnRpbWUtdmVyc2lvbnMubm9kZWpzYCkuICovXG5leHBvcnQgY29uc3QgU0VMRl9NVVRBVElPTl9OT0RFX01BSk9SID0gMjQ7XG5cbi8qKiBUaGUgYHBhcnRpYWxCdWlsZFNwZWNgIG9iamVjdCB0aGF0IHBpbnMgc2VsZi1tdXRhdGlvbidzIE5vZGUgcnVudGltZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxmTXV0YXRpb25QYXJ0aWFsQnVpbGRTcGVjKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHsgcGhhc2VzOiB7IGluc3RhbGw6IHsgJ3J1bnRpbWUtdmVyc2lvbnMnOiB7IG5vZGVqczogU3RyaW5nKFNFTEZfTVVUQVRJT05fTk9ERV9NQUpPUikgfSB9IH0gfTtcbn1cbiJdfQ==
@@ -1,3 +1,17 @@
1
+ /**
2
+ * Step manifest: which plugin each CodePipeline action
3
+ * of a deployed pipeline runs. CDK-free half — the shapes and helpers shared by
4
+ * the synth (which records it, see `pipeline/step-manifest-recorder.ts`), the
5
+ * CLI (which ships it with the registry registration) and the pipeline service
6
+ * (which validates and stores it in `pipeline_step_manifests`).
7
+ *
8
+ * Event ingest joins `pipeline_events` on (pipeline_id, stage_name,
9
+ * action_name), so `stageName`/`actionName` here are read off the BUILT
10
+ * CodePipeline, never recomputed from our own ids — they are exactly the names
11
+ * CodePipeline state-change events report.
12
+ */
13
+ import { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY, type ToolchainResolvedVia } from '@pipeline-builder/api-core';
14
+ export { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY };
1
15
  /**
2
16
  * File the synth app writes the manifest to, inside the cloud assembly
3
17
  * directory (`cdk deploy --output=<dir>`). The CLI reads it back after a
@@ -35,6 +49,27 @@ export interface StepManifestEntry {
35
49
  */
36
50
  readonly stepKey?: string;
37
51
  }
52
+ /**
53
+ * The pipeline's BUILD IMAGE: the toolchain release's `pipeline-bootstrap` half
54
+ * every plugin-less action runs on (docs/plans/bootstrap-image-versioning.md §4).
55
+ * Not a step — it rides the manifest as a non-step entry under the
56
+ * `build-image` key and the sentinel (stage, action) the platform stores it
57
+ * under, so the deploy-reference path (in-use protection) counts the release.
58
+ * `pluginVersion` IS the release version (both halves share it); the platform
59
+ * re-reads name/version/digest from the `pluginId` row as for every entry.
60
+ */
61
+ export interface BuildImageManifestEntry extends StepManifestEntry {
62
+ readonly kind: 'build-image';
63
+ readonly stageName: typeof BUILD_IMAGE_MANIFEST_STAGE;
64
+ readonly actionName: typeof BUILD_IMAGE_MANIFEST_ACTION;
65
+ readonly stepKey: typeof BUILD_IMAGE_STEP_KEY;
66
+ readonly releaseVersion: string;
67
+ readonly imageRepository: string | null;
68
+ /** How the release was chosen for this pipeline at synth. */
69
+ readonly resolvedVia: ToolchainResolvedVia;
70
+ }
71
+ /** Whether a manifest entry is the {@link BuildImageManifestEntry}. */
72
+ export declare function isBuildImageEntry(entry: StepManifestEntry): entry is BuildImageManifestEntry;
38
73
  /** The plugin fields {@link pluginImageRepository} reads. */
39
74
  export interface PluginImageRef {
40
75
  readonly orgId: string;
@@ -12,7 +12,8 @@
12
12
  * CodePipeline, never recomputed from our own ids — they are exactly the names
13
13
  * CodePipeline state-change events report.
14
14
  */
15
- import { SYSTEM_ORG_ID } from '@pipeline-builder/api-core';
15
+ import { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY, SYSTEM_ORG_ID, } from '@pipeline-builder/api-core';
16
+ export { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY };
16
17
  /**
17
18
  * File the synth app writes the manifest to, inside the cloud assembly
18
19
  * directory (`cdk deploy --output=<dir>`). The CLI reads it back after a
@@ -25,6 +26,11 @@ export const STEP_MANIFEST_FILE = 'pb-step-manifest.json';
25
26
  * synth. Never a real `plugins` row, so the step manifest never records it.
26
27
  */
27
28
  export const PLACEHOLDER_PLUGIN_ID = '00000000-0000-0000-0000-000000000000';
29
+ /** Whether a manifest entry is the {@link BuildImageManifestEntry}. */
30
+ export function isBuildImageEntry(entry) {
31
+ return entry.kind === 'build-image'
32
+ || (entry.stageName === BUILD_IMAGE_MANIFEST_STAGE && entry.actionName === BUILD_IMAGE_MANIFEST_ACTION);
33
+ }
28
34
  /**
29
35
  * Registry repository an org-owned plugin ROW's image lives at
30
36
  * (`<namespace>/<name>`, no host, no digest): the system org's under
@@ -44,4 +50,4 @@ export function pluginImageRepository(plugin) {
44
50
  }
45
51
  /** A plugin image repository lookup may return: `public/<publisher>/<name>`, `org-<id>/<name>` or `system/<name>`. */
46
52
  export const PLUGIN_IMAGE_REPOSITORY_RE = /^(?:public\/[a-z0-9]+(?:-[a-z0-9]+)*|org-[a-z0-9][a-z0-9-]*|system)\/[a-z0-9][a-z0-9._-]*$/;
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1tYW5pZmVzdC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvc3RlcC1tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQztBQUUxRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsc0NBQXNDLENBQUM7QUFtQzVFOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsTUFBc0I7SUFDMUQsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLGVBQWU7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0RCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwRixPQUFPLEdBQUcsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBRUQsc0hBQXNIO0FBQ3RILE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLDRGQUE0RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU3RlcCBtYW5pZmVzdDogd2hpY2ggcGx1Z2luIGVhY2ggQ29kZVBpcGVsaW5lIGFjdGlvblxuICogb2YgYSBkZXBsb3llZCBwaXBlbGluZSBydW5zLiBDREstZnJlZSBoYWxmIOKAlCB0aGUgc2hhcGVzIGFuZCBoZWxwZXJzIHNoYXJlZCBieVxuICogdGhlIHN5bnRoICh3aGljaCByZWNvcmRzIGl0LCBzZWUgYHBpcGVsaW5lL3N0ZXAtbWFuaWZlc3QtcmVjb3JkZXIudHNgKSwgdGhlXG4gKiBDTEkgKHdoaWNoIHNoaXBzIGl0IHdpdGggdGhlIHJlZ2lzdHJ5IHJlZ2lzdHJhdGlvbikgYW5kIHRoZSBwaXBlbGluZSBzZXJ2aWNlXG4gKiAod2hpY2ggdmFsaWRhdGVzIGFuZCBzdG9yZXMgaXQgaW4gYHBpcGVsaW5lX3N0ZXBfbWFuaWZlc3RzYCkuXG4gKlxuICogRXZlbnQgaW5nZXN0IGpvaW5zIGBwaXBlbGluZV9ldmVudHNgIG9uIChwaXBlbGluZV9pZCwgc3RhZ2VfbmFtZSxcbiAqIGFjdGlvbl9uYW1lKSwgc28gYHN0YWdlTmFtZWAvYGFjdGlvbk5hbWVgIGhlcmUgYXJlIHJlYWQgb2ZmIHRoZSBCVUlMVFxuICogQ29kZVBpcGVsaW5lLCBuZXZlciByZWNvbXB1dGVkIGZyb20gb3VyIG93biBpZHMg4oCUIHRoZXkgYXJlIGV4YWN0bHkgdGhlIG5hbWVzXG4gKiBDb2RlUGlwZWxpbmUgc3RhdGUtY2hhbmdlIGV2ZW50cyByZXBvcnQuXG4gKi9cblxuaW1wb3J0IHsgU1lTVEVNX09SR19JRCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcblxuLyoqXG4gKiBGaWxlIHRoZSBzeW50aCBhcHAgd3JpdGVzIHRoZSBtYW5pZmVzdCB0bywgaW5zaWRlIHRoZSBjbG91ZCBhc3NlbWJseVxuICogZGlyZWN0b3J5IChgY2RrIGRlcGxveSAtLW91dHB1dD08ZGlyPmApLiBUaGUgQ0xJIHJlYWRzIGl0IGJhY2sgYWZ0ZXIgYVxuICogc3VjY2Vzc2Z1bCBkZXBsb3kgYW5kIGZvcndhcmRzIGl0IG9uIHRoZSByZWdpc3RyeSBQT1NULlxuICovXG5leHBvcnQgY29uc3QgU1RFUF9NQU5JRkVTVF9GSUxFID0gJ3BiLXN0ZXAtbWFuaWZlc3QuanNvbic7XG5cbi8qKlxuICogYGlkYCBvZiBldmVyeSBzeW50aGVzaXplZCBwbGFjZWhvbGRlciBwbHVnaW4gKFBsdWdpbkxvb2t1cCBgZmFsbGJhY2soKWAgL1xuICogYGJvb3RzdHJhcCgpYCkg4oCUIGEgcmVjb3JkIHN0YW5kaW5nIGluIGZvciBhIGxvb2t1cCB0aGF0IGNvdWxkIG5vdCByZXNvbHZlIGF0XG4gKiBzeW50aC4gTmV2ZXIgYSByZWFsIGBwbHVnaW5zYCByb3csIHNvIHRoZSBzdGVwIG1hbmlmZXN0IG5ldmVyIHJlY29yZHMgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFDRUhPTERFUl9QTFVHSU5fSUQgPSAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBPbmUgbWFuaWZlc3QgZW50cnkgYXMgdGhlIHN5bnRoIHJlY29yZHMgaXQuIENhcnJpZXMgdGhlIHJlc29sdmVkIHBsdWdpblxuICogcmVjb3JkJ3MgaWQgc28gdGhlIHBpcGVsaW5lIHNlcnZpY2UgY2FuIHJlLXJlc29sdmUgdGhlIGF1dGhvcml0YXRpdmVcbiAqIG5hbWUvdmVyc2lvbi9kaWdlc3Qvb3duZXIgaXRzZWxmIOKAlCB0aGUgQ0xJJ3MgY2xhaW0gaXMgbmV2ZXIgdHJ1c3RlZCBmb3JcbiAqIGFueXRoaW5nIHRoYXQgZmVlZHMgY3Jvc3Mtb3JnIHN0YXRzIChwdWJsaXNoZXIsIHZlcmlmaWVkIHVzZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcE1hbmlmZXN0RW50cnkge1xuICAvKiogQ29kZVBpcGVsaW5lIHN0YWdlIG5hbWUsIGFzIHRoZSBidWlsdCBwaXBlbGluZSBuYW1lcyBpdC4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBDb2RlUGlwZWxpbmUgYWN0aW9uIG5hbWUsIGFzIHRoZSBidWlsdCBwaXBlbGluZSBuYW1lcyBpdC4gKi9cbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nO1xuICAvKiogYHBsdWdpbnMuaWRgIG9mIHRoZSByZXNvbHZlZCBwbHVnaW4gcmVjb3JkLiAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpblZlcnNpb246IHN0cmluZztcbiAgLyoqIFNpZ25lZCBpbWFnZSBkaWdlc3QgdGhlIHN0ZXAgaXMgcGlubmVkIHRvOyBudWxsIGZvciBpbWFnZS1sZXNzIHBsdWdpbnMuICovXG4gIHJlYWRvbmx5IGltYWdlRGlnZXN0OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHN0ZXAncyBsYWJlbCAoYHBsdWdpblN0ZXBMYWJlbGA6IGBzeW50aGAgb3IgYDxzdGFnZT4vPGFsaWFzID8/IG5hbWU+YCkg4oCUXG4gICAqIHdoYXQgdGhlIENMSSBhbmQgdGhlIGxvb2t1cCBMYW1iZGEgc2VuZCBhcyBsb29rdXAgYGNvbnRleHQuc3RlcEtleXNgLCBhbmQgdGhlXG4gICAqIHJ1bi10aW1lIGNoZWNrIGFza3MgYWJvdXQuIExldHMgdGhlIHBsYXRmb3JtIGpvaW4gbG9va3VwIHdhcm5pbmdzIHRvIHRoaXNcbiAgICogbWFuaWZlc3Qgcm93LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcEtleT86IHN0cmluZztcbn1cblxuLyoqIFRoZSBwbHVnaW4gZmllbGRzIHtAbGluayBwbHVnaW5JbWFnZVJlcG9zaXRvcnl9IHJlYWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5JbWFnZVJlZiB7XG4gIHJlYWRvbmx5IG9yZ0lkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYnVpbGRUeXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RyeSByZXBvc2l0b3J5IGFuIG9yZy1vd25lZCBwbHVnaW4gUk9XJ3MgaW1hZ2UgbGl2ZXMgYXRcbiAqIChgPG5hbWVzcGFjZT4vPG5hbWU+YCwgbm8gaG9zdCwgbm8gZGlnZXN0KTogdGhlIHN5c3RlbSBvcmcncyB1bmRlclxuICogYHN5c3RlbS9gLCBhIHRlbmFudCdzIHVuZGVyIGBvcmctPG9yZ0lkPi9gLiBNdXN0IG1hdGNoIHRoZSBwdXNoIHNpZGVcbiAqIChhcGkvcGx1Z2luIGBwbHVnaW5VcmlgKS4gUmV0dXJucyBudWxsIGZvciBhIGBtZXRhZGF0YV9vbmx5YCBwbHVnaW4uXG4gKlxuICogT25seSBmb3Igcm93cyB0aGUgY2FsbGVyJ3Mgb3JnIHJlc29sdmVzIGFzIGl0cyBPV04gKG9yIGl0cyBwYXJlbnQncyk6IHRoZVxuICogcGx1Z2luIGxvb2t1cCBzdGFtcHMgaXQgYXMgdGhlIHJlY29yZCdzIGBpbWFnZVJlcG9zaXRvcnlgLiBBIGxpc3RlZCBwbHVnaW4nc1xuICogcmVwb3NpdG9yeSBpcyBpdHMgbGlzdGluZyB2ZXJzaW9uJ3MgYHB1YmxpYy88cHVibGlzaGVyPi88bmFtZT5gIGNvcHkg4oCUXG4gKiBzeW50aCBuZXZlciBkZXJpdmVzIGEgcmVwb3NpdG9yeSBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5JbWFnZVJlcG9zaXRvcnkocGx1Z2luOiBQbHVnaW5JbWFnZVJlZik6IHN0cmluZyB8IG51bGwge1xuICBpZiAocGx1Z2luLmJ1aWxkVHlwZSA9PT0gJ21ldGFkYXRhX29ubHknKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbmFtZXNwYWNlID0gcGx1Z2luLm9yZ0lkID09PSBTWVNURU1fT1JHX0lEID8gJ3N5c3RlbScgOiBgb3JnLSR7cGx1Z2luLm9yZ0lkfWA7XG4gIHJldHVybiBgJHtuYW1lc3BhY2V9LyR7cGx1Z2luLm5hbWV9YDtcbn1cblxuLyoqIEEgcGx1Z2luIGltYWdlIHJlcG9zaXRvcnkgbG9va3VwIG1heSByZXR1cm46IGBwdWJsaWMvPHB1Ymxpc2hlcj4vPG5hbWU+YCwgYG9yZy08aWQ+LzxuYW1lPmAgb3IgYHN5c3RlbS88bmFtZT5gLiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9JTUFHRV9SRVBPU0lUT1JZX1JFID0gL14oPzpwdWJsaWNcXC9bYS16MC05XSsoPzotW2EtejAtOV0rKSp8b3JnLVthLXowLTldW2EtejAtOS1dKnxzeXN0ZW0pXFwvW2EtejAtOV1bYS16MC05Ll8tXSokLztcbiJdfQ==
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1tYW5pZmVzdC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvc3RlcC1tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUNMLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLGFBQWEsR0FDN0YsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztBQUV6Rjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHNDQUFzQyxDQUFDO0FBZ0Q1RSx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQXdCO0lBQ3hELE9BQVEsS0FBNEIsQ0FBQyxJQUFJLEtBQUssYUFBYTtXQUN0RCxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssMEJBQTBCLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSywyQkFBMkIsQ0FBQyxDQUFDO0FBQzVHLENBQUM7QUFTRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQXNCO0lBQzFELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxlQUFlO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEYsT0FBTyxHQUFHLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDdkMsQ0FBQztBQUVELHNIQUFzSDtBQUN0SCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0RkFBNEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFN0ZXAgbWFuaWZlc3Q6IHdoaWNoIHBsdWdpbiBlYWNoIENvZGVQaXBlbGluZSBhY3Rpb25cbiAqIG9mIGEgZGVwbG95ZWQgcGlwZWxpbmUgcnVucy4gQ0RLLWZyZWUgaGFsZiDigJQgdGhlIHNoYXBlcyBhbmQgaGVscGVycyBzaGFyZWQgYnlcbiAqIHRoZSBzeW50aCAod2hpY2ggcmVjb3JkcyBpdCwgc2VlIGBwaXBlbGluZS9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLnRzYCksIHRoZVxuICogQ0xJICh3aGljaCBzaGlwcyBpdCB3aXRoIHRoZSByZWdpc3RyeSByZWdpc3RyYXRpb24pIGFuZCB0aGUgcGlwZWxpbmUgc2VydmljZVxuICogKHdoaWNoIHZhbGlkYXRlcyBhbmQgc3RvcmVzIGl0IGluIGBwaXBlbGluZV9zdGVwX21hbmlmZXN0c2ApLlxuICpcbiAqIEV2ZW50IGluZ2VzdCBqb2lucyBgcGlwZWxpbmVfZXZlbnRzYCBvbiAocGlwZWxpbmVfaWQsIHN0YWdlX25hbWUsXG4gKiBhY3Rpb25fbmFtZSksIHNvIGBzdGFnZU5hbWVgL2BhY3Rpb25OYW1lYCBoZXJlIGFyZSByZWFkIG9mZiB0aGUgQlVJTFRcbiAqIENvZGVQaXBlbGluZSwgbmV2ZXIgcmVjb21wdXRlZCBmcm9tIG91ciBvd24gaWRzIOKAlCB0aGV5IGFyZSBleGFjdGx5IHRoZSBuYW1lc1xuICogQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgcmVwb3J0LlxuICovXG5cbmltcG9ydCB7XG4gIEJVSUxEX0lNQUdFX01BTklGRVNUX0FDVElPTiwgQlVJTERfSU1BR0VfTUFOSUZFU1RfU1RBR0UsIEJVSUxEX0lNQUdFX1NURVBfS0VZLCBTWVNURU1fT1JHX0lELCB0eXBlIFRvb2xjaGFpblJlc29sdmVkVmlhLFxufSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbmV4cG9ydCB7IEJVSUxEX0lNQUdFX01BTklGRVNUX0FDVElPTiwgQlVJTERfSU1BR0VfTUFOSUZFU1RfU1RBR0UsIEJVSUxEX0lNQUdFX1NURVBfS0VZIH07XG5cbi8qKlxuICogRmlsZSB0aGUgc3ludGggYXBwIHdyaXRlcyB0aGUgbWFuaWZlc3QgdG8sIGluc2lkZSB0aGUgY2xvdWQgYXNzZW1ibHlcbiAqIGRpcmVjdG9yeSAoYGNkayBkZXBsb3kgLS1vdXRwdXQ9PGRpcj5gKS4gVGhlIENMSSByZWFkcyBpdCBiYWNrIGFmdGVyIGFcbiAqIHN1Y2Nlc3NmdWwgZGVwbG95IGFuZCBmb3J3YXJkcyBpdCBvbiB0aGUgcmVnaXN0cnkgUE9TVC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNURVBfTUFOSUZFU1RfRklMRSA9ICdwYi1zdGVwLW1hbmlmZXN0Lmpzb24nO1xuXG4vKipcbiAqIGBpZGAgb2YgZXZlcnkgc3ludGhlc2l6ZWQgcGxhY2Vob2xkZXIgcGx1Z2luIChQbHVnaW5Mb29rdXAgYGZhbGxiYWNrKClgIC9cbiAqIGBib290c3RyYXAoKWApIOKAlCBhIHJlY29yZCBzdGFuZGluZyBpbiBmb3IgYSBsb29rdXAgdGhhdCBjb3VsZCBub3QgcmVzb2x2ZSBhdFxuICogc3ludGguIE5ldmVyIGEgcmVhbCBgcGx1Z2luc2Agcm93LCBzbyB0aGUgc3RlcCBtYW5pZmVzdCBuZXZlciByZWNvcmRzIGl0LlxuICovXG5leHBvcnQgY29uc3QgUExBQ0VIT0xERVJfUExVR0lOX0lEID0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogT25lIG1hbmlmZXN0IGVudHJ5IGFzIHRoZSBzeW50aCByZWNvcmRzIGl0LiBDYXJyaWVzIHRoZSByZXNvbHZlZCBwbHVnaW5cbiAqIHJlY29yZCdzIGlkIHNvIHRoZSBwaXBlbGluZSBzZXJ2aWNlIGNhbiByZS1yZXNvbHZlIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBuYW1lL3ZlcnNpb24vZGlnZXN0L293bmVyIGl0c2VsZiDigJQgdGhlIENMSSdzIGNsYWltIGlzIG5ldmVyIHRydXN0ZWQgZm9yXG4gKiBhbnl0aGluZyB0aGF0IGZlZWRzIGNyb3NzLW9yZyBzdGF0cyAocHVibGlzaGVyLCB2ZXJpZmllZCB1c2UpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYW5pZmVzdEVudHJ5IHtcbiAgLyoqIENvZGVQaXBlbGluZSBzdGFnZSBuYW1lLCBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQuICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogQ29kZVBpcGVsaW5lIGFjdGlvbiBuYW1lLCBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQuICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIGBwbHVnaW5zLmlkYCBvZiB0aGUgcmVzb2x2ZWQgcGx1Z2luIHJlY29yZC4gKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBTaWduZWQgaW1hZ2UgZGlnZXN0IHRoZSBzdGVwIGlzIHBpbm5lZCB0bzsgbnVsbCBmb3IgaW1hZ2UtbGVzcyBwbHVnaW5zLiAqL1xuICByZWFkb25seSBpbWFnZURpZ2VzdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBzdGVwJ3MgbGFiZWwgKGBwbHVnaW5TdGVwTGFiZWxgOiBgc3ludGhgIG9yIGA8c3RhZ2U+LzxhbGlhcyA/PyBuYW1lPmApIOKAlFxuICAgKiB3aGF0IHRoZSBDTEkgYW5kIHRoZSBsb29rdXAgTGFtYmRhIHNlbmQgYXMgbG9va3VwIGBjb250ZXh0LnN0ZXBLZXlzYCwgYW5kIHRoZVxuICAgKiBydW4tdGltZSBjaGVjayBhc2tzIGFib3V0LiBMZXRzIHRoZSBwbGF0Zm9ybSBqb2luIGxvb2t1cCB3YXJuaW5ncyB0byB0aGlzXG4gICAqIG1hbmlmZXN0IHJvdy5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZXBLZXk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBpcGVsaW5lJ3MgQlVJTEQgSU1BR0U6IHRoZSB0b29sY2hhaW4gcmVsZWFzZSdzIGBwaXBlbGluZS1ib290c3RyYXBgIGhhbGZcbiAqIGV2ZXJ5IHBsdWdpbi1sZXNzIGFjdGlvbiBydW5zIG9uIChkb2NzL3BsYW5zL2Jvb3RzdHJhcC1pbWFnZS12ZXJzaW9uaW5nLm1kIMKnNCkuXG4gKiBOb3QgYSBzdGVwIOKAlCBpdCByaWRlcyB0aGUgbWFuaWZlc3QgYXMgYSBub24tc3RlcCBlbnRyeSB1bmRlciB0aGVcbiAqIGBidWlsZC1pbWFnZWAga2V5IGFuZCB0aGUgc2VudGluZWwgKHN0YWdlLCBhY3Rpb24pIHRoZSBwbGF0Zm9ybSBzdG9yZXMgaXRcbiAqIHVuZGVyLCBzbyB0aGUgZGVwbG95LXJlZmVyZW5jZSBwYXRoIChpbi11c2UgcHJvdGVjdGlvbikgY291bnRzIHRoZSByZWxlYXNlLlxuICogYHBsdWdpblZlcnNpb25gIElTIHRoZSByZWxlYXNlIHZlcnNpb24gKGJvdGggaGFsdmVzIHNoYXJlIGl0KTsgdGhlIHBsYXRmb3JtXG4gKiByZS1yZWFkcyBuYW1lL3ZlcnNpb24vZGlnZXN0IGZyb20gdGhlIGBwbHVnaW5JZGAgcm93IGFzIGZvciBldmVyeSBlbnRyeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEltYWdlTWFuaWZlc3RFbnRyeSBleHRlbmRzIFN0ZXBNYW5pZmVzdEVudHJ5IHtcbiAgcmVhZG9ubHkga2luZDogJ2J1aWxkLWltYWdlJztcbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiB0eXBlb2YgQlVJTERfSU1BR0VfTUFOSUZFU1RfU1RBR0U7XG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHR5cGVvZiBCVUlMRF9JTUFHRV9NQU5JRkVTVF9BQ1RJT047XG4gIHJlYWRvbmx5IHN0ZXBLZXk6IHR5cGVvZiBCVUlMRF9JTUFHRV9TVEVQX0tFWTtcbiAgcmVhZG9ubHkgcmVsZWFzZVZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgaW1hZ2VSZXBvc2l0b3J5OiBzdHJpbmcgfCBudWxsO1xuICAvKiogSG93IHRoZSByZWxlYXNlIHdhcyBjaG9zZW4gZm9yIHRoaXMgcGlwZWxpbmUgYXQgc3ludGguICovXG4gIHJlYWRvbmx5IHJlc29sdmVkVmlhOiBUb29sY2hhaW5SZXNvbHZlZFZpYTtcbn1cblxuLyoqIFdoZXRoZXIgYSBtYW5pZmVzdCBlbnRyeSBpcyB0aGUge0BsaW5rIEJ1aWxkSW1hZ2VNYW5pZmVzdEVudHJ5fS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0J1aWxkSW1hZ2VFbnRyeShlbnRyeTogU3RlcE1hbmlmZXN0RW50cnkpOiBlbnRyeSBpcyBCdWlsZEltYWdlTWFuaWZlc3RFbnRyeSB7XG4gIHJldHVybiAoZW50cnkgYXMgeyBraW5kPzogdW5rbm93biB9KS5raW5kID09PSAnYnVpbGQtaW1hZ2UnXG4gICAgfHwgKGVudHJ5LnN0YWdlTmFtZSA9PT0gQlVJTERfSU1BR0VfTUFOSUZFU1RfU1RBR0UgJiYgZW50cnkuYWN0aW9uTmFtZSA9PT0gQlVJTERfSU1BR0VfTUFOSUZFU1RfQUNUSU9OKTtcbn1cblxuLyoqIFRoZSBwbHVnaW4gZmllbGRzIHtAbGluayBwbHVnaW5JbWFnZVJlcG9zaXRvcnl9IHJlYWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5JbWFnZVJlZiB7XG4gIHJlYWRvbmx5IG9yZ0lkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYnVpbGRUeXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RyeSByZXBvc2l0b3J5IGFuIG9yZy1vd25lZCBwbHVnaW4gUk9XJ3MgaW1hZ2UgbGl2ZXMgYXRcbiAqIChgPG5hbWVzcGFjZT4vPG5hbWU+YCwgbm8gaG9zdCwgbm8gZGlnZXN0KTogdGhlIHN5c3RlbSBvcmcncyB1bmRlclxuICogYHN5c3RlbS9gLCBhIHRlbmFudCdzIHVuZGVyIGBvcmctPG9yZ0lkPi9gLiBNdXN0IG1hdGNoIHRoZSBwdXNoIHNpZGVcbiAqIChhcGkvcGx1Z2luIGBwbHVnaW5VcmlgKS4gUmV0dXJucyBudWxsIGZvciBhIGBtZXRhZGF0YV9vbmx5YCBwbHVnaW4uXG4gKlxuICogT25seSBmb3Igcm93cyB0aGUgY2FsbGVyJ3Mgb3JnIHJlc29sdmVzIGFzIGl0cyBPV04gKG9yIGl0cyBwYXJlbnQncyk6IHRoZVxuICogcGx1Z2luIGxvb2t1cCBzdGFtcHMgaXQgYXMgdGhlIHJlY29yZCdzIGBpbWFnZVJlcG9zaXRvcnlgLiBBIGxpc3RlZCBwbHVnaW4nc1xuICogcmVwb3NpdG9yeSBpcyBpdHMgbGlzdGluZyB2ZXJzaW9uJ3MgYHB1YmxpYy88cHVibGlzaGVyPi88bmFtZT5gIGNvcHkg4oCUXG4gKiBzeW50aCBuZXZlciBkZXJpdmVzIGEgcmVwb3NpdG9yeSBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5JbWFnZVJlcG9zaXRvcnkocGx1Z2luOiBQbHVnaW5JbWFnZVJlZik6IHN0cmluZyB8IG51bGwge1xuICBpZiAocGx1Z2luLmJ1aWxkVHlwZSA9PT0gJ21ldGFkYXRhX29ubHknKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbmFtZXNwYWNlID0gcGx1Z2luLm9yZ0lkID09PSBTWVNURU1fT1JHX0lEID8gJ3N5c3RlbScgOiBgb3JnLSR7cGx1Z2luLm9yZ0lkfWA7XG4gIHJldHVybiBgJHtuYW1lc3BhY2V9LyR7cGx1Z2luLm5hbWV9YDtcbn1cblxuLyoqIEEgcGx1Z2luIGltYWdlIHJlcG9zaXRvcnkgbG9va3VwIG1heSByZXR1cm46IGBwdWJsaWMvPHB1Ymxpc2hlcj4vPG5hbWU+YCwgYG9yZy08aWQ+LzxuYW1lPmAgb3IgYHN5c3RlbS88bmFtZT5gLiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9JTUFHRV9SRVBPU0lUT1JZX1JFID0gL14oPzpwdWJsaWNcXC9bYS16MC05XSsoPzotW2EtejAtOV0rKSp8b3JnLVthLXowLTldW2EtejAtOS1dKnxzeXN0ZW0pXFwvW2EtejAtOV1bYS16MC05Ll8tXSokLztcbiJdfQ==