@workflow/core 5.0.0-beta.0 → 5.0.0-beta.10
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 +1 -1
- package/dist/attribute-changes.d.ts +7 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.js +1 -1
- package/dist/capture-stack.d.ts +16 -0
- package/dist/capture-stack.d.ts.map +1 -0
- package/dist/capture-stack.js +21 -0
- package/dist/class-serialization.js +1 -1
- package/dist/classify-error.d.ts +11 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +56 -6
- package/dist/context-errors.d.ts +27 -0
- package/dist/context-errors.d.ts.map +1 -0
- package/dist/context-errors.js +101 -0
- package/dist/context-violation-error.d.ts +97 -0
- package/dist/context-violation-error.d.ts.map +1 -0
- package/dist/context-violation-error.js +147 -0
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +4 -3
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +20 -5
- package/dist/describe-error.d.ts +70 -0
- package/dist/describe-error.d.ts.map +1 -0
- package/dist/describe-error.js +165 -0
- package/dist/encryption.d.ts +22 -1
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +72 -27
- package/dist/events-consumer.d.ts +7 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +18 -3
- package/dist/flushable-stream.d.ts +10 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +18 -13
- package/dist/global.d.ts +4 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +8 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/log-format.d.ts +25 -0
- package/dist/log-format.d.ts.map +1 -0
- package/dist/log-format.js +250 -0
- package/dist/logger.d.ts +28 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +77 -31
- package/dist/private.d.ts +5 -5
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +8 -8
- package/dist/runtime/constants.d.ts +48 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +91 -8
- package/dist/runtime/get-port-lazy.d.ts +10 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +30 -0
- package/dist/runtime/get-world-lazy.d.ts +32 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +56 -0
- package/dist/runtime/helpers.d.ts +40 -7
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +93 -36
- package/dist/runtime/replay-budget.d.ts +98 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +191 -0
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +5 -4
- package/dist/runtime/run.d.ts +10 -32
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +83 -33
- package/dist/runtime/runs.d.ts +1 -1
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +7 -4
- package/dist/runtime/start.js +17 -6
- package/dist/runtime/step-executor.d.ts +40 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +492 -0
- package/dist/runtime/step-handler.d.ts +0 -5
- package/dist/runtime/step-handler.d.ts.map +1 -1
- package/dist/runtime/step-handler.js +227 -119
- package/dist/runtime/suspension-handler.d.ts +22 -4
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +90 -73
- package/dist/runtime/world-init.d.ts +75 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +75 -0
- package/dist/runtime/world.d.ts +4 -3
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +98 -9
- package/dist/runtime.d.ts +8 -7
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +810 -324
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- package/dist/serialization/client.d.ts +17 -0
- package/dist/serialization/client.d.ts.map +1 -0
- package/dist/serialization/client.js +45 -0
- package/dist/serialization/codec-devalue.d.ts +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +98 -0
- package/dist/serialization/codec.d.ts +90 -0
- package/dist/serialization/codec.d.ts.map +1 -0
- package/dist/serialization/codec.js +17 -0
- package/dist/serialization/encryption.d.ts +32 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +67 -0
- package/dist/serialization/errors.d.ts +34 -0
- package/dist/serialization/errors.d.ts.map +1 -0
- package/dist/serialization/errors.js +59 -0
- package/dist/serialization/format.d.ts +60 -0
- package/dist/serialization/format.d.ts.map +1 -0
- package/dist/serialization/format.js +97 -0
- package/dist/serialization/index.d.ts +18 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +20 -0
- package/dist/serialization/reducers/class.d.ts +11 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -0
- package/dist/serialization/reducers/class.js +68 -0
- package/dist/serialization/reducers/common.d.ts +16 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -0
- package/dist/serialization/reducers/common.js +417 -0
- package/dist/serialization/reducers/step-function.d.ts +35 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function.js +88 -0
- package/dist/serialization/step.d.ts +17 -0
- package/dist/serialization/step.d.ts.map +1 -0
- package/dist/serialization/step.js +45 -0
- package/dist/serialization/types.d.ts +222 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +21 -0
- package/dist/serialization/workflow.d.ts +29 -0
- package/dist/serialization/workflow.d.ts.map +1 -0
- package/dist/serialization/workflow.js +54 -0
- package/dist/serialization-format.d.ts +16 -2
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +104 -5
- package/dist/serialization.d.ts +217 -224
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +940 -643
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +40 -0
- package/dist/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +44 -6
- package/dist/step/context-storage.d.ts +14 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step/get-closure-vars.d.ts.map +1 -1
- package/dist/step/get-closure-vars.js +3 -2
- package/dist/step/get-step-metadata.d.ts.map +1 -1
- package/dist/step/get-step-metadata.js +3 -2
- package/dist/step/get-workflow-metadata.d.ts.map +1 -1
- package/dist/step/get-workflow-metadata.js +3 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +39 -5
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +97 -19
- package/dist/symbols.d.ts +20 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +21 -1
- package/dist/telemetry/semantic-conventions.d.ts +2 -2
- package/dist/telemetry/semantic-conventions.js +1 -1
- package/dist/telemetry.js +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +18 -3
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +28 -5
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +3 -2
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/vm/uuid.js +1 -1
- package/dist/workflow/abort-controller.d.ts +65 -0
- package/dist/workflow/abort-controller.d.ts.map +1 -0
- package/dist/workflow/abort-controller.js +260 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +3 -2
- package/dist/workflow/define-hook.d.ts +1 -1
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +8 -4
- package/dist/workflow/get-workflow-metadata.d.ts +11 -0
- package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
- package/dist/workflow/get-workflow-metadata.js +14 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +13 -4
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +5 -3
- package/dist/workflow/set-attributes.d.ts +74 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +66 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +22 -3
- package/dist/workflow/world-init-stub.d.ts +15 -0
- package/dist/workflow/world-init-stub.d.ts.map +1 -0
- package/dist/workflow/world-init-stub.js +15 -0
- package/dist/workflow/writable-stream.js +1 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +84 -31
- package/docs/api-reference/create-webhook.mdx +37 -18
- package/docs/api-reference/experimental-set-attributes.mdx +63 -0
- package/docs/api-reference/get-workflow-metadata.mdx +61 -0
- package/docs/api-reference/index.mdx +3 -0
- package/docs/foundations/cancellation.mdx +460 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- package/docs/foundations/index.mdx +3 -3
- package/docs/foundations/meta.json +3 -2
- package/docs/foundations/serialization.mdx +78 -42
- package/docs/foundations/starting-workflows.mdx +6 -2
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/how-it-works/cancellation.mdx +287 -0
- package/docs/how-it-works/code-transform.mdx +8 -7
- package/docs/how-it-works/event-sourcing.mdx +2 -2
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +19 -10
- package/docs/foundations/common-patterns.mdx +0 -265
|
@@ -178,6 +178,21 @@ export async function hydrateDataWithKey(value, revivers, key) {
|
|
|
178
178
|
const STREAM_ID_PREFIX = 'strm_';
|
|
179
179
|
/** Marker for stream reference objects rendered as links in the UI */
|
|
180
180
|
export const STREAM_REF_TYPE = '__workflow_stream_ref__';
|
|
181
|
+
/** Marker for Run reference objects rendered as links in the UI */
|
|
182
|
+
export const RUN_REF_TYPE = '__workflow_run_ref__';
|
|
183
|
+
/** Check if a value is a RunRef object */
|
|
184
|
+
export const isRunRef = (value) => {
|
|
185
|
+
return (value !== null &&
|
|
186
|
+
typeof value === 'object' &&
|
|
187
|
+
'__type' in value &&
|
|
188
|
+
value.__type === RUN_REF_TYPE &&
|
|
189
|
+
'runId' in value &&
|
|
190
|
+
typeof value.runId === 'string');
|
|
191
|
+
};
|
|
192
|
+
/** Convert a serialized Run value to a RunRef for display */
|
|
193
|
+
export const serializedRunToRunRef = (value) => {
|
|
194
|
+
return { __type: RUN_REF_TYPE, runId: value.runId };
|
|
195
|
+
};
|
|
181
196
|
/** Marker for custom class instance references */
|
|
182
197
|
export const CLASS_INSTANCE_REF_TYPE = '__workflow_class_instance_ref__';
|
|
183
198
|
/**
|
|
@@ -268,9 +283,18 @@ export const extractClassName = (classId) => {
|
|
|
268
283
|
const parts = classId.split('/');
|
|
269
284
|
return parts[parts.length - 1] || classId;
|
|
270
285
|
};
|
|
271
|
-
/** Convert a serialized class instance to a ClassInstanceRef for display
|
|
286
|
+
/** Convert a serialized class instance to a ClassInstanceRef for display.
|
|
287
|
+
* Run instances are special-cased to a RunRef for clickable rendering. */
|
|
272
288
|
export const serializedInstanceToRef = (value) => {
|
|
273
|
-
|
|
289
|
+
const className = extractClassName(value.classId);
|
|
290
|
+
if (className === 'Run' &&
|
|
291
|
+
value.data !== null &&
|
|
292
|
+
typeof value.data === 'object' &&
|
|
293
|
+
'runId' in value.data &&
|
|
294
|
+
typeof value.data.runId === 'string') {
|
|
295
|
+
return serializedRunToRunRef(value.data);
|
|
296
|
+
}
|
|
297
|
+
return new ClassInstanceRef(className, value.classId, value.data);
|
|
274
298
|
};
|
|
275
299
|
/** Convert a serialized class reference to a display string */
|
|
276
300
|
export const serializedClassToString = (value) => {
|
|
@@ -284,7 +308,36 @@ export const observabilityRevivers = {
|
|
|
284
308
|
ReadableStream: streamToStreamRef,
|
|
285
309
|
WritableStream: streamToStreamRef,
|
|
286
310
|
TransformStream: streamToStreamRef,
|
|
311
|
+
AbortController: (value) => `<AbortController(aborted: ${value.aborted})>`,
|
|
312
|
+
AbortSignal: (value) => `<AbortSignal(aborted: ${value.aborted})>`,
|
|
313
|
+
// DOMException needs an explicit reviver: without one, devalue.parse
|
|
314
|
+
// throws on the `["DOMException", ...]` tag and `hydrateStepIO`'s
|
|
315
|
+
// try/catch leaves the raw flat-encoded string in the UI. AbortController
|
|
316
|
+
// synthesizes a DOMException as the default `signal.reason` when abort()
|
|
317
|
+
// is called with no arg — so any abort that round-trips through a step
|
|
318
|
+
// boundary surfaces here. Reconstruct as a real DOMException when the
|
|
319
|
+
// global is available (modern browsers + Node 18+), else fall back to
|
|
320
|
+
// an Error preserving name/message/stack/cause for display.
|
|
321
|
+
DOMException: (value) => {
|
|
322
|
+
const G = globalThis;
|
|
323
|
+
if (typeof G.DOMException === 'function') {
|
|
324
|
+
const e = new G.DOMException(value.message, value.name);
|
|
325
|
+
if (value.stack !== undefined)
|
|
326
|
+
e.stack = value.stack;
|
|
327
|
+
if ('cause' in value)
|
|
328
|
+
e.cause = value.cause;
|
|
329
|
+
return e;
|
|
330
|
+
}
|
|
331
|
+
const e = new Error(value.message);
|
|
332
|
+
e.name = value.name;
|
|
333
|
+
if (value.stack !== undefined)
|
|
334
|
+
e.stack = value.stack;
|
|
335
|
+
if ('cause' in value)
|
|
336
|
+
e.cause = value.cause;
|
|
337
|
+
return e;
|
|
338
|
+
},
|
|
287
339
|
StepFunction: serializedStepFunctionToString,
|
|
340
|
+
WorkflowFunction: (value) => `<workflow:${value.workflowId}>`,
|
|
288
341
|
Instance: serializedInstanceToRef,
|
|
289
342
|
Class: serializedClassToString,
|
|
290
343
|
};
|
|
@@ -297,6 +350,7 @@ export const observabilityRevivers = {
|
|
|
297
350
|
function hydrateStepIO(resource, revivers) {
|
|
298
351
|
let hydratedInput = resource.input;
|
|
299
352
|
let hydratedOutput = resource.output;
|
|
353
|
+
let hydratedError = resource.error;
|
|
300
354
|
if (resource.input != null) {
|
|
301
355
|
try {
|
|
302
356
|
hydratedInput = hydrateData(resource.input, revivers);
|
|
@@ -313,7 +367,23 @@ function hydrateStepIO(resource, revivers) {
|
|
|
313
367
|
// Leave un-hydrated
|
|
314
368
|
}
|
|
315
369
|
}
|
|
316
|
-
|
|
370
|
+
// The `error` field is `SerializedData` (Uint8Array) produced by
|
|
371
|
+
// `dehydrateStepError`. Hydrate it so observability tools (CLI, web UI)
|
|
372
|
+
// can read `step.error.message`, `step.error.stack`, etc.
|
|
373
|
+
if (resource.error != null) {
|
|
374
|
+
try {
|
|
375
|
+
hydratedError = hydrateData(resource.error, revivers);
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
// Leave un-hydrated
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return {
|
|
382
|
+
...resource,
|
|
383
|
+
input: hydratedInput,
|
|
384
|
+
output: hydratedOutput,
|
|
385
|
+
error: hydratedError,
|
|
386
|
+
};
|
|
317
387
|
}
|
|
318
388
|
/**
|
|
319
389
|
* Hydrate the data fields of a workflow run resource.
|
|
@@ -321,6 +391,7 @@ function hydrateStepIO(resource, revivers) {
|
|
|
321
391
|
function hydrateWorkflowIO(resource, revivers) {
|
|
322
392
|
let hydratedInput = resource.input;
|
|
323
393
|
let hydratedOutput = resource.output;
|
|
394
|
+
let hydratedError = resource.error;
|
|
324
395
|
if (resource.input != null) {
|
|
325
396
|
try {
|
|
326
397
|
hydratedInput = hydrateData(resource.input, revivers);
|
|
@@ -337,7 +408,23 @@ function hydrateWorkflowIO(resource, revivers) {
|
|
|
337
408
|
// Leave un-hydrated
|
|
338
409
|
}
|
|
339
410
|
}
|
|
340
|
-
|
|
411
|
+
// The `error` field is `SerializedData` (Uint8Array) produced by
|
|
412
|
+
// `dehydrateRunError`. Hydrate it so observability tools (CLI, web UI)
|
|
413
|
+
// can read `run.error.message`, `run.error.stack`, etc.
|
|
414
|
+
if (resource.error != null) {
|
|
415
|
+
try {
|
|
416
|
+
hydratedError = hydrateData(resource.error, revivers);
|
|
417
|
+
}
|
|
418
|
+
catch {
|
|
419
|
+
// Leave un-hydrated
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return {
|
|
423
|
+
...resource,
|
|
424
|
+
input: hydratedInput,
|
|
425
|
+
output: hydratedOutput,
|
|
426
|
+
error: hydratedError,
|
|
427
|
+
};
|
|
341
428
|
}
|
|
342
429
|
/**
|
|
343
430
|
* Hydrate the eventData fields of an event resource.
|
|
@@ -391,6 +478,18 @@ function hydrateEventData(resource, revivers) {
|
|
|
391
478
|
// Leave un-hydrated
|
|
392
479
|
}
|
|
393
480
|
}
|
|
481
|
+
// step_failed / step_retrying / run_failed events have eventData.error
|
|
482
|
+
// (the thrown value, serialized via the error pipeline). Without this,
|
|
483
|
+
// event listings in o11y tooling would surface the raw `Uint8Array`
|
|
484
|
+
// payload instead of a hydrated `{ name, message, stack, … }` object.
|
|
485
|
+
if ('error' in eventData && eventData.error != null) {
|
|
486
|
+
try {
|
|
487
|
+
eventData.error = hydrateData(eventData.error, revivers);
|
|
488
|
+
}
|
|
489
|
+
catch {
|
|
490
|
+
// Leave un-hydrated
|
|
491
|
+
}
|
|
492
|
+
}
|
|
394
493
|
return { ...resource, eventData };
|
|
395
494
|
}
|
|
396
495
|
/**
|
|
@@ -478,4 +577,4 @@ export function truncateId(id, maxLength = 12) {
|
|
|
478
577
|
return id;
|
|
479
578
|
return `${id.slice(0, maxLength)}...`;
|
|
480
579
|
}
|
|
481
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VyaWFsaXphdGlvbi1mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0MsOEVBQThFO0FBQzlFLGdEQUFnRDtBQUNoRCw4RUFBOEU7QUFFOUUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsMkRBQTJEO0lBQzNELFVBQVUsRUFBRSxNQUFNO0lBQ2xCLG1GQUFtRjtJQUNuRixTQUFTLEVBQUUsTUFBTTtDQUNULENBQUM7QUFLWCwyQ0FBMkM7QUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBRXhDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUErQixFQUMvQixPQUE2QjtJQUU3QixJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUNiLHFDQUFxQyxvQkFBb0IsMkJBQTJCLE1BQU0sTUFBTSxXQUFXLENBQUMsTUFBTSxTQUFTLENBQzVILENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sQ0FB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
|
|
580
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VyaWFsaXphdGlvbi1mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0MsOEVBQThFO0FBQzlFLGdEQUFnRDtBQUNoRCw4RUFBOEU7QUFFOUUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsMkRBQTJEO0lBQzNELFVBQVUsRUFBRSxNQUFNO0lBQ2xCLG1GQUFtRjtJQUNuRixTQUFTLEVBQUUsTUFBTTtDQUNULENBQUM7QUFLWCwyQ0FBMkM7QUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBRXhDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUErQixFQUMvQixPQUE2QjtJQUU3QixJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUNiLHFDQUFxQyxvQkFBb0IsMkJBQTJCLE1BQU0sTUFBTSxXQUFXLENBQUMsTUFBTSxTQUFTLENBQzVILENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sQ0FB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Q0FBQztRQUNsQyxDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsdUVBQXVFO0FBQ3ZFLE1BQU0sVUFBVSxVQUFVLENBQUMsRUFBVSxFQUFFLFNBQVMsR0FBRyxFQUFFO0lBQ25ELElBQUksRUFBRSxDQUFDLE1BQU0sSUFBSSxTQUFTO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdEMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3Nlci1zYWZlIHNlcmlhbGl6YXRpb24gZm9ybWF0IHV0aWxpdGllcy5cbiAqXG4gKiBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgZm9ybWF0IHByZWZpeCBoYW5kbGluZywgZ2VuZXJpYyBoeWRyYXRlL2RlaHlkcmF0ZVxuICogZGlzcGF0Y2gsIGFuZCBzaGFyZWQgdHlwZXMvY2xhc3NlcyB1c2VkIGJ5IGFsbCBlbnZpcm9ubWVudHMgKHJ1bnRpbWUsIHdlYlxuICogbzExeSwgQ0xJIG8xMXkpLiBJdCBoYXMgTk8gTm9kZS5qcyBkZXBlbmRlbmNpZXMuXG4gKi9cblxuaW1wb3J0IHsgcGFyc2UsIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZvcm1hdCBwcmVmaXggY29uc3RhbnRzIGFuZCBlbmNvZGluZy9kZWNvZGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBTZXJpYWxpemF0aW9uRm9ybWF0ID0ge1xuICAvKiogZGV2YWx1ZSBzdHJpbmdpZnkvcGFyc2Ugd2l0aCBUZXh0RW5jb2Rlci9UZXh0RGVjb2RlciAqL1xuICBERVZBTFVFX1YxOiAnZGV2bCcsXG4gIC8qKiBFbmNyeXB0ZWQgcGF5bG9hZCAoaW5uZXIgcGF5bG9hZCBoYXMgaXRzIG93biBmb3JtYXQgcHJlZml4IGFmdGVyIGRlY3J5cHRpb24pICovXG4gIEVOQ1JZUFRFRDogJ2VuY3InLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUgPVxuICAodHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXQpW2tleW9mIHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0XTtcblxuLyoqIExlbmd0aCBvZiB0aGUgZm9ybWF0IHByZWZpeCBpbiBieXRlcyAqL1xuY29uc3QgRk9STUFUX1BSRUZJWF9MRU5HVEggPSA0O1xuXG5jb25zdCBmb3JtYXRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5jb25zdCBmb3JtYXREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKlxuICogRW5jb2RlIGEgcGF5bG9hZCB3aXRoIGEgZm9ybWF0IHByZWZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gIGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUsXG4gIHBheWxvYWQ6IFVpbnQ4QXJyYXkgfCB1bmtub3duXG4pOiBVaW50OEFycmF5IHwgdW5rbm93biB7XG4gIGlmICghKHBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgY29uc3QgcHJlZml4Qnl0ZXMgPSBmb3JtYXRFbmNvZGVyLmVuY29kZShmb3JtYXQpO1xuICBpZiAocHJlZml4Qnl0ZXMubGVuZ3RoICE9PSBGT1JNQVRfUFJFRklYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGb3JtYXQgaWRlbnRpZmllciBtdXN0IGJlIGV4YWN0bHkgJHtGT1JNQVRfUFJFRklYX0xFTkdUSH0gQVNDSUkgY2hhcmFjdGVycywgZ290IFwiJHtmb3JtYXR9XCIgKCR7cHJlZml4Qnl0ZXMubGVuZ3RofSBieXRlcylgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KEZPUk1BVF9QUkVGSVhfTEVOR1RIICsgcGF5bG9hZC5sZW5ndGgpO1xuICByZXN1bHQuc2V0KHByZWZpeEJ5dGVzLCAwKTtcbiAgcmVzdWx0LnNldChwYXlsb2FkLCBGT1JNQVRfUFJFRklYX0xFTkdUSCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgZm9ybWF0LXByZWZpeGVkIHBheWxvYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGb3JtYXRQcmVmaXgoZGF0YTogVWludDhBcnJheSB8IHVua25vd24pOiB7XG4gIGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdFR5cGU7XG4gIHBheWxvYWQ6IFVpbnQ4QXJyYXk7XG59IHtcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZDogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEubGVuZ3RoIDwgRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBmb3JtYXQgcHJlZml4OiBleHBlY3RlZCBhdCBsZWFzdCAke0ZPUk1BVF9QUkVGSVhfTEVOR1RIfSBieXRlcywgZ290ICR7ZGF0YS5sZW5ndGh9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwcmVmaXhCeXRlcyA9IGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICBjb25zdCBmb3JtYXQgPSBmb3JtYXREZWNvZGVyLmRlY29kZShwcmVmaXhCeXRlcyk7XG5cbiAgY29uc3Qga25vd25Gb3JtYXRzID0gT2JqZWN0LnZhbHVlcyhTZXJpYWxpemF0aW9uRm9ybWF0KSBhcyBzdHJpbmdbXTtcbiAgaWYgKCFrbm93bkZvcm1hdHMuaW5jbHVkZXMoZm9ybWF0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBVbmtub3duIHNlcmlhbGl6YXRpb24gZm9ybWF0OiBcIiR7Zm9ybWF0fVwiLiBLbm93biBmb3JtYXRzOiAke2tub3duRm9ybWF0cy5qb2luKCcsICcpfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcGF5bG9hZCA9IGRhdGEuc3ViYXJyYXkoRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICByZXR1cm4geyBmb3JtYXQ6IGZvcm1hdCBhcyBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSwgcGF5bG9hZCB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVuY3J5cHRlZCBkYXRhIGRldGVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUGxhY2Vob2xkZXIgc3RyaW5nIGRpc3BsYXllZCB3aGVuIGRhdGEgaXMgZW5jcnlwdGVkIGFuZCBkZWNyeXB0aW9uXG4gKiBoYXMgbm90IGJlZW4gcmVxdWVzdGVkLiBVc2VkIGJ5IGJvdGggQ0xJIGFuZCB3ZWIgbzExeS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVOQ1JZUFRFRF9QTEFDRUhPTERFUiA9ICdcXHV7MUY1MTJ9IEVuY3J5cHRlZCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhwaXJlZCBkYXRhIGRldGVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwbGFpbiBvYmplY3QgaXMgYHsgZXhwaXJlZEF0OiBcIjxJU08gZGF0ZT5cIiB9YCDigJQgYSBzaW5nbGUta2V5XG4gKiBvYmplY3Qgd2l0aCBhIHN0cmluZyBgZXhwaXJlZEF0YCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaXNFeHBpcmVkT2JqZWN0KGRhdGE6IHVua25vd24pOiBkYXRhIGlzIHsgZXhwaXJlZEF0OiBzdHJpbmcgfSB7XG4gIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgcmV0dXJuIChcbiAgICBrZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgIGtleXNbMF0gPT09ICdleHBpcmVkQXQnICYmXG4gICAgdHlwZW9mIChkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5leHBpcmVkQXQgPT09ICdzdHJpbmcnXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBoeWRyYXRlZCB2YWx1ZSBpcyBhbiBleHBpcmVkIGRhdGEgc3R1YiBmcm9tIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhlIHNlcnZlciByZXBsYWNlcyBleHBpcmVkIHJlZiBmaWVsZHMgd2l0aCBhIGRldmFsdWUtZW5jb2RlZCBzdHViXG4gKiAoYG1ha2VFeHBpcmVkU3R1YmApIHRoYXQgZGVzZXJpYWxpemVzIHRvIGBbeyBleHBpcmVkQXQ6IFwiPElTTyBkYXRlPlwiIH1dYFxuICogYWZ0ZXIgYHVuZmxhdHRlbmAgKGFycmF5LXdyYXBwZWQgZHVlIHRvIGJhY2t3YXJkcy1jb21wYXRpYmxlIGVuY29kaW5nKS5cbiAqIEFsc28gbWF0Y2hlcyB0aGUgdW53cmFwcGVkIGB7IGV4cGlyZWRBdDogXCIuLi5cIiB9YCBmb3JtIGZvciByb2J1c3RuZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHBpcmVkU3R1YihkYXRhOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIERpcmVjdCBvYmplY3QgZm9ybTogeyBleHBpcmVkQXQ6IFwiLi4uXCIgfVxuICBpZiAoaXNFeHBpcmVkT2JqZWN0KGRhdGEpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gQXJyYXktd3JhcHBlZCBmb3JtIGZyb20gZGV2YWx1ZSB1bmZsYXR0ZW46IFt7IGV4cGlyZWRBdDogXCIuLi5cIiB9XVxuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA9PT0gMSAmJiBpc0V4cGlyZWRPYmplY3QoZGF0YVswXSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBiaW5hcnkgdmFsdWUgaGFzIHRoZSAnZW5jcicgZm9ybWF0IHByZWZpeCBpbmRpY2F0aW5nIGVuY3J5cHRpb24uXG4gKiBCcm93c2VyLXNhZmUg4oCUIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgZnVsbCBzZXJpYWxpemF0aW9uIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW5jcnlwdGVkRGF0YShkYXRhOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBkYXRhLmxlbmd0aCA8IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHByZWZpeCA9IGZvcm1hdERlY29kZXIuZGVjb2RlKGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpKTtcbiAgcmV0dXJuIHByZWZpeCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmV2aXZlcnMgdHlwZSAoc2hhcmVkIGFjcm9zcyBhbGwgZW52aXJvbm1lbnRzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQSBtYXAgb2YgdHlwZSBuYW1lIOKGkiByZXZpdmVyIGZ1bmN0aW9uLCB1c2VkIGJ5IGRldmFsdWUncyBgcGFyc2VgL2B1bmZsYXR0ZW5gLlxuICogRWFjaCBlbnZpcm9ubWVudCAocnVudGltZSwgd2ViLCBDTEkpIHByb3ZpZGVzIGl0cyBvd24gc2V0LlxuICovXG5leHBvcnQgdHlwZSBSZXZpdmVycyA9IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEdlbmVyaWMgaHlkcmF0ZS9kZWh5ZHJhdGUgZGlzcGF0Y2hcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEh5ZHJhdGUgKGRlc2VyaWFsaXplKSBhIHZhbHVlIHRoYXQgd2FzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuXG4gKlxuICogSGFuZGxlcyBmb3VyIGRhdGEgc2hhcGVzOlxuICogMS4gYFVpbnQ4QXJyYXlgIHdpdGggJ2VuY3InIHByZWZpeCDihpIgcmV0dXJuZWQgYXMtaXMgKGVuY3J5cHRlZCwgbm90IHlldCBkZWNyeXB0ZWQpXG4gKiAyLiBgVWludDhBcnJheWAgd2l0aCBhIGZvcm1hdCBwcmVmaXggKHNwZWNWZXJzaW9uIDIrKSDihpIgZGVjb2RlIHByZWZpeCwgcGFyc2VcbiAqIDMuIGBBcnJheWAgKGxlZ2FjeSBzcGVjVmVyc2lvbiAxLCBcInJldml2ZWQgZGV2YWx1ZVwiKSDihpIgdW5mbGF0dGVuXG4gKiA0LiBPdGhlciAoYWxyZWFkeSBhIHBsYWluIEpTIHZhbHVlKSDihpIgcmV0dXJuIGFzLWlzXG4gKlxuICogRW5jcnlwdGVkIGRhdGEgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGFzIGEgYFVpbnQ4QXJyYXlgIHNvIHRoYXQgY29uc3VtZXJzXG4gKiAoQ0xJLCB3ZWIgVUkpIGNhbiBkZXRlY3QgaXQgd2l0aCBgaXNFbmNyeXB0ZWREYXRhKClgIGFuZCBkZWNpZGUgaG93IHRvXG4gKiBoYW5kbGUgaXQg4oCUIHRoZSBDTEkgcmVwbGFjZXMgaXQgd2l0aCBhIHN0eWxlZCBwbGFjZWhvbGRlciwgdGhlIHdlYiBVSVxuICogcmVuZGVycyBhbiBcIkVuY3J5cHRlZFwiIGNhcmQgd2l0aCBhIERlY3J5cHQgYnV0dG9uIHRoYXQgdHJpZ2dlcnNcbiAqIGNsaWVudC1zaWRlIGRlY3J5cHRpb24gb24gZGVtYW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZURhdGEodmFsdWU6IHVua25vd24sIHJldml2ZXJzOiBSZXZpdmVycyk6IHVua25vd24ge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgLy8gRW5jcnlwdGVkIGRhdGEgcGFzc2VzIHRocm91Z2ggdW50b3VjaGVkIOKAlCBvMTF5IGxheWVycyBkZXRlY3QgaXQgd2l0aFxuICAgIC8vIGlzRW5jcnlwdGVkRGF0YSgpIGFuZCBoYW5kbGUgZGlzcGxheSAod2ViOiBuYW1lZCBjb25zdHJ1Y3RvciBvYmplY3QsXG4gICAgLy8gQ0xJOiBFbmNyeXB0ZWREYXRhUmVmIHdpdGggdXRpbC5pbnNwZWN0LmN1c3RvbSkuXG4gICAgaWYgKGlzRW5jcnlwdGVkRGF0YSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGZvcm1hdCwgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KHZhbHVlKTtcbiAgICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkKTtcbiAgICAgIHJldHVybiBwYXJzZShzdHIsIHJldml2ZXJzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtmb3JtYXR9YCk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdW5mbGF0dGVuKHZhbHVlLCByZXZpdmVycyk7XG4gIH1cblxuICAvLyBBbHJlYWR5IGEgcGxhaW4gSlMgdmFsdWUgKGUuZy4sIG51bWJlciwgc3RyaW5nLCBudWxsKVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogSHlkcmF0ZSBhIHZhbHVlLCBkZWNyeXB0aW5nIGl0IGZpcnN0IGlmIGFuIGVuY3J5cHRpb24ga2V5IGlzIHByb3ZpZGVkLlxuICpcbiAqIFRoaXMgaXMgdGhlIGFzeW5jIHZlcnNpb24gb2YgYGh5ZHJhdGVEYXRhYCB0aGF0IHN1cHBvcnRzIHRyYW5zcGFyZW50XG4gKiBkZWNyeXB0aW9uLiBVc2VkIGJ5IG8xMXkgdG9vbGluZyAod2ViIFVJLCBDTEkpIHdoZW4gdGhlIHVzZXIgcmVxdWVzdHNcbiAqIGRlY3J5cHRpb24uXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGh5ZHJhdGUgKG1heSBiZSBlbmNyeXB0ZWQpXG4gKiBAcGFyYW0gcmV2aXZlcnMgLSBEZXZhbHVlIHJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb25cbiAqIEBwYXJhbSBrZXkgLSBBRVMtMjU2IGVuY3J5cHRpb24ga2V5IChpZiBwcm92aWRlZCwgZW5jcnlwdGVkIGRhdGEgd2lsbCBiZSBkZWNyeXB0ZWQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlRGF0YVdpdGhLZXkoXG4gIHZhbHVlOiB1bmtub3duLFxuICByZXZpdmVyczogUmV2aXZlcnMsXG4gIGtleTogaW1wb3J0KCcuL2VuY3J5cHRpb24uanMnKS5DcnlwdG9LZXkgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGlzRW5jcnlwdGVkRGF0YSh2YWx1ZSkgJiYga2V5KSB7XG4gICAgLy8gRGVjcnlwdDogc3RyaXAgJ2VuY3InIHByZWZpeCwgQUVTLUdDTSBkZWNyeXB0LCB0aGVuIGh5ZHJhdGUgdGhlIHJlc3VsdFxuICAgIGNvbnN0IHsgZGVjcnlwdCB9ID0gYXdhaXQgaW1wb3J0KCcuL2VuY3J5cHRpb24uanMnKTtcbiAgICBjb25zdCB7IHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeCh2YWx1ZSk7XG4gICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjcnlwdChrZXksIHBheWxvYWQpO1xuICAgIC8vIFRoZSBkZWNyeXB0ZWQgYnl0ZXMgaGF2ZSB0aGVpciBvd24gZm9ybWF0IHByZWZpeCAoZS5nLiwgJ2RldmwnKVxuICAgIHJldHVybiBoeWRyYXRlRGF0YShkZWNyeXB0ZWQsIHJldml2ZXJzKTtcbiAgfVxuICAvLyBObyBrZXkgb3Igbm90IGVuY3J5cHRlZCDigJQgZGVsZWdhdGUgdG8gc3luYyBoeWRyYXRlRGF0YVxuICByZXR1cm4gaHlkcmF0ZURhdGEodmFsdWUsIHJldml2ZXJzKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgbWFya2VyIHR5cGVzIGZvciBvMTF5IGRpc3BsYXlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBTVFJFQU1fSURfUFJFRklYID0gJ3N0cm1fJztcblxuLyoqIE1hcmtlciBmb3Igc3RyZWFtIHJlZmVyZW5jZSBvYmplY3RzIHJlbmRlcmVkIGFzIGxpbmtzIGluIHRoZSBVSSAqL1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3N0cmVhbV9yZWZfXyc7XG5cbi8qKiBBIHN0cmVhbSByZWZlcmVuY2UgZm9yIFVJIGRpc3BsYXkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgU1RSRUFNX1JFRl9UWVBFO1xuICBzdHJlYW1JZDogc3RyaW5nO1xufVxuXG4vKiogTWFya2VyIGZvciBSdW4gcmVmZXJlbmNlIG9iamVjdHMgcmVuZGVyZWQgYXMgbGlua3MgaW4gdGhlIFVJICovXG5leHBvcnQgY29uc3QgUlVOX1JFRl9UWVBFID0gJ19fd29ya2Zsb3dfcnVuX3JlZl9fJztcblxuLyoqIEEgUnVuIHJlZmVyZW5jZSBmb3IgVUkgZGlzcGxheSAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5SZWYge1xuICBfX3R5cGU6IHR5cGVvZiBSVU5fUkVGX1RZUEU7XG4gIHJ1bklkOiBzdHJpbmc7XG59XG5cbi8qKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgUnVuUmVmIG9iamVjdCAqL1xuZXhwb3J0IGNvbnN0IGlzUnVuUmVmID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuUmVmID0+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAnX190eXBlJyBpbiB2YWx1ZSAmJlxuICAgIHZhbHVlLl9fdHlwZSA9PT0gUlVOX1JFRl9UWVBFICYmXG4gICAgJ3J1bklkJyBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZS5ydW5JZCA9PT0gJ3N0cmluZydcbiAgKTtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBSdW4gdmFsdWUgdG8gYSBSdW5SZWYgZm9yIGRpc3BsYXkgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkUnVuVG9SdW5SZWYgPSAodmFsdWU6IHsgcnVuSWQ6IHN0cmluZyB9KTogUnVuUmVmID0+IHtcbiAgcmV0dXJuIHsgX190eXBlOiBSVU5fUkVGX1RZUEUsIHJ1bklkOiB2YWx1ZS5ydW5JZCB9O1xufTtcblxuLyoqIE1hcmtlciBmb3IgY3VzdG9tIGNsYXNzIGluc3RhbmNlIHJlZmVyZW5jZXMgKi9cbmV4cG9ydCBjb25zdCBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X2NsYXNzX2luc3RhbmNlX3JlZl9fJztcblxuLyoqXG4gKiBBIGNsYXNzIGluc3RhbmNlIHJlZmVyZW5jZSBmb3IgbzExeSBkaXNwbGF5LlxuICpcbiAqIEJyb3dzZXItc2FmZSBiYXNlIGNsYXNzIOKAlCBubyBgdXRpbC5pbnNwZWN0LmN1c3RvbWAuIEVudmlyb25tZW50LXNwZWNpZmljXG4gKiByZW5kZXJpbmcgKENMSSBpbnNwZWN0LCB3ZWIgY29tcG9uZW50KSBpcyBoYW5kbGVkIGJ5IGVhY2ggY29uc3VtZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGFzc0luc3RhbmNlUmVmIHtcbiAgcmVhZG9ubHkgX190eXBlID0gQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBjbGFzc0lkOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGE6IHVua25vd25cbiAgKSB7fVxuXG4gIHRvSlNPTigpOiB7XG4gICAgX190eXBlOiBzdHJpbmc7XG4gICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgY2xhc3NJZDogc3RyaW5nO1xuICAgIGRhdGE6IHVua25vd247XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6IHRoaXMuX190eXBlLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIGNsYXNzSWQ6IHRoaXMuY2xhc3NJZCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgQ2xhc3NJbnN0YW5jZVJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc0NsYXNzSW5zdGFuY2VSZWYgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBDbGFzc0luc3RhbmNlUmVmID0+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIENsYXNzSW5zdGFuY2VSZWYgfHxcbiAgICAodmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdfX3R5cGUnIGluIHZhbHVlICYmXG4gICAgICB2YWx1ZS5fX3R5cGUgPT09IENMQVNTX0lOU1RBTkNFX1JFRl9UWVBFICYmXG4gICAgICAnY2xhc3NOYW1lJyBpbiB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycpXG4gICk7XG59O1xuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmVhbSBJRCBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBpc1N0cmVhbUlkID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoU1RSRUFNX0lEX1BSRUZJWCk7XG59O1xuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc1N0cmVhbVJlZiA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFN0cmVhbVJlZiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICB2YWx1ZS5fX3R5cGUgPT09IFNUUkVBTV9SRUZfVFlQRSAmJlxuICAgICdzdHJlYW1JZCcgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUuc3RyZWFtSWQgPT09ICdzdHJpbmcnXG4gICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNoYXJlZCBvMTF5IHJldml2ZXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29udmVydCBhIHNlcmlhbGl6ZWQgc3RyZWFtIHZhbHVlIHRvIGEgU3RyZWFtUmVmIGZvciBkaXNwbGF5LlxuICovXG5leHBvcnQgY29uc3Qgc3RyZWFtVG9TdHJlYW1SZWYgPSAodmFsdWU6IGFueSk6IFN0cmVhbVJlZiA9PiB7XG4gIGxldCBzdHJlYW1JZDogc3RyaW5nO1xuICBpZiAoJ25hbWUnIGluIHZhbHVlKSB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyh2YWx1ZS5uYW1lKTtcbiAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aChTVFJFQU1fSURfUFJFRklYKSkge1xuICAgICAgc3RyZWFtSWQgPSBgJHtTVFJFQU1fSURfUFJFRklYfSR7bmFtZX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW1JZCA9IG5hbWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0cmVhbUlkID0gYCR7U1RSRUFNX0lEX1BSRUZJWH1udWxsYDtcbiAgfVxuICByZXR1cm4geyBfX3R5cGU6IFNUUkVBTV9SRUZfVFlQRSwgc3RyZWFtSWQgfTtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBzdGVwIGZ1bmN0aW9uIHRvIGEgZGlzcGxheSBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkU3RlcEZ1bmN0aW9uVG9TdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gJ251bGwnO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuICdudWxsJztcbiAgaWYgKCdzdGVwSWQnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIGA8c3RlcDokeyh2YWx1ZSBhcyB7IHN0ZXBJZDogc3RyaW5nIH0pLnN0ZXBJZH0+YDtcbiAgfVxuICByZXR1cm4gJzxmdW5jdGlvbj4nO1xufTtcblxuLyoqIEV4dHJhY3QgdGhlIGNsYXNzIG5hbWUgZnJvbSBhIGNsYXNzSWQgKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0Q2xhc3NOYW1lID0gKGNsYXNzSWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghY2xhc3NJZCkgcmV0dXJuICdVbmtub3duJztcbiAgY29uc3QgcGFydHMgPSBjbGFzc0lkLnNwbGl0KCcvJyk7XG4gIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSB8fCBjbGFzc0lkO1xufTtcblxuLyoqIENvbnZlcnQgYSBzZXJpYWxpemVkIGNsYXNzIGluc3RhbmNlIHRvIGEgQ2xhc3NJbnN0YW5jZVJlZiBmb3IgZGlzcGxheS5cbiAqICBSdW4gaW5zdGFuY2VzIGFyZSBzcGVjaWFsLWNhc2VkIHRvIGEgUnVuUmVmIGZvciBjbGlja2FibGUgcmVuZGVyaW5nLiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmID0gKHZhbHVlOiB7XG4gIGNsYXNzSWQ6IHN0cmluZztcbiAgZGF0YTogdW5rbm93bjtcbn0pOiBDbGFzc0luc3RhbmNlUmVmIHwgUnVuUmVmID0+IHtcbiAgY29uc3QgY2xhc3NOYW1lID0gZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKTtcbiAgaWYgKFxuICAgIGNsYXNzTmFtZSA9PT0gJ1J1bicgJiZcbiAgICB2YWx1ZS5kYXRhICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlLmRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgJ3J1bklkJyBpbiB2YWx1ZS5kYXRhICYmXG4gICAgdHlwZW9mICh2YWx1ZS5kYXRhIGFzIHsgcnVuSWQ6IHVua25vd24gfSkucnVuSWQgPT09ICdzdHJpbmcnXG4gICkge1xuICAgIHJldHVybiBzZXJpYWxpemVkUnVuVG9SdW5SZWYodmFsdWUuZGF0YSBhcyB7IHJ1bklkOiBzdHJpbmcgfSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBDbGFzc0luc3RhbmNlUmVmKGNsYXNzTmFtZSwgdmFsdWUuY2xhc3NJZCwgdmFsdWUuZGF0YSk7XG59O1xuXG4vKiogQ29udmVydCBhIHNlcmlhbGl6ZWQgY2xhc3MgcmVmZXJlbmNlIHRvIGEgZGlzcGxheSBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkQ2xhc3NUb1N0cmluZyA9ICh2YWx1ZTogeyBjbGFzc0lkOiBzdHJpbmcgfSk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBgPGNsYXNzOiR7ZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKX0+YDtcbn07XG5cbi8qKlxuICogU3RhbmRhcmQgbzExeSByZXZpdmVycyB0aGF0IG92ZXJyaWRlIHJ1bnRpbWUtc3BlY2lmaWMgdHlwZXMgd2l0aFxuICogZGlzcGxheS1mcmllbmRseSB2YWx1ZXMuIFVzZWQgYnkgYm90aCB3ZWIgYW5kIENMSSBoeWRyYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBvYnNlcnZhYmlsaXR5UmV2aXZlcnM6IFJldml2ZXJzID0ge1xuICBSZWFkYWJsZVN0cmVhbTogc3RyZWFtVG9TdHJlYW1SZWYsXG4gIFdyaXRhYmxlU3RyZWFtOiBzdHJlYW1Ub1N0cmVhbVJlZixcbiAgVHJhbnNmb3JtU3RyZWFtOiBzdHJlYW1Ub1N0cmVhbVJlZixcbiAgQWJvcnRDb250cm9sbGVyOiAodmFsdWU6IGFueSkgPT5cbiAgICBgPEFib3J0Q29udHJvbGxlcihhYm9ydGVkOiAke3ZhbHVlLmFib3J0ZWR9KT5gLFxuICBBYm9ydFNpZ25hbDogKHZhbHVlOiBhbnkpID0+IGA8QWJvcnRTaWduYWwoYWJvcnRlZDogJHt2YWx1ZS5hYm9ydGVkfSk+YCxcbiAgLy8gRE9NRXhjZXB0aW9uIG5lZWRzIGFuIGV4cGxpY2l0IHJldml2ZXI6IHdpdGhvdXQgb25lLCBkZXZhbHVlLnBhcnNlXG4gIC8vIHRocm93cyBvbiB0aGUgYFtcIkRPTUV4Y2VwdGlvblwiLCAuLi5dYCB0YWcgYW5kIGBoeWRyYXRlU3RlcElPYCdzXG4gIC8vIHRyeS9jYXRjaCBsZWF2ZXMgdGhlIHJhdyBmbGF0LWVuY29kZWQgc3RyaW5nIGluIHRoZSBVSS4gQWJvcnRDb250cm9sbGVyXG4gIC8vIHN5bnRoZXNpemVzIGEgRE9NRXhjZXB0aW9uIGFzIHRoZSBkZWZhdWx0IGBzaWduYWwucmVhc29uYCB3aGVuIGFib3J0KClcbiAgLy8gaXMgY2FsbGVkIHdpdGggbm8gYXJnIOKAlCBzbyBhbnkgYWJvcnQgdGhhdCByb3VuZC10cmlwcyB0aHJvdWdoIGEgc3RlcFxuICAvLyBib3VuZGFyeSBzdXJmYWNlcyBoZXJlLiBSZWNvbnN0cnVjdCBhcyBhIHJlYWwgRE9NRXhjZXB0aW9uIHdoZW4gdGhlXG4gIC8vIGdsb2JhbCBpcyBhdmFpbGFibGUgKG1vZGVybiBicm93c2VycyArIE5vZGUgMTgrKSwgZWxzZSBmYWxsIGJhY2sgdG9cbiAgLy8gYW4gRXJyb3IgcHJlc2VydmluZyBuYW1lL21lc3NhZ2Uvc3RhY2svY2F1c2UgZm9yIGRpc3BsYXkuXG4gIERPTUV4Y2VwdGlvbjogKHZhbHVlOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzdGFjaz86IHN0cmluZztcbiAgICBjYXVzZT86IHVua25vd247XG4gIH0pID0+IHtcbiAgICBjb25zdCBHID0gZ2xvYmFsVGhpcyBhcyB7IERPTUV4Y2VwdGlvbj86IHR5cGVvZiBET01FeGNlcHRpb24gfTtcbiAgICBpZiAodHlwZW9mIEcuRE9NRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBlID0gbmV3IEcuRE9NRXhjZXB0aW9uKHZhbHVlLm1lc3NhZ2UsIHZhbHVlLm5hbWUpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGUuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIGNvbnN0IGU6IEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfSA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICBlLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGUuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICByZXR1cm4gZTtcbiAgfSxcbiAgU3RlcEZ1bmN0aW9uOiBzZXJpYWxpemVkU3RlcEZ1bmN0aW9uVG9TdHJpbmcsXG4gIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZTogeyB3b3JrZmxvd0lkOiBzdHJpbmcgfSkgPT5cbiAgICBgPHdvcmtmbG93OiR7dmFsdWUud29ya2Zsb3dJZH0+YCxcbiAgSW5zdGFuY2U6IHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmLFxuICBDbGFzczogc2VyaWFsaXplZENsYXNzVG9TdHJpbmcsXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlc291cmNlLWxldmVsIGh5ZHJhdGlvbiBkaXNwYXRjaCAoZm9yIG8xMXkpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBkYXRhIGZpZWxkcyBvZiBhIHN0ZXAgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVTdGVwSU88XG4gIFQgZXh0ZW5kcyB7IHN0ZXBJZD86IHN0cmluZzsgaW5wdXQ/OiBhbnk7IG91dHB1dD86IGFueTsgZXJyb3I/OiBhbnkgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBsZXQgaHlkcmF0ZWRJbnB1dCA9IHJlc291cmNlLmlucHV0O1xuICBsZXQgaHlkcmF0ZWRPdXRwdXQgPSByZXNvdXJjZS5vdXRwdXQ7XG4gIGxldCBoeWRyYXRlZEVycm9yID0gcmVzb3VyY2UuZXJyb3I7XG5cbiAgaWYgKHJlc291cmNlLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRJbnB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvdXJjZS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZE91dHB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYGVycm9yYCBmaWVsZCBpcyBgU2VyaWFsaXplZERhdGFgIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAvLyBgZGVoeWRyYXRlU3RlcEVycm9yYC4gSHlkcmF0ZSBpdCBzbyBvYnNlcnZhYmlsaXR5IHRvb2xzIChDTEksIHdlYiBVSSlcbiAgLy8gY2FuIHJlYWQgYHN0ZXAuZXJyb3IubWVzc2FnZWAsIGBzdGVwLmVycm9yLnN0YWNrYCwgZXRjLlxuICBpZiAocmVzb3VyY2UuZXJyb3IgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZEVycm9yID0gaHlkcmF0ZURhdGEocmVzb3VyY2UuZXJyb3IsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBpbnB1dDogaHlkcmF0ZWRJbnB1dCxcbiAgICBvdXRwdXQ6IGh5ZHJhdGVkT3V0cHV0LFxuICAgIGVycm9yOiBoeWRyYXRlZEVycm9yLFxuICB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIGRhdGEgZmllbGRzIG9mIGEgd29ya2Zsb3cgcnVuIHJlc291cmNlLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlV29ya2Zsb3dJTzxcbiAgVCBleHRlbmRzIHsgaW5wdXQ/OiBhbnk7IG91dHB1dD86IGFueTsgZXJyb3I/OiBhbnkgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBsZXQgaHlkcmF0ZWRJbnB1dCA9IHJlc291cmNlLmlucHV0O1xuICBsZXQgaHlkcmF0ZWRPdXRwdXQgPSByZXNvdXJjZS5vdXRwdXQ7XG4gIGxldCBoeWRyYXRlZEVycm9yID0gcmVzb3VyY2UuZXJyb3I7XG5cbiAgaWYgKHJlc291cmNlLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRJbnB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvdXJjZS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZE91dHB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYGVycm9yYCBmaWVsZCBpcyBgU2VyaWFsaXplZERhdGFgIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAvLyBgZGVoeWRyYXRlUnVuRXJyb3JgLiBIeWRyYXRlIGl0IHNvIG9ic2VydmFiaWxpdHkgdG9vbHMgKENMSSwgd2ViIFVJKVxuICAvLyBjYW4gcmVhZCBgcnVuLmVycm9yLm1lc3NhZ2VgLCBgcnVuLmVycm9yLnN0YWNrYCwgZXRjLlxuICBpZiAocmVzb3VyY2UuZXJyb3IgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZEVycm9yID0gaHlkcmF0ZURhdGEocmVzb3VyY2UuZXJyb3IsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBpbnB1dDogaHlkcmF0ZWRJbnB1dCxcbiAgICBvdXRwdXQ6IGh5ZHJhdGVkT3V0cHV0LFxuICAgIGVycm9yOiBoeWRyYXRlZEVycm9yLFxuICB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIGV2ZW50RGF0YSBmaWVsZHMgb2YgYW4gZXZlbnQgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVFdmVudERhdGE8VCBleHRlbmRzIHsgZXZlbnRJZD86IHN0cmluZzsgZXZlbnREYXRhPzogYW55IH0+KFxuICByZXNvdXJjZTogVCxcbiAgcmV2aXZlcnM6IFJldml2ZXJzXG4pOiBUIHtcbiAgaWYgKCFyZXNvdXJjZS5ldmVudERhdGEpIHJldHVybiByZXNvdXJjZTtcblxuICBjb25zdCBldmVudERhdGEgPSB7IC4uLnJlc291cmNlLmV2ZW50RGF0YSB9O1xuXG4gIC8vIHN0ZXBfY29tcGxldGVkIGV2ZW50cyBoYXZlIGV2ZW50RGF0YS5yZXN1bHQgKHNlcmlhbGl6ZWQgcmV0dXJuIHZhbHVlKVxuICBpZiAoJ3Jlc3VsdCcgaW4gZXZlbnREYXRhICYmIGV2ZW50RGF0YS5yZXN1bHQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBldmVudERhdGEucmVzdWx0ID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLnJlc3VsdCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnRzIGhhdmUgZXZlbnREYXRhLmlucHV0IChzZXJpYWxpemVkIHN0ZXAgYXJndW1lbnRzKVxuICBpZiAoJ2lucHV0JyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhLmlucHV0ID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIC8vIHJ1bl9jb21wbGV0ZWQgZXZlbnRzIGhhdmUgZXZlbnREYXRhLm91dHB1dCAoc2VyaWFsaXplZCByZXR1cm4gdmFsdWUpXG4gIGlmICgnb3V0cHV0JyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLm91dHB1dCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV2ZW50RGF0YS5vdXRwdXQgPSBoeWRyYXRlRGF0YShldmVudERhdGEub3V0cHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIC8vIGhvb2tfY3JlYXRlZCBldmVudHMgbWF5IGhhdmUgc2VyaWFsaXplZCBtZXRhZGF0YVxuICBpZiAoJ21ldGFkYXRhJyBpbiBldmVudERhdGEgJiYgZXZlbnREYXRhLm1ldGFkYXRhICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhLm1ldGFkYXRhID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLm1ldGFkYXRhLCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIC8vIGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGhhdmUgZXZlbnREYXRhLnBheWxvYWQgKHNlcmlhbGl6ZWQgaG9vayBwYXlsb2FkKVxuICBpZiAoJ3BheWxvYWQnIGluIGV2ZW50RGF0YSAmJiBldmVudERhdGEucGF5bG9hZCAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV2ZW50RGF0YS5wYXlsb2FkID0gaHlkcmF0ZURhdGEoZXZlbnREYXRhLnBheWxvYWQsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgLy8gc3RlcF9mYWlsZWQgLyBzdGVwX3JldHJ5aW5nIC8gcnVuX2ZhaWxlZCBldmVudHMgaGF2ZSBldmVudERhdGEuZXJyb3JcbiAgLy8gKHRoZSB0aHJvd24gdmFsdWUsIHNlcmlhbGl6ZWQgdmlhIHRoZSBlcnJvciBwaXBlbGluZSkuIFdpdGhvdXQgdGhpcyxcbiAgLy8gZXZlbnQgbGlzdGluZ3MgaW4gbzExeSB0b29saW5nIHdvdWxkIHN1cmZhY2UgdGhlIHJhdyBgVWludDhBcnJheWBcbiAgLy8gcGF5bG9hZCBpbnN0ZWFkIG9mIGEgaHlkcmF0ZWQgYHsgbmFtZSwgbWVzc2FnZSwgc3RhY2ssIOKApiB9YCBvYmplY3QuXG4gIGlmICgnZXJyb3InIGluIGV2ZW50RGF0YSAmJiBldmVudERhdGEuZXJyb3IgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBldmVudERhdGEuZXJyb3IgPSBoeWRyYXRlRGF0YShldmVudERhdGEuZXJyb3IsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIGV2ZW50RGF0YSB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIG1ldGFkYXRhIGZpZWxkIG9mIGEgaG9vayByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZUhvb2tNZXRhZGF0YTxUIGV4dGVuZHMgeyBob29rSWQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55IH0+KFxuICByZXNvdXJjZTogVCxcbiAgcmV2aXZlcnM6IFJldml2ZXJzXG4pOiBUIHtcbiAgaWYgKHJlc291cmNlLm1ldGFkYXRhID09IG51bGwpIHJldHVybiByZXNvdXJjZTtcblxuICBsZXQgaHlkcmF0ZWRNZXRhZGF0YSA9IHJlc291cmNlLm1ldGFkYXRhO1xuICB0cnkge1xuICAgIGh5ZHJhdGVkTWV0YWRhdGEgPSBoeWRyYXRlRGF0YShyZXNvdXJjZS5tZXRhZGF0YSwgcmV2aXZlcnMpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIG1ldGFkYXRhOiBoeWRyYXRlZE1ldGFkYXRhIH07XG59XG5cbi8qKlxuICogSHlkcmF0ZSB0aGUgc2VyaWFsaXplZCBkYXRhIGZpZWxkcyBvZiBhbnkgcmVzb3VyY2UgZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBEaXNwYXRjaGVzIGJ5IHJlc291cmNlIHR5cGUgKHN0ZXAsIGhvb2ssIGV2ZW50LCB3b3JrZmxvdykgYW5kIGNhbGxzXG4gKiBgaHlkcmF0ZURhdGFgIHdpdGggdGhlIHByb3ZpZGVkIHJldml2ZXJzIGZvciBlYWNoIGRhdGEgZmllbGQuXG4gKlxuICogRWFjaCBlbnZpcm9ubWVudCAod2ViLCBDTEkpIHByb3ZpZGVzIGl0cyBvd24gcmV2aXZlcnMg4oCUIHRoaXMgZnVuY3Rpb25cbiAqIG9ubHkgaGFuZGxlcyB0aGUgZGlzcGF0Y2ggbG9naWMgYW5kIGZpZWxkIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJTzxcbiAgVCBleHRlbmRzIHtcbiAgICBzdGVwSWQ/OiBzdHJpbmc7XG4gICAgaG9va0lkPzogc3RyaW5nO1xuICAgIGV2ZW50SWQ/OiBzdHJpbmc7XG4gICAgaW5wdXQ/OiBhbnk7XG4gICAgb3V0cHV0PzogYW55O1xuICAgIG1ldGFkYXRhPzogYW55O1xuICAgIGV2ZW50RGF0YT86IGFueTtcbiAgICBleGVjdXRpb25Db250ZXh0PzogYW55O1xuICB9LFxuPihyZXNvdXJjZTogVCwgcmV2aXZlcnM6IFJldml2ZXJzKTogVCB7XG4gIGlmICghcmVzb3VyY2UpIHJldHVybiByZXNvdXJjZTtcblxuICBsZXQgaHlkcmF0ZWQ6IFQ7XG4gIGlmICgnc3RlcElkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZVN0ZXBJTyhyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2UgaWYgKCdob29rSWQnIGluIHJlc291cmNlKSB7XG4gICAgaHlkcmF0ZWQgPSBoeWRyYXRlSG9va01ldGFkYXRhKHJlc291cmNlLCByZXZpdmVycyk7XG4gIH0gZWxzZSBpZiAoJ2V2ZW50SWQnIGluIHJlc291cmNlKSB7XG4gICAgaHlkcmF0ZWQgPSBoeWRyYXRlRXZlbnREYXRhKHJlc291cmNlLCByZXZpdmVycyk7XG4gIH0gZWxzZSB7XG4gICAgaHlkcmF0ZWQgPSBoeWRyYXRlV29ya2Zsb3dJTyhyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9XG5cbiAgLy8gU3RyaXAgZXhlY3V0aW9uQ29udGV4dCwgcHJlc2VydmluZyBvbmx5IHdvcmtmbG93Q29yZVZlcnNpb24gZm9yIGRpc3BsYXlcbiAgaWYgKCdleGVjdXRpb25Db250ZXh0JyBpbiBoeWRyYXRlZCkge1xuICAgIGNvbnN0IHsgZXhlY3V0aW9uQ29udGV4dCwgLi4ucmVzdCB9ID0gaHlkcmF0ZWQ7XG4gICAgY29uc3Qgd29ya2Zsb3dDb3JlVmVyc2lvbiA9XG4gICAgICBleGVjdXRpb25Db250ZXh0ICYmXG4gICAgICB0eXBlb2YgZXhlY3V0aW9uQ29udGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICd3b3JrZmxvd0NvcmVWZXJzaW9uJyBpbiBleGVjdXRpb25Db250ZXh0XG4gICAgICAgID8gZXhlY3V0aW9uQ29udGV4dC53b3JrZmxvd0NvcmVWZXJzaW9uXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICh3b3JrZmxvd0NvcmVWZXJzaW9uKSB7XG4gICAgICByZXR1cm4geyAuLi5yZXN0LCB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gYXMgdW5rbm93biBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdCBhcyBUO1xuICB9XG5cbiAgcmV0dXJuIGh5ZHJhdGVkO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFV0aWxpdHkgZnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEV4dHJhY3QgYWxsIHN0cmVhbSBJRHMgZnJvbSBhIHZhbHVlIChyZWN1cnNpdmVseSB0cmF2ZXJzZXMgb2JqZWN0cy9hcnJheXMpICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFN0cmVhbUlkcyhvYmo6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHN0cmVhbUlkczogc3RyaW5nW10gPSBbXTtcblxuICBmdW5jdGlvbiB0cmF2ZXJzZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmIChpc1N0cmVhbUlkKHZhbHVlKSkge1xuICAgICAgc3RyZWFtSWRzLnB1c2godmFsdWUgYXMgc3RyaW5nKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgdHJhdmVyc2UoaXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgICAgICB0cmF2ZXJzZSh2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyYXZlcnNlKG9iaik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoc3RyZWFtSWRzKSk7XG59XG5cbi8qKiBUcnVuY2F0ZSBhIHN0cmluZyB0byBhIG1heGltdW0gbGVuZ3RoLCBhZGRpbmcgZWxsaXBzaXMgaWYgbmVlZGVkICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVJZChpZDogc3RyaW5nLCBtYXhMZW5ndGggPSAxMik6IHN0cmluZyB7XG4gIGlmIChpZC5sZW5ndGggPD0gbWF4TGVuZ3RoKSByZXR1cm4gaWQ7XG4gIHJldHVybiBgJHtpZC5zbGljZSgwLCBtYXhMZW5ndGgpfS4uLmA7XG59XG4iXX0=
|