@pipeline-builder/pipeline-manager 4.5.2 → 4.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -37
- package/dist/agent/post-steps.d.ts +5 -4
- package/dist/agent/post-steps.d.ts.map +1 -1
- package/dist/agent/post-steps.js +19 -7
- package/dist/agent/targets.d.ts +12 -2
- package/dist/agent/targets.d.ts.map +1 -1
- package/dist/agent/targets.js +20 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +16 -7
- package/dist/commands/audit-stacks.d.ts +42 -1
- package/dist/commands/audit-stacks.d.ts.map +1 -1
- package/dist/commands/audit-stacks.js +104 -23
- package/dist/commands/audit-tokens.d.ts.map +1 -1
- package/dist/commands/audit-tokens.js +3 -4
- package/dist/commands/create-pat.d.ts.map +1 -1
- package/dist/commands/create-pat.js +9 -6
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +15 -2
- package/dist/commands/login.d.ts +3 -2
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +19 -10
- package/dist/commands/logout.d.ts +24 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +105 -0
- package/dist/commands/new-plugin.js +5 -5
- package/dist/commands/org-export.js +2 -2
- package/dist/commands/pipeline-remove.d.ts +26 -0
- package/dist/commands/pipeline-remove.d.ts.map +1 -0
- package/dist/commands/pipeline-remove.js +84 -0
- package/dist/commands/provision-steps.d.ts.map +1 -1
- package/dist/commands/provision-steps.js +1 -2
- package/dist/commands/provision.d.ts.map +1 -1
- package/dist/commands/provision.js +6 -5
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +3 -4
- package/dist/commands/status.d.ts +5 -2
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +65 -25
- package/dist/commands/toolchain.d.ts +21 -0
- package/dist/commands/toolchain.d.ts.map +1 -0
- package/dist/commands/toolchain.js +70 -0
- package/dist/commands/validate-templates.d.ts.map +1 -1
- package/dist/commands/validate-templates.js +4 -5
- package/dist/config/cli.constants.d.ts +8 -0
- package/dist/config/cli.constants.d.ts.map +1 -1
- package/dist/config/cli.constants.js +21 -2
- package/dist/types/plugin.d.ts +0 -6
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/plugin.js +1 -1
- package/dist/utils/command-utils.d.ts +13 -0
- package/dist/utils/command-utils.d.ts.map +1 -1
- package/dist/utils/command-utils.js +31 -17
- package/dist/utils/config-loader.d.ts +2 -1
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +14 -4
- package/dist/utils/credential-store.d.ts +9 -1
- package/dist/utils/credential-store.d.ts.map +1 -1
- package/dist/utils/credential-store.js +21 -2
- package/dist/utils/error-handler.d.ts +10 -1
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +20 -8
- package/dist/utils/pipeline-config.d.ts +5 -2
- package/dist/utils/pipeline-config.d.ts.map +1 -1
- package/dist/utils/pipeline-config.js +12 -3
- package/dist/utils/plugin-resolver.d.ts +21 -6
- package/dist/utils/plugin-resolver.d.ts.map +1 -1
- package/dist/utils/plugin-resolver.js +42 -9
- package/dist/utils/response-utils.d.ts +11 -0
- package/dist/utils/response-utils.d.ts.map +1 -1
- package/dist/utils/response-utils.js +23 -1
- package/dist/utils/toolchain.d.ts +78 -0
- package/dist/utils/toolchain.d.ts.map +1 -0
- package/dist/utils/toolchain.js +195 -0
- package/package.json +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { ErrorCode, errorMessage } from '@pipeline-builder/api-core';
|
|
3
|
+
import { ErrorCode, errorMessage, managedToolchainRefName, toolchainReleasePin } from '@pipeline-builder/api-core';
|
|
4
4
|
import { collectPluginSteps, exactPinNotFoundMessage, lookupNotFoundState, pluginArtifactAlias, pluginLookupFilter, summarizeLookupWarnings, unwrapLookup, } from '@pipeline-builder/pipeline-core';
|
|
5
5
|
import pico from 'picocolors';
|
|
6
6
|
import { ApiClient } from './api-client.js';
|
|
@@ -100,6 +100,21 @@ function exactVersionPin(ref) {
|
|
|
100
100
|
const version = ref.filter?.version;
|
|
101
101
|
return typeof version === 'string' && /^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(version) ? version : null;
|
|
102
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Whether a reference names a managed toolchain half (`cdk-synth`): the
|
|
105
|
+
* system org's, never a listing — so no publisher. It resolves through the
|
|
106
|
+
* toolchain release (the pipeline's `toolchain.release` pin, else the org /
|
|
107
|
+
* canary / platform default), never by its own version.
|
|
108
|
+
*/
|
|
109
|
+
export function isManagedToolchainRef(ref) {
|
|
110
|
+
return !ref.publisher && managedToolchainRefName(ref) !== null;
|
|
111
|
+
}
|
|
112
|
+
/** The plugin service's error code on a refused answer, when it carries one. */
|
|
113
|
+
export function serviceErrorCode(err) {
|
|
114
|
+
const data = err?.response?.data;
|
|
115
|
+
const code = data && typeof data === 'object' ? data.code : undefined;
|
|
116
|
+
return typeof code === 'string' && code.length > 0 ? code : null;
|
|
117
|
+
}
|
|
103
118
|
/**
|
|
104
119
|
* Every fatal refusal of one pre-resolution pass. Carries the structured list
|
|
105
120
|
* as well as the human message, so the synth can emit a machine-readable
|
|
@@ -156,14 +171,16 @@ function serviceMessage(err) {
|
|
|
156
171
|
* the deploy-time custom resource Lambda uses. Returning the full Plugin
|
|
157
172
|
* record at synth time is what allows the resulting CFN template to ship
|
|
158
173
|
* with real CodeBuild image URIs (`<host>/<ns>/<name>:<version>`) rather than
|
|
159
|
-
* the
|
|
160
|
-
* forces.
|
|
174
|
+
* the pipeline's default image that the synth-time token path forces.
|
|
161
175
|
*
|
|
162
176
|
* Failures are non-fatal: a missing plugin or unreachable API logs a warning
|
|
163
177
|
* and falls through to the deploy-time custom resource path so partial
|
|
164
178
|
* platform outages don't block synth/deploy. The exceptions abort the synth:
|
|
165
|
-
* the {@link FATAL_LOOKUP_CODES} refusals,
|
|
166
|
-
* not exist
|
|
179
|
+
* the {@link FATAL_LOOKUP_CODES} refusals, an exact version pin that does
|
|
180
|
+
* not exist, and ANY failure on a managed toolchain reference (`cdk-synth`),
|
|
181
|
+
* which has no deploy-time fallback (D2). A managed reference sends the
|
|
182
|
+
* pipeline's `toolchain.release` as `releasePin` — the same pin the bootstrap
|
|
183
|
+
* lookup sends — and its resolved release lands in `toolchainSink` by key.
|
|
167
184
|
*
|
|
168
185
|
* Every reference is looked up before anything is thrown, and ALL fatal
|
|
169
186
|
* refusals are reported together. Stopping at the first meant a pipeline with
|
|
@@ -182,11 +199,12 @@ function serviceMessage(err) {
|
|
|
182
199
|
*
|
|
183
200
|
* Keyed by `alias || name` to match `PluginLookup.plugin()`.
|
|
184
201
|
*/
|
|
185
|
-
export async function resolvePluginsForProps(client, props, warningSink) {
|
|
202
|
+
export async function resolvePluginsForProps(client, props, warningSink, toolchainSink) {
|
|
186
203
|
const refs = collectPluginRefs(props);
|
|
187
204
|
if (refs.length === 0)
|
|
188
205
|
return {};
|
|
189
206
|
const pipelineId = typeof props.pipelineId === 'string' && props.pipelineId.length > 0 ? props.pipelineId : undefined;
|
|
207
|
+
const releasePin = toolchainReleasePin(props);
|
|
190
208
|
// One lookup per alias may serve several steps: the labels of each, by alias.
|
|
191
209
|
const stepKeys = new Map();
|
|
192
210
|
for (const step of collectPluginSteps(props)) {
|
|
@@ -209,18 +227,29 @@ export async function resolvePluginsForProps(client, props, warningSink) {
|
|
|
209
227
|
const filter = pluginLookupFilter(ref);
|
|
210
228
|
const pin = exactVersionPin(ref);
|
|
211
229
|
const refuse = (code, message) => { fatal.push({ plugin: label, code, message }); };
|
|
230
|
+
// A managed toolchain half (cdk-synth) resolves through the RELEASE — the
|
|
231
|
+
// same `releasePin` the bootstrap lookup sends, so both halves come from
|
|
232
|
+
// one release — and it has no deploy-time fallback: any failure is fatal.
|
|
233
|
+
const managed = isManagedToolchainRef(ref);
|
|
234
|
+
const refuseManaged = (code, why) => refuse(code, `Toolchain plugin "${label}"${releasePin ? ` (release ${releasePin})` : ''} could not be resolved: ${why}`);
|
|
212
235
|
try {
|
|
213
236
|
const res = await client.post('/api/plugins/lookup', {
|
|
214
237
|
filter,
|
|
238
|
+
...(managed && releasePin ? { releasePin } : {}),
|
|
215
239
|
...(pipelineId && stepKeys.has(key) ? { context: { pipelineId, stepKeys: stepKeys.get(key) } } : {}),
|
|
216
240
|
});
|
|
217
|
-
const { plugin, warnings } = unwrapLookup(res);
|
|
241
|
+
const { plugin, warnings, toolchain } = unwrapLookup(res);
|
|
218
242
|
for (const warning of warnings) {
|
|
219
243
|
printLookupWarning(label, warning);
|
|
220
244
|
warningSink?.push(warning);
|
|
221
245
|
}
|
|
222
|
-
if (plugin) {
|
|
246
|
+
if (managed && (!plugin || !toolchain)) {
|
|
247
|
+
refuseManaged(ErrorCode.BOOTSTRAP_IMAGE_UNRESOLVED, plugin ? 'the answer carried no toolchain release' : 'the lookup returned no record');
|
|
248
|
+
}
|
|
249
|
+
else if (plugin) {
|
|
223
250
|
resolved[key] = plugin;
|
|
251
|
+
if (managed && toolchain && toolchainSink)
|
|
252
|
+
toolchainSink[key] = toolchain;
|
|
224
253
|
}
|
|
225
254
|
else if (pin) {
|
|
226
255
|
refuse('PLUGIN_VERSION_NOT_FOUND', pinNotFoundMessage(label, pin));
|
|
@@ -230,6 +259,10 @@ export async function resolvePluginsForProps(client, props, warningSink) {
|
|
|
230
259
|
}
|
|
231
260
|
}
|
|
232
261
|
catch (err) {
|
|
262
|
+
if (managed) {
|
|
263
|
+
refuseManaged(serviceErrorCode(err) ?? ErrorCode.BOOTSTRAP_IMAGE_UNRESOLVED, serviceMessage(err) ?? errorMessage(err));
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
233
266
|
// A plugin whose image signature doesn't verify, or a listing the org
|
|
234
267
|
// can't use, is NOT an outage to ride out: falling back would quietly
|
|
235
268
|
// turn it into an unresolved step. Stop.
|
|
@@ -254,4 +287,4 @@ export async function resolvePluginsForProps(client, props, warningSink) {
|
|
|
254
287
|
throw new PluginResolutionError(fatal);
|
|
255
288
|
return resolved;
|
|
256
289
|
}
|
|
257
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcGx1Z2luLXJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQ2hFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLFlBQVksR0FDL0UsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVdqRDs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsR0FBYztJQUM5QixPQUFPLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBOEI7SUFDdkQsTUFBTSxJQUFJLEdBQWdCLEVBQUUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUV2QyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQVksRUFBUSxFQUFFO1FBQ2xDLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDNUMsTUFBTSxDQUFDLEdBQUcsR0FBZ0IsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4Qix3RUFBd0U7UUFDeEUsMkVBQTJFO1FBQzNFLE1BQU0sSUFBSSxHQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBMkIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekIsc0VBQXNFO1lBQ3RFLHlFQUF5RTtZQUN6RSxvRUFBb0U7WUFDcEUsMEVBQTBFO1lBQzFFLHVEQUF1RDtZQUN2RCxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYixpQkFBaUIsR0FBRyx5Q0FBeUMsTUFBTSxVQUFVLE1BQU0sTUFBTTtzQkFDdkYsaUNBQWlDLENBQ3BDLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQXlDLENBQUM7SUFDOUQsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVwQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBb0UsQ0FBQztJQUMxRixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBc0I7SUFDNUMsU0FBUyxDQUFDLHlCQUF5QjtJQUNuQyxTQUFTLENBQUMsb0JBQW9CO0lBQzlCLFNBQVMsQ0FBQyx3QkFBd0I7SUFDbEMsU0FBUyxDQUFDLGtCQUFrQjtJQUM1QiwyRUFBMkU7SUFDM0UsOEVBQThFO0lBQzlFLGdCQUFnQjtDQUNqQixDQUFDO0FBRUYsK0ZBQStGO0FBQy9GLFNBQVMsZUFBZSxDQUFDLEdBQVk7SUFDbkMsTUFBTSxJQUFJLEdBQUksR0FBcUQsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO0lBQ3BGLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFFLElBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDOUYsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNyRixDQUFDO0FBRUQsb0ZBQW9GO0FBQ3BGLFNBQVMsVUFBVSxDQUFDLEdBQVk7SUFDOUIsTUFBTSxRQUFRLEdBQUksR0FBdUUsRUFBRSxRQUFRLENBQUM7SUFDcEcsTUFBTSxJQUFJLEdBQUcsUUFBUSxFQUFFLElBQUksSUFBSSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxRQUFRLENBQUMsSUFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMxSCxPQUFPLFFBQVEsRUFBRSxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksS0FBSyxTQUFTLENBQUMsU0FBUyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxHQUFjO0lBQ3JDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBQ3BDLE9BQU8sT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDM0csQ0FBQztBQVdEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsS0FBSztJQUN6QixRQUFRO0lBQTdCLFlBQXFCLFFBQWtDO1FBQ3JELEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDekIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQyxPQUFPO1lBQ3RCLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLDRCQUE0QixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBSHJGLFFBQVE7UUFJM0IsSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0NBQ0Y7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsa0JBQWtCLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFhO0lBQ25FLE9BQU8sdUJBQXVCLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLGNBQWMsR0FBeUQ7SUFDM0UsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO0lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNO0lBQ3BCLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRztJQUNmLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3hDLENBQUM7QUFFRix1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxPQUFzQjtJQUN0RSxNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDcEYsWUFBWSxDQUFDLEdBQUcsR0FBRyxZQUFZLEtBQUssTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsNEZBQTRGO0FBQzVGLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxRQUFrQztJQUMxRSxNQUFNLElBQUksR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU87SUFDbEIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVTtRQUN4RSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztZQUN0RCxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDMUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsU0FBUyxjQUFjLENBQUMsR0FBWTtJQUNsQyxNQUFNLElBQUksR0FBSSxHQUFxRCxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUM7SUFDcEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUUsSUFBOEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN2RyxPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDNUUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxNQUFpQixFQUNqQixLQUE4QixFQUM5QixXQUE2QjtJQUU3QixNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRWpDLE1BQU0sVUFBVSxHQUFHLE9BQU8sS0FBSyxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDdEgsOEVBQThFO0lBQzlFLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQzdDLEtBQUssTUFBTSxJQUFJLElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQTRCLEVBQUUsQ0FBQztJQUM3QyxNQUFNLEtBQUssR0FBb0IsRUFBRSxDQUFDO0lBRWxDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN4RSwyRUFBMkU7UUFDM0UseUVBQXlFO1FBQ3pFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsMEVBQTBFO1FBQzFFLDZFQUE2RTtRQUM3RSwyRUFBMkU7UUFDM0UsZ0ZBQWdGO1FBQ2hGLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQVksRUFBRSxPQUFlLEVBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFHLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBVSxxQkFBcUIsRUFBRTtnQkFDNUQsTUFBTTtnQkFDTixHQUFHLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3JHLENBQUMsQ0FBQztZQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQy9CLGtCQUFrQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQ3pCLENBQUM7aUJBQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDZixNQUFNLENBQUMsMEJBQTBCLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksQ0FBQyxXQUFXLEtBQUssc0VBQXNFLENBQUMsQ0FBQztZQUN2RyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixzRUFBc0U7WUFDdEUsc0VBQXNFO1lBQ3RFLHlDQUF5QztZQUN6QyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQ2pELE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxLQUFLLDBDQUEwQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RixPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssb0JBQW9CLElBQUksTUFBTSxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkcsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxDQUFDLDBCQUEwQixFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsWUFBWSxDQUFDLFdBQVcsS0FBSyw0QkFBNEIsR0FBRyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzVHLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRUosSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUkscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBFcnJvckNvZGUsIGVycm9yTWVzc2FnZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7XG4gIGNvbGxlY3RQbHVnaW5TdGVwcywgZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UsIGxvb2t1cE5vdEZvdW5kU3RhdGUsIHR5cGUgTG9va3VwV2FybmluZywgdHlwZSBMb29rdXBXYXJuaW5nU2V2ZXJpdHksXG4gIHBsdWdpbkFydGlmYWN0QWxpYXMsIHBsdWdpbkxvb2t1cEZpbHRlciwgc3VtbWFyaXplTG9va3VwV2FybmluZ3MsIHVud3JhcExvb2t1cCxcbn0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5cbi8qKiBNaW5pbWFsIHBsdWdpbiByZWZlcmVuY2Ugc2hhcGUg4oCUIG1hdGNoZXMgUGx1Z2luT3B0aW9ucyBmcm9tIHBpcGVsaW5lLWNvcmUuICovXG5pbnRlcmZhY2UgUGx1Z2luUmVmIHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogUHVibGlzaGVyIGhhbmRsZSBvZiBhbiBpbnN0YWxsZWQgbGlzdGluZy4gKi9cbiAgcHVibGlzaGVyPzogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgZmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2FjaGUga2V5IG1hdGNoaW5nIGBQbHVnaW5Mb29rdXAubm9ybWFsaXplKClgOiB0aGUgZXhwbGljaXQgYWxpYXMgd2hlbiBzZXQsXG4gKiBvdGhlcndpc2UgYFs8cHVibGlzaGVyPi1dPG5hbWU+LWFsaWFzYCDigJQgcGlwZWxpbmUtY29yZSdzXG4gKiBgcGx1Z2luQXJ0aWZhY3RBbGlhc2AsIHRoZSBvbmUgcnVsZSBldmVyeSBjb25zdW1lciBvZiB0aGlzIG1hcCB1c2VzLlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShyZWY6IFBsdWdpblJlZik6IHN0cmluZyB7XG4gIHJldHVybiBwbHVnaW5BcnRpZmFjdEFsaWFzKHJlZik7XG59XG5cbi8qKlxuICogV2FsayB0aGUgcGlwZWxpbmUgcHJvcHMgdHJlZSB0byBjb2xsZWN0IGV2ZXJ5IHBsdWdpbiByZWZlcmVuY2UuIFBsdWdpbnNcbiAqIGFwcGVhciBhdCBgc3ludGgucGx1Z2luYCBhbmQgYXQgYHN0YWdlc1tdLnN0ZXBzW10ucGx1Z2luYC4gRW50cmllcyBhcmVcbiAqIGRlLWR1cGxpY2F0ZWQgYnkgYGNhY2hlS2V5KClgIOKAlCB0aGUgc2FtZSBrZXkgYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAgdXNlcyxcbiAqIHNvIHRoZSByZXNvbHZlZC1wbHVnaW5zIG1hcCBsb29rdXBzIG1hdGNoIGRvd25zdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFBsdWdpblJlZltdIHtcbiAgY29uc3QgcmVmczogUGx1Z2luUmVmW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3QgcHVzaCA9IChyYXc6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSByYXcgYXMgUGx1Z2luUmVmO1xuICAgIGlmICghci5uYW1lKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocik7XG4gICAgLy8gVGhlIG5hbWUgdGhlIGxvb2t1cCB3aWxsIFRBUkdFVCDigJQgYW4gZXhwbGljaXQgYGZpbHRlci5uYW1lYCB3aW5zIChzZWVcbiAgICAvLyBiZWxvdyksIHNvIHR3byByZWZzIHRoYXQgcmVzb2x2ZSB0byB0aGUgc2FtZSBwbHVnaW4gYXJlIG5vdCBhIGNvbGxpc2lvbi5cbiAgICBjb25zdCBuYW1lID0gKHIuZmlsdGVyPy5uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gci5uYW1lO1xuICAgIGNvbnN0IHRhcmdldCA9IHIucHVibGlzaGVyID8gYCR7ci5wdWJsaXNoZXJ9LyR7bmFtZX1gIDogbmFtZTtcbiAgICBjb25zdCBob2xkZXIgPSBzZWVuLmdldChrZXkpO1xuICAgIGlmIChob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT25lIGFsaWFzIGNhbiBvbmx5IGV2ZXIgbWVhbiBvbmUgcGx1Z2luLiBEZWR1cGxpY2F0aW5nIG9uIHRoZSBhbGlhc1xuICAgICAgLy8gYWxvbmUga2VwdCB0aGUgRklSU1QgcGx1Z2luIGFuZCBzaWxlbnRseSBkcm9wcGVkIHRoZSBzZWNvbmQsIHNvIGEgc3RlcFxuICAgICAgLy8gZGVjbGFyaW5nIGB7IG5hbWU6ICdtYXZlbi1idWlsZCcsIGFsaWFzOiAnYnVpbGQnIH1gIGFmdGVyIGFub3RoZXJcbiAgICAgIC8vIGRlY2xhcmluZyBgeyBuYW1lOiAnbm9kZWpzLWJ1aWxkJywgYWxpYXM6ICdidWlsZCcgfWAgcmFuIG5vZGVqcy1idWlsZCdzXG4gICAgICAvLyBpbWFnZSBhbmQgY29tbWFuZHMg4oCUIG5vIGVycm9yLCBqdXN0IHRoZSB3cm9uZyBidWlsZC5cbiAgICAgIGlmIChob2xkZXIgIT09IHRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBsdWdpbiBhbGlhcyBcIiR7a2V5fVwiIGlzIHVzZWQgZm9yIHR3byBkaWZmZXJlbnQgcGx1Z2lucyAoXCIke2hvbGRlcn1cIiBhbmQgXCIke3RhcmdldH1cIikuIGBcbiAgICAgICAgICArICdHaXZlIGVhY2ggcGx1Z2luIGl0cyBvd24gYWxpYXMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2Vlbi5zZXQoa2V5LCB0YXJnZXQpO1xuICAgIHJlZnMucHVzaChyKTtcbiAgfTtcblxuICBjb25zdCBzeW50aCA9IHByb3BzLnN5bnRoIGFzIHsgcGx1Z2luPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBwdXNoKHN5bnRoPy5wbHVnaW4pO1xuXG4gIGNvbnN0IHN0YWdlcyA9IHByb3BzLnN0YWdlcyBhcyBBcnJheTx7IHN0ZXBzPzogQXJyYXk8eyBwbHVnaW4/OiB1bmtub3duIH0+IH0+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcyA/PyBbXSkge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGFnZS5zdGVwcyA/PyBbXSkge1xuICAgICAgcHVzaChzdGVwLnBsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbi8qKlxuICogTG9va3VwIHJlZnVzYWxzIHRoYXQgbXVzdCBTVE9QIHRoZSBzeW50aCByYXRoZXIgdGhhbiBmYWxsIGJhY2sgdG9cbiAqIGRlcGxveS10aW1lIHJlc29sdXRpb246IGFuIGltYWdlIHdob3NlIHNpZ25hdHVyZSBkb2Vzbid0IHZlcmlmeSwgYSBsaXN0aW5nXG4gKiB0aGUgb3JnIGNhbid0IHVzZSAobm90IGluc3RhbGxlZCwgYmxvY2tlZCBieSBpdHMgYWxsb3cvZGVueSBwb2xpY3ksIHlhbmtlZFxuICogb3Igc3VzcGVuZGVkKSwgYW5kIGFuIG9yZyBwbHVnaW4gdGhhdCB3YXMgZGVsZXRlZC4gRmFsbGluZyBiYWNrIHdvdWxkXG4gKiBxdWlldGx5IHR1cm4gZWFjaCBpbnRvIGFuIHVucmVzb2x2ZWQgc3RlcCB0aGF0IGZhaWxzIGF0IHJ1biB0aW1lIGluc3RlYWQgb2ZcbiAqIG5vdy4gVnVsbmVyYWJpbGl0eSBzdGF0ZSBpcyBORVZFUiBvbmUgb2YgdGhlc2U6IGl0IGFycml2ZXMgYXMgZ3JhZGVkXG4gKiB3YXJuaW5ncyBiZXNpZGUgYSByZXNvbHZlZCBwbHVnaW4uXG4gKi9cbmNvbnN0IEZBVEFMX0xPT0tVUF9DT0RFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIEVycm9yQ29kZS5JTUFHRV9WRVJJRklDQVRJT05fRkFJTEVELFxuICBFcnJvckNvZGUuUExVR0lOX05PVF9JTlNUQUxMRUQsXG4gIEVycm9yQ29kZS5QTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1ksXG4gIEVycm9yQ29kZS5QTFVHSU5fVU5BVkFJTEFCTEUsXG4gIC8vIFRoZSBvcmcncyBvd24gcGx1Z2luIHdhcyBkZWxldGVkOiB0aGUgbG9va3VwIHJlZnVzZXMgaXQgcmF0aGVyIHRoYW4gZmFsbFxuICAvLyB0aHJvdWdoIHRvIGEgc2FtZS1uYW1lIGxpc3RpbmcuIChQbHVnaW4gc2VydmljZSBjb2RlOyBtYXRjaGVkIGFzIGEgc3RyaW5nLilcbiAgJ1BMVUdJTl9ERUxFVEVEJyxcbl07XG5cbi8qKiBUaGUgZXJyb3IgY29kZSBvZiBhIHBsdWdpbiBzZXJ2aWNlIGFuc3dlciwgd2hlbiBpdCBpcyBvbmUgb2Yge0BsaW5rIEZBVEFMX0xPT0tVUF9DT0RFU30uICovXG5mdW5jdGlvbiBmYXRhbExvb2t1cENvZGUoZXJyOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlPy5kYXRhO1xuICBjb25zdCBjb2RlID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycgJiYgRkFUQUxfTE9PS1VQX0NPREVTLmluY2x1ZGVzKGNvZGUpID8gY29kZSA6IG51bGw7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBwbHVnaW4gc2VydmljZSBhbnN3ZXJlZCBcIm5vIHN1Y2ggcGx1Z2luL3ZlcnNpb25cIiAoNDA0IE5PVF9GT1VORCkuICovXG5mdW5jdGlvbiBpc05vdEZvdW5kKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCByZXNwb25zZSA9IChlcnIgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogdW5rbm93bjsgZGF0YT86IHVua25vd24gfSB9IHwgdW5kZWZpbmVkKT8ucmVzcG9uc2U7XG4gIGNvbnN0IGNvZGUgPSByZXNwb25zZT8uZGF0YSAmJiB0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcgPyAocmVzcG9uc2UuZGF0YSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiByZXNwb25zZT8uc3RhdHVzID09PSA0MDQgfHwgY29kZSA9PT0gRXJyb3JDb2RlLk5PVF9GT1VORDtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBhIHJlZmVyZW5jZSBQSU5TIOKAlCBvbmUgZXhhY3QgYHgueS56Wy1wcmVdYCwgbm90IGEgcmFuZ2Ugb3JcbiAqIGBsYXRlc3RgLiBBIHBpbiBuYW1lcyBhIHZlcnNpb24gdGhhdCBtdXN0IGV4aXN0OiBpZiBpdCBkb2Vzbid0IChuZXZlclxuICogcHVibGlzaGVkLCBvciByZWZ1c2VkIGJ5IHRoZSBidWlsZCdzIHZ1bG5lcmFiaWxpdHkgZ2F0ZSwgd2hpY2ggc2F2ZXNcbiAqIG5vdGhpbmcpLCB0aGVyZSBpcyBubyBvdXRhZ2UgdG8gcmlkZSBvdXQgYW5kIG5vdGhpbmcgZm9yIHRoZSBkZXBsb3ktdGltZVxuICogbG9va3VwIHRvIGZpbmQgZWl0aGVyLlxuICovXG5mdW5jdGlvbiBleGFjdFZlcnNpb25QaW4ocmVmOiBQbHVnaW5SZWYpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdmVyc2lvbiA9IHJlZi5maWx0ZXI/LnZlcnNpb247XG4gIHJldHVybiB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgJiYgL15cXGQrXFwuXFxkK1xcLlxcZCsoLVswLTlBLVphLXouLV0rKT8kLy50ZXN0KHZlcnNpb24pID8gdmVyc2lvbiA6IG51bGw7XG59XG5cbi8qKiBPbmUgcGx1Z2luIHRoZSBzeW50aCBjb3VsZCBub3QgdXNlLCBhcyB7QGxpbmsgUGx1Z2luUmVzb2x1dGlvbkVycm9yfSByZXBvcnRzIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5SZWZ1c2FsIHtcbiAgLyoqIGBbPHB1Ymxpc2hlcj4vXTxuYW1lPmAgb2YgdGhlIHJlZmVyZW5jZS4gKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBzdHJpbmc7XG4gIC8qKiBUaGUgcGx1Z2luIHNlcnZpY2UncyBlcnJvciBjb2RlLCBvciBhIGxvY2FsIG9uZSAoYFBMVUdJTl9WRVJTSU9OX05PVF9GT1VORGApLiAqL1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFdmVyeSBmYXRhbCByZWZ1c2FsIG9mIG9uZSBwcmUtcmVzb2x1dGlvbiBwYXNzLiBDYXJyaWVzIHRoZSBzdHJ1Y3R1cmVkIGxpc3RcbiAqIGFzIHdlbGwgYXMgdGhlIGh1bWFuIG1lc3NhZ2UsIHNvIHRoZSBzeW50aCBjYW4gZW1pdCBhIG1hY2hpbmUtcmVhZGFibGVcbiAqIGZhaWx1cmUgbGluZSAoYFBCX1NZTlRIX0ZBSUxVUkVgKSB0aGUgZXhlY3V0aW9uIGV2ZW50cyBwaWNrIHVwLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luUmVzb2x1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSByZWZ1c2FsczogcmVhZG9ubHkgUGx1Z2luUmVmdXNhbFtdKSB7XG4gICAgc3VwZXIocmVmdXNhbHMubGVuZ3RoID09PSAxXG4gICAgICA/IHJlZnVzYWxzWzBdIS5tZXNzYWdlXG4gICAgICA6IGAke3JlZnVzYWxzLmxlbmd0aH0gcGx1Z2lucyBjYW4ndCBiZSB1c2VkOlxcbiR7cmVmdXNhbHMubWFwKChyKSA9PiBgICAtICR7ci5tZXNzYWdlfWApLmpvaW4oJ1xcbicpfWApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5SZXNvbHV0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogV2h5IGFuIGV4YWN0IHBpbiB3YXMgbm90IGZvdW5kLCBwaHJhc2VkIGZyb20gdGhlIDQwNCdzIGBkZXRhaWxzLnN0YXRlYFxuICogKGBkZWxldGVkYCAvIGBpbmFjdGl2ZWAgLyBgeWFua2VkYCAvIGBtaXNzaW5nYCkuIFdpdGhvdXQgYSBzdGF0ZSB0aGUgYW5zd2VyXG4gKiBjYW5ub3QgdGVsbCB0aGUgY2FzZXMgYXBhcnQsIHNvIHRoZSBtZXNzYWdlIG5hbWVzIHRoZSB0d28gbGlrZWxpZXN0LlxuICogU2hhcmVkIHdpdGggdGhlIGRlcGxveS10aW1lIExhbWJkYSdzIENsb3VkRm9ybWF0aW9uIHJlYXNvbiAocGlwZWxpbmUtY29yZSkuXG4gKi9cbmZ1bmN0aW9uIHBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbDogc3RyaW5nLCBwaW46IHN0cmluZywgZXJyPzogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbCwgcGluLCBsb29rdXBOb3RGb3VuZFN0YXRlKGVycikpO1xufVxuXG5jb25zdCBTRVZFUklUWV9TVFlMRTogUmVjb3JkPExvb2t1cFdhcm5pbmdTZXZlcml0eSwgKHM6IHN0cmluZykgPT4gc3RyaW5nPiA9IHtcbiAgaW5mbzogcGljby5jeWFuLFxuICB3YXJuaW5nOiBwaWNvLnllbGxvdyxcbiAgZXJyb3I6IHBpY28ucmVkLFxuICBjcml0aWNhbDogKHQpID0+IHBpY28uYm9sZChwaWNvLnJlZCh0KSksXG59O1xuXG4vKiogUHJpbnQgb25lIGxvb2t1cCB3YXJuaW5nLCBwcmVmaXhlZCBhbmQgY29sb3VyZWQgYnkgaXRzIHNldmVyaXR5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50TG9va3VwV2FybmluZyhsYWJlbDogc3RyaW5nLCB3YXJuaW5nOiBMb29rdXBXYXJuaW5nKTogdm9pZCB7XG4gIGNvbnN0IHRhZyA9IFNFVkVSSVRZX1NUWUxFW3dhcm5pbmcuc2V2ZXJpdHldKGBbJHt3YXJuaW5nLnNldmVyaXR5LnRvVXBwZXJDYXNlKCl9XWApO1xuICBwcmludFdhcm5pbmcoYCR7dGFnfSBQbHVnaW4gXCIke2xhYmVsfVwiOiAke3dhcm5pbmcubWVzc2FnZX1gKTtcbn1cblxuLyoqIFByaW50IHRoZSBvbmUtbGluZSBzZXZlcml0eSBzdW1tYXJ5IG9mIGEgc3ludGgncyBsb29rdXAgd2FybmluZ3MgKG5vdGhpbmcgd2hlbiBub25lKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludExvb2t1cFdhcm5pbmdTdW1tYXJ5KHdhcm5pbmdzOiByZWFkb25seSBMb29rdXBXYXJuaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgbGluZSA9IHN1bW1hcml6ZUxvb2t1cFdhcm5pbmdzKHdhcm5pbmdzKTtcbiAgaWYgKCFsaW5lKSByZXR1cm47XG4gIGNvbnN0IHdvcnN0ID0gd2FybmluZ3Muc29tZSgodykgPT4gdy5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykgPyAnY3JpdGljYWwnXG4gICAgOiB3YXJuaW5ncy5zb21lKCh3KSA9PiB3LnNldmVyaXR5ID09PSAnZXJyb3InKSA/ICdlcnJvcidcbiAgICAgIDogd2FybmluZ3Muc29tZSgodykgPT4gdy5zZXZlcml0eSA9PT0gJ3dhcm5pbmcnKSA/ICd3YXJuaW5nJyA6ICdpbmZvJztcbiAgcHJpbnRXYXJuaW5nKFNFVkVSSVRZX1NUWUxFW3dvcnN0XShsaW5lKSk7XG59XG5cbi8qKiBUaGUgcGx1Z2luIHNlcnZpY2UncyBvd24gcmVmdXNhbCBtZXNzYWdlLCB3aGVuIHRoZSBhbnN3ZXIgY2FycmllcyBvbmUuICovXG5mdW5jdGlvbiBzZXJ2aWNlTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZGF0YSA9IChlcnIgYXMgeyByZXNwb25zZT86IHsgZGF0YT86IHVua25vd24gfSB9IHwgdW5kZWZpbmVkKT8ucmVzcG9uc2U/LmRhdGE7XG4gIGNvbnN0IG1lc3NhZ2UgPSBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IChkYXRhIGFzIHsgbWVzc2FnZT86IHVua25vd24gfSkubWVzc2FnZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJiBtZXNzYWdlLmxlbmd0aCA+IDAgPyBtZXNzYWdlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBQcmUtcmVzb2x2ZSBwbHVnaW5zIGJ5IGNhbGxpbmcgdGhlIHNhbWUgYFBPU1QgL2FwaS9wbHVnaW5zL2xvb2t1cGAgZW5kcG9pbnRcbiAqIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgTGFtYmRhIHVzZXMuIFJldHVybmluZyB0aGUgZnVsbCBQbHVnaW5cbiAqIHJlY29yZCBhdCBzeW50aCB0aW1lIGlzIHdoYXQgYWxsb3dzIHRoZSByZXN1bHRpbmcgQ0ZOIHRlbXBsYXRlIHRvIHNoaXBcbiAqIHdpdGggcmVhbCBDb2RlQnVpbGQgaW1hZ2UgVVJJcyAoYDxob3N0Pi88bnM+LzxuYW1lPjo8dmVyc2lvbj5gKSByYXRoZXIgdGhhblxuICogdGhlIGBhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjcuMGAgZmFsbGJhY2sgdGhhdCB0aGUgc3ludGgtdGltZSB0b2tlbiBwYXRoXG4gKiBmb3JjZXMuXG4gKlxuICogRmFpbHVyZXMgYXJlIG5vbi1mYXRhbDogYSBtaXNzaW5nIHBsdWdpbiBvciB1bnJlYWNoYWJsZSBBUEkgbG9ncyBhIHdhcm5pbmdcbiAqIGFuZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgcGF0aCBzbyBwYXJ0aWFsXG4gKiBwbGF0Zm9ybSBvdXRhZ2VzIGRvbid0IGJsb2NrIHN5bnRoL2RlcGxveS4gVGhlIGV4Y2VwdGlvbnMgYWJvcnQgdGhlIHN5bnRoOlxuICogdGhlIHtAbGluayBGQVRBTF9MT09LVVBfQ09ERVN9IHJlZnVzYWxzLCBhbmQgYW4gZXhhY3QgdmVyc2lvbiBwaW4gdGhhdCBkb2VzXG4gKiBub3QgZXhpc3QuXG4gKlxuICogRXZlcnkgcmVmZXJlbmNlIGlzIGxvb2tlZCB1cCBiZWZvcmUgYW55dGhpbmcgaXMgdGhyb3duLCBhbmQgQUxMIGZhdGFsXG4gKiByZWZ1c2FscyBhcmUgcmVwb3J0ZWQgdG9nZXRoZXIuIFN0b3BwaW5nIGF0IHRoZSBmaXJzdCBtZWFudCBhIHBpcGVsaW5lIHdpdGhcbiAqIHRocmVlIHJlZnVzZWQgcGx1Z2lucyB0b29rIHRocmVlIHN5bnRoIGF0dGVtcHRzIHRvIGxlYXJuIGFib3V0IGFsbCB0aHJlZS5cbiAqXG4gKiBFdmVyeSBsb29rdXAgd2FybmluZyBpcyBwcmludGVkLCBncmFkZWQgYnkgc2V2ZXJpdHksIGFuZCBhcHBlbmRlZCB0b1xuICogYHdhcm5pbmdTaW5rYCB3aGVuIGdpdmVuICh0aGUgc3ludGggcHJpbnRzIGEgb25lLWxpbmUgc3VtbWFyeSBhdCBpdHMgZW5kKS5cbiAqIEEgd2FybmluZyBuZXZlciBmYWlscyB0aGUgc3ludGgg4oCUIHZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgcmVwb3J0ZWQsIG5vdFxuICogZW5mb3JjZWQuXG4gKlxuICogV2hlbiB0aGUgcHJvcHMgY2FycnkgYSBgcGlwZWxpbmVJZGAsIGVhY2ggbG9va3VwIGFsc28gc2VuZHNcbiAqIGBjb250ZXh0OiB7IHBpcGVsaW5lSWQsIHN0ZXBLZXlzIH1gIOKAlCB0aGUgbGFiZWwgKGBwbHVnaW5TdGVwTGFiZWxgOiBgc3ludGhgIG9yXG4gKiBgPHN0YWdlPi88YWxpYXMgPz8gbmFtZT5gKSBvZiBFVkVSWSBzdGVwIHRoZSBkZS1kdXBsaWNhdGVkIHJlZmVyZW5jZSBzZXJ2ZXMg4oCUXG4gKiBzbyB0aGUgcGx1Z2luIHNlcnZpY2UgY2FuIHJlY29yZCB0aGUgd2FybmluZ3MgaXQgcmV0dXJucyBhZ2FpbnN0IGVhY2ggb2ZcbiAqIHRob3NlIHBpcGVsaW5lIHN0ZXBzLCBub3Qgb25seSBwcmludCB0aGVtIGludG8gdGhpcyBzeW50aCdzIGxvZy5cbiAqXG4gKiBLZXllZCBieSBgYWxpYXMgfHwgbmFtZWAgdG8gbWF0Y2ggYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUGx1Z2luc0ZvclByb3BzKFxuICBjbGllbnQ6IEFwaUNsaWVudCxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB3YXJuaW5nU2luaz86IExvb2t1cFdhcm5pbmdbXSxcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcmVmcyA9IGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzKTtcbiAgaWYgKHJlZnMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG5cbiAgY29uc3QgcGlwZWxpbmVJZCA9IHR5cGVvZiBwcm9wcy5waXBlbGluZUlkID09PSAnc3RyaW5nJyAmJiBwcm9wcy5waXBlbGluZUlkLmxlbmd0aCA+IDAgPyBwcm9wcy5waXBlbGluZUlkIDogdW5kZWZpbmVkO1xuICAvLyBPbmUgbG9va3VwIHBlciBhbGlhcyBtYXkgc2VydmUgc2V2ZXJhbCBzdGVwczogdGhlIGxhYmVscyBvZiBlYWNoLCBieSBhbGlhcy5cbiAgY29uc3Qgc3RlcEtleXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBjb2xsZWN0UGx1Z2luU3RlcHMocHJvcHMpKSB7XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkoc3RlcCk7XG4gICAgc3RlcEtleXMuc2V0KGtleSwgWy4uLihzdGVwS2V5cy5nZXQoa2V5KSA/PyBbXSksIHN0ZXAubGFiZWxdKTtcbiAgfVxuICBjb25zdCByZXNvbHZlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgY29uc3QgZmF0YWw6IFBsdWdpblJlZnVzYWxbXSA9IFtdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHJlZnMubWFwKGFzeW5jIChyZWYpID0+IHtcbiAgICBjb25zdCBrZXkgPSBjYWNoZUtleShyZWYpO1xuICAgIGNvbnN0IGxhYmVsID0gcmVmLnB1Ymxpc2hlciA/IGAke3JlZi5wdWJsaXNoZXJ9LyR7cmVmLm5hbWV9YCA6IHJlZi5uYW1lO1xuICAgIC8vIFRoZSBwbHVnaW4gTkFNRSBsaXZlcyBvbiB0aGUgcmVmIChhIHNpYmxpbmcgb2YgYGZpbHRlcmApLCBOT1QgaW5zaWRlIHRoZVxuICAgIC8vIGZpbHRlciBvYmplY3Qg4oCUIGJ1dCB0aGUgbG9va3VwIG1hdGNoZXMgb24gdGhlIGZpbHRlci4gQSBmaWx0ZXIgd2l0aG91dFxuICAgIC8vIGBuYW1lYCAoZS5nLiBge3ZlcnNpb24sIHZpc2liaWxpdHksIGlzQWN0aXZlLCBpc0RlZmF1bHR9YCkgbWF0Y2hlcyBBTllcbiAgICAvLyBwbHVnaW4gd2l0aCB0aG9zZSBhdHRyaWJ1dGVzLCBhbmQgdGhlIGVuZHBvaW50IHJldHVybnMgYW4gYXJiaXRyYXJ5IG9uZVxuICAgIC8vIChzZWVuOiBgZG9ja2VyZmlsZS1tdWx0aS1wcm92aWRlcmApLiBUaGF0IG1hZGUgdGhlIHN5bnRoIGFuZCBldmVyeSBzdGVwXG4gICAgLy8gcmVzb2x2ZSB0byB0aGUgV1JPTkcgcGx1Z2luLiBTbyB3aGVuIHRoZSBmaWx0ZXIgb21pdHMgYG5hbWVgLCBmYWxsIGJhY2sgdG9cbiAgICAvLyB0aGUgcmVmJ3MgcGx1Z2luIG5hbWU7IGFuIGV4cGxpY2l0IGZpbHRlciBgbmFtZWAgc3RpbGwgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAvLyBTaGFyZWQgd2l0aCB0aGUgcGlwZWxpbmUgc2VydmljZSdzIGNvbnRyYWN0IGNoZWNrIChzYW1lIGZpbHRlciwgc2FtZSBwbHVnaW4pLlxuICAgIGNvbnN0IGZpbHRlciA9IHBsdWdpbkxvb2t1cEZpbHRlcihyZWYpO1xuICAgIGNvbnN0IHBpbiA9IGV4YWN0VmVyc2lvblBpbihyZWYpO1xuICAgIGNvbnN0IHJlZnVzZSA9IChjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQgPT4geyBmYXRhbC5wdXNoKHsgcGx1Z2luOiBsYWJlbCwgY29kZSwgbWVzc2FnZSB9KTsgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LnBvc3Q8dW5rbm93bj4oJy9hcGkvcGx1Z2lucy9sb29rdXAnLCB7XG4gICAgICAgIGZpbHRlcixcbiAgICAgICAgLi4uKHBpcGVsaW5lSWQgJiYgc3RlcEtleXMuaGFzKGtleSkgPyB7IGNvbnRleHQ6IHsgcGlwZWxpbmVJZCwgc3RlcEtleXM6IHN0ZXBLZXlzLmdldChrZXkpIH0gfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBwbHVnaW4sIHdhcm5pbmdzIH0gPSB1bndyYXBMb29rdXAocmVzKTtcbiAgICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiB3YXJuaW5ncykge1xuICAgICAgICBwcmludExvb2t1cFdhcm5pbmcobGFiZWwsIHdhcm5pbmcpO1xuICAgICAgICB3YXJuaW5nU2luaz8ucHVzaCh3YXJuaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChwbHVnaW4pIHtcbiAgICAgICAgcmVzb2x2ZWRba2V5XSA9IHBsdWdpbjtcbiAgICAgIH0gZWxzZSBpZiAocGluKSB7XG4gICAgICAgIHJlZnVzZSgnUExVR0lOX1ZFUlNJT05fTk9UX0ZPVU5EJywgcGluTm90Rm91bmRNZXNzYWdlKGxhYmVsLCBwaW4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByaW50V2FybmluZyhgUGx1Z2luIFwiJHtsYWJlbH1cIiBsb29rdXAgcmV0dXJuZWQgbm8gcmVjb3JkIOKAlCBmYWxsaW5nIGJhY2sgdG8gZGVwbG95LXRpbWUgcmVzb2x1dGlvbmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gQSBwbHVnaW4gd2hvc2UgaW1hZ2Ugc2lnbmF0dXJlIGRvZXNuJ3QgdmVyaWZ5LCBvciBhIGxpc3RpbmcgdGhlIG9yZ1xuICAgICAgLy8gY2FuJ3QgdXNlLCBpcyBOT1QgYW4gb3V0YWdlIHRvIHJpZGUgb3V0OiBmYWxsaW5nIGJhY2sgd291bGQgcXVpZXRseVxuICAgICAgLy8gdHVybiBpdCBpbnRvIGFuIHVucmVzb2x2ZWQgc3RlcC4gU3RvcC5cbiAgICAgIGNvbnN0IGNvZGUgPSBmYXRhbExvb2t1cENvZGUoZXJyKTtcbiAgICAgIGlmIChjb2RlID09PSBFcnJvckNvZGUuSU1BR0VfVkVSSUZJQ0FUSU9OX0ZBSUxFRCkge1xuICAgICAgICByZWZ1c2UoY29kZSwgYFBsdWdpbiBcIiR7bGFiZWx9XCIgaW1hZ2UgZmFpbGVkIHNpZ25hdHVyZSB2ZXJpZmljYXRpb246ICR7ZXJyb3JNZXNzYWdlKGVycil9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgIHJlZnVzZShjb2RlLCBgUGx1Z2luIFwiJHtsYWJlbH1cIiBjYW4ndCBiZSB1c2VkICgke2NvZGV9KTogJHtzZXJ2aWNlTWVzc2FnZShlcnIpID8/IGVycm9yTWVzc2FnZShlcnIpfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocGluICYmIGlzTm90Rm91bmQoZXJyKSkge1xuICAgICAgICByZWZ1c2UoJ1BMVUdJTl9WRVJTSU9OX05PVF9GT1VORCcsIHBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbCwgcGluLCBlcnIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbXNnID0gZXJyb3JNZXNzYWdlKGVycik7XG4gICAgICBwcmludFdhcm5pbmcoYFBsdWdpbiBcIiR7bGFiZWx9XCIgcHJlLXJlc29sdXRpb24gZmFpbGVkICgke21zZ30pIOKAlCBmYWxsaW5nIGJhY2sgdG8gZGVwbG95LXRpbWUgcmVzb2x1dGlvbmApO1xuICAgIH1cbiAgfSkpO1xuXG4gIGlmIChmYXRhbC5sZW5ndGggPiAwKSB0aHJvdyBuZXcgUGx1Z2luUmVzb2x1dGlvbkVycm9yKGZhdGFsKTtcbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuIl19
|
|
290
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcGx1Z2luLXJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuSCxPQUFPLEVBQ0wsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQ2hFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLFlBQVksR0FDL0UsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVdqRDs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsR0FBYztJQUM5QixPQUFPLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBOEI7SUFDdkQsTUFBTSxJQUFJLEdBQWdCLEVBQUUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUV2QyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQVksRUFBUSxFQUFFO1FBQ2xDLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLE9BQU87UUFDNUMsTUFBTSxDQUFDLEdBQUcsR0FBZ0IsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4Qix3RUFBd0U7UUFDeEUsMkVBQTJFO1FBQzNFLE1BQU0sSUFBSSxHQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBMkIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekIsc0VBQXNFO1lBQ3RFLHlFQUF5RTtZQUN6RSxvRUFBb0U7WUFDcEUsMEVBQTBFO1lBQzFFLHVEQUF1RDtZQUN2RCxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYixpQkFBaUIsR0FBRyx5Q0FBeUMsTUFBTSxVQUFVLE1BQU0sTUFBTTtzQkFDdkYsaUNBQWlDLENBQ3BDLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQXlDLENBQUM7SUFDOUQsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVwQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBb0UsQ0FBQztJQUMxRixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBc0I7SUFDNUMsU0FBUyxDQUFDLHlCQUF5QjtJQUNuQyxTQUFTLENBQUMsb0JBQW9CO0lBQzlCLFNBQVMsQ0FBQyx3QkFBd0I7SUFDbEMsU0FBUyxDQUFDLGtCQUFrQjtJQUM1QiwyRUFBMkU7SUFDM0UsOEVBQThFO0lBQzlFLGdCQUFnQjtDQUNqQixDQUFDO0FBRUYsK0ZBQStGO0FBQy9GLFNBQVMsZUFBZSxDQUFDLEdBQVk7SUFDbkMsTUFBTSxJQUFJLEdBQUksR0FBcUQsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO0lBQ3BGLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFFLElBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDOUYsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNyRixDQUFDO0FBRUQsb0ZBQW9GO0FBQ3BGLFNBQVMsVUFBVSxDQUFDLEdBQVk7SUFDOUIsTUFBTSxRQUFRLEdBQUksR0FBdUUsRUFBRSxRQUFRLENBQUM7SUFDcEcsTUFBTSxJQUFJLEdBQUcsUUFBUSxFQUFFLElBQUksSUFBSSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxRQUFRLENBQUMsSUFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMxSCxPQUFPLFFBQVEsRUFBRSxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksS0FBSyxTQUFTLENBQUMsU0FBUyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxHQUFjO0lBQ3JDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBQ3BDLE9BQU8sT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDM0csQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEdBQTRFO0lBQ2hILE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNqRSxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFZO0lBQzNDLE1BQU0sSUFBSSxHQUFJLEdBQXFELEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztJQUNwRixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxJQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzlGLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNuRSxDQUFDO0FBV0Q7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxLQUFLO0lBQ3pCLFFBQVE7SUFBN0IsWUFBcUIsUUFBa0M7UUFDckQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN6QixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDLE9BQU87WUFDdEIsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sNEJBQTRCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFIckYsUUFBUTtRQUkzQixJQUFJLENBQUMsSUFBSSxHQUFHLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQWE7SUFDbkUsT0FBTyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELE1BQU0sY0FBYyxHQUF5RDtJQUMzRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7SUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU07SUFDcEIsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHO0lBQ2YsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDeEMsQ0FBQztBQUVGLHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsa0JBQWtCLENBQUMsS0FBYSxFQUFFLE9BQXNCO0lBQ3RFLE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRixZQUFZLENBQUMsR0FBRyxHQUFHLFlBQVksS0FBSyxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCw0RkFBNEY7QUFDNUYsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFFBQWtDO0lBQzFFLE1BQU0sSUFBSSxHQUFHLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTztJQUNsQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO1FBQ3hFLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ3RELENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxRSxZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxTQUFTLGNBQWMsQ0FBQyxHQUFZO0lBQ2xDLE1BQU0sSUFBSSxHQUFJLEdBQXFELEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztJQUNwRixNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxJQUE4QixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZHLE9BQU8sT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsTUFBaUIsRUFDakIsS0FBOEIsRUFDOUIsV0FBNkIsRUFDN0IsYUFBK0M7SUFFL0MsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUVqQyxNQUFNLFVBQVUsR0FBRyxPQUFPLEtBQUssQ0FBQyxVQUFVLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RILE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLDhFQUE4RTtJQUM5RSxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUM3QyxLQUFLLE1BQU0sSUFBSSxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0MsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUE0QixFQUFFLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQW9CLEVBQUUsQ0FBQztJQUVsQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDeEUsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSw2RUFBNkU7UUFDN0UsMkVBQTJFO1FBQzNFLGdGQUFnRjtRQUNoRixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFZLEVBQUUsT0FBZSxFQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRywwRUFBMEU7UUFDMUUseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxNQUFNLGFBQWEsR0FBRyxDQUFDLElBQVksRUFBRSxHQUFXLEVBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQ3BFLHFCQUFxQixLQUFLLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxhQUFhLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLDJCQUEyQixHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzlHLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBVSxxQkFBcUIsRUFBRTtnQkFDNUQsTUFBTTtnQkFDTixHQUFHLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNoRCxHQUFHLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3JHLENBQUMsQ0FBQztZQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ25DLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IsQ0FBQztZQUNELElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxhQUFhLENBQUMsU0FBUyxDQUFDLDBCQUEwQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMseUNBQXlDLENBQUMsQ0FBQyxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDNUksQ0FBQztpQkFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUN2QixJQUFJLE9BQU8sSUFBSSxTQUFTLElBQUksYUFBYTtvQkFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDO1lBQzVFLENBQUM7aUJBQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDZixNQUFNLENBQUMsMEJBQTBCLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksQ0FBQyxXQUFXLEtBQUssc0VBQXNFLENBQUMsQ0FBQztZQUN2RyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsMEJBQTBCLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN2SCxPQUFPO1lBQ1QsQ0FBQztZQUNELHNFQUFzRTtZQUN0RSxzRUFBc0U7WUFDdEUseUNBQXlDO1lBQ3pDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxJQUFJLElBQUksS0FBSyxTQUFTLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssMENBQTBDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVGLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsS0FBSyxvQkFBb0IsSUFBSSxNQUFNLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RyxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzQixNQUFNLENBQUMsMEJBQTBCLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixZQUFZLENBQUMsV0FBVyxLQUFLLDRCQUE0QixHQUFHLDRDQUE0QyxDQUFDLENBQUM7UUFDNUcsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFSixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgZXJyb3JNZXNzYWdlLCBtYW5hZ2VkVG9vbGNoYWluUmVmTmFtZSwgdG9vbGNoYWluUmVsZWFzZVBpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7XG4gIGNvbGxlY3RQbHVnaW5TdGVwcywgZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UsIGxvb2t1cE5vdEZvdW5kU3RhdGUsIHR5cGUgTG9va3VwVG9vbGNoYWluLCB0eXBlIExvb2t1cFdhcm5pbmcsIHR5cGUgTG9va3VwV2FybmluZ1NldmVyaXR5LFxuICBwbHVnaW5BcnRpZmFjdEFsaWFzLCBwbHVnaW5Mb29rdXBGaWx0ZXIsIHN1bW1hcml6ZUxvb2t1cFdhcm5pbmdzLCB1bndyYXBMb29rdXAsXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyBBcGlDbGllbnQgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi9vdXRwdXQtdXRpbHMuanMnO1xuXG4vKiogTWluaW1hbCBwbHVnaW4gcmVmZXJlbmNlIHNoYXBlIOKAlCBtYXRjaGVzIFBsdWdpbk9wdGlvbnMgZnJvbSBwaXBlbGluZS1jb3JlLiAqL1xuaW50ZXJmYWNlIFBsdWdpblJlZiB7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFB1Ymxpc2hlciBoYW5kbGUgb2YgYW4gaW5zdGFsbGVkIGxpc3RpbmcuICovXG4gIHB1Ymxpc2hlcj86IHN0cmluZztcbiAgYWxpYXM/OiBzdHJpbmc7XG4gIGZpbHRlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIENhY2hlIGtleSBtYXRjaGluZyBgUGx1Z2luTG9va3VwLm5vcm1hbGl6ZSgpYDogdGhlIGV4cGxpY2l0IGFsaWFzIHdoZW4gc2V0LFxuICogb3RoZXJ3aXNlIGBbPHB1Ymxpc2hlcj4tXTxuYW1lPi1hbGlhc2Ag4oCUIHBpcGVsaW5lLWNvcmUnc1xuICogYHBsdWdpbkFydGlmYWN0QWxpYXNgLCB0aGUgb25lIHJ1bGUgZXZlcnkgY29uc3VtZXIgb2YgdGhpcyBtYXAgdXNlcy5cbiAqL1xuZnVuY3Rpb24gY2FjaGVLZXkocmVmOiBQbHVnaW5SZWYpOiBzdHJpbmcge1xuICByZXR1cm4gcGx1Z2luQXJ0aWZhY3RBbGlhcyhyZWYpO1xufVxuXG4vKipcbiAqIFdhbGsgdGhlIHBpcGVsaW5lIHByb3BzIHRyZWUgdG8gY29sbGVjdCBldmVyeSBwbHVnaW4gcmVmZXJlbmNlLiBQbHVnaW5zXG4gKiBhcHBlYXIgYXQgYHN5bnRoLnBsdWdpbmAgYW5kIGF0IGBzdGFnZXNbXS5zdGVwc1tdLnBsdWdpbmAuIEVudHJpZXMgYXJlXG4gKiBkZS1kdXBsaWNhdGVkIGJ5IGBjYWNoZUtleSgpYCDigJQgdGhlIHNhbWUga2V5IGBQbHVnaW5Mb29rdXAucGx1Z2luKClgIHVzZXMsXG4gKiBzbyB0aGUgcmVzb2x2ZWQtcGx1Z2lucyBtYXAgbG9va3VwcyBtYXRjaCBkb3duc3RyZWFtLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UGx1Z2luUmVmcyhwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQbHVnaW5SZWZbXSB7XG4gIGNvbnN0IHJlZnM6IFBsdWdpblJlZltdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGNvbnN0IHB1c2ggPSAocmF3OiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybjtcbiAgICBjb25zdCByID0gcmF3IGFzIFBsdWdpblJlZjtcbiAgICBpZiAoIXIubmFtZSkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHIpO1xuICAgIC8vIFRoZSBuYW1lIHRoZSBsb29rdXAgd2lsbCBUQVJHRVQg4oCUIGFuIGV4cGxpY2l0IGBmaWx0ZXIubmFtZWAgd2lucyAoc2VlXG4gICAgLy8gYmVsb3cpLCBzbyB0d28gcmVmcyB0aGF0IHJlc29sdmUgdG8gdGhlIHNhbWUgcGx1Z2luIGFyZSBub3QgYSBjb2xsaXNpb24uXG4gICAgY29uc3QgbmFtZSA9IChyLmZpbHRlcj8ubmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/IHIubmFtZTtcbiAgICBjb25zdCB0YXJnZXQgPSByLnB1Ymxpc2hlciA/IGAke3IucHVibGlzaGVyfS8ke25hbWV9YCA6IG5hbWU7XG4gICAgY29uc3QgaG9sZGVyID0gc2Vlbi5nZXQoa2V5KTtcbiAgICBpZiAoaG9sZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9uZSBhbGlhcyBjYW4gb25seSBldmVyIG1lYW4gb25lIHBsdWdpbi4gRGVkdXBsaWNhdGluZyBvbiB0aGUgYWxpYXNcbiAgICAgIC8vIGFsb25lIGtlcHQgdGhlIEZJUlNUIHBsdWdpbiBhbmQgc2lsZW50bHkgZHJvcHBlZCB0aGUgc2Vjb25kLCBzbyBhIHN0ZXBcbiAgICAgIC8vIGRlY2xhcmluZyBgeyBuYW1lOiAnbWF2ZW4tYnVpbGQnLCBhbGlhczogJ2J1aWxkJyB9YCBhZnRlciBhbm90aGVyXG4gICAgICAvLyBkZWNsYXJpbmcgYHsgbmFtZTogJ25vZGVqcy1idWlsZCcsIGFsaWFzOiAnYnVpbGQnIH1gIHJhbiBub2RlanMtYnVpbGQnc1xuICAgICAgLy8gaW1hZ2UgYW5kIGNvbW1hbmRzIOKAlCBubyBlcnJvciwganVzdCB0aGUgd3JvbmcgYnVpbGQuXG4gICAgICBpZiAoaG9sZGVyICE9PSB0YXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQbHVnaW4gYWxpYXMgXCIke2tleX1cIiBpcyB1c2VkIGZvciB0d28gZGlmZmVyZW50IHBsdWdpbnMgKFwiJHtob2xkZXJ9XCIgYW5kIFwiJHt0YXJnZXR9XCIpLiBgXG4gICAgICAgICAgKyAnR2l2ZSBlYWNoIHBsdWdpbiBpdHMgb3duIGFsaWFzLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlZW4uc2V0KGtleSwgdGFyZ2V0KTtcbiAgICByZWZzLnB1c2gocik7XG4gIH07XG5cbiAgY29uc3Qgc3ludGggPSBwcm9wcy5zeW50aCBhcyB7IHBsdWdpbj86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcHVzaChzeW50aD8ucGx1Z2luKTtcblxuICBjb25zdCBzdGFnZXMgPSBwcm9wcy5zdGFnZXMgYXMgQXJyYXk8eyBzdGVwcz86IEFycmF5PHsgcGx1Z2luPzogdW5rbm93biB9PiB9PiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBzdGFnZSBvZiBzdGFnZXMgPz8gW10pIHtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RhZ2Uuc3RlcHMgPz8gW10pIHtcbiAgICAgIHB1c2goc3RlcC5wbHVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZzO1xufVxuXG4vKipcbiAqIExvb2t1cCByZWZ1c2FscyB0aGF0IG11c3QgU1RPUCB0aGUgc3ludGggcmF0aGVyIHRoYW4gZmFsbCBiYWNrIHRvXG4gKiBkZXBsb3ktdGltZSByZXNvbHV0aW9uOiBhbiBpbWFnZSB3aG9zZSBzaWduYXR1cmUgZG9lc24ndCB2ZXJpZnksIGEgbGlzdGluZ1xuICogdGhlIG9yZyBjYW4ndCB1c2UgKG5vdCBpbnN0YWxsZWQsIGJsb2NrZWQgYnkgaXRzIGFsbG93L2RlbnkgcG9saWN5LCB5YW5rZWRcbiAqIG9yIHN1c3BlbmRlZCksIGFuZCBhbiBvcmcgcGx1Z2luIHRoYXQgd2FzIGRlbGV0ZWQuIEZhbGxpbmcgYmFjayB3b3VsZFxuICogcXVpZXRseSB0dXJuIGVhY2ggaW50byBhbiB1bnJlc29sdmVkIHN0ZXAgdGhhdCBmYWlscyBhdCBydW4gdGltZSBpbnN0ZWFkIG9mXG4gKiBub3cuIFZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgTkVWRVIgb25lIG9mIHRoZXNlOiBpdCBhcnJpdmVzIGFzIGdyYWRlZFxuICogd2FybmluZ3MgYmVzaWRlIGEgcmVzb2x2ZWQgcGx1Z2luLlxuICovXG5jb25zdCBGQVRBTF9MT09LVVBfQ09ERVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICBFcnJvckNvZGUuSU1BR0VfVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgRXJyb3JDb2RlLlBMVUdJTl9OT1RfSU5TVEFMTEVELFxuICBFcnJvckNvZGUuUExVR0lOX0JMT0NLRURfQllfUE9MSUNZLFxuICBFcnJvckNvZGUuUExVR0lOX1VOQVZBSUxBQkxFLFxuICAvLyBUaGUgb3JnJ3Mgb3duIHBsdWdpbiB3YXMgZGVsZXRlZDogdGhlIGxvb2t1cCByZWZ1c2VzIGl0IHJhdGhlciB0aGFuIGZhbGxcbiAgLy8gdGhyb3VnaCB0byBhIHNhbWUtbmFtZSBsaXN0aW5nLiAoUGx1Z2luIHNlcnZpY2UgY29kZTsgbWF0Y2hlZCBhcyBhIHN0cmluZy4pXG4gICdQTFVHSU5fREVMRVRFRCcsXG5dO1xuXG4vKiogVGhlIGVycm9yIGNvZGUgb2YgYSBwbHVnaW4gc2VydmljZSBhbnN3ZXIsIHdoZW4gaXQgaXMgb25lIG9mIHtAbGluayBGQVRBTF9MT09LVVBfQ09ERVN9LiAqL1xuZnVuY3Rpb24gZmF0YWxMb29rdXBDb2RlKGVycjogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBkYXRhID0gKGVyciBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZXNwb25zZT8uZGF0YTtcbiAgY29uc3QgY29kZSA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIEZBVEFMX0xPT0tVUF9DT0RFUy5pbmNsdWRlcyhjb2RlKSA/IGNvZGUgOiBudWxsO1xufVxuXG4vKiogV2hldGhlciB0aGUgcGx1Z2luIHNlcnZpY2UgYW5zd2VyZWQgXCJubyBzdWNoIHBsdWdpbi92ZXJzaW9uXCIgKDQwNCBOT1RfRk9VTkQpLiAqL1xuZnVuY3Rpb24gaXNOb3RGb3VuZChlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgcmVzcG9uc2UgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IHVua25vd247IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlO1xuICBjb25zdCBjb2RlID0gcmVzcG9uc2U/LmRhdGEgJiYgdHlwZW9mIHJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnID8gKHJlc3BvbnNlLmRhdGEgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gcmVzcG9uc2U/LnN0YXR1cyA9PT0gNDA0IHx8IGNvZGUgPT09IEVycm9yQ29kZS5OT1RfRk9VTkQ7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gYSByZWZlcmVuY2UgUElOUyDigJQgb25lIGV4YWN0IGB4LnkuelstcHJlXWAsIG5vdCBhIHJhbmdlIG9yXG4gKiBgbGF0ZXN0YC4gQSBwaW4gbmFtZXMgYSB2ZXJzaW9uIHRoYXQgbXVzdCBleGlzdDogaWYgaXQgZG9lc24ndCAobmV2ZXJcbiAqIHB1Ymxpc2hlZCwgb3IgcmVmdXNlZCBieSB0aGUgYnVpbGQncyB2dWxuZXJhYmlsaXR5IGdhdGUsIHdoaWNoIHNhdmVzXG4gKiBub3RoaW5nKSwgdGhlcmUgaXMgbm8gb3V0YWdlIHRvIHJpZGUgb3V0IGFuZCBub3RoaW5nIGZvciB0aGUgZGVwbG95LXRpbWVcbiAqIGxvb2t1cCB0byBmaW5kIGVpdGhlci5cbiAqL1xuZnVuY3Rpb24gZXhhY3RWZXJzaW9uUGluKHJlZjogUGx1Z2luUmVmKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHZlcnNpb24gPSByZWYuZmlsdGVyPy52ZXJzaW9uO1xuICByZXR1cm4gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnICYmIC9eXFxkK1xcLlxcZCtcXC5cXGQrKC1bMC05QS1aYS16Li1dKyk/JC8udGVzdCh2ZXJzaW9uKSA/IHZlcnNpb24gOiBudWxsO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSByZWZlcmVuY2UgbmFtZXMgYSBtYW5hZ2VkIHRvb2xjaGFpbiBoYWxmIChgY2RrLXN5bnRoYCk6IHRoZVxuICogc3lzdGVtIG9yZydzLCBuZXZlciBhIGxpc3Rpbmcg4oCUIHNvIG5vIHB1Ymxpc2hlci4gSXQgcmVzb2x2ZXMgdGhyb3VnaCB0aGVcbiAqIHRvb2xjaGFpbiByZWxlYXNlICh0aGUgcGlwZWxpbmUncyBgdG9vbGNoYWluLnJlbGVhc2VgIHBpbiwgZWxzZSB0aGUgb3JnIC9cbiAqIGNhbmFyeSAvIHBsYXRmb3JtIGRlZmF1bHQpLCBuZXZlciBieSBpdHMgb3duIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hbmFnZWRUb29sY2hhaW5SZWYocmVmOiB7IG5hbWU/OiBzdHJpbmc7IHB1Ymxpc2hlcj86IHN0cmluZzsgZmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSk6IGJvb2xlYW4ge1xuICByZXR1cm4gIXJlZi5wdWJsaXNoZXIgJiYgbWFuYWdlZFRvb2xjaGFpblJlZk5hbWUocmVmKSAhPT0gbnVsbDtcbn1cblxuLyoqIFRoZSBwbHVnaW4gc2VydmljZSdzIGVycm9yIGNvZGUgb24gYSByZWZ1c2VkIGFuc3dlciwgd2hlbiBpdCBjYXJyaWVzIG9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlRXJyb3JDb2RlKGVycjogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBkYXRhID0gKGVyciBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZXNwb25zZT8uZGF0YTtcbiAgY29uc3QgY29kZSA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIGNvZGUubGVuZ3RoID4gMCA/IGNvZGUgOiBudWxsO1xufVxuXG4vKiogT25lIHBsdWdpbiB0aGUgc3ludGggY291bGQgbm90IHVzZSwgYXMge0BsaW5rIFBsdWdpblJlc29sdXRpb25FcnJvcn0gcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luUmVmdXNhbCB7XG4gIC8qKiBgWzxwdWJsaXNoZXI+L108bmFtZT5gIG9mIHRoZSByZWZlcmVuY2UuICovXG4gIHJlYWRvbmx5IHBsdWdpbjogc3RyaW5nO1xuICAvKiogVGhlIHBsdWdpbiBzZXJ2aWNlJ3MgZXJyb3IgY29kZSwgb3IgYSBsb2NhbCBvbmUgKGBQTFVHSU5fVkVSU0lPTl9OT1RfRk9VTkRgKS4gKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXZlcnkgZmF0YWwgcmVmdXNhbCBvZiBvbmUgcHJlLXJlc29sdXRpb24gcGFzcy4gQ2FycmllcyB0aGUgc3RydWN0dXJlZCBsaXN0XG4gKiBhcyB3ZWxsIGFzIHRoZSBodW1hbiBtZXNzYWdlLCBzbyB0aGUgc3ludGggY2FuIGVtaXQgYSBtYWNoaW5lLXJlYWRhYmxlXG4gKiBmYWlsdXJlIGxpbmUgKGBQQl9TWU5USF9GQUlMVVJFYCkgdGhlIGV4ZWN1dGlvbiBldmVudHMgcGljayB1cC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpblJlc29sdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgcmVmdXNhbHM6IHJlYWRvbmx5IFBsdWdpblJlZnVzYWxbXSkge1xuICAgIHN1cGVyKHJlZnVzYWxzLmxlbmd0aCA9PT0gMVxuICAgICAgPyByZWZ1c2Fsc1swXSEubWVzc2FnZVxuICAgICAgOiBgJHtyZWZ1c2Fscy5sZW5ndGh9IHBsdWdpbnMgY2FuJ3QgYmUgdXNlZDpcXG4ke3JlZnVzYWxzLm1hcCgocikgPT4gYCAgLSAke3IubWVzc2FnZX1gKS5qb2luKCdcXG4nKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luUmVzb2x1dGlvbkVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFdoeSBhbiBleGFjdCBwaW4gd2FzIG5vdCBmb3VuZCwgcGhyYXNlZCBmcm9tIHRoZSA0MDQncyBgZGV0YWlscy5zdGF0ZWBcbiAqIChgZGVsZXRlZGAgLyBgaW5hY3RpdmVgIC8gYHlhbmtlZGAgLyBgbWlzc2luZ2ApLiBXaXRob3V0IGEgc3RhdGUgdGhlIGFuc3dlclxuICogY2Fubm90IHRlbGwgdGhlIGNhc2VzIGFwYXJ0LCBzbyB0aGUgbWVzc2FnZSBuYW1lcyB0aGUgdHdvIGxpa2VsaWVzdC5cbiAqIFNoYXJlZCB3aXRoIHRoZSBkZXBsb3ktdGltZSBMYW1iZGEncyBDbG91ZEZvcm1hdGlvbiByZWFzb24gKHBpcGVsaW5lLWNvcmUpLlxuICovXG5mdW5jdGlvbiBwaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWw6IHN0cmluZywgcGluOiBzdHJpbmcsIGVycj86IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWwsIHBpbiwgbG9va3VwTm90Rm91bmRTdGF0ZShlcnIpKTtcbn1cblxuY29uc3QgU0VWRVJJVFlfU1RZTEU6IFJlY29yZDxMb29rdXBXYXJuaW5nU2V2ZXJpdHksIChzOiBzdHJpbmcpID0+IHN0cmluZz4gPSB7XG4gIGluZm86IHBpY28uY3lhbixcbiAgd2FybmluZzogcGljby55ZWxsb3csXG4gIGVycm9yOiBwaWNvLnJlZCxcbiAgY3JpdGljYWw6ICh0KSA9PiBwaWNvLmJvbGQocGljby5yZWQodCkpLFxufTtcblxuLyoqIFByaW50IG9uZSBsb29rdXAgd2FybmluZywgcHJlZml4ZWQgYW5kIGNvbG91cmVkIGJ5IGl0cyBzZXZlcml0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludExvb2t1cFdhcm5pbmcobGFiZWw6IHN0cmluZywgd2FybmluZzogTG9va3VwV2FybmluZyk6IHZvaWQge1xuICBjb25zdCB0YWcgPSBTRVZFUklUWV9TVFlMRVt3YXJuaW5nLnNldmVyaXR5XShgWyR7d2FybmluZy5zZXZlcml0eS50b1VwcGVyQ2FzZSgpfV1gKTtcbiAgcHJpbnRXYXJuaW5nKGAke3RhZ30gUGx1Z2luIFwiJHtsYWJlbH1cIjogJHt3YXJuaW5nLm1lc3NhZ2V9YCk7XG59XG5cbi8qKiBQcmludCB0aGUgb25lLWxpbmUgc2V2ZXJpdHkgc3VtbWFyeSBvZiBhIHN5bnRoJ3MgbG9va3VwIHdhcm5pbmdzIChub3RoaW5nIHdoZW4gbm9uZSkuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRMb29rdXBXYXJuaW5nU3VtbWFyeSh3YXJuaW5nczogcmVhZG9ubHkgTG9va3VwV2FybmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGxpbmUgPSBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyh3YXJuaW5ncyk7XG4gIGlmICghbGluZSkgcmV0dXJuO1xuICBjb25zdCB3b3JzdCA9IHdhcm5pbmdzLnNvbWUoKHcpID0+IHcuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpID8gJ2NyaXRpY2FsJ1xuICAgIDogd2FybmluZ3Muc29tZSgodykgPT4gdy5zZXZlcml0eSA9PT0gJ2Vycm9yJykgPyAnZXJyb3InXG4gICAgICA6IHdhcm5pbmdzLnNvbWUoKHcpID0+IHcuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJykgPyAnd2FybmluZycgOiAnaW5mbyc7XG4gIHByaW50V2FybmluZyhTRVZFUklUWV9TVFlMRVt3b3JzdF0obGluZSkpO1xufVxuXG4vKiogVGhlIHBsdWdpbiBzZXJ2aWNlJ3Mgb3duIHJlZnVzYWwgbWVzc2FnZSwgd2hlbiB0aGUgYW5zd2VyIGNhcnJpZXMgb25lLiAqL1xuZnVuY3Rpb24gc2VydmljZU1lc3NhZ2UoZXJyOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEgPSAoZXJyIGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJlc3BvbnNlPy5kYXRhO1xuICBjb25zdCBtZXNzYWdlID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IG1lc3NhZ2U/OiB1bmtub3duIH0pLm1lc3NhZ2UgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgbWVzc2FnZS5sZW5ndGggPiAwID8gbWVzc2FnZSA6IG51bGw7XG59XG5cbi8qKlxuICogUHJlLXJlc29sdmUgcGx1Z2lucyBieSBjYWxsaW5nIHRoZSBzYW1lIGBQT1NUIC9hcGkvcGx1Z2lucy9sb29rdXBgIGVuZHBvaW50XG4gKiB0aGUgZGVwbG95LXRpbWUgY3VzdG9tIHJlc291cmNlIExhbWJkYSB1c2VzLiBSZXR1cm5pbmcgdGhlIGZ1bGwgUGx1Z2luXG4gKiByZWNvcmQgYXQgc3ludGggdGltZSBpcyB3aGF0IGFsbG93cyB0aGUgcmVzdWx0aW5nIENGTiB0ZW1wbGF0ZSB0byBzaGlwXG4gKiB3aXRoIHJlYWwgQ29kZUJ1aWxkIGltYWdlIFVSSXMgKGA8aG9zdD4vPG5zPi88bmFtZT46PHZlcnNpb24+YCkgcmF0aGVyIHRoYW5cbiAqIHRoZSBwaXBlbGluZSdzIGRlZmF1bHQgaW1hZ2UgdGhhdCB0aGUgc3ludGgtdGltZSB0b2tlbiBwYXRoIGZvcmNlcy5cbiAqXG4gKiBGYWlsdXJlcyBhcmUgbm9uLWZhdGFsOiBhIG1pc3NpbmcgcGx1Z2luIG9yIHVucmVhY2hhYmxlIEFQSSBsb2dzIGEgd2FybmluZ1xuICogYW5kIGZhbGxzIHRocm91Z2ggdG8gdGhlIGRlcGxveS10aW1lIGN1c3RvbSByZXNvdXJjZSBwYXRoIHNvIHBhcnRpYWxcbiAqIHBsYXRmb3JtIG91dGFnZXMgZG9uJ3QgYmxvY2sgc3ludGgvZGVwbG95LiBUaGUgZXhjZXB0aW9ucyBhYm9ydCB0aGUgc3ludGg6XG4gKiB0aGUge0BsaW5rIEZBVEFMX0xPT0tVUF9DT0RFU30gcmVmdXNhbHMsIGFuIGV4YWN0IHZlcnNpb24gcGluIHRoYXQgZG9lc1xuICogbm90IGV4aXN0LCBhbmQgQU5ZIGZhaWx1cmUgb24gYSBtYW5hZ2VkIHRvb2xjaGFpbiByZWZlcmVuY2UgKGBjZGstc3ludGhgKSxcbiAqIHdoaWNoIGhhcyBubyBkZXBsb3ktdGltZSBmYWxsYmFjayAoRDIpLiBBIG1hbmFnZWQgcmVmZXJlbmNlIHNlbmRzIHRoZVxuICogcGlwZWxpbmUncyBgdG9vbGNoYWluLnJlbGVhc2VgIGFzIGByZWxlYXNlUGluYCDigJQgdGhlIHNhbWUgcGluIHRoZSBib290c3RyYXBcbiAqIGxvb2t1cCBzZW5kcyDigJQgYW5kIGl0cyByZXNvbHZlZCByZWxlYXNlIGxhbmRzIGluIGB0b29sY2hhaW5TaW5rYCBieSBrZXkuXG4gKlxuICogRXZlcnkgcmVmZXJlbmNlIGlzIGxvb2tlZCB1cCBiZWZvcmUgYW55dGhpbmcgaXMgdGhyb3duLCBhbmQgQUxMIGZhdGFsXG4gKiByZWZ1c2FscyBhcmUgcmVwb3J0ZWQgdG9nZXRoZXIuIFN0b3BwaW5nIGF0IHRoZSBmaXJzdCBtZWFudCBhIHBpcGVsaW5lIHdpdGhcbiAqIHRocmVlIHJlZnVzZWQgcGx1Z2lucyB0b29rIHRocmVlIHN5bnRoIGF0dGVtcHRzIHRvIGxlYXJuIGFib3V0IGFsbCB0aHJlZS5cbiAqXG4gKiBFdmVyeSBsb29rdXAgd2FybmluZyBpcyBwcmludGVkLCBncmFkZWQgYnkgc2V2ZXJpdHksIGFuZCBhcHBlbmRlZCB0b1xuICogYHdhcm5pbmdTaW5rYCB3aGVuIGdpdmVuICh0aGUgc3ludGggcHJpbnRzIGEgb25lLWxpbmUgc3VtbWFyeSBhdCBpdHMgZW5kKS5cbiAqIEEgd2FybmluZyBuZXZlciBmYWlscyB0aGUgc3ludGgg4oCUIHZ1bG5lcmFiaWxpdHkgc3RhdGUgaXMgcmVwb3J0ZWQsIG5vdFxuICogZW5mb3JjZWQuXG4gKlxuICogV2hlbiB0aGUgcHJvcHMgY2FycnkgYSBgcGlwZWxpbmVJZGAsIGVhY2ggbG9va3VwIGFsc28gc2VuZHNcbiAqIGBjb250ZXh0OiB7IHBpcGVsaW5lSWQsIHN0ZXBLZXlzIH1gIOKAlCB0aGUgbGFiZWwgKGBwbHVnaW5TdGVwTGFiZWxgOiBgc3ludGhgIG9yXG4gKiBgPHN0YWdlPi88YWxpYXMgPz8gbmFtZT5gKSBvZiBFVkVSWSBzdGVwIHRoZSBkZS1kdXBsaWNhdGVkIHJlZmVyZW5jZSBzZXJ2ZXMg4oCUXG4gKiBzbyB0aGUgcGx1Z2luIHNlcnZpY2UgY2FuIHJlY29yZCB0aGUgd2FybmluZ3MgaXQgcmV0dXJucyBhZ2FpbnN0IGVhY2ggb2ZcbiAqIHRob3NlIHBpcGVsaW5lIHN0ZXBzLCBub3Qgb25seSBwcmludCB0aGVtIGludG8gdGhpcyBzeW50aCdzIGxvZy5cbiAqXG4gKiBLZXllZCBieSBgYWxpYXMgfHwgbmFtZWAgdG8gbWF0Y2ggYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUGx1Z2luc0ZvclByb3BzKFxuICBjbGllbnQ6IEFwaUNsaWVudCxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB3YXJuaW5nU2luaz86IExvb2t1cFdhcm5pbmdbXSxcbiAgdG9vbGNoYWluU2luaz86IFJlY29yZDxzdHJpbmcsIExvb2t1cFRvb2xjaGFpbj4sXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHJlZnMgPSBjb2xsZWN0UGx1Z2luUmVmcyhwcm9wcyk7XG4gIGlmIChyZWZzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuXG4gIGNvbnN0IHBpcGVsaW5lSWQgPSB0eXBlb2YgcHJvcHMucGlwZWxpbmVJZCA9PT0gJ3N0cmluZycgJiYgcHJvcHMucGlwZWxpbmVJZC5sZW5ndGggPiAwID8gcHJvcHMucGlwZWxpbmVJZCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVsZWFzZVBpbiA9IHRvb2xjaGFpblJlbGVhc2VQaW4ocHJvcHMpO1xuICAvLyBPbmUgbG9va3VwIHBlciBhbGlhcyBtYXkgc2VydmUgc2V2ZXJhbCBzdGVwczogdGhlIGxhYmVscyBvZiBlYWNoLCBieSBhbGlhcy5cbiAgY29uc3Qgc3RlcEtleXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBjb2xsZWN0UGx1Z2luU3RlcHMocHJvcHMpKSB7XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkoc3RlcCk7XG4gICAgc3RlcEtleXMuc2V0KGtleSwgWy4uLihzdGVwS2V5cy5nZXQoa2V5KSA/PyBbXSksIHN0ZXAubGFiZWxdKTtcbiAgfVxuICBjb25zdCByZXNvbHZlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgY29uc3QgZmF0YWw6IFBsdWdpblJlZnVzYWxbXSA9IFtdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKHJlZnMubWFwKGFzeW5jIChyZWYpID0+IHtcbiAgICBjb25zdCBrZXkgPSBjYWNoZUtleShyZWYpO1xuICAgIGNvbnN0IGxhYmVsID0gcmVmLnB1Ymxpc2hlciA/IGAke3JlZi5wdWJsaXNoZXJ9LyR7cmVmLm5hbWV9YCA6IHJlZi5uYW1lO1xuICAgIC8vIFRoZSBwbHVnaW4gTkFNRSBsaXZlcyBvbiB0aGUgcmVmIChhIHNpYmxpbmcgb2YgYGZpbHRlcmApLCBOT1QgaW5zaWRlIHRoZVxuICAgIC8vIGZpbHRlciBvYmplY3Qg4oCUIGJ1dCB0aGUgbG9va3VwIG1hdGNoZXMgb24gdGhlIGZpbHRlci4gQSBmaWx0ZXIgd2l0aG91dFxuICAgIC8vIGBuYW1lYCAoZS5nLiBge3ZlcnNpb24sIHZpc2liaWxpdHksIGlzQWN0aXZlLCBpc0RlZmF1bHR9YCkgbWF0Y2hlcyBBTllcbiAgICAvLyBwbHVnaW4gd2l0aCB0aG9zZSBhdHRyaWJ1dGVzLCBhbmQgdGhlIGVuZHBvaW50IHJldHVybnMgYW4gYXJiaXRyYXJ5IG9uZVxuICAgIC8vIChzZWVuOiBgZG9ja2VyZmlsZS1tdWx0aS1wcm92aWRlcmApLiBUaGF0IG1hZGUgdGhlIHN5bnRoIGFuZCBldmVyeSBzdGVwXG4gICAgLy8gcmVzb2x2ZSB0byB0aGUgV1JPTkcgcGx1Z2luLiBTbyB3aGVuIHRoZSBmaWx0ZXIgb21pdHMgYG5hbWVgLCBmYWxsIGJhY2sgdG9cbiAgICAvLyB0aGUgcmVmJ3MgcGx1Z2luIG5hbWU7IGFuIGV4cGxpY2l0IGZpbHRlciBgbmFtZWAgc3RpbGwgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAvLyBTaGFyZWQgd2l0aCB0aGUgcGlwZWxpbmUgc2VydmljZSdzIGNvbnRyYWN0IGNoZWNrIChzYW1lIGZpbHRlciwgc2FtZSBwbHVnaW4pLlxuICAgIGNvbnN0IGZpbHRlciA9IHBsdWdpbkxvb2t1cEZpbHRlcihyZWYpO1xuICAgIGNvbnN0IHBpbiA9IGV4YWN0VmVyc2lvblBpbihyZWYpO1xuICAgIGNvbnN0IHJlZnVzZSA9IChjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQgPT4geyBmYXRhbC5wdXNoKHsgcGx1Z2luOiBsYWJlbCwgY29kZSwgbWVzc2FnZSB9KTsgfTtcbiAgICAvLyBBIG1hbmFnZWQgdG9vbGNoYWluIGhhbGYgKGNkay1zeW50aCkgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgUkVMRUFTRSDigJQgdGhlXG4gICAgLy8gc2FtZSBgcmVsZWFzZVBpbmAgdGhlIGJvb3RzdHJhcCBsb29rdXAgc2VuZHMsIHNvIGJvdGggaGFsdmVzIGNvbWUgZnJvbVxuICAgIC8vIG9uZSByZWxlYXNlIOKAlCBhbmQgaXQgaGFzIG5vIGRlcGxveS10aW1lIGZhbGxiYWNrOiBhbnkgZmFpbHVyZSBpcyBmYXRhbC5cbiAgICBjb25zdCBtYW5hZ2VkID0gaXNNYW5hZ2VkVG9vbGNoYWluUmVmKHJlZik7XG4gICAgY29uc3QgcmVmdXNlTWFuYWdlZCA9IChjb2RlOiBzdHJpbmcsIHdoeTogc3RyaW5nKTogdm9pZCA9PiByZWZ1c2UoY29kZSxcbiAgICAgIGBUb29sY2hhaW4gcGx1Z2luIFwiJHtsYWJlbH1cIiR7cmVsZWFzZVBpbiA/IGAgKHJlbGVhc2UgJHtyZWxlYXNlUGlufSlgIDogJyd9IGNvdWxkIG5vdCBiZSByZXNvbHZlZDogJHt3aHl9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wb3N0PHVua25vd24+KCcvYXBpL3BsdWdpbnMvbG9va3VwJywge1xuICAgICAgICBmaWx0ZXIsXG4gICAgICAgIC4uLihtYW5hZ2VkICYmIHJlbGVhc2VQaW4gPyB7IHJlbGVhc2VQaW4gfSA6IHt9KSxcbiAgICAgICAgLi4uKHBpcGVsaW5lSWQgJiYgc3RlcEtleXMuaGFzKGtleSkgPyB7IGNvbnRleHQ6IHsgcGlwZWxpbmVJZCwgc3RlcEtleXM6IHN0ZXBLZXlzLmdldChrZXkpIH0gfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBwbHVnaW4sIHdhcm5pbmdzLCB0b29sY2hhaW4gfSA9IHVud3JhcExvb2t1cChyZXMpO1xuICAgICAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG4gICAgICAgIHByaW50TG9va3VwV2FybmluZyhsYWJlbCwgd2FybmluZyk7XG4gICAgICAgIHdhcm5pbmdTaW5rPy5wdXNoKHdhcm5pbmcpO1xuICAgICAgfVxuICAgICAgaWYgKG1hbmFnZWQgJiYgKCFwbHVnaW4gfHwgIXRvb2xjaGFpbikpIHtcbiAgICAgICAgcmVmdXNlTWFuYWdlZChFcnJvckNvZGUuQk9PVFNUUkFQX0lNQUdFX1VOUkVTT0xWRUQsIHBsdWdpbiA/ICd0aGUgYW5zd2VyIGNhcnJpZWQgbm8gdG9vbGNoYWluIHJlbGVhc2UnIDogJ3RoZSBsb29rdXAgcmV0dXJuZWQgbm8gcmVjb3JkJyk7XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbikge1xuICAgICAgICByZXNvbHZlZFtrZXldID0gcGx1Z2luO1xuICAgICAgICBpZiAobWFuYWdlZCAmJiB0b29sY2hhaW4gJiYgdG9vbGNoYWluU2luaykgdG9vbGNoYWluU2lua1trZXldID0gdG9vbGNoYWluO1xuICAgICAgfSBlbHNlIGlmIChwaW4pIHtcbiAgICAgICAgcmVmdXNlKCdQTFVHSU5fVkVSU0lPTl9OT1RfRk9VTkQnLCBwaW5Ob3RGb3VuZE1lc3NhZ2UobGFiZWwsIHBpbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKGBQbHVnaW4gXCIke2xhYmVsfVwiIGxvb2t1cCByZXR1cm5lZCBubyByZWNvcmQg4oCUIGZhbGxpbmcgYmFjayB0byBkZXBsb3ktdGltZSByZXNvbHV0aW9uYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAobWFuYWdlZCkge1xuICAgICAgICByZWZ1c2VNYW5hZ2VkKHNlcnZpY2VFcnJvckNvZGUoZXJyKSA/PyBFcnJvckNvZGUuQk9PVFNUUkFQX0lNQUdFX1VOUkVTT0xWRUQsIHNlcnZpY2VNZXNzYWdlKGVycikgPz8gZXJyb3JNZXNzYWdlKGVycikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBBIHBsdWdpbiB3aG9zZSBpbWFnZSBzaWduYXR1cmUgZG9lc24ndCB2ZXJpZnksIG9yIGEgbGlzdGluZyB0aGUgb3JnXG4gICAgICAvLyBjYW4ndCB1c2UsIGlzIE5PVCBhbiBvdXRhZ2UgdG8gcmlkZSBvdXQ6IGZhbGxpbmcgYmFjayB3b3VsZCBxdWlldGx5XG4gICAgICAvLyB0dXJuIGl0IGludG8gYW4gdW5yZXNvbHZlZCBzdGVwLiBTdG9wLlxuICAgICAgY29uc3QgY29kZSA9IGZhdGFsTG9va3VwQ29kZShlcnIpO1xuICAgICAgaWYgKGNvZGUgPT09IEVycm9yQ29kZS5JTUFHRV9WRVJJRklDQVRJT05fRkFJTEVEKSB7XG4gICAgICAgIHJlZnVzZShjb2RlLCBgUGx1Z2luIFwiJHtsYWJlbH1cIiBpbWFnZSBmYWlsZWQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbjogJHtlcnJvck1lc3NhZ2UoZXJyKX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgcmVmdXNlKGNvZGUsIGBQbHVnaW4gXCIke2xhYmVsfVwiIGNhbid0IGJlIHVzZWQgKCR7Y29kZX0pOiAke3NlcnZpY2VNZXNzYWdlKGVycikgPz8gZXJyb3JNZXNzYWdlKGVycil9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwaW4gJiYgaXNOb3RGb3VuZChlcnIpKSB7XG4gICAgICAgIHJlZnVzZSgnUExVR0lOX1ZFUlNJT05fTk9UX0ZPVU5EJywgcGluTm90Rm91bmRNZXNzYWdlKGxhYmVsLCBwaW4sIGVycikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtc2cgPSBlcnJvck1lc3NhZ2UoZXJyKTtcbiAgICAgIHByaW50V2FybmluZyhgUGx1Z2luIFwiJHtsYWJlbH1cIiBwcmUtcmVzb2x1dGlvbiBmYWlsZWQgKCR7bXNnfSkg4oCUIGZhbGxpbmcgYmFjayB0byBkZXBsb3ktdGltZSByZXNvbHV0aW9uYCk7XG4gICAgfVxuICB9KSk7XG5cbiAgaWYgKGZhdGFsLmxlbmd0aCA+IDApIHRocm93IG5ldyBQbHVnaW5SZXNvbHV0aW9uRXJyb3IoZmF0YWwpO1xuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG4iXX0=
|
|
@@ -18,4 +18,15 @@ export interface ListResponseResult<T> {
|
|
|
18
18
|
* Supports: `{ <key>: T[] }`, `{ items: T[] }`, `T[]`, or invalid formats.
|
|
19
19
|
*/
|
|
20
20
|
export declare function extractListResponse<T>(response: unknown, itemsKey: string): ListResponseResult<T>;
|
|
21
|
+
/**
|
|
22
|
+
* Read one page of a `sendPaginatedNested` list (`{ data: { <key>: T[],
|
|
23
|
+
* pagination } }`) STRICTLY: a response without `<key>` as an array throws
|
|
24
|
+
* instead of reading as an empty list. For callers that diff the list against
|
|
25
|
+
* something else (`audit stacks`), an empty list read off the wrong key is not
|
|
26
|
+
* "nothing there" — it turns into a false finding for every row on the other
|
|
27
|
+
* side, which is exactly how reading the wrong key once went unnoticed.
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractListPage<T>(response: unknown, itemsKey: string): ListResponseResult<T> & {
|
|
30
|
+
nextCursor?: string;
|
|
31
|
+
};
|
|
21
32
|
//# sourceMappingURL=response-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-utils.d.ts","sources":["../../src/utils/response-utils.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAQnH;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAoCjG"}
|
|
1
|
+
{"version":3,"file":"response-utils.d.ts","sources":["../../src/utils/response-utils.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAQnH;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAoCjG;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAavH"}
|
|
@@ -67,4 +67,26 @@ export function extractListResponse(response, itemsKey) {
|
|
|
67
67
|
printError('Invalid response format from API');
|
|
68
68
|
throw new Error('Unexpected API response format');
|
|
69
69
|
}
|
|
70
|
-
|
|
70
|
+
/**
|
|
71
|
+
* Read one page of a `sendPaginatedNested` list (`{ data: { <key>: T[],
|
|
72
|
+
* pagination } }`) STRICTLY: a response without `<key>` as an array throws
|
|
73
|
+
* instead of reading as an empty list. For callers that diff the list against
|
|
74
|
+
* something else (`audit stacks`), an empty list read off the wrong key is not
|
|
75
|
+
* "nothing there" — it turns into a false finding for every row on the other
|
|
76
|
+
* side, which is exactly how reading the wrong key once went unnoticed.
|
|
77
|
+
*/
|
|
78
|
+
export function extractListPage(response, itemsKey) {
|
|
79
|
+
const obj = unwrapEnvelope(response);
|
|
80
|
+
const items = obj[itemsKey];
|
|
81
|
+
if (!Array.isArray(items)) {
|
|
82
|
+
throw new Error(`Unexpected API response format: no "${itemsKey}" list in the response`);
|
|
83
|
+
}
|
|
84
|
+
const pagination = (obj.pagination ?? {});
|
|
85
|
+
return {
|
|
86
|
+
items: items,
|
|
87
|
+
total: typeof pagination.total === 'number' ? pagination.total : undefined,
|
|
88
|
+
hasMore: pagination.hasMore === true,
|
|
89
|
+
...(typeof pagination.nextCursor === 'string' && pagination.nextCursor ? { nextCursor: pagination.nextCursor } : {}),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UtdXRpbHMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9yZXNwb25zZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLDJFQUEyRTtBQUMzRSwrRUFBK0U7QUFDL0UsNERBQTREO0FBRTVELE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFN0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxRQUFpQjtJQUM5QyxJQUFJLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEdBQUcsR0FBRyxRQUFtQyxDQUFDO1FBQ2hELElBQUksU0FBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xGLE9BQU8sR0FBRyxDQUFDLElBQStCLENBQUM7UUFDN0MsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBSSxRQUFpQixFQUFFLFNBQWlCLEVBQUUsYUFBcUI7SUFDbEcsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLDJGQUEyRjtJQUMzRixJQUFJLGFBQWEsSUFBSSxPQUFPO1FBQUUsT0FBTyxPQUF1QixDQUFDO0lBQzdELDREQUE0RDtJQUM1RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUF3QyxDQUFDO0lBQ3pFLElBQUksTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxhQUFhLElBQUksTUFBTTtRQUFFLE9BQU8sTUFBc0IsQ0FBQztJQUNuRyxPQUFPLFNBQVMs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QUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNySCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vLyBBUEkgcmVzcG9uc2UtZW52ZWxvcGUgcGFyc2luZy4gU3BsaXQgb3V0IG9mIG91dHB1dC11dGlscyAod2hpY2ggaXMgYWJvdXRcbi8vIHJlbmRlcmluZykg4oCUIHRoaXMgaXMgcHVyZWx5IGFib3V0IHJlYWRpbmcgdGhlIGB7IHN1Y2Nlc3MsIGRhdGEgfWAgc2hhcGVzIHRoZVxuLy8gcGxhdGZvcm0gcmV0dXJucyBhbmQgcHVsbGluZyBvdXQgc2luZ2xlIGVudGl0aWVzIC8gbGlzdHMuXG5cbmltcG9ydCB7IHByaW50RXJyb3IsIHByaW50V2FybmluZyB9IGZyb20gJy4vb3V0cHV0LXV0aWxzLmpzJztcblxuLyoqXG4gKiBVbndyYXAgYSBzZW5kU3VjY2VzcyBBUEkgZW52ZWxvcGU6IHsgc3VjY2Vzcywgc3RhdHVzQ29kZSwgZGF0YTogeyAuLi4gfSB9XG4gKiBSZXR1cm5zIHRoZSBpbm5lciBgZGF0YWAgb2JqZWN0LCBvciB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgaWYgbm90IHdyYXBwZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBFbnZlbG9wZShyZXNwb25zZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKHJlc3BvbnNlICYmIHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBvYmogPSByZXNwb25zZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoJ3N1Y2Nlc3MnIGluIG9iaiAmJiAnZGF0YScgaW4gb2JqICYmIG9iai5kYXRhICYmIHR5cGVvZiBvYmouZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBvYmouZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogRXh0cmFjdCBhIHNpbmdsZSBlbnRpdHkgZnJvbSBhbiBBUEkgcmVzcG9uc2UsIGhhbmRsaW5nIGVudmVsb3BlIGZvcm1hdHMuXG4gKiBUcmllczogcGF5bG9hZFtlbnRpdHlLZXldLCBwYXlsb2FkIGRpcmVjdGx5IChpZiBpZGVudGlmaWVyS2V5IGV4aXN0cyksIG9yIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTaW5nbGVSZXNwb25zZTxUPihyZXNwb25zZTogdW5rbm93biwgZW50aXR5S2V5OiBzdHJpbmcsIGlkZW50aWZpZXJLZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXlsb2FkID0gdW53cmFwRW52ZWxvcGUocmVzcG9uc2UpO1xuICAvLyBEaXJlY3QgZW50aXR5OiBwYXlsb2FkIGhhcyB0aGUgaWRlbnRpZmllciAoZS5nLiBwYXlsb2FkLmlkLCBwYXlsb2FkLnByb3BzLCBwYXlsb2FkLm5hbWUpXG4gIGlmIChpZGVudGlmaWVyS2V5IGluIHBheWxvYWQpIHJldHVybiBwYXlsb2FkIGFzIHVua25vd24gYXMgVDtcbiAgLy8gTmVzdGVkIHVuZGVyIGVudGl0eSBrZXk6IHBheWxvYWQucGlwZWxpbmUsIHBheWxvYWQucGx1Z2luXG4gIGNvbnN0IG5lc3RlZCA9IHBheWxvYWRbZW50aXR5S2V5XSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSAnb2JqZWN0JyAmJiBpZGVudGlmaWVyS2V5IGluIG5lc3RlZCkgcmV0dXJuIG5lc3RlZCBhcyB1bmtub3duIGFzIFQ7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFJlc3BvbnNlUmVzdWx0PFQ+IHtcbiAgaXRlbXM6IFRbXTtcbiAgdG90YWw/OiBudW1iZXI7XG4gIGhhc01vcmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXh0cmFjdCBpdGVtcyBmcm9tIGFuIEFQSSBsaXN0IHJlc3BvbnNlLCBoYW5kbGluZyBtdWx0aXBsZSByZXNwb25zZSBmb3JtYXRzLlxuICogU3VwcG9ydHM6IGB7IDxrZXk+OiBUW10gfWAsIGB7IGl0ZW1zOiBUW10gfWAsIGBUW11gLCBvciBpbnZhbGlkIGZvcm1hdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TGlzdFJlc3BvbnNlPFQ+KHJlc3BvbnNlOiB1bmtub3duLCBpdGVtc0tleTogc3RyaW5nKTogTGlzdFJlc3BvbnNlUmVzdWx0PFQ+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XG4gICAgcmV0dXJuIHsgaXRlbXM6IHJlc3BvbnNlLCB0b3RhbDogdW5kZWZpbmVkLCBoYXNNb3JlOiBmYWxzZSB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlICYmIHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBvYmogPSB1bndyYXBFbnZlbG9wZShyZXNwb25zZSk7XG5cbiAgICAvLyBBIGB7IHN1Y2Nlc3MsIGRhdGE6IFsuLi5dIH1gIGVudmVsb3BlIHVud3JhcHMgdG8gdGhlIGJhcmUgYXJyYXkg4oCUIHJldHVybiBpdCBkaXJlY3RseVxuICAgIC8vICh0aGUgYGl0ZW1zS2V5IGluIG9iamAgLyBgJ2l0ZW1zJyBpbiBvYmpgIGNoZWNrcyBiZWxvdyBhcmUgZmFsc2UgZm9yIGFuIGFycmF5LCBzb1xuICAgIC8vIHdpdGhvdXQgdGhpcyBzdWNoIGxpc3QgZW52ZWxvcGVzIHdvdWxkIHNpbGVudGx5IHlpZWxkIHplcm8gaXRlbXMpLlxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiB7IGl0ZW1zOiBvYmogYXMgVFtdLCB0b3RhbDogdW5kZWZpbmVkLCBoYXNNb3JlOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgcGFnaW5hdGlvbiBtZXRhZGF0YSBpZiBwcmVzZW50XG4gICAgY29uc3QgcGFnaW5hdGlvbiA9IG9iai5wYWdpbmF0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRvdGFsID0gKHBhZ2luYXRpb24/LnRvdGFsID8/IG9iai50b3RhbCkgYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGhhc01vcmUgPSAoKHBhZ2luYXRpb24/Lmhhc01vcmUgPz8gb2JqLmhhc01vcmUpIGFzIGJvb2xlYW4pIHx8IGZhbHNlO1xuXG4gICAgLy8gVHJ5IHByaW1hcnkga2V5IChlLmcuICdwaXBlbGluZXMnLCAncGx1Z2lucycpXG4gICAgaWYgKGl0ZW1zS2V5IGluIG9iaiAmJiBBcnJheS5pc0FycmF5KG9ialtpdGVtc0tleV0pKSB7XG4gICAgICByZXR1cm4geyBpdGVtczogb2JqW2l0ZW1zS2V5XSBhcyBUW10sIHRvdGFsLCBoYXNNb3JlIH07XG4gICAgfVxuXG4gICAgLy8gVHJ5IGdlbmVyaWMgJ2l0ZW1zJyBrZXlcbiAgICBpZiAoJ2l0ZW1zJyBpbiBvYmogJiYgQXJyYXkuaXNBcnJheShvYmouaXRlbXMpKSB7XG4gICAgICByZXR1cm4geyBpdGVtczogb2JqLml0ZW1zIGFzIFRbXSwgdG90YWwsIGhhc01vcmUgfTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ1VuZXhwZWN0ZWQgcmVzcG9uc2UgZm9ybWF0LCBhdHRlbXB0aW5nIHRvIGhhbmRsZScpO1xuICAgIHJldHVybiB7IGl0ZW1zOiBbXSwgdG90YWw6IHVuZGVmaW5lZCwgaGFzTW9yZTogZmFsc2UgfTtcbiAgfVxuXG4gIHByaW50RXJyb3IoJ0ludmFsaWQgcmVzcG9uc2UgZm9ybWF0IGZyb20gQVBJJyk7XG4gIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBBUEkgcmVzcG9uc2UgZm9ybWF0Jyk7XG59XG5cbi8qKlxuICogUmVhZCBvbmUgcGFnZSBvZiBhIGBzZW5kUGFnaW5hdGVkTmVzdGVkYCBsaXN0IChgeyBkYXRhOiB7IDxrZXk+OiBUW10sXG4gKiBwYWdpbmF0aW9uIH0gfWApIFNUUklDVExZOiBhIHJlc3BvbnNlIHdpdGhvdXQgYDxrZXk+YCBhcyBhbiBhcnJheSB0aHJvd3NcbiAqIGluc3RlYWQgb2YgcmVhZGluZyBhcyBhbiBlbXB0eSBsaXN0LiBGb3IgY2FsbGVycyB0aGF0IGRpZmYgdGhlIGxpc3QgYWdhaW5zdFxuICogc29tZXRoaW5nIGVsc2UgKGBhdWRpdCBzdGFja3NgKSwgYW4gZW1wdHkgbGlzdCByZWFkIG9mZiB0aGUgd3Jvbmcga2V5IGlzIG5vdFxuICogXCJub3RoaW5nIHRoZXJlXCIg4oCUIGl0IHR1cm5zIGludG8gYSBmYWxzZSBmaW5kaW5nIGZvciBldmVyeSByb3cgb24gdGhlIG90aGVyXG4gKiBzaWRlLCB3aGljaCBpcyBleGFjdGx5IGhvdyByZWFkaW5nIHRoZSB3cm9uZyBrZXkgb25jZSB3ZW50IHVubm90aWNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaXN0UGFnZTxUPihyZXNwb25zZTogdW5rbm93biwgaXRlbXNLZXk6IHN0cmluZyk6IExpc3RSZXNwb25zZVJlc3VsdDxUPiAmIHsgbmV4dEN1cnNvcj86IHN0cmluZyB9IHtcbiAgY29uc3Qgb2JqID0gdW53cmFwRW52ZWxvcGUocmVzcG9uc2UpO1xuICBjb25zdCBpdGVtcyA9IG9ialtpdGVtc0tleV07XG4gIGlmICghQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgQVBJIHJlc3BvbnNlIGZvcm1hdDogbm8gXCIke2l0ZW1zS2V5fVwiIGxpc3QgaW4gdGhlIHJlc3BvbnNlYCk7XG4gIH1cbiAgY29uc3QgcGFnaW5hdGlvbiA9IChvYmoucGFnaW5hdGlvbiA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiB7XG4gICAgaXRlbXM6IGl0ZW1zIGFzIFRbXSxcbiAgICB0b3RhbDogdHlwZW9mIHBhZ2luYXRpb24udG90YWwgPT09ICdudW1iZXInID8gcGFnaW5hdGlvbi50b3RhbCA6IHVuZGVmaW5lZCxcbiAgICBoYXNNb3JlOiBwYWdpbmF0aW9uLmhhc01vcmUgPT09IHRydWUsXG4gICAgLi4uKHR5cGVvZiBwYWdpbmF0aW9uLm5leHRDdXJzb3IgPT09ICdzdHJpbmcnICYmIHBhZ2luYXRpb24ubmV4dEN1cnNvciA/IHsgbmV4dEN1cnNvcjogcGFnaW5hdGlvbi5uZXh0Q3Vyc29yIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type LookupToolchain, type LookupWarning, type ResolvedBootstrap } from '@pipeline-builder/pipeline-core';
|
|
2
|
+
import type { ApiClient } from './api-client.js';
|
|
3
|
+
import { PluginResolutionError } from './plugin-resolver.js';
|
|
4
|
+
/** `toolchain export` file format version. */
|
|
5
|
+
export declare const TOOLCHAIN_FILE_FORMAT = 1;
|
|
6
|
+
/** A plugin record as the lookup returned it (opaque here; pipeline-core reads it). */
|
|
7
|
+
type PluginRecord = ResolvedBootstrap['plugin'];
|
|
8
|
+
/** One half of an exported release. */
|
|
9
|
+
export interface ToolchainFileHalf {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly version: string;
|
|
12
|
+
readonly imageRepository: string;
|
|
13
|
+
readonly imageDigest: string;
|
|
14
|
+
/** The full lookup record — what the synth consumes. */
|
|
15
|
+
readonly plugin: PluginRecord;
|
|
16
|
+
}
|
|
17
|
+
/** What `pipeline-manager toolchain export` writes and `--toolchain-file` reads. */
|
|
18
|
+
export interface ToolchainFile {
|
|
19
|
+
readonly format: typeof TOOLCHAIN_FILE_FORMAT;
|
|
20
|
+
readonly releaseVersion: string;
|
|
21
|
+
readonly resolvedVia: LookupToolchain['resolvedVia'];
|
|
22
|
+
readonly toolchain: LookupToolchain['versions'];
|
|
23
|
+
readonly exportedAt: string;
|
|
24
|
+
/**
|
|
25
|
+
* The platform the release was exported from. Its host is the registry
|
|
26
|
+
* CodeBuild pulls both images from, so a local-spec deploy bakes it as the
|
|
27
|
+
* pull host (unless IMAGE_REGISTRY_PULL_HOST is set), like a platform deploy.
|
|
28
|
+
*/
|
|
29
|
+
readonly platformBaseUrl?: string;
|
|
30
|
+
readonly bootstrap: ToolchainFileHalf;
|
|
31
|
+
readonly synth: ToolchainFileHalf;
|
|
32
|
+
}
|
|
33
|
+
/** The refusal every failure here raises — one code, so `PB_SYNTH_FAILURE` reports it uniformly. */
|
|
34
|
+
export declare function bootstrapUnresolved(message: string, code?: string): PluginResolutionError;
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the pipeline's `pipeline-bootstrap` through `/plugins/lookup` with
|
|
37
|
+
* `releasePin = props.toolchain?.release`. FATAL on any failure
|
|
38
|
+
* (`BOOTSTRAP_IMAGE_UNRESOLVED`): unreachable platform, no default (409
|
|
39
|
+
* `TOOLCHAIN_NO_DEFAULT`), a deleted pin (404), a refused signature, or an
|
|
40
|
+
* answer without a release. Warnings are printed, appended to `warningSink`,
|
|
41
|
+
* and — with a `pipelineId` — recorded by the platform on the pipeline's
|
|
42
|
+
* "Build image" row (`context.stepKeys: ['build-image']`).
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveBootstrapImage(client: ApiClient, props: Record<string, unknown>, warningSink?: LookupWarning[]): Promise<ResolvedBootstrap>;
|
|
45
|
+
/** The managed synth reference of a pipeline's props, when its synth plugin is `cdk-synth`. */
|
|
46
|
+
export declare function managedSynthKey(props: Record<string, unknown>): string | null;
|
|
47
|
+
/**
|
|
48
|
+
* Both halves of one release must agree. A managed `cdk-synth` that resolved
|
|
49
|
+
* to a different release than the bootstrap is refused (never served).
|
|
50
|
+
*/
|
|
51
|
+
export declare function assertOneRelease(bootstrap: ResolvedBootstrap, synthToolchains: Record<string, LookupToolchain>): void;
|
|
52
|
+
/**
|
|
53
|
+
* Resolve both halves of a release for export: `release` when given, else
|
|
54
|
+
* whatever the caller's org resolves to now (its default, canary or the
|
|
55
|
+
* platform default). Both lookups send the same pin; when no pin is given the
|
|
56
|
+
* bootstrap's release becomes the synth's pin, so the halves always match.
|
|
57
|
+
*/
|
|
58
|
+
export declare function exportToolchain(client: ApiClient, release?: string): Promise<ToolchainFile>;
|
|
59
|
+
/** The local-spec refusal when no `--toolchain-file` was given. */
|
|
60
|
+
export declare function toolchainFileRequired(): PluginResolutionError;
|
|
61
|
+
/**
|
|
62
|
+
* Read and check a `toolchain export` file: both halves present, named right,
|
|
63
|
+
* digest-pinned, and of one release. Any problem is `BOOTSTRAP_IMAGE_UNRESOLVED`.
|
|
64
|
+
*/
|
|
65
|
+
export declare function readToolchainFile(file: string): {
|
|
66
|
+
bootstrap: ResolvedBootstrap;
|
|
67
|
+
synth: PluginRecord;
|
|
68
|
+
platformBaseUrl?: string;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Apply a toolchain file to local-spec props: the bootstrap as
|
|
72
|
+
* `resolvedBootstrap`, the exporting platform as the registry pull host, and —
|
|
73
|
+
* when the synth plugin is the managed `cdk-synth` — the exported synth half
|
|
74
|
+
* as its pre-resolved plugin.
|
|
75
|
+
*/
|
|
76
|
+
export declare function applyToolchainFile(props: Record<string, unknown>, file: string): ToolchainFile['releaseVersion'];
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=toolchain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolchain.d.ts","sources":["../../src/utils/toolchain.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EACjE,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAA+D,MAAM,sBAAsB,CAAC;AAK1H,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,uFAAuF;AACvF,KAAK,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAEhD,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B;AAED,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAA6C,GAAG,qBAAqB,CAE/H;AAoCD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,WAAW,CAAC,EAAE,aAAa,EAAE,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAY5B;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAI7E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CASrH;AAaD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAcjG;AAKD,mEAAmE;AACnE,wBAAgB,qBAAqB,IAAI,qBAAqB,CAE7D;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CA0B/H;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAiBhH"}
|