footprintjs 4.12.2 → 4.13.0
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/CLAUDE.md +111 -0
- package/README.md +29 -1
- package/dist/esm/index.js +16 -3
- package/dist/esm/lib/engine/graph/StageNode.js +2 -3
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +29 -1
- package/dist/esm/lib/engine/handlers/types.js +1 -1
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +176 -41
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +8 -3
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +60 -36
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +6 -3
- package/dist/esm/lib/reactive/types.js +2 -1
- package/dist/esm/lib/recorder/CombinedRecorder.js +211 -0
- package/dist/esm/lib/recorder/EmitRecorder.js +62 -0
- package/dist/esm/lib/recorder/index.js +2 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +123 -1
- package/dist/esm/lib/scope/ScopeFacade.js +117 -1
- package/dist/esm/lib/scope/detectCircular.js +74 -5
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/recorders.js +1 -1
- package/dist/index.js +50 -32
- package/dist/lib/engine/graph/StageNode.js +2 -3
- package/dist/lib/engine/handlers/SubflowExecutor.js +29 -1
- package/dist/lib/engine/handlers/types.js +1 -1
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +176 -41
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +8 -3
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +60 -36
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +6 -3
- package/dist/lib/reactive/types.js +2 -1
- package/dist/lib/recorder/CombinedRecorder.js +218 -0
- package/dist/lib/recorder/EmitRecorder.js +63 -0
- package/dist/lib/recorder/index.js +7 -2
- package/dist/lib/runner/FlowChartExecutor.js +123 -1
- package/dist/lib/scope/ScopeFacade.js +117 -1
- package/dist/lib/scope/detectCircular.js +74 -5
- package/dist/lib/scope/types.js +1 -1
- package/dist/recorders.js +1 -1
- package/dist/types/index.d.ts +36 -2
- package/dist/types/lib/engine/graph/StageNode.d.ts +3 -7
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +2 -3
- package/dist/types/lib/engine/handlers/types.d.ts +19 -3
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +38 -17
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +1 -1
- package/dist/types/lib/engine/narrative/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +70 -6
- package/dist/types/lib/engine/narrative/types.d.ts +24 -2
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +18 -0
- package/dist/types/lib/engine/types.d.ts +66 -0
- package/dist/types/lib/reactive/types.d.ts +61 -3
- package/dist/types/lib/recorder/CombinedRecorder.d.ts +173 -0
- package/dist/types/lib/recorder/EmitRecorder.d.ts +135 -0
- package/dist/types/lib/recorder/index.d.ts +3 -0
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +85 -0
- package/dist/types/lib/scope/ScopeFacade.d.ts +40 -0
- package/dist/types/lib/scope/detectCircular.d.ts +30 -3
- package/dist/types/lib/scope/types.d.ts +21 -0
- package/dist/types/recorders.d.ts +3 -2
- package/package.json +1 -2
|
@@ -23,6 +23,8 @@ import { buildRuntimeStageId } from '../engine/runtimeStageId.js';
|
|
|
23
23
|
import { FlowchartTraverser } from '../engine/traversal/FlowchartTraverser.js';
|
|
24
24
|
import { defaultLogger, } from '../engine/types.js';
|
|
25
25
|
import { isPauseSignal } from '../pause/types.js';
|
|
26
|
+
import { hasEmitRecorderMethods, hasFlowRecorderMethods, hasRecorderMethods } from '../recorder/CombinedRecorder.js';
|
|
27
|
+
import { isDevMode } from '../scope/detectCircular.js';
|
|
26
28
|
import { ScopeFacade } from '../scope/ScopeFacade.js';
|
|
27
29
|
import { ExecutionRuntime } from './ExecutionRuntime.js';
|
|
28
30
|
import { validateInput } from './validateInput.js';
|
|
@@ -488,6 +490,126 @@ export class FlowChartExecutor {
|
|
|
488
490
|
getFlowRecorders() {
|
|
489
491
|
return [...this.flowRecorders];
|
|
490
492
|
}
|
|
493
|
+
// ─── Combined Recorder Management ───
|
|
494
|
+
/**
|
|
495
|
+
* Attach a recorder that may observe multiple event streams (scope
|
|
496
|
+
* data-flow, control-flow, or both). Detects at runtime which streams the
|
|
497
|
+
* recorder has methods for and routes it to the correct internal channels.
|
|
498
|
+
*
|
|
499
|
+
* Preferred over calling `attachRecorder` and `attachFlowRecorder`
|
|
500
|
+
* separately, because forgetting one of the two is a silent foot-gun —
|
|
501
|
+
* half your events never fire and there is no runtime warning. With
|
|
502
|
+
* `attachCombinedRecorder` the library guarantees the recorder's declared
|
|
503
|
+
* methods all fire, and adds no overhead versus two explicit calls.
|
|
504
|
+
*
|
|
505
|
+
* ## Idempotency
|
|
506
|
+
*
|
|
507
|
+
* Idempotent by `id` across ALL channels — re-attaching with the same `id`
|
|
508
|
+
* replaces the previous instance everywhere it was registered. Mixing
|
|
509
|
+
* `attachCombinedRecorder(x)` with a prior `attachRecorder(y)` or
|
|
510
|
+
* `attachFlowRecorder(y)` that share `x.id === y.id` is also safe: the
|
|
511
|
+
* combined attach replaces the single-channel registration on whichever
|
|
512
|
+
* channel(s) `x` has methods for. No duplicate firings occur.
|
|
513
|
+
*
|
|
514
|
+
* ## Narrative activation
|
|
515
|
+
*
|
|
516
|
+
* If the recorder has any control-flow methods, `enableNarrative()` is
|
|
517
|
+
* called as a side effect (the narrative subsystem is required to emit
|
|
518
|
+
* control-flow events). Data-flow-only recorders do NOT activate the
|
|
519
|
+
* narrative.
|
|
520
|
+
*
|
|
521
|
+
* ## Detection rule
|
|
522
|
+
*
|
|
523
|
+
* Only **own** event methods count (see `hasRecorderMethods`). Methods
|
|
524
|
+
* inherited via the prototype chain are ignored — this protects against
|
|
525
|
+
* accidental `Object.prototype` pollution attaching handlers you never
|
|
526
|
+
* declared. A recorder that provides only `clear`/`toSnapshot` is a
|
|
527
|
+
* no-op and emits a dev-mode warning to surface the likely mistake.
|
|
528
|
+
*
|
|
529
|
+
* @example
|
|
530
|
+
* ```typescript
|
|
531
|
+
* const audit: CombinedRecorder = {
|
|
532
|
+
* id: 'audit',
|
|
533
|
+
* onWrite: (e) => log('scope write', e.key),
|
|
534
|
+
* onDecision: (e) => log('routed to', e.chosen),
|
|
535
|
+
* };
|
|
536
|
+
* executor.attachCombinedRecorder(audit);
|
|
537
|
+
* ```
|
|
538
|
+
*/
|
|
539
|
+
attachCombinedRecorder(recorder) {
|
|
540
|
+
const hasData = hasRecorderMethods(recorder);
|
|
541
|
+
const hasFlow = hasFlowRecorderMethods(recorder);
|
|
542
|
+
const hasEmit = hasEmitRecorderMethods(recorder);
|
|
543
|
+
// Emit recorders live on the SAME channel as data-flow recorders
|
|
544
|
+
// (ScopeFacade iterates `_recorders` for onEmit dispatch). So
|
|
545
|
+
// attachEmitRecorder internally calls attachRecorder — but we want to
|
|
546
|
+
// avoid double-attach when the recorder implements BOTH onEmit AND
|
|
547
|
+
// other Recorder methods. Short-circuit: if hasData OR hasEmit, the
|
|
548
|
+
// recorder lands on the scope-recorder list exactly once.
|
|
549
|
+
if (hasData || hasEmit)
|
|
550
|
+
this.attachRecorder(recorder);
|
|
551
|
+
if (hasFlow)
|
|
552
|
+
this.attachFlowRecorder(recorder);
|
|
553
|
+
if (!hasData && !hasFlow && !hasEmit && isDevMode()) {
|
|
554
|
+
// Dev-mode only: silent skips are invisible and produce hard-to-debug
|
|
555
|
+
// "why didn't my recorder fire" reports. Per library convention, gated
|
|
556
|
+
// on the central isDevMode() flag (not process.env) so consumers can
|
|
557
|
+
// control dev tooling centrally via enableDevMode()/disableDevMode().
|
|
558
|
+
// eslint-disable-next-line no-console
|
|
559
|
+
console.warn(`[footprintjs] attachCombinedRecorder: recorder '${recorder.id}' has ` +
|
|
560
|
+
'no observer event methods — nothing to attach. Did you forget to ' +
|
|
561
|
+
'add an on* handler (onWrite, onDecision, onSubflowEntry, ...)? ' +
|
|
562
|
+
'Note: only OWN properties count; methods on the prototype chain ' +
|
|
563
|
+
'are ignored on purpose.');
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Detach a combined recorder from all channels it was attached to.
|
|
568
|
+
* Safe to call if the recorder was only on one channel or never attached.
|
|
569
|
+
*/
|
|
570
|
+
detachCombinedRecorder(id) {
|
|
571
|
+
this.detachRecorder(id);
|
|
572
|
+
this.detachFlowRecorder(id);
|
|
573
|
+
}
|
|
574
|
+
// ─── Emit Recorder Management (Phase 3) ───
|
|
575
|
+
/**
|
|
576
|
+
* Attach an `EmitRecorder` — an observer for consumer-emitted structured
|
|
577
|
+
* events fired via `scope.$emit(name, payload)`.
|
|
578
|
+
*
|
|
579
|
+
* Internally, emit recorders share the scope-recorder channel because
|
|
580
|
+
* emit events fire from inside `ScopeFacade` during stage execution,
|
|
581
|
+
* same timing as `onRead`/`onWrite`. This method is a convenience that
|
|
582
|
+
* delegates to `attachRecorder` — consumers can also use
|
|
583
|
+
* `attachRecorder` directly for a recorder that implements BOTH
|
|
584
|
+
* `onWrite` and `onEmit`. Either approach places the recorder on the
|
|
585
|
+
* same underlying list, so `onEmit` fires exactly once per event.
|
|
586
|
+
*
|
|
587
|
+
* **Idempotent by `id`:** replaces existing recorder with same `id`.
|
|
588
|
+
*
|
|
589
|
+
* @example
|
|
590
|
+
* ```typescript
|
|
591
|
+
* executor.attachEmitRecorder({
|
|
592
|
+
* id: 'token-meter',
|
|
593
|
+
* onEmit: (e) => {
|
|
594
|
+
* if (e.name === 'agentfootprint.llm.tokens') trackTokens(e.payload);
|
|
595
|
+
* },
|
|
596
|
+
* });
|
|
597
|
+
* ```
|
|
598
|
+
*/
|
|
599
|
+
attachEmitRecorder(recorder) {
|
|
600
|
+
this.attachRecorder(recorder);
|
|
601
|
+
}
|
|
602
|
+
/** Detach an `EmitRecorder` by id. Safe to call if never attached. */
|
|
603
|
+
detachEmitRecorder(id) {
|
|
604
|
+
this.detachRecorder(id);
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Returns a defensive copy of attached recorders filtered to those that
|
|
608
|
+
* implement `onEmit`. Useful for inspection during testing.
|
|
609
|
+
*/
|
|
610
|
+
getEmitRecorders() {
|
|
611
|
+
return this.scopeRecorders.filter((r) => typeof r.onEmit === 'function');
|
|
612
|
+
}
|
|
491
613
|
/**
|
|
492
614
|
* Returns the execution narrative.
|
|
493
615
|
*
|
|
@@ -687,4 +809,4 @@ export class FlowChartExecutor {
|
|
|
687
809
|
return recorder === null || recorder === void 0 ? void 0 : recorder.getSpec(subflowId);
|
|
688
810
|
}
|
|
689
811
|
}
|
|
690
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFHSCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUdyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUU3RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBWUwsYUFBYSxHQUNkLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV0RCxPQUFPLEVBQStDLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELDBFQUEwRTtBQUMxRSxNQUFNLG1CQUFtQixHQUFpQixDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQzFFLElBQUksV0FBVyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBaUVqRCxNQUFNLE9BQU8saUJBQWlCO0lBNkI1Qjs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxZQUNFLFNBQWtDLEVBQ2xDLGdCQUEwRTs7UUE3QzVFLDhFQUE4RTtRQUN0RSxzQkFBaUIsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVB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Z0I7SUFDaEIsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFXLENBQUM7SUFDdkQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQjs7UUFDaEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxvQkFBb0IsQ0FFcEUsQ0FBQztRQUNkLE9BQU8sTUFBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsV0FBVyxFQUFFLG1DQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFNBQWlCO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksb0JBQW9CLENBRXBFLENBQUM7UUFDZCxPQUFPLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Q2hhcnRFeGVjdXRvciDigJQgUHVibGljIEFQSSBmb3IgZXhlY3V0aW5nIGEgY29tcGlsZWQgRmxvd0NoYXJ0LlxuICpcbiAqIFdyYXBzIEZsb3djaGFydFRyYXZlcnNlci4gQnVpbGQgYSBjaGFydCB3aXRoIGZsb3dDaGFydCgpIGFuZCBwYXNzIHRoZSByZXN1bHQgaGVyZTpcbiAqXG4gKiAgIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdlbnRyeScsIGVudHJ5Rm4pLmFkZEZ1bmN0aW9uKCdwcm9jZXNzJywgcHJvY2Vzc0ZuKS5idWlsZCgpO1xuICpcbiAqICAgLy8gTm8tb3B0aW9ucyBmb3JtICh1c2VzIGF1dG8tZGV0ZWN0ZWQgVHlwZWRTY29wZSBmYWN0b3J5IGZyb20gdGhlIGNoYXJ0KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICpcbiAqICAgLy8gT3B0aW9ucy1vYmplY3QgZm9ybSAocHJlZmVycmVkIHdoZW4geW91IG5lZWQgdG8gY3VzdG9taXplIGJlaGF2aW9yKTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnksIGVucmljaFNuYXBzaG90czogdHJ1ZSB9KTtcbiAqXG4gKiAgIC8vIDItcGFyYW0gZm9ybSAoYWNjZXB0cyBhIFNjb3BlRmFjdG9yeSBkaXJlY3RseSwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpOlxuICogICBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgbXlGYWN0b3J5KTtcbiAqXG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0OiBkYXRhLCBlbnY6IHsgdHJhY2VJZDogJ3JlcS0xMjMnIH0gfSk7XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4uL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEV4ZWN1dG9yUmVzdWx0LFxuICB0eXBlIEV4dHJhY3RvckVycm9yLFxuICB0eXBlIEZsb3dDaGFydCxcbiAgdHlwZSBQYXVzZWRSZXN1bHQsXG4gIHR5cGUgUnVuT3B0aW9ucyxcbiAgdHlwZSBTY29wZUZhY3RvcnksXG4gIHR5cGUgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICB0eXBlIFN0YWdlTm9kZSxcbiAgdHlwZSBTdHJlYW1IYW5kbGVycyxcbiAgdHlwZSBTdWJmbG93UmVzdWx0LFxuICB0eXBlIFRyYXZlcnNhbFJlc3VsdCxcbiAgZGVmYXVsdExvZ2dlcixcbn0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd2NoYXJ0Q2hlY2twb2ludCB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUHJvdGVjdGlvbk1vZGUgfSBmcm9tICcuLi9zY29wZS9wcm90ZWN0aW9uL3R5cGVzLmpzJztcbmltcG9ydCB7IFNjb3BlRmFjYWRlIH0gZnJvbSAnLi4vc2NvcGUvU2NvcGVGYWNhZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRlciwgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlY29yZGVyU25hcHNob3QsIHR5cGUgUnVudGltZVNuYXBzaG90LCBFeGVjdXRpb25SdW50aW1lIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlSW5wdXQgfSBmcm9tICcuL3ZhbGlkYXRlSW5wdXQuanMnO1xuXG4vKiogRGVmYXVsdCBzY29wZSBmYWN0b3J5IOKAlCBjcmVhdGVzIGEgcGxhaW4gU2NvcGVGYWNhZGUgZm9yIGVhY2ggc3RhZ2UuICovXG5jb25zdCBkZWZhdWx0U2NvcGVGYWN0b3J5OiBTY29wZUZhY3RvcnkgPSAoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnYpID0+XG4gIG5ldyBTY29wZUZhY2FkZShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudik7XG5cbi8qKlxuICogT3B0aW9ucyBvYmplY3QgZm9yIGBGbG93Q2hhcnRFeGVjdXRvcmAg4oCUIHByZWZlcnJlZCBvdmVyIHBvc2l0aW9uYWwgcGFyYW1zLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGV4ID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7XG4gKiAgIHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5LFxuICogICBlbnJpY2hTbmFwc2hvdHM6IHRydWUsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICoqU3luYyBub3RlIGZvciBtYWludGFpbmVyczoqKiBFdmVyeSBmaWVsZCBhZGRlZCBoZXJlIG11c3QgYWxzbyBhcHBlYXIgaW4gdGhlXG4gKiBgZmxvd0NoYXJ0QXJnc2AgcHJpdmF0ZSBmaWVsZCB0eXBlIGFuZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb25cbiAqIGJsb2NrICh0aGUgYGVsc2UgaWZgIGJyYW5jaCB0aGF0IHJlYWRzIGZyb20gYG9wdHNgKS4gTWlzc2luZyBhbnkgb25lIG9mIHRoZVxuICogdGhyZWUgY2F1c2VzIHNpbGVudCBvbWlzc2lvbiDigJQgdGhlIG9wdGlvbiBpcyBhY2NlcHRlZCBidXQgbmV2ZXIgYXBwbGllZC5cbiAqXG4gKiAqKlRTY29wZSBpbmZlcmVuY2Ugbm90ZToqKiBXaGVuIHVzaW5nIHRoZSBvcHRpb25zLW9iamVjdCBmb3JtIHdpdGggYSBjdXN0b20gc2NvcGUsXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBpbmZlciBgVFNjb3BlYCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdC4gUGFzcyB0aGUgdHlwZVxuICogZXhwbGljaXRseTogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0LCBNeVNjb3BlPihjaGFydCwgeyBzY29wZUZhY3RvcnkgfSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGUgPSBhbnk+IHtcbiAgLy8g4pSA4pSAIENvbW1vbiBvcHRpb25zIChtb3N0IGNhbGxlcnMgbmVlZCBvbmx5IHRoZXNlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ3VzdG9tIHNjb3BlIGZhY3RvcnkuIERlZmF1bHRzIHRvIFR5cGVkU2NvcGUgb3IgU2NvcGVGYWNhZGUgYXV0by1kZXRlY3Rpb24uICovXG4gIHNjb3BlRmFjdG9yeT86IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICAvKipcbiAgICogQXR0YWNoIGEgcGVyLXN0YWdlIHNjb3BlIHNuYXBzaG90IHRvIGVhY2ggZXh0cmFjdG9yIHJlc3VsdC4gV2hlbiBgdHJ1ZWAsIHRoZVxuICAgKiBleHRyYWN0aW9uIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmdWxsIHNoYXJlZCBzdGF0ZSBhdCB0aGUgcG9pbnQgdGhhdCBzdGFnZVxuICAgKiBjb21taXR0ZWQg4oCUIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG11bHRpLXN0YWdlIHN0YXRlIHRyYW5zaXRpb25zLiBEZWZhdWx0cyB0b1xuICAgKiBgZmFsc2VgIChubyBzY29wZSBzbmFwc2hvdCBhdHRhY2hlZCkuIENhbiBhbHNvIGJlIHNldCBvbiB0aGUgY2hhcnQgdmlhXG4gICAqIGBmbG93Q2hhcnQoLi4uKS5lbnJpY2hTbmFwc2hvdHModHJ1ZSlgLlxuICAgKi9cbiAgZW5yaWNoU25hcHNob3RzPzogYm9vbGVhbjtcblxuICAvLyDilIDilIAgQ29udGV4dCBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBwcmUtcG9wdWxhdGVkIGludG8gdGhlIHNoYXJlZCBjb250ZXh0IGJlZm9yZSAqKmVhY2gqKiBzdGFnZVxuICAgKiAocmUtYXBwbGllZCBldmVyeSBzdGFnZSwgYWN0aW5nIGFzIGJhc2VsaW5lIGRlZmF1bHRzKS5cbiAgICovXG4gIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEluaXRpYWwgY29udGV4dCB2YWx1ZXMgbWVyZ2VkIGludG8gdGhlIHNoYXJlZCBjb250ZXh0ICoqb25jZSoqIGF0IHN0YXJ0dXBcbiAgICogKGFwcGxpZWQgYmVmb3JlIHRoZSBmaXJzdCBzdGFnZSwgbm90IHJlcGVhdGVkIG9uIHN1YnNlcXVlbnQgc3RhZ2VzKS5cbiAgICogRGlzdGluY3QgZnJvbSBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgLCB3aGljaCBpcyByZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLlxuICAgKi9cbiAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAvKiogUmVhZC1vbmx5IGlucHV0IGFjY2Vzc2libGUgdmlhIGBzY29wZS5nZXRBcmdzKClgIOKAlCBuZXZlciB0cmFja2VkIG9yIHdyaXR0ZW4uICovXG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG5cbiAgLy8g4pSA4pSAIEFkdmFuY2VkIC8gZXNjYXBlLWhhdGNoIG9wdGlvbnMgKG1vc3QgY2FsbGVycyBkbyBub3QgbmVlZCB0aGVzZSkg4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBjbGFzc2lmaWVyIGZvciB0aHJvdHRsaW5nIGRldGVjdGlvbi4gUmV0dXJuIGB0cnVlYCBpZiB0aGVcbiAgICogZXJyb3IgcmVwcmVzZW50cyBhIHJhdGUtbGltaXQgb3IgYmFja3ByZXNzdXJlIGNvbmRpdGlvbiAodGhlIGV4ZWN1dG9yIHdpbGxcbiAgICogdHJlYXQgaXQgZGlmZmVyZW50bHkgZnJvbSBoYXJkIGZhaWx1cmVzKS4gRGVmYXVsdHMgdG8gbm8gdGhyb3R0bGluZyBjbGFzc2lmaWNhdGlvbi5cbiAgICovXG4gIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIC8qKiBIYW5kbGVycyBmb3Igc3RyZWFtaW5nIHN0YWdlIGxpZmVjeWNsZSBldmVudHMgKHNlZSBgYWRkU3RyZWFtaW5nRnVuY3Rpb25gKS4gKi9cbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgLyoqIFNjb3BlIHByb3RlY3Rpb24gbW9kZSBmb3IgVHlwZWRTY29wZSBkaXJlY3QtYXNzaWdubWVudCBkZXRlY3Rpb24uICovXG4gIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xufVxuXG5leHBvcnQgY2xhc3MgRmxvd0NoYXJ0RXhlY3V0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgdHJhdmVyc2VyOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFNoYXJlZCBleGVjdXRpb24gY291bnRlciDigJQgc3Vydml2ZXMgcGF1c2UvcmVzdW1lLiBSZXNldCBvbiBmcmVzaCBydW4oKS4gKi9cbiAgcHJpdmF0ZSBfZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTtcbiAgcHJpdmF0ZSBuYXJyYXRpdmVFbmFibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgbmFycmF0aXZlT3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zO1xuICBwcml2YXRlIGNvbWJpbmVkUmVjb3JkZXI6IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmxvd1JlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgcHJpdmF0ZSBzY29wZVJlY29yZGVyczogUmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgbGFzdENoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQ7XG5cbiAgLy8gU1lOQyBSRVFVSVJFRDogZXZlcnkgb3B0aW9uYWwgZmllbGQgaGVyZSBtdXN0IG1pcnJvciBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNcbiAgLy8gQU5EIGJlIGFzc2lnbmVkIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvbiBibG9jayAodGhlIGBlbHNlIGlmYCBicmFuY2gpLlxuICAvLyBBZGRpbmcgYSBmaWVsZCB0byBvbmx5IG9uZSBvZiB0aGUgdGhyZWUgcGxhY2VzIGNhdXNlcyBzaWxlbnQgb21pc3Npb24uXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczoge1xuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT47XG4gICAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgIGVucmljaFNuYXBzaG90cz86IGJvb2xlYW47XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEZsb3dDaGFydEV4ZWN1dG9yLlxuICAgKlxuICAgKiAqKk9wdGlvbnMgb2JqZWN0IGZvcm0qKiAocHJlZmVycmVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5LCBlbnJpY2hTbmFwc2hvdHM6IHRydWUgfSlcbiAgICogYGBgXG4gICAqXG4gICAqICoqMi1wYXJhbSBmb3JtKiogKGFsc28gc3VwcG9ydGVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBmbG93Q2hhcnQgLSBUaGUgY29tcGlsZWQgRmxvd0NoYXJ0IHJldHVybmVkIGJ5IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYFxuICAgKiBAcGFyYW0gZmFjdG9yeU9yT3B0aW9ucyAtIEEgYFNjb3BlRmFjdG9yeTxUU2NvcGU+YCBPUiBhIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPmAgb3B0aW9ucyBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIGZhY3RvcnlPck9wdGlvbnM/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+LFxuICApIHtcbiAgICAvLyBEZXRlY3Qgb3B0aW9ucy1vYmplY3QgZm9ybSB2cyBmYWN0b3J5IGZvcm1cbiAgICBsZXQgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IGluaXRpYWxDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCByZWFkT25seUNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IHRocm90dGxpbmdFcnJvckNoZWNrZXI6ICgoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNjb3BlUHJvdGVjdGlvbk1vZGU6IFNjb3BlUHJvdGVjdGlvbk1vZGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVucmljaFNuYXBzaG90czogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgZmFjdG9yeU9yT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gMi1wYXJhbSBmb3JtOiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICAgIHNjb3BlRmFjdG9yeSA9IGZhY3RvcnlPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChmYWN0b3J5T3JPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9wdGlvbnMgb2JqZWN0IGZvcm06IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGVucmljaFNuYXBzaG90cywgLi4uIH0pXG4gICAgICBjb25zdCBvcHRzID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICAgIHNjb3BlRmFjdG9yeSA9IG9wdHMuc2NvcGVGYWN0b3J5O1xuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgPSBvcHRzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0O1xuICAgICAgaW5pdGlhbENvbnRleHQgPSBvcHRzLmluaXRpYWxDb250ZXh0O1xuICAgICAgcmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyID0gb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyO1xuICAgICAgc3RyZWFtSGFuZGxlcnMgPSBvcHRzLnN0cmVhbUhhbmRsZXJzO1xuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZSA9IG9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICAgIGVucmljaFNuYXBzaG90cyA9IG9wdHMuZW5yaWNoU25hcHNob3RzO1xuICAgIH1cbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MgPSB7XG4gICAgICBmbG93Q2hhcnQsXG4gICAgICBzY29wZUZhY3Rvcnk6IHNjb3BlRmFjdG9yeSA/PyBmbG93Q2hhcnQuc2NvcGVGYWN0b3J5ID8/IChkZWZhdWx0U2NvcGVGYWN0b3J5IGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+KSxcbiAgICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgaW5pdGlhbENvbnRleHQsXG4gICAgICByZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgZW5yaWNoU25hcHNob3RzLFxuICAgIH07XG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUcmF2ZXJzZXIoXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGU/OiB1bmtub3duLFxuICAgIGVudj86IGltcG9ydCgnLi4vZW5naW5lL3R5cGVzJykuRXhlY3V0aW9uRW52LFxuICAgIG1heERlcHRoPzogbnVtYmVyLFxuICAgIG92ZXJyaWRlcz86IHtcbiAgICAgIHJvb3Q/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICAgIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgICAgIHByZXNlcnZlUmVjb3JkZXJzPzogYm9vbGVhbjtcbiAgICAgIGV4aXN0aW5nUnVudGltZT86IEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT47XG4gICAgfSxcbiAgKTogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmZsb3dDaGFydEFyZ3M7XG4gICAgY29uc3QgZmMgPSBhcmdzLmZsb3dDaGFydDtcbiAgICBjb25zdCBuYXJyYXRpdmVGbGFnID0gdGhpcy5uYXJyYXRpdmVFbmFibGVkIHx8IChmYy5lbmFibGVOYXJyYXRpdmUgPz8gZmFsc2UpO1xuXG4gICAgLy8g4pSA4pSAIENvbXBvc2VkIHNjb3BlIGZhY3Rvcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gQ29sbGVjdCBhbGwgc2NvcGUgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHJlZGFjdGlvbikgaW50byBhIHNpbmdsZSBsaXN0LFxuICAgIC8vIHRoZW4gY3JlYXRlIE9ORSBmYWN0b3J5IHRoYXQgYXBwbGllcyB0aGVtIGluIGEgbG9vcC4gUmVwbGFjZXMgdGhlXG4gICAgLy8gcHJldmlvdXMgNC1kZWVwIGNsb3N1cmUgbmVzdGluZyB3aXRoIGEgZmxhdCwgZGVidWdnYWJsZSBjb21wb3NpdGlvbi5cblxuICAgIGlmIChvdmVycmlkZXM/LnByZXNlcnZlUmVjb3JkZXJzKSB7XG4gICAgICAvLyBSZXN1bWUgbW9kZToga2VlcCBleGlzdGluZyBjb21iaW5lZFJlY29yZGVyIHNvIG5hcnJhdGl2ZSBhY2N1bXVsYXRlc1xuICAgIH0gZWxzZSBpZiAobmFycmF0aXZlRmxhZykge1xuICAgICAgdGhpcy5jb21iaW5lZFJlY29yZGVyID0gbmV3IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIodGhpcy5uYXJyYXRpdmVPcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21iaW5lZFJlY29yZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gICAgLy8gQnVpbGQgbW9kaWZpZXIgbGlzdCDigJQgZWFjaCBtb2RpZmllciByZWNlaXZlcyB0aGUgc2NvcGUgYWZ0ZXIgY3JlYXRpb25cbiAgICB0eXBlIFNjb3BlTW9kaWZpZXIgPSAoc2NvcGU6IGFueSkgPT4gdm9pZDtcbiAgICBjb25zdCBtb2RpZmllcnM6IFNjb3BlTW9kaWZpZXJbXSA9IFtdO1xuXG4gICAgLy8gMS4gTmFycmF0aXZlIHJlY29yZGVyIChpZiBlbmFibGVkKVxuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5jb21iaW5lZFJlY29yZGVyO1xuICAgICAgbW9kaWZpZXJzLnB1c2goKHNjb3BlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUuYXR0YWNoUmVjb3JkZXIgPT09ICdmdW5jdGlvbicpIHNjb3BlLmF0dGFjaFJlY29yZGVyKHJlY29yZGVyKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIFVzZXItcHJvdmlkZWQgc2NvcGUgcmVjb3JkZXJzXG4gICAgaWYgKHRoaXMuc2NvcGVSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycztcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFJlY29yZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlY29yZGVycykgc2NvcGUuYXR0YWNoUmVjb3JkZXIocik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDMuIFJlZGFjdGlvbiBwb2xpY3kgKGNvbmRpdGlvbmFsIOKAlCBvbmx5IHdoZW4gcG9saWN5IGlzIHNldClcbiAgICBpZiAodGhpcy5yZWRhY3Rpb25Qb2xpY3kpIHtcbiAgICAgIGNvbnN0IHBvbGljeSA9IHRoaXMucmVkYWN0aW9uUG9saWN5O1xuICAgICAgbW9kaWZpZXJzLnB1c2goKHNjb3BlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUudXNlUmVkYWN0aW9uUG9saWN5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2NvcGUudXNlUmVkYWN0aW9uUG9saWN5KHBvbGljeSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gUHJlLXBvcHVsYXRlIGV4ZWN1dG9yLWxldmVsIGZpZWxkIHJlZGFjdGlvbiBtYXAgZnJvbSBwb2xpY3lcbiAgICAgIC8vIHNvIGdldFJlZGFjdGlvblJlcG9ydCgpIGluY2x1ZGVzIGZpZWxkLWxldmVsIHJlZGFjdGlvbnMuXG4gICAgICBpZiAocG9saWN5LmZpZWxkcykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgT2JqZWN0LmVudHJpZXMocG9saWN5LmZpZWxkcykpIHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkuc2V0KGtleSwgbmV3IFNldChmaWVsZHMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbXBvc2U6IGJhc2UgZmFjdG9yeSArIG1vZGlmaWVycyBpbiBhIHNpbmdsZSBwYXNzLlxuICAgIC8vIFNoYXJlZCByZWRhY3RlZCBrZXlzIGFyZSBBTFdBWVMgd2lyZWQgdXAgKHVuY29uZGl0aW9uYWwg4oCUIGVuc3VyZXMgY3Jvc3Mtc3RhZ2VcbiAgICAvLyBwcm9wYWdhdGlvbiBldmVuIHdpdGhvdXQgYSBwb2xpY3ksIGJlY2F1c2Ugc3RhZ2VzIGNhbiBjYWxsIHNldFZhbHVlKGtleSwgdmFsLCB0cnVlKVxuICAgIC8vIGZvciBwZXItY2FsbCByZWRhY3Rpb24pLiBPcHRpb25hbCBtb2RpZmllcnMgKHJlY29yZGVycywgcG9saWN5KSBhcmUgaW4gdGhlIGxpc3QuXG4gICAgY29uc3QgYmFzZUZhY3RvcnkgPSBhcmdzLnNjb3BlRmFjdG9yeTtcbiAgICBjb25zdCBzaGFyZWRSZWRhY3RlZEtleXMgPSB0aGlzLnNoYXJlZFJlZGFjdGVkS2V5cztcbiAgICBjb25zdCBzY29wZUZhY3RvcnkgPSAoKGN0eDogYW55LCBzdGFnZU5hbWU6IHN0cmluZywgcmVhZE9ubHk/OiB1bmtub3duLCBlbnZBcmc/OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlID0gYmFzZUZhY3RvcnkoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnZBcmcpO1xuICAgICAgLy8gQWx3YXlzIHdpcmUgc2hhcmVkIHJlZGFjdGlvbiBzdGF0ZVxuICAgICAgaWYgKHR5cGVvZiAoc2NvcGUgYXMgYW55KS51c2VTaGFyZWRSZWRhY3RlZEtleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgKHNjb3BlIGFzIGFueSkudXNlU2hhcmVkUmVkYWN0ZWRLZXlzKHNoYXJlZFJlZGFjdGVkS2V5cyk7XG4gICAgICB9XG4gICAgICAvLyBBcHBseSBvcHRpb25hbCBtb2RpZmllcnNcbiAgICAgIGZvciAoY29uc3QgbW9kIG9mIG1vZGlmaWVycykgbW9kKHNjb3BlKTtcbiAgICAgIHJldHVybiBzY29wZTtcbiAgICB9KSBhcyBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZVJvb3QgPSBvdmVycmlkZXM/LnJvb3QgPz8gZmMucm9vdDtcbiAgICBjb25zdCBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCA9IG92ZXJyaWRlcz8uaW5pdGlhbENvbnRleHQgPz8gYXJncy5pbml0aWFsQ29udGV4dDtcblxuICAgIGxldCBydW50aW1lOiBFeGVjdXRpb25SdW50aW1lO1xuICAgIGlmIChvdmVycmlkZXM/LmV4aXN0aW5nUnVudGltZSkge1xuICAgICAgLy8gUmVzdW1lIG1vZGU6IHJldXNlIGV4aXN0aW5nIHJ1bnRpbWUgc28gZXhlY3V0aW9uIHRyZWUgY29udGludWVzIGZyb20gcGF1c2UgcG9pbnQuXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgcm9vdCBmb3IgZ2V0U25hcHNob3QoKSAoZnVsbCB0cmVlKSwgdGhlbiBhZHZhbmNlXG4gICAgICAvLyByb290U3RhZ2VDb250ZXh0IHRvIGEgY29udGludWF0aW9uIGZyb20gdGhlIGxlYWYgKGZvciB0cmF2ZXJzYWwpLlxuICAgICAgcnVudGltZSA9IG92ZXJyaWRlcy5leGlzdGluZ1J1bnRpbWU7XG4gICAgICBydW50aW1lLnByZXNlcnZlU25hcHNob3RSb290KCk7XG4gICAgICBsZXQgbGVhZiA9IHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICAgIHdoaWxlIChsZWFmLm5leHQpIGxlYWYgPSBsZWFmLm5leHQ7XG4gICAgICBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBsZWFmLmNyZWF0ZU5leHQoJycsIGVmZmVjdGl2ZVJvb3QubmFtZSwgZWZmZWN0aXZlUm9vdC5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZShcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5uYW1lLFxuICAgICAgICBlZmZlY3RpdmVSb290LmlkLFxuICAgICAgICBhcmdzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgICBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICByb290OiBlZmZlY3RpdmVSb290LFxuICAgICAgc3RhZ2VNYXA6IGZjLnN0YWdlTWFwLFxuICAgICAgc2NvcGVGYWN0b3J5LFxuICAgICAgZXhlY3V0aW9uUnVudGltZTogcnVudGltZSxcbiAgICAgIHJlYWRPbmx5Q29udGV4dDogcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGUgPz8gYXJncy5yZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBhcmdzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVyczogYXJncy5zdHJlYW1IYW5kbGVycyxcbiAgICAgIGV4dHJhY3RvcjogZmMuZXh0cmFjdG9yLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogYXJncy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgc3ViZmxvd3M6IGZjLnN1YmZsb3dzLFxuICAgICAgZW5yaWNoU25hcHNob3RzOiBhcmdzLmVucmljaFNuYXBzaG90cyA/PyBmYy5lbnJpY2hTbmFwc2hvdHMsXG4gICAgICBuYXJyYXRpdmVFbmFibGVkOiBuYXJyYXRpdmVGbGFnLFxuICAgICAgYnVpbGRUaW1lU3RydWN0dXJlOiBmYy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICBsb2dnZXI6IGZjLmxvZ2dlciA/PyBkZWZhdWx0TG9nZ2VyLFxuICAgICAgc2lnbmFsLFxuICAgICAgZXhlY3V0aW9uRW52OiBlbnYsXG4gICAgICBmbG93UmVjb3JkZXJzOiB0aGlzLmJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKSxcbiAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsXG4gICAgICAuLi4obWF4RGVwdGggIT09IHVuZGVmaW5lZCAmJiB7IG1heERlcHRoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlTmFycmF0aXZlKG9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gICAgaWYgKG9wdGlvbnMpIHRoaXMubmFycmF0aXZlT3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeSB0aGF0IGFwcGxpZXMgdG8gYWxsIHN0YWdlcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKi9cbiAgc2V0UmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgPSBwb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkgZnJvbSB0aGVcbiAgICogbW9zdCByZWNlbnQgcnVuLiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgY29uc3QgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5KSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnNba2V5XSA9IFsuLi5maWVsZHNdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVkYWN0ZWRLZXlzOiBbLi4udGhpcy5zaGFyZWRSZWRhY3RlZEtleXNdLFxuICAgICAgZmllbGRSZWRhY3Rpb25zLFxuICAgICAgcGF0dGVybnM6ICh0aGlzLnJlZGFjdGlvblBvbGljeT8ucGF0dGVybnMgPz8gW10pLm1hcCgocCkgPT4gcC5zb3VyY2UpLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIAgUGF1c2UvUmVzdW1lIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjaGVja3BvaW50IGZyb20gdGhlIG1vc3QgcmVjZW50IHBhdXNlZCBleGVjdXRpb24sIG9yIGB1bmRlZmluZWRgXG4gICAqIGlmIHRoZSBsYXN0IHJ1biBjb21wbGV0ZWQgd2l0aG91dCBwYXVzaW5nLlxuICAgKlxuICAgKiBUaGUgY2hlY2twb2ludCBpcyBKU09OLXNlcmlhbGl6YWJsZSDigJQgc3RvcmUgaXQgaW4gUmVkaXMsIFBvc3RncmVzLCBsb2NhbFN0b3JhZ2UsIGV0Yy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAgICogaWYgKGV4ZWN1dG9yLmlzUGF1c2VkKCkpIHtcbiAgICogICBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogICBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRDaGVja3BvaW50KCk6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50O1xuICB9XG5cbiAgLyoqIFJldHVybnMgYHRydWVgIGlmIHRoZSBtb3N0IHJlY2VudCBydW4oKSB3YXMgcGF1c2VkIChjaGVja3BvaW50IGF2YWlsYWJsZSkuICovXG4gIGlzUGF1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIGEgcGF1c2VkIGZsb3djaGFydCBmcm9tIGEgY2hlY2twb2ludC5cbiAgICpcbiAgICogUmVzdG9yZXMgdGhlIHNjb3BlIHN0YXRlLCBjYWxscyB0aGUgcGF1c2VkIHN0YWdlJ3MgYHJlc3VtZUZuYCB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBpbnB1dCwgdGhlbiBjb250aW51ZXMgdHJhdmVyc2FsIGZyb20gdGhlIG5leHQgc3RhZ2UuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGNhbiBjb21lIGZyb20gYGdldENoZWNrcG9pbnQoKWAgb24gYSBwcmV2aW91cyBydW4sIG9yIGZyb21cbiAgICogYSBzZXJpYWxpemVkIGNoZWNrcG9pbnQgc3RvcmVkIGluIFJlZGlzL1Bvc3RncmVzL2xvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogKipOYXJyYXRpdmUvcmVjb3JkZXIgc3RhdGUgaXMgcmVzZXQgb24gcmVzdW1lLioqIFRvIGtlZXAgYSB1bmlmaWVkIG5hcnJhdGl2ZVxuICAgKiBhY3Jvc3MgcGF1c2UvcmVzdW1lIGN5Y2xlcywgY29sbGVjdCBpdCBiZWZvcmUgY2FsbGluZyByZXN1bWUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQWZ0ZXIgYSBwYXVzZS4uLlxuICAgKiBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKlxuICAgKiAvLyBMYXRlciAocG9zc2libHkgZGlmZmVyZW50IHNlcnZlciwgc2FtZSBjaGFydClcbiAgICogY29uc3QgY2hlY2twb2ludCA9IEpTT04ucGFyc2UoYXdhaXQgcmVkaXMuZ2V0KGBzZXNzaW9uOiR7aWR9YCkpO1xuICAgKiBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCk7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShjaGVja3BvaW50LCB7IGFwcHJvdmVkOiB0cnVlIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3VtZShcbiAgICBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICAgIHJlc3VtZUlucHV0PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUGljazxSdW5PcHRpb25zLCAnc2lnbmFsJyB8ICdlbnYnIHwgJ21heERlcHRoJz4sXG4gICk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdW5kZWZpbmVkO1xuXG4gICAgLy8g4pSA4pSAIFZhbGlkYXRlIGNoZWNrcG9pbnQgc3RydWN0dXJlIChtYXkgY29tZSBmcm9tIHVudHJ1c3RlZCBleHRlcm5hbCBzdG9yYWdlKSDilIDilIBcbiAgICBpZiAoXG4gICAgICAhY2hlY2twb2ludCB8fFxuICAgICAgdHlwZW9mIGNoZWNrcG9pbnQgIT09ICdvYmplY3QnIHx8XG4gICAgICB0eXBlb2YgY2hlY2twb2ludC5zaGFyZWRTdGF0ZSAhPT0gJ29iamVjdCcgfHxcbiAgICAgIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUgPT09IG51bGwgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkoY2hlY2twb2ludC5zaGFyZWRTdGF0ZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBzaGFyZWRTdGF0ZSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCAhPT0gJ3N0cmluZycgfHwgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHBhdXNlZFN0YWdlSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFBcnJheS5pc0FycmF5KGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpIHx8XG4gICAgICAhY2hlY2twb2ludC5zdWJmbG93UGF0aC5ldmVyeSgoczogdW5rbm93bikgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHN1YmZsb3dQYXRoIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncy4nKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBwYXVzZWQgbm9kZSBpbiB0aGUgZ3JhcGhcbiAgICBjb25zdCBwYXVzZWROb2RlID0gdGhpcy5maW5kTm9kZUluR3JhcGgoY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKTtcbiAgICBpZiAoIXBhdXNlZE5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke2NoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZH0nIG5vdCBmb3VuZCBpbiBmbG93Y2hhcnQuIGAgK1xuICAgICAgICAgICdUaGUgY2hhcnQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFwYXVzZWROb2RlLnJlc3VtZUZuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtwYXVzZWROb2RlLm5hbWV9JyAoJHtwYXVzZWROb2RlLmlkfSkgaGFzIG5vIHJlc3VtZUZuLiBgICtcbiAgICAgICAgICAnT25seSBzdGFnZXMgY3JlYXRlZCB3aXRoIGFkZFBhdXNhYmxlRnVuY3Rpb24oKSBjYW4gYmUgcmVzdW1lZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBhIHN5bnRoZXRpYyByZXN1bWUgbm9kZTogY2FsbHMgcmVzdW1lRm4gd2l0aCByZXN1bWVJbnB1dCwgdGhlbiBjb250aW51ZXMuXG4gICAgLy8gcmVzdW1lRm4gc2lnbmF0dXJlIGlzIChzY29wZSwgaW5wdXQpIHBlciBQYXVzYWJsZUhhbmRsZXIg4oCUIHdyYXAgdG8gbWF0Y2ggU3RhZ2VGdW5jdGlvbihzY29wZSwgYnJlYWtGbikuXG4gICAgY29uc3QgcmVzdW1lRm4gPSBwYXVzZWROb2RlLnJlc3VtZUZuO1xuICAgIGNvbnN0IHJlc3VtZVN0YWdlRm4gPSAoc2NvcGU6IFRTY29wZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VtZUZuKHNjb3BlLCByZXN1bWVJbnB1dCk7XG4gICAgfTtcblxuICAgIC8vIERldGVybWluZSBjb250aW51YXRpb246IGZvciBicmFuY2ggY2hpbGRyZW4gKGRlY2lkZXIvc2VsZWN0b3IpLCBwYXVzZWROb2RlLm5leHRcbiAgICAvLyBpcyB1bmRlZmluZWQuIFRoZSBjaGVja3BvaW50J3MgY29udGludWF0aW9uU3RhZ2VJZCAoY29sbGVjdGVkIGR1cmluZyB0cmF2ZXJzYWxcbiAgICAvLyBidWJibGUtdXApIHBvaW50cyB0byB0aGUgaW52b2tlcidzIG5leHQgbm9kZS5cbiAgICBsZXQgY29udGludWF0aW9uTmV4dCA9IHBhdXNlZE5vZGUubmV4dDtcbiAgICBpZiAoIWNvbnRpbnVhdGlvbk5leHQgJiYgY2hlY2twb2ludC5jb250aW51YXRpb25TdGFnZUlkKSB7XG4gICAgICBjb250aW51YXRpb25OZXh0ID0gdGhpcy5maW5kTm9kZUluR3JhcGgoY2hlY2twb2ludC5jb250aW51YXRpb25TdGFnZUlkLCBbXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdW1lTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBpZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBwYXVzZWROb2RlLmRlc2NyaXB0aW9uLFxuICAgICAgZm46IHJlc3VtZVN0YWdlRm4sXG4gICAgICBuZXh0OiBjb250aW51YXRpb25OZXh0LFxuICAgIH07XG5cbiAgICAvLyBEb24ndCBjbGVhciByZWNvcmRlcnMg4oCUIHJlc3VtZSBjb250aW51ZXMgZnJvbSBwcmV2aW91cyBzdGF0ZS5cbiAgICAvLyBOYXJyYXRpdmUsIG1ldHJpY3MsIGRlYnVnIGVudHJpZXMgYWNjdW11bGF0ZSBhY3Jvc3MgcGF1c2UvcmVzdW1lLlxuXG4gICAgLy8gUmV1c2UgdGhlIGV4aXN0aW5nIHJ1bnRpbWUgc28gdGhlIGV4ZWN1dGlvbiB0cmVlIGNvbnRpbnVlcyBmcm9tIHRoZSBwYXVzZSBwb2ludC5cbiAgICAvLyBwcmVzZXJ2ZVJlY29yZGVycyBrZWVwcyB0aGUgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciBzbyBuYXJyYXRpdmUgYWNjdW11bGF0ZXMuXG4gICAgY29uc3QgZXhpc3RpbmdSdW50aW1lID0gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT47XG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcihvcHRpb25zPy5zaWduYWwsIHVuZGVmaW5lZCwgb3B0aW9ucz8uZW52LCBvcHRpb25zPy5tYXhEZXB0aCwge1xuICAgICAgcm9vdDogcmVzdW1lTm9kZSxcbiAgICAgIGluaXRpYWxDb250ZXh0OiBjaGVja3BvaW50LnNoYXJlZFN0YXRlLFxuICAgICAgcHJlc2VydmVSZWNvcmRlcnM6IHRydWUsXG4gICAgICBleGlzdGluZ1J1bnRpbWUsXG4gICAgfSk7XG5cbiAgICAvLyBGaXJlIG9uUmVzdW1lIGV2ZW50IG9uIGFsbCByZWNvcmRlcnMgKGZsb3cgKyBzY29wZSlcbiAgICBjb25zdCBoYXNJbnB1dCA9IHJlc3VtZUlucHV0ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgZmxvd1Jlc3VtZUV2ZW50ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgaGFzSW5wdXQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB0aGlzLmNvbWJpbmVkUmVjb3JkZXIub25SZXN1bWUoZmxvd1Jlc3VtZUV2ZW50KTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSByLm9uUmVzdW1lPy4oZmxvd1Jlc3VtZUV2ZW50KTtcblxuICAgIGNvbnN0IHNjb3BlUmVzdW1lRXZlbnQgPSB7XG4gICAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogYnVpbGRSdW50aW1lU3RhZ2VJZChwYXVzZWROb2RlLmlkLCB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlKSxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgcGlwZWxpbmVJZDogJycsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykgci5vblJlc3VtZT8uKHNjb3BlUmVzdW1lRXZlbnQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNvbnN0IHNmUmVzdWx0cyA9IHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gICAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB7XG4gICAgICAgICAgc2hhcmVkU3RhdGU6IHNuYXBzaG90LnNoYXJlZFN0YXRlLFxuICAgICAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90LmV4ZWN1dGlvblRyZWUsXG4gICAgICAgICAgcGF1c2VkU3RhZ2VJZDogZXJyb3Iuc3RhZ2VJZCxcbiAgICAgICAgICBzdWJmbG93UGF0aDogZXJyb3Iuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgcGF1c2VEYXRhOiBlcnJvci5wYXVzZURhdGEsXG4gICAgICAgICAgLi4uKHNmUmVzdWx0cy5zaXplID4gMCAmJiB7IHN1YmZsb3dSZXN1bHRzOiBPYmplY3QuZnJvbUVudHJpZXMoc2ZSZXN1bHRzKSB9KSxcbiAgICAgICAgICAuLi4oZXJyb3IuaW52b2tlclN0YWdlSWQgJiYgeyBpbnZva2VyU3RhZ2VJZDogZXJyb3IuaW52b2tlclN0YWdlSWQgfSksXG4gICAgICAgICAgLi4uKGVycm9yLmNvbnRpbnVhdGlvblN0YWdlSWQgJiYgeyBjb250aW51YXRpb25TdGFnZUlkOiBlcnJvci5jb250aW51YXRpb25TdGFnZUlkIH0pLFxuICAgICAgICAgIHBhdXNlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBTdGFnZU5vZGUgaW4gdGhlIGNvbXBpbGVkIGdyYXBoIGJ5IElELlxuICAgKiBIYW5kbGVzIHN1YmZsb3cgcGF0aHMgYnkgZHJpbGxpbmcgaW50byByZWdpc3RlcmVkIHN1YmZsb3dzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kTm9kZUluR3JhcGgoc3RhZ2VJZDogc3RyaW5nLCBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmMgPSB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0O1xuXG4gICAgaWYgKHN1YmZsb3dQYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gVG9wLWxldmVsOiBERlMgZnJvbSByb290XG4gICAgICByZXR1cm4gdGhpcy5kZnNGaW5kKGZjLnJvb3QsIHN0YWdlSWQpO1xuICAgIH1cblxuICAgIC8vIFN1YmZsb3c6IGRyaWxsIGludG8gdGhlIHN1YmZsb3cgY2hhaW4sIHRoZW4gc2VhcmNoIGZyb20gdGhlIGxhc3Qgc3ViZmxvdydzIHJvb3RcbiAgICBsZXQgc3ViZmxvd1Jvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3Qgc2ZJZCBvZiBzdWJmbG93UGF0aCkge1xuICAgICAgY29uc3Qgc3ViZmxvdyA9IGZjLnN1YmZsb3dzPy5bc2ZJZF07XG4gICAgICBpZiAoIXN1YmZsb3cpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBzdWJmbG93Um9vdCA9IHN1YmZsb3cucm9vdDtcbiAgICB9XG4gICAgaWYgKCFzdWJmbG93Um9vdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5kZnNGaW5kKHN1YmZsb3dSb290LCBzdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBERlMgc2VhcmNoIGZvciBhIG5vZGUgYnkgSUQgaW4gdGhlIFN0YWdlTm9kZSBncmFwaC4gQ3ljbGUtc2FmZSB2aWEgdmlzaXRlZCBzZXQuICovXG4gIHByaXZhdGUgZGZzRmluZChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIC8vIFNraXAgbG9vcCBiYWNrLWVkZ2UgcmVmZXJlbmNlcyAodGhleSBzaGFyZSB0aGUgdGFyZ2V0J3MgSUQgYnV0IGhhdmUgbm8gZm4vcmVzdW1lRm4pXG4gICAgaWYgKG5vZGUuaXNMb29wUmVmKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLmlkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2aXNpdGVkLmFkZChub2RlLmlkKTtcbiAgICBpZiAobm9kZS5pZCA9PT0gdGFyZ2V0SWQpIHJldHVybiBub2RlO1xuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmRmc0ZpbmQoY2hpbGQsIHRhcmdldElkLCB2aXNpdGVkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlLm5leHQpIHJldHVybiB0aGlzLmRmc0ZpbmQobm9kZS5uZXh0LCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBzY29wZSBSZWNvcmRlciB0byBvYnNlcnZlIGRhdGEgb3BlcmF0aW9ucyAocmVhZHMsIHdyaXRlcywgY29tbWl0cykuXG4gICAqIEF1dG9tYXRpY2FsbHkgYXR0YWNoZWQgdG8gZXZlcnkgU2NvcGVGYWNhZGUgY3JlYXRlZCBkdXJpbmcgdHJhdmVyc2FsLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBJRDoqKiBJZiBhIHJlY29yZGVyIHdpdGggdGhlIHNhbWUgYGlkYCBpcyBhbHJlYWR5IGF0dGFjaGVkLFxuICAgKiBpdCBpcyByZXBsYWNlZCAobm90IGR1cGxpY2F0ZWQpLiBUaGlzIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZyB3aGVuIGJvdGhcbiAgICogYSBmcmFtZXdvcmsgYW5kIHRoZSB1c2VyIGF0dGFjaCB0aGUgc2FtZSByZWNvcmRlciB0eXBlLlxuICAgKlxuICAgKiBCdWlsdC1pbiByZWNvcmRlcnMgdXNlIGF1dG8taW5jcmVtZW50IElEcyAoYG1ldHJpY3MtMWAsIGBkZWJ1Zy0xYCwgLi4uKSBieVxuICAgKiBkZWZhdWx0LCBzbyBtdWx0aXBsZSBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uZmlncyBjb2V4aXN0LiBUbyBvdmVycmlkZVxuICAgKiBhIGZyYW1ld29yay1hdHRhY2hlZCByZWNvcmRlciwgcGFzcyB0aGUgc2FtZSB3ZWxsLWtub3duIElELlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIE11bHRpcGxlIHJlY29yZGVycyB3aXRoIGRpZmZlcmVudCBjb25maWdzIOKAlCBlYWNoIGdldHMgYSB1bmlxdWUgSURcbiAgICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCkpO1xuICAgKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgRGVidWdSZWNvcmRlcih7IHZlcmJvc2l0eTogJ21pbmltYWwnIH0pKTtcbiAgICpcbiAgICogLy8gT3ZlcnJpZGUgYSBmcmFtZXdvcmstYXR0YWNoZWQgcmVjb3JkZXIgYnkgcGFzc2luZyBpdHMgd2VsbC1rbm93biBJRFxuICAgKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ21ldHJpY3MnKSk7XG4gICAqXG4gICAqIC8vIEF0dGFjaGluZyB0d2ljZSB3aXRoIHNhbWUgSUQgcmVwbGFjZXMgKG5vIGRvdWJsZS1jb3VudGluZylcbiAgICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdteS1tZXRyaWNzJykpO1xuICAgKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7IC8vIHJlcGxhY2VzIHByZXZpb3VzXG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoUmVjb3JkZXIocmVjb3JkZXI6IFJlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgc2NvcGUgUmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElELiAqL1xuICBkZXRhY2hSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zY29wZVJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSBpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIHNjb3BlIFJlY29yZGVycy4gKi9cbiAgZ2V0UmVjb3JkZXJzKCk6IFJlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5zY29wZVJlY29yZGVyc107XG4gIH1cblxuICAvLyDilIDilIDilIAgRmxvd1JlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIEZsb3dSZWNvcmRlciB0byBvYnNlcnZlIGNvbnRyb2wgZmxvdyBldmVudHMuXG4gICAqIEF1dG9tYXRpY2FsbHkgZW5hYmxlcyBuYXJyYXRpdmUgaWYgbm90IGFscmVhZHkgZW5hYmxlZC5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpIOKAlCByZWNvcmRlcnMgYXJlIHBhc3NlZCB0byB0aGUgdHJhdmVyc2VyIGF0IGNyZWF0aW9uIHRpbWUuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBJRDoqKiByZXBsYWNlcyBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgYGlkYC5cbiAgICovXG4gIGF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlcjogRmxvd1JlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBGbG93UmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElELiAqL1xuICBkZXRhY2hGbG93UmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmxvd1JlY29yZGVycyA9IHRoaXMuZmxvd1JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgRmxvd1JlY29yZGVycy4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVycygpOiBGbG93UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmZsb3dSZWNvcmRlcnNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4ZWN1dGlvbiBuYXJyYXRpdmUuXG4gICAqXG4gICAqIFdoZW4gdXNpbmcgU2NvcGVGYWNhZGUtYmFzZWQgc2NvcGVzLCByZXR1cm5zIGEgY29tYmluZWQgbmFycmF0aXZlIHRoYXRcbiAgICogaW50ZXJsZWF2ZXMgZmxvdyBldmVudHMgKHN0YWdlcywgZGVjaXNpb25zLCBmb3Jrcykgd2l0aCBkYXRhIG9wZXJhdGlvbnNcbiAgICogKHJlYWRzLCB3cml0ZXMsIHVwZGF0ZXMpLiBGb3IgcGxhaW4gc2NvcGVzIHdpdGhvdXQgYXR0YWNoUmVjb3JkZXIgc3VwcG9ydCxcbiAgICogcmV0dXJucyBmbG93LW9ubHkgbmFycmF0aXZlIHNlbnRlbmNlcy5cbiAgICovXG4gIGdldE5hcnJhdGl2ZSgpOiBzdHJpbmdbXSB7XG4gICAgLy8gQ29tYmluZWQgcmVjb3JkZXIgYnVpbGRzIHRoZSBuYXJyYXRpdmUgaW5saW5lIGR1cmluZyB0cmF2ZXJzYWwg4oCUIGp1c3QgcmVhZCBpdFxuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVkUmVjb3JkZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXROYXJyYXRpdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHN0cnVjdHVyZWQgbmFycmF0aXZlIGVudHJpZXMgZm9yIHByb2dyYW1tYXRpYyBjb25zdW1wdGlvbi5cbiAgICogRWFjaCBlbnRyeSBoYXMgYSB0eXBlIChzdGFnZSwgc3RlcCwgY29uZGl0aW9uLCBmb3JrLCBldGMuKSwgdGV4dCwgYW5kIGRlcHRoLlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlRW50cmllcygpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVkUmVjb3JkZXIuZ2V0RW50cmllcygpO1xuICAgIH1cbiAgICBjb25zdCBmbG93U2VudGVuY2VzID0gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgcmV0dXJuIGZsb3dTZW50ZW5jZXMubWFwKCh0ZXh0KSA9PiAoeyB0eXBlOiAnc3RhZ2UnIGFzIGNvbnN0LCB0ZXh0LCBkZXB0aDogMCB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tYmluZWQgRmxvd1JlY29yZGVycyBsaXN0LiBXaGVuIG5hcnJhdGl2ZSBpcyBlbmFibGVkLCBpbmNsdWRlczpcbiAgICogLSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIChidWlsZHMgbWVyZ2VkIGZsb3crZGF0YSBuYXJyYXRpdmUgaW5saW5lKVxuICAgKiAtIE5hcnJhdGl2ZUZsb3dSZWNvcmRlciAoa2VlcHMgZmxvdy1vbmx5IHNlbnRlbmNlcyBmb3IgZ2V0Rmxvd05hcnJhdGl2ZSgpKVxuICAgKiBQbHVzIGFueSB1c2VyLWF0dGFjaGVkIHJlY29yZGVycy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGbG93UmVjb3JkZXJzTGlzdCgpOiBGbG93UmVjb3JkZXJbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIHJlY29yZGVycy5wdXNoKHRoaXMuY29tYmluZWRSZWNvcmRlcik7XG4gICAgICAvLyBLZWVwIHRoZSBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciBzbyBnZXRGbG93TmFycmF0aXZlKCkgc3RpbGwgd29ya3NcbiAgICAgIHJlY29yZGVycy5wdXNoKG5ldyBOYXJyYXRpdmVGbG93UmVjb3JkZXIoKSk7XG4gICAgfVxuICAgIHJlY29yZGVycy5wdXNoKC4uLnRoaXMuZmxvd1JlY29yZGVycyk7XG4gICAgcmV0dXJuIHJlY29yZGVycy5sZW5ndGggPiAwID8gcmVjb3JkZXJzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZmxvdy1vbmx5IG5hcnJhdGl2ZSBzZW50ZW5jZXMgKHdpdGhvdXQgZGF0YSBvcGVyYXRpb25zKS5cbiAgICogVXNlIHRoaXMgd2hlbiB5b3Ugb25seSB3YW50IGNvbnRyb2wgZmxvdyBkZXNjcmlwdGlvbnMuXG4gICAqXG4gICAqIFNlbnRlbmNlcyBjb21lIGZyb20gYE5hcnJhdGl2ZUZsb3dSZWNvcmRlcmAgKGEgZGVkaWNhdGVkIGZsb3ctb25seSByZWNvcmRlciBhdXRvbWF0aWNhbGx5XG4gICAqIGF0dGFjaGVkIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQpLiBJdCBlbWl0cyBib3RoIGBvblN0YWdlRXhlY3V0ZWRgIHNlbnRlbmNlcyAob25lIHBlclxuICAgKiBzdGFnZSkgQU5EIGBvbk5leHRgIHRyYW5zaXRpb24gc2VudGVuY2VzIChvbmUgcGVyIHN0YWdlLXRvLXN0YWdlIHRyYW5zaXRpb24pLCBzbyBmb3IgYVxuICAgKiBjaGFydCB3aXRoIE4gc3RhZ2VzIHlvdSB3aWxsIHR5cGljYWxseSBnZXQgbW9yZSBlbnRyaWVzIGhlcmUgdGhhbiBmcm9tIGBnZXROYXJyYXRpdmUoKWAuXG4gICAqL1xuICBnZXRGbG93TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gIH1cblxuICBhc3luYyBydW4ob3B0aW9ucz86IFJ1bk9wdGlvbnMpOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgbGV0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBsZXQgdGltZW91dElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcblxuICAgIC8vIENyZWF0ZSBhbiBpbnRlcm5hbCBBYm9ydENvbnRyb2xsZXIgZm9yIHRpbWVvdXRNc1xuICAgIGlmIChvcHRpb25zPy50aW1lb3V0TXMgJiYgIXNpZ25hbCkge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gY29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoYEV4ZWN1dGlvbiB0aW1lZCBvdXQgYWZ0ZXIgJHtvcHRpb25zLnRpbWVvdXRNc31tc2ApKSxcbiAgICAgICAgb3B0aW9ucy50aW1lb3V0TXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGlucHV0IGFnYWluc3QgaW5wdXRTY2hlbWEgaWYgYm90aCBhcmUgcHJlc2VudFxuICAgIGxldCB2YWxpZGF0ZWRJbnB1dCA9IG9wdGlvbnM/LmlucHV0O1xuICAgIGlmICh2YWxpZGF0ZWRJbnB1dCAmJiB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hKSB7XG4gICAgICB2YWxpZGF0ZWRJbnB1dCA9IHZhbGlkYXRlSW5wdXQodGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSwgdmFsaWRhdGVkSW5wdXQpO1xuICAgIH1cblxuICAgIC8vIFVzZXItYXR0YWNoZWQgcmVjb3JkZXJzIChmbG93UmVjb3JkZXJzICsgc2NvcGVSZWNvcmRlcnMpIGFyZSBjbGVhcmVkIHZpYSBjbGVhcigpIHRvIHByZXZlbnRcbiAgICAvLyBjcm9zcy1ydW4gYWNjdW11bGF0aW9uLiBUaGUgY29tYmluZWRSZWNvcmRlciBpcyBOT1QgY2xlYXJlZCBoZXJlIOKAlCBjcmVhdGVUcmF2ZXJzZXIoKSBhbHdheXNcbiAgICAvLyBjcmVhdGVzIGEgZnJlc2ggQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciBpbnN0YW5jZSBvbiBlYWNoIHJ1biwgc28gc3RhbGUgc3RhdGUgaXMgbmV2ZXIgYW4gaXNzdWUuXG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuZmxvd1JlY29yZGVycykge1xuICAgICAgci5jbGVhcj8uKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlUmVjb3JkZXJzKSB7XG4gICAgICByLmNsZWFyPy4oKTtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIgPSB7IHZhbHVlOiAwIH07IC8vIFJlc2V0IGNvdW50ZXIgb24gZnJlc2ggcnVuXG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcihzaWduYWwsIHZhbGlkYXRlZElucHV0LCBvcHRpb25zPy5lbnYsIG9wdGlvbnM/Lm1heERlcHRoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIC8vIEJ1aWxkIGNoZWNrcG9pbnQgZnJvbSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZVxuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNvbnN0IHNmUmVzdWx0cyA9IHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gICAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB7XG4gICAgICAgICAgc2hhcmVkU3RhdGU6IHNuYXBzaG90LnNoYXJlZFN0YXRlLFxuICAgICAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90LmV4ZWN1dGlvblRyZWUsXG4gICAgICAgICAgcGF1c2VkU3RhZ2VJZDogZXJyb3Iuc3RhZ2VJZCxcbiAgICAgICAgICBzdWJmbG93UGF0aDogZXJyb3Iuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgcGF1c2VEYXRhOiBlcnJvci5wYXVzZURhdGEsXG4gICAgICAgICAgLi4uKHNmUmVzdWx0cy5zaXplID4gMCAmJiB7IHN1YmZsb3dSZXN1bHRzOiBPYmplY3QuZnJvbUVudHJpZXMoc2ZSZXN1bHRzKSB9KSxcbiAgICAgICAgICAvLyBJbnZva2VyIGNvbnRleHQg4oCUIGNvbGxlY3RlZCBkdXJpbmcgdHJhdmVyc2FsIGJ1YmJsZS11cCAobm90IHRyZWUtd2Fsa2VkKVxuICAgICAgICAgIC4uLihlcnJvci5pbnZva2VyU3RhZ2VJZCAmJiB7IGludm9rZXJTdGFnZUlkOiBlcnJvci5pbnZva2VyU3RhZ2VJZCB9KSxcbiAgICAgICAgICAuLi4oZXJyb3IuY29udGludWF0aW9uU3RhZ2VJZCAmJiB7IGNvbnRpbnVhdGlvblN0YWdlSWQ6IGVycm9yLmNvbnRpbnVhdGlvblN0YWdlSWQgfSksXG4gICAgICAgICAgcGF1c2VkQXQ6IERhdGUubm93KCksXG4gICAgICAgIH07XG4gICAgICAgIC8vIFJldHVybiBhIFBhdXNlUmVzdWx0LXNoYXBlZCB2YWx1ZSBzbyBjYWxsZXJzIGNhbiBjaGVjayB3aXRob3V0IHRyeS9jYXRjaFxuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEludHJvc3BlY3Rpb24g4pSA4pSA4pSAXG5cbiAgZ2V0U25hcHNob3QoKTogUnVudGltZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KCkgYXMgUnVudGltZVNuYXBzaG90O1xuICAgIGNvbnN0IHNmUmVzdWx0cyA9IHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gICAgaWYgKHNmUmVzdWx0cy5zaXplID4gMCkge1xuICAgICAgc25hcHNob3Quc3ViZmxvd1Jlc3VsdHMgPSBPYmplY3QuZnJvbUVudHJpZXMoc2ZSZXN1bHRzKTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0IHNuYXBzaG90IGRhdGEgZnJvbSByZWNvcmRlcnMgdGhhdCBpbXBsZW1lbnQgdG9TbmFwc2hvdCgpXG4gICAgY29uc3QgcmVjb3JkZXJTbmFwc2hvdHM6IFJlY29yZGVyU25hcHNob3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlUmVjb3JkZXJzKSB7XG4gICAgICBpZiAoci50b1NuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHNuYXAgPSByLnRvU25hcHNob3QoKTtcbiAgICAgICAgcmVjb3JkZXJTbmFwc2hvdHMucHVzaCh7XG4gICAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgICAgbmFtZTogc25hcC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBzbmFwLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogc25hcC5wcmVmZXJyZWRPcGVyYXRpb24sXG4gICAgICAgICAgZGF0YTogc25hcC5kYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuZmxvd1JlY29yZGVycykge1xuICAgICAgaWYgKHIudG9TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBzbmFwID0gci50b1NuYXBzaG90KCk7XG4gICAgICAgIHJlY29yZGVyU25hcHNob3RzLnB1c2goe1xuICAgICAgICAgIGlkOiByLmlkLFxuICAgICAgICAgIG5hbWU6IHNuYXAubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc25hcC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmVmZXJyZWRPcGVyYXRpb246IHNuYXAucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgICAgICAgIGRhdGE6IHNuYXAuZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWNvcmRlclNuYXBzaG90cy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5yZWNvcmRlcnMgPSByZWNvcmRlclNuYXBzaG90cztcbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy50cmF2ZXJzZXIuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0QnJhbmNoSWRzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRCcmFuY2hJZHMoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVJvb3QoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lU3RydWN0dXJlKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFN1YmZsb3dSZXN1bHRzKCk6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0RXh0cmFjdGVkUmVzdWx0czxUUmVzdWx0ID0gdW5rbm93bj4oKTogTWFwPHN0cmluZywgVFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRFeHRyYWN0ZWRSZXN1bHRzPFRSZXN1bHQ+KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEV4dHJhY3RvckVycm9ycygpOiBFeHRyYWN0b3JFcnJvcltdIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0RXh0cmFjdG9yRXJyb3JzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3ViZmxvdyBtYW5pZmVzdCBmcm9tIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyLlxuICAgKiBSZXR1cm5zIGVtcHR5IGFycmF5IGlmIG5vIE1hbmlmZXN0Rmxvd1JlY29yZGVyIGlzIGF0dGFjaGVkLlxuICAgKi9cbiAgZ2V0U3ViZmxvd01hbmlmZXN0KCk6IE1hbmlmZXN0RW50cnlbXSB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRNYW5pZmVzdCgpID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZ1bGwgc3BlYyBmb3IgYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIHN1YmZsb3cuXG4gICAqIFJlcXVpcmVzIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyIHRoYXQgb2JzZXJ2ZWQgdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIGdldFN1YmZsb3dTcGVjKHN1YmZsb3dJZDogc3RyaW5nKTogdW5rbm93biB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRTcGVjKHN1YmZsb3dJZCk7XG4gIH1cbn1cbiJdfQ==
|
|
812
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFHSCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUdyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUU3RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBWUwsYUFBYSxHQUNkLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXJILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUErQyxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCwwRUFBMEU7QUFDMUUsTUFBTSxtQkFBbUIsR0FBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUMxRSxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQWlFakQsTUFBTSxPQUFPLGlCQUFp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QUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLG9CQUFvQixDQUVwRSxDQUFDO1FBQ2QsT0FBTyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0RXhlY3V0b3Ig4oCUIFB1YmxpYyBBUEkgZm9yIGV4ZWN1dGluZyBhIGNvbXBpbGVkIEZsb3dDaGFydC5cbiAqXG4gKiBXcmFwcyBGbG93Y2hhcnRUcmF2ZXJzZXIuIEJ1aWxkIGEgY2hhcnQgd2l0aCBmbG93Q2hhcnQoKSBhbmQgcGFzcyB0aGUgcmVzdWx0IGhlcmU6XG4gKlxuICogICBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnZW50cnknLCBlbnRyeUZuKS5hZGRGdW5jdGlvbigncHJvY2VzcycsIHByb2Nlc3NGbikuYnVpbGQoKTtcbiAqXG4gKiAgIC8vIE5vLW9wdGlvbnMgZm9ybSAodXNlcyBhdXRvLWRldGVjdGVkIFR5cGVkU2NvcGUgZmFjdG9yeSBmcm9tIHRoZSBjaGFydCk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqXG4gKiAgIC8vIE9wdGlvbnMtb2JqZWN0IGZvcm0gKHByZWZlcnJlZCB3aGVuIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvcik6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5LCBlbnJpY2hTbmFwc2hvdHM6IHRydWUgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL05hcnJhdGl2ZUZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL25hcnJhdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQgfSBmcm9tICcuLi9lbmdpbmUvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgRmxvd2NoYXJ0VHJhdmVyc2VyIH0gZnJvbSAnLi4vZW5naW5lL3RyYXZlcnNhbC9GbG93Y2hhcnRUcmF2ZXJzZXIuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBFeGVjdXRvclJlc3VsdCxcbiAgdHlwZSBFeHRyYWN0b3JFcnJvcixcbiAgdHlwZSBGbG93Q2hhcnQsXG4gIHR5cGUgUGF1c2VkUmVzdWx0LFxuICB0eXBlIFJ1bk9wdGlvbnMsXG4gIHR5cGUgU2NvcGVGYWN0b3J5LFxuICB0eXBlIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgdHlwZSBTdGFnZU5vZGUsXG4gIHR5cGUgU3RyZWFtSGFuZGxlcnMsXG4gIHR5cGUgU3ViZmxvd1Jlc3VsdCxcbiAgdHlwZSBUcmF2ZXJzYWxSZXN1bHQsXG4gIGRlZmF1bHRMb2dnZXIsXG59IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLCBoYXNGbG93UmVjb3JkZXJNZXRob2RzLCBoYXNSZWNvcmRlck1ldGhvZHMgfSBmcm9tICcuLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvRW1pdFJlY29yZGVyLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgU2NvcGVGYWNhZGUgfSBmcm9tICcuLi9zY29wZS9TY29wZUZhY2FkZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyLCBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgUmVjb3JkZXJTbmFwc2hvdCwgdHlwZSBSdW50aW1lU25hcHNob3QsIEV4ZWN1dGlvblJ1bnRpbWUgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnB1dCB9IGZyb20gJy4vdmFsaWRhdGVJbnB1dC5qcyc7XG5cbi8qKiBEZWZhdWx0IHNjb3BlIGZhY3Rvcnkg4oCUIGNyZWF0ZXMgYSBwbGFpbiBTY29wZUZhY2FkZSBmb3IgZWFjaCBzdGFnZS4gKi9cbmNvbnN0IGRlZmF1bHRTY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeSA9IChjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudikgPT5cbiAgbmV3IFNjb3BlRmFjYWRlKGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52KTtcblxuLyoqXG4gKiBPcHRpb25zIG9iamVjdCBmb3IgYEZsb3dDaGFydEV4ZWN1dG9yYCDigJQgcHJlZmVycmVkIG92ZXIgcG9zaXRpb25hbCBwYXJhbXMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZXggPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHtcbiAqICAgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnksXG4gKiAgIGVucmljaFNuYXBzaG90czogdHJ1ZSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogKipTeW5jIG5vdGUgZm9yIG1haW50YWluZXJzOioqIEV2ZXJ5IGZpZWxkIGFkZGVkIGhlcmUgbXVzdCBhbHNvIGFwcGVhciBpbiB0aGVcbiAqIGBmbG93Q2hhcnRBcmdzYCBwcml2YXRlIGZpZWxkIHR5cGUgYW5kIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvblxuICogYmxvY2sgKHRoZSBgZWxzZSBpZmAgYnJhbmNoIHRoYXQgcmVhZHMgZnJvbSBgb3B0c2ApLiBNaXNzaW5nIGFueSBvbmUgb2YgdGhlXG4gKiB0aHJlZSBjYXVzZXMgc2lsZW50IG9taXNzaW9uIOKAlCB0aGUgb3B0aW9uIGlzIGFjY2VwdGVkIGJ1dCBuZXZlciBhcHBsaWVkLlxuICpcbiAqICoqVFNjb3BlIGluZmVyZW5jZSBub3RlOioqIFdoZW4gdXNpbmcgdGhlIG9wdGlvbnMtb2JqZWN0IGZvcm0gd2l0aCBhIGN1c3RvbSBzY29wZSxcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGluZmVyIGBUU2NvcGVgIHRocm91Z2ggdGhlIG9wdGlvbnMgb2JqZWN0LiBQYXNzIHRoZSB0eXBlXG4gKiBleHBsaWNpdGx5OiBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yPFRPdXQsIE15U2NvcGU+KGNoYXJ0LCB7IHNjb3BlRmFjdG9yeSB9KWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZSA9IGFueT4ge1xuICAvLyDilIDilIAgQ29tbW9uIG9wdGlvbnMgKG1vc3QgY2FsbGVycyBuZWVkIG9ubHkgdGhlc2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDdXN0b20gc2NvcGUgZmFjdG9yeS4gRGVmYXVsdHMgdG8gVHlwZWRTY29wZSBvciBTY29wZUZhY2FkZSBhdXRvLWRldGVjdGlvbi4gKi9cbiAgc2NvcGVGYWN0b3J5PzogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gIC8qKlxuICAgKiBBdHRhY2ggYSBwZXItc3RhZ2Ugc2NvcGUgc25hcHNob3QgdG8gZWFjaCBleHRyYWN0b3IgcmVzdWx0LiBXaGVuIGB0cnVlYCwgdGhlXG4gICAqIGV4dHJhY3Rpb24gY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGZ1bGwgc2hhcmVkIHN0YXRlIGF0IHRoZSBwb2ludCB0aGF0IHN0YWdlXG4gICAqIGNvbW1pdHRlZCDigJQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgbXVsdGktc3RhZ2Ugc3RhdGUgdHJhbnNpdGlvbnMuIERlZmF1bHRzIHRvXG4gICAqIGBmYWxzZWAgKG5vIHNjb3BlIHNuYXBzaG90IGF0dGFjaGVkKS4gQ2FuIGFsc28gYmUgc2V0IG9uIHRoZSBjaGFydCB2aWFcbiAgICogYGZsb3dDaGFydCguLi4pLmVucmljaFNuYXBzaG90cyh0cnVlKWAuXG4gICAqL1xuICBlbnJpY2hTbmFwc2hvdHM/OiBib29sZWFuO1xuXG4gIC8vIOKUgOKUgCBDb250ZXh0IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIHByZS1wb3B1bGF0ZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgYmVmb3JlICoqZWFjaCoqIHN0YWdlXG4gICAqIChyZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLCBhY3RpbmcgYXMgYmFzZWxpbmUgZGVmYXVsdHMpLlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAvKipcbiAgICogSW5pdGlhbCBjb250ZXh0IHZhbHVlcyBtZXJnZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgKipvbmNlKiogYXQgc3RhcnR1cFxuICAgKiAoYXBwbGllZCBiZWZvcmUgdGhlIGZpcnN0IHN0YWdlLCBub3QgcmVwZWF0ZWQgb24gc3Vic2VxdWVudCBzdGFnZXMpLlxuICAgKiBEaXN0aW5jdCBmcm9tIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAsIHdoaWNoIGlzIHJlLWFwcGxpZWQgZXZlcnkgc3RhZ2UuXG4gICAqL1xuICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gIC8qKiBSZWFkLW9ubHkgaW5wdXQgYWNjZXNzaWJsZSB2aWEgYHNjb3BlLmdldEFyZ3MoKWAg4oCUIG5ldmVyIHRyYWNrZWQgb3Igd3JpdHRlbi4gKi9cbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcblxuICAvLyDilIDilIAgQWR2YW5jZWQgLyBlc2NhcGUtaGF0Y2ggb3B0aW9ucyAobW9zdCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRoZXNlKSDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIGNsYXNzaWZpZXIgZm9yIHRocm90dGxpbmcgZGV0ZWN0aW9uLiBSZXR1cm4gYHRydWVgIGlmIHRoZVxuICAgKiBlcnJvciByZXByZXNlbnRzIGEgcmF0ZS1saW1pdCBvciBiYWNrcHJlc3N1cmUgY29uZGl0aW9uICh0aGUgZXhlY3V0b3Igd2lsbFxuICAgKiB0cmVhdCBpdCBkaWZmZXJlbnRseSBmcm9tIGhhcmQgZmFpbHVyZXMpLiBEZWZhdWx0cyB0byBubyB0aHJvdHRsaW5nIGNsYXNzaWZpY2F0aW9uLlxuICAgKi9cbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqIEhhbmRsZXJzIGZvciBzdHJlYW1pbmcgc3RhZ2UgbGlmZWN5Y2xlIGV2ZW50cyAoc2VlIGBhZGRTdHJlYW1pbmdGdW5jdGlvbmApLiAqL1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAvKiogU2NvcGUgcHJvdGVjdGlvbiBtb2RlIGZvciBUeXBlZFNjb3BlIGRpcmVjdC1hc3NpZ25tZW50IGRldGVjdGlvbi4gKi9cbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+O1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIOKAlCBzdXJ2aXZlcyBwYXVzZS9yZXN1bWUuIFJlc2V0IG9uIGZyZXNoIHJ1bigpLiAqL1xuICBwcml2YXRlIF9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICBwcml2YXRlIG5hcnJhdGl2ZUVuYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBuYXJyYXRpdmVPcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnM7XG4gIHByaXZhdGUgY29tYmluZWRSZWNvcmRlcjogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmbG93UmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHNjb3BlUmVjb3JkZXJzOiBSZWNvcmRlcltdID0gW107XG4gIHByaXZhdGUgcmVkYWN0aW9uUG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2hhcmVkUmVkYWN0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSBsYXN0Q2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCB8IHVuZGVmaW5lZDtcblxuICAvLyBTWU5DIFJFUVVJUkVEOiBldmVyeSBvcHRpb25hbCBmaWVsZCBoZXJlIG11c3QgbWlycm9yIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uc1xuICAvLyBBTkQgYmUgYXNzaWduZWQgaW4gdGhlIGNvbnN0cnVjdG9yJ3Mgb3B0aW9ucy1yZXNvbHV0aW9uIGJsb2NrICh0aGUgYGVsc2UgaWZgIGJyYW5jaCkuXG4gIC8vIEFkZGluZyBhIGZpZWxkIHRvIG9ubHkgb25lIG9mIHRoZSB0aHJlZSBwbGFjZXMgY2F1c2VzIHNpbGVudCBvbWlzc2lvbi5cbiAgcHJpdmF0ZSByZWFkb25seSBmbG93Q2hhcnRBcmdzOiB7XG4gICAgZmxvd0NoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPjtcbiAgICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0PzogdW5rbm93bjtcbiAgICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gICAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICAgIHN0cmVhbUhhbmRsZXJzPzogU3RyZWFtSGFuZGxlcnM7XG4gICAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gICAgZW5yaWNoU25hcHNob3RzPzogYm9vbGVhbjtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgRmxvd0NoYXJ0RXhlY3V0b3IuXG4gICAqXG4gICAqICoqT3B0aW9ucyBvYmplY3QgZm9ybSoqIChwcmVmZXJyZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGVucmljaFNuYXBzaG90czogdHJ1ZSB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogKioyLXBhcmFtIGZvcm0qKiAoYWxzbyBzdXBwb3J0ZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGZsb3dDaGFydCAtIFRoZSBjb21waWxlZCBGbG93Q2hhcnQgcmV0dXJuZWQgYnkgYGZsb3dDaGFydCguLi4pLmJ1aWxkKClgXG4gICAqIEBwYXJhbSBmYWN0b3J5T3JPcHRpb25zIC0gQSBgU2NvcGVGYWN0b3J5PFRTY29wZT5gIE9SIGEgYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+YCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgZmFjdG9yeU9yT3B0aW9ucz86IFNjb3BlRmFjdG9yeTxUU2NvcGU+IHwgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT4sXG4gICkge1xuICAgIC8vIERldGVjdCBvcHRpb25zLW9iamVjdCBmb3JtIHZzIGZhY3RvcnkgZm9ybVxuICAgIGxldCBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dDogdW5rbm93bjtcbiAgICBsZXQgaW5pdGlhbENvbnRleHQ6IHVua25vd247XG4gICAgbGV0IHJlYWRPbmx5Q29udGV4dDogdW5rbm93bjtcbiAgICBsZXQgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogKChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbUhhbmRsZXJzOiBTdHJlYW1IYW5kbGVycyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc2NvcGVQcm90ZWN0aW9uTW9kZTogU2NvcGVQcm90ZWN0aW9uTW9kZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZW5yaWNoU25hcHNob3RzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBmYWN0b3J5T3JPcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyAyLXBhcmFtIGZvcm06IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgICAgc2NvcGVGYWN0b3J5ID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKGZhY3RvcnlPck9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT3B0aW9ucyBvYmplY3QgZm9ybTogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeSwgZW5yaWNoU25hcHNob3RzLCAuLi4gfSlcbiAgICAgIGNvbnN0IG9wdHMgPSBmYWN0b3J5T3JPcHRpb25zO1xuICAgICAgc2NvcGVGYWN0b3J5ID0gb3B0cy5zY29wZUZhY3Rvcnk7XG4gICAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCA9IG9wdHMuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ7XG4gICAgICBpbml0aWFsQ29udGV4dCA9IG9wdHMuaW5pdGlhbENvbnRleHQ7XG4gICAgICByZWFkT25seUNvbnRleHQgPSBvcHRzLnJlYWRPbmx5Q29udGV4dDtcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIgPSBvcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXI7XG4gICAgICBzdHJlYW1IYW5kbGVycyA9IG9wdHMuc3RyZWFtSGFuZGxlcnM7XG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlID0gb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgICAgZW5yaWNoU25hcHNob3RzID0gb3B0cy5lbnJpY2hTbmFwc2hvdHM7XG4gICAgfVxuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHtcbiAgICAgIGZsb3dDaGFydCxcbiAgICAgIHNjb3BlRmFjdG9yeTogc2NvcGVGYWN0b3J5ID8/IGZsb3dDaGFydC5zY29wZUZhY3RvcnkgPz8gKGRlZmF1bHRTY29wZUZhY3RvcnkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICBpbml0aWFsQ29udGV4dCxcbiAgICAgIHJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBlbnJpY2hTbmFwc2hvdHMsXG4gICAgfTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICByZWFkT25seUNvbnRleHRPdmVycmlkZT86IHVua25vd24sXG4gICAgZW52PzogaW1wb3J0KCcuLi9lbmdpbmUvdHlwZXMnKS5FeGVjdXRpb25FbnYsXG4gICAgbWF4RGVwdGg/OiBudW1iZXIsXG4gICAgb3ZlcnJpZGVzPzoge1xuICAgICAgcm9vdD86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgICAgcHJlc2VydmVSZWNvcmRlcnM/OiBib29sZWFuO1xuICAgICAgZXhpc3RpbmdSdW50aW1lPzogSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPjtcbiAgICB9LFxuICApOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZmxvd0NoYXJ0QXJncztcbiAgICBjb25zdCBmYyA9IGFyZ3MuZmxvd0NoYXJ0O1xuICAgIGNvbnN0IG5hcnJhdGl2ZUZsYWcgPSB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgfHwgKGZjLmVuYWJsZU5hcnJhdGl2ZSA/PyBmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgQ29tcG9zZWQgc2NvcGUgZmFjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBDb2xsZWN0IGFsbCBzY29wZSBtb2RpZmllcnMgKHJlY29yZGVycywgcmVkYWN0aW9uKSBpbnRvIGEgc2luZ2xlIGxpc3QsXG4gICAgLy8gdGhlbiBjcmVhdGUgT05FIGZhY3RvcnkgdGhhdCBhcHBsaWVzIHRoZW0gaW4gYSBsb29wLiBSZXBsYWNlcyB0aGVcbiAgICAvLyBwcmV2aW91cyA0LWRlZXAgY2xvc3VyZSBuZXN0aW5nIHdpdGggYSBmbGF0LCBkZWJ1Z2dhYmxlIGNvbXBvc2l0aW9uLlxuXG4gICAgaWYgKG92ZXJyaWRlcz8ucHJlc2VydmVSZWNvcmRlcnMpIHtcbiAgICAgIC8vIFJlc3VtZSBtb2RlOiBrZWVwIGV4aXN0aW5nIGNvbWJpbmVkUmVjb3JkZXIgc28gbmFycmF0aXZlIGFjY3VtdWxhdGVzXG4gICAgfSBlbHNlIGlmIChuYXJyYXRpdmVGbGFnKSB7XG4gICAgICB0aGlzLmNvbWJpbmVkUmVjb3JkZXIgPSBuZXcgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlcih0aGlzLm5hcnJhdGl2ZU9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbWJpbmVkUmVjb3JkZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFyZWRSZWRhY3RlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgICAvLyBCdWlsZCBtb2RpZmllciBsaXN0IOKAlCBlYWNoIG1vZGlmaWVyIHJlY2VpdmVzIHRoZSBzY29wZSBhZnRlciBjcmVhdGlvblxuICAgIHR5cGUgU2NvcGVNb2RpZmllciA9IChzY29wZTogYW55KSA9PiB2b2lkO1xuICAgIGNvbnN0IG1vZGlmaWVyczogU2NvcGVNb2RpZmllcltdID0gW107XG5cbiAgICAvLyAxLiBOYXJyYXRpdmUgcmVjb3JkZXIgKGlmIGVuYWJsZWQpXG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmNvbWJpbmVkUmVjb3JkZXI7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hSZWNvcmRlciA9PT0gJ2Z1bmN0aW9uJykgc2NvcGUuYXR0YWNoUmVjb3JkZXIocmVjb3JkZXIpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMi4gVXNlci1wcm92aWRlZCBzY29wZSByZWNvcmRlcnNcbiAgICBpZiAodGhpcy5zY29wZVJlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZWNvcmRlcnMgPSB0aGlzLnNjb3BlUmVjb3JkZXJzO1xuICAgICAgbW9kaWZpZXJzLnB1c2goKHNjb3BlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUuYXR0YWNoUmVjb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVjb3JkZXJzKSBzY29wZS5hdHRhY2hSZWNvcmRlcihyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVkYWN0aW9uIHBvbGljeSAoY29uZGl0aW9uYWwg4oCUIG9ubHkgd2hlbiBwb2xpY3kgaXMgc2V0KVxuICAgIGlmICh0aGlzLnJlZGFjdGlvblBvbGljeSkge1xuICAgICAgY29uc3QgcG9saWN5ID0gdGhpcy5yZWRhY3Rpb25Qb2xpY3k7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS51c2VSZWRhY3Rpb25Qb2xpY3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzY29wZS51c2VSZWRhY3Rpb25Qb2xpY3kocG9saWN5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBQcmUtcG9wdWxhdGUgZXhlY3V0b3ItbGV2ZWwgZmllbGQgcmVkYWN0aW9uIG1hcCBmcm9tIHBvbGljeVxuICAgICAgLy8gc28gZ2V0UmVkYWN0aW9uUmVwb3J0KCkgaW5jbHVkZXMgZmllbGQtbGV2ZWwgcmVkYWN0aW9ucy5cbiAgICAgIGlmIChwb2xpY3kuZmllbGRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyhwb2xpY3kuZmllbGRzKSkge1xuICAgICAgICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleS5zZXQoa2V5LCBuZXcgU2V0KGZpZWxkcykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tcG9zZTogYmFzZSBmYWN0b3J5ICsgbW9kaWZpZXJzIGluIGEgc2luZ2xlIHBhc3MuXG4gICAgLy8gU2hhcmVkIHJlZGFjdGVkIGtleXMgYXJlIEFMV0FZUyB3aXJlZCB1cCAodW5jb25kaXRpb25hbCDigJQgZW5zdXJlcyBjcm9zcy1zdGFnZVxuICAgIC8vIHByb3BhZ2F0aW9uIGV2ZW4gd2l0aG91dCBhIHBvbGljeSwgYmVjYXVzZSBzdGFnZXMgY2FuIGNhbGwgc2V0VmFsdWUoa2V5LCB2YWwsIHRydWUpXG4gICAgLy8gZm9yIHBlci1jYWxsIHJlZGFjdGlvbikuIE9wdGlvbmFsIG1vZGlmaWVycyAocmVjb3JkZXJzLCBwb2xpY3kpIGFyZSBpbiB0aGUgbGlzdC5cbiAgICBjb25zdCBiYXNlRmFjdG9yeSA9IGFyZ3Muc2NvcGVGYWN0b3J5O1xuICAgIGNvbnN0IHNoYXJlZFJlZGFjdGVkS2V5cyA9IHRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzO1xuICAgIGNvbnN0IHNjb3BlRmFjdG9yeSA9ICgoY3R4OiBhbnksIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seT86IHVua25vd24sIGVudkFyZz86IGFueSkgPT4ge1xuICAgICAgY29uc3Qgc2NvcGUgPSBiYXNlRmFjdG9yeShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudkFyZyk7XG4gICAgICAvLyBBbHdheXMgd2lyZSBzaGFyZWQgcmVkYWN0aW9uIHN0YXRlXG4gICAgICBpZiAodHlwZW9mIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAoc2NvcGUgYXMgYW55KS51c2VTaGFyZWRSZWRhY3RlZEtleXMoc2hhcmVkUmVkYWN0ZWRLZXlzKTtcbiAgICAgIH1cbiAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIG1vZGlmaWVyc1xuICAgICAgZm9yIChjb25zdCBtb2Qgb2YgbW9kaWZpZXJzKSBtb2Qoc2NvcGUpO1xuICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH0pIGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gICAgY29uc3QgZWZmZWN0aXZlUm9vdCA9IG92ZXJyaWRlcz8ucm9vdCA/PyBmYy5yb290O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0ID0gb3ZlcnJpZGVzPy5pbml0aWFsQ29udGV4dCA/PyBhcmdzLmluaXRpYWxDb250ZXh0O1xuXG4gICAgbGV0IHJ1bnRpbWU6IEV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgaWYgKG92ZXJyaWRlcz8uZXhpc3RpbmdSdW50aW1lKSB7XG4gICAgICAvLyBSZXN1bWUgbW9kZTogcmV1c2UgZXhpc3RpbmcgcnVudGltZSBzbyBleGVjdXRpb24gdHJlZSBjb250aW51ZXMgZnJvbSBwYXVzZSBwb2ludC5cbiAgICAgIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCByb290IGZvciBnZXRTbmFwc2hvdCgpIChmdWxsIHRyZWUpLCB0aGVuIGFkdmFuY2VcbiAgICAgIC8vIHJvb3RTdGFnZUNvbnRleHQgdG8gYSBjb250aW51YXRpb24gZnJvbSB0aGUgbGVhZiAoZm9yIHRyYXZlcnNhbCkuXG4gICAgICBydW50aW1lID0gb3ZlcnJpZGVzLmV4aXN0aW5nUnVudGltZTtcbiAgICAgIHJ1bnRpbWUucHJlc2VydmVTbmFwc2hvdFJvb3QoKTtcbiAgICAgIGxldCBsZWFmID0gcnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuICAgICAgd2hpbGUgKGxlYWYubmV4dCkgbGVhZiA9IGxlYWYubmV4dDtcbiAgICAgIHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IGxlYWYuY3JlYXRlTmV4dCgnJywgZWZmZWN0aXZlUm9vdC5uYW1lLCBlZmZlY3RpdmVSb290LmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lKFxuICAgICAgICBlZmZlY3RpdmVSb290Lm5hbWUsXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QuaWQsXG4gICAgICAgIGFyZ3MuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICAgIGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgIHJvb3Q6IGVmZmVjdGl2ZVJvb3QsXG4gICAgICBzdGFnZU1hcDogZmMuc3RhZ2VNYXAsXG4gICAgICBzY29wZUZhY3RvcnksXG4gICAgICBleGVjdXRpb25SdW50aW1lOiBydW50aW1lLFxuICAgICAgcmVhZE9ubHlDb250ZXh0OiByZWFkT25seUNvbnRleHRPdmVycmlkZSA/PyBhcmdzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IGFyZ3MudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBhcmdzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgZXh0cmFjdG9yOiBmYy5leHRyYWN0b3IsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBhcmdzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgICBlbnJpY2hTbmFwc2hvdHM6IGFyZ3MuZW5yaWNoU25hcHNob3RzID8/IGZjLmVucmljaFNuYXBzaG90cyxcbiAgICAgIG5hcnJhdGl2ZUVuYWJsZWQ6IG5hcnJhdGl2ZUZsYWcsXG4gICAgICBidWlsZFRpbWVTdHJ1Y3R1cmU6IGZjLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgIGxvZ2dlcjogZmMubG9nZ2VyID8/IGRlZmF1bHRMb2dnZXIsXG4gICAgICBzaWduYWwsXG4gICAgICBleGVjdXRpb25FbnY6IGVudixcbiAgICAgIGZsb3dSZWNvcmRlcnM6IHRoaXMuYnVpbGRGbG93UmVjb3JkZXJzTGlzdCgpLFxuICAgICAgZXhlY3V0aW9uQ291bnRlcjogdGhpcy5fZXhlY3V0aW9uQ291bnRlcixcbiAgICAgIC4uLihtYXhEZXB0aCAhPT0gdW5kZWZpbmVkICYmIHsgbWF4RGVwdGggfSksXG4gICAgfSk7XG4gIH1cblxuICBlbmFibGVOYXJyYXRpdmUob3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5uYXJyYXRpdmVFbmFibGVkID0gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucykgdGhpcy5uYXJyYXRpdmVPcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBkZWNsYXJhdGl2ZSByZWRhY3Rpb24gcG9saWN5IHRoYXQgYXBwbGllcyB0byBhbGwgc3RhZ2VzLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuXG4gICAqL1xuICBzZXRSZWRhY3Rpb25Qb2xpY3kocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnJlZGFjdGlvblBvbGljeSA9IHBvbGljeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eSBmcm9tIHRoZVxuICAgKiBtb3N0IHJlY2VudCBydW4uIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICBjb25zdCBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiB0aGlzLnNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkpIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9uc1trZXldID0gWy4uLmZpZWxkc107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZWRhY3RlZEtleXM6IFsuLi50aGlzLnNoYXJlZFJlZGFjdGVkS2V5c10sXG4gICAgICBmaWVsZFJlZGFjdGlvbnMsXG4gICAgICBwYXR0ZXJuczogKHRoaXMucmVkYWN0aW9uUG9saWN5Py5wYXR0ZXJucyA/PyBbXSkubWFwKChwKSA9PiBwLnNvdXJjZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQYXVzZS9SZXN1bWUg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNoZWNrcG9pbnQgZnJvbSB0aGUgbW9zdCByZWNlbnQgcGF1c2VkIGV4ZWN1dGlvbiwgb3IgYHVuZGVmaW5lZGBcbiAgICogaWYgdGhlIGxhc3QgcnVuIGNvbXBsZXRlZCB3aXRob3V0IHBhdXNpbmcuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGlzIEpTT04tc2VyaWFsaXphYmxlIOKAlCBzdG9yZSBpdCBpbiBSZWRpcywgUG9zdGdyZXMsIGxvY2FsU3RvcmFnZSwgZXRjLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICAgKiBpZiAoZXhlY3V0b3IuaXNQYXVzZWQoKSkge1xuICAgKiAgIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiAgIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGdldENoZWNrcG9pbnQoKTogRmxvd2NoYXJ0Q2hlY2twb2ludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQ7XG4gIH1cblxuICAvKiogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1vc3QgcmVjZW50IHJ1bigpIHdhcyBwYXVzZWQgKGNoZWNrcG9pbnQgYXZhaWxhYmxlKS4gKi9cbiAgaXNQYXVzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0IGZyb20gYSBjaGVja3BvaW50LlxuICAgKlxuICAgKiBSZXN0b3JlcyB0aGUgc2NvcGUgc3RhdGUsIGNhbGxzIHRoZSBwYXVzZWQgc3RhZ2UncyBgcmVzdW1lRm5gIHdpdGggdGhlXG4gICAqIHByb3ZpZGVkIGlucHV0LCB0aGVuIGNvbnRpbnVlcyB0cmF2ZXJzYWwgZnJvbSB0aGUgbmV4dCBzdGFnZS5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgY2FuIGNvbWUgZnJvbSBgZ2V0Q2hlY2twb2ludCgpYCBvbiBhIHByZXZpb3VzIHJ1biwgb3IgZnJvbVxuICAgKiBhIHNlcmlhbGl6ZWQgY2hlY2twb2ludCBzdG9yZWQgaW4gUmVkaXMvUG9zdGdyZXMvbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiAqKk5hcnJhdGl2ZS9yZWNvcmRlciBzdGF0ZSBpcyByZXNldCBvbiByZXN1bWUuKiogVG8ga2VlcCBhIHVuaWZpZWQgbmFycmF0aXZlXG4gICAqIGFjcm9zcyBwYXVzZS9yZXN1bWUgY3ljbGVzLCBjb2xsZWN0IGl0IGJlZm9yZSBjYWxsaW5nIHJlc3VtZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBBZnRlciBhIHBhdXNlLi4uXG4gICAqIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqXG4gICAqIC8vIExhdGVyIChwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyLCBzYW1lIGNoYXJ0KVxuICAgKiBjb25zdCBjaGVja3BvaW50ID0gSlNPTi5wYXJzZShhd2FpdCByZWRpcy5nZXQoYHNlc3Npb246JHtpZH1gKSk7XG4gICAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucmVzdW1lKGNoZWNrcG9pbnQsIHsgYXBwcm92ZWQ6IHRydWUgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzdW1lKFxuICAgIGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQsXG4gICAgcmVzdW1lSW5wdXQ/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQaWNrPFJ1bk9wdGlvbnMsICdzaWduYWwnIHwgJ2VudicgfCAnbWF4RGVwdGgnPixcbiAgKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyDilIDilIAgVmFsaWRhdGUgY2hlY2twb2ludCBzdHJ1Y3R1cmUgKG1heSBjb21lIGZyb20gdW50cnVzdGVkIGV4dGVybmFsIHN0b3JhZ2UpIOKUgOKUgFxuICAgIGlmIChcbiAgICAgICFjaGVja3BvaW50IHx8XG4gICAgICB0eXBlb2YgY2hlY2twb2ludCAhPT0gJ29iamVjdCcgfHxcbiAgICAgIHR5cGVvZiBjaGVja3BvaW50LnNoYXJlZFN0YXRlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgY2hlY2twb2ludC5zaGFyZWRTdGF0ZSA9PT0gbnVsbCB8fFxuICAgICAgQXJyYXkuaXNBcnJheShjaGVja3BvaW50LnNoYXJlZFN0YXRlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHNoYXJlZFN0YXRlIG11c3QgYmUgYSBwbGFpbiBvYmplY3QuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkICE9PSAnc3RyaW5nJyB8fCBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogcGF1c2VkU3RhZ2VJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoY2hlY2twb2ludC5zdWJmbG93UGF0aCkgfHxcbiAgICAgICFjaGVja3BvaW50LnN1YmZsb3dQYXRoLmV2ZXJ5KChzOiB1bmtub3duKSA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogc3ViZmxvd1BhdGggbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHBhdXNlZCBub2RlIGluIHRoZSBncmFwaFxuICAgIGNvbnN0IHBhdXNlZE5vZGUgPSB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpO1xuICAgIGlmICghcGF1c2VkTm9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7Y2hlY2twb2ludC5wYXVzZWRTdGFnZUlkfScgbm90IGZvdW5kIGluIGZsb3djaGFydC4gYCArXG4gICAgICAgICAgJ1RoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXBhdXNlZE5vZGUucmVzdW1lRm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBoYXMgbm8gcmVzdW1lRm4uIGAgK1xuICAgICAgICAgICdPbmx5IHN0YWdlcyBjcmVhdGVkIHdpdGggYWRkUGF1c2FibGVGdW5jdGlvbigpIGNhbiBiZSByZXN1bWVkLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGEgc3ludGhldGljIHJlc3VtZSBub2RlOiBjYWxscyByZXN1bWVGbiB3aXRoIHJlc3VtZUlucHV0LCB0aGVuIGNvbnRpbnVlcy5cbiAgICAvLyByZXN1bWVGbiBzaWduYXR1cmUgaXMgKHNjb3BlLCBpbnB1dCkgcGVyIFBhdXNhYmxlSGFuZGxlciDigJQgd3JhcCB0byBtYXRjaCBTdGFnZUZ1bmN0aW9uKHNjb3BlLCBicmVha0ZuKS5cbiAgICBjb25zdCByZXN1bWVGbiA9IHBhdXNlZE5vZGUucmVzdW1lRm47XG4gICAgY29uc3QgcmVzdW1lU3RhZ2VGbiA9IChzY29wZTogVFNjb3BlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzdW1lRm4oc2NvcGUsIHJlc3VtZUlucHV0KTtcbiAgICB9O1xuXG4gICAgLy8gRGV0ZXJtaW5lIGNvbnRpbnVhdGlvbjogZm9yIGJyYW5jaCBjaGlsZHJlbiAoZGVjaWRlci9zZWxlY3RvciksIHBhdXNlZE5vZGUubmV4dFxuICAgIC8vIGlzIHVuZGVmaW5lZC4gVGhlIGNoZWNrcG9pbnQncyBjb250aW51YXRpb25TdGFnZUlkIChjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbFxuICAgIC8vIGJ1YmJsZS11cCkgcG9pbnRzIHRvIHRoZSBpbnZva2VyJ3MgbmV4dCBub2RlLlxuICAgIGxldCBjb250aW51YXRpb25OZXh0ID0gcGF1c2VkTm9kZS5uZXh0O1xuICAgIGlmICghY29udGludWF0aW9uTmV4dCAmJiBjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQpIHtcbiAgICAgIGNvbnRpbnVhdGlvbk5leHQgPSB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIFtdKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bWVOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIGlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgZGVzY3JpcHRpb246IHBhdXNlZE5vZGUuZGVzY3JpcHRpb24sXG4gICAgICBmbjogcmVzdW1lU3RhZ2VGbixcbiAgICAgIG5leHQ6IGNvbnRpbnVhdGlvbk5leHQsXG4gICAgfTtcblxuICAgIC8vIERvbid0IGNsZWFyIHJlY29yZGVycyDigJQgcmVzdW1lIGNvbnRpbnVlcyBmcm9tIHByZXZpb3VzIHN0YXRlLlxuICAgIC8vIE5hcnJhdGl2ZSwgbWV0cmljcywgZGVidWcgZW50cmllcyBhY2N1bXVsYXRlIGFjcm9zcyBwYXVzZS9yZXN1bWUuXG5cbiAgICAvLyBSZXVzZSB0aGUgZXhpc3RpbmcgcnVudGltZSBzbyB0aGUgZXhlY3V0aW9uIHRyZWUgY29udGludWVzIGZyb20gdGhlIHBhdXNlIHBvaW50LlxuICAgIC8vIHByZXNlcnZlUmVjb3JkZXJzIGtlZXBzIHRoZSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIHNvIG5hcnJhdGl2ZSBhY2N1bXVsYXRlcy5cbiAgICBjb25zdCBleGlzdGluZ1J1bnRpbWUgPSB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPjtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKG9wdGlvbnM/LnNpZ25hbCwgdW5kZWZpbmVkLCBvcHRpb25zPy5lbnYsIG9wdGlvbnM/Lm1heERlcHRoLCB7XG4gICAgICByb290OiByZXN1bWVOb2RlLFxuICAgICAgaW5pdGlhbENvbnRleHQ6IGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUsXG4gICAgICBwcmVzZXJ2ZVJlY29yZGVyczogdHJ1ZSxcbiAgICAgIGV4aXN0aW5nUnVudGltZSxcbiAgICB9KTtcblxuICAgIC8vIEZpcmUgb25SZXN1bWUgZXZlbnQgb24gYWxsIHJlY29yZGVycyAoZmxvdyArIHNjb3BlKVxuICAgIGNvbnN0IGhhc0lucHV0ID0gcmVzdW1lSW5wdXQgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBmbG93UmVzdW1lRXZlbnQgPSB7XG4gICAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBoYXNJbnB1dCxcbiAgICB9O1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHRoaXMuY29tYmluZWRSZWNvcmRlci5vblJlc3VtZShmbG93UmVzdW1lRXZlbnQpO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHIub25SZXN1bWU/LihmbG93UmVzdW1lRXZlbnQpO1xuXG4gICAgY29uc3Qgc2NvcGVSZXN1bWVFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhdXNlZE5vZGUuaWQsIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUpLFxuICAgICAgaGFzSW5wdXQsXG4gICAgICBwaXBlbGluZUlkOiAnJyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlUmVjb3JkZXJzKSByLm9uUmVzdW1lPy4oc2NvcGVSZXN1bWVFdmVudCk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3QoKTtcbiAgICAgICAgY29uc3Qgc2ZSZXN1bHRzID0gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHtcbiAgICAgICAgICBzaGFyZWRTdGF0ZTogc25hcHNob3Quc2hhcmVkU3RhdGUsXG4gICAgICAgICAgZXhlY3V0aW9uVHJlZTogc25hcHNob3QuZXhlY3V0aW9uVHJlZSxcbiAgICAgICAgICBwYXVzZWRTdGFnZUlkOiBlcnJvci5zdGFnZUlkLFxuICAgICAgICAgIHN1YmZsb3dQYXRoOiBlcnJvci5zdWJmbG93UGF0aCxcbiAgICAgICAgICBwYXVzZURhdGE6IGVycm9yLnBhdXNlRGF0YSxcbiAgICAgICAgICAuLi4oc2ZSZXN1bHRzLnNpemUgPiAwICYmIHsgc3ViZmxvd1Jlc3VsdHM6IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpIH0pLFxuICAgICAgICAgIC4uLihlcnJvci5pbnZva2VyU3RhZ2VJZCAmJiB7IGludm9rZXJTdGFnZUlkOiBlcnJvci5pbnZva2VyU3RhZ2VJZCB9KSxcbiAgICAgICAgICAuLi4oZXJyb3IuY29udGludWF0aW9uU3RhZ2VJZCAmJiB7IGNvbnRpbnVhdGlvblN0YWdlSWQ6IGVycm9yLmNvbnRpbnVhdGlvblN0YWdlSWQgfSksXG4gICAgICAgICAgcGF1c2VkQXQ6IERhdGUubm93KCksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIFN0YWdlTm9kZSBpbiB0aGUgY29tcGlsZWQgZ3JhcGggYnkgSUQuXG4gICAqIEhhbmRsZXMgc3ViZmxvdyBwYXRocyBieSBkcmlsbGluZyBpbnRvIHJlZ2lzdGVyZWQgc3ViZmxvd3MuXG4gICAqL1xuICBwcml2YXRlIGZpbmROb2RlSW5HcmFwaChzdGFnZUlkOiBzdHJpbmcsIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmYyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQ7XG5cbiAgICBpZiAoc3ViZmxvd1BhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUb3AtbGV2ZWw6IERGUyBmcm9tIHJvb3RcbiAgICAgIHJldHVybiB0aGlzLmRmc0ZpbmQoZmMucm9vdCwgc3RhZ2VJZCk7XG4gICAgfVxuXG4gICAgLy8gU3ViZmxvdzogZHJpbGwgaW50byB0aGUgc3ViZmxvdyBjaGFpbiwgdGhlbiBzZWFyY2ggZnJvbSB0aGUgbGFzdCBzdWJmbG93J3Mgcm9vdFxuICAgIGxldCBzdWJmbG93Um9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBzZklkIG9mIHN1YmZsb3dQYXRoKSB7XG4gICAgICBjb25zdCBzdWJmbG93ID0gZmMuc3ViZmxvd3M/LltzZklkXTtcbiAgICAgIGlmICghc3ViZmxvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHN1YmZsb3dSb290ID0gc3ViZmxvdy5yb290O1xuICAgIH1cbiAgICBpZiAoIXN1YmZsb3dSb290KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmRmc0ZpbmQoc3ViZmxvd1Jvb3QsIHN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIERGUyBzZWFyY2ggZm9yIGEgbm9kZSBieSBJRCBpbiB0aGUgU3RhZ2VOb2RlIGdyYXBoLiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gKi9cbiAgcHJpdmF0ZSBkZnNGaW5kKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHRhcmdldElkOiBzdHJpbmcsXG4gICAgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgLy8gU2tpcCBsb29wIGJhY2stZWRnZSByZWZlcmVuY2VzICh0aGV5IHNoYXJlIHRoZSB0YXJnZXQncyBJRCBidXQgaGF2ZSBubyBmbi9yZXN1bWVGbilcbiAgICBpZiAobm9kZS5pc0xvb3BSZWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZpc2l0ZWQuYWRkKG5vZGUuaWQpO1xuICAgIGlmIChub2RlLmlkID09PSB0YXJnZXRJZCkgcmV0dXJuIG5vZGU7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZGZzRmluZChjaGlsZCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vZGUubmV4dCkgcmV0dXJuIHRoaXMuZGZzRmluZChub2RlLm5leHQsIHRhcmdldElkLCB2aXNpdGVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHNjb3BlIFJlY29yZGVyIHRvIG9ic2VydmUgZGF0YSBvcGVyYXRpb25zIChyZWFkcywgd3JpdGVzLCBjb21taXRzKS5cbiAgICogQXV0b21hdGljYWxseSBhdHRhY2hlZCB0byBldmVyeSBTY29wZUZhY2FkZSBjcmVhdGVkIGR1cmluZyB0cmF2ZXJzYWwuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IElEOioqIElmIGEgcmVjb3JkZXIgd2l0aCB0aGUgc2FtZSBgaWRgIGlzIGFscmVhZHkgYXR0YWNoZWQsXG4gICAqIGl0IGlzIHJlcGxhY2VkIChub3QgZHVwbGljYXRlZCkuIFRoaXMgcHJldmVudHMgZG91YmxlLWNvdW50aW5nIHdoZW4gYm90aFxuICAgKiBhIGZyYW1ld29yayBhbmQgdGhlIHVzZXIgYXR0YWNoIHRoZSBzYW1lIHJlY29yZGVyIHR5cGUuXG4gICAqXG4gICAqIEJ1aWx0LWluIHJlY29yZGVycyB1c2UgYXV0by1pbmNyZW1lbnQgSURzIChgbWV0cmljcy0xYCwgYGRlYnVnLTFgLCAuLi4pIGJ5XG4gICAqIGRlZmF1bHQsIHNvIG11bHRpcGxlIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25maWdzIGNvZXhpc3QuIFRvIG92ZXJyaWRlXG4gICAqIGEgZnJhbWV3b3JrLWF0dGFjaGVkIHJlY29yZGVyLCBwYXNzIHRoZSBzYW1lIHdlbGwta25vd24gSUQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gTXVsdGlwbGUgcmVjb3JkZXJzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3Mg4oCUIGVhY2ggZ2V0cyBhIHVuaXF1ZSBJRFxuICAgKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFJlY29yZGVyKG5ldyBEZWJ1Z1JlY29yZGVyKHsgdmVyYm9zaXR5OiAnbWluaW1hbCcgfSkpO1xuICAgKlxuICAgKiAvLyBPdmVycmlkZSBhIGZyYW1ld29yay1hdHRhY2hlZCByZWNvcmRlciBieSBwYXNzaW5nIGl0cyB3ZWxsLWtub3duIElEXG4gICAqIGV4ZWN1dG9yLmF0dGFjaFJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbWV0cmljcycpKTtcbiAgICpcbiAgICogLy8gQXR0YWNoaW5nIHR3aWNlIHdpdGggc2FtZSBJRCByZXBsYWNlcyAobm8gZG91YmxlLWNvdW50aW5nKVxuICAgKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbXktbWV0cmljcycpKTsgLy8gcmVwbGFjZXMgcHJldmlvdXNcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hSZWNvcmRlcihyZWNvcmRlcjogUmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMgPSB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBzY29wZSBSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgc2NvcGUgUmVjb3JkZXJzLiAqL1xuICBnZXRSZWNvcmRlcnMoKTogUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnNjb3BlUmVjb3JkZXJzXTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBGbG93UmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgRmxvd1JlY29yZGVyIHRvIG9ic2VydmUgY29udHJvbCBmbG93IGV2ZW50cy5cbiAgICogQXV0b21hdGljYWxseSBlbmFibGVzIG5hcnJhdGl2ZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkg4oCUIHJlY29yZGVycyBhcmUgcGFzc2VkIHRvIHRoZSB0cmF2ZXJzZXIgYXQgY3JlYXRpb24gdGltZS5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IElEOioqIHJlcGxhY2VzIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBgaWRgLlxuICAgKi9cbiAgYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyOiBGbG93UmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuZmxvd1JlY29yZGVycyA9IHRoaXMuZmxvd1JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gICAgdGhpcy5uYXJyYXRpdmVFbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaEZsb3dSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBGbG93UmVjb3JkZXJzLiAqL1xuICBnZXRGbG93UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmxvd1JlY29yZGVyc107XG4gIH1cblxuICAvLyDilIDilIDilIAgQ29tYmluZWQgUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgcmVjb3JkZXIgdGhhdCBtYXkgb2JzZXJ2ZSBtdWx0aXBsZSBldmVudCBzdHJlYW1zIChzY29wZVxuICAgKiBkYXRhLWZsb3csIGNvbnRyb2wtZmxvdywgb3IgYm90aCkuIERldGVjdHMgYXQgcnVudGltZSB3aGljaCBzdHJlYW1zIHRoZVxuICAgKiByZWNvcmRlciBoYXMgbWV0aG9kcyBmb3IgYW5kIHJvdXRlcyBpdCB0byB0aGUgY29ycmVjdCBpbnRlcm5hbCBjaGFubmVscy5cbiAgICpcbiAgICogUHJlZmVycmVkIG92ZXIgY2FsbGluZyBgYXR0YWNoUmVjb3JkZXJgIGFuZCBgYXR0YWNoRmxvd1JlY29yZGVyYFxuICAgKiBzZXBhcmF0ZWx5LCBiZWNhdXNlIGZvcmdldHRpbmcgb25lIG9mIHRoZSB0d28gaXMgYSBzaWxlbnQgZm9vdC1ndW4g4oCUXG4gICAqIGhhbGYgeW91ciBldmVudHMgbmV2ZXIgZmlyZSBhbmQgdGhlcmUgaXMgbm8gcnVudGltZSB3YXJuaW5nLiBXaXRoXG4gICAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCB0aGUgbGlicmFyeSBndWFyYW50ZWVzIHRoZSByZWNvcmRlcidzIGRlY2xhcmVkXG4gICAqIG1ldGhvZHMgYWxsIGZpcmUsIGFuZCBhZGRzIG5vIG92ZXJoZWFkIHZlcnN1cyB0d28gZXhwbGljaXQgY2FsbHMuXG4gICAqXG4gICAqICMjIElkZW1wb3RlbmN5XG4gICAqXG4gICAqIElkZW1wb3RlbnQgYnkgYGlkYCBhY3Jvc3MgQUxMIGNoYW5uZWxzIOKAlCByZS1hdHRhY2hpbmcgd2l0aCB0aGUgc2FtZSBgaWRgXG4gICAqIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBldmVyeXdoZXJlIGl0IHdhcyByZWdpc3RlcmVkLiBNaXhpbmdcbiAgICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXIoeClgIHdpdGggYSBwcmlvciBgYXR0YWNoUmVjb3JkZXIoeSlgIG9yXG4gICAqIGBhdHRhY2hGbG93UmVjb3JkZXIoeSlgIHRoYXQgc2hhcmUgYHguaWQgPT09IHkuaWRgIGlzIGFsc28gc2FmZTogdGhlXG4gICAqIGNvbWJpbmVkIGF0dGFjaCByZXBsYWNlcyB0aGUgc2luZ2xlLWNoYW5uZWwgcmVnaXN0cmF0aW9uIG9uIHdoaWNoZXZlclxuICAgKiBjaGFubmVsKHMpIGB4YCBoYXMgbWV0aG9kcyBmb3IuIE5vIGR1cGxpY2F0ZSBmaXJpbmdzIG9jY3VyLlxuICAgKlxuICAgKiAjIyBOYXJyYXRpdmUgYWN0aXZhdGlvblxuICAgKlxuICAgKiBJZiB0aGUgcmVjb3JkZXIgaGFzIGFueSBjb250cm9sLWZsb3cgbWV0aG9kcywgYGVuYWJsZU5hcnJhdGl2ZSgpYCBpc1xuICAgKiBjYWxsZWQgYXMgYSBzaWRlIGVmZmVjdCAodGhlIG5hcnJhdGl2ZSBzdWJzeXN0ZW0gaXMgcmVxdWlyZWQgdG8gZW1pdFxuICAgKiBjb250cm9sLWZsb3cgZXZlbnRzKS4gRGF0YS1mbG93LW9ubHkgcmVjb3JkZXJzIGRvIE5PVCBhY3RpdmF0ZSB0aGVcbiAgICogbmFycmF0aXZlLlxuICAgKlxuICAgKiAjIyBEZXRlY3Rpb24gcnVsZVxuICAgKlxuICAgKiBPbmx5ICoqb3duKiogZXZlbnQgbWV0aG9kcyBjb3VudCAoc2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgKS4gTWV0aG9kc1xuICAgKiBpbmhlcml0ZWQgdmlhIHRoZSBwcm90b3R5cGUgY2hhaW4gYXJlIGlnbm9yZWQg4oCUIHRoaXMgcHJvdGVjdHMgYWdhaW5zdFxuICAgKiBhY2NpZGVudGFsIGBPYmplY3QucHJvdG90eXBlYCBwb2xsdXRpb24gYXR0YWNoaW5nIGhhbmRsZXJzIHlvdSBuZXZlclxuICAgKiBkZWNsYXJlZC4gQSByZWNvcmRlciB0aGF0IHByb3ZpZGVzIG9ubHkgYGNsZWFyYC9gdG9TbmFwc2hvdGAgaXMgYVxuICAgKiBuby1vcCBhbmQgZW1pdHMgYSBkZXYtbW9kZSB3YXJuaW5nIHRvIHN1cmZhY2UgdGhlIGxpa2VseSBtaXN0YWtlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgKiAgIGlkOiAnYXVkaXQnLFxuICAgKiAgIG9uV3JpdGU6IChlKSA9PiBsb2coJ3Njb3BlIHdyaXRlJywgZS5rZXkpLFxuICAgKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2coJ3JvdXRlZCB0bycsIGUuY2hvc2VuKSxcbiAgICogfTtcbiAgICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihhdWRpdCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcjogQ29tYmluZWRSZWNvcmRlcik6IHZvaWQge1xuICAgIGNvbnN0IGhhc0RhdGEgPSBoYXNSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuICAgIGNvbnN0IGhhc0Zsb3cgPSBoYXNGbG93UmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcbiAgICBjb25zdCBoYXNFbWl0ID0gaGFzRW1pdFJlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG5cbiAgICAvLyBFbWl0IHJlY29yZGVycyBsaXZlIG9uIHRoZSBTQU1FIGNoYW5uZWwgYXMgZGF0YS1mbG93IHJlY29yZGVyc1xuICAgIC8vIChTY29wZUZhY2FkZSBpdGVyYXRlcyBgX3JlY29yZGVyc2AgZm9yIG9uRW1pdCBkaXNwYXRjaCkuIFNvXG4gICAgLy8gYXR0YWNoRW1pdFJlY29yZGVyIGludGVybmFsbHkgY2FsbHMgYXR0YWNoUmVjb3JkZXIg4oCUIGJ1dCB3ZSB3YW50IHRvXG4gICAgLy8gYXZvaWQgZG91YmxlLWF0dGFjaCB3aGVuIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIEJPVEggb25FbWl0IEFORFxuICAgIC8vIG90aGVyIFJlY29yZGVyIG1ldGhvZHMuIFNob3J0LWNpcmN1aXQ6IGlmIGhhc0RhdGEgT1IgaGFzRW1pdCwgdGhlXG4gICAgLy8gcmVjb3JkZXIgbGFuZHMgb24gdGhlIHNjb3BlLXJlY29yZGVyIGxpc3QgZXhhY3RseSBvbmNlLlxuICAgIGlmIChoYXNEYXRhIHx8IGhhc0VtaXQpIHRoaXMuYXR0YWNoUmVjb3JkZXIocmVjb3JkZXIgYXMgUmVjb3JkZXIpO1xuICAgIGlmIChoYXNGbG93KSB0aGlzLmF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlciBhcyBGbG93UmVjb3JkZXIpO1xuXG4gICAgaWYgKCFoYXNEYXRhICYmICFoYXNGbG93ICYmICFoYXNFbWl0ICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBEZXYtbW9kZSBvbmx5OiBzaWxlbnQgc2tpcHMgYXJlIGludmlzaWJsZSBhbmQgcHJvZHVjZSBoYXJkLXRvLWRlYnVnXG4gICAgICAvLyBcIndoeSBkaWRuJ3QgbXkgcmVjb3JkZXIgZmlyZVwiIHJlcG9ydHMuIFBlciBsaWJyYXJ5IGNvbnZlbnRpb24sIGdhdGVkXG4gICAgICAvLyBvbiB0aGUgY2VudHJhbCBpc0Rldk1vZGUoKSBmbGFnIChub3QgcHJvY2Vzcy5lbnYpIHNvIGNvbnN1bWVycyBjYW5cbiAgICAgIC8vIGNvbnRyb2wgZGV2IHRvb2xpbmcgY2VudHJhbGx5IHZpYSBlbmFibGVEZXZNb2RlKCkvZGlzYWJsZURldk1vZGUoKS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50anNdIGF0dGFjaENvbWJpbmVkUmVjb3JkZXI6IHJlY29yZGVyICcke3JlY29yZGVyLmlkfScgaGFzIGAgK1xuICAgICAgICAgICdubyBvYnNlcnZlciBldmVudCBtZXRob2RzIOKAlCBub3RoaW5nIHRvIGF0dGFjaC4gRGlkIHlvdSBmb3JnZXQgdG8gJyArXG4gICAgICAgICAgJ2FkZCBhbiBvbiogaGFuZGxlciAob25Xcml0ZSwgb25EZWNpc2lvbiwgb25TdWJmbG93RW50cnksIC4uLik/ICcgK1xuICAgICAgICAgICdOb3RlOiBvbmx5IE9XTiBwcm9wZXJ0aWVzIGNvdW50OyBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUgY2hhaW4gJyArXG4gICAgICAgICAgJ2FyZSBpZ25vcmVkIG9uIHB1cnBvc2UuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNvbWJpbmVkIHJlY29yZGVyIGZyb20gYWxsIGNoYW5uZWxzIGl0IHdhcyBhdHRhY2hlZCB0by5cbiAgICogU2FmZSB0byBjYWxsIGlmIHRoZSByZWNvcmRlciB3YXMgb25seSBvbiBvbmUgY2hhbm5lbCBvciBuZXZlciBhdHRhY2hlZC5cbiAgICovXG4gIGRldGFjaENvbWJpbmVkUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoUmVjb3JkZXIoaWQpO1xuICAgIHRoaXMuZGV0YWNoRmxvd1JlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBFbWl0IFJlY29yZGVyIE1hbmFnZW1lbnQgKFBoYXNlIDMpIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYW4gYEVtaXRSZWNvcmRlcmAg4oCUIGFuIG9ic2VydmVyIGZvciBjb25zdW1lci1lbWl0dGVkIHN0cnVjdHVyZWRcbiAgICogZXZlbnRzIGZpcmVkIHZpYSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgLlxuICAgKlxuICAgKiBJbnRlcm5hbGx5LCBlbWl0IHJlY29yZGVycyBzaGFyZSB0aGUgc2NvcGUtcmVjb3JkZXIgY2hhbm5lbCBiZWNhdXNlXG4gICAqIGVtaXQgZXZlbnRzIGZpcmUgZnJvbSBpbnNpZGUgYFNjb3BlRmFjYWRlYCBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uLFxuICAgKiBzYW1lIHRpbWluZyBhcyBgb25SZWFkYC9gb25Xcml0ZWAuIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgdGhhdFxuICAgKiBkZWxlZ2F0ZXMgdG8gYGF0dGFjaFJlY29yZGVyYCDigJQgY29uc3VtZXJzIGNhbiBhbHNvIHVzZVxuICAgKiBgYXR0YWNoUmVjb3JkZXJgIGRpcmVjdGx5IGZvciBhIHJlY29yZGVyIHRoYXQgaW1wbGVtZW50cyBCT1RIXG4gICAqIGBvbldyaXRlYCBhbmQgYG9uRW1pdGAuIEVpdGhlciBhcHByb2FjaCBwbGFjZXMgdGhlIHJlY29yZGVyIG9uIHRoZVxuICAgKiBzYW1lIHVuZGVybHlpbmcgbGlzdCwgc28gYG9uRW1pdGAgZmlyZXMgZXhhY3RseSBvbmNlIHBlciBldmVudC5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IGBpZGA6KiogcmVwbGFjZXMgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIGBpZGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZXhlY3V0b3IuYXR0YWNoRW1pdFJlY29yZGVyKHtcbiAgICogICBpZDogJ3Rva2VuLW1ldGVyJyxcbiAgICogICBvbkVtaXQ6IChlKSA9PiB7XG4gICAqICAgICBpZiAoZS5uYW1lID09PSAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycpIHRyYWNrVG9rZW5zKGUucGF5bG9hZCk7XG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoRW1pdFJlY29yZGVyKHJlY29yZGVyOiBFbWl0UmVjb3JkZXIpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFJlY29yZGVyKHJlY29yZGVyIGFzIFJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYW4gYEVtaXRSZWNvcmRlcmAgYnkgaWQuIFNhZmUgdG8gY2FsbCBpZiBuZXZlciBhdHRhY2hlZC4gKi9cbiAgZGV0YWNoRW1pdFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFJlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgcmVjb3JkZXJzIGZpbHRlcmVkIHRvIHRob3NlIHRoYXRcbiAgICogaW1wbGVtZW50IGBvbkVtaXRgLiBVc2VmdWwgZm9yIGluc3BlY3Rpb24gZHVyaW5nIHRlc3RpbmcuXG4gICAqL1xuICBnZXRFbWl0UmVjb3JkZXJzKCk6IEVtaXRSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoXG4gICAgICAocik6IHIgaXMgRW1pdFJlY29yZGVyID0+IHR5cGVvZiAociBhcyB7IG9uRW1pdD86IHVua25vd24gfSkub25FbWl0ID09PSAnZnVuY3Rpb24nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXhlY3V0aW9uIG5hcnJhdGl2ZS5cbiAgICpcbiAgICogV2hlbiB1c2luZyBTY29wZUZhY2FkZS1iYXNlZCBzY29wZXMsIHJldHVybnMgYSBjb21iaW5lZCBuYXJyYXRpdmUgdGhhdFxuICAgKiBpbnRlcmxlYXZlcyBmbG93IGV2ZW50cyAoc3RhZ2VzLCBkZWNpc2lvbnMsIGZvcmtzKSB3aXRoIGRhdGEgb3BlcmF0aW9uc1xuICAgKiAocmVhZHMsIHdyaXRlcywgdXBkYXRlcykuIEZvciBwbGFpbiBzY29wZXMgd2l0aG91dCBhdHRhY2hSZWNvcmRlciBzdXBwb3J0LFxuICAgKiByZXR1cm5zIGZsb3ctb25seSBuYXJyYXRpdmUgc2VudGVuY2VzLlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICAvLyBDb21iaW5lZCByZWNvcmRlciBidWlsZHMgdGhlIG5hcnJhdGl2ZSBpbmxpbmUgZHVyaW5nIHRyYXZlcnNhbCDigJQganVzdCByZWFkIGl0XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWRSZWNvcmRlci5nZXROYXJyYXRpdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc3RydWN0dXJlZCBuYXJyYXRpdmUgZW50cmllcyBmb3IgcHJvZ3JhbW1hdGljIGNvbnN1bXB0aW9uLlxuICAgKiBFYWNoIGVudHJ5IGhhcyBhIHR5cGUgKHN0YWdlLCBzdGVwLCBjb25kaXRpb24sIGZvcmssIGV0Yy4pLCB0ZXh0LCBhbmQgZGVwdGguXG4gICAqL1xuICBnZXROYXJyYXRpdmVFbnRyaWVzKCk6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWRSZWNvcmRlci5nZXRFbnRyaWVzKCk7XG4gICAgfVxuICAgIGNvbnN0IGZsb3dTZW50ZW5jZXMgPSB0aGlzLnRyYXZlcnNlci5nZXROYXJyYXRpdmUoKTtcbiAgICByZXR1cm4gZmxvd1NlbnRlbmNlcy5tYXAoKHRleHQpID0+ICh7IHR5cGU6ICdzdGFnZScgYXMgY29uc3QsIHRleHQsIGRlcHRoOiAwIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21iaW5lZCBGbG93UmVjb3JkZXJzIGxpc3QuIFdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQsIGluY2x1ZGVzOlxuICAgKiAtIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgKGJ1aWxkcyBtZXJnZWQgZmxvdytkYXRhIG5hcnJhdGl2ZSBpbmxpbmUpXG4gICAqIC0gTmFycmF0aXZlRmxvd1JlY29yZGVyIChrZWVwcyBmbG93LW9ubHkgc2VudGVuY2VzIGZvciBnZXRGbG93TmFycmF0aXZlKCkpXG4gICAqIFBsdXMgYW55IHVzZXItYXR0YWNoZWQgcmVjb3JkZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEZsb3dSZWNvcmRlcnNMaXN0KCk6IEZsb3dSZWNvcmRlcltdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlcnM6IEZsb3dSZWNvcmRlcltdID0gW107XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmVjb3JkZXJzLnB1c2godGhpcy5jb21iaW5lZFJlY29yZGVyKTtcbiAgICAgIC8vIEtlZXAgdGhlIGRlZmF1bHQgTmFycmF0aXZlRmxvd1JlY29yZGVyIHNvIGdldEZsb3dOYXJyYXRpdmUoKSBzdGlsbCB3b3Jrc1xuICAgICAgcmVjb3JkZXJzLnB1c2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICB9XG4gICAgcmVjb3JkZXJzLnB1c2goLi4udGhpcy5mbG93UmVjb3JkZXJzKTtcbiAgICByZXR1cm4gcmVjb3JkZXJzLmxlbmd0aCA+IDAgPyByZWNvcmRlcnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBmbG93LW9ubHkgbmFycmF0aXZlIHNlbnRlbmNlcyAod2l0aG91dCBkYXRhIG9wZXJhdGlvbnMpLlxuICAgKiBVc2UgdGhpcyB3aGVuIHlvdSBvbmx5IHdhbnQgY29udHJvbCBmbG93IGRlc2NyaXB0aW9ucy5cbiAgICpcbiAgICogU2VudGVuY2VzIGNvbWUgZnJvbSBgTmFycmF0aXZlRmxvd1JlY29yZGVyYCAoYSBkZWRpY2F0ZWQgZmxvdy1vbmx5IHJlY29yZGVyIGF1dG9tYXRpY2FsbHlcbiAgICogYXR0YWNoZWQgd2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZCkuIEl0IGVtaXRzIGJvdGggYG9uU3RhZ2VFeGVjdXRlZGAgc2VudGVuY2VzIChvbmUgcGVyXG4gICAqIHN0YWdlKSBBTkQgYG9uTmV4dGAgdHJhbnNpdGlvbiBzZW50ZW5jZXMgKG9uZSBwZXIgc3RhZ2UtdG8tc3RhZ2UgdHJhbnNpdGlvbiksIHNvIGZvciBhXG4gICAqIGNoYXJ0IHdpdGggTiBzdGFnZXMgeW91IHdpbGwgdHlwaWNhbGx5IGdldCBtb3JlIGVudHJpZXMgaGVyZSB0aGFuIGZyb20gYGdldE5hcnJhdGl2ZSgpYC5cbiAgICovXG4gIGdldEZsb3dOYXJyYXRpdmUoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXROYXJyYXRpdmUoKTtcbiAgfVxuXG4gIGFzeW5jIHJ1bihvcHRpb25zPzogUnVuT3B0aW9ucyk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICBsZXQgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVybmFsIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dE1zXG4gICAgaWYgKG9wdGlvbnM/LnRpbWVvdXRNcyAmJiAhc2lnbmFsKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihgRXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke29wdGlvbnMudGltZW91dE1zfW1zYCkpLFxuICAgICAgICBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgYWdhaW5zdCBpbnB1dFNjaGVtYSBpZiBib3RoIGFyZSBwcmVzZW50XG4gICAgbGV0IHZhbGlkYXRlZElucHV0ID0gb3B0aW9ucz8uaW5wdXQ7XG4gICAgaWYgKHZhbGlkYXRlZElucHV0ICYmIHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEpIHtcbiAgICAgIHZhbGlkYXRlZElucHV0ID0gdmFsaWRhdGVJbnB1dCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hLCB2YWxpZGF0ZWRJbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gVXNlci1hdHRhY2hlZCByZWNvcmRlcnMgKGZsb3dSZWNvcmRlcnMgKyBzY29wZVJlY29yZGVycykgYXJlIGNsZWFyZWQgdmlhIGNsZWFyKCkgdG8gcHJldmVudFxuICAgIC8vIGNyb3NzLXJ1biBhY2N1bXVsYXRpb24uIFRoZSBjb21iaW5lZFJlY29yZGVyIGlzIE5PVCBjbGVhcmVkIGhlcmUg4oCUIGNyZWF0ZVRyYXZlcnNlcigpIGFsd2F5c1xuICAgIC8vIGNyZWF0ZXMgYSBmcmVzaCBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGluc3RhbmNlIG9uIGVhY2ggcnVuLCBzbyBzdGFsZSBzdGF0ZSBpcyBuZXZlciBhbiBpc3N1ZS5cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICByLmNsZWFyPy4oKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cblxuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTsgLy8gUmVzZXQgY291bnRlciBvbiBmcmVzaCBydW5cbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKHNpZ25hbCwgdmFsaWRhdGVkSW5wdXQsIG9wdGlvbnM/LmVudiwgb3B0aW9ucz8ubWF4RGVwdGgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgLy8gQnVpbGQgY2hlY2twb2ludCBmcm9tIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlXG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3QoKTtcbiAgICAgICAgY29uc3Qgc2ZSZXN1bHRzID0gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHtcbiAgICAgICAgICBzaGFyZWRTdGF0ZTogc25hcHNob3Quc2hhcmVkU3RhdGUsXG4gICAgICAgICAgZXhlY3V0aW9uVHJlZTogc25hcHNob3QuZXhlY3V0aW9uVHJlZSxcbiAgICAgICAgICBwYXVzZWRTdGFnZUlkOiBlcnJvci5zdGFnZUlkLFxuICAgICAgICAgIHN1YmZsb3dQYXRoOiBlcnJvci5zdWJmbG93UGF0aCxcbiAgICAgICAgICBwYXVzZURhdGE6IGVycm9yLnBhdXNlRGF0YSxcbiAgICAgICAgICAuLi4oc2ZSZXN1bHRzLnNpemUgPiAwICYmIHsgc3ViZmxvd1Jlc3VsdHM6IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpIH0pLFxuICAgICAgICAgIC8vIEludm9rZXIgY29udGV4dCDigJQgY29sbGVjdGVkIGR1cmluZyB0cmF2ZXJzYWwgYnViYmxlLXVwIChub3QgdHJlZS13YWxrZWQpXG4gICAgICAgICAgLi4uKGVycm9yLmludm9rZXJTdGFnZUlkICYmIHsgaW52b2tlclN0YWdlSWQ6IGVycm9yLmludm9rZXJTdGFnZUlkIH0pLFxuICAgICAgICAgIC4uLihlcnJvci5jb250aW51YXRpb25TdGFnZUlkICYmIHsgY29udGludWF0aW9uU3RhZ2VJZDogZXJyb3IuY29udGludWF0aW9uU3RhZ2VJZCB9KSxcbiAgICAgICAgICBwYXVzZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUmV0dXJuIGEgUGF1c2VSZXN1bHQtc2hhcGVkIHZhbHVlIHNvIGNhbGxlcnMgY2FuIGNoZWNrIHdpdGhvdXQgdHJ5L2NhdGNoXG4gICAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRpbWVvdXRJZCAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIDilIAgSW50cm9zcGVjdGlvbiDilIDilIDilIBcblxuICBnZXRTbmFwc2hvdCgpOiBSdW50aW1lU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3QoKSBhcyBSdW50aW1lU25hcHNob3Q7XG4gICAgY29uc3Qgc2ZSZXN1bHRzID0gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgICBpZiAoc2ZSZXN1bHRzLnNpemUgPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cyA9IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3Qgc25hcHNob3QgZGF0YSBmcm9tIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCB0b1NuYXBzaG90KClcbiAgICBjb25zdCByZWNvcmRlclNuYXBzaG90czogUmVjb3JkZXJTbmFwc2hvdFtdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIGlmIChyLnRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgc25hcCA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHtcbiAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICBuYW1lOiBzbmFwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHNuYXAuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiBzbmFwLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgICAgICBkYXRhOiBzbmFwLmRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICBpZiAoci50b1NuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHNuYXAgPSByLnRvU25hcHNob3QoKTtcbiAgICAgICAgcmVjb3JkZXJTbmFwc2hvdHMucHVzaCh7XG4gICAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgICAgbmFtZTogc25hcC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBzbmFwLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogc25hcC5wcmVmZXJyZWRPcGVyYXRpb24sXG4gICAgICAgICAgZGF0YTogc25hcC5kYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlY29yZGVyU25hcHNob3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnJlY29yZGVycyA9IHJlY29yZGVyU25hcHNob3RzO1xuICAgIH1cblxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnRyYXZlcnNlci5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEJyYW5jaElkcygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lUm9vdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRFeHRyYWN0ZWRSZXN1bHRzPFRSZXN1bHQgPSB1bmtub3duPigpOiBNYXA8c3RyaW5nLCBUUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEV4dHJhY3RlZFJlc3VsdHM8VFJlc3VsdD4oKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0RXh0cmFjdG9yRXJyb3JzKCk6IEV4dHJhY3RvckVycm9yW10ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRFeHRyYWN0b3JFcnJvcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdWJmbG93IG1hbmlmZXN0IGZyb20gYW4gYXR0YWNoZWQgTWFuaWZlc3RGbG93UmVjb3JkZXIuXG4gICAqIFJldHVybnMgZW1wdHkgYXJyYXkgaWYgbm8gTWFuaWZlc3RGbG93UmVjb3JkZXIgaXMgYXR0YWNoZWQuXG4gICAqL1xuICBnZXRTdWJmbG93TWFuaWZlc3QoKTogTWFuaWZlc3RFbnRyeVtdIHtcbiAgICBjb25zdCByZWNvcmRlciA9IHRoaXMuZmxvd1JlY29yZGVycy5maW5kKChyKSA9PiByIGluc3RhbmNlb2YgTWFuaWZlc3RGbG93UmVjb3JkZXIpIGFzXG4gICAgICB8IE1hbmlmZXN0Rmxvd1JlY29yZGVyXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVjb3JkZXI/LmdldE1hbmlmZXN0KCkgPz8gW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZnVsbCBzcGVjIGZvciBhIGR5bmFtaWNhbGx5LXJlZ2lzdGVyZWQgc3ViZmxvdy5cbiAgICogUmVxdWlyZXMgYW4gYXR0YWNoZWQgTWFuaWZlc3RGbG93UmVjb3JkZXIgdGhhdCBvYnNlcnZlZCB0aGUgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgZ2V0U3ViZmxvd1NwZWMoc3ViZmxvd0lkOiBzdHJpbmcpOiB1bmtub3duIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlciA9IHRoaXMuZmxvd1JlY29yZGVycy5maW5kKChyKSA9PiByIGluc3RhbmNlb2YgTWFuaWZlc3RGbG93UmVjb3JkZXIpIGFzXG4gICAgICB8IE1hbmlmZXN0Rmxvd1JlY29yZGVyXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVjb3JkZXI/LmdldFNwZWMoc3ViZmxvd0lkKTtcbiAgfVxufVxuIl19
|